mdp_format.c 26 KB

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