The color mode as specified on the kernel command line gives the user's
preferred color depth and number of bits per pixel. Move the
color-mode-to-format conversion from fbdev helpers into a 4CC helper,
so that it can be shared among DRM clients.

v2:
- fix grammar in commit message (Laurent)

Signed-off-by: Thomas Zimmermann <tzimmerm...@suse.de>
Reviewed-by: Laurent Pinchart <laurent.pinchart+rene...@ideasonboard.com>
---
 drivers/gpu/drm/drm_fb_helper.c | 70 +++++++--------------------------
 drivers/gpu/drm/drm_fourcc.c    | 30 +++++++++++++-
 include/drm/drm_fourcc.h        |  1 +
 3 files changed, 45 insertions(+), 56 deletions(-)

diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c
index 29c53f9f449c..af1fe79c701d 100644
--- a/drivers/gpu/drm/drm_fb_helper.c
+++ b/drivers/gpu/drm/drm_fb_helper.c
@@ -1441,67 +1441,27 @@ int drm_fb_helper_pan_display(struct fb_var_screeninfo 
*var,
 EXPORT_SYMBOL(drm_fb_helper_pan_display);
 
 static uint32_t drm_fb_helper_find_format(struct drm_fb_helper *fb_helper, 
const uint32_t *formats,
-                                         size_t format_count, uint32_t bpp, 
uint32_t depth)
+                                         size_t format_count, unsigned int 
color_mode)
 {
        struct drm_device *dev = fb_helper->dev;
        uint32_t format;
        size_t i;
 
-       /*
-        * Do not consider YUV or other complicated formats
-        * for framebuffers. This means only legacy formats
-        * are supported (fmt->depth is a legacy field), but
-        * the framebuffer emulation can only deal with such
-        * formats, specifically RGB/BGA formats.
-        */
-       format = drm_mode_legacy_fb_format(bpp, depth);
-       if (!format)
-               goto err;
+       format = drm_driver_color_mode_format(dev, color_mode);
+       if (!format) {
+               drm_info(dev, "unsupported color mode of %d\n", color_mode);
+               return DRM_FORMAT_INVALID;
+       }
 
        for (i = 0; i < format_count; ++i) {
                if (formats[i] == format)
                        return format;
        }
-
-err:
-       /* We found nothing. */
-       drm_warn(dev, "bpp/depth value of %u/%u not supported\n", bpp, depth);
+       drm_warn(dev, "format %p4cc not supported\n", &format);
 
        return DRM_FORMAT_INVALID;
 }
 
