brintos

brintos / linux-shallow public Read only

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