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@xxxxxxxxxxxxxxxx> 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 _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/dri-devel