| From 7e426b11a2c7fdfe41cb7301e1a22975cd48216e Mon Sep 17 00:00:00 2001 |
| From: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com> |
| Date: Fri, 14 Jun 2013 20:52:52 +0200 |
| Subject: drm/rcar-du: Fix buffer pitch alignment for R8A7790 DU |
| |
| The R8A7790 DU seems to require a 128 bytes pitch alignment, even though |
| the documentation only mentions a 16 pixels alignement as for the |
| R8A7779 DU. Make this configurable through a device flag. |
| |
| Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com> |
| (cherry picked from commit 9e2d2de9e8107643ba50debc475fc966d3f77364) |
| Signed-off-by: Simon Horman <horms+renesas@verge.net.au> |
| --- |
| drivers/gpu/drm/rcar-du/rcar_du_drv.c | 2 +- |
| drivers/gpu/drm/rcar-du/rcar_du_drv.h | 1 + |
| drivers/gpu/drm/rcar-du/rcar_du_kms.c | 17 ++++++++++++++--- |
| 3 files changed, 16 insertions(+), 4 deletions(-) |
| |
| diff --git a/drivers/gpu/drm/rcar-du/rcar_du_drv.c b/drivers/gpu/drm/rcar-du/rcar_du_drv.c |
| index dc4c07e02d8c..ce0de4d1260a 100644 |
| --- a/drivers/gpu/drm/rcar-du/rcar_du_drv.c |
| +++ b/drivers/gpu/drm/rcar-du/rcar_du_drv.c |
| @@ -216,7 +216,7 @@ static const struct rcar_du_device_info rcar_du_r8a7779_info = { |
| }; |
| |
| static const struct rcar_du_device_info rcar_du_r8a7790_info = { |
| - .features = RCAR_DU_FEATURE_CRTC_IRQ_CLOCK, |
| + .features = RCAR_DU_FEATURE_CRTC_IRQ_CLOCK | RCAR_DU_FEATURE_ALIGN_128B, |
| }; |
| |
| static const struct platform_device_id rcar_du_id_table[] = { |
| diff --git a/drivers/gpu/drm/rcar-du/rcar_du_drv.h b/drivers/gpu/drm/rcar-du/rcar_du_drv.h |
| index 5b57a2f9b52a..072e28e09484 100644 |
| --- a/drivers/gpu/drm/rcar-du/rcar_du_drv.h |
| +++ b/drivers/gpu/drm/rcar-du/rcar_du_drv.h |
| @@ -26,6 +26,7 @@ struct drm_device; |
| struct rcar_du_device; |
| |
| #define RCAR_DU_FEATURE_CRTC_IRQ_CLOCK (1 << 0) /* Per-CRTC IRQ and clock */ |
| +#define RCAR_DU_FEATURE_ALIGN_128B (1 << 1) /* Align pitches to 128 bytes */ |
| |
| /* |
| * struct rcar_du_device_info - DU model-specific information |
| diff --git a/drivers/gpu/drm/rcar-du/rcar_du_kms.c b/drivers/gpu/drm/rcar-du/rcar_du_kms.c |
| index 845bcb384863..418d902bc88d 100644 |
| --- a/drivers/gpu/drm/rcar-du/rcar_du_kms.c |
| +++ b/drivers/gpu/drm/rcar-du/rcar_du_kms.c |
| @@ -111,11 +111,18 @@ const struct rcar_du_format_info *rcar_du_format_info(u32 fourcc) |
| int rcar_du_dumb_create(struct drm_file *file, struct drm_device *dev, |
| struct drm_mode_create_dumb *args) |
| { |
| + struct rcar_du_device *rcdu = dev->dev_private; |
| unsigned int min_pitch = DIV_ROUND_UP(args->width * args->bpp, 8); |
| unsigned int align; |
| |
| - /* The pitch must be aligned to a 16 pixels boundary. */ |
| - align = 16 * args->bpp / 8; |
| + /* The R8A7779 DU requires a 16 pixels pitch alignment as documented, |
| + * but the R8A7790 DU seems to require a 128 bytes pitch alignment. |
| + */ |
| + if (rcar_du_has(rcdu, RCAR_DU_FEATURE_ALIGN_128B)) |
| + align = 128; |
| + else |
| + align = 16 * args->bpp / 8; |
| + |
| args->pitch = roundup(max(args->pitch, min_pitch), align); |
| |
| return drm_gem_cma_dumb_create(file, dev, args); |
| @@ -125,6 +132,7 @@ static struct drm_framebuffer * |
| rcar_du_fb_create(struct drm_device *dev, struct drm_file *file_priv, |
| struct drm_mode_fb_cmd2 *mode_cmd) |
| { |
| + struct rcar_du_device *rcdu = dev->dev_private; |
| const struct rcar_du_format_info *format; |
| unsigned int align; |
| |
| @@ -135,7 +143,10 @@ rcar_du_fb_create(struct drm_device *dev, struct drm_file *file_priv, |
| return ERR_PTR(-EINVAL); |
| } |
| |
| - align = 16 * format->bpp / 8; |
| + if (rcar_du_has(rcdu, RCAR_DU_FEATURE_ALIGN_128B)) |
| + align = 128; |
| + else |
| + align = 16 * format->bpp / 8; |
| |
| if (mode_cmd->pitches[0] & (align - 1) || |
| mode_cmd->pitches[0] >= 8192) { |
| -- |
| 1.8.5.rc3 |
| |