hc
2024-01-03 2f7c68cb55ecb7331f2381deb497c27155f32faf
kernel/drivers/gpu/drm/drm_fourcc.c
....@@ -27,7 +27,7 @@
2727 #include <linux/export.h>
2828 #include <linux/kernel.h>
2929
30
-#include <drm/drmP.h>
30
+#include <drm/drm_device.h>
3131 #include <drm/drm_fourcc.h>
3232
3333 static char printable_char(int c)
....@@ -45,38 +45,90 @@
4545 */
4646 uint32_t drm_mode_legacy_fb_format(uint32_t bpp, uint32_t depth)
4747 {
48
- uint32_t fmt;
48
+ uint32_t fmt = DRM_FORMAT_INVALID;
4949
5050 switch (bpp) {
5151 case 8:
52
- fmt = DRM_FORMAT_C8;
52
+ if (depth == 8)
53
+ fmt = DRM_FORMAT_C8;
5354 break;
55
+
5456 case 16:
55
- if (depth == 15)
57
+ switch (depth) {
58
+ case 15:
5659 fmt = DRM_FORMAT_XRGB1555;
57
- else
60
+ break;
61
+ case 16:
5862 fmt = DRM_FORMAT_RGB565;
63
+ break;
64
+ default:
65
+ break;
66
+ }
5967 break;
68
+
6069 case 24:
61
- fmt = DRM_FORMAT_RGB888;
62
- break;
63
- case 32:
6470 if (depth == 24)
65
- fmt = DRM_FORMAT_XRGB8888;
66
- else if (depth == 30)
67
- fmt = DRM_FORMAT_XRGB2101010;
68
- else
69
- fmt = DRM_FORMAT_ARGB8888;
71
+ fmt = DRM_FORMAT_RGB888;
7072 break;
73
+
74
+ case 32:
75
+ switch (depth) {
76
+ case 24:
77
+ fmt = DRM_FORMAT_XRGB8888;
78
+ break;
79
+ case 30:
80
+ fmt = DRM_FORMAT_XRGB2101010;
81
+ break;
82
+ case 32:
83
+ fmt = DRM_FORMAT_ARGB8888;
84
+ break;
85
+ default:
86
+ break;
87
+ }
88
+ break;
89
+
7190 default:
72
- DRM_ERROR("bad bpp, assuming x8r8g8b8 pixel format\n");
73
- fmt = DRM_FORMAT_XRGB8888;
7491 break;
7592 }
7693
7794 return fmt;
7895 }
7996 EXPORT_SYMBOL(drm_mode_legacy_fb_format);
97
+
98
+/**
99
+ * drm_driver_legacy_fb_format - compute drm fourcc code from legacy description
100
+ * @dev: DRM device
101
+ * @bpp: bits per pixels
102
+ * @depth: bit depth per pixel
103
+ *
104
+ * Computes a drm fourcc pixel format code for the given @bpp/@depth values.
105
+ * Unlike drm_mode_legacy_fb_format() this looks at the drivers mode_config,
106
+ * and depending on the &drm_mode_config.quirk_addfb_prefer_host_byte_order flag
107
+ * it returns little endian byte order or host byte order framebuffer formats.
108
+ */
109
+uint32_t drm_driver_legacy_fb_format(struct drm_device *dev,
110
+ uint32_t bpp, uint32_t depth)
111
+{
112
+ uint32_t fmt = drm_mode_legacy_fb_format(bpp, depth);
113
+
114
+ if (dev->mode_config.quirk_addfb_prefer_host_byte_order) {
115
+ if (fmt == DRM_FORMAT_XRGB8888)
116
+ fmt = DRM_FORMAT_HOST_XRGB8888;
117
+ if (fmt == DRM_FORMAT_ARGB8888)
118
+ fmt = DRM_FORMAT_HOST_ARGB8888;
119
+ if (fmt == DRM_FORMAT_RGB565)
120
+ fmt = DRM_FORMAT_HOST_RGB565;
121
+ if (fmt == DRM_FORMAT_XRGB1555)
122
+ fmt = DRM_FORMAT_HOST_XRGB1555;
123
+ }
124
+
125
+ if (dev->mode_config.quirk_addfb_prefer_xbgr_30bpp &&
126
+ fmt == DRM_FORMAT_XRGB2101010)
127
+ fmt = DRM_FORMAT_XBGR2101010;
128
+
129
+ return fmt;
130
+}
131
+EXPORT_SYMBOL(drm_driver_legacy_fb_format);
80132
81133 /**
82134 * drm_get_format_name - fill a string with a drm fourcc format's name
....@@ -105,80 +157,152 @@
105157 const struct drm_format_info *__drm_format_info(u32 format)
106158 {
107159 static const struct drm_format_info formats[] = {
108
- { .format = DRM_FORMAT_C8, .depth = 8, .num_planes = 1, .bpp = { 8, 0, 0 }, .hsub = 1, .vsub = 1 },
109
- { .format = DRM_FORMAT_RGB332, .depth = 8, .num_planes = 1, .bpp = { 8, 0, 0 }, .hsub = 1, .vsub = 1 },
110
- { .format = DRM_FORMAT_BGR233, .depth = 8, .num_planes = 1, .bpp = { 8, 0, 0 }, .hsub = 1, .vsub = 1 },
111
- { .format = DRM_FORMAT_XRGB4444, .depth = 0, .num_planes = 1, .bpp = { 16, 0, 0 }, .hsub = 1, .vsub = 1 },
112
- { .format = DRM_FORMAT_XBGR4444, .depth = 0, .num_planes = 1, .bpp = { 16, 0, 0 }, .hsub = 1, .vsub = 1 },
113
- { .format = DRM_FORMAT_RGBX4444, .depth = 0, .num_planes = 1, .bpp = { 16, 0, 0 }, .hsub = 1, .vsub = 1 },
114
- { .format = DRM_FORMAT_BGRX4444, .depth = 0, .num_planes = 1, .bpp = { 16, 0, 0 }, .hsub = 1, .vsub = 1 },
115
- { .format = DRM_FORMAT_ARGB4444, .depth = 0, .num_planes = 1, .bpp = { 16, 0, 0 }, .hsub = 1, .vsub = 1, .has_alpha = true },
116
- { .format = DRM_FORMAT_ABGR4444, .depth = 0, .num_planes = 1, .bpp = { 16, 0, 0 }, .hsub = 1, .vsub = 1, .has_alpha = true },
117
- { .format = DRM_FORMAT_RGBA4444, .depth = 0, .num_planes = 1, .bpp = { 16, 0, 0 }, .hsub = 1, .vsub = 1, .has_alpha = true },
118
- { .format = DRM_FORMAT_BGRA4444, .depth = 0, .num_planes = 1, .bpp = { 16, 0, 0 }, .hsub = 1, .vsub = 1, .has_alpha = true },
119
- { .format = DRM_FORMAT_XRGB1555, .depth = 15, .num_planes = 1, .bpp = { 16, 0, 0 }, .hsub = 1, .vsub = 1 },
120
- { .format = DRM_FORMAT_XBGR1555, .depth = 15, .num_planes = 1, .bpp = { 16, 0, 0 }, .hsub = 1, .vsub = 1 },
121
- { .format = DRM_FORMAT_RGBX5551, .depth = 15, .num_planes = 1, .bpp = { 16, 0, 0 }, .hsub = 1, .vsub = 1 },
122
- { .format = DRM_FORMAT_BGRX5551, .depth = 15, .num_planes = 1, .bpp = { 16, 0, 0 }, .hsub = 1, .vsub = 1 },
123
- { .format = DRM_FORMAT_ARGB1555, .depth = 15, .num_planes = 1, .bpp = { 16, 0, 0 }, .hsub = 1, .vsub = 1, .has_alpha = true },
124
- { .format = DRM_FORMAT_ABGR1555, .depth = 15, .num_planes = 1, .bpp = { 16, 0, 0 }, .hsub = 1, .vsub = 1, .has_alpha = true },
125
- { .format = DRM_FORMAT_RGBA5551, .depth = 15, .num_planes = 1, .bpp = { 16, 0, 0 }, .hsub = 1, .vsub = 1, .has_alpha = true },
126
- { .format = DRM_FORMAT_BGRA5551, .depth = 15, .num_planes = 1, .bpp = { 16, 0, 0 }, .hsub = 1, .vsub = 1, .has_alpha = true },
127
- { .format = DRM_FORMAT_RGB565, .depth = 16, .num_planes = 1, .bpp = { 16, 0, 0 }, .hsub = 1, .vsub = 1 },
128
- { .format = DRM_FORMAT_BGR565, .depth = 16, .num_planes = 1, .bpp = { 16, 0, 0 }, .hsub = 1, .vsub = 1 },
129
- { .format = DRM_FORMAT_RGB888, .depth = 24, .num_planes = 1, .bpp = { 24, 0, 0 }, .hsub = 1, .vsub = 1 },
130
- { .format = DRM_FORMAT_BGR888, .depth = 24, .num_planes = 1, .bpp = { 24, 0, 0 }, .hsub = 1, .vsub = 1 },
131
- { .format = DRM_FORMAT_XRGB8888, .depth = 24, .num_planes = 1, .bpp = { 32, 0, 0 }, .hsub = 1, .vsub = 1 },
132
- { .format = DRM_FORMAT_XBGR8888, .depth = 24, .num_planes = 1, .bpp = { 32, 0, 0 }, .hsub = 1, .vsub = 1 },
133
- { .format = DRM_FORMAT_RGBX8888, .depth = 24, .num_planes = 1, .bpp = { 32, 0, 0 }, .hsub = 1, .vsub = 1 },
134
- { .format = DRM_FORMAT_BGRX8888, .depth = 24, .num_planes = 1, .bpp = { 32, 0, 0 }, .hsub = 1, .vsub = 1 },
135
- { .format = DRM_FORMAT_RGB565_A8, .depth = 24, .num_planes = 2, .bpp = { 16, 1, 0 }, .hsub = 1, .vsub = 1, .has_alpha = true },
136
- { .format = DRM_FORMAT_BGR565_A8, .depth = 24, .num_planes = 2, .bpp = { 16, 1, 0 }, .hsub = 1, .vsub = 1, .has_alpha = true },
137
- { .format = DRM_FORMAT_XRGB2101010, .depth = 30, .num_planes = 1, .bpp = { 32, 0, 0 }, .hsub = 1, .vsub = 1 },
138
- { .format = DRM_FORMAT_XBGR2101010, .depth = 30, .num_planes = 1, .bpp = { 32, 0, 0 }, .hsub = 1, .vsub = 1 },
139
- { .format = DRM_FORMAT_RGBX1010102, .depth = 30, .num_planes = 1, .bpp = { 32, 0, 0 }, .hsub = 1, .vsub = 1 },
140
- { .format = DRM_FORMAT_BGRX1010102, .depth = 30, .num_planes = 1, .bpp = { 32, 0, 0 }, .hsub = 1, .vsub = 1 },
141
- { .format = DRM_FORMAT_ARGB2101010, .depth = 30, .num_planes = 1, .bpp = { 32, 0, 0 }, .hsub = 1, .vsub = 1, .has_alpha = true },
142
- { .format = DRM_FORMAT_ABGR2101010, .depth = 30, .num_planes = 1, .bpp = { 32, 0, 0 }, .hsub = 1, .vsub = 1, .has_alpha = true },
143
- { .format = DRM_FORMAT_RGBA1010102, .depth = 30, .num_planes = 1, .bpp = { 32, 0, 0 }, .hsub = 1, .vsub = 1, .has_alpha = true },
144
- { .format = DRM_FORMAT_BGRA1010102, .depth = 30, .num_planes = 1, .bpp = { 32, 0, 0 }, .hsub = 1, .vsub = 1, .has_alpha = true },
145
- { .format = DRM_FORMAT_ARGB8888, .depth = 32, .num_planes = 1, .bpp = { 32, 0, 0 }, .hsub = 1, .vsub = 1, .has_alpha = true },
146
- { .format = DRM_FORMAT_ABGR8888, .depth = 32, .num_planes = 1, .bpp = { 32, 0, 0 }, .hsub = 1, .vsub = 1, .has_alpha = true },
147
- { .format = DRM_FORMAT_RGBA8888, .depth = 32, .num_planes = 1, .bpp = { 32, 0, 0 }, .hsub = 1, .vsub = 1, .has_alpha = true },
148
- { .format = DRM_FORMAT_BGRA8888, .depth = 32, .num_planes = 1, .bpp = { 32, 0, 0 }, .hsub = 1, .vsub = 1, .has_alpha = true },
149
- { .format = DRM_FORMAT_RGB888_A8, .depth = 32, .num_planes = 2, .bpp = { 24, 8, 0 }, .hsub = 1, .vsub = 1, .has_alpha = true },
150
- { .format = DRM_FORMAT_BGR888_A8, .depth = 32, .num_planes = 2, .bpp = { 24, 8, 0 }, .hsub = 1, .vsub = 1, .has_alpha = true },
151
- { .format = DRM_FORMAT_XRGB8888_A8, .depth = 32, .num_planes = 2, .bpp = { 32, 8, 0 }, .hsub = 1, .vsub = 1, .has_alpha = true },
152
- { .format = DRM_FORMAT_XBGR8888_A8, .depth = 32, .num_planes = 2, .bpp = { 32, 8, 0 }, .hsub = 1, .vsub = 1, .has_alpha = true },
153
- { .format = DRM_FORMAT_RGBX8888_A8, .depth = 32, .num_planes = 2, .bpp = { 32, 8, 0 }, .hsub = 1, .vsub = 1, .has_alpha = true },
154
- { .format = DRM_FORMAT_BGRX8888_A8, .depth = 32, .num_planes = 2, .bpp = { 32, 8, 0 }, .hsub = 1, .vsub = 1, .has_alpha = true },
155
- { .format = DRM_FORMAT_YUV410, .depth = 0, .num_planes = 3, .bpp = { 8, 8, 8 }, .hsub = 4, .vsub = 4, .is_yuv = true },
156
- { .format = DRM_FORMAT_YVU410, .depth = 0, .num_planes = 3, .bpp = { 8, 8, 8 }, .hsub = 4, .vsub = 4, .is_yuv = true },
157
- { .format = DRM_FORMAT_YUV411, .depth = 0, .num_planes = 3, .bpp = { 8, 8, 8 }, .hsub = 4, .vsub = 1, .is_yuv = true },
158
- { .format = DRM_FORMAT_YVU411, .depth = 0, .num_planes = 3, .bpp = { 8, 8, 8 }, .hsub = 4, .vsub = 1, .is_yuv = true },
159
- { .format = DRM_FORMAT_YUV420, .depth = 0, .num_planes = 3, .bpp = { 8, 8, 8 }, .hsub = 2, .vsub = 2, .is_yuv = true },
160
- { .format = DRM_FORMAT_YVU420, .depth = 0, .num_planes = 3, .bpp = { 8, 8, 8 }, .hsub = 2, .vsub = 2, .is_yuv = true },
161
- { .format = DRM_FORMAT_YUV422, .depth = 0, .num_planes = 3, .bpp = { 8, 8, 8 }, .hsub = 2, .vsub = 1, .is_yuv = true },
162
- { .format = DRM_FORMAT_YVU422, .depth = 0, .num_planes = 3, .bpp = { 8, 8, 8 }, .hsub = 2, .vsub = 1, .is_yuv = true },
163
- { .format = DRM_FORMAT_YUV444, .depth = 0, .num_planes = 3, .bpp = { 8, 8, 8 }, .hsub = 1, .vsub = 1, .is_yuv = true },
164
- { .format = DRM_FORMAT_YVU444, .depth = 0, .num_planes = 3, .bpp = { 8, 8, 8 }, .hsub = 1, .vsub = 1, .is_yuv = true },
165
- { .format = DRM_FORMAT_NV12, .depth = 0, .num_planes = 2, .bpp = { 8, 16, 0 }, .hsub = 2, .vsub = 2, .is_yuv = true },
166
- { .format = DRM_FORMAT_NV21, .depth = 0, .num_planes = 2, .bpp = { 8, 16, 0 }, .hsub = 2, .vsub = 2, .is_yuv = true },
167
- { .format = DRM_FORMAT_NV16, .depth = 0, .num_planes = 2, .bpp = { 8, 16, 0 }, .hsub = 2, .vsub = 1, .is_yuv = true },
168
- { .format = DRM_FORMAT_NV61, .depth = 0, .num_planes = 2, .bpp = { 8, 16, 0 }, .hsub = 2, .vsub = 1, .is_yuv = true },
169
- { .format = DRM_FORMAT_NV24, .depth = 0, .num_planes = 2, .bpp = { 8, 16, 0 }, .hsub = 1, .vsub = 1, .is_yuv = true },
170
- { .format = DRM_FORMAT_NV42, .depth = 0, .num_planes = 2, .bpp = { 8, 16, 0 }, .hsub = 1, .vsub = 1, .is_yuv = true },
171
- { .format = DRM_FORMAT_NV12_10, .depth = 0, .num_planes = 2, .bpp = { 10, 20, 0 }, .hsub = 2, .vsub = 2, .is_yuv = true },
172
- { .format = DRM_FORMAT_NV21_10, .depth = 0, .num_planes = 2, .bpp = { 10, 20, 0 }, .hsub = 2, .vsub = 2, .is_yuv = true },
173
- { .format = DRM_FORMAT_NV16_10, .depth = 0, .num_planes = 2, .bpp = { 10, 20, 0 }, .hsub = 2, .vsub = 1, .is_yuv = true },
174
- { .format = DRM_FORMAT_NV61_10, .depth = 0, .num_planes = 2, .bpp = { 10, 20, 0 }, .hsub = 2, .vsub = 1, .is_yuv = true },
175
- { .format = DRM_FORMAT_NV24_10, .depth = 0, .num_planes = 2, .bpp = { 10, 20, 0 }, .hsub = 1, .vsub = 1, .is_yuv = true },
176
- { .format = DRM_FORMAT_NV42_10, .depth = 0, .num_planes = 2, .bpp = { 10, 20, 0 }, .hsub = 1, .vsub = 1, .is_yuv = true },
177
- { .format = DRM_FORMAT_YUYV, .depth = 0, .num_planes = 1, .bpp = { 16, 0, 0 }, .hsub = 2, .vsub = 1, .is_yuv = true },
178
- { .format = DRM_FORMAT_YVYU, .depth = 0, .num_planes = 1, .bpp = { 16, 0, 0 }, .hsub = 2, .vsub = 1, .is_yuv = true },
179
- { .format = DRM_FORMAT_UYVY, .depth = 0, .num_planes = 1, .bpp = { 16, 0, 0 }, .hsub = 2, .vsub = 1, .is_yuv = true },
180
- { .format = DRM_FORMAT_VYUY, .depth = 0, .num_planes = 1, .bpp = { 16, 0, 0 }, .hsub = 2, .vsub = 1, .is_yuv = true },
181
- { .format = DRM_FORMAT_AYUV, .depth = 0, .num_planes = 1, .bpp = { 32, 0, 0 }, .hsub = 1, .vsub = 1, .has_alpha = true, .is_yuv = true },
160
+ { .format = DRM_FORMAT_C8, .depth = 8, .num_planes = 1, .cpp = { 1, 0, 0 }, .hsub = 1, .vsub = 1 },
161
+ { .format = DRM_FORMAT_RGB332, .depth = 8, .num_planes = 1, .cpp = { 1, 0, 0 }, .hsub = 1, .vsub = 1 },
162
+ { .format = DRM_FORMAT_BGR233, .depth = 8, .num_planes = 1, .cpp = { 1, 0, 0 }, .hsub = 1, .vsub = 1 },
163
+ { .format = DRM_FORMAT_XRGB4444, .depth = 0, .num_planes = 1, .cpp = { 2, 0, 0 }, .hsub = 1, .vsub = 1 },
164
+ { .format = DRM_FORMAT_XBGR4444, .depth = 0, .num_planes = 1, .cpp = { 2, 0, 0 }, .hsub = 1, .vsub = 1 },
165
+ { .format = DRM_FORMAT_RGBX4444, .depth = 0, .num_planes = 1, .cpp = { 2, 0, 0 }, .hsub = 1, .vsub = 1 },
166
+ { .format = DRM_FORMAT_BGRX4444, .depth = 0, .num_planes = 1, .cpp = { 2, 0, 0 }, .hsub = 1, .vsub = 1 },
167
+ { .format = DRM_FORMAT_ARGB4444, .depth = 0, .num_planes = 1, .cpp = { 2, 0, 0 }, .hsub = 1, .vsub = 1, .has_alpha = true },
168
+ { .format = DRM_FORMAT_ABGR4444, .depth = 0, .num_planes = 1, .cpp = { 2, 0, 0 }, .hsub = 1, .vsub = 1, .has_alpha = true },
169
+ { .format = DRM_FORMAT_RGBA4444, .depth = 0, .num_planes = 1, .cpp = { 2, 0, 0 }, .hsub = 1, .vsub = 1, .has_alpha = true },
170
+ { .format = DRM_FORMAT_BGRA4444, .depth = 0, .num_planes = 1, .cpp = { 2, 0, 0 }, .hsub = 1, .vsub = 1, .has_alpha = true },
171
+ { .format = DRM_FORMAT_XRGB1555, .depth = 15, .num_planes = 1, .cpp = { 2, 0, 0 }, .hsub = 1, .vsub = 1 },
172
+ { .format = DRM_FORMAT_XBGR1555, .depth = 15, .num_planes = 1, .cpp = { 2, 0, 0 }, .hsub = 1, .vsub = 1 },
173
+ { .format = DRM_FORMAT_RGBX5551, .depth = 15, .num_planes = 1, .cpp = { 2, 0, 0 }, .hsub = 1, .vsub = 1 },
174
+ { .format = DRM_FORMAT_BGRX5551, .depth = 15, .num_planes = 1, .cpp = { 2, 0, 0 }, .hsub = 1, .vsub = 1 },
175
+ { .format = DRM_FORMAT_ARGB1555, .depth = 15, .num_planes = 1, .cpp = { 2, 0, 0 }, .hsub = 1, .vsub = 1, .has_alpha = true },
176
+ { .format = DRM_FORMAT_ABGR1555, .depth = 15, .num_planes = 1, .cpp = { 2, 0, 0 }, .hsub = 1, .vsub = 1, .has_alpha = true },
177
+ { .format = DRM_FORMAT_RGBA5551, .depth = 15, .num_planes = 1, .cpp = { 2, 0, 0 }, .hsub = 1, .vsub = 1, .has_alpha = true },
178
+ { .format = DRM_FORMAT_BGRA5551, .depth = 15, .num_planes = 1, .cpp = { 2, 0, 0 }, .hsub = 1, .vsub = 1, .has_alpha = true },
179
+ { .format = DRM_FORMAT_RGB565, .depth = 16, .num_planes = 1, .cpp = { 2, 0, 0 }, .hsub = 1, .vsub = 1 },
180
+ { .format = DRM_FORMAT_BGR565, .depth = 16, .num_planes = 1, .cpp = { 2, 0, 0 }, .hsub = 1, .vsub = 1 },
181
+#ifdef __BIG_ENDIAN
182
+ { .format = DRM_FORMAT_XRGB1555 | DRM_FORMAT_BIG_ENDIAN, .depth = 15, .num_planes = 1, .cpp = { 2, 0, 0 }, .hsub = 1, .vsub = 1 },
183
+ { .format = DRM_FORMAT_RGB565 | DRM_FORMAT_BIG_ENDIAN, .depth = 16, .num_planes = 1, .cpp = { 2, 0, 0 }, .hsub = 1, .vsub = 1 },
184
+#endif
185
+ { .format = DRM_FORMAT_RGB888, .depth = 24, .num_planes = 1, .cpp = { 3, 0, 0 }, .hsub = 1, .vsub = 1 },
186
+ { .format = DRM_FORMAT_BGR888, .depth = 24, .num_planes = 1, .cpp = { 3, 0, 0 }, .hsub = 1, .vsub = 1 },
187
+ { .format = DRM_FORMAT_XRGB8888, .depth = 24, .num_planes = 1, .cpp = { 4, 0, 0 }, .hsub = 1, .vsub = 1 },
188
+ { .format = DRM_FORMAT_XBGR8888, .depth = 24, .num_planes = 1, .cpp = { 4, 0, 0 }, .hsub = 1, .vsub = 1 },
189
+ { .format = DRM_FORMAT_RGBX8888, .depth = 24, .num_planes = 1, .cpp = { 4, 0, 0 }, .hsub = 1, .vsub = 1 },
190
+ { .format = DRM_FORMAT_BGRX8888, .depth = 24, .num_planes = 1, .cpp = { 4, 0, 0 }, .hsub = 1, .vsub = 1 },
191
+ { .format = DRM_FORMAT_RGB565_A8, .depth = 24, .num_planes = 2, .cpp = { 2, 1, 0 }, .hsub = 1, .vsub = 1, .has_alpha = true },
192
+ { .format = DRM_FORMAT_BGR565_A8, .depth = 24, .num_planes = 2, .cpp = { 2, 1, 0 }, .hsub = 1, .vsub = 1, .has_alpha = true },
193
+ { .format = DRM_FORMAT_XRGB2101010, .depth = 30, .num_planes = 1, .cpp = { 4, 0, 0 }, .hsub = 1, .vsub = 1 },
194
+ { .format = DRM_FORMAT_XBGR2101010, .depth = 30, .num_planes = 1, .cpp = { 4, 0, 0 }, .hsub = 1, .vsub = 1 },
195
+ { .format = DRM_FORMAT_RGBX1010102, .depth = 30, .num_planes = 1, .cpp = { 4, 0, 0 }, .hsub = 1, .vsub = 1 },
196
+ { .format = DRM_FORMAT_BGRX1010102, .depth = 30, .num_planes = 1, .cpp = { 4, 0, 0 }, .hsub = 1, .vsub = 1 },
197
+ { .format = DRM_FORMAT_ARGB2101010, .depth = 30, .num_planes = 1, .cpp = { 4, 0, 0 }, .hsub = 1, .vsub = 1, .has_alpha = true },
198
+ { .format = DRM_FORMAT_ABGR2101010, .depth = 30, .num_planes = 1, .cpp = { 4, 0, 0 }, .hsub = 1, .vsub = 1, .has_alpha = true },
199
+ { .format = DRM_FORMAT_RGBA1010102, .depth = 30, .num_planes = 1, .cpp = { 4, 0, 0 }, .hsub = 1, .vsub = 1, .has_alpha = true },
200
+ { .format = DRM_FORMAT_BGRA1010102, .depth = 30, .num_planes = 1, .cpp = { 4, 0, 0 }, .hsub = 1, .vsub = 1, .has_alpha = true },
201
+ { .format = DRM_FORMAT_ARGB8888, .depth = 32, .num_planes = 1, .cpp = { 4, 0, 0 }, .hsub = 1, .vsub = 1, .has_alpha = true },
202
+ { .format = DRM_FORMAT_ABGR8888, .depth = 32, .num_planes = 1, .cpp = { 4, 0, 0 }, .hsub = 1, .vsub = 1, .has_alpha = true },
203
+ { .format = DRM_FORMAT_RGBA8888, .depth = 32, .num_planes = 1, .cpp = { 4, 0, 0 }, .hsub = 1, .vsub = 1, .has_alpha = true },
204
+ { .format = DRM_FORMAT_BGRA8888, .depth = 32, .num_planes = 1, .cpp = { 4, 0, 0 }, .hsub = 1, .vsub = 1, .has_alpha = true },
205
+ { .format = DRM_FORMAT_XRGB16161616F, .depth = 0, .num_planes = 1, .cpp = { 8, 0, 0 }, .hsub = 1, .vsub = 1 },
206
+ { .format = DRM_FORMAT_XBGR16161616F, .depth = 0, .num_planes = 1, .cpp = { 8, 0, 0 }, .hsub = 1, .vsub = 1 },
207
+ { .format = DRM_FORMAT_ARGB16161616F, .depth = 0, .num_planes = 1, .cpp = { 8, 0, 0 }, .hsub = 1, .vsub = 1, .has_alpha = true },
208
+ { .format = DRM_FORMAT_ABGR16161616F, .depth = 0, .num_planes = 1, .cpp = { 8, 0, 0 }, .hsub = 1, .vsub = 1, .has_alpha = true },
209
+ { .format = DRM_FORMAT_RGB888_A8, .depth = 32, .num_planes = 2, .cpp = { 3, 1, 0 }, .hsub = 1, .vsub = 1, .has_alpha = true },
210
+ { .format = DRM_FORMAT_BGR888_A8, .depth = 32, .num_planes = 2, .cpp = { 3, 1, 0 }, .hsub = 1, .vsub = 1, .has_alpha = true },
211
+ { .format = DRM_FORMAT_XRGB8888_A8, .depth = 32, .num_planes = 2, .cpp = { 4, 1, 0 }, .hsub = 1, .vsub = 1, .has_alpha = true },
212
+ { .format = DRM_FORMAT_XBGR8888_A8, .depth = 32, .num_planes = 2, .cpp = { 4, 1, 0 }, .hsub = 1, .vsub = 1, .has_alpha = true },
213
+ { .format = DRM_FORMAT_RGBX8888_A8, .depth = 32, .num_planes = 2, .cpp = { 4, 1, 0 }, .hsub = 1, .vsub = 1, .has_alpha = true },
214
+ { .format = DRM_FORMAT_BGRX8888_A8, .depth = 32, .num_planes = 2, .cpp = { 4, 1, 0 }, .hsub = 1, .vsub = 1, .has_alpha = true },
215
+ { .format = DRM_FORMAT_YUV410, .depth = 0, .num_planes = 3, .cpp = { 1, 1, 1 }, .hsub = 4, .vsub = 4, .is_yuv = true },
216
+ { .format = DRM_FORMAT_YVU410, .depth = 0, .num_planes = 3, .cpp = { 1, 1, 1 }, .hsub = 4, .vsub = 4, .is_yuv = true },
217
+ { .format = DRM_FORMAT_YUV411, .depth = 0, .num_planes = 3, .cpp = { 1, 1, 1 }, .hsub = 4, .vsub = 1, .is_yuv = true },
218
+ { .format = DRM_FORMAT_YVU411, .depth = 0, .num_planes = 3, .cpp = { 1, 1, 1 }, .hsub = 4, .vsub = 1, .is_yuv = true },
219
+ { .format = DRM_FORMAT_YUV420, .depth = 0, .num_planes = 3, .cpp = { 1, 1, 1 }, .hsub = 2, .vsub = 2, .is_yuv = true },
220
+ { .format = DRM_FORMAT_YVU420, .depth = 0, .num_planes = 3, .cpp = { 1, 1, 1 }, .hsub = 2, .vsub = 2, .is_yuv = true },
221
+ { .format = DRM_FORMAT_YUV422, .depth = 0, .num_planes = 3, .cpp = { 1, 1, 1 }, .hsub = 2, .vsub = 1, .is_yuv = true },
222
+ { .format = DRM_FORMAT_YVU422, .depth = 0, .num_planes = 3, .cpp = { 1, 1, 1 }, .hsub = 2, .vsub = 1, .is_yuv = true },
223
+ { .format = DRM_FORMAT_YUV444, .depth = 0, .num_planes = 3, .cpp = { 1, 1, 1 }, .hsub = 1, .vsub = 1, .is_yuv = true },
224
+ { .format = DRM_FORMAT_YVU444, .depth = 0, .num_planes = 3, .cpp = { 1, 1, 1 }, .hsub = 1, .vsub = 1, .is_yuv = true },
225
+ { .format = DRM_FORMAT_NV12, .depth = 0, .num_planes = 2, .cpp = { 1, 2, 0 }, .hsub = 2, .vsub = 2, .is_yuv = true },
226
+ { .format = DRM_FORMAT_NV21, .depth = 0, .num_planes = 2, .cpp = { 1, 2, 0 }, .hsub = 2, .vsub = 2, .is_yuv = true },
227
+ { .format = DRM_FORMAT_NV16, .depth = 0, .num_planes = 2, .cpp = { 1, 2, 0 }, .hsub = 2, .vsub = 1, .is_yuv = true },
228
+ { .format = DRM_FORMAT_NV61, .depth = 0, .num_planes = 2, .cpp = { 1, 2, 0 }, .hsub = 2, .vsub = 1, .is_yuv = true },
229
+ { .format = DRM_FORMAT_NV24, .depth = 0, .num_planes = 2, .cpp = { 1, 2, 0 }, .hsub = 1, .vsub = 1, .is_yuv = true },
230
+ { .format = DRM_FORMAT_NV42, .depth = 0, .num_planes = 2, .cpp = { 1, 2, 0 }, .hsub = 1, .vsub = 1, .is_yuv = true },
231
+ { .format = DRM_FORMAT_YUYV, .depth = 0, .num_planes = 1, .cpp = { 2, 0, 0 }, .hsub = 2, .vsub = 1, .is_yuv = true },
232
+ { .format = DRM_FORMAT_YVYU, .depth = 0, .num_planes = 1, .cpp = { 2, 0, 0 }, .hsub = 2, .vsub = 1, .is_yuv = true },
233
+ { .format = DRM_FORMAT_UYVY, .depth = 0, .num_planes = 1, .cpp = { 2, 0, 0 }, .hsub = 2, .vsub = 1, .is_yuv = true },
234
+ { .format = DRM_FORMAT_VYUY, .depth = 0, .num_planes = 1, .cpp = { 2, 0, 0 }, .hsub = 2, .vsub = 1, .is_yuv = true },
235
+ { .format = DRM_FORMAT_XYUV8888, .depth = 0, .num_planes = 1, .cpp = { 4, 0, 0 }, .hsub = 1, .vsub = 1, .is_yuv = true },
236
+ { .format = DRM_FORMAT_VUY888, .depth = 0, .num_planes = 1, .cpp = { 3, 0, 0 }, .hsub = 1, .vsub = 1, .is_yuv = true },
237
+ { .format = DRM_FORMAT_AYUV, .depth = 0, .num_planes = 1, .cpp = { 4, 0, 0 }, .hsub = 1, .vsub = 1, .has_alpha = true, .is_yuv = true },
238
+ { .format = DRM_FORMAT_Y210, .depth = 0, .num_planes = 1, .cpp = { 4, 0, 0 }, .hsub = 2, .vsub = 1, .is_yuv = true },
239
+ { .format = DRM_FORMAT_Y212, .depth = 0, .num_planes = 1, .cpp = { 4, 0, 0 }, .hsub = 2, .vsub = 1, .is_yuv = true },
240
+ { .format = DRM_FORMAT_Y216, .depth = 0, .num_planes = 1, .cpp = { 4, 0, 0 }, .hsub = 2, .vsub = 1, .is_yuv = true },
241
+ { .format = DRM_FORMAT_Y410, .depth = 0, .num_planes = 1, .cpp = { 4, 0, 0 }, .hsub = 1, .vsub = 1, .has_alpha = true, .is_yuv = true },
242
+ { .format = DRM_FORMAT_Y412, .depth = 0, .num_planes = 1, .cpp = { 8, 0, 0 }, .hsub = 1, .vsub = 1, .has_alpha = true, .is_yuv = true },
243
+ { .format = DRM_FORMAT_Y416, .depth = 0, .num_planes = 1, .cpp = { 8, 0, 0 }, .hsub = 1, .vsub = 1, .has_alpha = true, .is_yuv = true },
244
+ { .format = DRM_FORMAT_XVYU2101010, .depth = 0, .num_planes = 1, .cpp = { 4, 0, 0 }, .hsub = 1, .vsub = 1, .is_yuv = true },
245
+ { .format = DRM_FORMAT_XVYU12_16161616, .depth = 0, .num_planes = 1, .cpp = { 8, 0, 0 }, .hsub = 1, .vsub = 1, .is_yuv = true },
246
+ { .format = DRM_FORMAT_XVYU16161616, .depth = 0, .num_planes = 1, .cpp = { 8, 0, 0 }, .hsub = 1, .vsub = 1, .is_yuv = true },
247
+ { .format = DRM_FORMAT_Y0L0, .depth = 0, .num_planes = 1,
248
+ .char_per_block = { 8, 0, 0 }, .block_w = { 2, 0, 0 }, .block_h = { 2, 0, 0 },
249
+ .hsub = 2, .vsub = 2, .has_alpha = true, .is_yuv = true },
250
+ { .format = DRM_FORMAT_X0L0, .depth = 0, .num_planes = 1,
251
+ .char_per_block = { 8, 0, 0 }, .block_w = { 2, 0, 0 }, .block_h = { 2, 0, 0 },
252
+ .hsub = 2, .vsub = 2, .is_yuv = true },
253
+ { .format = DRM_FORMAT_Y0L2, .depth = 0, .num_planes = 1,
254
+ .char_per_block = { 8, 0, 0 }, .block_w = { 2, 0, 0 }, .block_h = { 2, 0, 0 },
255
+ .hsub = 2, .vsub = 2, .has_alpha = true, .is_yuv = true },
256
+ { .format = DRM_FORMAT_X0L2, .depth = 0, .num_planes = 1,
257
+ .char_per_block = { 8, 0, 0 }, .block_w = { 2, 0, 0 }, .block_h = { 2, 0, 0 },
258
+ .hsub = 2, .vsub = 2, .is_yuv = true },
259
+ { .format = DRM_FORMAT_P010, .depth = 0, .num_planes = 2,
260
+ .char_per_block = { 2, 4, 0 }, .block_w = { 1, 1, 0 }, .block_h = { 1, 1, 0 },
261
+ .hsub = 2, .vsub = 2, .is_yuv = true},
262
+ { .format = DRM_FORMAT_P012, .depth = 0, .num_planes = 2,
263
+ .char_per_block = { 2, 4, 0 }, .block_w = { 1, 1, 0 }, .block_h = { 1, 1, 0 },
264
+ .hsub = 2, .vsub = 2, .is_yuv = true},
265
+ { .format = DRM_FORMAT_P016, .depth = 0, .num_planes = 2,
266
+ .char_per_block = { 2, 4, 0 }, .block_w = { 1, 1, 0 }, .block_h = { 1, 1, 0 },
267
+ .hsub = 2, .vsub = 2, .is_yuv = true},
268
+ { .format = DRM_FORMAT_P210, .depth = 0,
269
+ .num_planes = 2, .char_per_block = { 2, 4, 0 },
270
+ .block_w = { 1, 1, 0 }, .block_h = { 1, 1, 0 }, .hsub = 2,
271
+ .vsub = 1, .is_yuv = true },
272
+ { .format = DRM_FORMAT_VUY101010, .depth = 0,
273
+ .num_planes = 1, .cpp = { 0, 0, 0 }, .hsub = 1, .vsub = 1,
274
+ .is_yuv = true },
275
+ { .format = DRM_FORMAT_YUV420_8BIT, .depth = 0,
276
+ .num_planes = 1, .cpp = { 0, 0, 0 }, .hsub = 2, .vsub = 2,
277
+ .is_yuv = true },
278
+ { .format = DRM_FORMAT_YUV420_10BIT, .depth = 0,
279
+ .num_planes = 1, .cpp = { 0, 0, 0 }, .hsub = 2, .vsub = 2,
280
+ .is_yuv = true },
281
+ { .format = DRM_FORMAT_NV15, .depth = 0,
282
+ .num_planes = 2, .char_per_block = { 5, 5, 0 },
283
+ .block_w = { 4, 2, 0 }, .block_h = { 1, 1, 0 }, .hsub = 2,
284
+ .vsub = 2, .is_yuv = true },
285
+#ifdef CONFIG_NO_GKI
286
+ { .format = DRM_FORMAT_NV20, .depth = 0,
287
+ .num_planes = 2, .char_per_block = { 5, 5, 0 },
288
+ .block_w = { 4, 2, 0 }, .block_h = { 1, 1, 0 }, .hsub = 2,
289
+ .vsub = 1, .is_yuv = true },
290
+ { .format = DRM_FORMAT_NV30, .depth = 0,
291
+ .num_planes = 2, .char_per_block = { 5, 5, 0 },
292
+ .block_w = { 4, 2, 0 }, .block_h = { 1, 1, 0 }, .hsub = 1,
293
+ .vsub = 1, .is_yuv = true },
294
+#endif
295
+ { .format = DRM_FORMAT_Q410, .depth = 0,
296
+ .num_planes = 3, .char_per_block = { 2, 2, 2 },
297
+ .block_w = { 1, 1, 1 }, .block_h = { 1, 1, 1 }, .hsub = 1,
298
+ .vsub = 1, .is_yuv = true },
299
+ { .format = DRM_FORMAT_Q401, .depth = 0,
300
+ .num_planes = 3, .char_per_block = { 2, 2, 2 },
301
+ .block_w = { 1, 1, 1 }, .block_h = { 1, 1, 1 }, .hsub = 1,
302
+ .vsub = 1, .is_yuv = true },
303
+ { .format = DRM_FORMAT_P030, .depth = 0, .num_planes = 2,
304
+ .char_per_block = { 4, 8, 0 }, .block_w = { 3, 3, 0 }, .block_h = { 1, 1, 0 },
305
+ .hsub = 2, .vsub = 2, .is_yuv = true},
182306 };
183307
184308 unsigned int i;
....@@ -238,119 +362,63 @@
238362 EXPORT_SYMBOL(drm_get_format_info);
239363
240364 /**
241
- * drm_format_num_planes - get the number of planes for format
242
- * @format: pixel format (DRM_FORMAT_*)
243
- *
244
- * Returns:
245
- * The number of planes used by the specified pixel format.
246
- */
247
-int drm_format_num_planes(uint32_t format)
248
-{
249
- const struct drm_format_info *info;
250
-
251
- info = drm_format_info(format);
252
- return info ? info->num_planes : 1;
253
-}
254
-EXPORT_SYMBOL(drm_format_num_planes);
255
-
256
-/**
257
- * drm_format_plane_cpp - determine the bytes per pixel value
258
- * @format: pixel format (DRM_FORMAT_*)
365
+ * drm_format_info_block_width - width in pixels of block.
366
+ * @info: pixel format info
259367 * @plane: plane index
260368 *
261369 * Returns:
262
- * The bytes per pixel value for the specified plane.
370
+ * The width in pixels of a block, depending on the plane index.
263371 */
264
-int drm_format_plane_cpp(uint32_t format, int plane)
372
+unsigned int drm_format_info_block_width(const struct drm_format_info *info,
373
+ int plane)
265374 {
266
- const struct drm_format_info *info;
267
-
268
- info = drm_format_info(format);
269
- if (!info || plane >= info->num_planes)
375
+ if (!info || plane < 0 || plane >= info->num_planes)
270376 return 0;
271377
272
- return info->bpp[plane] >> 3;
378
+ if (!info->block_w[plane])
379
+ return 1;
380
+ return info->block_w[plane];
273381 }
274
-EXPORT_SYMBOL(drm_format_plane_cpp);
382
+EXPORT_SYMBOL(drm_format_info_block_width);
275383
276384 /**
277
- * drm_format_horz_chroma_subsampling - get the horizontal chroma subsampling factor
278
- * @format: pixel format (DRM_FORMAT_*)
279
- *
280
- * Returns:
281
- * The horizontal chroma subsampling factor for the
282
- * specified pixel format.
283
- */
284
-int drm_format_horz_chroma_subsampling(uint32_t format)
285
-{
286
- const struct drm_format_info *info;
287
-
288
- info = drm_format_info(format);
289
- return info ? info->hsub : 1;
290
-}
291
-EXPORT_SYMBOL(drm_format_horz_chroma_subsampling);
292
-
293
-/**
294
- * drm_format_vert_chroma_subsampling - get the vertical chroma subsampling factor
295
- * @format: pixel format (DRM_FORMAT_*)
296
- *
297
- * Returns:
298
- * The vertical chroma subsampling factor for the
299
- * specified pixel format.
300
- */
301
-int drm_format_vert_chroma_subsampling(uint32_t format)
302
-{
303
- const struct drm_format_info *info;
304
-
305
- info = drm_format_info(format);
306
- return info ? info->vsub : 1;
307
-}
308
-EXPORT_SYMBOL(drm_format_vert_chroma_subsampling);
309
-
310
-/**
311
- * drm_format_plane_width - width of the plane given the first plane
312
- * @width: width of the first plane
313
- * @format: pixel format
385
+ * drm_format_info_block_height - height in pixels of a block
386
+ * @info: pixel format info
314387 * @plane: plane index
315388 *
316389 * Returns:
317
- * The width of @plane, given that the width of the first plane is @width.
390
+ * The height in pixels of a block, depending on the plane index.
318391 */
319
-int drm_format_plane_width(int width, uint32_t format, int plane)
392
+unsigned int drm_format_info_block_height(const struct drm_format_info *info,
393
+ int plane)
320394 {
321
- const struct drm_format_info *info;
322
-
323
- info = drm_format_info(format);
324
- if (!info || plane >= info->num_planes)
395
+ if (!info || plane < 0 || plane >= info->num_planes)
325396 return 0;
326397
327
- if (plane == 0)
328
- return width;
329
-
330
- return width / info->hsub;
398
+ if (!info->block_h[plane])
399
+ return 1;
400
+ return info->block_h[plane];
331401 }
332
-EXPORT_SYMBOL(drm_format_plane_width);
402
+EXPORT_SYMBOL(drm_format_info_block_height);
333403
334404 /**
335
- * drm_format_plane_height - height of the plane given the first plane
336
- * @height: height of the first plane
337
- * @format: pixel format
405
+ * drm_format_info_min_pitch - computes the minimum required pitch in bytes
406
+ * @info: pixel format info
338407 * @plane: plane index
408
+ * @buffer_width: buffer width in pixels
339409 *
340410 * Returns:
341
- * The height of @plane, given that the height of the first plane is @height.
411
+ * The minimum required pitch in bytes for a buffer by taking into consideration
412
+ * the pixel format information and the buffer width.
342413 */
343
-int drm_format_plane_height(int height, uint32_t format, int plane)
414
+uint64_t drm_format_info_min_pitch(const struct drm_format_info *info,
415
+ int plane, unsigned int buffer_width)
344416 {
345
- const struct drm_format_info *info;
346
-
347
- info = drm_format_info(format);
348
- if (!info || plane >= info->num_planes)
417
+ if (!info || plane < 0 || plane >= info->num_planes)
349418 return 0;
350419
351
- if (plane == 0)
352
- return height;
353
-
354
- return height / info->vsub;
420
+ return DIV_ROUND_UP_ULL((u64)buffer_width * info->char_per_block[plane],
421
+ drm_format_info_block_width(info, plane) *
422
+ drm_format_info_block_height(info, plane));
355423 }
356
-EXPORT_SYMBOL(drm_format_plane_height);
424
+EXPORT_SYMBOL(drm_format_info_min_pitch);