drm/rcar-du: Fix maximum frame buffer pitch computation
authorLaurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Mon, 28 Jul 2014 18:18:36 +0000 (20:18 +0200)
committerDave Airlie <airlied@redhat.com>
Wed, 30 Jul 2014 01:08:24 +0000 (11:08 +1000)
The maximum pitch constraint for the hardware is expressed in pixels.
Convert it to bytes to validate frame buffer creation, as frame buffer
pitches are expressed in bytes.

Reported-by: Phil Edworthy <phil.edworthy@renesas.com>
Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
drivers/gpu/drm/rcar-du/rcar_du_kms.c

index a87edfa..7602610 100644 (file)
@@ -135,7 +135,9 @@ rcar_du_fb_create(struct drm_device *dev, struct drm_file *file_priv,
 {
        struct rcar_du_device *rcdu = dev->dev_private;
        const struct rcar_du_format_info *format;
+       unsigned int max_pitch;
        unsigned int align;
+       unsigned int bpp;
 
        format = rcar_du_format_info(mode_cmd->pixel_format);
        if (format == NULL) {
@@ -144,13 +146,20 @@ rcar_du_fb_create(struct drm_device *dev, struct drm_file *file_priv,
                return ERR_PTR(-EINVAL);
        }
 
+       /*
+        * The pitch and alignment constraints are expressed in pixels on the
+        * hardware side and in bytes in the DRM API.
+        */
+       bpp = format->planes == 2 ? 1 : format->bpp / 8;
+       max_pitch =  4096 * bpp;
+
        if (rcar_du_needs(rcdu, RCAR_DU_QUIRK_ALIGN_128B))
                align = 128;
        else
-               align = 16 * format->bpp / 8;
+               align = 16 * bpp;
 
        if (mode_cmd->pitches[0] & (align - 1) ||
-           mode_cmd->pitches[0] >= 8192) {
+           mode_cmd->pitches[0] >= max_pitch) {
                dev_dbg(dev->dev, "invalid pitch value %u\n",
                        mode_cmd->pitches[0]);
                return ERR_PTR(-EINVAL);