diff options
author | Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com> | 2013-06-14 14:52:52 -0400 |
---|---|---|
committer | Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com> | 2013-08-09 17:17:49 -0400 |
commit | 9e2d2de9e8107643ba50debc475fc966d3f77364 (patch) | |
tree | 2acac9f1f553f637c2770b13e34f9300a429a311 | |
parent | ef2d84bec6a02c4536cab1e0a8f13792ad86a7bc (diff) |
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>
-rw-r--r-- | drivers/gpu/drm/rcar-du/rcar_du_drv.c | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/rcar-du/rcar_du_drv.h | 1 | ||||
-rw-r--r-- | 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 381dbad05e58..3cd981589266 100644 --- a/drivers/gpu/drm/rcar-du/rcar_du_drv.c +++ b/drivers/gpu/drm/rcar-du/rcar_du_drv.c | |||
@@ -221,7 +221,7 @@ static const struct rcar_du_device_info rcar_du_r8a7779_info = { | |||
221 | }; | 221 | }; |
222 | 222 | ||
223 | static const struct rcar_du_device_info rcar_du_r8a7790_info = { | 223 | static const struct rcar_du_device_info rcar_du_r8a7790_info = { |
224 | .features = RCAR_DU_FEATURE_CRTC_IRQ_CLOCK, | 224 | .features = RCAR_DU_FEATURE_CRTC_IRQ_CLOCK | RCAR_DU_FEATURE_ALIGN_128B, |
225 | }; | 225 | }; |
226 | 226 | ||
227 | static const struct platform_device_id rcar_du_id_table[] = { | 227 | 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; | |||
26 | struct rcar_du_device; | 26 | struct rcar_du_device; |
27 | 27 | ||
28 | #define RCAR_DU_FEATURE_CRTC_IRQ_CLOCK (1 << 0) /* Per-CRTC IRQ and clock */ | 28 | #define RCAR_DU_FEATURE_CRTC_IRQ_CLOCK (1 << 0) /* Per-CRTC IRQ and clock */ |
29 | #define RCAR_DU_FEATURE_ALIGN_128B (1 << 1) /* Align pitches to 128 bytes */ | ||
29 | 30 | ||
30 | /* | 31 | /* |
31 | * struct rcar_du_device_info - DU model-specific information | 32 | * 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) | |||
111 | int rcar_du_dumb_create(struct drm_file *file, struct drm_device *dev, | 111 | int rcar_du_dumb_create(struct drm_file *file, struct drm_device *dev, |
112 | struct drm_mode_create_dumb *args) | 112 | struct drm_mode_create_dumb *args) |
113 | { | 113 | { |
114 | struct rcar_du_device *rcdu = dev->dev_private; | ||
114 | unsigned int min_pitch = DIV_ROUND_UP(args->width * args->bpp, 8); | 115 | unsigned int min_pitch = DIV_ROUND_UP(args->width * args->bpp, 8); |
115 | unsigned int align; | 116 | unsigned int align; |
116 | 117 | ||
117 | /* The pitch must be aligned to a 16 pixels boundary. */ | 118 | /* The R8A7779 DU requires a 16 pixels pitch alignment as documented, |
118 | align = 16 * args->bpp / 8; | 119 | * but the R8A7790 DU seems to require a 128 bytes pitch alignment. |
120 | */ | ||
121 | if (rcar_du_has(rcdu, RCAR_DU_FEATURE_ALIGN_128B)) | ||
122 | align = 128; | ||
123 | else | ||
124 | align = 16 * args->bpp / 8; | ||
125 | |||
119 | args->pitch = roundup(max(args->pitch, min_pitch), align); | 126 | args->pitch = roundup(max(args->pitch, min_pitch), align); |
120 | 127 | ||
121 | return drm_gem_cma_dumb_create(file, dev, args); | 128 | return drm_gem_cma_dumb_create(file, dev, args); |
@@ -125,6 +132,7 @@ static struct drm_framebuffer * | |||
125 | rcar_du_fb_create(struct drm_device *dev, struct drm_file *file_priv, | 132 | rcar_du_fb_create(struct drm_device *dev, struct drm_file *file_priv, |
126 | struct drm_mode_fb_cmd2 *mode_cmd) | 133 | struct drm_mode_fb_cmd2 *mode_cmd) |
127 | { | 134 | { |
135 | struct rcar_du_device *rcdu = dev->dev_private; | ||
128 | const struct rcar_du_format_info *format; | 136 | const struct rcar_du_format_info *format; |
129 | unsigned int align; | 137 | unsigned int align; |
130 | 138 | ||
@@ -135,7 +143,10 @@ rcar_du_fb_create(struct drm_device *dev, struct drm_file *file_priv, | |||
135 | return ERR_PTR(-EINVAL); | 143 | return ERR_PTR(-EINVAL); |
136 | } | 144 | } |
137 | 145 | ||
138 | align = 16 * format->bpp / 8; | 146 | if (rcar_du_has(rcdu, RCAR_DU_FEATURE_ALIGN_128B)) |
147 | align = 128; | ||
148 | else | ||
149 | align = 16 * format->bpp / 8; | ||
139 | 150 | ||
140 | if (mode_cmd->pitches[0] & (align - 1) || | 151 | if (mode_cmd->pitches[0] & (align - 1) || |
141 | mode_cmd->pitches[0] >= 8192) { | 152 | mode_cmd->pitches[0] >= 8192) { |