]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
drm/fbdev-helper: Move color-mode lookup into 4CC format helper
authorThomas Zimmermann <tzimmermann@suse.de>
Tue, 24 Sep 2024 07:11:59 +0000 (09:11 +0200)
committerThomas Zimmermann <tzimmermann@suse.de>
Thu, 26 Sep 2024 06:27:49 +0000 (08:27 +0200)
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 <tzimmermann@suse.de>
Reviewed-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20240924071734.98201-2-tzimmermann@suse.de
drivers/gpu/drm/drm_fb_helper.c
drivers/gpu/drm/drm_fourcc.c
include/drm/drm_fourcc.h

index 29c53f9f449ca8ff7caed8c0da14b8bea8bce353..af1fe79c701d2f6ff27c0a6d984fd072364d5353 100644 (file)
@@ -1441,67 +1441,27 @@ unlock:
 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 */
        }
index 193cf8ed7912833671d5fc5e5a6a24ec2270366f..3a94ca211f9ce9637d3690d4b03ddc414ee5a6d4 100644 (file)
@@ -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.
index ccf91daa4307027b3be2a474a892d0a8e7a4ce71..c3f4405d66629e649493f68f88d62761f9e5b266 100644 (file)
@@ -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,