[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