| From b3d4ace2b7a80e7ca463af9af090fe18fde8ab63 Mon Sep 17 00:00:00 2001 |
| From: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com> |
| Date: Mon, 28 Jul 2014 20:18:36 +0200 |
| Subject: 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 <phil.edworthy@renesas.com> |
| Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com> |
| Signed-off-by: Dave Airlie <airlied@redhat.com> |
| (cherry picked from commit 8bed5cc765ffdd61b59f8405d38b377f5a7f0920) |
| Signed-off-by: Simon Horman <horms+renesas@verge.net.au> |
| --- |
| drivers/gpu/drm/rcar-du/rcar_du_kms.c | 13 +++++++++++-- |
| 1 file changed, 11 insertions(+), 2 deletions(-) |
| |
| 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); |
| -- |
| 2.1.2 |
| |