[PATCH v2] drm: Check in setcrtc if the primary plane supports the fb pixel format

Daniel Vetter daniel at ffwll.ch
Mon Mar 9 08:16:52 PDT 2015


On Mon, Mar 09, 2015 at 10:41:07AM +0200, Laurent Pinchart wrote:
> Drivers implementing the universal planes API report the list of
> supported pixel formats for the primary plane. Make sure the fb passed
> to the setcrtc ioctl is compatible.
> 
> Drivers not implementing the universal planes API will have no format
> reported for the primary plane, skip the check in that case.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>

Merged to drm-misc, thanks.
-Daniel

> ---
>  drivers/gpu/drm/drm_crtc.c         | 17 +++++++++++++++++
>  drivers/gpu/drm/drm_plane_helper.c |  5 +++++
>  include/drm/drm_crtc.h             |  2 ++
>  3 files changed, 24 insertions(+)
> 
> Changes since v1:
> 
> - Add drm_plane.format_default field
> 
> diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c
> index d794bcf..5c49cb3 100644
> --- a/drivers/gpu/drm/drm_crtc.c
> +++ b/drivers/gpu/drm/drm_crtc.c
> @@ -2807,6 +2807,23 @@ int drm_mode_setcrtc(struct drm_device *dev, void *data,
>  
>  		drm_mode_set_crtcinfo(mode, CRTC_INTERLACE_HALVE_V);
>  
> +		/*
> +		 * Check whether the primary plane supports the fb pixel format.
> +		 * Drivers not implementing the universal planes API use a
> +		 * default formats list provided by the DRM core which doesn't
> +		 * match real hardware capabilities. Skip the check in that
> +		 * case.
> +		 */
> +		if (!crtc->primary->format_default) {
> +			ret = drm_plane_check_pixel_format(crtc->primary,
> +							   fb->pixel_format);
> +			if (ret) {
> +				DRM_DEBUG_KMS("Invalid pixel format %s\n",
> +					drm_get_format_name(fb->pixel_format));
> +				goto out;
> +			}
> +		}
> +
>  		ret = drm_crtc_check_viewport(crtc, crtc_req->x, crtc_req->y,
>  					      mode, fb);
>  		if (ret)
> diff --git a/drivers/gpu/drm/drm_plane_helper.c b/drivers/gpu/drm/drm_plane_helper.c
> index 813a066..a56a429 100644
> --- a/drivers/gpu/drm/drm_plane_helper.c
> +++ b/drivers/gpu/drm/drm_plane_helper.c
> @@ -371,6 +371,11 @@ struct drm_plane *drm_primary_helper_create_plane(struct drm_device *dev,
>  	if (formats == NULL) {
>  		formats = safe_modeset_formats;
>  		num_formats = ARRAY_SIZE(safe_modeset_formats);
> +		/*
> +		 * Remove the format_default field from drm_plane when dropping
> +		 * this helper.
> +		 */
> +		primary->format_default = true;
>  	}
>  
>  	/* possible_crtc's will be filled in later by crtc_init */
> diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h
> index da83d39..adc9ea5 100644
> --- a/include/drm/drm_crtc.h
> +++ b/include/drm/drm_crtc.h
> @@ -830,6 +830,7 @@ enum drm_plane_type {
>   * @possible_crtcs: pipes this plane can be bound to
>   * @format_types: array of formats supported by this plane
>   * @format_count: number of formats supported
> + * @format_default: driver hasn't supplied supported formats for the plane
>   * @crtc: currently bound CRTC
>   * @fb: currently bound fb
>   * @old_fb: Temporary tracking of the old fb while a modeset is ongoing. Used by
> @@ -850,6 +851,7 @@ struct drm_plane {
>  	uint32_t possible_crtcs;
>  	uint32_t *format_types;
>  	uint32_t format_count;
> +	bool format_default;
>  
>  	struct drm_crtc *crtc;
>  	struct drm_framebuffer *fb;
> -- 
> Regards,
> 
> Laurent Pinchart
> 

-- 
Daniel Vetter
Software Engineer, Intel Corporation
+41 (0) 79 365 57 48 - http://blog.ffwll.ch


More information about the dri-devel mailing list