drm/fbdev-helper: Move color-mode lookup into 4CC format helper
[ Upstream commit eb1f4adf9101573fc2347978a60d71c4f1176cca ] 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 Stable-dep-of: 6b481ab0e685 ("drm/nouveau: select FW caching") Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
05d9eaa444
commit
f9c843f56d
@@ -1443,67 +1443,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)
|
||||
{
|
||||
@@ -1533,10 +1493,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 */
|
||||
}
|
||||
@@ -1546,10 +1506,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,
|
||||
|
||||
Reference in New Issue
Block a user