Introduce fourcc codes for color-indexed frame buffer formats with two,
four, and sixteen colors, and provide a mapping from bit per pixel and
depth to fourcc codes.

As the number of bits per pixel is less than eight, these rely on proper
block handling for the calculation of bits per pixel and pitch.

Signed-off-by: Geert Uytterhoeven <ge...@linux-m68k.org>
---
v2:
  - Improve pixel descriptions,
  - Require depth to match bpp in drm_mode_legacy_fb_format(),
  - Set .is_color_indexed flag.
---
 drivers/gpu/drm/drm_fourcc.c  | 21 +++++++++++++++++++++
 include/uapi/drm/drm_fourcc.h |  5 ++++-
 2 files changed, 25 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/drm_fourcc.c b/drivers/gpu/drm/drm_fourcc.c
index 6c76bd821d17e7c7..29f4fe199c4ddcf0 100644
--- a/drivers/gpu/drm/drm_fourcc.c
+++ b/drivers/gpu/drm/drm_fourcc.c
@@ -43,6 +43,21 @@ uint32_t drm_mode_legacy_fb_format(uint32_t bpp, uint32_t 
depth)
        uint32_t fmt = DRM_FORMAT_INVALID;
 
        switch (bpp) {
+       case 1:
+               if (depth == 1)
+                       fmt = DRM_FORMAT_C1;
+               break;
+
+       case 2:
+               if (depth == 2)
+                       fmt = DRM_FORMAT_C2;
+               break;
+
+       case 4:
+               if (depth == 4)
+                       fmt = DRM_FORMAT_C4;
+               break;
+
        case 8:
                if (depth == 8)
                        fmt = DRM_FORMAT_C8;
@@ -132,6 +147,12 @@ EXPORT_SYMBOL(drm_driver_legacy_fb_format);
 const struct drm_format_info *__drm_format_info(u32 format)
 {
        static const struct drm_format_info formats[] = {
+               { .format = DRM_FORMAT_C1,              .depth = 1,  
.num_planes = 1,
+                 .char_per_block = { 1, }, .block_w = { 8, }, .block_h = { 1, 
}, .hsub = 1, .vsub = 1, .is_color_indexed = true },
+               { .format = DRM_FORMAT_C2,              .depth = 2,  
.num_planes = 1,
+                 .char_per_block = { 1, }, .block_w = { 4, }, .block_h = { 1, 
}, .hsub = 1, .vsub = 1, .is_color_indexed = true },
+               { .format = DRM_FORMAT_C4,              .depth = 4,  
.num_planes = 1,
+                 .char_per_block = { 1, }, .block_w = { 2, }, .block_h = { 1, 
}, .hsub = 1, .vsub = 1, .is_color_indexed = true },
                { .format = DRM_FORMAT_C8,              .depth = 8,  
.num_planes = 1, .cpp = { 1, 0, 0 }, .hsub = 1, .vsub = 1, .is_color_indexed = 
true },
                { .format = DRM_FORMAT_R8,              .depth = 8,  
.num_planes = 1, .cpp = { 1, 0, 0 }, .hsub = 1, .vsub = 1 },
                { .format = DRM_FORMAT_R10,             .depth = 10, 
.num_planes = 1, .cpp = { 2, 0, 0 }, .hsub = 1, .vsub = 1 },
diff --git a/include/uapi/drm/drm_fourcc.h b/include/uapi/drm/drm_fourcc.h
index fc0c1454d2757d5d..457ed39cc48f08e1 100644
--- a/include/uapi/drm/drm_fourcc.h
+++ b/include/uapi/drm/drm_fourcc.h
@@ -99,7 +99,10 @@ extern "C" {
 #define DRM_FORMAT_INVALID     0
 
 /* color index */
-#define DRM_FORMAT_C8          fourcc_code('C', '8', ' ', ' ') /* [7:0] C */
+#define DRM_FORMAT_C1          fourcc_code('C', '1', ' ', ' ') /* [7:0] 
C0:C1:C2:C3:C4:C5:C6:C7 1:1:1:1:1:1:1:1 eight pixels/byte */
+#define DRM_FORMAT_C2          fourcc_code('C', '2', ' ', ' ') /* [7:0] 
C0:C1:C2:C3 2:2:2:2 four pixels/byte */
+#define DRM_FORMAT_C4          fourcc_code('C', '4', ' ', ' ') /* [7:0] C0:C1 
4:4 two pixels/byte */
+#define DRM_FORMAT_C8          fourcc_code('C', '8', ' ', ' ') /* [7:0] C 8 
one pixel/byte */
 
 /* 8 bpp Red */
 #define DRM_FORMAT_R8          fourcc_code('R', '8', ' ', ' ') /* [7:0] R */
-- 
2.25.1

Reply via email to