-static uint32_t drm_fb_helper_find_color_mode_format(struct drm_fb_helper 
*fb_helper,
-                                                    const uint32_t *formats, 
size_t format_count,
-                                                    unsigned int color_mode)
-{
-       struct drm_device *dev = fb_helper->dev;
-       uint32_t bpp, depth;
-
-       switch (color_mode) {
-       case 1:
-       case 2:
-       case 4:
-       case 8:
-       case 16:
-       case 24:
-               bpp = depth = color_mode;
-               break;
-       case 15:
-               bpp = 16;
-               depth = 15;
-               break;
-       case 32:
-               bpp = 32;
-               depth = 24;
-               break;
-       default:
-               drm_info(dev, "unsupported color mode of %d\n", color_mode);
-               return DRM_FORMAT_INVALID;
-       }
-
-       return drm_fb_helper_find_format(fb_helper, formats, format_count, bpp, 
depth);
-}
-
 static int __drm_fb_helper_find_sizes(struct drm_fb_helper *fb_helper,
                                      struct drm_fb_helper_surface_size *sizes)
 {
@@ -1531,10 +1491,10 @@ static int __drm_fb_helper_find_sizes(struct 
drm_fb_helper *fb_helper,
                        if (!cmdline_mode->bpp_specified)
                                continue;
 
-                       surface_format = 
drm_fb_helper_find_color_mode_format(fb_helper,
-                                                                             
plane->format_types,
-                                                                             
plane->format_count,
-                                                                             
cmdline_mode->bpp);
+                       surface_format = drm_fb_helper_find_format(fb_helper,
+                                                                  
plane->format_types,
+                                                                  
plane->format_count,
+                                                                  
cmdline_mode->bpp);
                        if (surface_format != DRM_FORMAT_INVALID)
                                break; /* found supported format */
                }
@@ -1544,10 +1504,10 @@ static int __drm_fb_helper_find_sizes(struct 
drm_fb_helper *fb_helper,
                        break; /* found supported format */
 
                /* try preferred color mode */
-               surface_format = drm_fb_helper_find_color_mode_format(fb_helper,
-                                                                     
plane->format_types,
-                                                                     
plane->format_count,
-                                                                     
fb_helper->preferred_bpp);
+               surface_format = drm_fb_helper_find_format(fb_helper,
+                                                          plane->format_types,
+                                                          plane->format_count,
+                                                          
fb_helper->preferred_bpp);
                if (surface_format != DRM_FORMAT_INVALID)
                        break; /* found supported format */
        }
diff --git a/drivers/gpu/drm/drm_fourcc.c b/drivers/gpu/drm/drm_fourcc.c
index 193cf8ed7912..3a94ca211f9c 100644
--- a/drivers/gpu/drm/drm_fourcc.c
+++ b/drivers/gpu/drm/drm_fourcc.c
@@ -36,7 +36,6 @@
  * @depth: bit depth per pixel
  *
  * Computes a drm fourcc pixel format code for the given @bpp/@depth values.
- * Useful in fbdev emulation code, since that deals in those values.
  */
 uint32_t drm_mode_legacy_fb_format(uint32_t bpp, uint32_t depth)
 {
@@ -140,6 +139,35 @@ uint32_t drm_driver_legacy_fb_format(struct drm_device 
*dev,
 }
 EXPORT_SYMBOL(drm_driver_legacy_fb_format);
 
+/**
+ * drm_driver_color_mode_format - Compute DRM 4CC code from color mode
+ * @dev: DRM device
+ * @color_mode: command-line color mode
+ *
+ * Computes a DRM 4CC pixel format code for the given color mode using
+ * drm_driver_color_mode(). The color mode is in the format used and the
+ * kernel command line. It specifies the number of bits per pixel
+ * and color depth in a single value.
+ *
+ * Useful in fbdev emulation code, since that deals in those values. The
+ * helper does not consider YUV or other complicated formats. This means
+ * only legacy formats are supported (fmt->depth is a legacy field), but
+ * the framebuffer emulation can only deal with such formats, specifically
+ * RGB/BGA formats.
+ */
+uint32_t drm_driver_color_mode_format(struct drm_device *dev, unsigned int 
color_mode)
+{
+       switch (color_mode) {
+       case 15:
+               return drm_driver_legacy_fb_format(dev, 16, 15);
+       case 32:
+               return drm_driver_legacy_fb_format(dev, 32, 24);
+       default:
+               return drm_driver_legacy_fb_format(dev, color_mode, color_mode);
+       }
+}
+EXPORT_SYMBOL(drm_driver_color_mode_format);
+
 /*
  * Internal function to query information for a given format. See
  * drm_format_info() for the public API.
diff --git a/include/drm/drm_fourcc.h b/include/drm/drm_fourcc.h
index ccf91daa4307..c3f4405d6662 100644
--- a/include/drm/drm_fourcc.h
+++ b/include/drm/drm_fourcc.h
@@ -313,6 +313,7 @@ drm_get_format_info(struct drm_device *dev,
 uint32_t drm_mode_legacy_fb_format(uint32_t bpp, uint32_t depth);
 uint32_t drm_driver_legacy_fb_format(struct drm_device *dev,
                                     uint32_t bpp, uint32_t depth);
+uint32_t drm_driver_color_mode_format(struct drm_device *dev, unsigned int 
color_mode);
 unsigned int drm_format_info_block_width(const struct drm_format_info *info,
                                         int plane);
 unsigned int drm_format_info_block_height(const struct drm_format_info *info,
-- 
2.46.0

Reply via email to