mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-23 12:14:10 +08:00
drm/fbdev-helper: Move color-mode lookup into 4CC format helper
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
This commit is contained in:
parent
dc56f8428e
commit
eb1f4adf91
@ -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 */
|
||||
}
|
||||
|
@ -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.
|
||||
|
@ -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,
|
||||
|
Loading…
Reference in New Issue
Block a user