xref: /linux/drivers/gpu/drm/msm/disp/mdp_format.c (revision ca220141fa8ebae09765a242076b2b77338106b0)
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * Copyright (c) 2014 The Linux Foundation. All rights reserved.
4  * Copyright (C) 2013 Red Hat
5  * Author: Rob Clark <robdclark@gmail.com>
6  */
7 
8 #include <drm/drm_fourcc.h>
9 #include <drm/drm_framebuffer.h>
10 
11 #include "msm_drv.h"
12 #include "mdp_kms.h"
13 
14 static struct csc_cfg csc_convert[CSC_MAX] = {
15 	[CSC_RGB2RGB] = {
16 		.type = CSC_RGB2RGB,
17 		.matrix = {
18 			0x0200, 0x0000, 0x0000,
19 			0x0000, 0x0200, 0x0000,
20 			0x0000, 0x0000, 0x0200
21 		},
22 		.pre_bias =	{ 0x0, 0x0, 0x0 },
23 		.post_bias =	{ 0x0, 0x0, 0x0 },
24 		.pre_clamp =	{ 0x0, 0xff, 0x0, 0xff, 0x0, 0xff },
25 		.post_clamp =	{ 0x0, 0xff, 0x0, 0xff, 0x0, 0xff },
26 	},
27 	[CSC_YUV2RGB] = {
28 		.type = CSC_YUV2RGB,
29 		.matrix = {
30 			0x0254, 0x0000, 0x0331,
31 			0x0254, 0xff37, 0xfe60,
32 			0x0254, 0x0409, 0x0000
33 		},
34 		.pre_bias =	{ 0xfff0, 0xff80, 0xff80 },
35 		.post_bias =	{ 0x00, 0x00, 0x00 },
36 		.pre_clamp =	{ 0x00, 0xff, 0x00, 0xff, 0x00, 0xff },
37 		.post_clamp =	{ 0x00, 0xff, 0x00, 0xff, 0x00, 0xff },
38 	},
39 	[CSC_RGB2YUV] = {
40 		.type = CSC_RGB2YUV,
41 		.matrix = {
42 			0x0083, 0x0102, 0x0032,
43 			0x1fb5, 0x1f6c, 0x00e1,
44 			0x00e1, 0x1f45, 0x1fdc
45 		},
46 		.pre_bias =	{ 0x00, 0x00, 0x00 },
47 		.post_bias =	{ 0x10, 0x80, 0x80 },
48 		.pre_clamp =	{ 0x00, 0xff, 0x00, 0xff, 0x00, 0xff },
49 		.post_clamp =	{ 0x10, 0xeb, 0x10, 0xf0, 0x10, 0xf0 },
50 	},
51 	[CSC_YUV2YUV] = {
52 		.type = CSC_YUV2YUV,
53 		.matrix = {
54 			0x0200, 0x0000, 0x0000,
55 			0x0000, 0x0200, 0x0000,
56 			0x0000, 0x0000, 0x0200
57 		},
58 		.pre_bias =	{ 0x00, 0x00, 0x00 },
59 		.post_bias =	{ 0x00, 0x00, 0x00 },
60 		.pre_clamp =	{ 0x00, 0xff, 0x00, 0xff, 0x00, 0xff },
61 		.post_clamp =	{ 0x00, 0xff, 0x00, 0xff, 0x00, 0xff },
62 	},
63 };
64 
65 #define MDP_TILE_HEIGHT_DEFAULT	1
66 #define MDP_TILE_HEIGHT_UBWC	4
67 #define MDP_TILE_HEIGHT_NV12	8
68 
69 #define INTERLEAVED_RGB_FMT(fmt, bp, r, g, b, e0, e1, e2)                 \
70 {                                                                         \
71 	.pixel_format = DRM_FORMAT_ ## fmt,                               \
72 	.fetch_type = MDP_PLANE_INTERLEAVED,                              \
73 	.alpha_enable = false,                                            \
74 	.element = { (e0), (e1), (e2), 0 },                               \
75 	.bpc_g_y = g,                                                     \
76 	.bpc_b_cb = b,                                                    \
77 	.bpc_r_cr = r,                                                    \
78 	.bpc_a = 0,                                                       \
79 	.chroma_sample = CHROMA_FULL,                                     \
80 	.unpack_count = 3,                                                \
81 	.bpp = bp,                                                        \
82 	.fetch_mode = MDP_FETCH_LINEAR,                                   \
83 	.flags = MSM_FORMAT_FLAG_UNPACK_TIGHT,                            \
84 	.num_planes = 1,                                                  \
85 	.tile_height = MDP_TILE_HEIGHT_DEFAULT                            \
86 }
87 
88 #define INTERLEAVED_RGBA_FMT(fmt, bp, a, r, g, b, e0, e1, e2, e3)         \
89 {                                                                         \
90 	.pixel_format = DRM_FORMAT_ ## fmt,                               \
91 	.fetch_type = MDP_PLANE_INTERLEAVED,                              \
92 	.alpha_enable = true,                                             \
93 	.element = { (e0), (e1), (e2), (e3) },                            \
94 	.bpc_g_y = g,                                                     \
95 	.bpc_b_cb = b,                                                    \
96 	.bpc_r_cr = r,                                                    \
97 	.bpc_a = a,                                                       \
98 	.chroma_sample = CHROMA_FULL,                                     \
99 	.unpack_count = 4,                                                \
100 	.bpp = bp,                                                        \
101 	.fetch_mode = MDP_FETCH_LINEAR,                                   \
102 	.flags = MSM_FORMAT_FLAG_UNPACK_TIGHT,                            \
103 	.num_planes = 1,                                                  \
104 	.tile_height = MDP_TILE_HEIGHT_DEFAULT                            \
105 }
106 
107 #define INTERLEAVED_RGBX_FMT(fmt, bp, a, r, g, b, e0, e1, e2, e3)         \
108 {                                                                         \
109 	.pixel_format = DRM_FORMAT_ ## fmt,                               \
110 	.fetch_type = MDP_PLANE_INTERLEAVED,                              \
111 	.alpha_enable = false,                                            \
112 	.element = { (e0), (e1), (e2), (e3) },                            \
113 	.bpc_g_y = g,                                                     \
114 	.bpc_b_cb = b,                                                    \
115 	.bpc_r_cr = r,                                                    \
116 	.bpc_a = a,                                                       \
117 	.chroma_sample = CHROMA_FULL,                                     \
118 	.unpack_count = 4,                                                \
119 	.bpp = bp,                                                        \
120 	.fetch_mode = MDP_FETCH_LINEAR,                                   \
121 	.flags = MSM_FORMAT_FLAG_UNPACK_TIGHT,                            \
122 	.num_planes = 1,                                                  \
123 	.tile_height = MDP_TILE_HEIGHT_DEFAULT                            \
124 }
125 
126 #define INTERLEAVED_RGBA_DX_FMT(fmt, bp, a, r, g, b, e0, e1, e2, e3)      \
127 {                                                                         \
128 	.pixel_format = DRM_FORMAT_ ## fmt,                               \
129 	.fetch_type = MDP_PLANE_INTERLEAVED,                              \
130 	.alpha_enable = true,                                             \
131 	.element = { (e0), (e1), (e2), (e3) },                            \
132 	.bpc_g_y = g,                                                     \
133 	.bpc_b_cb = b,                                                    \
134 	.bpc_r_cr = r,                                                    \
135 	.bpc_a = a,                                                       \
136 	.chroma_sample = CHROMA_FULL,                                     \
137 	.unpack_count = 4,                                                \
138 	.bpp = bp,                                                        \
139 	.fetch_mode = MDP_FETCH_LINEAR,                                   \
140 	.flags = MSM_FORMAT_FLAG_UNPACK_TIGHT |                           \
141 		 MSM_FORMAT_FLAG_DX,                                      \
142 	.num_planes = 1,                                                  \
143 	.tile_height = MDP_TILE_HEIGHT_DEFAULT                            \
144 }
145 
146 #define INTERLEAVED_RGBX_DX_FMT(fmt, bp, a, r, g, b, e0, e1, e2, e3)      \
147 {                                                                         \
148 	.pixel_format = DRM_FORMAT_ ## fmt,                               \
149 	.fetch_type = MDP_PLANE_INTERLEAVED,                              \
150 	.alpha_enable = false,                                            \
151 	.element = { (e0), (e1), (e2), (e3) },                            \
152 	.bpc_g_y = g,                                                     \
153 	.bpc_b_cb = b,                                                    \
154 	.bpc_r_cr = r,                                                    \
155 	.bpc_a = a,                                                       \
156 	.chroma_sample = CHROMA_FULL,                                     \
157 	.unpack_count = 4,                                                \
158 	.bpp = bp,                                                        \
159 	.fetch_mode = MDP_FETCH_LINEAR,                                   \
160 	.flags = MSM_FORMAT_FLAG_UNPACK_TIGHT |                           \
161 		 MSM_FORMAT_FLAG_DX,                                      \
162 	.num_planes = 1,                                                  \
163 	.tile_height = MDP_TILE_HEIGHT_DEFAULT                            \
164 }
165 
166 #define INTERLEAVED_RGB_FMT_TILED(fmt, bp, r, g, b, e0, e1, e2)           \
167 {                                                                         \
168 	.pixel_format = DRM_FORMAT_ ## fmt,                               \
169 	.fetch_type = MDP_PLANE_INTERLEAVED,                              \
170 	.alpha_enable = false,                                            \
171 	.element = { (e0), (e1), (e2), 0 },                               \
172 	.bpc_g_y = g,                                                     \
173 	.bpc_b_cb = b,                                                    \
174 	.bpc_r_cr = r,                                                    \
175 	.bpc_a = 0,                                                       \
176 	.chroma_sample = CHROMA_FULL,                                     \
177 	.unpack_count = 3,                                                \
178 	.bpp = bp,                                                        \
179 	.fetch_mode = MDP_FETCH_UBWC,                                     \
180 	.flags = MSM_FORMAT_FLAG_UNPACK_TIGHT |                           \
181 		 MSM_FORMAT_FLAG_COMPRESSED,                              \
182 	.num_planes = 2,                                                  \
183 	.tile_height = MDP_TILE_HEIGHT_UBWC,                              \
184 }
185 
186 #define INTERLEAVED_RGBA_FMT_TILED(fmt, bp, a, r, g, b, e0, e1, e2, e3)   \
187 {                                                                         \
188 	.pixel_format = DRM_FORMAT_ ## fmt,                               \
189 	.fetch_type = MDP_PLANE_INTERLEAVED,                              \
190 	.alpha_enable = true,                                             \
191 	.element = { (e0), (e1), (e2), (e3) },                            \
192 	.bpc_g_y = g,                                                     \
193 	.bpc_b_cb = b,                                                    \
194 	.bpc_r_cr = r,                                                    \
195 	.bpc_a = a,                                                       \
196 	.chroma_sample = CHROMA_FULL,                                     \
197 	.unpack_count = 4,                                                \
198 	.bpp = bp,                                                        \
199 	.fetch_mode = MDP_FETCH_UBWC,                                     \
200 	.flags = MSM_FORMAT_FLAG_UNPACK_TIGHT |                           \
201 		 MSM_FORMAT_FLAG_COMPRESSED,                              \
202 	.num_planes = 2,                                                  \
203 	.tile_height = MDP_TILE_HEIGHT_UBWC,                              \
204 }
205 
206 #define INTERLEAVED_RGBX_FMT_TILED(fmt, bp, a, r, g, b, e0, e1, e2, e3)   \
207 {                                                                         \
208 	.pixel_format = DRM_FORMAT_ ## fmt,                               \
209 	.fetch_type = MDP_PLANE_INTERLEAVED,                              \
210 	.alpha_enable = false,                                            \
211 	.element = { (e0), (e1), (e2), (e3) },                            \
212 	.bpc_g_y = g,                                                     \
213 	.bpc_b_cb = b,                                                    \
214 	.bpc_r_cr = r,                                                    \
215 	.bpc_a = a,                                                       \
216 	.chroma_sample = CHROMA_FULL,                                     \
217 	.unpack_count = 4,                                                \
218 	.bpp = bp,                                                        \
219 	.fetch_mode = MDP_FETCH_UBWC,                                     \
220 	.flags = MSM_FORMAT_FLAG_UNPACK_TIGHT |                           \
221 		 MSM_FORMAT_FLAG_COMPRESSED,                              \
222 	.num_planes = 2,                                                  \
223 	.tile_height = MDP_TILE_HEIGHT_UBWC,                              \
224 }
225 
226 #define INTERLEAVED_RGBA_DX_FMT_TILED(fmt, bp, a, r, g, b, e0, e1, e2, e3) \
227 {                                                                         \
228 	.pixel_format = DRM_FORMAT_ ## fmt,                               \
229 	.fetch_type = MDP_PLANE_INTERLEAVED,                              \
230 	.alpha_enable = true,                                             \
231 	.element = { (e0), (e1), (e2), (e3) },                            \
232 	.bpc_g_y = g,                                                     \
233 	.bpc_b_cb = b,                                                    \
234 	.bpc_r_cr = r,                                                    \
235 	.bpc_a = a,                                                       \
236 	.chroma_sample = CHROMA_FULL,                                     \
237 	.unpack_count = 4,                                                \
238 	.bpp = bp,                                                        \
239 	.fetch_mode = MDP_FETCH_UBWC,                                     \
240 	.flags = MSM_FORMAT_FLAG_UNPACK_TIGHT |                           \
241 		 MSM_FORMAT_FLAG_DX |                                     \
242 		 MSM_FORMAT_FLAG_COMPRESSED,                              \
243 	.num_planes = 2,                                                  \
244 	.tile_height = MDP_TILE_HEIGHT_UBWC,                              \
245 }
246 
247 #define INTERLEAVED_YUV_FMT(fmt, bp, r, g, b, e0, e1, e2, e3, chroma)     \
248 {                                                                         \
249 	.pixel_format = DRM_FORMAT_ ## fmt,                               \
250 	.fetch_type = MDP_PLANE_INTERLEAVED,                              \
251 	.alpha_enable = false,                                            \
252 	.element = { (e0), (e1), (e2), (e3)},                             \
253 	.bpc_g_y = g,                                                     \
254 	.bpc_b_cb = b,                                                    \
255 	.bpc_r_cr = r,                                                    \
256 	.bpc_a = 0,                                                       \
257 	.chroma_sample = chroma,                                          \
258 	.unpack_count = 4,                                                \
259 	.bpp = bp,                                                        \
260 	.fetch_mode = MDP_FETCH_LINEAR,                                   \
261 	.flags = MSM_FORMAT_FLAG_UNPACK_TIGHT |                           \
262 		 MSM_FORMAT_FLAG_YUV,                                     \
263 	.num_planes = 1,                                                  \
264 	.tile_height = MDP_TILE_HEIGHT_DEFAULT                            \
265 }
266 
267 #define PSEUDO_YUV_FMT(fmt, r, g, b, e0, e1, chroma)                      \
268 {                                                                         \
269 	.pixel_format = DRM_FORMAT_ ## fmt,                               \
270 	.fetch_type = MDP_PLANE_PSEUDO_PLANAR,                            \
271 	.alpha_enable = 0,                                                \
272 	.element = { (e0), (e1), 0, 0 },                                  \
273 	.bpc_g_y = g,                                                     \
274 	.bpc_b_cb = b,                                                    \
275 	.bpc_r_cr = r,                                                    \
276 	.bpc_a = 0,                                                       \
277 	.chroma_sample = chroma,                                          \
278 	.unpack_count = 2,                                                \
279 	.bpp = 2,                                                         \
280 	.fetch_mode = MDP_FETCH_LINEAR,                                   \
281 	.flags = MSM_FORMAT_FLAG_UNPACK_TIGHT |                           \
282 		 MSM_FORMAT_FLAG_YUV,                                     \
283 	.num_planes = 2,                                                  \
284 	.tile_height = MDP_TILE_HEIGHT_DEFAULT                            \
285 }
286 
287 #define PSEUDO_YUV_FMT_TILED(fmt, r, g, b, e0, e1, chroma, flg, th)       \
288 {                                                                         \
289 	.pixel_format = DRM_FORMAT_ ## fmt,                               \
290 	.fetch_type = MDP_PLANE_PSEUDO_PLANAR,                            \
291 	.alpha_enable = 0,                                                \
292 	.element = { (e0), (e1), 0, 0 },                                  \
293 	.bpc_g_y = g,                                                     \
294 	.bpc_b_cb = b,                                                    \
295 	.bpc_r_cr = r,                                                    \
296 	.bpc_a = 0,                                                       \
297 	.chroma_sample = chroma,                                          \
298 	.unpack_count = 2,                                                \
299 	.bpp = 2,                                                         \
300 	.fetch_mode = MDP_FETCH_UBWC,                                     \
301 	.flags = MSM_FORMAT_FLAG_UNPACK_TIGHT |                           \
302 		 MSM_FORMAT_FLAG_YUV |                                    \
303 		 MSM_FORMAT_FLAG_COMPRESSED | flg,                        \
304 	.num_planes = 4,                                                  \
305 	.tile_height = th                                                 \
306 }
307 
308 #define PSEUDO_YUV_FMT_LOOSE(fmt, r, g, b, e0, e1, chroma)                \
309 {                                                                         \
310 	.pixel_format = DRM_FORMAT_ ## fmt,                               \
311 	.fetch_type = MDP_PLANE_PSEUDO_PLANAR,                            \
312 	.alpha_enable = 0,                                                \
313 	.element = { (e0), (e1), 0, 0 },                                  \
314 	.bpc_g_y = g,                                                     \
315 	.bpc_b_cb = b,                                                    \
316 	.bpc_r_cr = r,                                                    \
317 	.bpc_a = 0,                                                       \
318 	.chroma_sample = chroma,                                          \
319 	.unpack_count = 2,                                                \
320 	.bpp = 2,                                                         \
321 	.fetch_mode = MDP_FETCH_LINEAR,                                   \
322 	.flags = MSM_FORMAT_FLAG_UNPACK_ALIGN_MSB |                       \
323 		 MSM_FORMAT_FLAG_DX |                                     \
324 		 MSM_FORMAT_FLAG_YUV,                                     \
325 	.num_planes = 2,                                                  \
326 	.tile_height = MDP_TILE_HEIGHT_DEFAULT                            \
327 }
328 
329 #define PLANAR_YUV_FMT(fmt, bp, r, g, b, e0, e1, e2, chroma)              \
330 {                                                                         \
331 	.pixel_format = DRM_FORMAT_ ## fmt,                               \
332 	.fetch_type = MDP_PLANE_PLANAR,                                   \
333 	.alpha_enable = false,                                            \
334 	.element = { (e0), (e1), (e2), 0 },                               \
335 	.bpc_g_y = g,                                                     \
336 	.bpc_b_cb = b,                                                    \
337 	.bpc_r_cr = r,                                                    \
338 	.bpc_a = 0,                                                       \
339 	.chroma_sample = chroma,                                          \
340 	.unpack_count = 1,                                                \
341 	.bpp = bp,                                                        \
342 	.fetch_mode = MDP_FETCH_LINEAR,                                   \
343 	.flags = MSM_FORMAT_FLAG_UNPACK_TIGHT |                           \
344 		 MSM_FORMAT_FLAG_YUV,                                     \
345 	.num_planes = 3,                                                  \
346 	.tile_height = MDP_TILE_HEIGHT_DEFAULT                            \
347 }
348 
349 static const struct msm_format mdp_formats[] = {
350 	INTERLEAVED_RGBA_FMT(ARGB8888, 4,
351 		BPC8A, BPC8, BPC8, BPC8,
352 		C1_B_Cb, C0_G_Y, C2_R_Cr, C3_ALPHA),
353 
354 	INTERLEAVED_RGBA_FMT(ABGR8888, 4,
355 		BPC8A, BPC8, BPC8, BPC8,
356 		C2_R_Cr, C0_G_Y, C1_B_Cb, C3_ALPHA),
357 
358 	INTERLEAVED_RGBX_FMT(XBGR8888, 4,
359 		BPC8A, BPC8, BPC8, BPC8,
360 		C2_R_Cr, C0_G_Y, C1_B_Cb, C3_ALPHA),
361 
362 	INTERLEAVED_RGBA_FMT(RGBA8888, 4,
363 		BPC8A, BPC8, BPC8, BPC8,
364 		C3_ALPHA, C1_B_Cb, C0_G_Y, C2_R_Cr),
365 
366 	INTERLEAVED_RGBA_FMT(BGRA8888, 4,
367 		BPC8A, BPC8, BPC8, BPC8,
368 		C3_ALPHA, C2_R_Cr, C0_G_Y, C1_B_Cb),
369 
370 	INTERLEAVED_RGBX_FMT(BGRX8888, 4,
371 		BPC8A, BPC8, BPC8, BPC8,
372 		C3_ALPHA, C2_R_Cr, C0_G_Y, C1_B_Cb),
373 
374 	INTERLEAVED_RGBX_FMT(XRGB8888, 4,
375 		BPC8A, BPC8, BPC8, BPC8,
376 		C1_B_Cb, C0_G_Y, C2_R_Cr, C3_ALPHA),
377 
378 	INTERLEAVED_RGBX_FMT(RGBX8888, 4,
379 		BPC8A, BPC8, BPC8, BPC8,
380 		C3_ALPHA, C1_B_Cb, C0_G_Y, C2_R_Cr),
381 
382 	INTERLEAVED_RGB_FMT(RGB888, 3,
383 		BPC8, BPC8, BPC8,
384 		C1_B_Cb, C0_G_Y, C2_R_Cr),
385 
386 	INTERLEAVED_RGB_FMT(BGR888, 3,
387 		BPC8, BPC8, BPC8,
388 		C2_R_Cr, C0_G_Y, C1_B_Cb),
389 
390 	INTERLEAVED_RGB_FMT(RGB565, 2,
391 		BPC5, BPC6, BPC5,
392 		C1_B_Cb, C0_G_Y, C2_R_Cr),
393 
394 	INTERLEAVED_RGB_FMT(BGR565, 2,
395 		BPC5, BPC6, BPC5,
396 		C2_R_Cr, C0_G_Y, C1_B_Cb),
397 
398 	INTERLEAVED_RGBA_FMT(ARGB1555, 2,
399 		BPC1A, BPC5, BPC5, BPC5,
400 		C1_B_Cb, C0_G_Y, C2_R_Cr, C3_ALPHA),
401 
402 	INTERLEAVED_RGBA_FMT(ABGR1555, 2,
403 		BPC1A, BPC5, BPC5, BPC5,
404 		C2_R_Cr, C0_G_Y, C1_B_Cb, C3_ALPHA),
405 
406 	INTERLEAVED_RGBA_FMT(RGBA5551, 2,
407 		BPC1A, BPC5, BPC5, BPC5,
408 		C3_ALPHA, C1_B_Cb, C0_G_Y, C2_R_Cr),
409 
410 	INTERLEAVED_RGBA_FMT(BGRA5551, 2,
411 		BPC1A, BPC5, BPC5, BPC5,
412 		C3_ALPHA, C2_R_Cr, C0_G_Y, C1_B_Cb),
413 
414 	INTERLEAVED_RGBX_FMT(XRGB1555, 2,
415 		BPC1A, BPC5, BPC5, BPC5,
416 		C1_B_Cb, C0_G_Y, C2_R_Cr, C3_ALPHA),
417 
418 	INTERLEAVED_RGBX_FMT(XBGR1555, 2,
419 		BPC1A, BPC5, BPC5, BPC5,
420 		C2_R_Cr, C0_G_Y, C1_B_Cb, C3_ALPHA),
421 
422 	INTERLEAVED_RGBX_FMT(RGBX5551, 2,
423 		BPC1A, BPC5, BPC5, BPC5,
424 		C3_ALPHA, C1_B_Cb, C0_G_Y, C2_R_Cr),
425 
426 	INTERLEAVED_RGBX_FMT(BGRX5551, 2,
427 		BPC1A, BPC5, BPC5, BPC5,
428 		C3_ALPHA, C2_R_Cr, C0_G_Y, C1_B_Cb),
429 
430 	INTERLEAVED_RGBA_FMT(ARGB4444, 2,
431 		BPC4A, BPC4, BPC4, BPC4,
432 		C1_B_Cb, C0_G_Y, C2_R_Cr, C3_ALPHA),
433 
434 	INTERLEAVED_RGBA_FMT(ABGR4444, 2,
435 		BPC4A, BPC4, BPC4, BPC4,
436 		C2_R_Cr, C0_G_Y, C1_B_Cb, C3_ALPHA),
437 
438 	INTERLEAVED_RGBA_FMT(RGBA4444, 2,
439 		BPC4A, BPC4, BPC4, BPC4,
440 		C3_ALPHA, C1_B_Cb, C0_G_Y, C2_R_Cr),
441 
442 	INTERLEAVED_RGBA_FMT(BGRA4444, 2,
443 		BPC4A, BPC4, BPC4, BPC4,
444 		C3_ALPHA, C2_R_Cr, C0_G_Y, C1_B_Cb),
445 
446 	INTERLEAVED_RGBX_FMT(XRGB4444, 2,
447 		BPC4A, BPC4, BPC4, BPC4,
448 		C1_B_Cb, C0_G_Y, C2_R_Cr, C3_ALPHA),
449 
450 	INTERLEAVED_RGBX_FMT(XBGR4444, 2,
451 		BPC4A, BPC4, BPC4, BPC4,
452 		C2_R_Cr, C0_G_Y, C1_B_Cb, C3_ALPHA),
453 
454 	INTERLEAVED_RGBX_FMT(RGBX4444, 2,
455 		BPC4A, BPC4, BPC4, BPC4,
456 		C3_ALPHA, C1_B_Cb, C0_G_Y, C2_R_Cr),
457 
458 	INTERLEAVED_RGBX_FMT(BGRX4444, 2,
459 		BPC4A, BPC4, BPC4, BPC4,
460 		C3_ALPHA, C2_R_Cr, C0_G_Y, C1_B_Cb),
461 
462 	INTERLEAVED_RGBA_DX_FMT(BGRA1010102, 4,
463 		BPC8A, BPC8, BPC8, BPC8,
464 		C3_ALPHA, C2_R_Cr, C0_G_Y, C1_B_Cb),
465 
466 	INTERLEAVED_RGBA_DX_FMT(RGBA1010102, 4,
467 		BPC8A, BPC8, BPC8, BPC8,
468 		C3_ALPHA, C1_B_Cb, C0_G_Y, C2_R_Cr),
469 
470 	INTERLEAVED_RGBA_DX_FMT(ABGR2101010, 4,
471 		BPC8A, BPC8, BPC8, BPC8,
472 		C2_R_Cr, C0_G_Y, C1_B_Cb, C3_ALPHA),
473 
474 	INTERLEAVED_RGBA_DX_FMT(ARGB2101010, 4,
475 		BPC8A, BPC8, BPC8, BPC8,
476 		C1_B_Cb, C0_G_Y, C2_R_Cr, C3_ALPHA),
477 
478 	INTERLEAVED_RGBX_DX_FMT(XRGB2101010, 4,
479 		BPC8A, BPC8, BPC8, BPC8,
480 		C1_B_Cb, C0_G_Y, C2_R_Cr, C3_ALPHA),
481 
482 	INTERLEAVED_RGBX_DX_FMT(BGRX1010102, 4,
483 		BPC8A, BPC8, BPC8, BPC8,
484 		C3_ALPHA, C2_R_Cr, C0_G_Y, C1_B_Cb),
485 
486 	INTERLEAVED_RGBX_DX_FMT(XBGR2101010, 4,
487 		BPC8A, BPC8, BPC8, BPC8,
488 		C2_R_Cr, C0_G_Y, C1_B_Cb, C3_ALPHA),
489 
490 	INTERLEAVED_RGBX_DX_FMT(RGBX1010102, 4,
491 		BPC8A, BPC8, BPC8, BPC8,
492 		C3_ALPHA, C1_B_Cb, C0_G_Y, C2_R_Cr),
493 
494 	/* --- RGB formats above / YUV formats below this line --- */
495 
496 	/* 2 plane YUV */
497 	PSEUDO_YUV_FMT(NV12,
498 		BPC8, BPC8, BPC8,
499 		C1_B_Cb, C2_R_Cr,
500 		CHROMA_420),
501 
502 	PSEUDO_YUV_FMT(NV21,
503 		BPC8, BPC8, BPC8,
504 		C2_R_Cr, C1_B_Cb,
505 		CHROMA_420),
506 
507 	PSEUDO_YUV_FMT(NV16,
508 		BPC8, BPC8, BPC8,
509 		C1_B_Cb, C2_R_Cr,
510 		CHROMA_H2V1),
511 
512 	PSEUDO_YUV_FMT(NV61,
513 		BPC8, BPC8, BPC8,
514 		C2_R_Cr, C1_B_Cb,
515 		CHROMA_H2V1),
516 
517 	PSEUDO_YUV_FMT_LOOSE(P010,
518 		BPC8, BPC8, BPC8,
519 		C1_B_Cb, C2_R_Cr,
520 		CHROMA_420),
521 
522 	/* 1 plane YUV */
523 	INTERLEAVED_YUV_FMT(VYUY, 2,
524 		BPC8, BPC8, BPC8,
525 		C2_R_Cr, C0_G_Y, C1_B_Cb, C0_G_Y,
526 		CHROMA_H2V1),
527 
528 	INTERLEAVED_YUV_FMT(UYVY, 2,
529 		BPC8, BPC8, BPC8,
530 		C1_B_Cb, C0_G_Y, C2_R_Cr, C0_G_Y,
531 		CHROMA_H2V1),
532 
533 	INTERLEAVED_YUV_FMT(YUYV, 2,
534 		BPC8, BPC8, BPC8,
535 		C0_G_Y, C1_B_Cb, C0_G_Y, C2_R_Cr,
536 		CHROMA_H2V1),
537 
538 	INTERLEAVED_YUV_FMT(YVYU, 2,
539 		BPC8, BPC8, BPC8,
540 		C0_G_Y, C2_R_Cr, C0_G_Y, C1_B_Cb,
541 		CHROMA_H2V1),
542 
543 	/* 3 plane YUV */
544 	PLANAR_YUV_FMT(YUV420, 1,
545 		BPC8, BPC8, BPC8,
546 		C2_R_Cr, C1_B_Cb, C0_G_Y,
547 		CHROMA_420),
548 
549 	PLANAR_YUV_FMT(YVU420, 1,
550 		BPC8, BPC8, BPC8,
551 		C1_B_Cb, C2_R_Cr, C0_G_Y,
552 		CHROMA_420),
553 };
554 
555 /*
556  * UBWC formats table:
557  * This table holds the UBWC formats supported.
558  * If a compression ratio needs to be used for this or any other format,
559  * the data will be passed by user-space.
560  */
561 static const struct msm_format mdp_formats_ubwc[] = {
562 	INTERLEAVED_RGB_FMT_TILED(BGR565, 2,
563 		BPC5, BPC6, BPC5,
564 		C2_R_Cr, C0_G_Y, C1_B_Cb),
565 
566 	INTERLEAVED_RGBA_FMT_TILED(ABGR8888, 4,
567 		BPC8A, BPC8, BPC8, BPC8,
568 		C2_R_Cr, C0_G_Y, C1_B_Cb, C3_ALPHA),
569 
570 	/* ARGB8888 and ABGR8888 purposely have the same color
571 	 * ordering.  The hardware only supports ABGR8888 UBWC
572 	 * natively.
573 	 */
574 	INTERLEAVED_RGBA_FMT_TILED(ARGB8888, 4,
575 		BPC8A, BPC8, BPC8, BPC8,
576 		C2_R_Cr, C0_G_Y, C1_B_Cb, C3_ALPHA),
577 
578 	INTERLEAVED_RGBX_FMT_TILED(XBGR8888, 4,
579 		BPC8A, BPC8, BPC8, BPC8,
580 		C2_R_Cr, C0_G_Y, C1_B_Cb, C3_ALPHA),
581 
582 	INTERLEAVED_RGBX_FMT_TILED(XRGB8888, 4,
583 		BPC8A, BPC8, BPC8, BPC8,
584 		C2_R_Cr, C0_G_Y, C1_B_Cb, C3_ALPHA),
585 
586 	INTERLEAVED_RGBA_DX_FMT_TILED(ABGR2101010, 4,
587 		BPC8A, BPC8, BPC8, BPC8,
588 		C2_R_Cr, C0_G_Y, C1_B_Cb, C3_ALPHA),
589 
590 	INTERLEAVED_RGBA_DX_FMT_TILED(XBGR2101010, 4,
591 		BPC8A, BPC8, BPC8, BPC8,
592 		C2_R_Cr, C0_G_Y, C1_B_Cb, C3_ALPHA),
593 
594 	INTERLEAVED_RGBA_DX_FMT_TILED(XRGB2101010, 4,
595 		BPC8A, BPC8, BPC8, BPC8,
596 		C2_R_Cr, C0_G_Y, C1_B_Cb, C3_ALPHA),
597 
598 	/* XRGB2101010 and ARGB2101010 purposely have the same color
599 	* ordering.  The hardware only supports ARGB2101010 UBWC
600 	* natively.
601 	*/
602 	INTERLEAVED_RGBA_DX_FMT_TILED(ARGB2101010, 4,
603 		BPC8A, BPC8, BPC8, BPC8,
604 		C2_R_Cr, C0_G_Y, C1_B_Cb, C3_ALPHA),
605 
606 	PSEUDO_YUV_FMT_TILED(NV12,
607 		BPC8, BPC8, BPC8,
608 		C1_B_Cb, C2_R_Cr,
609 		CHROMA_420, 0,
610 		MDP_TILE_HEIGHT_NV12),
611 
612 	PSEUDO_YUV_FMT_TILED(P010,
613 		BPC8, BPC8, BPC8,
614 		C1_B_Cb, C2_R_Cr,
615 		CHROMA_420, MSM_FORMAT_FLAG_DX,
616 		MDP_TILE_HEIGHT_UBWC),
617 };
618 
619 const struct msm_format *mdp_get_format(struct msm_kms *kms, uint32_t format,
620 		uint64_t modifier)
621 {
622 	const struct msm_format *map = NULL;
623 	ssize_t map_size;
624 	int i;
625 
626 	switch (modifier) {
627 	case 0:
628 		map = mdp_formats;
629 		map_size = ARRAY_SIZE(mdp_formats);
630 		break;
631 	case DRM_FORMAT_MOD_QCOM_COMPRESSED:
632 		map = mdp_formats_ubwc;
633 		map_size = ARRAY_SIZE(mdp_formats_ubwc);
634 		break;
635 	default:
636 		drm_err(kms->dev, "unsupported format modifier %llX\n", modifier);
637 		return NULL;
638 	}
639 
640 	for (i = 0; i < map_size; i++) {
641 		const struct msm_format *f = &map[i];
642 
643 		if (f->pixel_format == format)
644 			return f;
645 	}
646 
647 	drm_err(kms->dev, "unsupported fmt: %p4cc modifier 0x%llX\n",
648 		&format, modifier);
649 
650 	return NULL;
651 }
652 
653 struct csc_cfg *mdp_get_default_csc_cfg(enum csc_type type)
654 {
655 	if (WARN_ON(type >= CSC_MAX))
656 		return NULL;
657 
658 	return &csc_convert[type];
659 }
660