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