| From 1deba4c9a385d13d0d5be8ddf3ff20d526a3d210 Mon Sep 17 00:00:00 2001 |
| From: Geert Uytterhoeven <geert+renesas@glider.be> |
| Date: Mon, 30 Dec 2019 14:27:34 +0100 |
| Subject: [PATCH] drm/fb-helper: Round up bits_per_pixel if possible |
| |
| commit f30e27779d3031a092c2a177b7fb76adccc45241 upstream. |
| |
| When userspace requests a video mode parameter value that is not |
| supported, frame buffer device drivers should round it up to a supported |
| value, if possible, instead of just rejecting it. This allows |
| applications to quickly scan for supported video modes. |
| |
| Currently this rule is not followed for the number of bits per pixel, |
| causing e.g. "fbset -depth N" to fail, if N is smaller than the current |
| number of bits per pixel. |
| |
| Fix this by returning an error only if bits per pixel is too large, and |
| setting it to the current value otherwise. |
| |
| See also Documentation/fb/framebuffer.rst, Section 2 (Programmer's View |
| of /dev/fb*"). |
| |
| Fixes: 865afb11949e5bf4 ("drm/fb-helper: reject any changes to the fbdev") |
| Cc: stable@vger.kernel.org |
| Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be> |
| Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch> |
| Link: https://patchwork.freedesktop.org/patch/msgid/20191230132734.4538-1-geert+renesas@glider.be |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c |
| index 498f95c3e81d..d0d945f739d7 100644 |
| --- a/drivers/gpu/drm/drm_fb_helper.c |
| +++ b/drivers/gpu/drm/drm_fb_helper.c |
| @@ -1706,7 +1706,7 @@ int drm_fb_helper_check_var(struct fb_var_screeninfo *var, |
| * Changes struct fb_var_screeninfo are currently not pushed back |
| * to KMS, hence fail if different settings are requested. |
| */ |
| - if (var->bits_per_pixel != fb->format->cpp[0] * 8 || |
| + if (var->bits_per_pixel > fb->format->cpp[0] * 8 || |
| var->xres > fb->width || var->yres > fb->height || |
| var->xres_virtual > fb->width || var->yres_virtual > fb->height) { |
| DRM_DEBUG("fb requested width/height/bpp can't fit in current fb " |
| @@ -1732,6 +1732,11 @@ int drm_fb_helper_check_var(struct fb_var_screeninfo *var, |
| } |
| |
| /* |
| + * Likewise, bits_per_pixel should be rounded up to a supported value. |
| + */ |
| + var->bits_per_pixel = fb->format->cpp[0] * 8; |
| + |
| + /* |
| * drm fbdev emulation doesn't support changing the pixel format at all, |
| * so reject all pixel format changing requests. |
| */ |
| -- |
| 2.7.4 |
| |