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

Reply via email to