kmb_plane.c 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright © 2018-2020 Intel Corporation
  4. */
  5. #include <drm/drm_atomic.h>
  6. #include <drm/drm_atomic_helper.h>
  7. #include <drm/drm_blend.h>
  8. #include <drm/drm_crtc.h>
  9. #include <drm/drm_fb_dma_helper.h>
  10. #include <drm/drm_fourcc.h>
  11. #include <drm/drm_framebuffer.h>
  12. #include <drm/drm_gem_dma_helper.h>
  13. #include <drm/drm_managed.h>
  14. #include "kmb_drv.h"
  15. #include "kmb_plane.h"
  16. #include "kmb_regs.h"
  17. const u32 layer_irqs[] = {
  18. LCD_INT_VL0,
  19. LCD_INT_VL1,
  20. LCD_INT_GL0,
  21. LCD_INT_GL1
  22. };
  23. /* Conversion (yuv->rgb) matrix from myriadx */
  24. static const u32 csc_coef_lcd[] = {
  25. 1024, 0, 1436,
  26. 1024, -352, -731,
  27. 1024, 1814, 0,
  28. -179, 125, -226
  29. };
  30. /* Graphics layer (layers 2 & 3) formats, only packed formats are supported */
  31. static const u32 kmb_formats_g[] = {
  32. DRM_FORMAT_RGB332,
  33. DRM_FORMAT_XRGB4444, DRM_FORMAT_XBGR4444,
  34. DRM_FORMAT_ARGB4444, DRM_FORMAT_ABGR4444,
  35. DRM_FORMAT_XRGB1555, DRM_FORMAT_XBGR1555,
  36. DRM_FORMAT_ARGB1555, DRM_FORMAT_ABGR1555,
  37. DRM_FORMAT_RGB565, DRM_FORMAT_BGR565,
  38. DRM_FORMAT_RGB888, DRM_FORMAT_BGR888,
  39. DRM_FORMAT_XRGB8888, DRM_FORMAT_XBGR8888,
  40. DRM_FORMAT_ARGB8888, DRM_FORMAT_ABGR8888,
  41. };
  42. /* Video layer ( 0 & 1) formats, packed and planar formats are supported */
  43. static const u32 kmb_formats_v[] = {
  44. /* packed formats */
  45. DRM_FORMAT_RGB332,
  46. DRM_FORMAT_XRGB4444, DRM_FORMAT_XBGR4444,
  47. DRM_FORMAT_ARGB4444, DRM_FORMAT_ABGR4444,
  48. DRM_FORMAT_XRGB1555, DRM_FORMAT_XBGR1555,
  49. DRM_FORMAT_ARGB1555, DRM_FORMAT_ABGR1555,
  50. DRM_FORMAT_RGB565, DRM_FORMAT_BGR565,
  51. DRM_FORMAT_RGB888, DRM_FORMAT_BGR888,
  52. DRM_FORMAT_XRGB8888, DRM_FORMAT_XBGR8888,
  53. DRM_FORMAT_ARGB8888, DRM_FORMAT_ABGR8888,
  54. /*planar formats */
  55. DRM_FORMAT_YUV420, DRM_FORMAT_YVU420,
  56. DRM_FORMAT_YUV422, DRM_FORMAT_YVU422,
  57. DRM_FORMAT_YUV444, DRM_FORMAT_YVU444,
  58. DRM_FORMAT_NV12, DRM_FORMAT_NV21,
  59. };
  60. static unsigned int check_pixel_format(struct drm_plane *plane, u32 format)
  61. {
  62. struct kmb_drm_private *kmb;
  63. struct kmb_plane *kmb_plane = to_kmb_plane(plane);
  64. int i;
  65. int plane_id = kmb_plane->id;
  66. struct disp_cfg init_disp_cfg;
  67. kmb = to_kmb(plane->dev);
  68. init_disp_cfg = kmb->init_disp_cfg[plane_id];
  69. /* Due to HW limitations, changing pixel format after initial
  70. * plane configuration is not supported.
  71. */
  72. if (init_disp_cfg.format && init_disp_cfg.format != format) {
  73. drm_dbg(&kmb->drm, "Cannot change format after initial plane configuration");
  74. return -EINVAL;
  75. }
  76. for (i = 0; i < plane->format_count; i++) {
  77. if (plane->format_types[i] == format)
  78. return 0;
  79. }
  80. return -EINVAL;
  81. }
  82. static int kmb_plane_atomic_check(struct drm_plane *plane,
  83. struct drm_atomic_state *state)
  84. {
  85. struct drm_plane_state *new_plane_state = drm_atomic_get_new_plane_state(state,
  86. plane);
  87. struct kmb_drm_private *kmb;
  88. struct kmb_plane *kmb_plane = to_kmb_plane(plane);
  89. int plane_id = kmb_plane->id;
  90. struct disp_cfg init_disp_cfg;
  91. struct drm_framebuffer *fb;
  92. int ret;
  93. struct drm_crtc_state *crtc_state;
  94. bool can_position;
  95. kmb = to_kmb(plane->dev);
  96. init_disp_cfg = kmb->init_disp_cfg[plane_id];
  97. fb = new_plane_state->fb;
  98. if (!fb || !new_plane_state->crtc)
  99. return 0;
  100. ret = check_pixel_format(plane, fb->format->format);
  101. if (ret)
  102. return ret;
  103. if (new_plane_state->crtc_w > KMB_FB_MAX_WIDTH ||
  104. new_plane_state->crtc_h > KMB_FB_MAX_HEIGHT ||
  105. new_plane_state->crtc_w < KMB_FB_MIN_WIDTH ||
  106. new_plane_state->crtc_h < KMB_FB_MIN_HEIGHT)
  107. return -EINVAL;
  108. /* Due to HW limitations, changing plane height or width after
  109. * initial plane configuration is not supported.
  110. */
  111. if ((init_disp_cfg.width && init_disp_cfg.height) &&
  112. (init_disp_cfg.width != fb->width ||
  113. init_disp_cfg.height != fb->height)) {
  114. drm_dbg(&kmb->drm, "Cannot change plane height or width after initial configuration");
  115. return -EINVAL;
  116. }
  117. can_position = (plane->type == DRM_PLANE_TYPE_OVERLAY);
  118. crtc_state =
  119. drm_atomic_get_existing_crtc_state(state,
  120. new_plane_state->crtc);
  121. return drm_atomic_helper_check_plane_state(new_plane_state,
  122. crtc_state,
  123. DRM_PLANE_NO_SCALING,
  124. DRM_PLANE_NO_SCALING,
  125. can_position, true);
  126. }
  127. static void kmb_plane_atomic_disable(struct drm_plane *plane,
  128. struct drm_atomic_state *state)
  129. {
  130. struct kmb_plane *kmb_plane = to_kmb_plane(plane);
  131. int plane_id = kmb_plane->id;
  132. struct kmb_drm_private *kmb;
  133. kmb = to_kmb(plane->dev);
  134. if (WARN_ON(plane_id >= KMB_MAX_PLANES))
  135. return;
  136. switch (plane_id) {
  137. case LAYER_0:
  138. kmb->plane_status[plane_id].ctrl = LCD_CTRL_VL1_ENABLE;
  139. break;
  140. case LAYER_1:
  141. kmb->plane_status[plane_id].ctrl = LCD_CTRL_VL2_ENABLE;
  142. break;
  143. }
  144. kmb->plane_status[plane_id].disable = true;
  145. }
  146. static unsigned int get_pixel_format(u32 format)
  147. {
  148. unsigned int val = 0;
  149. switch (format) {
  150. /* planar formats */
  151. case DRM_FORMAT_YUV444:
  152. val = LCD_LAYER_FORMAT_YCBCR444PLAN | LCD_LAYER_PLANAR_STORAGE;
  153. break;
  154. case DRM_FORMAT_YVU444:
  155. val = LCD_LAYER_FORMAT_YCBCR444PLAN | LCD_LAYER_PLANAR_STORAGE
  156. | LCD_LAYER_CRCB_ORDER;
  157. break;
  158. case DRM_FORMAT_YUV422:
  159. val = LCD_LAYER_FORMAT_YCBCR422PLAN | LCD_LAYER_PLANAR_STORAGE;
  160. break;
  161. case DRM_FORMAT_YVU422:
  162. val = LCD_LAYER_FORMAT_YCBCR422PLAN | LCD_LAYER_PLANAR_STORAGE
  163. | LCD_LAYER_CRCB_ORDER;
  164. break;
  165. case DRM_FORMAT_YUV420:
  166. val = LCD_LAYER_FORMAT_YCBCR420PLAN | LCD_LAYER_PLANAR_STORAGE;
  167. break;
  168. case DRM_FORMAT_YVU420:
  169. val = LCD_LAYER_FORMAT_YCBCR420PLAN | LCD_LAYER_PLANAR_STORAGE
  170. | LCD_LAYER_CRCB_ORDER;
  171. break;
  172. case DRM_FORMAT_NV12:
  173. val = LCD_LAYER_FORMAT_NV12 | LCD_LAYER_PLANAR_STORAGE;
  174. break;
  175. case DRM_FORMAT_NV21:
  176. val = LCD_LAYER_FORMAT_NV12 | LCD_LAYER_PLANAR_STORAGE
  177. | LCD_LAYER_CRCB_ORDER;
  178. break;
  179. /* packed formats */
  180. /* looks hw requires B & G to be swapped when RGB */
  181. case DRM_FORMAT_RGB332:
  182. val = LCD_LAYER_FORMAT_RGB332 | LCD_LAYER_BGR_ORDER;
  183. break;
  184. case DRM_FORMAT_XBGR4444:
  185. val = LCD_LAYER_FORMAT_RGBX4444;
  186. break;
  187. case DRM_FORMAT_ARGB4444:
  188. val = LCD_LAYER_FORMAT_RGBA4444 | LCD_LAYER_BGR_ORDER;
  189. break;
  190. case DRM_FORMAT_ABGR4444:
  191. val = LCD_LAYER_FORMAT_RGBA4444;
  192. break;
  193. case DRM_FORMAT_XRGB1555:
  194. val = LCD_LAYER_FORMAT_XRGB1555 | LCD_LAYER_BGR_ORDER;
  195. break;
  196. case DRM_FORMAT_XBGR1555:
  197. val = LCD_LAYER_FORMAT_XRGB1555;
  198. break;
  199. case DRM_FORMAT_ARGB1555:
  200. val = LCD_LAYER_FORMAT_RGBA1555 | LCD_LAYER_BGR_ORDER;
  201. break;
  202. case DRM_FORMAT_ABGR1555:
  203. val = LCD_LAYER_FORMAT_RGBA1555;
  204. break;
  205. case DRM_FORMAT_RGB565:
  206. val = LCD_LAYER_FORMAT_RGB565 | LCD_LAYER_BGR_ORDER;
  207. break;
  208. case DRM_FORMAT_BGR565:
  209. val = LCD_LAYER_FORMAT_RGB565;
  210. break;
  211. case DRM_FORMAT_RGB888:
  212. val = LCD_LAYER_FORMAT_RGB888 | LCD_LAYER_BGR_ORDER;
  213. break;
  214. case DRM_FORMAT_BGR888:
  215. val = LCD_LAYER_FORMAT_RGB888;
  216. break;
  217. case DRM_FORMAT_XRGB8888:
  218. val = LCD_LAYER_FORMAT_RGBX8888 | LCD_LAYER_BGR_ORDER;
  219. break;
  220. case DRM_FORMAT_XBGR8888:
  221. val = LCD_LAYER_FORMAT_RGBX8888;
  222. break;
  223. case DRM_FORMAT_ARGB8888:
  224. val = LCD_LAYER_FORMAT_RGBA8888 | LCD_LAYER_BGR_ORDER;
  225. break;
  226. case DRM_FORMAT_ABGR8888:
  227. val = LCD_LAYER_FORMAT_RGBA8888;
  228. break;
  229. }
  230. DRM_INFO_ONCE("%s : %d format=0x%x val=0x%x\n",
  231. __func__, __LINE__, format, val);
  232. return val;
  233. }
  234. static unsigned int get_bits_per_pixel(const struct drm_format_info *format)
  235. {
  236. u32 bpp = 0;
  237. unsigned int val = 0;
  238. if (format->num_planes > 1) {
  239. val = LCD_LAYER_8BPP;
  240. return val;
  241. }
  242. bpp += 8 * format->cpp[0];
  243. switch (bpp) {
  244. case 8:
  245. val = LCD_LAYER_8BPP;
  246. break;
  247. case 16:
  248. val = LCD_LAYER_16BPP;
  249. break;
  250. case 24:
  251. val = LCD_LAYER_24BPP;
  252. break;
  253. case 32:
  254. val = LCD_LAYER_32BPP;
  255. break;
  256. }
  257. DRM_DEBUG("bpp=%d val=0x%x\n", bpp, val);
  258. return val;
  259. }
  260. static void config_csc(struct kmb_drm_private *kmb, int plane_id)
  261. {
  262. /* YUV to RGB conversion using the fixed matrix csc_coef_lcd */
  263. kmb_write_lcd(kmb, LCD_LAYERn_CSC_COEFF11(plane_id), csc_coef_lcd[0]);
  264. kmb_write_lcd(kmb, LCD_LAYERn_CSC_COEFF12(plane_id), csc_coef_lcd[1]);
  265. kmb_write_lcd(kmb, LCD_LAYERn_CSC_COEFF13(plane_id), csc_coef_lcd[2]);
  266. kmb_write_lcd(kmb, LCD_LAYERn_CSC_COEFF21(plane_id), csc_coef_lcd[3]);
  267. kmb_write_lcd(kmb, LCD_LAYERn_CSC_COEFF22(plane_id), csc_coef_lcd[4]);
  268. kmb_write_lcd(kmb, LCD_LAYERn_CSC_COEFF23(plane_id), csc_coef_lcd[5]);
  269. kmb_write_lcd(kmb, LCD_LAYERn_CSC_COEFF31(plane_id), csc_coef_lcd[6]);
  270. kmb_write_lcd(kmb, LCD_LAYERn_CSC_COEFF32(plane_id), csc_coef_lcd[7]);
  271. kmb_write_lcd(kmb, LCD_LAYERn_CSC_COEFF33(plane_id), csc_coef_lcd[8]);
  272. kmb_write_lcd(kmb, LCD_LAYERn_CSC_OFF1(plane_id), csc_coef_lcd[9]);
  273. kmb_write_lcd(kmb, LCD_LAYERn_CSC_OFF2(plane_id), csc_coef_lcd[10]);
  274. kmb_write_lcd(kmb, LCD_LAYERn_CSC_OFF3(plane_id), csc_coef_lcd[11]);
  275. }
  276. static void kmb_plane_set_alpha(struct kmb_drm_private *kmb,
  277. const struct drm_plane_state *state,
  278. unsigned char plane_id,
  279. unsigned int *val)
  280. {
  281. u16 plane_alpha = state->alpha;
  282. u16 pixel_blend_mode = state->pixel_blend_mode;
  283. int has_alpha = state->fb->format->has_alpha;
  284. if (plane_alpha != DRM_BLEND_ALPHA_OPAQUE)
  285. *val |= LCD_LAYER_ALPHA_STATIC;
  286. if (has_alpha) {
  287. switch (pixel_blend_mode) {
  288. case DRM_MODE_BLEND_PIXEL_NONE:
  289. break;
  290. case DRM_MODE_BLEND_PREMULTI:
  291. *val |= LCD_LAYER_ALPHA_EMBED | LCD_LAYER_ALPHA_PREMULT;
  292. break;
  293. case DRM_MODE_BLEND_COVERAGE:
  294. *val |= LCD_LAYER_ALPHA_EMBED;
  295. break;
  296. default:
  297. DRM_DEBUG("Missing pixel blend mode case (%s == %ld)\n",
  298. __stringify(pixel_blend_mode),
  299. (long)pixel_blend_mode);
  300. break;
  301. }
  302. }
  303. if (plane_alpha == DRM_BLEND_ALPHA_OPAQUE && !has_alpha) {
  304. *val &= LCD_LAYER_ALPHA_DISABLED;
  305. return;
  306. }
  307. kmb_write_lcd(kmb, LCD_LAYERn_ALPHA(plane_id), plane_alpha);
  308. }
  309. static void kmb_plane_atomic_update(struct drm_plane *plane,
  310. struct drm_atomic_state *state)
  311. {
  312. struct drm_plane_state *old_plane_state = drm_atomic_get_old_plane_state(state,
  313. plane);
  314. struct drm_plane_state *new_plane_state = drm_atomic_get_new_plane_state(state,
  315. plane);
  316. struct drm_framebuffer *fb;
  317. struct kmb_drm_private *kmb;
  318. unsigned int width;
  319. unsigned int height;
  320. unsigned int dma_len;
  321. struct kmb_plane *kmb_plane;
  322. unsigned int dma_cfg;
  323. unsigned int ctrl = 0, val = 0, out_format = 0;
  324. unsigned int src_w, src_h, crtc_x, crtc_y;
  325. unsigned char plane_id;
  326. int num_planes;
  327. static dma_addr_t addr[MAX_SUB_PLANES];
  328. struct disp_cfg *init_disp_cfg;
  329. if (!plane || !new_plane_state || !old_plane_state)
  330. return;
  331. fb = new_plane_state->fb;
  332. if (!fb)
  333. return;
  334. num_planes = fb->format->num_planes;
  335. kmb_plane = to_kmb_plane(plane);
  336. kmb = to_kmb(plane->dev);
  337. plane_id = kmb_plane->id;
  338. spin_lock_irq(&kmb->irq_lock);
  339. if (kmb->kmb_under_flow || kmb->kmb_flush_done) {
  340. spin_unlock_irq(&kmb->irq_lock);
  341. drm_dbg(&kmb->drm, "plane_update:underflow!!!! returning");
  342. return;
  343. }
  344. spin_unlock_irq(&kmb->irq_lock);
  345. init_disp_cfg = &kmb->init_disp_cfg[plane_id];
  346. src_w = new_plane_state->src_w >> 16;
  347. src_h = new_plane_state->src_h >> 16;
  348. crtc_x = new_plane_state->crtc_x;
  349. crtc_y = new_plane_state->crtc_y;
  350. drm_dbg(&kmb->drm,
  351. "src_w=%d src_h=%d, fb->format->format=0x%x fb->flags=0x%x\n",
  352. src_w, src_h, fb->format->format, fb->flags);
  353. width = fb->width;
  354. height = fb->height;
  355. dma_len = (width * height * fb->format->cpp[0]);
  356. drm_dbg(&kmb->drm, "dma_len=%d ", dma_len);
  357. kmb_write_lcd(kmb, LCD_LAYERn_DMA_LEN(plane_id), dma_len);
  358. kmb_write_lcd(kmb, LCD_LAYERn_DMA_LEN_SHADOW(plane_id), dma_len);
  359. kmb_write_lcd(kmb, LCD_LAYERn_DMA_LINE_VSTRIDE(plane_id),
  360. fb->pitches[0]);
  361. kmb_write_lcd(kmb, LCD_LAYERn_DMA_LINE_WIDTH(plane_id),
  362. (width * fb->format->cpp[0]));
  363. addr[Y_PLANE] = drm_fb_dma_get_gem_addr(fb, new_plane_state, 0);
  364. kmb_write_lcd(kmb, LCD_LAYERn_DMA_START_ADDR(plane_id),
  365. addr[Y_PLANE] + fb->offsets[0]);
  366. val = get_pixel_format(fb->format->format);
  367. val |= get_bits_per_pixel(fb->format);
  368. /* Program Cb/Cr for planar formats */
  369. if (num_planes > 1) {
  370. kmb_write_lcd(kmb, LCD_LAYERn_DMA_CB_LINE_VSTRIDE(plane_id),
  371. width * fb->format->cpp[0]);
  372. kmb_write_lcd(kmb, LCD_LAYERn_DMA_CB_LINE_WIDTH(plane_id),
  373. (width * fb->format->cpp[0]));
  374. addr[U_PLANE] = drm_fb_dma_get_gem_addr(fb, new_plane_state,
  375. U_PLANE);
  376. /* check if Cb/Cr is swapped*/
  377. if (num_planes == 3 && (val & LCD_LAYER_CRCB_ORDER))
  378. kmb_write_lcd(kmb,
  379. LCD_LAYERn_DMA_START_CR_ADR(plane_id),
  380. addr[U_PLANE]);
  381. else
  382. kmb_write_lcd(kmb,
  383. LCD_LAYERn_DMA_START_CB_ADR(plane_id),
  384. addr[U_PLANE]);
  385. if (num_planes == 3) {
  386. kmb_write_lcd(kmb,
  387. LCD_LAYERn_DMA_CR_LINE_VSTRIDE(plane_id),
  388. ((width) * fb->format->cpp[0]));
  389. kmb_write_lcd(kmb,
  390. LCD_LAYERn_DMA_CR_LINE_WIDTH(plane_id),
  391. ((width) * fb->format->cpp[0]));
  392. addr[V_PLANE] = drm_fb_dma_get_gem_addr(fb,
  393. new_plane_state,
  394. V_PLANE);
  395. /* check if Cb/Cr is swapped*/
  396. if (val & LCD_LAYER_CRCB_ORDER)
  397. kmb_write_lcd(kmb,
  398. LCD_LAYERn_DMA_START_CB_ADR(plane_id),
  399. addr[V_PLANE]);
  400. else
  401. kmb_write_lcd(kmb,
  402. LCD_LAYERn_DMA_START_CR_ADR(plane_id),
  403. addr[V_PLANE]);
  404. }
  405. }
  406. kmb_write_lcd(kmb, LCD_LAYERn_WIDTH(plane_id), src_w - 1);
  407. kmb_write_lcd(kmb, LCD_LAYERn_HEIGHT(plane_id), src_h - 1);
  408. kmb_write_lcd(kmb, LCD_LAYERn_COL_START(plane_id), crtc_x);
  409. kmb_write_lcd(kmb, LCD_LAYERn_ROW_START(plane_id), crtc_y);
  410. val |= LCD_LAYER_FIFO_100;
  411. if (val & LCD_LAYER_PLANAR_STORAGE) {
  412. val |= LCD_LAYER_CSC_EN;
  413. /* Enable CSC if input is planar and output is RGB */
  414. config_csc(kmb, plane_id);
  415. }
  416. kmb_plane_set_alpha(kmb, plane->state, plane_id, &val);
  417. kmb_write_lcd(kmb, LCD_LAYERn_CFG(plane_id), val);
  418. /* Configure LCD_CONTROL */
  419. ctrl = kmb_read_lcd(kmb, LCD_CONTROL);
  420. /* Set layer blending config */
  421. ctrl &= ~LCD_CTRL_ALPHA_ALL;
  422. ctrl |= LCD_CTRL_ALPHA_BOTTOM_VL1 |
  423. LCD_CTRL_ALPHA_BLEND_VL2;
  424. ctrl &= ~LCD_CTRL_ALPHA_BLEND_BKGND_DISABLE;
  425. switch (plane_id) {
  426. case LAYER_0:
  427. ctrl |= LCD_CTRL_VL1_ENABLE;
  428. break;
  429. case LAYER_1:
  430. ctrl |= LCD_CTRL_VL2_ENABLE;
  431. break;
  432. case LAYER_2:
  433. ctrl |= LCD_CTRL_GL1_ENABLE;
  434. break;
  435. case LAYER_3:
  436. ctrl |= LCD_CTRL_GL2_ENABLE;
  437. break;
  438. }
  439. ctrl |= LCD_CTRL_PROGRESSIVE | LCD_CTRL_TIM_GEN_ENABLE
  440. | LCD_CTRL_CONTINUOUS | LCD_CTRL_OUTPUT_ENABLED;
  441. /* LCD is connected to MIPI on kmb
  442. * Therefore this bit is required for DSI Tx
  443. */
  444. ctrl |= LCD_CTRL_VHSYNC_IDLE_LVL;
  445. kmb_write_lcd(kmb, LCD_CONTROL, ctrl);
  446. /* Enable pipeline AXI read transactions for the DMA
  447. * after setting graphics layers. This must be done
  448. * in a separate write cycle.
  449. */
  450. kmb_set_bitmask_lcd(kmb, LCD_CONTROL, LCD_CTRL_PIPELINE_DMA);
  451. /* FIXME no doc on how to set output format, these values are taken
  452. * from the Myriadx tests
  453. */
  454. out_format |= LCD_OUTF_FORMAT_RGB888;
  455. /* Leave RGB order,conversion mode and clip mode to default */
  456. /* do not interleave RGB channels for mipi Tx compatibility */
  457. out_format |= LCD_OUTF_MIPI_RGB_MODE;
  458. kmb_write_lcd(kmb, LCD_OUT_FORMAT_CFG, out_format);
  459. dma_cfg = LCD_DMA_LAYER_ENABLE | LCD_DMA_LAYER_VSTRIDE_EN |
  460. LCD_DMA_LAYER_CONT_UPDATE | LCD_DMA_LAYER_AXI_BURST_16;
  461. /* Enable DMA */
  462. kmb_write_lcd(kmb, LCD_LAYERn_DMA_CFG(plane_id), dma_cfg);
  463. /* Save initial display config */
  464. if (!init_disp_cfg->width ||
  465. !init_disp_cfg->height ||
  466. !init_disp_cfg->format) {
  467. init_disp_cfg->width = width;
  468. init_disp_cfg->height = height;
  469. init_disp_cfg->format = fb->format->format;
  470. }
  471. drm_dbg(&kmb->drm, "dma_cfg=0x%x LCD_DMA_CFG=0x%x\n", dma_cfg,
  472. kmb_read_lcd(kmb, LCD_LAYERn_DMA_CFG(plane_id)));
  473. kmb_set_bitmask_lcd(kmb, LCD_INT_CLEAR, LCD_INT_EOF |
  474. LCD_INT_DMA_ERR);
  475. kmb_set_bitmask_lcd(kmb, LCD_INT_ENABLE, LCD_INT_EOF |
  476. LCD_INT_DMA_ERR);
  477. }
  478. static const struct drm_plane_helper_funcs kmb_plane_helper_funcs = {
  479. .atomic_check = kmb_plane_atomic_check,
  480. .atomic_update = kmb_plane_atomic_update,
  481. .atomic_disable = kmb_plane_atomic_disable
  482. };
  483. void kmb_plane_destroy(struct drm_plane *plane)
  484. {
  485. struct kmb_plane *kmb_plane = to_kmb_plane(plane);
  486. drm_plane_cleanup(plane);
  487. kfree(kmb_plane);
  488. }
  489. static const struct drm_plane_funcs kmb_plane_funcs = {
  490. .update_plane = drm_atomic_helper_update_plane,
  491. .disable_plane = drm_atomic_helper_disable_plane,
  492. .destroy = kmb_plane_destroy,
  493. .reset = drm_atomic_helper_plane_reset,
  494. .atomic_duplicate_state = drm_atomic_helper_plane_duplicate_state,
  495. .atomic_destroy_state = drm_atomic_helper_plane_destroy_state,
  496. };
  497. struct kmb_plane *kmb_plane_init(struct drm_device *drm)
  498. {
  499. struct kmb_drm_private *kmb = to_kmb(drm);
  500. struct kmb_plane *plane = NULL;
  501. struct kmb_plane *primary = NULL;
  502. int i = 0;
  503. int ret = 0;
  504. enum drm_plane_type plane_type;
  505. const u32 *plane_formats;
  506. int num_plane_formats;
  507. unsigned int blend_caps = BIT(DRM_MODE_BLEND_PIXEL_NONE) |
  508. BIT(DRM_MODE_BLEND_PREMULTI) |
  509. BIT(DRM_MODE_BLEND_COVERAGE);
  510. for (i = 0; i < KMB_MAX_PLANES; i++) {
  511. plane = drmm_kzalloc(drm, sizeof(*plane), GFP_KERNEL);
  512. if (!plane) {
  513. drm_err(drm, "Failed to allocate plane\n");
  514. return ERR_PTR(-ENOMEM);
  515. }
  516. plane_type = (i == 0) ? DRM_PLANE_TYPE_PRIMARY :
  517. DRM_PLANE_TYPE_OVERLAY;
  518. if (i < 2) {
  519. plane_formats = kmb_formats_v;
  520. num_plane_formats = ARRAY_SIZE(kmb_formats_v);
  521. } else {
  522. plane_formats = kmb_formats_g;
  523. num_plane_formats = ARRAY_SIZE(kmb_formats_g);
  524. }
  525. ret = drm_universal_plane_init(drm, &plane->base_plane,
  526. POSSIBLE_CRTCS, &kmb_plane_funcs,
  527. plane_formats, num_plane_formats,
  528. NULL, plane_type, "plane %d", i);
  529. if (ret < 0) {
  530. drm_err(drm, "drm_universal_plane_init failed (ret=%d)",
  531. ret);
  532. goto cleanup;
  533. }
  534. drm_dbg(drm, "%s : %d i=%d type=%d",
  535. __func__, __LINE__,
  536. i, plane_type);
  537. drm_plane_create_alpha_property(&plane->base_plane);
  538. drm_plane_create_blend_mode_property(&plane->base_plane,
  539. blend_caps);
  540. drm_plane_create_zpos_immutable_property(&plane->base_plane, i);
  541. drm_plane_helper_add(&plane->base_plane,
  542. &kmb_plane_helper_funcs);
  543. if (plane_type == DRM_PLANE_TYPE_PRIMARY) {
  544. primary = plane;
  545. kmb->plane = plane;
  546. }
  547. drm_dbg(drm, "%s : %d primary=%p\n", __func__, __LINE__,
  548. &primary->base_plane);
  549. plane->id = i;
  550. }
  551. /* Disable pipeline AXI read transactions for the DMA
  552. * prior to setting graphics layers
  553. */
  554. kmb_clr_bitmask_lcd(kmb, LCD_CONTROL, LCD_CTRL_PIPELINE_DMA);
  555. return primary;
  556. cleanup:
  557. drmm_kfree(drm, plane);
  558. return ERR_PTR(ret);
  559. }