cmdq_virtual.c 33 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204
  1. #include "cmdq_core.h"
  2. #include "cmdq_reg.h"
  3. #include "cmdq_device.h"
  4. #include "cmdq_virtual.h"
  5. #include <linux/seq_file.h>
  6. #ifdef CMDQ_CONFIG_SMI
  7. #include "smi_debug.h"
  8. #endif
  9. #ifdef CMDQ_CG_M4U_LARB0
  10. #include "m4u.h"
  11. #endif
  12. static cmdqCoreFuncStruct gFunctionPointer;
  13. uint64_t cmdq_virtual_flag_from_scenario_default(CMDQ_SCENARIO_ENUM scn)
  14. {
  15. uint64_t flag = 0;
  16. switch (scn) {
  17. case CMDQ_SCENARIO_JPEG_DEC:
  18. flag = (1LL << CMDQ_ENG_JPEG_DEC);
  19. break;
  20. case CMDQ_SCENARIO_SUB_MEMOUT:
  21. flag = ((1LL << CMDQ_ENG_DISP_OVL1) | (1LL << CMDQ_ENG_DISP_WDMA1));
  22. break;
  23. case CMDQ_SCENARIO_KERNEL_CONFIG_GENERAL:
  24. flag = 0LL;
  25. break;
  26. case CMDQ_SCENARIO_DISP_CONFIG_AAL:
  27. case CMDQ_SCENARIO_DISP_CONFIG_PRIMARY_GAMMA:
  28. case CMDQ_SCENARIO_DISP_CONFIG_PRIMARY_DITHER:
  29. case CMDQ_SCENARIO_DISP_CONFIG_PRIMARY_PWM:
  30. case CMDQ_SCENARIO_DISP_CONFIG_PRIMARY_PQ:
  31. case CMDQ_SCENARIO_DISP_CONFIG_SUB_GAMMA:
  32. case CMDQ_SCENARIO_DISP_CONFIG_SUB_DITHER:
  33. case CMDQ_SCENARIO_DISP_CONFIG_SUB_PWM:
  34. case CMDQ_SCENARIO_DISP_CONFIG_SUB_PQ:
  35. case CMDQ_SCENARIO_DISP_CONFIG_OD:
  36. flag = 0LL;
  37. break;
  38. case CMDQ_SCENARIO_TRIGGER_LOOP:
  39. case CMDQ_SCENARIO_HIGHP_TRIGGER_LOOP:
  40. case CMDQ_SCENARIO_LOWP_TRIGGER_LOOP:
  41. /* Trigger loop does not related to any HW by itself. */
  42. flag = 0LL;
  43. break;
  44. case CMDQ_SCENARIO_USER_SPACE:
  45. /* user space case, engine flag is passed seprately */
  46. flag = 0LL;
  47. break;
  48. case CMDQ_SCENARIO_DEBUG:
  49. case CMDQ_SCENARIO_DEBUG_PREFETCH:
  50. flag = 0LL;
  51. break;
  52. case CMDQ_SCENARIO_DISP_ESD_CHECK:
  53. case CMDQ_SCENARIO_DISP_SCREEN_CAPTURE:
  54. /* ESD check uses separate thread (not config, not trigger) */
  55. flag = 0LL;
  56. break;
  57. case CMDQ_SCENARIO_DISP_COLOR:
  58. case CMDQ_SCENARIO_USER_DISP_COLOR:
  59. /* color path */
  60. flag = 0LL;
  61. break;
  62. case CMDQ_SCENARIO_DISP_MIRROR_MODE:
  63. flag = 0LL;
  64. break;
  65. case CMDQ_SCENARIO_DISP_PRIMARY_DISABLE_SECURE_PATH:
  66. case CMDQ_SCENARIO_DISP_SUB_DISABLE_SECURE_PATH:
  67. /* secure path */
  68. flag = 0LL;
  69. break;
  70. case CMDQ_SCENARIO_SECURE_NOTIFY_LOOP:
  71. flag = 0LL;
  72. break;
  73. default:
  74. if (scn < 0 || scn >= CMDQ_MAX_SCENARIO_COUNT) {
  75. /* Error status print */
  76. CMDQ_ERR("Unknown scenario type %d\n", scn);
  77. }
  78. flag = 0LL;
  79. break;
  80. }
  81. return flag;
  82. }
  83. const char *cmdq_virtual_parse_module_from_reg_addr_legacy(uint32_t reg_addr)
  84. {
  85. const uint32_t addr_base_and_page = (reg_addr & 0xFFFFF000);
  86. /* for well-known base, we check them with 12-bit mask */
  87. /* defined in mt_reg_base.h */
  88. /* TODO: comfirm with SS if IO_VIRT_TO_PHYS workable when enable device tree? */
  89. switch (addr_base_and_page) {
  90. case 0x14000000:
  91. return "MMSYS";
  92. case 0x14001000:
  93. return "MDP_RDMA0";
  94. case 0x14002000:
  95. return "MDP_RDMA1";
  96. case 0x14003000:
  97. return "MDP_RSZ0";
  98. case 0x14004000:
  99. return "MDP_RSZ1";
  100. case 0x14005000:
  101. return "MDP_RSZ2";
  102. case 0x14006000:
  103. return "MDP_WDMA";
  104. case 0x14007000:
  105. return "MDP_WROT0";
  106. case 0x14008000:
  107. return "MDP_WROT1";
  108. case 0x14009000:
  109. return "MDP_TDSHP0";
  110. case 0x1400A000:
  111. return "MDP_TDSHP1";
  112. case 0x1400B000:
  113. return "MDP_CROP";
  114. case 0x1400C000:
  115. return "DISP_OVL0";
  116. case 0x1400D000:
  117. return "DISP_OVL1";
  118. case 0x14013000:
  119. return "COLOR0";
  120. case 0x14014000:
  121. return "COLOR1";
  122. case 0x14015000:
  123. return "AAL";
  124. case 0x14016000:
  125. return "GAMA";
  126. case 0x14020000:
  127. return "MMSYS_MUTEX";
  128. case 0x18000000:
  129. return "VENC_GCON";
  130. case 0x18002000:
  131. return "VENC";
  132. case 0x18003000:
  133. return "JPGENC";
  134. case 0x18004000:
  135. return "JPGDEC";
  136. }
  137. /* for other register address we rely on GCE subsys to group them with */
  138. /* 16-bit mask. */
  139. return cmdq_core_parse_subsys_from_reg_addr(reg_addr);
  140. }
  141. uint64_t cmdq_virtual_flag_from_scenario_legacy(CMDQ_SCENARIO_ENUM scn)
  142. {
  143. uint64_t flag = 0;
  144. switch (scn) {
  145. case CMDQ_SCENARIO_PRIMARY_DISP:
  146. flag = (1LL << CMDQ_ENG_DISP_OVL0) |
  147. (1LL << CMDQ_ENG_DISP_COLOR0) |
  148. (1LL << CMDQ_ENG_DISP_AAL) |
  149. (1LL << CMDQ_ENG_DISP_RDMA0) |
  150. (1LL << CMDQ_ENG_DISP_UFOE) | (1LL << CMDQ_ENG_DISP_DSI0_CMD);
  151. break;
  152. case CMDQ_SCENARIO_PRIMARY_MEMOUT:
  153. flag = ((1LL << CMDQ_ENG_DISP_OVL0) | (1LL << CMDQ_ENG_DISP_WDMA0));
  154. break;
  155. case CMDQ_SCENARIO_PRIMARY_ALL:
  156. flag = ((1LL << CMDQ_ENG_DISP_OVL0) |
  157. (1LL << CMDQ_ENG_DISP_WDMA0) |
  158. (1LL << CMDQ_ENG_DISP_COLOR0) |
  159. (1LL << CMDQ_ENG_DISP_AAL) |
  160. (1LL << CMDQ_ENG_DISP_RDMA0) |
  161. (1LL << CMDQ_ENG_DISP_UFOE) | (1LL << CMDQ_ENG_DISP_DSI0_CMD));
  162. break;
  163. case CMDQ_SCENARIO_SUB_DISP:
  164. flag = ((1LL << CMDQ_ENG_DISP_OVL1) |
  165. (1LL << CMDQ_ENG_DISP_COLOR1) |
  166. (1LL << CMDQ_ENG_DISP_GAMMA) |
  167. (1LL << CMDQ_ENG_DISP_RDMA1) | (1LL << CMDQ_ENG_DISP_DSI1_CMD));
  168. break;
  169. case CMDQ_SCENARIO_SUB_ALL:
  170. flag = ((1LL << CMDQ_ENG_DISP_OVL1) |
  171. (1LL << CMDQ_ENG_DISP_WDMA1) |
  172. (1LL << CMDQ_ENG_DISP_COLOR1) |
  173. (1LL << CMDQ_ENG_DISP_GAMMA) |
  174. (1LL << CMDQ_ENG_DISP_RDMA1) | (1LL << CMDQ_ENG_DISP_DSI1_CMD));
  175. break;
  176. case CMDQ_SCENARIO_MHL_DISP:
  177. flag = ((1LL << CMDQ_ENG_DISP_OVL1) |
  178. (1LL << CMDQ_ENG_DISP_COLOR1) |
  179. (1LL << CMDQ_ENG_DISP_GAMMA) |
  180. (1LL << CMDQ_ENG_DISP_RDMA1) | (1LL << CMDQ_ENG_DISP_DPI));
  181. break;
  182. case CMDQ_SCENARIO_RDMA0_DISP:
  183. flag = ((1LL << CMDQ_ENG_DISP_RDMA0) |
  184. (1LL << CMDQ_ENG_DISP_UFOE) | (1LL << CMDQ_ENG_DISP_DSI0_CMD));
  185. break;
  186. case CMDQ_SCENARIO_RDMA2_DISP:
  187. flag = ((1LL << CMDQ_ENG_DISP_RDMA2) | (1LL << CMDQ_ENG_DISP_DPI));
  188. break;
  189. default:
  190. flag = 0LL;
  191. break;
  192. }
  193. return flag;
  194. }
  195. /*
  196. * GCE capability
  197. */
  198. uint32_t cmdq_virtual_get_subsys_LSB_in_argA(void)
  199. {
  200. return 16;
  201. }
  202. /* HW thread related */
  203. bool cmdq_virtual_is_a_secure_thread(const int32_t thread)
  204. {
  205. #ifdef CMDQ_SECURE_PATH_SUPPORT
  206. if ((CMDQ_MIN_SECURE_THREAD_ID <= thread) &&
  207. (CMDQ_MIN_SECURE_THREAD_ID + CMDQ_MAX_SECURE_THREAD_COUNT > thread)) {
  208. return true;
  209. }
  210. #endif
  211. return false;
  212. }
  213. bool cmdq_virtual_is_valid_notify_thread_for_secure_path(const int32_t thread)
  214. {
  215. #if defined(CMDQ_SECURE_PATH_SUPPORT) && !defined(CMDQ_SECURE_PATH_NORMAL_IRQ)
  216. return (15 == thread) ? (true) : (false);
  217. #else
  218. return false;
  219. #endif
  220. }
  221. /**
  222. * Scenario related
  223. *
  224. */
  225. bool cmdq_virtual_is_disp_scenario(const CMDQ_SCENARIO_ENUM scenario)
  226. {
  227. bool dispScenario = false;
  228. switch (scenario) {
  229. case CMDQ_SCENARIO_PRIMARY_DISP:
  230. case CMDQ_SCENARIO_PRIMARY_MEMOUT:
  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_RDMA1_DISP:
  238. case CMDQ_SCENARIO_RDMA2_DISP:
  239. case CMDQ_SCENARIO_RDMA0_COLOR0_DISP:
  240. case CMDQ_SCENARIO_TRIGGER_LOOP:
  241. case CMDQ_SCENARIO_HIGHP_TRIGGER_LOOP:
  242. case CMDQ_SCENARIO_LOWP_TRIGGER_LOOP:
  243. case CMDQ_SCENARIO_DISP_CONFIG_AAL:
  244. case CMDQ_SCENARIO_DISP_CONFIG_PRIMARY_GAMMA:
  245. case CMDQ_SCENARIO_DISP_CONFIG_SUB_GAMMA:
  246. case CMDQ_SCENARIO_DISP_CONFIG_PRIMARY_DITHER:
  247. case CMDQ_SCENARIO_DISP_CONFIG_SUB_DITHER:
  248. case CMDQ_SCENARIO_DISP_CONFIG_PRIMARY_PWM:
  249. case CMDQ_SCENARIO_DISP_CONFIG_SUB_PWM:
  250. case CMDQ_SCENARIO_DISP_CONFIG_PRIMARY_PQ:
  251. case CMDQ_SCENARIO_DISP_CONFIG_SUB_PQ:
  252. case CMDQ_SCENARIO_DISP_ESD_CHECK:
  253. case CMDQ_SCENARIO_DISP_SCREEN_CAPTURE:
  254. case CMDQ_SCENARIO_DISP_MIRROR_MODE:
  255. case CMDQ_SCENARIO_DISP_CONFIG_OD:
  256. /* color path */
  257. case CMDQ_SCENARIO_DISP_COLOR:
  258. case CMDQ_SCENARIO_USER_DISP_COLOR:
  259. /* secure path */
  260. case CMDQ_SCENARIO_DISP_PRIMARY_DISABLE_SECURE_PATH:
  261. case CMDQ_SCENARIO_DISP_SUB_DISABLE_SECURE_PATH:
  262. dispScenario = true;
  263. break;
  264. default:
  265. break;
  266. }
  267. /* freely dispatch */
  268. return dispScenario;
  269. }
  270. bool cmdq_virtual_should_enable_prefetch(CMDQ_SCENARIO_ENUM scenario)
  271. {
  272. bool shouldPrefetch = false;
  273. switch (scenario) {
  274. case CMDQ_SCENARIO_PRIMARY_DISP:
  275. case CMDQ_SCENARIO_PRIMARY_ALL:
  276. case CMDQ_SCENARIO_HIGHP_TRIGGER_LOOP:
  277. case CMDQ_SCENARIO_DEBUG_PREFETCH: /* HACK: force debug into 0/1 thread */
  278. /* any path that connects to Primary DISP HW */
  279. /* should enable prefetch. */
  280. /* MEMOUT scenarios does not. */
  281. /* Also, since thread 0/1 shares one prefetch buffer, */
  282. /* we allow only PRIMARY path to use prefetch. */
  283. shouldPrefetch = true;
  284. break;
  285. default:
  286. break;
  287. }
  288. return shouldPrefetch;
  289. }
  290. bool cmdq_virtual_should_profile(CMDQ_SCENARIO_ENUM scenario)
  291. {
  292. bool shouldProfile = false;
  293. #ifdef CMDQ_GPR_SUPPORT
  294. switch (scenario) {
  295. case CMDQ_SCENARIO_DEBUG_PREFETCH:
  296. case CMDQ_SCENARIO_DEBUG:
  297. return true;
  298. default:
  299. break;
  300. }
  301. #else
  302. /* note command profile method depends on GPR */
  303. CMDQ_ERR("func:%s failed since CMDQ doesn't support GPR\n", __func__);
  304. #endif
  305. return shouldProfile;
  306. }
  307. int cmdq_virtual_disp_thread(CMDQ_SCENARIO_ENUM scenario)
  308. {
  309. switch (scenario) {
  310. case CMDQ_SCENARIO_PRIMARY_DISP:
  311. case CMDQ_SCENARIO_PRIMARY_ALL:
  312. case CMDQ_SCENARIO_DISP_CONFIG_AAL:
  313. case CMDQ_SCENARIO_DISP_CONFIG_PRIMARY_GAMMA:
  314. case CMDQ_SCENARIO_DISP_CONFIG_PRIMARY_DITHER:
  315. case CMDQ_SCENARIO_DISP_CONFIG_PRIMARY_PWM:
  316. case CMDQ_SCENARIO_DISP_CONFIG_PRIMARY_PQ:
  317. case CMDQ_SCENARIO_DISP_CONFIG_OD:
  318. case CMDQ_SCENARIO_RDMA0_DISP:
  319. case CMDQ_SCENARIO_RDMA0_COLOR0_DISP:
  320. case CMDQ_SCENARIO_DEBUG_PREFETCH: /* HACK: force debug into 0/1 thread */
  321. /* primary config: thread 0 */
  322. return 0;
  323. case CMDQ_SCENARIO_SUB_DISP:
  324. case CMDQ_SCENARIO_SUB_ALL:
  325. case CMDQ_SCENARIO_MHL_DISP:
  326. case CMDQ_SCENARIO_RDMA1_DISP:
  327. case CMDQ_SCENARIO_RDMA2_DISP:
  328. case CMDQ_SCENARIO_DISP_CONFIG_SUB_GAMMA:
  329. case CMDQ_SCENARIO_DISP_CONFIG_SUB_DITHER:
  330. case CMDQ_SCENARIO_DISP_CONFIG_SUB_PQ:
  331. case CMDQ_SCENARIO_DISP_CONFIG_SUB_PWM:
  332. case CMDQ_SCENARIO_SUB_MEMOUT:
  333. /* when HW thread 0 enables pre-fetch, */
  334. /* any thread 1 operation will let HW thread 0's behavior abnormally */
  335. /* forbid thread 1 */
  336. return 5;
  337. case CMDQ_SCENARIO_HIGHP_TRIGGER_LOOP:
  338. return 2;
  339. case CMDQ_SCENARIO_DISP_ESD_CHECK:
  340. return 6;
  341. case CMDQ_SCENARIO_DISP_SCREEN_CAPTURE:
  342. case CMDQ_SCENARIO_DISP_MIRROR_MODE:
  343. return 3;
  344. case CMDQ_SCENARIO_DISP_COLOR:
  345. case CMDQ_SCENARIO_USER_DISP_COLOR:
  346. case CMDQ_SCENARIO_PRIMARY_MEMOUT:
  347. return 4;
  348. default:
  349. /* freely dispatch */
  350. return CMDQ_INVALID_THREAD;
  351. }
  352. /* freely dispatch */
  353. return CMDQ_INVALID_THREAD;
  354. }
  355. int cmdq_virtual_get_thread_index(CMDQ_SCENARIO_ENUM scenario, const bool secure)
  356. {
  357. #if defined(CMDQ_SECURE_PATH_SUPPORT) && !defined(CMDQ_SECURE_PATH_NORMAL_IRQ)
  358. if (!secure && CMDQ_SCENARIO_SECURE_NOTIFY_LOOP == scenario)
  359. return 15;
  360. #endif
  361. if (!secure)
  362. return cmdq_get_func()->dispThread(scenario);
  363. /* dispatch secure thread according to scenario */
  364. switch (scenario) {
  365. case CMDQ_SCENARIO_DISP_PRIMARY_DISABLE_SECURE_PATH:
  366. case CMDQ_SCENARIO_PRIMARY_DISP:
  367. case CMDQ_SCENARIO_PRIMARY_ALL:
  368. case CMDQ_SCENARIO_RDMA0_DISP:
  369. case CMDQ_SCENARIO_DEBUG_PREFETCH:
  370. /* CMDQ_MIN_SECURE_THREAD_ID */
  371. return 12;
  372. case CMDQ_SCENARIO_DISP_SUB_DISABLE_SECURE_PATH:
  373. case CMDQ_SCENARIO_SUB_DISP:
  374. case CMDQ_SCENARIO_SUB_ALL:
  375. case CMDQ_SCENARIO_MHL_DISP:
  376. /* because mirror mode and sub disp never use at the same time in secure path, */
  377. /* dispatch to same HW thread */
  378. case CMDQ_SCENARIO_DISP_MIRROR_MODE:
  379. case CMDQ_SCENARIO_DISP_COLOR:
  380. case CMDQ_SCENARIO_PRIMARY_MEMOUT:
  381. return 13;
  382. case CMDQ_SCENARIO_USER_MDP:
  383. case CMDQ_SCENARIO_USER_SPACE:
  384. case CMDQ_SCENARIO_DEBUG:
  385. /* because there is one input engine for MDP, reserve one secure thread is enough */
  386. return 14;
  387. default:
  388. CMDQ_ERR("no dedicated secure thread for senario:%d\n", scenario);
  389. return CMDQ_INVALID_THREAD;
  390. }
  391. }
  392. CMDQ_HW_THREAD_PRIORITY_ENUM cmdq_virtual_priority_from_scenario(CMDQ_SCENARIO_ENUM scenario)
  393. {
  394. switch (scenario) {
  395. case CMDQ_SCENARIO_PRIMARY_DISP:
  396. case CMDQ_SCENARIO_PRIMARY_ALL:
  397. case CMDQ_SCENARIO_SUB_MEMOUT:
  398. case CMDQ_SCENARIO_SUB_DISP:
  399. case CMDQ_SCENARIO_SUB_ALL:
  400. case CMDQ_SCENARIO_RDMA1_DISP:
  401. case CMDQ_SCENARIO_RDMA2_DISP:
  402. case CMDQ_SCENARIO_MHL_DISP:
  403. case CMDQ_SCENARIO_RDMA0_DISP:
  404. case CMDQ_SCENARIO_RDMA0_COLOR0_DISP:
  405. case CMDQ_SCENARIO_DISP_MIRROR_MODE:
  406. case CMDQ_SCENARIO_PRIMARY_MEMOUT:
  407. case CMDQ_SCENARIO_DISP_CONFIG_AAL:
  408. case CMDQ_SCENARIO_DISP_CONFIG_PRIMARY_GAMMA:
  409. case CMDQ_SCENARIO_DISP_CONFIG_SUB_GAMMA:
  410. case CMDQ_SCENARIO_DISP_CONFIG_PRIMARY_DITHER:
  411. case CMDQ_SCENARIO_DISP_CONFIG_SUB_DITHER:
  412. case CMDQ_SCENARIO_DISP_CONFIG_PRIMARY_PWM:
  413. case CMDQ_SCENARIO_DISP_CONFIG_SUB_PWM:
  414. case CMDQ_SCENARIO_DISP_CONFIG_PRIMARY_PQ:
  415. case CMDQ_SCENARIO_DISP_CONFIG_SUB_PQ:
  416. case CMDQ_SCENARIO_DISP_CONFIG_OD:
  417. /* color path */
  418. case CMDQ_SCENARIO_DISP_COLOR:
  419. case CMDQ_SCENARIO_USER_DISP_COLOR:
  420. /* secure path */
  421. case CMDQ_SCENARIO_DISP_PRIMARY_DISABLE_SECURE_PATH:
  422. case CMDQ_SCENARIO_DISP_SUB_DISABLE_SECURE_PATH:
  423. /* currently, a prefetch thread is always in high priority. */
  424. return CMDQ_THR_PRIO_DISPLAY_CONFIG;
  425. /* HACK: force debug into 0/1 thread */
  426. case CMDQ_SCENARIO_DEBUG_PREFETCH:
  427. return CMDQ_THR_PRIO_DISPLAY_CONFIG;
  428. case CMDQ_SCENARIO_DISP_ESD_CHECK:
  429. case CMDQ_SCENARIO_DISP_SCREEN_CAPTURE:
  430. return CMDQ_THR_PRIO_DISPLAY_ESD;
  431. case CMDQ_SCENARIO_HIGHP_TRIGGER_LOOP:
  432. return CMDQ_THR_PRIO_SUPERHIGH;
  433. case CMDQ_SCENARIO_LOWP_TRIGGER_LOOP:
  434. return CMDQ_THR_PRIO_SUPERLOW;
  435. default:
  436. /* other cases need exta logic, see below. */
  437. break;
  438. }
  439. if (cmdq_get_func()->isLoopScenario(scenario, true))
  440. return CMDQ_THR_PRIO_DISPLAY_TRIGGER;
  441. else
  442. return CMDQ_THR_PRIO_NORMAL;
  443. }
  444. bool cmdq_virtual_force_loop_irq(CMDQ_SCENARIO_ENUM scenario)
  445. {
  446. bool forceLoop = false;
  447. #ifdef CMDQ_SECURE_PATH_SUPPORT
  448. if (CMDQ_SCENARIO_SECURE_NOTIFY_LOOP == scenario) {
  449. /* For secure notify loop, we need IRQ to update secure task */
  450. forceLoop = true;
  451. }
  452. #endif
  453. if (CMDQ_SCENARIO_HIGHP_TRIGGER_LOOP == scenario
  454. || CMDQ_SCENARIO_LOWP_TRIGGER_LOOP == scenario) {
  455. /* For monitor thread loop, we need IRQ to set callback function */
  456. forceLoop = true;
  457. }
  458. return forceLoop;
  459. }
  460. bool cmdq_virtual_is_loop_scenario(CMDQ_SCENARIO_ENUM scenario, bool displayOnly)
  461. {
  462. #ifdef CMDQ_SECURE_PATH_SUPPORT
  463. if (!displayOnly && CMDQ_SCENARIO_SECURE_NOTIFY_LOOP == scenario)
  464. return true;
  465. #endif
  466. if (CMDQ_SCENARIO_TRIGGER_LOOP == scenario
  467. || CMDQ_SCENARIO_HIGHP_TRIGGER_LOOP == scenario
  468. || CMDQ_SCENARIO_LOWP_TRIGGER_LOOP == scenario)
  469. return true;
  470. return false;
  471. }
  472. /**
  473. * Module dependent
  474. *
  475. */
  476. void cmdq_virtual_get_reg_id_from_hwflag(uint64_t hwflag, CMDQ_DATA_REGISTER_ENUM *valueRegId,
  477. CMDQ_DATA_REGISTER_ENUM *destRegId,
  478. CMDQ_EVENT_ENUM *regAccessToken)
  479. {
  480. *regAccessToken = CMDQ_SYNC_TOKEN_INVALID;
  481. if (hwflag & (1LL << CMDQ_ENG_JPEG_ENC)) {
  482. *valueRegId = CMDQ_DATA_REG_JPEG;
  483. *destRegId = CMDQ_DATA_REG_JPEG_DST;
  484. *regAccessToken = CMDQ_SYNC_TOKEN_GPR_SET_0;
  485. } else if (hwflag & (1LL << CMDQ_ENG_MDP_TDSHP0)) {
  486. *valueRegId = CMDQ_DATA_REG_2D_SHARPNESS_0;
  487. *destRegId = CMDQ_DATA_REG_2D_SHARPNESS_0_DST;
  488. *regAccessToken = CMDQ_SYNC_TOKEN_GPR_SET_1;
  489. } else if (hwflag & (1LL << CMDQ_ENG_MDP_TDSHP1)) {
  490. *valueRegId = CMDQ_DATA_REG_2D_SHARPNESS_1;
  491. *destRegId = CMDQ_DATA_REG_2D_SHARPNESS_1_DST;
  492. *regAccessToken = CMDQ_SYNC_TOKEN_GPR_SET_2;
  493. } else if (hwflag & ((1LL << CMDQ_ENG_DISP_COLOR0 | (1LL << CMDQ_ENG_DISP_COLOR1)))) {
  494. *valueRegId = CMDQ_DATA_REG_PQ_COLOR;
  495. *destRegId = CMDQ_DATA_REG_PQ_COLOR_DST;
  496. *regAccessToken = CMDQ_SYNC_TOKEN_GPR_SET_3;
  497. } else {
  498. /* assume others are debug cases */
  499. *valueRegId = CMDQ_DATA_REG_DEBUG;
  500. *destRegId = CMDQ_DATA_REG_DEBUG_DST;
  501. *regAccessToken = CMDQ_SYNC_TOKEN_GPR_SET_4;
  502. }
  503. }
  504. const char *cmdq_virtual_module_from_event_id(const int32_t event)
  505. {
  506. const char *module = "CMDQ";
  507. switch (event) {
  508. case CMDQ_EVENT_DISP_RDMA0_SOF:
  509. case CMDQ_EVENT_DISP_RDMA1_SOF:
  510. case CMDQ_EVENT_DISP_RDMA2_SOF:
  511. case CMDQ_EVENT_DISP_RDMA0_EOF:
  512. case CMDQ_EVENT_DISP_RDMA1_EOF:
  513. case CMDQ_EVENT_DISP_RDMA2_EOF:
  514. case CMDQ_EVENT_DISP_RDMA0_UNDERRUN:
  515. case CMDQ_EVENT_DISP_RDMA1_UNDERRUN:
  516. case CMDQ_EVENT_DISP_RDMA2_UNDERRUN:
  517. module = "DISP_RDMA";
  518. break;
  519. case CMDQ_EVENT_DISP_WDMA0_SOF:
  520. case CMDQ_EVENT_DISP_WDMA1_SOF:
  521. case CMDQ_EVENT_DISP_WDMA0_EOF:
  522. case CMDQ_EVENT_DISP_WDMA1_EOF:
  523. module = "DISP_WDMA";
  524. break;
  525. case CMDQ_EVENT_DISP_OVL0_SOF:
  526. case CMDQ_EVENT_DISP_OVL1_SOF:
  527. case CMDQ_EVENT_DISP_2L_OVL0_SOF:
  528. case CMDQ_EVENT_DISP_2L_OVL1_SOF:
  529. case CMDQ_EVENT_DISP_OVL0_EOF:
  530. case CMDQ_EVENT_DISP_OVL1_EOF:
  531. case CMDQ_EVENT_DISP_2L_OVL0_EOF:
  532. case CMDQ_EVENT_DISP_2L_OVL1_EOF:
  533. module = "DISP_OVL";
  534. break;
  535. case CMDQ_EVENT_UFOD_RAMA0_L0_SOF ... CMDQ_EVENT_UFOD_RAMA1_L3_SOF:
  536. case CMDQ_EVENT_UFOD_RAMA0_L0_EOF ... CMDQ_EVENT_UFOD_RAMA1_L3_EOF:
  537. module = "DISP_UFOD";
  538. break;
  539. case CMDQ_EVENT_DSI_TE:
  540. case CMDQ_EVENT_DSI0_TE:
  541. case CMDQ_EVENT_DSI1_TE:
  542. case CMDQ_EVENT_MDP_DSI0_TE_SOF:
  543. case CMDQ_EVENT_MDP_DSI1_TE_SOF:
  544. case CMDQ_EVENT_DISP_DSI0_EOF:
  545. case CMDQ_EVENT_DISP_DSI1_EOF:
  546. case CMDQ_EVENT_DISP_DPI0_EOF:
  547. case CMDQ_EVENT_DISP_COLOR_SOF ... CMDQ_EVENT_DISP_DSC_SOF:
  548. case CMDQ_EVENT_DISP_COLOR_EOF ... CMDQ_EVENT_DISP_DSC_EOF:
  549. case CMDQ_EVENT_MUTEX0_STREAM_EOF ... CMDQ_EVENT_MUTEX4_STREAM_EOF:
  550. module = "DISP";
  551. break;
  552. case CMDQ_SYNC_TOKEN_CONFIG_DIRTY:
  553. case CMDQ_SYNC_TOKEN_STREAM_EOF:
  554. module = "DISP";
  555. break;
  556. case CMDQ_EVENT_MDP_RDMA0_SOF ... CMDQ_EVENT_MDP_CROP_SOF:
  557. case CMDQ_EVENT_MDP_RDMA0_EOF ... CMDQ_EVENT_MDP_CROP_EOF:
  558. case CMDQ_EVENT_MUTEX5_STREAM_EOF ... CMDQ_EVENT_MUTEX9_STREAM_EOF:
  559. module = "MDP";
  560. break;
  561. case CMDQ_EVENT_ISP_PASS2_2_EOF ... CMDQ_EVENT_ISP_PASS1_0_EOF:
  562. case CMDQ_EVENT_DIP_CQ_THREAD0_EOF ... CMDQ_EVENT_DIP_CQ_THREAD14_EOF:
  563. case CMDQ_EVENT_DPE_EOF:
  564. case CMDQ_EVENT_WMF_EOF:
  565. case CMDQ_EVENT_ISP_SENINF_CAM1_2_3_FULL:
  566. case CMDQ_EVENT_ISP_SENINF_CAM0_FULL:
  567. case CMDQ_EVENT_ISP_FRAME_DONE_A:
  568. case CMDQ_EVENT_ISP_FRAME_DONE_B:
  569. case CMDQ_EVENT_ISP_CAMSV_0_PASS1_DONE:
  570. case CMDQ_EVENT_ISP_CAMSV_1_PASS1_DONE:
  571. case CMDQ_EVENT_ISP_CAMSV_2_PASS1_DONE:
  572. case CMDQ_EVENT_SENINF_0_FIFO_FULL ... CMDQ_EVENT_SENINF_7_FIFO_FULL:
  573. module = "ISP";
  574. break;
  575. case CMDQ_EVENT_JPEG_ENC_EOF:
  576. case CMDQ_EVENT_JPEG_ENC_PASS2_EOF:
  577. case CMDQ_EVENT_JPEG_ENC_PASS1_EOF:
  578. case CMDQ_EVENT_JPEG_DEC_EOF:
  579. module = "JPGE";
  580. break;
  581. case CMDQ_EVENT_VENC_EOF:
  582. case CMDQ_EVENT_VENC_MB_DONE:
  583. case CMDQ_EVENT_VENC_128BYTE_CNT_DONE:
  584. module = "VENC";
  585. break;
  586. default:
  587. module = "CMDQ";
  588. break;
  589. }
  590. return module;
  591. }
  592. const char *cmdq_virtual_parse_module_from_reg_addr(uint32_t reg_addr)
  593. {
  594. const uint32_t addr_base_and_page = (reg_addr & 0xFFFFF000);
  595. #ifdef CMDQ_USE_LEGACY
  596. return cmdq_virtual_parse_module_from_reg_addr_legacy(reg_addr);
  597. #else
  598. /* for well-known base, we check them with 12-bit mask */
  599. /* defined in mt_reg_base.h */
  600. /* TODO: comfirm with SS if IO_VIRT_TO_PHYS workable when enable device tree? */
  601. switch (addr_base_and_page) {
  602. case 0x14001000: /* MDP_RDMA */
  603. case 0x14002000: /* MDP_RSZ0 */
  604. case 0x14003000: /* MDP_RSZ1 */
  605. case 0x14004000: /* MDP_WDMA */
  606. case 0x14005000: /* MDP_WROT */
  607. case 0x14006000: /* MDP_TDSHP */
  608. return "MDP";
  609. case 0x1400C000: /* DISP_COLOR */
  610. return "COLOR";
  611. case 0x1400D000: /* DISP_COLOR */
  612. return "CCORR";
  613. case 0x14007000: /* DISP_OVL0 */
  614. return "OVL0";
  615. case 0x14008000: /* DISP_OVL1 */
  616. return "OVL1";
  617. case 0x1400E000: /* DISP_AAL */
  618. case 0x1400F000: /* DISP_GAMMA */
  619. return "AAL";
  620. case 0x17002FFF: /* VENC */
  621. return "VENC";
  622. case 0x17003FFF: /* JPGENC */
  623. return "JPGENC";
  624. case 0x17004FFF: /* JPGDEC */
  625. return "JPGDEC";
  626. }
  627. /* for other register address we rely on GCE subsys to group them with */
  628. /* 16-bit mask. */
  629. return cmdq_core_parse_subsys_from_reg_addr(reg_addr);
  630. #endif
  631. }
  632. int32_t cmdq_virtual_can_module_entry_suspend(EngineStruct *engineList)
  633. {
  634. int32_t status = 0;
  635. int i;
  636. CMDQ_ENG_ENUM e = 0;
  637. CMDQ_ENG_ENUM mdpEngines[] = {
  638. CMDQ_ENG_ISP_IMGI,
  639. CMDQ_ENG_MDP_RDMA0,
  640. CMDQ_ENG_MDP_RDMA1,
  641. CMDQ_ENG_MDP_RSZ0,
  642. CMDQ_ENG_MDP_RSZ1,
  643. CMDQ_ENG_MDP_RSZ2,
  644. CMDQ_ENG_MDP_TDSHP0,
  645. CMDQ_ENG_MDP_TDSHP1,
  646. CMDQ_ENG_MDP_COLOR0,
  647. CMDQ_ENG_MDP_WROT0,
  648. CMDQ_ENG_MDP_WROT1,
  649. CMDQ_ENG_MDP_WDMA
  650. };
  651. for (i = 0; i < (sizeof(mdpEngines) / sizeof(CMDQ_ENG_ENUM)); ++i) {
  652. e = mdpEngines[i];
  653. if (0 != engineList[e].userCount) {
  654. CMDQ_ERR("suspend but engine %d has userCount %d, owner=%d\n",
  655. e, engineList[e].userCount, engineList[e].currOwner);
  656. status = -EBUSY;
  657. }
  658. }
  659. return status;
  660. }
  661. ssize_t cmdq_virtual_print_status_clock(char *buf)
  662. {
  663. int32_t length = 0;
  664. char *pBuffer = buf;
  665. #ifdef CMDQ_PWR_AWARE
  666. /* MT_CG_DISP0_MUTEX_32K is removed in this platform */
  667. pBuffer += sprintf(pBuffer, "MT_CG_INFRA_GCE: %d\n", cmdq_dev_gce_clock_is_enable());
  668. #if !defined(CMDQ_USE_CCF) && defined(CMDQ_USE_LEGACY)
  669. pBuffer += sprintf(pBuffer, ", MT_CG_DISP0_MUTEX_32K: %d", clock_is_on(MT_CG_DISP0_MUTEX_32K));
  670. #endif
  671. pBuffer += sprintf(pBuffer, "\n");
  672. #endif
  673. length = pBuffer - buf;
  674. return length;
  675. }
  676. void cmdq_virtual_print_status_seq_clock(struct seq_file *m)
  677. {
  678. #ifdef CMDQ_PWR_AWARE
  679. /* MT_CG_DISP0_MUTEX_32K is removed in this platform */
  680. seq_printf(m, "MT_CG_INFRA_GCE: %d", cmdq_dev_gce_clock_is_enable());
  681. #if !defined(CMDQ_USE_CCF) && defined(CMDQ_USE_LEGACY)
  682. seq_printf(m, ", MT_CG_DISP0_MUTEX_32K: %d", clock_is_on(MT_CG_DISP0_MUTEX_32K));
  683. #endif
  684. seq_puts(m, "\n");
  685. #endif
  686. }
  687. void cmdq_virtual_enable_common_clock_locked(bool enable)
  688. {
  689. #ifdef CMDQ_PWR_AWARE
  690. if (enable) {
  691. CMDQ_VERBOSE("[CLOCK] Enable SMI & LARB0 Clock\n");
  692. cmdq_dev_enable_clock_SMI_COMMON(enable);
  693. #ifdef CMDQ_CG_M4U_LARB0
  694. m4u_larb0_enable("CMDQ_MDP");
  695. #else
  696. cmdq_dev_enable_clock_SMI_LARB0(enable);
  697. #endif
  698. #ifdef CMDQ_USE_LEGACY
  699. CMDQ_VERBOSE("[CLOCK] enable MT_CG_DISP0_MUTEX_32K\n");
  700. cmdq_dev_enable_clock_MUTEX_32K(enable);
  701. #endif
  702. } else {
  703. CMDQ_VERBOSE("[CLOCK] Disable SMI & LARB0 Clock\n");
  704. /* disable, reverse the sequence */
  705. #ifdef CMDQ_CG_M4U_LARB0
  706. m4u_larb0_disable("CMDQ_MDP");
  707. #else
  708. cmdq_dev_enable_clock_SMI_LARB0(enable);
  709. #endif
  710. cmdq_dev_enable_clock_SMI_COMMON(enable);
  711. #ifdef CMDQ_USE_LEGACY
  712. CMDQ_VERBOSE("[CLOCK] disable MT_CG_DISP0_MUTEX_32K\n");
  713. cmdq_dev_enable_clock_MUTEX_32K(enable);
  714. #endif
  715. }
  716. #endif /* CMDQ_PWR_AWARE */
  717. }
  718. void cmdq_virtual_enable_gce_clock_locked(bool enable)
  719. {
  720. #ifdef CMDQ_PWR_AWARE
  721. if (enable) {
  722. CMDQ_VERBOSE("[CLOCK] Enable CMDQ(GCE) Clock\n");
  723. cmdq_dev_enable_gce_clock(enable);
  724. } else {
  725. CMDQ_VERBOSE("[CLOCK] Disable CMDQ(GCE) Clock\n");
  726. cmdq_dev_enable_gce_clock(enable);
  727. }
  728. #endif
  729. }
  730. const char *cmdq_virtual_parse_error_module_by_hwflag_impl(const TaskStruct *pTask)
  731. {
  732. const char *module = NULL;
  733. const uint32_t ISP_ONLY[2] = {
  734. ((1LL << CMDQ_ENG_ISP_IMGI) | (1LL << CMDQ_ENG_ISP_IMG2O)),
  735. ((1LL << CMDQ_ENG_ISP_IMGI) | (1LL << CMDQ_ENG_ISP_IMG2O) |
  736. (1LL << CMDQ_ENG_ISP_IMGO))
  737. };
  738. /* common part for both normal and secure path */
  739. /* for JPEG scenario, use HW flag is sufficient */
  740. if (pTask->engineFlag & (1LL << CMDQ_ENG_JPEG_ENC))
  741. module = "JPGENC";
  742. else if (pTask->engineFlag & (1LL << CMDQ_ENG_JPEG_DEC))
  743. module = "JPGDEC";
  744. else if ((ISP_ONLY[0] == pTask->engineFlag) || (ISP_ONLY[1] == pTask->engineFlag))
  745. module = "ISP_ONLY";
  746. else if (cmdq_get_func()->isDispScenario(pTask->scenario))
  747. module = "DISP";
  748. /* for secure path, use HW flag is sufficient */
  749. do {
  750. if (NULL != module)
  751. break;
  752. if (false == pTask->secData.isSecure) {
  753. /* normal path, need parse current running instruciton for more detail */
  754. break;
  755. } else if (CMDQ_ENG_MDP_GROUP_FLAG(pTask->engineFlag)) {
  756. module = "MDP";
  757. break;
  758. } else if (CMDQ_ENG_DPE_GROUP_FLAG(pTask->engineFlag)) {
  759. module = "DPE";
  760. break;
  761. }
  762. module = "CMDQ";
  763. } while (0);
  764. /* other case, we need to analysis instruction for more detail */
  765. return module;
  766. }
  767. /**
  768. * Debug
  769. *
  770. */
  771. void cmdq_virtual_dump_mmsys_config(void)
  772. {
  773. /* do nothing */
  774. }
  775. void cmdq_virtual_dump_clock_gating(void)
  776. {
  777. uint32_t value[3] = { 0 };
  778. value[0] = CMDQ_REG_GET32(MMSYS_CONFIG_BASE + 0x100);
  779. value[1] = CMDQ_REG_GET32(MMSYS_CONFIG_BASE + 0x110);
  780. CMDQ_ERR("MMSYS_CG_CON0(deprecated): 0x%08x, MMSYS_CG_CON1: 0x%08x\n", value[0], value[1]);
  781. #ifdef CMDQ_USE_LEGACY
  782. value[2] = CMDQ_REG_GET32(MMSYS_CONFIG_BASE + 0x890);
  783. CMDQ_ERR("MMSYS_DUMMY_REG: 0x%08x\n", value[2]);
  784. #endif
  785. #if !defined(CMDQ_USE_CCF) && !defined(CONFIG_MTK_FPGA)
  786. CMDQ_ERR("DisSys clock state %d\n", subsys_is_on(SYS_DIS));
  787. #ifdef CMDQ_DUMP_IMG_CLOCK_STATE
  788. CMDQ_ERR("IMGSys clock state %d\n", subsys_is_on(SYS_IMG));
  789. #else
  790. CMDQ_ERR("ISPSys clock state %d\n", subsys_is_on(SYS_ISP));
  791. CMDQ_ERR("VDESys clock state %d\n", subsys_is_on(SYS_VDE));
  792. #endif
  793. #endif
  794. }
  795. int cmdq_virtual_dump_smi(const int showSmiDump)
  796. {
  797. int isSMIHang = 0;
  798. #if defined(CMDQ_CONFIG_SMI) && !defined(CONFIG_MTK_FPGA)
  799. isSMIHang =
  800. smi_debug_bus_hanging_detect_ext(SMI_DBG_DISPSYS | SMI_DBG_VDEC | SMI_DBG_IMGSYS |
  801. SMI_DBG_VENC | SMI_DBG_MJC, showSmiDump, 1);
  802. CMDQ_ERR("SMI Hang? = %d\n", isSMIHang);
  803. #else
  804. CMDQ_LOG("[WARNING]not enable SMI dump now\n");
  805. #endif
  806. return isSMIHang;
  807. }
  808. void cmdq_virtual_dump_gpr(void)
  809. {
  810. int i = 0;
  811. long offset = 0;
  812. uint32_t value = 0;
  813. CMDQ_LOG("========= GPR dump =========\n");
  814. for (i = 0; i < 16; i++) {
  815. offset = CMDQ_GPR_R32(i);
  816. value = CMDQ_REG_GET32(offset);
  817. CMDQ_LOG("[GPR %2d]+0x%lx = 0x%08x\n", i, offset, value);
  818. }
  819. CMDQ_LOG("========= GPR dump =========\n");
  820. }
  821. /**
  822. * Record usage
  823. *
  824. */
  825. uint64_t cmdq_virtual_flag_from_scenario(CMDQ_SCENARIO_ENUM scn)
  826. {
  827. uint64_t flag = 0;
  828. #ifdef CMDQ_USE_LEGACY
  829. cmdq_virtual_flag_from_scenario_legacy(scn);
  830. #else
  831. switch (scn) {
  832. case CMDQ_SCENARIO_PRIMARY_DISP:
  833. flag = (1LL << CMDQ_ENG_DISP_OVL0) |
  834. (1LL << CMDQ_ENG_DISP_COLOR0) |
  835. (1LL << CMDQ_ENG_DISP_AAL) |
  836. (1LL << CMDQ_ENG_DISP_GAMMA) |
  837. (1LL << CMDQ_ENG_DISP_RDMA0) |
  838. (1LL << CMDQ_ENG_DISP_UFOE) | (1LL << CMDQ_ENG_DISP_DSI0_CMD);
  839. break;
  840. case CMDQ_SCENARIO_PRIMARY_MEMOUT:
  841. flag = 0LL;
  842. break;
  843. case CMDQ_SCENARIO_PRIMARY_ALL:
  844. flag = ((1LL << CMDQ_ENG_DISP_OVL0) |
  845. (1LL << CMDQ_ENG_DISP_WDMA0) |
  846. (1LL << CMDQ_ENG_DISP_COLOR0) |
  847. (1LL << CMDQ_ENG_DISP_AAL) |
  848. (1LL << CMDQ_ENG_DISP_GAMMA) |
  849. (1LL << CMDQ_ENG_DISP_RDMA0) |
  850. (1LL << CMDQ_ENG_DISP_UFOE) | (1LL << CMDQ_ENG_DISP_DSI0_CMD));
  851. break;
  852. case CMDQ_SCENARIO_SUB_DISP:
  853. flag = ((1LL << CMDQ_ENG_DISP_OVL1) |
  854. (1LL << CMDQ_ENG_DISP_RDMA1) | (1LL << CMDQ_ENG_DISP_DPI));
  855. break;
  856. case CMDQ_SCENARIO_SUB_ALL:
  857. flag = ((1LL << CMDQ_ENG_DISP_OVL1) |
  858. (1LL << CMDQ_ENG_DISP_WDMA1) |
  859. (1LL << CMDQ_ENG_DISP_RDMA1) | (1LL << CMDQ_ENG_DISP_DPI));
  860. break;
  861. case CMDQ_SCENARIO_RDMA0_DISP:
  862. flag = ((1LL << CMDQ_ENG_DISP_RDMA0) | (1LL << CMDQ_ENG_DISP_DSI0_CMD));
  863. break;
  864. case CMDQ_SCENARIO_RDMA0_COLOR0_DISP:
  865. flag = ((1LL << CMDQ_ENG_DISP_RDMA0) |
  866. (1LL << CMDQ_ENG_DISP_COLOR0) |
  867. (1LL << CMDQ_ENG_DISP_AAL) |
  868. (1LL << CMDQ_ENG_DISP_GAMMA) |
  869. (1LL << CMDQ_ENG_DISP_UFOE) | (1LL << CMDQ_ENG_DISP_DSI0_CMD));
  870. break;
  871. case CMDQ_SCENARIO_MHL_DISP:
  872. case CMDQ_SCENARIO_RDMA1_DISP:
  873. flag = ((1LL << CMDQ_ENG_DISP_RDMA1) | (1LL << CMDQ_ENG_DISP_DPI));
  874. break;
  875. default:
  876. flag = 0LL;
  877. break;
  878. }
  879. #endif
  880. if (0 == flag)
  881. cmdq_virtual_flag_from_scenario_default(scn);
  882. return flag;
  883. }
  884. /**
  885. * Event backup
  886. *
  887. */
  888. #ifdef CMDQ_EVENT_NEED_BACKUP
  889. #define CMDQ_EVENT_BACKUP_COUNT (2)
  890. typedef struct cmdqBackupEventStruct {
  891. CMDQ_EVENT_ENUM EventID[CMDQ_EVENT_BACKUP_COUNT];
  892. uint32_t BackupValue[CMDQ_EVENT_BACKUP_COUNT];
  893. } cmdqBackupEventStruct;
  894. cmdqBackupEventStruct gCmdqBackupEvent;
  895. #endif /* CMDQ_EVENT_NEED_BACKUP */
  896. void cmdq_virtual_initial_backup_event(void)
  897. {
  898. #ifdef CMDQ_EVENT_NEED_BACKUP
  899. memset(&(gCmdqBackupEvent.BackupValue[0]), 0, sizeof(gCmdqBackupEvent.BackupValue));
  900. memset(&(gCmdqBackupEvent.EventID[0]), -1, sizeof(gCmdqBackupEvent.EventID));
  901. gCmdqBackupEvent.EventID[0] = cmdq_core_get_event_value(CMDQ_SYNC_TOKEN_VENC_EOF);
  902. gCmdqBackupEvent.EventID[1] = cmdq_core_get_event_value(CMDQ_SYNC_TOKEN_VENC_INPUT_READY);
  903. #endif /* CMDQ_EVENT_NEED_BACKUP */
  904. }
  905. void cmdq_virtual_event_backup(void)
  906. {
  907. #ifdef CMDQ_EVENT_NEED_BACKUP
  908. int i;
  909. for (i = 0; i < CMDQ_EVENT_BACKUP_COUNT; i++) {
  910. if (-1 == gCmdqBackupEvent.EventID[i])
  911. continue;
  912. cmdqCoreGetEvent(gCmdqBackupEvent.EventID[i]);
  913. }
  914. #endif /* CMDQ_EVENT_NEED_BACKUP */
  915. }
  916. void cmdq_virtual_event_restore(void)
  917. {
  918. #ifdef CMDQ_EVENT_NEED_BACKUP
  919. int i;
  920. for (i = 0; i < CMDQ_EVENT_BACKUP_COUNT; i++) {
  921. if (-1 == gCmdqBackupEvent.EventID[i])
  922. continue;
  923. cmdqCoreSetEvent(gCmdqBackupEvent.EventID[i]);
  924. }
  925. #endif /* CMDQ_EVENT_NEED_BACKUP */
  926. }
  927. /**
  928. * Test
  929. *
  930. */
  931. void cmdq_virtual_test_setup(void)
  932. {
  933. /* unconditionally set CMDQ_SYNC_TOKEN_CONFIG_ALLOW and mutex STREAM_DONE */
  934. /* so that DISPSYS scenarios may pass check. */
  935. cmdqCoreSetEvent(CMDQ_SYNC_TOKEN_STREAM_EOF);
  936. cmdqCoreSetEvent(CMDQ_EVENT_MUTEX0_STREAM_EOF);
  937. cmdqCoreSetEvent(CMDQ_EVENT_MUTEX1_STREAM_EOF);
  938. cmdqCoreSetEvent(CMDQ_EVENT_MUTEX2_STREAM_EOF);
  939. cmdqCoreSetEvent(CMDQ_EVENT_MUTEX3_STREAM_EOF);
  940. }
  941. void cmdq_virtual_test_cleanup(void)
  942. {
  943. /* do nothing */
  944. }
  945. void cmdq_virtual_init_module_PA_stat(void)
  946. {
  947. #if defined(CMDQ_OF_SUPPORT) && defined(CMDQ_INSTRUCTION_COUNT)
  948. int32_t i;
  949. CmdqModulePAStatStruct *modulePAStat = cmdq_core_Initial_and_get_module_stat();
  950. /* Get MM_SYS config registers range */
  951. cmdq_dev_get_module_PA("mediatek,mmsys_config", 0,
  952. &modulePAStat->start[CMDQ_MODULE_STAT_MMSYS_CONFIG],
  953. &modulePAStat->end[CMDQ_MODULE_STAT_MMSYS_CONFIG]);
  954. /* Get MDP module registers range */
  955. cmdq_dev_get_module_PA("mediatek,mdp_rdma", 0,
  956. &modulePAStat->start[CMDQ_MODULE_STAT_MDP_RDMA],
  957. &modulePAStat->end[CMDQ_MODULE_STAT_MDP_RDMA]);
  958. cmdq_dev_get_module_PA("mediatek,mdp_rsz0", 0,
  959. &modulePAStat->start[CMDQ_MODULE_STAT_MDP_RSZ0],
  960. &modulePAStat->end[CMDQ_MODULE_STAT_MDP_RSZ0]);
  961. cmdq_dev_get_module_PA("mediatek,mdp_rsz1", 0,
  962. &modulePAStat->start[CMDQ_MODULE_STAT_MDP_RSZ1],
  963. &modulePAStat->end[CMDQ_MODULE_STAT_MDP_RSZ1]);
  964. cmdq_dev_get_module_PA("mediatek,mdp_wdma", 0,
  965. &modulePAStat->start[CMDQ_MODULE_STAT_MDP_WDMA],
  966. &modulePAStat->end[CMDQ_MODULE_STAT_MDP_WDMA]);
  967. cmdq_dev_get_module_PA("mediatek,mdp_wrot", 0,
  968. &modulePAStat->start[CMDQ_MODULE_STAT_MDP_WROT],
  969. &modulePAStat->end[CMDQ_MODULE_STAT_MDP_WROT]);
  970. cmdq_dev_get_module_PA("mediatek,mdp_tdshp", 0,
  971. &modulePAStat->start[CMDQ_MODULE_STAT_MDP_TDSHP],
  972. &modulePAStat->end[CMDQ_MODULE_STAT_MDP_TDSHP]);
  973. cmdq_dev_get_module_PA("mediatek,MM_MUTEX", 0,
  974. &modulePAStat->start[CMDQ_MODULE_STAT_MM_MUTEX],
  975. &modulePAStat->end[CMDQ_MODULE_STAT_MM_MUTEX]);
  976. cmdq_dev_get_module_PA("mediatek,VENC", 0,
  977. &modulePAStat->start[CMDQ_MODULE_STAT_VENC],
  978. &modulePAStat->end[CMDQ_MODULE_STAT_VENC]);
  979. /* Get DISP module registers range */
  980. for (i = CMDQ_MODULE_STAT_DISP_OVL0; i <= CMDQ_MODULE_STAT_DISP_DPI0; i++) {
  981. cmdq_dev_get_module_PA("mediatek,DISPSYS",
  982. (i - CMDQ_MODULE_STAT_DISP_OVL0),
  983. &modulePAStat->start[i], &modulePAStat->end[i]);
  984. }
  985. cmdq_dev_get_module_PA("mediatek,DISPSYS", 31,
  986. &modulePAStat->start[CMDQ_MODULE_STAT_DISP_OD],
  987. &modulePAStat->end[CMDQ_MODULE_STAT_DISP_OD]);
  988. /* Get CAM module registers range */
  989. cmdq_dev_get_module_PA("mediatek,CAM0", 0,
  990. &modulePAStat->start[CMDQ_MODULE_STAT_CAM0],
  991. &modulePAStat->end[CMDQ_MODULE_STAT_CAM0]);
  992. cmdq_dev_get_module_PA("mediatek,CAM1", 0,
  993. &modulePAStat->start[CMDQ_MODULE_STAT_CAM1],
  994. &modulePAStat->end[CMDQ_MODULE_STAT_CAM1]);
  995. cmdq_dev_get_module_PA("mediatek,CAM2", 0,
  996. &modulePAStat->start[CMDQ_MODULE_STAT_CAM2],
  997. &modulePAStat->end[CMDQ_MODULE_STAT_CAM2]);
  998. cmdq_dev_get_module_PA("mediatek,CAM3", 0,
  999. &modulePAStat->start[CMDQ_MODULE_STAT_CAM3],
  1000. &modulePAStat->end[CMDQ_MODULE_STAT_CAM3]);
  1001. /* Get SODI registers range */
  1002. cmdq_dev_get_module_PA("mediatek,SLEEP", 0,
  1003. &modulePAStat->start[CMDQ_MODULE_STAT_SODI],
  1004. &modulePAStat->end[CMDQ_MODULE_STAT_SODI]);
  1005. #endif
  1006. }
  1007. void cmdq_virtual_function_setting(void)
  1008. {
  1009. cmdqCoreFuncStruct *pFunc;
  1010. pFunc = &(gFunctionPointer);
  1011. /*
  1012. * GCE capability
  1013. */
  1014. pFunc->getSubsysLSBArgA = cmdq_virtual_get_subsys_LSB_in_argA;
  1015. /* HW thread related */
  1016. pFunc->isSecureThread = cmdq_virtual_is_a_secure_thread;
  1017. pFunc->isValidNotifyThread = cmdq_virtual_is_valid_notify_thread_for_secure_path;
  1018. /**
  1019. * Scenario related
  1020. *
  1021. */
  1022. pFunc->isDispScenario = cmdq_virtual_is_disp_scenario;
  1023. pFunc->shouldEnablePrefetch = cmdq_virtual_should_enable_prefetch;
  1024. pFunc->shouldProfile = cmdq_virtual_should_profile;
  1025. pFunc->dispThread = cmdq_virtual_disp_thread;
  1026. pFunc->getThreadID = cmdq_virtual_get_thread_index;
  1027. pFunc->priority = cmdq_virtual_priority_from_scenario;
  1028. pFunc->forceLoopIRQ = cmdq_virtual_force_loop_irq;
  1029. pFunc->isLoopScenario = cmdq_virtual_is_loop_scenario;
  1030. /**
  1031. * Module dependent
  1032. *
  1033. */
  1034. pFunc->getRegID = cmdq_virtual_get_reg_id_from_hwflag;
  1035. pFunc->moduleFromEvent = cmdq_virtual_module_from_event_id;
  1036. pFunc->parseModule = cmdq_virtual_parse_module_from_reg_addr;
  1037. pFunc->moduleEntrySuspend = cmdq_virtual_can_module_entry_suspend;
  1038. pFunc->printStatusClock = cmdq_virtual_print_status_clock;
  1039. pFunc->printStatusSeqClock = cmdq_virtual_print_status_seq_clock;
  1040. pFunc->enableCommonClockLocked = cmdq_virtual_enable_common_clock_locked;
  1041. pFunc->enableGCEClockLocked = cmdq_virtual_enable_gce_clock_locked;
  1042. pFunc->parseErrorModule = cmdq_virtual_parse_error_module_by_hwflag_impl;
  1043. /**
  1044. * Debug
  1045. *
  1046. */
  1047. pFunc->dumpMMSYSConfig = cmdq_virtual_dump_mmsys_config;
  1048. pFunc->dumpClockGating = cmdq_virtual_dump_clock_gating;
  1049. pFunc->dumpSMI = cmdq_virtual_dump_smi;
  1050. pFunc->dumpGPR = cmdq_virtual_dump_gpr;
  1051. /**
  1052. * Record usage
  1053. *
  1054. */
  1055. pFunc->flagFromScenario = cmdq_virtual_flag_from_scenario;
  1056. /**
  1057. * Event backup
  1058. *
  1059. */
  1060. pFunc->initialBackupEvent = cmdq_virtual_initial_backup_event;
  1061. pFunc->eventBackup = cmdq_virtual_event_backup;
  1062. pFunc->eventRestore = cmdq_virtual_event_restore;
  1063. /**
  1064. * Test
  1065. *
  1066. */
  1067. pFunc->testSetup = cmdq_virtual_test_setup;
  1068. pFunc->testCleanup = cmdq_virtual_test_cleanup;
  1069. pFunc->initModulePAStat = cmdq_virtual_init_module_PA_stat;
  1070. }
  1071. cmdqCoreFuncStruct *cmdq_get_func(void)
  1072. {
  1073. return &gFunctionPointer;
  1074. }