drm/fourcc: Add DRM_FORMAT_R[124]
[platform/kernel/linux-starfive.git] / drivers / gpu / drm / drm_fourcc.c
index 07741b6..05e65e9 100644 (file)
@@ -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,7 +147,19 @@ 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_C8,              .depth = 8,  .num_planes = 1, .cpp = { 1, 0, 0 }, .hsub = 1, .vsub = 1 },
+               { .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_R1,              .depth = 1,  .num_planes = 1,
+                 .char_per_block = { 1, }, .block_w = { 8, }, .block_h = { 1, }, .hsub = 1, .vsub = 1 },
+               { .format = DRM_FORMAT_R2,              .depth = 2,  .num_planes = 1,
+                 .char_per_block = { 1, }, .block_w = { 4, }, .block_h = { 1, }, .hsub = 1, .vsub = 1 },
+               { .format = DRM_FORMAT_R4,              .depth = 4,  .num_planes = 1,
+                 .char_per_block = { 1, }, .block_w = { 2, }, .block_h = { 1, }, .hsub = 1, .vsub = 1 },
                { .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 },
                { .format = DRM_FORMAT_R12,             .depth = 12, .num_planes = 1, .cpp = { 2, 0, 0 }, .hsub = 1, .vsub = 1 },
@@ -371,6 +398,25 @@ unsigned int drm_format_info_block_height(const struct drm_format_info *info,
 EXPORT_SYMBOL(drm_format_info_block_height);
 
 /**
+ * drm_format_info_bpp - number of bits per pixel
+ * @info: pixel format info
+ * @plane: plane index
+ *
+ * Returns:
+ * The actual number of bits per pixel, depending on the plane index.
+ */
+unsigned int drm_format_info_bpp(const struct drm_format_info *info, int plane)
+{
+       if (!info || plane < 0 || plane >= info->num_planes)
+               return 0;
+
+       return info->char_per_block[plane] * 8 /
+              (drm_format_info_block_width(info, plane) *
+               drm_format_info_block_height(info, plane));
+}
+EXPORT_SYMBOL(drm_format_info_bpp);
+
+/**
  * drm_format_info_min_pitch - computes the minimum required pitch in bytes
  * @info: pixel format info
  * @plane: plane index