]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm/fb-helper: Fix clipping when damage area spans a single scanline
authorFrancesco Lavra <flavra@baylibre.com>
Tue, 10 Feb 2026 17:35:45 +0000 (18:35 +0100)
committerThomas Zimmermann <tzimmermann@suse.de>
Mon, 4 May 2026 12:55:40 +0000 (14:55 +0200)
When the damage area resulting from a dirty memory range spans a single
scanline, the width of the rectangle is calculated dynamically because it
may not coincide with the framebuffer width.
If the dirty range ends exactly at the end of the scanline, the `bit_end`
variable is incorrectly assigned a 0 value, which results in a bogus clip
rectangle where the x2 coordinate is 0. This prevents the dirty scanline
from being flushed to the hardware.
Change the calculation of the `bit_end` value to fix the x2 coordinate
value in the above edge case.

Fixes: ded74cafeea9 ("drm/fb-helper: Clip damage area horizontally")
Signed-off-by: Francesco Lavra <flavra@baylibre.com>
Reviewed-by: Thomas Zimmermann <tzimmermann@suse.de>
Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Link: https://patch.msgid.link/20260210173545.733937-1-flavra@baylibre.com
drivers/gpu/drm/drm_fb_helper.c

index a80a335f414801a878e8820f5b9780df0a6e088c..1541fc8a9ac2d36357b9d8b2bc28d50d1200c632 100644 (file)
@@ -490,7 +490,7 @@ static void drm_fb_helper_memory_range_to_clip(struct fb_info *info, off_t off,
                 * the number of horizontal pixels that need an update.
                 */
                off_t bit_off = (off % line_length) * 8;
-               off_t bit_end = (end % line_length) * 8;
+               off_t bit_end = bit_off + len * 8;
 
                x1 = bit_off / info->var.bits_per_pixel;
                x2 = DIV_ROUND_UP(bit_end, info->var.bits_per_pixel);