mdp_format.c 22 KB

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