Hi Am 09.06.25 um 12:17 schrieb Liviu Dudau:
On Tue, May 27, 2025 at 11:42:57AM +0200, Thomas Zimmermann wrote:Map DRM FourCC codes to pixel descriptions with internal type struct hdlcd_format. Reorder formats by preference. Avoid simplefb's struct simplefb_format, which is for parsing "simple-framebuffer" DT nodes.The HDLCD drivers uses struct simplefb_format and its default initializer SIMPLEFB_FORMATS to map DRM_FORMAT_ constants to pixel descriptions. The simplefb helpers are for parsing "simple-framebuffer" DT nodes and should be avoided in other context. Therefore replace it in hdlcd with the custom type struct hdlcd_format and the pixel descriptions from PIXEL_FORMAT_ constants. Plane formats exported to userspace are roughly sorted as preferred by hardware and/or driver. SIMPLEFB_FORMATS currently puts 16-bit formats to the top of the list. Changing to struct hdlcd_format allows for reordering the format list. 32-bit formats are now the preferred ones. This change also removes including <linux/platform_data/simplefb.h>, which includes several unrelated headers, such as <linux/fb.h>. Signed-off-by: Thomas Zimmermann <tzimmerm...@suse.de> --- drivers/gpu/drm/arm/hdlcd_crtc.c | 32 +++++++++++++++++++++++--------- include/video/pixel_format.h | 15 +++++++++++++++ 2 files changed, 38 insertions(+), 9 deletions(-) diff --git a/drivers/gpu/drm/arm/hdlcd_crtc.c b/drivers/gpu/drm/arm/hdlcd_crtc.c index 3cfefadc7c9d..6fabe65ec0a2 100644 --- a/drivers/gpu/drm/arm/hdlcd_crtc.c +++ b/drivers/gpu/drm/arm/hdlcd_crtc.c @@ -11,8 +11,8 @@#include <linux/clk.h>#include <linux/of_graph.h> -#include <linux/platform_data/simplefb.h>+#include <video/pixel_format.h>#include <video/videomode.h>#include <drm/drm_atomic.h>@@ -28,6 +28,25 @@ #include "hdlcd_drv.h" #include "hdlcd_regs.h"+struct hdlcd_format {+ u32 fourcc; + struct pixel_format pixel; +}; + +static const struct hdlcd_format supported_formats[] = { + { DRM_FORMAT_XRGB8888, PIXEL_FORMAT_XRGB8888 }, + { DRM_FORMAT_ARGB8888, PIXEL_FORMAT_ARGB8888 }, + { DRM_FORMAT_XBGR8888, PIXEL_FORMAT_XBGR8888 }, + { DRM_FORMAT_ABGR8888, PIXEL_FORMAT_ABGR8888 }, + { DRM_FORMAT_XRGB2101010, PIXEL_FORMAT_XRGB2101010}, + { DRM_FORMAT_ARGB2101010, PIXEL_FORMAT_ARGB2101010}, + { DRM_FORMAT_RGB565, PIXEL_FORMAT_RGB565 }, + { DRM_FORMAT_RGBA5551, PIXEL_FORMAT_RGBA5551 }, + { DRM_FORMAT_XRGB1555, PIXEL_FORMAT_XRGB1555 }, + { DRM_FORMAT_ARGB1555, PIXEL_FORMAT_ARGB1555 }, + { DRM_FORMAT_RGB888, PIXEL_FORMAT_RGB888 }, +}; + /* * The HDLCD controller is a dumb RGB streamer that gets connected to * a single HDMI transmitter or in the case of the ARM Models it gets @@ -73,8 +92,6 @@ static const struct drm_crtc_funcs hdlcd_crtc_funcs = { .disable_vblank = hdlcd_crtc_disable_vblank, };-static struct simplefb_format supported_formats[] = SIMPLEFB_FORMATS;Sorry, I was on holiday when you've sent the patch and it fell to the bottom of the pile.
No worries.
When I did the initial patch for HDLCD using the SIMPLEFB_FORMATS was convenient as I didn't had to type all the "supported" formats, even if the one carrying the alpha channel were ignored (HDLCD only has one plane). If we're going to move the supported formats in this file I would suggest trimming it down to remove all the alpha-channel formats as they are pointless to list as supported. If there is no other user of the formats added in pixel_format.h then that should slim down the patch considerably.
That's even better. I suspected that not all formats would be supported by hdlcd. I'll prepare an update then.
Best regards Thomas
Best regards, Liviu- /* * Setup the HDLCD registers for decoding the pixels out of the framebuffer */ @@ -83,15 +100,12 @@ static int hdlcd_set_pxl_fmt(struct drm_crtc *crtc) unsigned int btpp; struct hdlcd_drm_private *hdlcd = crtc_to_hdlcd_priv(crtc); const struct drm_framebuffer *fb = crtc->primary->state->fb; - uint32_t pixel_format; - struct simplefb_format *format = NULL; + const struct pixel_format *format = NULL; int i;- pixel_format = fb->format->format;- for (i = 0; i < ARRAY_SIZE(supported_formats); i++) { - if (supported_formats[i].fourcc == pixel_format) - format = &supported_formats[i]; + if (supported_formats[i].fourcc == fb->format->format) + format = &supported_formats[i].pixel; }if (WARN_ON(!format))diff --git a/include/video/pixel_format.h b/include/video/pixel_format.h index b5104b2a3a13..5ad2386e2014 100644 --- a/include/video/pixel_format.h +++ b/include/video/pixel_format.h @@ -23,6 +23,12 @@ struct pixel_format { #define PIXEL_FORMAT_XRGB1555 \ { 16, false, { .alpha = {0, 0}, .red = {10, 5}, .green = {5, 5}, .blue = {0, 5} } }+#define PIXEL_FORMAT_ARGB1555 \+ { 16, false, { .alpha = {15, 1}, .red = {10, 5}, .green = {5, 5}, .blue = {0, 5} } } + +#define PIXEL_FORMAT_RGBA5551 \ + { 16, false, { .alpha = {0, 1}, .red = {11, 5}, .green = {6, 5}, .blue = {1, 5} } } + #define PIXEL_FORMAT_RGB565 \ { 16, false, { .alpha = {0, 0}, .red = {11, 5}, .green = {5, 6}, .blue = {0, 5} } }@@ -32,10 +38,19 @@ struct pixel_format {#define PIXEL_FORMAT_XRGB8888 \ { 32, false, { .alpha = {0, 0}, .red = {16, 8}, .green = {8, 8}, .blue = {0, 8} } }+#define PIXEL_FORMAT_ARGB8888 \+ { 32, false, { .alpha = {24, 8}, .red = {16, 8}, .green = {8, 8}, .blue = {0, 8} } } + #define PIXEL_FORMAT_XBGR8888 \ { 32, false, { .alpha = {0, 0}, .red = {0, 8}, .green = {8, 8}, .blue = {16, 8} } }+#define PIXEL_FORMAT_ABGR8888 \+ { 32, false, { .alpha = {24, 8}, .red = {0, 8}, .green = {8, 8}, .blue = {16, 8} } } + #define PIXEL_FORMAT_XRGB2101010 \ { 32, false, { .alpha = {0, 0}, .red = {20, 10}, .green = {10, 10}, .blue = {0, 10} } }+#define PIXEL_FORMAT_ARGB2101010 \+ { 32, false, { .alpha = {30, 1}, .red = {20, 10}, .green = {10, 10}, .blue = {0, 10} } } + #endif -- 2.49.0
-- -- Thomas Zimmermann Graphics Driver Developer SUSE Software Solutions Germany GmbH Frankenstrasse 146, 90461 Nuernberg, Germany GF: Ivo Totev, Andrew Myers, Andrew McDonald, Boudien Moerman HRB 36809 (AG Nuernberg)