aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLaurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>2018-08-31 14:12:59 -0400
committerLaurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>2018-09-15 10:28:33 -0400
commitf09e5b5d776debc2761e8d9330d60b8dcd8cb9dd (patch)
tree50c1428b4bf4fd2a7d34dc618fb2f4eaaf3a9444
parent0f35b25b87923394cd9048a199d05e994fbf8bae (diff)
drm: rcar-du: Update framebuffer pitch and alignment limits for Gen3
The framebuffer pitch and alignment constraints reflect the limitations of the Gen2 DU hardware. On Gen3, the DU has no memory interface and thus doesn't impose any constraint. The limitations come instead from the VSP that has a limit of 65535 bytes for the pitch and no alignment constraint. Update the checks accordingly. Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com> Signed-off-by: Kieran Bingham <kieran.bingham+renesas@ideasonboard.com>
-rw-r--r--drivers/gpu/drm/rcar-du/rcar_du_kms.c35
1 files changed, 23 insertions, 12 deletions
diff --git a/drivers/gpu/drm/rcar-du/rcar_du_kms.c b/drivers/gpu/drm/rcar-du/rcar_du_kms.c
index a58a96948850..b5d79ecd25ea 100644
--- a/drivers/gpu/drm/rcar-du/rcar_du_kms.c
+++ b/drivers/gpu/drm/rcar-du/rcar_du_kms.c
@@ -204,7 +204,6 @@ rcar_du_fb_create(struct drm_device *dev, struct drm_file *file_priv,
204 const struct rcar_du_format_info *format; 204 const struct rcar_du_format_info *format;
205 unsigned int max_pitch; 205 unsigned int max_pitch;
206 unsigned int align; 206 unsigned int align;
207 unsigned int bpp;
208 unsigned int i; 207 unsigned int i;
209 208
210 format = rcar_du_format_info(mode_cmd->pixel_format); 209 format = rcar_du_format_info(mode_cmd->pixel_format);
@@ -214,20 +213,32 @@ rcar_du_fb_create(struct drm_device *dev, struct drm_file *file_priv,
214 return ERR_PTR(-EINVAL); 213 return ERR_PTR(-EINVAL);
215 } 214 }
216 215
217 /* 216 if (rcdu->info->gen < 3) {
218 * The pitch and alignment constraints are expressed in pixels on the 217 /*
219 * hardware side and in bytes in the DRM API. 218 * On Gen2 the DU limits the pitch to 4095 pixels and requires
220 */ 219 * buffers to be aligned to a 16 pixels boundary (or 128 bytes
221 bpp = format->planes == 1 ? format->bpp / 8 : 1; 220 * on some platforms).
222 max_pitch = 4096 * bpp; 221 */
222 unsigned int bpp = format->planes == 1 ? format->bpp / 8 : 1;
223 223
224 if (rcar_du_needs(rcdu, RCAR_DU_QUIRK_ALIGN_128B)) 224 max_pitch = 4095 * bpp;
225 align = 128; 225
226 else 226 if (rcar_du_needs(rcdu, RCAR_DU_QUIRK_ALIGN_128B))
227 align = 16 * bpp; 227 align = 128;
228 else
229 align = 16 * bpp;
230 } else {
231 /*
232 * On Gen3 the memory interface is handled by the VSP that
233 * limits the pitch to 65535 bytes and has no alignment
234 * constraint.
235 */
236 max_pitch = 65535;
237 align = 1;
238 }
228 239
229 if (mode_cmd->pitches[0] & (align - 1) || 240 if (mode_cmd->pitches[0] & (align - 1) ||
230 mode_cmd->pitches[0] >= max_pitch) { 241 mode_cmd->pitches[0] > max_pitch) {
231 dev_dbg(dev->dev, "invalid pitch value %u\n", 242 dev_dbg(dev->dev, "invalid pitch value %u\n",
232 mode_cmd->pitches[0]); 243 mode_cmd->pitches[0]);
233 return ERR_PTR(-EINVAL); 244 return ERR_PTR(-EINVAL);