[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