[PATCH 01/16] drm/omap: fix passing rotation parameter to dispc

Tomi Valkeinen tomi.valkeinen at ti.com
Thu May 4 10:23:17 UTC 2017


omapdrm does not pass the rotation angle to dispc. We need to pass the
rotation angle to fully support TILER rotation with YUV formats.

Signed-off-by: Tomi Valkeinen <tomi.valkeinen at ti.com>
---
 drivers/gpu/drm/omapdrm/omap_fb.c | 12 ++++++++++++
 1 file changed, 12 insertions(+)

diff --git a/drivers/gpu/drm/omapdrm/omap_fb.c b/drivers/gpu/drm/omapdrm/omap_fb.c
index 2dca19a0c2ff..4e434b2097ec 100644
--- a/drivers/gpu/drm/omapdrm/omap_fb.c
+++ b/drivers/gpu/drm/omapdrm/omap_fb.c
@@ -167,6 +167,8 @@ void omap_framebuffer_update_scanout(struct drm_framebuffer *fb,
 		uint32_t w = win->src_w;
 		uint32_t h = win->src_h;
 
+		/* note: DRM rotates counter-clockwise, TILER + DSS rotates clockwise */
+
 		switch (win->rotation & DRM_ROTATE_MASK) {
 		default:
 			dev_err(fb->dev->dev, "invalid rotation: %02x",
@@ -201,6 +203,15 @@ void omap_framebuffer_update_scanout(struct drm_framebuffer *fb,
 		if (orient & MASK_X_INVERT)
 			x += w - 1;
 
+		if (!(orient & MASK_XY_FLIP) && !(orient & MASK_Y_INVERT))
+			info->rotation = OMAP_DSS_ROT_0;
+		else if (!(orient & MASK_XY_FLIP) && (orient & MASK_Y_INVERT))
+			info->rotation = OMAP_DSS_ROT_180;
+		else if ((orient & MASK_XY_FLIP) && (orient & MASK_Y_INVERT))
+			info->rotation = OMAP_DSS_ROT_90;
+		else if ((orient & MASK_XY_FLIP) && !(orient & MASK_Y_INVERT))
+			info->rotation = OMAP_DSS_ROT_270;
+
 		omap_gem_rotated_paddr(plane->bo, orient, x, y, &info->paddr);
 		info->rotation_type = OMAP_DSS_ROT_TILER;
 		info->screen_width  = omap_gem_tiled_stride(plane->bo, orient);
@@ -221,6 +232,7 @@ void omap_framebuffer_update_scanout(struct drm_framebuffer *fb,
 
 		info->paddr         = get_linear_addr(plane, format, 0, x, y);
 		info->rotation_type = OMAP_DSS_ROT_DMA;
+		info->rotation = OMAP_DSS_ROT_0;
 		info->screen_width  = plane->pitch;
 	}
 
-- 
2.7.4



More information about the dri-devel mailing list