From: Ville Syrjälä <ville.syrj...@linux.intel.com>

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.syrj...@linux.intel.com>
---
 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@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

Reply via email to