[PATCH 33/33] drm/omap: check if rotation is supported before commit
Laurent Pinchart
laurent.pinchart at ideasonboard.com
Tue Feb 23 23:30:34 UTC 2016
Hi Tomi,
Thank you for the patch.
On Friday 19 February 2016 11:48:08 Tomi Valkeinen wrote:
> 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 at ti.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
> ---
> drivers/gpu/drm/omapdrm/omap_drv.h | 1 +
> drivers/gpu/drm/omapdrm/omap_fb.c | 8 ++++++++
> drivers/gpu/drm/omapdrm/omap_plane.c | 6 ++++++
> 3 files changed, 15 insertions(+)
>
> diff --git a/drivers/gpu/drm/omapdrm/omap_drv.h
> b/drivers/gpu/drm/omapdrm/omap_drv.h index c077367dcb1a..16c3eeeae668
> 100644
> --- a/drivers/gpu/drm/omapdrm/omap_drv.h
> +++ b/drivers/gpu/drm/omapdrm/omap_drv.h
> @@ -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);
> diff --git a/drivers/gpu/drm/omapdrm/omap_fb.c
> b/drivers/gpu/drm/omapdrm/omap_fb.c index 481512db2656..610962396eb0 100644
> --- a/drivers/gpu/drm/omapdrm/omap_fb.c
> +++ b/drivers/gpu/drm/omapdrm/omap_fb.c
> @@ -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,
> diff --git a/drivers/gpu/drm/omapdrm/omap_plane.c
> b/drivers/gpu/drm/omapdrm/omap_plane.c index d75b197eff46..93ee538a99f5
> 100644
> --- a/drivers/gpu/drm/omapdrm/omap_plane.c
> +++ b/drivers/gpu/drm/omapdrm/omap_plane.c
> @@ -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;
> }
--
Regards,
Laurent Pinchart
More information about the dri-devel
mailing list