From: Laurent Pinchart Date: Mon, 28 Jul 2014 18:18:36 +0000 (+0200) Subject: drm/rcar-du: Fix maximum frame buffer pitch computation X-Git-Url: https://git.stricted.de/?a=commitdiff_plain;h=8bed5cc765ffdd61b59f8405d38b377f5a7f0920;p=GitHub%2Fmoto-9609%2Fandroid_kernel_motorola_exynos9610.git drm/rcar-du: Fix maximum frame buffer pitch computation 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 Signed-off-by: Laurent Pinchart Signed-off-by: Dave Airlie --- diff --git a/drivers/gpu/drm/rcar-du/rcar_du_kms.c b/drivers/gpu/drm/rcar-du/rcar_du_kms.c index a87edfac111f..76026104d000 100644 --- a/drivers/gpu/drm/rcar-du/rcar_du_kms.c +++ b/drivers/gpu/drm/rcar-du/rcar_du_kms.c @@ -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);