omapdrm doesn't check if the width of the framebuffer and the color
format's bits-per-pixel match.

For example, using a display with a width of 1280, and a buffer
allocated with using 32 bits per pixel (i.e. 1280*4 = 5120 bytes), with
a 24 bits per pixel color format, leads to the following mismatch:
5120/3 = 1706.666... bytes. This causes bad colors and a tilt on the
screen.

Add a check into omapdrm to return an error if the user tries to use
such a combination.

Signed-off-by: Tomi Valkeinen <tomi.valkeinen at ti.com>
---
 drivers/gpu/drm/omapdrm/omap_fb.c | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/drivers/gpu/drm/omapdrm/omap_fb.c 
b/drivers/gpu/drm/omapdrm/omap_fb.c
index 2975096abdf5..bf98580223d0 100644
--- a/drivers/gpu/drm/omapdrm/omap_fb.c
+++ b/drivers/gpu/drm/omapdrm/omap_fb.c
@@ -463,6 +463,14 @@ struct drm_framebuffer *omap_framebuffer_init(struct 
drm_device *dev,
                        goto fail;
                }

+               if (mode_cmd->width % format->planes[i].stride_bpp != 0) {
+                       dev_err(dev->dev,
+                               "buffer width (%d) is not a multiple of pixel 
width (%d)\n",
+                               mode_cmd->width, format->planes[i].stride_bpp);
+                       ret = -EINVAL;
+                       goto fail;
+               }
+
                size = pitch * mode_cmd->height / format->planes[i].sub_y;

                if (size > (omap_gem_mmap_size(bos[i]) - mode_cmd->offsets[i])) 
{
-- 
2.3.0

Reply via email to