drm/omap: check if rotation is supported before commit
authorTomi Valkeinen <tomi.valkeinen@ti.com>
Thu, 27 Aug 2015 10:09:22 +0000 (13:09 +0300)
committerTomi Valkeinen <tomi.valkeinen@ti.com>
Thu, 3 Mar 2016 15:36:44 +0000 (17:36 +0200)
omapdrm is missing a check on the validity of the rotation property.
This leads to omapdrm possibly trying to use rotation on non-rotateable
framebuffer, which causes the overlay setup to fail.

This patch adds the necessary check to omap_plane_atomic_check().

Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
drivers/gpu/drm/omapdrm/omap_drv.h
drivers/gpu/drm/omapdrm/omap_fb.c
drivers/gpu/drm/omapdrm/omap_plane.c

index c077367dcb1a620b33f36374b73326ae135b4fa5..16c3eeeae668e6df487421077fa955549cb5995a 100644 (file)
@@ -189,6 +189,7 @@ void omap_framebuffer_update_scanout(struct drm_framebuffer *fb,
                struct omap_drm_window *win, struct omap_overlay_info *info);
 struct drm_connector *omap_framebuffer_get_next_connector(
                struct drm_framebuffer *fb, struct drm_connector *from);
+bool omap_framebuffer_supports_rotation(struct drm_framebuffer *fb);
 
 void omap_gem_init(struct drm_device *dev);
 void omap_gem_deinit(struct drm_device *dev);
index 481512db265688ea8362179677c2ab2f6c012e7c..610962396eb0e67669ef786afa45e2010d1df216 100644 (file)
@@ -145,6 +145,14 @@ static uint32_t get_linear_addr(struct plane *plane,
        return plane->paddr + offset;
 }
 
+bool omap_framebuffer_supports_rotation(struct drm_framebuffer *fb)
+{
+       struct omap_framebuffer *omap_fb = to_omap_framebuffer(fb);
+       struct plane *plane = &omap_fb->planes[0];
+
+       return omap_gem_flags(plane->bo) & OMAP_BO_TILED;
+}
+
 /* update ovl info for scanout, handles cases of multi-planar fb's, etc.
  */
 void omap_framebuffer_update_scanout(struct drm_framebuffer *fb,
index d75b197eff466b278fad743fbc8ac881a74ca16a..93ee538a99f54c13ad182806ee21be5b57f98642 100644 (file)
@@ -177,6 +177,12 @@ static int omap_plane_atomic_check(struct drm_plane *plane,
        if (state->crtc_y + state->crtc_h > crtc_state->adjusted_mode.vdisplay)
                return -EINVAL;
 
+       if (state->fb) {
+               if (state->rotation != BIT(DRM_ROTATE_0) &&
+                   !omap_framebuffer_supports_rotation(state->fb))
+                       return -EINVAL;
+       }
+
        return 0;
 }