cmdq_mdp_common.c 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704
  1. #include "cmdq_mdp_common.h"
  2. #include "cmdq_core.h"
  3. #include "cmdq_device.h"
  4. #include "cmdq_reg.h"
  5. #ifdef CMDQ_PROFILE_MMP
  6. #include "cmdq_mmp.h"
  7. #endif
  8. /**************************************************************************************/
  9. /******************* Platform dependent function ********************/
  10. /**************************************************************************************/
  11. typedef struct RegDef {
  12. int offset;
  13. const char *name;
  14. } RegDef;
  15. void cmdq_mdp_dump_mmsys_config_virtual(void)
  16. {
  17. int i = 0;
  18. uint32_t value = 0;
  19. static const struct RegDef configRegisters[] = {
  20. {0x01c, "ISP_MOUT_EN"},
  21. {0x020, "MDP_RDMA_MOUT_EN"},
  22. {0x024, "MDP_PRZ0_MOUT_EN"},
  23. {0x028, "MDP_PRZ1_MOUT_EN"},
  24. {0x02C, "MDP_TDSHP_MOUT_EN"},
  25. {0x030, "DISP_OVL0_MOUT_EN"},
  26. {0x034, "DISP_OVL1_MOUT_EN"},
  27. {0x038, "DISP_DITHER_MOUT_EN"},
  28. {0x03C, "DISP_UFOE_MOUT_EN"},
  29. /* {0x040, "MMSYS_MOUT_RST"}, */
  30. {0x044, "MDP_PRZ0_SEL_IN"},
  31. {0x048, "MDP_PRZ1_SEL_IN"},
  32. {0x04C, "MDP_TDSHP_SEL_IN"},
  33. {0x050, "MDP_WDMA_SEL_IN"},
  34. {0x054, "MDP_WROT_SEL_IN"},
  35. {0x058, "DISP_COLOR_SEL_IN"},
  36. {0x05C, "DISP_WDMA_SEL_IN"},
  37. {0x060, "DISP_UFOE_SEL_IN"},
  38. {0x064, "DSI0_SEL_IN"},
  39. {0x068, "DPI0_SEL_IN"},
  40. {0x06C, "DISP_RDMA0_SOUT_SEL_IN"},
  41. {0x070, "DISP_RDMA1_SOUT_SEL_IN"},
  42. {0x0F0, "MMSYS_MISC"},
  43. /* ACK and REQ related */
  44. {0x8a0, "DISP_DL_VALID_0"},
  45. {0x8a4, "DISP_DL_VALID_1"},
  46. {0x8a8, "DISP_DL_READY_0"},
  47. {0x8ac, "DISP_DL_READY_1"},
  48. {0x8b0, "MDP_DL_VALID_0"},
  49. {0x8b4, "MDP_DL_READY_0"}
  50. };
  51. for (i = 0; i < sizeof(configRegisters) / sizeof(configRegisters[0]); ++i) {
  52. value = CMDQ_REG_GET16(MMSYS_CONFIG_BASE + configRegisters[i].offset);
  53. CMDQ_ERR("%s: 0x%08x\n", configRegisters[i].name, value);
  54. }
  55. }
  56. /* VENC callback function */
  57. int32_t cmdqVEncDumpInfo_virtual(uint64_t engineFlag, int level)
  58. {
  59. return 0;
  60. }
  61. /* Initialization & de-initialization MDP base VA */
  62. void cmdq_mdp_init_module_base_VA_virtual(void)
  63. {
  64. /* Do Nothing */
  65. }
  66. void cmdq_mdp_deinit_module_base_VA_virtual(void)
  67. {
  68. /* Do Nothing */
  69. }
  70. /* query MDP clock is on */
  71. bool cmdq_mdp_clock_is_on_virtual(CMDQ_ENG_ENUM engine)
  72. {
  73. return false;
  74. }
  75. /* enable MDP clock */
  76. void cmdq_mdp_enable_clock_virtual(bool enable, CMDQ_ENG_ENUM engine)
  77. {
  78. /* Do Nothing */
  79. }
  80. /* Common Clock Framework */
  81. void cmdq_mdp_init_module_clk_virtual(void)
  82. {
  83. /* Do Nothing */
  84. }
  85. /* MDP engine dump */
  86. void cmdq_mdp_dump_rsz_virtual(const unsigned long base, const char *label)
  87. {
  88. uint32_t value[8] = { 0 };
  89. uint32_t request[4] = { 0 };
  90. uint32_t state = 0;
  91. value[0] = CMDQ_REG_GET32(base + 0x004);
  92. value[1] = CMDQ_REG_GET32(base + 0x00C);
  93. value[2] = CMDQ_REG_GET32(base + 0x010);
  94. value[3] = CMDQ_REG_GET32(base + 0x014);
  95. value[4] = CMDQ_REG_GET32(base + 0x018);
  96. CMDQ_REG_SET32(base + 0x040, 0x00000001);
  97. value[5] = CMDQ_REG_GET32(base + 0x044);
  98. CMDQ_REG_SET32(base + 0x040, 0x00000002);
  99. value[6] = CMDQ_REG_GET32(base + 0x044);
  100. CMDQ_REG_SET32(base + 0x040, 0x00000003);
  101. value[7] = CMDQ_REG_GET32(base + 0x044);
  102. CMDQ_ERR("=============== [CMDQ] %s Status ====================================\n", label);
  103. CMDQ_ERR("RSZ_CONTROL: 0x%08x, RSZ_INPUT_IMAGE: 0x%08x RSZ_OUTPUT_IMAGE: 0x%08x\n",
  104. value[0], value[1], value[2]);
  105. CMDQ_ERR("RSZ_HORIZONTAL_COEFF_STEP: 0x%08x, RSZ_VERTICAL_COEFF_STEP: 0x%08x\n",
  106. value[3], value[4]);
  107. CMDQ_ERR("RSZ_DEBUG_1: 0x%08x, RSZ_DEBUG_2: 0x%08x, RSZ_DEBUG_3: 0x%08x\n",
  108. value[5], value[6], value[7]);
  109. /* parse state */
  110. /* .valid=1/request=1: upstream module sends data */
  111. /* .ready=1: downstream module receives data */
  112. state = value[6] & 0xF;
  113. request[0] = state & (0x1); /* out valid */
  114. request[1] = (state & (0x1 << 1)) >> 1; /* out ready */
  115. request[2] = (state & (0x1 << 2)) >> 2; /* in valid */
  116. request[3] = (state & (0x1 << 3)) >> 3; /* in ready */
  117. CMDQ_ERR("RSZ inRdy,inRsq,outRdy,outRsq: %d,%d,%d,%d (%s)\n",
  118. request[3], request[2], request[1], request[0], cmdq_mdp_get_rsz_state(state));
  119. }
  120. void cmdq_mdp_dump_tdshp_virtual(const unsigned long base, const char *label)
  121. {
  122. uint32_t value[8] = { 0 };
  123. value[0] = CMDQ_REG_GET32(base + 0x114);
  124. value[1] = CMDQ_REG_GET32(base + 0x11C);
  125. value[2] = CMDQ_REG_GET32(base + 0x104);
  126. value[3] = CMDQ_REG_GET32(base + 0x108);
  127. value[4] = CMDQ_REG_GET32(base + 0x10C);
  128. value[5] = CMDQ_REG_GET32(base + 0x120);
  129. value[6] = CMDQ_REG_GET32(base + 0x128);
  130. value[7] = CMDQ_REG_GET32(base + 0x110);
  131. CMDQ_ERR("=============== [CMDQ] %s Status ====================================\n", label);
  132. CMDQ_ERR("TDSHP INPUT_CNT: 0x%08x, OUTPUT_CNT: 0x%08x\n", value[0], value[1]);
  133. CMDQ_ERR("TDSHP INTEN: 0x%08x, INTSTA: 0x%08x, 0x10C: 0x%08x\n", value[2], value[3],
  134. value[4]);
  135. CMDQ_ERR("TDSHP CFG: 0x%08x, IN_SIZE: 0x%08x, OUT_SIZE: 0x%08x\n", value[7], value[5],
  136. value[6]);
  137. }
  138. /* MDP callback function */
  139. int32_t cmdqMdpClockOn_virtual(uint64_t engineFlag)
  140. {
  141. return 0;
  142. }
  143. int32_t cmdqMdpDumpInfo_virtual(uint64_t engineFlag, int level)
  144. {
  145. return 0;
  146. }
  147. int32_t cmdqMdpResetEng_virtual(uint64_t engineFlag)
  148. {
  149. return 0;
  150. }
  151. int32_t cmdqMdpClockOff_virtual(uint64_t engineFlag)
  152. {
  153. return 0;
  154. }
  155. /* test MDP clock function */
  156. uint32_t cmdq_mdp_rdma_get_reg_offset_src_addr_virtual(void)
  157. {
  158. return 0;
  159. }
  160. uint32_t cmdq_mdp_wrot_get_reg_offset_dst_addr_virtual(void)
  161. {
  162. return 0;
  163. }
  164. uint32_t cmdq_mdp_wdma_get_reg_offset_dst_addr_virtual(void)
  165. {
  166. return 0;
  167. }
  168. void testcase_clkmgr_mdp_virtual(void)
  169. {
  170. }
  171. /**************************************************************************************/
  172. /************************ Common Code ************************/
  173. /**************************************************************************************/
  174. static cmdqMDPFuncStruct gMDPFunctionPointer;
  175. void cmdq_mdp_virtual_function_setting(void)
  176. {
  177. cmdqMDPFuncStruct *pFunc;
  178. pFunc = &(gMDPFunctionPointer);
  179. pFunc->dumpMMSYSConfig = cmdq_mdp_dump_mmsys_config_virtual;
  180. pFunc->vEncDumpInfo = cmdqVEncDumpInfo_virtual;
  181. pFunc->initModuleBaseVA = cmdq_mdp_init_module_base_VA_virtual;
  182. pFunc->deinitModuleBaseVA = cmdq_mdp_deinit_module_base_VA_virtual;
  183. pFunc->mdpClockIsOn = cmdq_mdp_clock_is_on_virtual;
  184. pFunc->enableMdpClock = cmdq_mdp_enable_clock_virtual;
  185. pFunc->initModuleCLK = cmdq_mdp_init_module_clk_virtual;
  186. pFunc->mdpDumpRsz = cmdq_mdp_dump_rsz_virtual;
  187. pFunc->mdpDumpTdshp = cmdq_mdp_dump_tdshp_virtual;
  188. pFunc->mdpClockOn = cmdqMdpClockOn_virtual;
  189. pFunc->mdpDumpInfo = cmdqMdpDumpInfo_virtual;
  190. pFunc->mdpResetEng = cmdqMdpResetEng_virtual;
  191. pFunc->mdpClockOff = cmdqMdpClockOff_virtual;
  192. pFunc->rdmaGetRegOffsetSrcAddr = cmdq_mdp_rdma_get_reg_offset_src_addr_virtual;
  193. pFunc->wrotGetRegOffsetDstAddr = cmdq_mdp_wrot_get_reg_offset_dst_addr_virtual;
  194. pFunc->wdmaGetRegOffsetDstAddr = cmdq_mdp_wdma_get_reg_offset_dst_addr_virtual;
  195. pFunc->testcaseClkmgrMdp = testcase_clkmgr_mdp_virtual;
  196. }
  197. cmdqMDPFuncStruct *cmdq_mdp_get_func(void)
  198. {
  199. return &gMDPFunctionPointer;
  200. }
  201. void cmdq_mdp_enable(uint64_t engineFlag, CMDQ_ENG_ENUM engine)
  202. {
  203. #ifdef CMDQ_PWR_AWARE
  204. CMDQ_VERBOSE("Test for ENG %d\n", engine);
  205. if (engineFlag & (1LL << engine))
  206. cmdq_mdp_get_func()->enableMdpClock(true, engine);
  207. #endif
  208. }
  209. int cmdq_mdp_loop_reset_impl(const unsigned long resetReg,
  210. const uint32_t resetWriteValue,
  211. const unsigned long resetStateReg,
  212. const uint32_t resetMask,
  213. const uint32_t resetPollingValue, const int32_t maxLoopCount)
  214. {
  215. int loop = 0;
  216. CMDQ_REG_SET32(resetReg, resetWriteValue);
  217. while (loop < maxLoopCount) {
  218. if (resetPollingValue == (CMDQ_REG_GET32(resetStateReg) & resetMask))
  219. break;
  220. loop++;
  221. }
  222. /* return polling result */
  223. if (loop >= maxLoopCount) {
  224. CMDQ_ERR
  225. ("%s failed, Reg:0x%lx, writeValue:0x%08x, stateReg:0x%lx, mask:0x%08x, pollingValue:0x%08x\n",
  226. __func__, resetReg, resetWriteValue, resetStateReg, resetMask,
  227. resetPollingValue);
  228. return -EFAULT;
  229. }
  230. return 0;
  231. }
  232. int cmdq_mdp_loop_reset(CMDQ_ENG_ENUM engine,
  233. const unsigned long resetReg,
  234. const unsigned long resetStateReg,
  235. const uint32_t resetMask,
  236. const uint32_t resetValue, const bool pollInitResult)
  237. {
  238. #ifdef CMDQ_PWR_AWARE
  239. int resetStatus = 0;
  240. int initStatus = 0;
  241. if (cmdq_mdp_get_func()->mdpClockIsOn(engine)) {
  242. CMDQ_PROF_START(current->pid, __func__);
  243. CMDQ_PROF_MMP(cmdq_mmp_get_event()->MDP_reset,
  244. MMProfileFlagStart, resetReg, resetStateReg);
  245. /* loop reset */
  246. resetStatus = cmdq_mdp_loop_reset_impl(resetReg, 0x1,
  247. resetStateReg, resetMask, resetValue,
  248. CMDQ_MAX_LOOP_COUNT);
  249. if (pollInitResult) {
  250. /* loop init */
  251. initStatus = cmdq_mdp_loop_reset_impl(resetReg, 0x0,
  252. resetStateReg, resetMask, 0x0,
  253. CMDQ_MAX_LOOP_COUNT);
  254. } else {
  255. /* always clear to init state no matter what polling result */
  256. CMDQ_REG_SET32(resetReg, 0x0);
  257. }
  258. CMDQ_PROF_MMP(cmdq_mmp_get_event()->MDP_reset,
  259. MMProfileFlagEnd, resetReg, resetStateReg);
  260. CMDQ_PROF_END(current->pid, __func__);
  261. /* retrun failed if loop failed */
  262. if ((0 > resetStatus) || (0 > initStatus)) {
  263. CMDQ_ERR("Reset MDP %ld failed, resetStatus:%d, initStatus:%d\n",
  264. resetReg, resetStatus, initStatus);
  265. return -EFAULT;
  266. }
  267. }
  268. #endif
  269. return 0;
  270. };
  271. void cmdq_mdp_loop_off(CMDQ_ENG_ENUM engine,
  272. const unsigned long resetReg,
  273. const unsigned long resetStateReg,
  274. const uint32_t resetMask,
  275. const uint32_t resetValue, const bool pollInitResult)
  276. {
  277. #ifdef CMDQ_PWR_AWARE
  278. int resetStatus = 0;
  279. int initStatus = 0;
  280. if (cmdq_mdp_get_func()->mdpClockIsOn(engine)) {
  281. /* loop reset */
  282. resetStatus = cmdq_mdp_loop_reset_impl(resetReg, 0x1,
  283. resetStateReg, resetMask, resetValue,
  284. CMDQ_MAX_LOOP_COUNT);
  285. if (pollInitResult) {
  286. /* loop init */
  287. initStatus = cmdq_mdp_loop_reset_impl(resetReg, 0x0,
  288. resetStateReg, resetMask, 0x0,
  289. CMDQ_MAX_LOOP_COUNT);
  290. } else {
  291. /* always clear to init state no matter what polling result */
  292. CMDQ_REG_SET32(resetReg, 0x0);
  293. }
  294. /* retrun failed if loop failed */
  295. if ((0 > resetStatus) || (0 > initStatus)) {
  296. CMDQ_AEE("MDP",
  297. "Disable %ld engine failed, resetStatus:%d, initStatus:%d\n",
  298. resetReg, resetStatus, initStatus);
  299. return;
  300. }
  301. cmdq_mdp_get_func()->enableMdpClock(false, engine);
  302. }
  303. #endif
  304. }
  305. void cmdq_mdp_dump_venc(const unsigned long base, const char *label)
  306. {
  307. CMDQ_ERR("======== cmdq_mdp_dump_venc + ========\n");
  308. CMDQ_ERR("[0x%lx] to [0x%lx]\n", base, base + 0x1000 * 4);
  309. print_hex_dump(KERN_ERR, "[CMDQ][ERR][VENC]", DUMP_PREFIX_ADDRESS, 16, 4,
  310. (void *)base, 0x1000, false);
  311. CMDQ_ERR("======== cmdq_mdp_dump_venc - ========\n");
  312. }
  313. const char *cmdq_mdp_get_rdma_state(uint32_t state)
  314. {
  315. switch (state) {
  316. case 0x1:
  317. return "idle";
  318. case 0x2:
  319. return "wait sof";
  320. case 0x4:
  321. return "reg update";
  322. case 0x8:
  323. return "clear0";
  324. case 0x10:
  325. return "clear1";
  326. case 0x20:
  327. return "int0";
  328. case 0x40:
  329. return "int1";
  330. case 0x80:
  331. return "data running";
  332. case 0x100:
  333. return "wait done";
  334. case 0x200:
  335. return "warm reset";
  336. case 0x400:
  337. return "wait reset";
  338. default:
  339. return "";
  340. }
  341. }
  342. void cmdq_mdp_dump_rdma(const unsigned long base, const char *label)
  343. {
  344. uint32_t value[15] = { 0 };
  345. uint32_t state = 0;
  346. uint32_t grep = 0;
  347. value[0] = CMDQ_REG_GET32(base + 0x030);
  348. value[1] = CMDQ_REG_GET32(base + cmdq_mdp_get_func()->rdmaGetRegOffsetSrcAddr());
  349. value[2] = CMDQ_REG_GET32(base + 0x060);
  350. value[3] = CMDQ_REG_GET32(base + 0x070);
  351. value[4] = CMDQ_REG_GET32(base + 0x078);
  352. value[5] = CMDQ_REG_GET32(base + 0x080);
  353. value[6] = CMDQ_REG_GET32(base + 0x100);
  354. value[7] = CMDQ_REG_GET32(base + 0x118);
  355. value[8] = CMDQ_REG_GET32(base + 0x130);
  356. value[9] = CMDQ_REG_GET32(base + 0x400);
  357. value[10] = CMDQ_REG_GET32(base + 0x408);
  358. value[11] = CMDQ_REG_GET32(base + 0x410);
  359. value[12] = CMDQ_REG_GET32(base + 0x420);
  360. value[13] = CMDQ_REG_GET32(base + 0x430);
  361. value[14] = CMDQ_REG_GET32(base + 0x4D0);
  362. CMDQ_ERR("=============== [CMDQ] %s Status ====================================\n", label);
  363. CMDQ_ERR
  364. ("RDMA_SRC_CON: 0x%08x, RDMA_SRC_BASE_0: 0x%08x, RDMA_MF_BKGD_SIZE_IN_BYTE: 0x%08x\n",
  365. value[0], value[1], value[2]);
  366. CMDQ_ERR("RDMA_MF_SRC_SIZE: 0x%08x, RDMA_MF_CLIP_SIZE: 0x%08x, RDMA_MF_OFFSET_1: 0x%08x\n",
  367. value[3], value[4], value[5]);
  368. CMDQ_ERR("RDMA_SRC_END_0: 0x%08x, RDMA_SRC_OFFSET_0: 0x%08x, RDMA_SRC_OFFSET_W_0: 0x%08x\n",
  369. value[6], value[7], value[8]);
  370. CMDQ_ERR("RDMA_MON_STA_0: 0x%08x, RDMA_MON_STA_1: 0x%08x, RDMA_MON_STA_2: 0x%08x\n",
  371. value[9], value[10], value[11]);
  372. CMDQ_ERR("RDMA_MON_STA_4: 0x%08x, RDMA_MON_STA_6: 0x%08x, RDMA_MON_STA_26: 0x%08x\n",
  373. value[12], value[13], value[14]);
  374. /* parse state */
  375. CMDQ_ERR("RDMA ack:%d req:%d\n", (value[9] & (1 << 11)) >> 11,
  376. (value[9] & (1 << 10)) >> 10);
  377. state = (value[10] >> 8) & 0x7FF;
  378. grep = (value[10] >> 20) & 0x1;
  379. CMDQ_ERR("RDMA state: 0x%x (%s)\n", state, cmdq_mdp_get_rdma_state(state));
  380. CMDQ_ERR("RDMA horz_cnt: %d vert_cnt:%d\n", value[14] & 0xFFF, (value[14] >> 16) & 0xFFF);
  381. CMDQ_ERR("RDMA grep:%d => suggest to ask SMI help:%d\n", grep, grep);
  382. }
  383. const char *cmdq_mdp_get_rsz_state(const uint32_t state)
  384. {
  385. switch (state) {
  386. case 0x5:
  387. return "downstream hang"; /* 0,1,0,1 */
  388. case 0xa:
  389. return "upstream hang"; /* 1,0,1,0 */
  390. default:
  391. return "";
  392. }
  393. }
  394. void cmdq_mdp_dump_rot(const unsigned long base, const char *label)
  395. {
  396. uint32_t value[32] = { 0 };
  397. value[0] = CMDQ_REG_GET32(base + 0x000);
  398. value[1] = CMDQ_REG_GET32(base + 0x008);
  399. value[2] = CMDQ_REG_GET32(base + 0x00C);
  400. value[3] = CMDQ_REG_GET32(base + 0x024);
  401. value[4] = CMDQ_REG_GET32(base + cmdq_mdp_get_func()->wrotGetRegOffsetDstAddr());
  402. value[5] = CMDQ_REG_GET32(base + 0x02C);
  403. value[6] = CMDQ_REG_GET32(base + 0x004);
  404. value[7] = CMDQ_REG_GET32(base + 0x030);
  405. value[8] = CMDQ_REG_GET32(base + 0x078);
  406. value[9] = CMDQ_REG_GET32(base + 0x070);
  407. CMDQ_REG_SET32(base + 0x018, 0x00000100);
  408. value[10] = CMDQ_REG_GET32(base + 0x0D0);
  409. CMDQ_REG_SET32(base + 0x018, 0x00000200);
  410. value[11] = CMDQ_REG_GET32(base + 0x0D0);
  411. CMDQ_REG_SET32(base + 0x018, 0x00000300);
  412. value[12] = CMDQ_REG_GET32(base + 0x0D0);
  413. CMDQ_REG_SET32(base + 0x018, 0x00000400);
  414. value[13] = CMDQ_REG_GET32(base + 0x0D0);
  415. CMDQ_REG_SET32(base + 0x018, 0x00000500);
  416. value[14] = CMDQ_REG_GET32(base + 0x0D0);
  417. CMDQ_REG_SET32(base + 0x018, 0x00000600);
  418. value[15] = CMDQ_REG_GET32(base + 0x0D0);
  419. CMDQ_REG_SET32(base + 0x018, 0x00000700);
  420. value[16] = CMDQ_REG_GET32(base + 0x0D0);
  421. CMDQ_REG_SET32(base + 0x018, 0x00000800);
  422. value[17] = CMDQ_REG_GET32(base + 0x0D0);
  423. CMDQ_REG_SET32(base + 0x018, 0x00000900);
  424. value[18] = CMDQ_REG_GET32(base + 0x0D0);
  425. CMDQ_REG_SET32(base + 0x018, 0x00000A00);
  426. value[19] = CMDQ_REG_GET32(base + 0x0D0);
  427. CMDQ_REG_SET32(base + 0x018, 0x00000B00);
  428. value[20] = CMDQ_REG_GET32(base + 0x0D0);
  429. CMDQ_REG_SET32(base + 0x018, 0x00000C00);
  430. value[21] = CMDQ_REG_GET32(base + 0x0D0);
  431. CMDQ_REG_SET32(base + 0x018, 0x00000D00);
  432. value[22] = CMDQ_REG_GET32(base + 0x0D0);
  433. CMDQ_REG_SET32(base + 0x018, 0x00000E00);
  434. value[23] = CMDQ_REG_GET32(base + 0x0D0);
  435. CMDQ_REG_SET32(base + 0x018, 0x00000F00);
  436. value[24] = CMDQ_REG_GET32(base + 0x0D0);
  437. CMDQ_REG_SET32(base + 0x018, 0x00001000);
  438. value[25] = CMDQ_REG_GET32(base + 0x0D0);
  439. CMDQ_REG_SET32(base + 0x018, 0x00001100);
  440. value[26] = CMDQ_REG_GET32(base + 0x0D0);
  441. CMDQ_REG_SET32(base + 0x018, 0x00001200);
  442. value[27] = CMDQ_REG_GET32(base + 0x0D0);
  443. CMDQ_REG_SET32(base + 0x018, 0x00001300);
  444. value[28] = CMDQ_REG_GET32(base + 0x0D0);
  445. CMDQ_REG_SET32(base + 0x018, 0x00001400);
  446. value[29] = CMDQ_REG_GET32(base + 0x0D0);
  447. value[30] = CMDQ_REG_GET32(base + 0x01C);
  448. CMDQ_ERR("=============== [CMDQ] %s Status ====================================\n", label);
  449. CMDQ_ERR("ROT_CTRL: 0x%08x, ROT_MAIN_BUF_SIZE: 0x%08x, ROT_SUB_BUF_SIZE: 0x%08x\n",
  450. value[0], value[1], value[2]);
  451. CMDQ_ERR("ROT_TAR_SIZE: 0x%08x, ROT_BASE_ADDR: 0x%08x, ROT_OFST_ADDR: 0x%08x\n",
  452. value[3], value[4], value[5]);
  453. CMDQ_ERR("ROT_DMA_PERF: 0x%08x, ROT_STRIDE: 0x%08x, ROT_IN_SIZE: 0x%08x\n",
  454. value[6], value[7], value[8]);
  455. CMDQ_ERR("ROT_EOL: 0x%08x, ROT_DBUGG_1: 0x%08x, ROT_DEBUBG_2: 0x%08x\n",
  456. value[9], value[10], value[11]);
  457. CMDQ_ERR("ROT_DBUGG_3: 0x%08x, ROT_DBUGG_4: 0x%08x, ROT_DEBUBG_5: 0x%08x\n",
  458. value[12], value[13], value[14]);
  459. CMDQ_ERR("ROT_DBUGG_6: 0x%08x, ROT_DBUGG_7: 0x%08x, ROT_DEBUBG_8: 0x%08x\n",
  460. value[15], value[16], value[17]);
  461. CMDQ_ERR("ROT_DBUGG_9: 0x%08x, ROT_DBUGG_A: 0x%08x, ROT_DEBUBG_B: 0x%08x\n",
  462. value[18], value[19], value[20]);
  463. CMDQ_ERR("ROT_DBUGG_C: 0x%08x, ROT_DBUGG_D: 0x%08x, ROT_DEBUBG_E: 0x%08x\n",
  464. value[21], value[22], value[23]);
  465. CMDQ_ERR("ROT_DBUGG_F: 0x%08x, ROT_DBUGG_10: 0x%08x, ROT_DEBUBG_11: 0x%08x\n",
  466. value[24], value[25], value[26]);
  467. CMDQ_ERR("ROT_DEBUG_12: 0x%08x, ROT_DBUGG_13: 0x%08x, ROT_DBUGG_14: 0x%08x\n",
  468. value[27], value[28], value[29]);
  469. CMDQ_ERR("VIDO_INT: 0x%08x\n", value[30]);
  470. }
  471. void cmdq_mdp_dump_color(const unsigned long base, const char *label)
  472. {
  473. uint32_t value[13] = { 0 };
  474. value[0] = CMDQ_REG_GET32(base + 0x400);
  475. value[1] = CMDQ_REG_GET32(base + 0x404);
  476. value[2] = CMDQ_REG_GET32(base + 0x408);
  477. value[3] = CMDQ_REG_GET32(base + 0x40C);
  478. value[4] = CMDQ_REG_GET32(base + 0x410);
  479. value[5] = CMDQ_REG_GET32(base + 0x420);
  480. value[6] = CMDQ_REG_GET32(base + 0xC00);
  481. value[7] = CMDQ_REG_GET32(base + 0xC04);
  482. value[8] = CMDQ_REG_GET32(base + 0xC08);
  483. value[9] = CMDQ_REG_GET32(base + 0xC0C);
  484. value[10] = CMDQ_REG_GET32(base + 0xC10);
  485. value[11] = CMDQ_REG_GET32(base + 0xC50);
  486. value[12] = CMDQ_REG_GET32(base + 0xC54);
  487. CMDQ_ERR("=============== [CMDQ] %s Status ====================================\n", label);
  488. CMDQ_ERR("COLOR CFG_MAIN: 0x%08x\n", value[0]);
  489. CMDQ_ERR("COLOR PXL_CNT_MAIN: 0x%08x, LINE_CNT_MAIN: 0x%08x\n", value[1], value[2]);
  490. CMDQ_ERR("COLOR WIN_X_MAIN: 0x%08x, WIN_Y_MAIN: 0x%08x, DBG_CFG_MAIN: 0x%08x\n", value[3], value[4],
  491. value[5]);
  492. CMDQ_ERR("COLOR START: 0x%08x, INTEN: 0x%08x, INTSTA: 0x%08x\n", value[6], value[7],
  493. value[8]);
  494. CMDQ_ERR("COLOR OUT_SEL: 0x%08x, FRAME_DONE_DEL: 0x%08x\n", value[9], value[10]);
  495. CMDQ_ERR("COLOR INTERNAL_IP_WIDTH: 0x%08x, INTERNAL_IP_HEIGHT: 0x%08x\n", value[11], value[12]);
  496. }
  497. const char *cmdq_mdp_get_wdma_state(uint32_t state)
  498. {
  499. switch (state) {
  500. case 0x1:
  501. return "idle";
  502. case 0x2:
  503. return "clear";
  504. case 0x4:
  505. return "prepare";
  506. case 0x8:
  507. return "prepare";
  508. case 0x10:
  509. return "data running";
  510. case 0x20:
  511. return "eof wait";
  512. case 0x40:
  513. return "soft reset wait";
  514. case 0x80:
  515. return "eof done";
  516. case 0x100:
  517. return "sof reset done";
  518. case 0x200:
  519. return "frame complete";
  520. default:
  521. return "";
  522. }
  523. }
  524. void cmdq_mdp_dump_wdma(const unsigned long base, const char *label)
  525. {
  526. uint32_t value[40] = { 0 };
  527. uint32_t state = 0;
  528. uint32_t grep = 0; /* grep bit = 1, WDMA has sent request to SMI, and not receive done yet */
  529. uint32_t isFIFOFull = 0; /* 1 for WDMA FIFO full */
  530. value[0] = CMDQ_REG_GET32(base + 0x014);
  531. value[1] = CMDQ_REG_GET32(base + 0x018);
  532. value[2] = CMDQ_REG_GET32(base + 0x028);
  533. value[3] = CMDQ_REG_GET32(base + cmdq_mdp_get_func()->wdmaGetRegOffsetDstAddr());
  534. value[4] = CMDQ_REG_GET32(base + 0x078);
  535. value[5] = CMDQ_REG_GET32(base + 0x080);
  536. value[6] = CMDQ_REG_GET32(base + 0x0A0);
  537. value[7] = CMDQ_REG_GET32(base + 0x0A8);
  538. CMDQ_REG_SET32(base + 0x014, (value[0] & (0x0FFFFFFF)));
  539. value[8] = CMDQ_REG_GET32(base + 0x014);
  540. value[9] = CMDQ_REG_GET32(base + 0x0AC);
  541. CMDQ_REG_SET32(base + 0x014, 0x10000000 | (value[0] & (0x0FFFFFFF)));
  542. value[10] = CMDQ_REG_GET32(base + 0x014);
  543. value[11] = CMDQ_REG_GET32(base + 0x0AC);
  544. CMDQ_REG_SET32(base + 0x014, 0x20000000 | (value[0] & (0x0FFFFFFF)));
  545. value[12] = CMDQ_REG_GET32(base + 0x014);
  546. value[13] = CMDQ_REG_GET32(base + 0x0AC);
  547. CMDQ_REG_SET32(base + 0x014, 0x30000000 | (value[0] & (0x0FFFFFFF)));
  548. value[14] = CMDQ_REG_GET32(base + 0x014);
  549. value[15] = CMDQ_REG_GET32(base + 0x0AC);
  550. CMDQ_REG_SET32(base + 0x014, 0x40000000 | (value[0] & (0x0FFFFFFF)));
  551. value[16] = CMDQ_REG_GET32(base + 0x014);
  552. value[17] = CMDQ_REG_GET32(base + 0x0AC);
  553. CMDQ_REG_SET32(base + 0x014, 0x50000000 | (value[0] & (0x0FFFFFFF)));
  554. value[18] = CMDQ_REG_GET32(base + 0x014);
  555. value[19] = CMDQ_REG_GET32(base + 0x0AC);
  556. CMDQ_REG_SET32(base + 0x014, 0x60000000 | (value[0] & (0x0FFFFFFF)));
  557. value[20] = CMDQ_REG_GET32(base + 0x014);
  558. value[21] = CMDQ_REG_GET32(base + 0x0AC);
  559. CMDQ_REG_SET32(base + 0x014, 0x70000000 | (value[0] & (0x0FFFFFFF)));
  560. value[22] = CMDQ_REG_GET32(base + 0x014);
  561. value[23] = CMDQ_REG_GET32(base + 0x0AC);
  562. CMDQ_REG_SET32(base + 0x014, 0x80000000 | (value[0] & (0x0FFFFFFF)));
  563. value[24] = CMDQ_REG_GET32(base + 0x014);
  564. value[25] = CMDQ_REG_GET32(base + 0x0AC);
  565. CMDQ_REG_SET32(base + 0x014, 0x90000000 | (value[0] & (0x0FFFFFFF)));
  566. value[26] = CMDQ_REG_GET32(base + 0x014);
  567. value[27] = CMDQ_REG_GET32(base + 0x0AC);
  568. CMDQ_REG_SET32(base + 0x014, 0xA0000000 | (value[0] & (0x0FFFFFFF)));
  569. value[28] = CMDQ_REG_GET32(base + 0x014);
  570. value[29] = CMDQ_REG_GET32(base + 0x0AC);
  571. CMDQ_REG_SET32(base + 0x014, 0xB0000000 | (value[0] & (0x0FFFFFFF)));
  572. value[30] = CMDQ_REG_GET32(base + 0x014);
  573. value[31] = CMDQ_REG_GET32(base + 0x0AC);
  574. CMDQ_REG_SET32(base + 0x014, 0xC0000000 | (value[0] & (0x0FFFFFFF)));
  575. value[32] = CMDQ_REG_GET32(base + 0x014);
  576. value[33] = CMDQ_REG_GET32(base + 0x0AC);
  577. CMDQ_REG_SET32(base + 0x014, 0xD0000000 | (value[0] & (0x0FFFFFFF)));
  578. value[34] = CMDQ_REG_GET32(base + 0x014);
  579. value[35] = CMDQ_REG_GET32(base + 0x0AC);
  580. CMDQ_REG_SET32(base + 0x014, 0xE0000000 | (value[0] & (0x0FFFFFFF)));
  581. value[36] = CMDQ_REG_GET32(base + 0x014);
  582. value[37] = CMDQ_REG_GET32(base + 0x0AC);
  583. CMDQ_REG_SET32(base + 0x014, 0xF0000000 | (value[0] & (0x0FFFFFFF)));
  584. value[38] = CMDQ_REG_GET32(base + 0x014);
  585. value[39] = CMDQ_REG_GET32(base + 0x0AC);
  586. CMDQ_ERR("=============== [CMDQ] %s Status ====================================\n", label);
  587. CMDQ_ERR("[CMDQ]WDMA_CFG: 0x%08x, WDMA_SRC_SIZE: 0x%08x, WDMA_DST_W_IN_BYTE = 0x%08x\n",
  588. value[0], value[1], value[2]);
  589. CMDQ_ERR
  590. ("[CMDQ]WDMA_DST_ADDR0: 0x%08x, WDMA_DST_UV_PITCH: 0x%08x, WDMA_DST_ADDR_OFFSET0 = 0x%08x\n",
  591. value[3], value[4], value[5]);
  592. CMDQ_ERR("[CMDQ]WDMA_STATUS: 0x%08x, WDMA_INPUT_CNT: 0x%08x\n", value[6], value[7]);
  593. /* Dump Addtional WDMA debug info */
  594. CMDQ_ERR("WDMA_DEBUG_0 +014: 0x%08x , +0ac: 0x%08x\n", value[8], value[9]);
  595. CMDQ_ERR("WDMA_DEBUG_1 +014: 0x%08x , +0ac: 0x%08x\n", value[10], value[11]);
  596. CMDQ_ERR("WDMA_DEBUG_2 +014: 0x%08x , +0ac: 0x%08x\n", value[12], value[13]);
  597. CMDQ_ERR("WDMA_DEBUG_3 +014: 0x%08x , +0ac: 0x%08x\n", value[14], value[15]);
  598. CMDQ_ERR("WDMA_DEBUG_4 +014: 0x%08x , +0ac: 0x%08x\n", value[16], value[17]);
  599. CMDQ_ERR("WDMA_DEBUG_5 +014: 0x%08x , +0ac: 0x%08x\n", value[18], value[19]);
  600. CMDQ_ERR("WDMA_DEBUG_6 +014: 0x%08x , +0ac: 0x%08x\n", value[20], value[21]);
  601. CMDQ_ERR("WDMA_DEBUG_7 +014: 0x%08x , +0ac: 0x%08x\n", value[22], value[23]);
  602. CMDQ_ERR("WDMA_DEBUG_8 +014: 0x%08x , +0ac: 0x%08x\n", value[24], value[25]);
  603. CMDQ_ERR("WDMA_DEBUG_9 +014: 0x%08x , +0ac: 0x%08x\n", value[26], value[27]);
  604. CMDQ_ERR("WDMA_DEBUG_A +014: 0x%08x , +0ac: 0x%08x\n", value[28], value[29]);
  605. CMDQ_ERR("WDMA_DEBUG_B +014: 0x%08x , +0ac: 0x%08x\n", value[30], value[31]);
  606. CMDQ_ERR("WDMA_DEBUG_C +014: 0x%08x , +0ac: 0x%08x\n", value[32], value[33]);
  607. CMDQ_ERR("WDMA_DEBUG_D +014: 0x%08x , +0ac: 0x%08x\n", value[34], value[35]);
  608. CMDQ_ERR("WDMA_DEBUG_E +014: 0x%08x , +0ac: 0x%08x\n", value[36], value[37]);
  609. CMDQ_ERR("WDMA_DEBUG_F +014: 0x%08x , +0ac: 0x%08x\n", value[38], value[39]);
  610. /* parse WDMA state */
  611. state = value[6] & 0x3FF;
  612. grep = (value[6] >> 13) & 0x1;
  613. isFIFOFull = (value[6] >> 12) & 0x1;
  614. CMDQ_ERR("WDMA state:0x%x (%s)\n", state, cmdq_mdp_get_wdma_state(state));
  615. CMDQ_ERR("WDMA in_req:%d in_ack:%d\n", (value[6] >> 15) & 0x1, (value[6] >> 14) & 0x1);
  616. /* note WDMA send request(i.e command) to SMI first, then SMI takes request data from WDMA FIFO */
  617. /* if SMI dose not process request and upstream HWs */
  618. /* such as MDP_RSZ send data to WDMA, WDMA FIFO will full finally */
  619. CMDQ_ERR("WDMA grep:%d, FIFO full:%d\n", grep, isFIFOFull);
  620. CMDQ_ERR("WDMA suggest: Need SMI help:%d, Need check WDMA config:%d\n", (grep),
  621. ((0 == grep) && (1 == isFIFOFull)));
  622. }