video: da8xx-fb: fb_check_var enhancement
authorAfzal Mohammed <afzal@ti.com>
Mon, 5 Aug 2013 22:02:20 +0000 (17:02 -0500)
committerTomi Valkeinen <tomi.valkeinen@ti.com>
Fri, 9 Aug 2013 11:02:41 +0000 (14:02 +0300)
Check whether "struct fb_var_screeninfo" fields are sane, if not
update it to be within allowed limits.

If user sends down buggy "var" values, this will bring those within
allowable limits. And fb_set_par is not supposed to change "var"
values, fb_check_var has to ensure that values are proper.

Signed-off-by: Afzal Mohammed <afzal@ti.com>
Signed-off-by: Darren Etheridge <detheridge@ti.com>
Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
drivers/video/da8xx-fb.c

index 0810939..d00dd17 100644 (file)
@@ -888,6 +888,9 @@ static int fb_check_var(struct fb_var_screeninfo *var,
                        struct fb_info *info)
 {
        int err = 0;
+       struct da8xx_fb_par *par = info->par;
+       int bpp = var->bits_per_pixel >> 3;
+       unsigned long line_size = var->xres_virtual * bpp;
 
        if (var->bits_per_pixel > 16 && lcd_revision == LCD_VERSION_1)
                return -EINVAL;
@@ -955,6 +958,21 @@ static int fb_check_var(struct fb_var_screeninfo *var,
        var->green.msb_right = 0;
        var->blue.msb_right = 0;
        var->transp.msb_right = 0;
+
+       if (line_size * var->yres_virtual > par->vram_size)
+               var->yres_virtual = par->vram_size / line_size;
+
+       if (var->yres > var->yres_virtual)
+               var->yres = var->yres_virtual;
+
+       if (var->xres > var->xres_virtual)
+               var->xres = var->xres_virtual;
+
+       if (var->xres + var->xoffset > var->xres_virtual)
+               var->xoffset = var->xres_virtual - var->xres;
+       if (var->yres + var->yoffset > var->yres_virtual)
+               var->yoffset = var->yres_virtual - var->yres;
+
        return err;
 }