From: Ville Syrjälä <ville.syrjala@xxxxxxxxxxxxxxx> To make life easier for drivers, let's have the core check that the requested pixel format is supported by at least one plane when creating a new framebuffer. Signed-off-by: Ville Syrjälä <ville.syrjala@xxxxxxxxxxxxxxx> --- drivers/gpu/drm/drm_framebuffer.c | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/drivers/gpu/drm/drm_framebuffer.c b/drivers/gpu/drm/drm_framebuffer.c index c0530a1af5e3..155b21e579c4 100644 --- a/drivers/gpu/drm/drm_framebuffer.c +++ b/drivers/gpu/drm/drm_framebuffer.c @@ -152,6 +152,23 @@ static int fb_plane_height(int height, return DIV_ROUND_UP(height, format->vsub); } +static bool planes_have_format(struct drm_device *dev, u32 format) +{ + struct drm_plane *plane; + + /* TODO: maybe maintain a device level format list? */ + drm_for_each_plane(plane, dev) { + int i; + + for (i = 0; i < plane->format_count; i++) { + if (plane->format_types[i] == format) + return true; + } + } + + return false; +} + static int framebuffer_check(struct drm_device *dev, const struct drm_mode_fb_cmd2 *r) { @@ -168,6 +185,15 @@ static int framebuffer_check(struct drm_device *dev, return -EINVAL; } + if (!planes_have_format(dev, r->pixel_format)) { + struct drm_format_name_buf format_name; + + DRM_DEBUG_KMS("unsupported framebuffer format %s\n", + drm_get_format_name(r->pixel_format, + &format_name)); + return -EINVAL; + } + /* now let the driver pick its own format info */ info = drm_get_format_info(dev, r); -- 2.16.1 _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/dri-devel