Linux kernel mirror (for testing)
git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel
os
linux
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
14static 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
349static 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 */
561static 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
619const 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
653struct 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}