cmdq_platform.c 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567
  1. #include "cmdq_platform.h"
  2. #include "cmdq_core.h"
  3. #include "cmdq_reg.h"
  4. #include "cmdq_device.h"
  5. #include <linux/vmalloc.h>
  6. /* #include <mach/mt_clkmgr.h> */
  7. #include <linux/seq_file.h>
  8. #include <mt-plat/mt_boot.h>
  9. #include <mt-plat/mt_chip.h>
  10. const bool cmdq_core_support_sync_non_suspendable(void)
  11. {
  12. return true;
  13. }
  14. const bool cmdq_core_support_wait_and_receive_event_in_same_tick(void)
  15. {
  16. enum chip_sw_ver ver = mt_get_chip_sw_ver();
  17. bool support = false;
  18. if (CHIP_SW_VER_02 <= ver) {
  19. /* SW V2 */
  20. support = true;
  21. } else if (CHIP_SW_VER_01 <= ver) {
  22. support = false;
  23. }
  24. return support;
  25. }
  26. const uint32_t cmdq_core_get_subsys_LSB_in_argA(void)
  27. {
  28. return 16;
  29. }
  30. bool cmdq_core_is_request_from_user_space(const enum CMDQ_SCENARIO_ENUM scenario)
  31. {
  32. switch (scenario) {
  33. case CMDQ_SCENARIO_USER_DISP_COLOR:
  34. case CMDQ_SCENARIO_USER_MDP:
  35. case CMDQ_SCENARIO_USER_SPACE: /* phased out */
  36. return true;
  37. default:
  38. return false;
  39. }
  40. return false;
  41. }
  42. bool cmdq_core_is_disp_scenario(const enum CMDQ_SCENARIO_ENUM scenario)
  43. {
  44. switch (scenario) {
  45. case CMDQ_SCENARIO_PRIMARY_DISP:
  46. case CMDQ_SCENARIO_PRIMARY_MEMOUT:
  47. case CMDQ_SCENARIO_PRIMARY_ALL:
  48. case CMDQ_SCENARIO_SUB_DISP:
  49. case CMDQ_SCENARIO_SUB_MEMOUT:
  50. case CMDQ_SCENARIO_SUB_ALL:
  51. case CMDQ_SCENARIO_MHL_DISP:
  52. case CMDQ_SCENARIO_RDMA0_DISP:
  53. case CMDQ_SCENARIO_RDMA2_DISP:
  54. case CMDQ_SCENARIO_DISP_CONFIG_AAL:
  55. case CMDQ_SCENARIO_DISP_CONFIG_PRIMARY_GAMMA:
  56. case CMDQ_SCENARIO_DISP_CONFIG_SUB_GAMMA:
  57. case CMDQ_SCENARIO_DISP_CONFIG_PRIMARY_DITHER:
  58. case CMDQ_SCENARIO_DISP_CONFIG_SUB_DITHER:
  59. case CMDQ_SCENARIO_DISP_CONFIG_PRIMARY_PWM:
  60. case CMDQ_SCENARIO_DISP_CONFIG_SUB_PWM:
  61. case CMDQ_SCENARIO_DISP_CONFIG_PRIMARY_PQ:
  62. case CMDQ_SCENARIO_DISP_CONFIG_SUB_PQ:
  63. case CMDQ_SCENARIO_DISP_CONFIG_OD:
  64. case CMDQ_SCENARIO_DISP_ESD_CHECK:
  65. case CMDQ_SCENARIO_DISP_SCREEN_CAPTURE:
  66. case CMDQ_SCENARIO_DISP_MIRROR_MODE:
  67. /* color path */
  68. case CMDQ_SCENARIO_DISP_COLOR:
  69. case CMDQ_SCENARIO_USER_DISP_COLOR:
  70. /* secure path */
  71. case CMDQ_SCENARIO_DISP_PRIMARY_DISABLE_SECURE_PATH:
  72. case CMDQ_SCENARIO_DISP_SUB_DISABLE_SECURE_PATH:
  73. return true;
  74. default:
  75. return false;
  76. }
  77. /* freely dispatch */
  78. return false;
  79. }
  80. bool cmdq_core_should_enable_prefetch(enum CMDQ_SCENARIO_ENUM scenario)
  81. {
  82. switch (scenario) {
  83. case CMDQ_SCENARIO_PRIMARY_DISP:
  84. case CMDQ_SCENARIO_PRIMARY_ALL:
  85. case CMDQ_SCENARIO_DEBUG_PREFETCH: /* HACK: force debug into 0/1 thread */
  86. /* any path that connects to Primary DISP HW */
  87. /* should enable prefetch. */
  88. /* MEMOUT scenarios does not. */
  89. /* Also, since thread 0/1 shares one prefetch buffer, */
  90. /* we allow only PRIMARY path to use prefetch. */
  91. return true;
  92. default:
  93. return false;
  94. }
  95. return false;
  96. }
  97. bool cmdq_core_should_profile(enum CMDQ_SCENARIO_ENUM scenario)
  98. {
  99. #ifdef CMDQ_GPR_SUPPORT
  100. /* may need to modify
  101. switch (scenario) {
  102. case CMDQ_SCENARIO_PRIMARY_DISP:
  103. case CMDQ_SCENARIO_PRIMARY_ALL:
  104. case CMDQ_SCENARIO_DEBUG_PREFETCH:
  105. case CMDQ_SCENARIO_DEBUG:
  106. return true;
  107. default:
  108. return false;
  109. }
  110. */
  111. return false;
  112. #else
  113. /* note command profile method depends on GPR */
  114. CMDQ_ERR("func:%s failed since CMDQ doesn't support GPR\n", __func__);
  115. return false;
  116. #endif
  117. }
  118. const bool cmdq_core_is_a_secure_thread(const int32_t thread)
  119. {
  120. /*
  121. ** secure HW Thread 12/13/14
  122. ** 12:disp primary path
  123. ** 13:disp subdisplay path
  124. ** 14:MDP path
  125. */
  126. #ifdef CMDQ_SECURE_PATH_SUPPORT
  127. if ((CMDQ_MIN_SECURE_THREAD_ID <= thread) &&
  128. (CMDQ_MIN_SECURE_THREAD_ID + CMDQ_MAX_SECURE_THREAD_COUNT > thread)) {
  129. return true;
  130. }
  131. #endif
  132. return false;
  133. }
  134. /*
  135. ** HW thread 15 is normal world & secure world IRQ notify thread
  136. */
  137. const bool cmdq_core_is_valid_notify_thread_for_secure_path(const int32_t thread)
  138. {
  139. #ifdef CMDQ_SECURE_PATH_SUPPORT
  140. return (15 == thread) ? (true) : (false);
  141. #else
  142. return false;
  143. #endif
  144. }
  145. int cmdq_core_get_thread_index_from_scenario_and_secure_data(enum CMDQ_SCENARIO_ENUM scenario,
  146. const bool secure)
  147. {
  148. #ifdef CMDQ_SECURE_PATH_SUPPORT
  149. if (!secure && CMDQ_SCENARIO_SECURE_NOTIFY_LOOP == scenario)
  150. return 15;
  151. #endif
  152. if (!secure)
  153. return cmdq_core_disp_thread_index_from_scenario(scenario);
  154. /* dispatch secure thread according to scenario */
  155. switch (scenario) {
  156. case CMDQ_SCENARIO_DISP_PRIMARY_DISABLE_SECURE_PATH:
  157. case CMDQ_SCENARIO_PRIMARY_DISP:
  158. case CMDQ_SCENARIO_PRIMARY_ALL:
  159. case CMDQ_SCENARIO_RDMA0_DISP:
  160. case CMDQ_SCENARIO_DEBUG_PREFETCH:
  161. /* CMDQ_MIN_SECURE_THREAD_ID */
  162. return 12;
  163. case CMDQ_SCENARIO_DISP_SUB_DISABLE_SECURE_PATH:
  164. case CMDQ_SCENARIO_SUB_DISP:
  165. case CMDQ_SCENARIO_SUB_MEMOUT:
  166. case CMDQ_SCENARIO_SUB_ALL:
  167. case CMDQ_SCENARIO_MHL_DISP:
  168. /* because mirror mode and sub disp never use at the same time in secure path, */
  169. /* dispatch to same HW thread */
  170. case CMDQ_SCENARIO_DISP_MIRROR_MODE:
  171. return 13;
  172. case CMDQ_SCENARIO_USER_MDP:
  173. case CMDQ_SCENARIO_USER_SPACE:
  174. case CMDQ_SCENARIO_DEBUG:
  175. /* because there is one input engine for MDP, reserve one secure thread is enough */
  176. return 14;
  177. default:
  178. CMDQ_ERR("no dedicated secure thread for senario:%d\n", scenario);
  179. return CMDQ_INVALID_THREAD;
  180. }
  181. }
  182. int cmdq_core_disp_thread_index_from_scenario(enum CMDQ_SCENARIO_ENUM scenario)
  183. {
  184. if (cmdq_core_should_enable_prefetch(scenario))
  185. return 0;
  186. switch (scenario) {
  187. case CMDQ_SCENARIO_PRIMARY_DISP:
  188. case CMDQ_SCENARIO_PRIMARY_ALL:
  189. case CMDQ_SCENARIO_DISP_CONFIG_AAL:
  190. case CMDQ_SCENARIO_DISP_CONFIG_PRIMARY_GAMMA:
  191. case CMDQ_SCENARIO_DISP_CONFIG_PRIMARY_DITHER:
  192. case CMDQ_SCENARIO_DISP_CONFIG_PRIMARY_PWM:
  193. case CMDQ_SCENARIO_DISP_CONFIG_PRIMARY_PQ:
  194. case CMDQ_SCENARIO_DISP_CONFIG_OD:
  195. case CMDQ_SCENARIO_RDMA0_DISP:
  196. case CMDQ_SCENARIO_DEBUG_PREFETCH: /* HACK: force debug into 0/1 thread */
  197. /* primary config: thread 0 */
  198. return 0;
  199. case CMDQ_SCENARIO_SUB_DISP:
  200. case CMDQ_SCENARIO_SUB_MEMOUT:
  201. case CMDQ_SCENARIO_SUB_ALL:
  202. case CMDQ_SCENARIO_MHL_DISP:
  203. case CMDQ_SCENARIO_RDMA2_DISP:
  204. case CMDQ_SCENARIO_DISP_CONFIG_SUB_GAMMA:
  205. case CMDQ_SCENARIO_DISP_CONFIG_SUB_DITHER:
  206. case CMDQ_SCENARIO_DISP_CONFIG_SUB_PQ:
  207. case CMDQ_SCENARIO_DISP_CONFIG_SUB_PWM:
  208. /* when HW thread 0 enables pre-fetch, */
  209. /* any thread 1 operation will let HW thread 0's behavior abnormally */
  210. /* forbid thread 1 */
  211. return 5;
  212. case CMDQ_SCENARIO_DISP_ESD_CHECK:
  213. return 2;
  214. case CMDQ_SCENARIO_DISP_SCREEN_CAPTURE:
  215. case CMDQ_SCENARIO_DISP_MIRROR_MODE:
  216. return 3;
  217. case CMDQ_SCENARIO_DISP_COLOR:
  218. case CMDQ_SCENARIO_USER_DISP_COLOR:
  219. return 4;
  220. default:
  221. /* freely dispatch */
  222. return CMDQ_INVALID_THREAD;
  223. }
  224. /* freely dispatch */
  225. return CMDQ_INVALID_THREAD;
  226. }
  227. enum CMDQ_HW_THREAD_PRIORITY_ENUM cmdq_core_priority_from_scenario(enum CMDQ_SCENARIO_ENUM scenario)
  228. {
  229. switch (scenario) {
  230. case CMDQ_SCENARIO_PRIMARY_DISP:
  231. case CMDQ_SCENARIO_PRIMARY_ALL:
  232. case CMDQ_SCENARIO_SUB_DISP:
  233. case CMDQ_SCENARIO_SUB_MEMOUT:
  234. case CMDQ_SCENARIO_SUB_ALL:
  235. case CMDQ_SCENARIO_MHL_DISP:
  236. case CMDQ_SCENARIO_RDMA0_DISP:
  237. case CMDQ_SCENARIO_DISP_MIRROR_MODE:
  238. /* color path */
  239. case CMDQ_SCENARIO_DISP_COLOR:
  240. case CMDQ_SCENARIO_USER_DISP_COLOR:
  241. case CMDQ_SCENARIO_RDMA2_DISP:
  242. case CMDQ_SCENARIO_DISP_CONFIG_AAL ... CMDQ_SCENARIO_DISP_CONFIG_OD:
  243. /* secure path * */
  244. case CMDQ_SCENARIO_DISP_PRIMARY_DISABLE_SECURE_PATH:
  245. case CMDQ_SCENARIO_DISP_SUB_DISABLE_SECURE_PATH:
  246. /* currently, a prefetch thread is always in high priority. */
  247. return CMDQ_THR_PRIO_DISPLAY_CONFIG;
  248. /* HACK: force debug into 0/1 thread */
  249. case CMDQ_SCENARIO_DEBUG_PREFETCH:
  250. return CMDQ_THR_PRIO_DISPLAY_CONFIG;
  251. case CMDQ_SCENARIO_DISP_ESD_CHECK:
  252. case CMDQ_SCENARIO_DISP_SCREEN_CAPTURE:
  253. return CMDQ_THR_PRIO_DISPLAY_ESD;
  254. default:
  255. /* other cases need exta logic, see below. */
  256. break;
  257. }
  258. if (CMDQ_SCENARIO_TRIGGER_LOOP == scenario)
  259. return CMDQ_THR_PRIO_DISPLAY_TRIGGER;
  260. else
  261. return CMDQ_THR_PRIO_NORMAL;
  262. }
  263. ssize_t cmdq_core_print_status_clock(char *buf)
  264. {
  265. int32_t length = 0;
  266. char *pBuffer = buf;
  267. #ifdef CMDQ_PWR_AWARE
  268. /* MT_CG_DISP0_MUTEX_32K is removed in this platform */
  269. pBuffer +=
  270. sprintf(pBuffer, "MT_CG_INFRA_GCE: %d\n", cmdq_core_clock_is_on(CMDQ_CLK_INFRA_GCE));
  271. #endif
  272. length = pBuffer - buf;
  273. return length;
  274. }
  275. void cmdq_core_print_status_seq_clock(struct seq_file *m)
  276. {
  277. #ifdef CMDQ_PWR_AWARE
  278. /* MT_CG_DISP0_MUTEX_32K is removed in this platform */
  279. seq_printf(m, "MT_CG_INFRA_GCE: %d\n", cmdq_core_clock_is_on(CMDQ_CLK_INFRA_GCE));
  280. #endif
  281. }
  282. void cmdq_core_enable_gce_clock_locked_impl(bool enable)
  283. {
  284. #ifdef CMDQ_PWR_AWARE
  285. if (enable) {
  286. CMDQ_VERBOSE("[CLOCK] Enable CMDQ(GCE) Clock\n");
  287. cmdq_core_enable_cmdq_clock_locked_impl(enable, CMDQ_DRIVER_DEVICE_NAME);
  288. } else {
  289. CMDQ_VERBOSE("[CLOCK] Disable CMDQ(GCE) Clock\n");
  290. cmdq_core_enable_cmdq_clock_locked_impl(enable, CMDQ_DRIVER_DEVICE_NAME);
  291. }
  292. #endif /* CMDQ_PWR_AWARE */
  293. }
  294. void cmdq_core_enable_cmdq_clock_locked_impl(bool enable, char *deviceName)
  295. {
  296. #ifdef CMDQ_PWR_AWARE
  297. if (enable) {
  298. /* enable_clock(MT_CG_INFRA_GCE, deviceName); */
  299. cmdq_core_enable_ccf_clk(CMDQ_CLK_INFRA_GCE);
  300. } else {
  301. /* disable_clock(MT_CG_INFRA_GCE, deviceName); */
  302. cmdq_core_disable_ccf_clk(CMDQ_CLK_INFRA_GCE);
  303. }
  304. #endif /* CMDQ_PWR_AWARE */
  305. }
  306. const char *cmdq_core_parse_error_module_by_hwflag_impl(struct TaskStruct *pTask)
  307. {
  308. const char *module = NULL;
  309. const uint32_t ISP_ONLY[2] = {
  310. ((1LL << CMDQ_ENG_ISP_IMGI) | (1LL << CMDQ_ENG_ISP_IMG2O)),
  311. ((1LL << CMDQ_ENG_ISP_IMGI) | (1LL << CMDQ_ENG_ISP_IMG2O) |
  312. (1LL << CMDQ_ENG_ISP_IMGO))
  313. };
  314. /* common part for both normal and secure path */
  315. /* for JPEG scenario, use HW flag is sufficient */
  316. if (pTask->engineFlag & (1LL << CMDQ_ENG_JPEG_ENC))
  317. module = "JPGENC";
  318. else if (pTask->engineFlag & (1LL << CMDQ_ENG_JPEG_DEC))
  319. module = "JPGDEC";
  320. else if ((ISP_ONLY[0] == pTask->engineFlag) || (ISP_ONLY[1] == pTask->engineFlag))
  321. module = "ISP_ONLY";
  322. /* for secure path, use HW flag is sufficient */
  323. do {
  324. if (false == pTask->secData.isSecure) {
  325. /* normal path, need parse current running instruciton for more detail */
  326. break;
  327. }
  328. /* check module group to dispatch it */
  329. if (cmdq_core_is_disp_scenario(pTask->scenario)) {
  330. module = "DISP";
  331. break;
  332. } else if (CMDQ_ENG_MDP_GROUP_FLAG(pTask->engineFlag)) {
  333. module = "MDP";
  334. break;
  335. }
  336. module = "CMDQ";
  337. } while (0);
  338. /* other case, we need to analysis instruction for more detail */
  339. return module;
  340. }
  341. void cmdq_core_dump_clock_gating(void)
  342. {
  343. uint32_t value[3] = { 0 };
  344. value[0] = CMDQ_REG_GET32(MMSYS_CONFIG_BASE_VA + 0x100);
  345. value[1] = CMDQ_REG_GET32(MMSYS_CONFIG_BASE_VA + 0x110);
  346. value[2] = CMDQ_REG_GET32(MMSYS_CONFIG_BASE_VA + 0x890);
  347. CMDQ_ERR("MMSYS_CG_CON0(deprecated): 0x%08x, MMSYS_CG_CON1: 0x%08x\n", value[0], value[1]);
  348. CMDQ_ERR("MMSYS_DUMMY_REG: 0x%08x\n", value[2]);
  349. #ifndef CONFIG_MTK_FPGA
  350. /* CMDQ_ERR("ISPSys clock state %d\n", subsys_is_on(SYS_ISP)); */
  351. /* CMDQ_ERR("DisSys clock state %d\n", subsys_is_on(SYS_DIS)); */
  352. /* CMDQ_ERR("VDESys clock state %d\n", subsys_is_on(SYS_VDE)); */
  353. /*
  354. CMDQ_ERR("ISPSys clock state %d\n", cmdq_core_subsys_is_on(CMDQ_SUBSYSCLK_SYS_ISP));
  355. CMDQ_ERR("DisSys clock state %d\n", cmdq_core_subsys_is_on(CMDQ_SUBSYSCLK_SYS_DIS));
  356. CMDQ_ERR("VDESys clock state %d\n", cmdq_core_subsys_is_on(CMDQ_SUBSYSCLK_SYS_VDE));
  357. */
  358. #endif
  359. }
  360. int cmdq_core_dump_smi(const int showSmiDump)
  361. {
  362. int isSMIHang = 0;
  363. #if defined(CMDQ_CONFIG_SMI) && !defined(CONFIG_MTK_FPGA)
  364. /*isSMIHang = smi_debug_bus_hanging_detect(
  365. SMI_DBG_DISPSYS | SMI_DBG_VDEC | SMI_DBG_IMGSYS | SMI_DBG_VENC | SMI_DBG_MJC,
  366. showSmiDump); */
  367. CMDQ_ERR("SMI Hang? = %d\n", isSMIHang);
  368. #else
  369. CMDQ_LOG("[WARNING]not enable SMI dump now\n");
  370. #endif
  371. return isSMIHang;
  372. }
  373. void cmdq_core_dump_secure_metadata(cmdqSecDataStruct *pSecData)
  374. {
  375. uint32_t i = 0;
  376. cmdqSecAddrMetadataStruct *pAddr = NULL;
  377. if (NULL == pSecData)
  378. return;
  379. pAddr = (cmdqSecAddrMetadataStruct *) (CMDQ_U32_PTR(pSecData->addrMetadatas));
  380. CMDQ_LOG("========= pSecData: %p dump =========\n", pSecData);
  381. CMDQ_LOG("metaData count:%d(%d), enginesNeedDAPC:0x%llx, enginesPortSecurity:0x%llx\n",
  382. pSecData->addrMetadataCount, pSecData->addrMetadataMaxCount,
  383. pSecData->enginesNeedDAPC, pSecData->enginesNeedPortSecurity);
  384. if (NULL == pAddr)
  385. return;
  386. for (i = 0; i < pSecData->addrMetadataCount; i++) {
  387. CMDQ_MSG
  388. ("meta idx:%d, inst idx:%d, type:%d, baseHandle:%x, offset:0x%08x, size:%d, port:%d\n",
  389. i, pAddr[i].instrIndex, pAddr[i].type, pAddr[i].baseHandle, pAddr[i].offset,
  390. pAddr[i].size, pAddr[i].port);
  391. }
  392. }
  393. uint64_t cmdq_rec_flag_from_scenario(enum CMDQ_SCENARIO_ENUM scn)
  394. {
  395. uint64_t flag = 0;
  396. switch (scn) {
  397. case CMDQ_SCENARIO_JPEG_DEC:
  398. flag = (1LL << CMDQ_ENG_JPEG_DEC);
  399. break;
  400. case CMDQ_SCENARIO_PRIMARY_DISP:
  401. flag = (1LL << CMDQ_ENG_DISP_OVL0) |
  402. (1LL << CMDQ_ENG_DISP_COLOR0) |
  403. (1LL << CMDQ_ENG_DISP_AAL) |
  404. (1LL << CMDQ_ENG_DISP_RDMA0) |
  405. (1LL << CMDQ_ENG_DISP_UFOE) | (1LL << CMDQ_ENG_DISP_DSI0_CMD);
  406. break;
  407. case CMDQ_SCENARIO_PRIMARY_MEMOUT:
  408. flag = ((1LL << CMDQ_ENG_DISP_OVL0) | (1LL << CMDQ_ENG_DISP_WDMA0));
  409. break;
  410. case CMDQ_SCENARIO_PRIMARY_ALL:
  411. flag = ((1LL << CMDQ_ENG_DISP_OVL0) |
  412. (1LL << CMDQ_ENG_DISP_WDMA0) |
  413. (1LL << CMDQ_ENG_DISP_COLOR0) |
  414. (1LL << CMDQ_ENG_DISP_AAL) |
  415. (1LL << CMDQ_ENG_DISP_RDMA0) |
  416. (1LL << CMDQ_ENG_DISP_UFOE) | (1LL << CMDQ_ENG_DISP_DSI0_CMD));
  417. break;
  418. case CMDQ_SCENARIO_SUB_DISP:
  419. flag = ((1LL << CMDQ_ENG_DISP_OVL1) |
  420. (1LL << CMDQ_ENG_DISP_COLOR1) |
  421. (1LL << CMDQ_ENG_DISP_GAMMA) |
  422. (1LL << CMDQ_ENG_DISP_RDMA1) | (1LL << CMDQ_ENG_DISP_DSI1_CMD));
  423. break;
  424. case CMDQ_SCENARIO_SUB_MEMOUT:
  425. flag = ((1LL << CMDQ_ENG_DISP_OVL1) | (1LL << CMDQ_ENG_DISP_WDMA1));
  426. break;
  427. case CMDQ_SCENARIO_SUB_ALL:
  428. flag = ((1LL << CMDQ_ENG_DISP_OVL1) |
  429. (1LL << CMDQ_ENG_DISP_WDMA1) |
  430. (1LL << CMDQ_ENG_DISP_COLOR1) |
  431. (1LL << CMDQ_ENG_DISP_GAMMA) |
  432. (1LL << CMDQ_ENG_DISP_RDMA1) | (1LL << CMDQ_ENG_DISP_DSI1_CMD));
  433. break;
  434. case CMDQ_SCENARIO_MHL_DISP:
  435. flag = ((1LL << CMDQ_ENG_DISP_OVL1) |
  436. (1LL << CMDQ_ENG_DISP_COLOR1) |
  437. (1LL << CMDQ_ENG_DISP_GAMMA) |
  438. (1LL << CMDQ_ENG_DISP_RDMA1) | (1LL << CMDQ_ENG_DISP_DPI));
  439. break;
  440. case CMDQ_SCENARIO_RDMA0_DISP:
  441. flag = ((1LL << CMDQ_ENG_DISP_RDMA0) |
  442. (1LL << CMDQ_ENG_DISP_UFOE) | (1LL << CMDQ_ENG_DISP_DSI0_CMD));
  443. break;
  444. case CMDQ_SCENARIO_RDMA2_DISP:
  445. flag = ((1LL << CMDQ_ENG_DISP_RDMA2) | (1LL << CMDQ_ENG_DISP_DPI));
  446. break;
  447. case CMDQ_SCENARIO_TRIGGER_LOOP:
  448. case CMDQ_SCENARIO_DISP_CONFIG_AAL:
  449. case CMDQ_SCENARIO_DISP_CONFIG_PRIMARY_GAMMA:
  450. case CMDQ_SCENARIO_DISP_CONFIG_PRIMARY_DITHER:
  451. case CMDQ_SCENARIO_DISP_CONFIG_PRIMARY_PWM:
  452. case CMDQ_SCENARIO_DISP_CONFIG_PRIMARY_PQ:
  453. case CMDQ_SCENARIO_DISP_CONFIG_SUB_GAMMA:
  454. case CMDQ_SCENARIO_DISP_CONFIG_SUB_DITHER:
  455. case CMDQ_SCENARIO_DISP_CONFIG_SUB_PWM:
  456. case CMDQ_SCENARIO_DISP_CONFIG_SUB_PQ:
  457. case CMDQ_SCENARIO_DISP_CONFIG_OD:
  458. /* Trigger loop does not related to any HW by itself. */
  459. flag = 0LL;
  460. break;
  461. case CMDQ_SCENARIO_USER_SPACE:
  462. /* user space case, engine flag is passed seprately */
  463. flag = 0LL;
  464. break;
  465. case CMDQ_SCENARIO_DEBUG:
  466. case CMDQ_SCENARIO_DEBUG_PREFETCH:
  467. flag = 0LL;
  468. break;
  469. case CMDQ_SCENARIO_DISP_ESD_CHECK:
  470. case CMDQ_SCENARIO_DISP_SCREEN_CAPTURE:
  471. /* ESD check uses separate thread (not config, not trigger) */
  472. flag = 0LL;
  473. break;
  474. case CMDQ_SCENARIO_DISP_COLOR:
  475. case CMDQ_SCENARIO_USER_DISP_COLOR:
  476. /* color path */
  477. flag = 0LL;
  478. break;
  479. case CMDQ_SCENARIO_DISP_MIRROR_MODE:
  480. flag = 0LL;
  481. break;
  482. case CMDQ_SCENARIO_DISP_PRIMARY_DISABLE_SECURE_PATH:
  483. case CMDQ_SCENARIO_DISP_SUB_DISABLE_SECURE_PATH:
  484. /* secure path */
  485. flag = 0LL;
  486. break;
  487. case CMDQ_SCENARIO_SECURE_NOTIFY_LOOP:
  488. flag = 0LL;
  489. break;
  490. default:
  491. CMDQ_ERR("Unknown scenario type %d\n", scn);
  492. flag = 0LL;
  493. break;
  494. }
  495. return flag;
  496. }