drm/fb-helper: Support smem_len in deferred I/O
authorThomas Zimmermann <tzimmermann@suse.de>
Mon, 20 Mar 2023 15:07:47 +0000 (16:07 +0100)
committerThomas Zimmermann <tzimmermann@suse.de>
Wed, 22 Mar 2023 12:32:50 +0000 (13:32 +0100)
The size of the framebuffer can either be stored in screen_info or
smem_len. Take both into account in the deferred I/O code.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Reviewed-by: Javier Martinez Canillas <javierm@redhat.com>
Tested-by: Sui Jingfeng <suijingfeng@loongson.cn>
Link: https://patchwork.freedesktop.org/patch/msgid/20230320150751.20399-5-tzimmermann@suse.de
drivers/gpu/drm/drm_fb_helper.c

index 7e96ed9efdb5154e2f33dcd886140a1d84cc71db..bb0b25209b3ec0e88052b1ce2f462c8d297065ba 100644 (file)
@@ -672,7 +672,7 @@ static void drm_fb_helper_memory_range_to_clip(struct fb_info *info, off_t off,
 void drm_fb_helper_deferred_io(struct fb_info *info, struct list_head *pagereflist)
 {
        struct drm_fb_helper *helper = info->par;
-       unsigned long start, end, min_off, max_off;
+       unsigned long start, end, min_off, max_off, total_size;
        struct fb_deferred_io_pageref *pageref;
        struct drm_rect damage_area;
 
@@ -690,7 +690,11 @@ void drm_fb_helper_deferred_io(struct fb_info *info, struct list_head *pagerefli
         * of the screen and account for non-existing scanlines. Hence,
         * keep the covered memory area within the screen buffer.
         */
-       max_off = min(max_off, info->screen_size);
+       if (info->screen_size)
+               total_size = info->screen_size;
+       else
+               total_size = info->fix.smem_len;
+       max_off = min(max_off, total_size);
 
        if (min_off < max_off) {
                drm_fb_helper_memory_range_to_clip(info, min_off, max_off - min_off, &damage_area);