mtk_crtc.c 32 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright (c) 2015 MediaTek Inc.
  4. */
  5. #include <linux/clk.h>
  6. #include <linux/dma-mapping.h>
  7. #include <linux/mailbox_controller.h>
  8. #include <linux/of.h>
  9. #include <linux/pm_runtime.h>
  10. #include <linux/soc/mediatek/mtk-cmdq.h>
  11. #include <linux/soc/mediatek/mtk-mmsys.h>
  12. #include <linux/soc/mediatek/mtk-mutex.h>
  13. #include <asm/barrier.h>
  14. #include <drm/drm_atomic.h>
  15. #include <drm/drm_atomic_helper.h>
  16. #include <drm/drm_probe_helper.h>
  17. #include <drm/drm_vblank.h>
  18. #include "mtk_crtc.h"
  19. #include "mtk_ddp_comp.h"
  20. #include "mtk_drm_drv.h"
  21. #include "mtk_gem.h"
  22. #include "mtk_plane.h"
  23. /*
  24. * struct mtk_crtc - MediaTek specific crtc structure.
  25. * @base: crtc object.
  26. * @enabled: records whether crtc_enable succeeded
  27. * @planes: array of 4 drm_plane structures, one for each overlay plane
  28. * @pending_planes: whether any plane has pending changes to be applied
  29. * @mmsys_dev: pointer to the mmsys device for configuration registers
  30. * @mutex: handle to one of the ten disp_mutex streams
  31. * @ddp_comp_nr: number of components in ddp_comp
  32. * @ddp_comp: array of pointers the mtk_ddp_comp structures used by this crtc
  33. *
  34. * TODO: Needs update: this header is missing a bunch of member descriptions.
  35. */
  36. struct mtk_crtc {
  37. struct drm_crtc base;
  38. bool enabled;
  39. bool pending_needs_vblank;
  40. struct drm_pending_vblank_event *event;
  41. struct drm_plane *planes;
  42. unsigned int layer_nr;
  43. bool pending_planes;
  44. bool pending_async_planes;
  45. #if IS_REACHABLE(CONFIG_MTK_CMDQ)
  46. struct cmdq_client cmdq_client;
  47. struct cmdq_pkt cmdq_handle;
  48. u32 cmdq_event;
  49. u32 cmdq_vblank_cnt;
  50. wait_queue_head_t cb_blocking_queue;
  51. #endif
  52. struct device *mmsys_dev;
  53. struct device *dma_dev;
  54. struct mtk_mutex *mutex;
  55. unsigned int ddp_comp_nr;
  56. struct mtk_ddp_comp **ddp_comp;
  57. unsigned int num_conn_routes;
  58. const struct mtk_drm_route *conn_routes;
  59. /* lock for display hardware access */
  60. struct mutex hw_lock;
  61. bool config_updating;
  62. /* lock for config_updating to cmd buffer */
  63. spinlock_t config_lock;
  64. };
  65. struct mtk_crtc_state {
  66. struct drm_crtc_state base;
  67. bool pending_config;
  68. unsigned int pending_width;
  69. unsigned int pending_height;
  70. unsigned int pending_vrefresh;
  71. };
  72. static inline struct mtk_crtc *to_mtk_crtc(struct drm_crtc *c)
  73. {
  74. return container_of(c, struct mtk_crtc, base);
  75. }
  76. static inline struct mtk_crtc_state *to_mtk_crtc_state(struct drm_crtc_state *s)
  77. {
  78. return container_of(s, struct mtk_crtc_state, base);
  79. }
  80. static void mtk_crtc_finish_page_flip(struct mtk_crtc *mtk_crtc)
  81. {
  82. struct drm_crtc *crtc = &mtk_crtc->base;
  83. unsigned long flags;
  84. if (mtk_crtc->event) {
  85. spin_lock_irqsave(&crtc->dev->event_lock, flags);
  86. drm_crtc_send_vblank_event(crtc, mtk_crtc->event);
  87. drm_crtc_vblank_put(crtc);
  88. mtk_crtc->event = NULL;
  89. spin_unlock_irqrestore(&crtc->dev->event_lock, flags);
  90. }
  91. }
  92. static void mtk_drm_finish_page_flip(struct mtk_crtc *mtk_crtc)
  93. {
  94. unsigned long flags;
  95. drm_crtc_handle_vblank(&mtk_crtc->base);
  96. #if IS_REACHABLE(CONFIG_MTK_CMDQ)
  97. if (mtk_crtc->cmdq_client.chan)
  98. return;
  99. #endif
  100. spin_lock_irqsave(&mtk_crtc->config_lock, flags);
  101. if (!mtk_crtc->config_updating && mtk_crtc->pending_needs_vblank) {
  102. mtk_crtc_finish_page_flip(mtk_crtc);
  103. mtk_crtc->pending_needs_vblank = false;
  104. }
  105. spin_unlock_irqrestore(&mtk_crtc->config_lock, flags);
  106. }
  107. static void mtk_crtc_destroy(struct drm_crtc *crtc)
  108. {
  109. struct mtk_crtc *mtk_crtc = to_mtk_crtc(crtc);
  110. int i;
  111. mtk_mutex_put(mtk_crtc->mutex);
  112. #if IS_REACHABLE(CONFIG_MTK_CMDQ)
  113. if (mtk_crtc->cmdq_client.chan) {
  114. cmdq_pkt_destroy(&mtk_crtc->cmdq_client, &mtk_crtc->cmdq_handle);
  115. mbox_free_channel(mtk_crtc->cmdq_client.chan);
  116. mtk_crtc->cmdq_client.chan = NULL;
  117. }
  118. #endif
  119. for (i = 0; i < mtk_crtc->ddp_comp_nr; i++) {
  120. struct mtk_ddp_comp *comp;
  121. comp = mtk_crtc->ddp_comp[i];
  122. mtk_ddp_comp_unregister_vblank_cb(comp);
  123. }
  124. drm_crtc_cleanup(crtc);
  125. }
  126. static void mtk_crtc_reset(struct drm_crtc *crtc)
  127. {
  128. struct mtk_crtc_state *state;
  129. if (crtc->state)
  130. __drm_atomic_helper_crtc_destroy_state(crtc->state);
  131. kfree(to_mtk_crtc_state(crtc->state));
  132. crtc->state = NULL;
  133. state = kzalloc(sizeof(*state), GFP_KERNEL);
  134. if (state)
  135. __drm_atomic_helper_crtc_reset(crtc, &state->base);
  136. }
  137. static struct drm_crtc_state *mtk_crtc_duplicate_state(struct drm_crtc *crtc)
  138. {
  139. struct mtk_crtc_state *state;
  140. state = kmalloc(sizeof(*state), GFP_KERNEL);
  141. if (!state)
  142. return NULL;
  143. __drm_atomic_helper_crtc_duplicate_state(crtc, &state->base);
  144. WARN_ON(state->base.crtc != crtc);
  145. state->base.crtc = crtc;
  146. state->pending_config = false;
  147. return &state->base;
  148. }
  149. static void mtk_crtc_destroy_state(struct drm_crtc *crtc,
  150. struct drm_crtc_state *state)
  151. {
  152. __drm_atomic_helper_crtc_destroy_state(state);
  153. kfree(to_mtk_crtc_state(state));
  154. }
  155. static enum drm_mode_status
  156. mtk_crtc_mode_valid(struct drm_crtc *crtc, const struct drm_display_mode *mode)
  157. {
  158. struct mtk_crtc *mtk_crtc = to_mtk_crtc(crtc);
  159. enum drm_mode_status status = MODE_OK;
  160. int i;
  161. for (i = 0; i < mtk_crtc->ddp_comp_nr; i++) {
  162. status = mtk_ddp_comp_mode_valid(mtk_crtc->ddp_comp[i], mode);
  163. if (status != MODE_OK)
  164. break;
  165. }
  166. return status;
  167. }
  168. static bool mtk_crtc_mode_fixup(struct drm_crtc *crtc,
  169. const struct drm_display_mode *mode,
  170. struct drm_display_mode *adjusted_mode)
  171. {
  172. /* Nothing to do here, but this callback is mandatory. */
  173. return true;
  174. }
  175. static void mtk_crtc_mode_set_nofb(struct drm_crtc *crtc)
  176. {
  177. struct mtk_crtc_state *state = to_mtk_crtc_state(crtc->state);
  178. state->pending_width = crtc->mode.hdisplay;
  179. state->pending_height = crtc->mode.vdisplay;
  180. state->pending_vrefresh = drm_mode_vrefresh(&crtc->mode);
  181. wmb(); /* Make sure the above parameters are set before update */
  182. state->pending_config = true;
  183. }
  184. static int mtk_crtc_ddp_clk_enable(struct mtk_crtc *mtk_crtc)
  185. {
  186. int ret;
  187. int i;
  188. for (i = 0; i < mtk_crtc->ddp_comp_nr; i++) {
  189. ret = mtk_ddp_comp_clk_enable(mtk_crtc->ddp_comp[i]);
  190. if (ret) {
  191. DRM_ERROR("Failed to enable clock %d: %d\n", i, ret);
  192. goto err;
  193. }
  194. }
  195. return 0;
  196. err:
  197. while (--i >= 0)
  198. mtk_ddp_comp_clk_disable(mtk_crtc->ddp_comp[i]);
  199. return ret;
  200. }
  201. static void mtk_crtc_ddp_clk_disable(struct mtk_crtc *mtk_crtc)
  202. {
  203. int i;
  204. for (i = 0; i < mtk_crtc->ddp_comp_nr; i++)
  205. mtk_ddp_comp_clk_disable(mtk_crtc->ddp_comp[i]);
  206. }
  207. static
  208. struct mtk_ddp_comp *mtk_ddp_comp_for_plane(struct drm_crtc *crtc,
  209. struct drm_plane *plane,
  210. unsigned int *local_layer)
  211. {
  212. struct mtk_crtc *mtk_crtc = to_mtk_crtc(crtc);
  213. struct mtk_ddp_comp *comp;
  214. int i, count = 0;
  215. unsigned int local_index = plane - mtk_crtc->planes;
  216. for (i = 0; i < mtk_crtc->ddp_comp_nr; i++) {
  217. comp = mtk_crtc->ddp_comp[i];
  218. if (local_index < (count + mtk_ddp_comp_layer_nr(comp))) {
  219. *local_layer = local_index - count;
  220. return comp;
  221. }
  222. count += mtk_ddp_comp_layer_nr(comp);
  223. }
  224. WARN(1, "Failed to find component for plane %d\n", plane->index);
  225. return NULL;
  226. }
  227. #if IS_REACHABLE(CONFIG_MTK_CMDQ)
  228. static void ddp_cmdq_cb(struct mbox_client *cl, void *mssg)
  229. {
  230. struct cmdq_cb_data *data = mssg;
  231. struct cmdq_client *cmdq_cl = container_of(cl, struct cmdq_client, client);
  232. struct mtk_crtc *mtk_crtc = container_of(cmdq_cl, struct mtk_crtc, cmdq_client);
  233. struct mtk_crtc_state *state;
  234. unsigned int i;
  235. unsigned long flags;
  236. if (data->sta < 0)
  237. return;
  238. state = to_mtk_crtc_state(mtk_crtc->base.state);
  239. spin_lock_irqsave(&mtk_crtc->config_lock, flags);
  240. if (mtk_crtc->config_updating)
  241. goto ddp_cmdq_cb_out;
  242. state->pending_config = false;
  243. if (mtk_crtc->pending_planes) {
  244. for (i = 0; i < mtk_crtc->layer_nr; i++) {
  245. struct drm_plane *plane = &mtk_crtc->planes[i];
  246. struct mtk_plane_state *plane_state;
  247. plane_state = to_mtk_plane_state(plane->state);
  248. plane_state->pending.config = false;
  249. }
  250. mtk_crtc->pending_planes = false;
  251. }
  252. if (mtk_crtc->pending_async_planes) {
  253. for (i = 0; i < mtk_crtc->layer_nr; i++) {
  254. struct drm_plane *plane = &mtk_crtc->planes[i];
  255. struct mtk_plane_state *plane_state;
  256. plane_state = to_mtk_plane_state(plane->state);
  257. plane_state->pending.async_config = false;
  258. }
  259. mtk_crtc->pending_async_planes = false;
  260. }
  261. ddp_cmdq_cb_out:
  262. if (mtk_crtc->pending_needs_vblank) {
  263. mtk_crtc_finish_page_flip(mtk_crtc);
  264. mtk_crtc->pending_needs_vblank = false;
  265. }
  266. spin_unlock_irqrestore(&mtk_crtc->config_lock, flags);
  267. mtk_crtc->cmdq_vblank_cnt = 0;
  268. wake_up(&mtk_crtc->cb_blocking_queue);
  269. }
  270. #endif
  271. static int mtk_crtc_ddp_hw_init(struct mtk_crtc *mtk_crtc)
  272. {
  273. struct drm_crtc *crtc = &mtk_crtc->base;
  274. struct drm_connector *connector;
  275. struct drm_encoder *encoder;
  276. struct drm_connector_list_iter conn_iter;
  277. unsigned int width, height, vrefresh, bpc = MTK_MAX_BPC;
  278. int ret;
  279. int i;
  280. if (WARN_ON(!crtc->state))
  281. return -EINVAL;
  282. width = crtc->state->adjusted_mode.hdisplay;
  283. height = crtc->state->adjusted_mode.vdisplay;
  284. vrefresh = drm_mode_vrefresh(&crtc->state->adjusted_mode);
  285. drm_for_each_encoder(encoder, crtc->dev) {
  286. if (encoder->crtc != crtc)
  287. continue;
  288. drm_connector_list_iter_begin(crtc->dev, &conn_iter);
  289. drm_for_each_connector_iter(connector, &conn_iter) {
  290. if (connector->encoder != encoder)
  291. continue;
  292. if (connector->display_info.bpc != 0 &&
  293. bpc > connector->display_info.bpc)
  294. bpc = connector->display_info.bpc;
  295. }
  296. drm_connector_list_iter_end(&conn_iter);
  297. }
  298. ret = pm_runtime_resume_and_get(crtc->dev->dev);
  299. if (ret < 0) {
  300. DRM_ERROR("Failed to enable power domain: %d\n", ret);
  301. return ret;
  302. }
  303. ret = mtk_mutex_prepare(mtk_crtc->mutex);
  304. if (ret < 0) {
  305. DRM_ERROR("Failed to enable mutex clock: %d\n", ret);
  306. goto err_pm_runtime_put;
  307. }
  308. ret = mtk_crtc_ddp_clk_enable(mtk_crtc);
  309. if (ret < 0) {
  310. DRM_ERROR("Failed to enable component clocks: %d\n", ret);
  311. goto err_mutex_unprepare;
  312. }
  313. for (i = 0; i < mtk_crtc->ddp_comp_nr - 1; i++) {
  314. if (!mtk_ddp_comp_connect(mtk_crtc->ddp_comp[i], mtk_crtc->mmsys_dev,
  315. mtk_crtc->ddp_comp[i + 1]->id))
  316. mtk_mmsys_ddp_connect(mtk_crtc->mmsys_dev,
  317. mtk_crtc->ddp_comp[i]->id,
  318. mtk_crtc->ddp_comp[i + 1]->id);
  319. if (!mtk_ddp_comp_add(mtk_crtc->ddp_comp[i], mtk_crtc->mutex))
  320. mtk_mutex_add_comp(mtk_crtc->mutex,
  321. mtk_crtc->ddp_comp[i]->id);
  322. }
  323. if (!mtk_ddp_comp_add(mtk_crtc->ddp_comp[i], mtk_crtc->mutex))
  324. mtk_mutex_add_comp(mtk_crtc->mutex, mtk_crtc->ddp_comp[i]->id);
  325. mtk_mutex_enable(mtk_crtc->mutex);
  326. for (i = 0; i < mtk_crtc->ddp_comp_nr; i++) {
  327. struct mtk_ddp_comp *comp = mtk_crtc->ddp_comp[i];
  328. if (i == 1)
  329. mtk_ddp_comp_bgclr_in_on(comp);
  330. mtk_ddp_comp_config(comp, width, height, vrefresh, bpc, NULL);
  331. mtk_ddp_comp_start(comp);
  332. }
  333. /* Initially configure all planes */
  334. for (i = 0; i < mtk_crtc->layer_nr; i++) {
  335. struct drm_plane *plane = &mtk_crtc->planes[i];
  336. struct mtk_plane_state *plane_state;
  337. struct mtk_ddp_comp *comp;
  338. unsigned int local_layer;
  339. plane_state = to_mtk_plane_state(plane->state);
  340. /* should not enable layer before crtc enabled */
  341. plane_state->pending.enable = false;
  342. comp = mtk_ddp_comp_for_plane(crtc, plane, &local_layer);
  343. if (comp)
  344. mtk_ddp_comp_layer_config(comp, local_layer,
  345. plane_state, NULL);
  346. }
  347. return 0;
  348. err_mutex_unprepare:
  349. mtk_mutex_unprepare(mtk_crtc->mutex);
  350. err_pm_runtime_put:
  351. pm_runtime_put(crtc->dev->dev);
  352. return ret;
  353. }
  354. static void mtk_crtc_ddp_hw_fini(struct mtk_crtc *mtk_crtc)
  355. {
  356. struct drm_device *drm = mtk_crtc->base.dev;
  357. struct drm_crtc *crtc = &mtk_crtc->base;
  358. unsigned long flags;
  359. int i;
  360. for (i = 0; i < mtk_crtc->ddp_comp_nr; i++) {
  361. mtk_ddp_comp_stop(mtk_crtc->ddp_comp[i]);
  362. if (i == 1)
  363. mtk_ddp_comp_bgclr_in_off(mtk_crtc->ddp_comp[i]);
  364. }
  365. for (i = 0; i < mtk_crtc->ddp_comp_nr; i++)
  366. if (!mtk_ddp_comp_remove(mtk_crtc->ddp_comp[i], mtk_crtc->mutex))
  367. mtk_mutex_remove_comp(mtk_crtc->mutex,
  368. mtk_crtc->ddp_comp[i]->id);
  369. mtk_mutex_disable(mtk_crtc->mutex);
  370. for (i = 0; i < mtk_crtc->ddp_comp_nr - 1; i++) {
  371. if (!mtk_ddp_comp_disconnect(mtk_crtc->ddp_comp[i], mtk_crtc->mmsys_dev,
  372. mtk_crtc->ddp_comp[i + 1]->id))
  373. mtk_mmsys_ddp_disconnect(mtk_crtc->mmsys_dev,
  374. mtk_crtc->ddp_comp[i]->id,
  375. mtk_crtc->ddp_comp[i + 1]->id);
  376. if (!mtk_ddp_comp_remove(mtk_crtc->ddp_comp[i], mtk_crtc->mutex))
  377. mtk_mutex_remove_comp(mtk_crtc->mutex,
  378. mtk_crtc->ddp_comp[i]->id);
  379. }
  380. if (!mtk_ddp_comp_remove(mtk_crtc->ddp_comp[i], mtk_crtc->mutex))
  381. mtk_mutex_remove_comp(mtk_crtc->mutex, mtk_crtc->ddp_comp[i]->id);
  382. mtk_crtc_ddp_clk_disable(mtk_crtc);
  383. mtk_mutex_unprepare(mtk_crtc->mutex);
  384. pm_runtime_put(drm->dev);
  385. if (crtc->state->event && !crtc->state->active) {
  386. spin_lock_irqsave(&crtc->dev->event_lock, flags);
  387. drm_crtc_send_vblank_event(crtc, crtc->state->event);
  388. crtc->state->event = NULL;
  389. spin_unlock_irqrestore(&crtc->dev->event_lock, flags);
  390. }
  391. }
  392. static void mtk_crtc_ddp_config(struct drm_crtc *crtc,
  393. struct cmdq_pkt *cmdq_handle)
  394. {
  395. struct mtk_crtc *mtk_crtc = to_mtk_crtc(crtc);
  396. struct mtk_crtc_state *state = to_mtk_crtc_state(mtk_crtc->base.state);
  397. struct mtk_ddp_comp *comp = mtk_crtc->ddp_comp[0];
  398. unsigned int i;
  399. unsigned int local_layer;
  400. /*
  401. * TODO: instead of updating the registers here, we should prepare
  402. * working registers in atomic_commit and let the hardware command
  403. * queue update module registers on vblank.
  404. */
  405. if (state->pending_config) {
  406. mtk_ddp_comp_config(comp, state->pending_width,
  407. state->pending_height,
  408. state->pending_vrefresh, 0,
  409. cmdq_handle);
  410. if (!cmdq_handle)
  411. state->pending_config = false;
  412. }
  413. if (mtk_crtc->pending_planes) {
  414. for (i = 0; i < mtk_crtc->layer_nr; i++) {
  415. struct drm_plane *plane = &mtk_crtc->planes[i];
  416. struct mtk_plane_state *plane_state;
  417. plane_state = to_mtk_plane_state(plane->state);
  418. if (!plane_state->pending.config)
  419. continue;
  420. comp = mtk_ddp_comp_for_plane(crtc, plane, &local_layer);
  421. if (comp)
  422. mtk_ddp_comp_layer_config(comp, local_layer,
  423. plane_state,
  424. cmdq_handle);
  425. if (!cmdq_handle)
  426. plane_state->pending.config = false;
  427. }
  428. if (!cmdq_handle)
  429. mtk_crtc->pending_planes = false;
  430. }
  431. if (mtk_crtc->pending_async_planes) {
  432. for (i = 0; i < mtk_crtc->layer_nr; i++) {
  433. struct drm_plane *plane = &mtk_crtc->planes[i];
  434. struct mtk_plane_state *plane_state;
  435. plane_state = to_mtk_plane_state(plane->state);
  436. if (!plane_state->pending.async_config)
  437. continue;
  438. comp = mtk_ddp_comp_for_plane(crtc, plane, &local_layer);
  439. if (comp)
  440. mtk_ddp_comp_layer_config(comp, local_layer,
  441. plane_state,
  442. cmdq_handle);
  443. if (!cmdq_handle)
  444. plane_state->pending.async_config = false;
  445. }
  446. if (!cmdq_handle)
  447. mtk_crtc->pending_async_planes = false;
  448. }
  449. }
  450. static void mtk_crtc_update_config(struct mtk_crtc *mtk_crtc, bool needs_vblank)
  451. {
  452. #if IS_REACHABLE(CONFIG_MTK_CMDQ)
  453. struct cmdq_pkt *cmdq_handle = &mtk_crtc->cmdq_handle;
  454. #endif
  455. struct drm_crtc *crtc = &mtk_crtc->base;
  456. struct mtk_drm_private *priv = crtc->dev->dev_private;
  457. unsigned int pending_planes = 0, pending_async_planes = 0;
  458. int i;
  459. unsigned long flags;
  460. mutex_lock(&mtk_crtc->hw_lock);
  461. spin_lock_irqsave(&mtk_crtc->config_lock, flags);
  462. mtk_crtc->config_updating = true;
  463. spin_unlock_irqrestore(&mtk_crtc->config_lock, flags);
  464. if (needs_vblank)
  465. mtk_crtc->pending_needs_vblank = true;
  466. for (i = 0; i < mtk_crtc->layer_nr; i++) {
  467. struct drm_plane *plane = &mtk_crtc->planes[i];
  468. struct mtk_plane_state *plane_state;
  469. plane_state = to_mtk_plane_state(plane->state);
  470. if (plane_state->pending.dirty) {
  471. plane_state->pending.config = true;
  472. plane_state->pending.dirty = false;
  473. pending_planes |= BIT(i);
  474. } else if (plane_state->pending.async_dirty) {
  475. plane_state->pending.async_config = true;
  476. plane_state->pending.async_dirty = false;
  477. pending_async_planes |= BIT(i);
  478. }
  479. }
  480. if (pending_planes)
  481. mtk_crtc->pending_planes = true;
  482. if (pending_async_planes)
  483. mtk_crtc->pending_async_planes = true;
  484. if (priv->data->shadow_register) {
  485. mtk_mutex_acquire(mtk_crtc->mutex);
  486. mtk_crtc_ddp_config(crtc, NULL);
  487. mtk_mutex_release(mtk_crtc->mutex);
  488. }
  489. #if IS_REACHABLE(CONFIG_MTK_CMDQ)
  490. if (mtk_crtc->cmdq_client.chan) {
  491. mbox_flush(mtk_crtc->cmdq_client.chan, 2000);
  492. cmdq_handle->cmd_buf_size = 0;
  493. cmdq_pkt_clear_event(cmdq_handle, mtk_crtc->cmdq_event);
  494. cmdq_pkt_wfe(cmdq_handle, mtk_crtc->cmdq_event, false);
  495. mtk_crtc_ddp_config(crtc, cmdq_handle);
  496. cmdq_pkt_eoc(cmdq_handle);
  497. dma_sync_single_for_device(mtk_crtc->cmdq_client.chan->mbox->dev,
  498. cmdq_handle->pa_base,
  499. cmdq_handle->cmd_buf_size,
  500. DMA_TO_DEVICE);
  501. /*
  502. * CMDQ command should execute in next 3 vblank.
  503. * One vblank interrupt before send message (occasionally)
  504. * and one vblank interrupt after cmdq done,
  505. * so it's timeout after 3 vblank interrupt.
  506. * If it fail to execute in next 3 vblank, timeout happen.
  507. */
  508. mtk_crtc->cmdq_vblank_cnt = 3;
  509. spin_lock_irqsave(&mtk_crtc->config_lock, flags);
  510. mtk_crtc->config_updating = false;
  511. spin_unlock_irqrestore(&mtk_crtc->config_lock, flags);
  512. mbox_send_message(mtk_crtc->cmdq_client.chan, cmdq_handle);
  513. mbox_client_txdone(mtk_crtc->cmdq_client.chan, 0);
  514. goto update_config_out;
  515. }
  516. #endif
  517. spin_lock_irqsave(&mtk_crtc->config_lock, flags);
  518. mtk_crtc->config_updating = false;
  519. spin_unlock_irqrestore(&mtk_crtc->config_lock, flags);
  520. #if IS_REACHABLE(CONFIG_MTK_CMDQ)
  521. update_config_out:
  522. #endif
  523. mutex_unlock(&mtk_crtc->hw_lock);
  524. }
  525. static void mtk_crtc_ddp_irq(void *data)
  526. {
  527. struct drm_crtc *crtc = data;
  528. struct mtk_crtc *mtk_crtc = to_mtk_crtc(crtc);
  529. struct mtk_drm_private *priv = crtc->dev->dev_private;
  530. #if IS_REACHABLE(CONFIG_MTK_CMDQ)
  531. if (!priv->data->shadow_register && !mtk_crtc->cmdq_client.chan)
  532. mtk_crtc_ddp_config(crtc, NULL);
  533. else if (mtk_crtc->cmdq_vblank_cnt > 0 && --mtk_crtc->cmdq_vblank_cnt == 0)
  534. DRM_ERROR("mtk_crtc %d CMDQ execute command timeout!\n",
  535. drm_crtc_index(&mtk_crtc->base));
  536. #else
  537. if (!priv->data->shadow_register)
  538. mtk_crtc_ddp_config(crtc, NULL);
  539. #endif
  540. mtk_drm_finish_page_flip(mtk_crtc);
  541. }
  542. static int mtk_crtc_enable_vblank(struct drm_crtc *crtc)
  543. {
  544. struct mtk_crtc *mtk_crtc = to_mtk_crtc(crtc);
  545. struct mtk_ddp_comp *comp = mtk_crtc->ddp_comp[0];
  546. mtk_ddp_comp_enable_vblank(comp);
  547. return 0;
  548. }
  549. static void mtk_crtc_disable_vblank(struct drm_crtc *crtc)
  550. {
  551. struct mtk_crtc *mtk_crtc = to_mtk_crtc(crtc);
  552. struct mtk_ddp_comp *comp = mtk_crtc->ddp_comp[0];
  553. mtk_ddp_comp_disable_vblank(comp);
  554. }
  555. static void mtk_crtc_update_output(struct drm_crtc *crtc,
  556. struct drm_atomic_state *state)
  557. {
  558. int crtc_index = drm_crtc_index(crtc);
  559. int i;
  560. struct device *dev;
  561. struct drm_crtc_state *crtc_state = state->crtcs[crtc_index].new_state;
  562. struct mtk_crtc *mtk_crtc = to_mtk_crtc(crtc);
  563. struct mtk_drm_private *priv;
  564. unsigned int encoder_mask = crtc_state->encoder_mask;
  565. if (!crtc_state->connectors_changed)
  566. return;
  567. if (!mtk_crtc->num_conn_routes)
  568. return;
  569. priv = ((struct mtk_drm_private *)crtc->dev->dev_private)->all_drm_private[crtc_index];
  570. dev = priv->dev;
  571. dev_dbg(dev, "connector change:%d, encoder mask:0x%x for crtc:%d\n",
  572. crtc_state->connectors_changed, encoder_mask, crtc_index);
  573. for (i = 0; i < mtk_crtc->num_conn_routes; i++) {
  574. unsigned int comp_id = mtk_crtc->conn_routes[i].route_ddp;
  575. struct mtk_ddp_comp *comp = &priv->ddp_comp[comp_id];
  576. if (comp->encoder_index >= 0 &&
  577. (encoder_mask & BIT(comp->encoder_index))) {
  578. mtk_crtc->ddp_comp[mtk_crtc->ddp_comp_nr - 1] = comp;
  579. dev_dbg(dev, "Add comp_id: %d at path index %d\n",
  580. comp->id, mtk_crtc->ddp_comp_nr - 1);
  581. break;
  582. }
  583. }
  584. }
  585. int mtk_crtc_plane_check(struct drm_crtc *crtc, struct drm_plane *plane,
  586. struct mtk_plane_state *state)
  587. {
  588. unsigned int local_layer;
  589. struct mtk_ddp_comp *comp;
  590. comp = mtk_ddp_comp_for_plane(crtc, plane, &local_layer);
  591. if (comp)
  592. return mtk_ddp_comp_layer_check(comp, local_layer, state);
  593. return 0;
  594. }
  595. void mtk_crtc_plane_disable(struct drm_crtc *crtc, struct drm_plane *plane)
  596. {
  597. #if IS_REACHABLE(CONFIG_MTK_CMDQ)
  598. struct mtk_crtc *mtk_crtc = to_mtk_crtc(crtc);
  599. struct mtk_plane_state *plane_state = to_mtk_plane_state(plane->state);
  600. int i;
  601. /* no need to wait for disabling the plane by CPU */
  602. if (!mtk_crtc->cmdq_client.chan)
  603. return;
  604. if (!mtk_crtc->enabled)
  605. return;
  606. /* set pending plane state to disabled */
  607. for (i = 0; i < mtk_crtc->layer_nr; i++) {
  608. struct drm_plane *mtk_plane = &mtk_crtc->planes[i];
  609. struct mtk_plane_state *mtk_plane_state = to_mtk_plane_state(mtk_plane->state);
  610. if (mtk_plane->index == plane->index) {
  611. memcpy(mtk_plane_state, plane_state, sizeof(*plane_state));
  612. break;
  613. }
  614. }
  615. mtk_crtc_update_config(mtk_crtc, false);
  616. /* wait for planes to be disabled by CMDQ */
  617. wait_event_timeout(mtk_crtc->cb_blocking_queue,
  618. mtk_crtc->cmdq_vblank_cnt == 0,
  619. msecs_to_jiffies(500));
  620. #endif
  621. }
  622. void mtk_crtc_async_update(struct drm_crtc *crtc, struct drm_plane *plane,
  623. struct drm_atomic_state *state)
  624. {
  625. struct mtk_crtc *mtk_crtc = to_mtk_crtc(crtc);
  626. if (!mtk_crtc->enabled)
  627. return;
  628. mtk_crtc_update_config(mtk_crtc, false);
  629. }
  630. static void mtk_crtc_atomic_enable(struct drm_crtc *crtc,
  631. struct drm_atomic_state *state)
  632. {
  633. struct mtk_crtc *mtk_crtc = to_mtk_crtc(crtc);
  634. struct mtk_ddp_comp *comp = mtk_crtc->ddp_comp[0];
  635. int ret;
  636. DRM_DEBUG_DRIVER("%s %d\n", __func__, crtc->base.id);
  637. ret = mtk_ddp_comp_power_on(comp);
  638. if (ret < 0) {
  639. DRM_DEV_ERROR(comp->dev, "Failed to enable power domain: %d\n", ret);
  640. return;
  641. }
  642. mtk_crtc_update_output(crtc, state);
  643. ret = mtk_crtc_ddp_hw_init(mtk_crtc);
  644. if (ret) {
  645. mtk_ddp_comp_power_off(comp);
  646. return;
  647. }
  648. drm_crtc_vblank_on(crtc);
  649. mtk_crtc->enabled = true;
  650. }
  651. static void mtk_crtc_atomic_disable(struct drm_crtc *crtc,
  652. struct drm_atomic_state *state)
  653. {
  654. struct mtk_crtc *mtk_crtc = to_mtk_crtc(crtc);
  655. struct mtk_ddp_comp *comp = mtk_crtc->ddp_comp[0];
  656. int i;
  657. DRM_DEBUG_DRIVER("%s %d\n", __func__, crtc->base.id);
  658. if (!mtk_crtc->enabled)
  659. return;
  660. /* Set all pending plane state to disabled */
  661. for (i = 0; i < mtk_crtc->layer_nr; i++) {
  662. struct drm_plane *plane = &mtk_crtc->planes[i];
  663. struct mtk_plane_state *plane_state;
  664. plane_state = to_mtk_plane_state(plane->state);
  665. plane_state->pending.enable = false;
  666. plane_state->pending.config = true;
  667. }
  668. mtk_crtc->pending_planes = true;
  669. mtk_crtc_update_config(mtk_crtc, false);
  670. #if IS_REACHABLE(CONFIG_MTK_CMDQ)
  671. /* Wait for planes to be disabled by cmdq */
  672. if (mtk_crtc->cmdq_client.chan)
  673. wait_event_timeout(mtk_crtc->cb_blocking_queue,
  674. mtk_crtc->cmdq_vblank_cnt == 0,
  675. msecs_to_jiffies(500));
  676. #endif
  677. /* Wait for planes to be disabled */
  678. drm_crtc_wait_one_vblank(crtc);
  679. drm_crtc_vblank_off(crtc);
  680. mtk_crtc_ddp_hw_fini(mtk_crtc);
  681. mtk_ddp_comp_power_off(comp);
  682. mtk_crtc->enabled = false;
  683. }
  684. static void mtk_crtc_atomic_begin(struct drm_crtc *crtc,
  685. struct drm_atomic_state *state)
  686. {
  687. struct drm_crtc_state *crtc_state = drm_atomic_get_new_crtc_state(state,
  688. crtc);
  689. struct mtk_crtc_state *mtk_crtc_state = to_mtk_crtc_state(crtc_state);
  690. struct mtk_crtc *mtk_crtc = to_mtk_crtc(crtc);
  691. unsigned long flags;
  692. if (mtk_crtc->event && mtk_crtc_state->base.event)
  693. DRM_ERROR("new event while there is still a pending event\n");
  694. if (mtk_crtc_state->base.event) {
  695. mtk_crtc_state->base.event->pipe = drm_crtc_index(crtc);
  696. WARN_ON(drm_crtc_vblank_get(crtc) != 0);
  697. spin_lock_irqsave(&crtc->dev->event_lock, flags);
  698. mtk_crtc->event = mtk_crtc_state->base.event;
  699. spin_unlock_irqrestore(&crtc->dev->event_lock, flags);
  700. mtk_crtc_state->base.event = NULL;
  701. }
  702. }
  703. static void mtk_crtc_atomic_flush(struct drm_crtc *crtc,
  704. struct drm_atomic_state *state)
  705. {
  706. struct mtk_crtc *mtk_crtc = to_mtk_crtc(crtc);
  707. int i;
  708. if (crtc->state->color_mgmt_changed)
  709. for (i = 0; i < mtk_crtc->ddp_comp_nr; i++) {
  710. mtk_ddp_gamma_set(mtk_crtc->ddp_comp[i], crtc->state);
  711. mtk_ddp_ctm_set(mtk_crtc->ddp_comp[i], crtc->state);
  712. }
  713. mtk_crtc_update_config(mtk_crtc, !!mtk_crtc->event);
  714. }
  715. static const struct drm_crtc_funcs mtk_crtc_funcs = {
  716. .set_config = drm_atomic_helper_set_config,
  717. .page_flip = drm_atomic_helper_page_flip,
  718. .destroy = mtk_crtc_destroy,
  719. .reset = mtk_crtc_reset,
  720. .atomic_duplicate_state = mtk_crtc_duplicate_state,
  721. .atomic_destroy_state = mtk_crtc_destroy_state,
  722. .enable_vblank = mtk_crtc_enable_vblank,
  723. .disable_vblank = mtk_crtc_disable_vblank,
  724. };
  725. static const struct drm_crtc_helper_funcs mtk_crtc_helper_funcs = {
  726. .mode_fixup = mtk_crtc_mode_fixup,
  727. .mode_set_nofb = mtk_crtc_mode_set_nofb,
  728. .mode_valid = mtk_crtc_mode_valid,
  729. .atomic_begin = mtk_crtc_atomic_begin,
  730. .atomic_flush = mtk_crtc_atomic_flush,
  731. .atomic_enable = mtk_crtc_atomic_enable,
  732. .atomic_disable = mtk_crtc_atomic_disable,
  733. };
  734. static int mtk_crtc_init(struct drm_device *drm, struct mtk_crtc *mtk_crtc,
  735. unsigned int pipe)
  736. {
  737. struct drm_plane *primary = NULL;
  738. struct drm_plane *cursor = NULL;
  739. int i, ret;
  740. for (i = 0; i < mtk_crtc->layer_nr; i++) {
  741. if (mtk_crtc->planes[i].type == DRM_PLANE_TYPE_PRIMARY)
  742. primary = &mtk_crtc->planes[i];
  743. else if (mtk_crtc->planes[i].type == DRM_PLANE_TYPE_CURSOR)
  744. cursor = &mtk_crtc->planes[i];
  745. }
  746. ret = drm_crtc_init_with_planes(drm, &mtk_crtc->base, primary, cursor,
  747. &mtk_crtc_funcs, NULL);
  748. if (ret)
  749. goto err_cleanup_crtc;
  750. drm_crtc_helper_add(&mtk_crtc->base, &mtk_crtc_helper_funcs);
  751. return 0;
  752. err_cleanup_crtc:
  753. drm_crtc_cleanup(&mtk_crtc->base);
  754. return ret;
  755. }
  756. static int mtk_crtc_num_comp_planes(struct mtk_crtc *mtk_crtc, int comp_idx)
  757. {
  758. struct mtk_ddp_comp *comp;
  759. if (comp_idx > 1)
  760. return 0;
  761. comp = mtk_crtc->ddp_comp[comp_idx];
  762. if (!comp->funcs)
  763. return 0;
  764. if (comp_idx == 1 && !comp->funcs->bgclr_in_on)
  765. return 0;
  766. return mtk_ddp_comp_layer_nr(comp);
  767. }
  768. static inline
  769. enum drm_plane_type mtk_crtc_plane_type(unsigned int plane_idx,
  770. unsigned int num_planes)
  771. {
  772. if (plane_idx == 0)
  773. return DRM_PLANE_TYPE_PRIMARY;
  774. else if (plane_idx == (num_planes - 1))
  775. return DRM_PLANE_TYPE_CURSOR;
  776. else
  777. return DRM_PLANE_TYPE_OVERLAY;
  778. }
  779. static int mtk_crtc_init_comp_planes(struct drm_device *drm_dev,
  780. struct mtk_crtc *mtk_crtc,
  781. int comp_idx, int pipe)
  782. {
  783. int num_planes = mtk_crtc_num_comp_planes(mtk_crtc, comp_idx);
  784. struct mtk_ddp_comp *comp = mtk_crtc->ddp_comp[comp_idx];
  785. int i, ret;
  786. for (i = 0; i < num_planes; i++) {
  787. ret = mtk_plane_init(drm_dev,
  788. &mtk_crtc->planes[mtk_crtc->layer_nr],
  789. BIT(pipe),
  790. mtk_crtc_plane_type(mtk_crtc->layer_nr, num_planes),
  791. mtk_ddp_comp_supported_rotations(comp),
  792. mtk_ddp_comp_get_blend_modes(comp),
  793. mtk_ddp_comp_get_formats(comp),
  794. mtk_ddp_comp_get_num_formats(comp),
  795. mtk_ddp_comp_is_afbc_supported(comp), i);
  796. if (ret)
  797. return ret;
  798. mtk_crtc->layer_nr++;
  799. }
  800. return 0;
  801. }
  802. struct device *mtk_crtc_dma_dev_get(struct drm_crtc *crtc)
  803. {
  804. struct mtk_crtc *mtk_crtc = NULL;
  805. if (!crtc)
  806. return NULL;
  807. mtk_crtc = to_mtk_crtc(crtc);
  808. if (!mtk_crtc)
  809. return NULL;
  810. return mtk_crtc->dma_dev;
  811. }
  812. int mtk_crtc_create(struct drm_device *drm_dev, const unsigned int *path,
  813. unsigned int path_len, int priv_data_index,
  814. const struct mtk_drm_route *conn_routes,
  815. unsigned int num_conn_routes)
  816. {
  817. struct mtk_drm_private *priv = drm_dev->dev_private;
  818. struct device *dev = drm_dev->dev;
  819. struct mtk_crtc *mtk_crtc;
  820. unsigned int num_comp_planes = 0;
  821. int ret;
  822. int i;
  823. bool has_ctm = false;
  824. uint gamma_lut_size = 0;
  825. struct drm_crtc *tmp;
  826. int crtc_i = 0;
  827. if (!path)
  828. return 0;
  829. priv = priv->all_drm_private[priv_data_index];
  830. drm_for_each_crtc(tmp, drm_dev)
  831. crtc_i++;
  832. for (i = 0; i < path_len; i++) {
  833. enum mtk_ddp_comp_id comp_id = path[i];
  834. struct device_node *node;
  835. struct mtk_ddp_comp *comp;
  836. node = priv->comp_node[comp_id];
  837. comp = &priv->ddp_comp[comp_id];
  838. /* Not all drm components have a DTS device node, such as ovl_adaptor,
  839. * which is the drm bring up sub driver
  840. */
  841. if (!node && comp_id != DDP_COMPONENT_DRM_OVL_ADAPTOR) {
  842. dev_info(dev,
  843. "Not creating crtc %d because component %d is disabled or missing\n",
  844. crtc_i, comp_id);
  845. return 0;
  846. }
  847. if (!comp->dev) {
  848. dev_err(dev, "Component %pOF not initialized\n", node);
  849. return -ENODEV;
  850. }
  851. }
  852. mtk_crtc = devm_kzalloc(dev, sizeof(*mtk_crtc), GFP_KERNEL);
  853. if (!mtk_crtc)
  854. return -ENOMEM;
  855. mtk_crtc->mmsys_dev = priv->mmsys_dev;
  856. mtk_crtc->ddp_comp_nr = path_len;
  857. mtk_crtc->ddp_comp = devm_kcalloc(dev,
  858. mtk_crtc->ddp_comp_nr + (conn_routes ? 1 : 0),
  859. sizeof(*mtk_crtc->ddp_comp),
  860. GFP_KERNEL);
  861. if (!mtk_crtc->ddp_comp)
  862. return -ENOMEM;
  863. mtk_crtc->mutex = mtk_mutex_get(priv->mutex_dev);
  864. if (IS_ERR(mtk_crtc->mutex)) {
  865. ret = PTR_ERR(mtk_crtc->mutex);
  866. dev_err(dev, "Failed to get mutex: %d\n", ret);
  867. return ret;
  868. }
  869. for (i = 0; i < mtk_crtc->ddp_comp_nr; i++) {
  870. unsigned int comp_id = path[i];
  871. struct mtk_ddp_comp *comp;
  872. comp = &priv->ddp_comp[comp_id];
  873. mtk_crtc->ddp_comp[i] = comp;
  874. if (comp->funcs) {
  875. if (comp->funcs->gamma_set && comp->funcs->gamma_get_lut_size) {
  876. unsigned int lut_sz = mtk_ddp_gamma_get_lut_size(comp);
  877. if (lut_sz)
  878. gamma_lut_size = lut_sz;
  879. }
  880. if (comp->funcs->ctm_set)
  881. has_ctm = true;
  882. }
  883. mtk_ddp_comp_register_vblank_cb(comp, mtk_crtc_ddp_irq,
  884. &mtk_crtc->base);
  885. }
  886. for (i = 0; i < mtk_crtc->ddp_comp_nr; i++)
  887. num_comp_planes += mtk_crtc_num_comp_planes(mtk_crtc, i);
  888. mtk_crtc->planes = devm_kcalloc(dev, num_comp_planes,
  889. sizeof(struct drm_plane), GFP_KERNEL);
  890. if (!mtk_crtc->planes)
  891. return -ENOMEM;
  892. for (i = 0; i < mtk_crtc->ddp_comp_nr; i++) {
  893. ret = mtk_crtc_init_comp_planes(drm_dev, mtk_crtc, i, crtc_i);
  894. if (ret)
  895. return ret;
  896. }
  897. /*
  898. * Default to use the first component as the dma dev.
  899. * In the case of ovl_adaptor sub driver, it needs to use the
  900. * dma_dev_get function to get representative dma dev.
  901. */
  902. mtk_crtc->dma_dev = mtk_ddp_comp_dma_dev_get(&priv->ddp_comp[path[0]]);
  903. ret = mtk_crtc_init(drm_dev, mtk_crtc, crtc_i);
  904. if (ret < 0)
  905. return ret;
  906. if (gamma_lut_size)
  907. drm_mode_crtc_set_gamma_size(&mtk_crtc->base, gamma_lut_size);
  908. drm_crtc_enable_color_mgmt(&mtk_crtc->base, 0, has_ctm, gamma_lut_size);
  909. mutex_init(&mtk_crtc->hw_lock);
  910. spin_lock_init(&mtk_crtc->config_lock);
  911. #if IS_REACHABLE(CONFIG_MTK_CMDQ)
  912. i = priv->mbox_index++;
  913. mtk_crtc->cmdq_client.client.dev = mtk_crtc->mmsys_dev;
  914. mtk_crtc->cmdq_client.client.tx_block = false;
  915. mtk_crtc->cmdq_client.client.knows_txdone = true;
  916. mtk_crtc->cmdq_client.client.rx_callback = ddp_cmdq_cb;
  917. mtk_crtc->cmdq_client.chan =
  918. mbox_request_channel(&mtk_crtc->cmdq_client.client, i);
  919. if (IS_ERR(mtk_crtc->cmdq_client.chan)) {
  920. dev_dbg(dev, "mtk_crtc %d failed to create mailbox client, writing register by CPU now\n",
  921. drm_crtc_index(&mtk_crtc->base));
  922. mtk_crtc->cmdq_client.chan = NULL;
  923. }
  924. if (mtk_crtc->cmdq_client.chan) {
  925. ret = of_property_read_u32_index(priv->mutex_node,
  926. "mediatek,gce-events",
  927. i,
  928. &mtk_crtc->cmdq_event);
  929. if (ret) {
  930. dev_dbg(dev, "mtk_crtc %d failed to get mediatek,gce-events property\n",
  931. drm_crtc_index(&mtk_crtc->base));
  932. mbox_free_channel(mtk_crtc->cmdq_client.chan);
  933. mtk_crtc->cmdq_client.chan = NULL;
  934. } else {
  935. ret = cmdq_pkt_create(&mtk_crtc->cmdq_client,
  936. &mtk_crtc->cmdq_handle,
  937. PAGE_SIZE);
  938. if (ret) {
  939. dev_dbg(dev, "mtk_crtc %d failed to create cmdq packet\n",
  940. drm_crtc_index(&mtk_crtc->base));
  941. mbox_free_channel(mtk_crtc->cmdq_client.chan);
  942. mtk_crtc->cmdq_client.chan = NULL;
  943. }
  944. }
  945. /* for sending blocking cmd in crtc disable */
  946. init_waitqueue_head(&mtk_crtc->cb_blocking_queue);
  947. }
  948. #endif
  949. if (conn_routes) {
  950. for (i = 0; i < num_conn_routes; i++) {
  951. unsigned int comp_id = conn_routes[i].route_ddp;
  952. struct device_node *node = priv->comp_node[comp_id];
  953. struct mtk_ddp_comp *comp = &priv->ddp_comp[comp_id];
  954. if (!comp->dev) {
  955. dev_dbg(dev, "comp_id:%d, Component %pOF not initialized\n",
  956. comp_id, node);
  957. /* mark encoder_index to -1, if route comp device is not enabled */
  958. comp->encoder_index = -1;
  959. continue;
  960. }
  961. mtk_ddp_comp_encoder_index_set(&priv->ddp_comp[comp_id]);
  962. }
  963. mtk_crtc->num_conn_routes = num_conn_routes;
  964. mtk_crtc->conn_routes = conn_routes;
  965. /* increase ddp_comp_nr at the end of mtk_crtc_create */
  966. mtk_crtc->ddp_comp_nr++;
  967. }
  968. return 0;
  969. }