[PATCH 5/5] drm/vkms: add support for BGR233

From: Matheus Alves de Almeida

Date: Sun Sep 27 2026 - 20:55:42 EST


Add support for reading and writing the BGR233 pixel format.

Signed-off-by: Matheus Alves de Almeida <matheus.aalmeida@xxxxxxxxxxxx>
---
drivers/gpu/drm/vkms/vkms_formats.c | 20 ++++++++++++++++++++
drivers/gpu/drm/vkms/vkms_plane.c | 1 +
drivers/gpu/drm/vkms/vkms_writeback.c | 3 ++-
3 files changed, 23 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/vkms/vkms_formats.c b/drivers/gpu/drm/vkms/vkms_formats.c
index 0c3bb0618..de25c8a19 100644
--- a/drivers/gpu/drm/vkms/vkms_formats.c
+++ b/drivers/gpu/drm/vkms/vkms_formats.c
@@ -273,6 +273,12 @@ static struct pixel_argb_u16 argb_u16_from_RGB332(u8 pixel)
pixel & 0x3, 0xffff, 3, 3, 2, 0);
}

+static struct pixel_argb_u16 argb_u16_from_BGR233(u8 pixel)
+{
+ return channels_to_argb_u16(pixel & 0x7, (pixel >> 3) & 0x7,
+ (pixel >> 6) & 0x3, 0xffff, 3, 3, 2, 0);
+}
+
static struct pixel_argb_u16 argb_u16_from_gray8(u8 gray)
{
return argb_u16_from_u8888(255, gray, gray, gray);
@@ -482,6 +488,7 @@ READ_LINE(RGB565_read_line, px, __le16, argb_u16_from_RGB565, px)
READ_LINE(BGR565_read_line, px, __le16, argb_u16_from_BGR565, px)

READ_LINE(RGB332_read_line, px, u8, argb_u16_from_RGB332, *px)
+READ_LINE(BGR233_read_line, px, u8, argb_u16_from_BGR233, *px)

READ_LINE(R8_read_line, px, u8, argb_u16_from_gray8, *px)

@@ -707,6 +714,15 @@ static void argb_u16_to_RGB332(u8 *out_pixel, const struct pixel_argb_u16 *in_pi
*out_pixel = r << 5 | g << 2 | b;
}

+static void argb_u16_to_BGR233(u8 *out_pixel, const struct pixel_argb_u16 *in_pixel)
+{
+ u16 r, g, b;
+
+ argb_u16_to_channels(&r, &g, &b, NULL, 3, 3, 2, 0, in_pixel);
+
+ *out_pixel = b << 6 | g << 3 | r;
+}
+
/**
* vkms_writeback_row() - Generic loop for all supported writeback format. It is executed just
* after the blending to write a line in the writeback buffer.
@@ -771,6 +787,8 @@ pixel_read_line_t get_pixel_read_line_function(u32 format)
return &BGR565_read_line;
case DRM_FORMAT_RGB332:
return &RGB332_read_line;
+ case DRM_FORMAT_BGR233:
+ return &BGR233_read_line;
case DRM_FORMAT_NV12:
case DRM_FORMAT_NV16:
case DRM_FORMAT_NV24:
@@ -1013,6 +1031,8 @@ pixel_write_t get_pixel_write_function(u32 format)
return &argb_u16_to_BGR565;
case DRM_FORMAT_RGB332:
return &argb_u16_to_RGB332;
+ case DRM_FORMAT_BGR233:
+ return &argb_u16_to_BGR233;
default:
/*
* This is a bug in vkms_writeback_atomic_check. All the supported
diff --git a/drivers/gpu/drm/vkms/vkms_plane.c b/drivers/gpu/drm/vkms/vkms_plane.c
index fff2d4eb5..89beda57e 100644
--- a/drivers/gpu/drm/vkms/vkms_plane.c
+++ b/drivers/gpu/drm/vkms/vkms_plane.c
@@ -30,6 +30,7 @@ static const u32 vkms_formats[] = {
DRM_FORMAT_RGB565,
DRM_FORMAT_BGR565,
DRM_FORMAT_RGB332,
+ DRM_FORMAT_BGR233,
DRM_FORMAT_NV12,
DRM_FORMAT_NV16,
DRM_FORMAT_NV24,
diff --git a/drivers/gpu/drm/vkms/vkms_writeback.c b/drivers/gpu/drm/vkms/vkms_writeback.c
index 54330803e..37042445d 100644
--- a/drivers/gpu/drm/vkms/vkms_writeback.c
+++ b/drivers/gpu/drm/vkms/vkms_writeback.c
@@ -23,7 +23,8 @@ static const u32 vkms_wb_formats[] = {
DRM_FORMAT_ARGB16161616,
DRM_FORMAT_RGB565,
DRM_FORMAT_BGR565,
- DRM_FORMAT_RGB332
+ DRM_FORMAT_RGB332,
+ DRM_FORMAT_BGR233
};

static const struct drm_connector_funcs vkms_wb_connector_funcs = {
--
2.43.0