Hi Thomas,

Thank you for the patch.

On Fri, Aug 16, 2024 at 02:22:27PM +0200, Thomas Zimmermann wrote:
> The color mode 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 form fbdev helpers into a 4CC helper,

s/form/from/

> so that is can be shared among DRM clients.
> 
> 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
> 

-- 
Regards,

Laurent Pinchart

Reply via email to