| From: Peter Rosin <peda@axentia.se> |
| Date: Thu, 20 Dec 2018 19:13:07 +0100 |
| Subject: fbdev: fbmem: behave better with small rotated displays and many CPUs |
| |
| commit f75df8d4b4fabfad7e3cba2debfad12741c6fde7 upstream. |
| |
| Blitting an image with "negative" offsets is not working since there |
| is no clipping. It hopefully just crashes. For the bootup logo, there |
| is protection so that blitting does not happen as the image is drawn |
| further and further to the right (ROTATE_UR) or further and further |
| down (ROTATE_CW). There is however no protection when drawing in the |
| opposite directions (ROTATE_UD and ROTATE_CCW). |
| |
| Add back this protection. |
| |
| The regression is 20-odd years old but the mindless warning-killing |
| mentality displayed in commit 34bdb666f4b2 ("fbdev: fbmem: remove |
| positive test on unsigned values") is also to blame, methinks. |
| |
| Fixes: 448d479747b8 ("fbdev: fb_do_show_logo() updates") |
| Signed-off-by: Peter Rosin <peda@axentia.se> |
| Cc: Tomi Valkeinen <tomi.valkeinen@ti.com> |
| Cc: Fabian Frederick <ffrederick@users.sourceforge.net> |
| Cc: Geert Uytterhoeven <geert+renesas@glider.be> |
| cc: Geoff Levand <geoff@infradead.org> |
| Cc: James Simmons <jsimmons@users.sf.net> |
| Signed-off-by: Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com> |
| Signed-off-by: Ben Hutchings <ben@decadent.org.uk> |
| --- |
| drivers/video/fbdev/core/fbmem.c | 8 ++++++-- |
| 1 file changed, 6 insertions(+), 2 deletions(-) |
| |
| --- a/drivers/video/fbdev/core/fbmem.c |
| +++ b/drivers/video/fbdev/core/fbmem.c |
| @@ -433,7 +433,9 @@ static void fb_do_show_logo(struct fb_in |
| image->dx += image->width + 8; |
| } |
| } else if (rotate == FB_ROTATE_UD) { |
| - for (x = 0; x < num; x++) { |
| + u32 dx = image->dx; |
| + |
| + for (x = 0; x < num && image->dx <= dx; x++) { |
| info->fbops->fb_imageblit(info, image); |
| image->dx -= image->width + 8; |
| } |
| @@ -445,7 +447,9 @@ static void fb_do_show_logo(struct fb_in |
| image->dy += image->height + 8; |
| } |
| } else if (rotate == FB_ROTATE_CCW) { |
| - for (x = 0; x < num; x++) { |
| + u32 dy = image->dy; |
| + |
| + for (x = 0; x < num && image->dy <= dy; x++) { |
| info->fbops->fb_imageblit(info, image); |
| image->dy -= image->height + 8; |
| } |