cmdq_mdp_common.c 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521
  1. #include "cmdq_mdp_common.h"
  2. #include "cmdq_core.h"
  3. #include "cmdq_reg.h"
  4. #include "cmdq_mmp.h"
  5. #include "cmdq_mdp.h"
  6. #ifdef CMDQ_MET_READY
  7. #include <linux/met_drv.h>
  8. #endif
  9. void cmdq_mdp_enable(uint64_t engineFlag,
  10. enum CMDQ_CLK_ENUM gateId, enum CMDQ_ENG_ENUM engine, const char *name)
  11. {
  12. #ifdef CMDQ_PWR_AWARE
  13. CMDQ_VERBOSE("Test for ENG %d\n", engine);
  14. if (engineFlag & (1LL << engine)) {
  15. CMDQ_MSG("Enable %s clock\n", name);
  16. cmdq_core_enable_ccf_clk(gateId);
  17. }
  18. #endif
  19. }
  20. int cmdq_mdp_loop_reset_impl(const unsigned long resetReg,
  21. const uint32_t resetWriteValue,
  22. const unsigned long resetStateReg,
  23. const uint32_t resetMask,
  24. const uint32_t resetPollingValue,
  25. const char *name, const int32_t maxLoopCount)
  26. {
  27. int loop = 0;
  28. CMDQ_REG_SET32(resetReg, resetWriteValue);
  29. while (loop < maxLoopCount) {
  30. if (resetPollingValue == (CMDQ_REG_GET32(resetStateReg) & resetMask))
  31. break;
  32. loop++;
  33. }
  34. /* return polling result */
  35. if (loop >= maxLoopCount) {
  36. CMDQ_ERR
  37. ("%s failed, Reg:0x%lx, writeValue:0x%08x, stateReg:0x%lx, mask:0x%08x, pollingValue:0x%08x\n",
  38. __func__, resetReg, resetWriteValue, resetStateReg, resetMask,
  39. resetPollingValue);
  40. return -EFAULT;
  41. }
  42. return 0;
  43. }
  44. /* CCF */
  45. /* int cmdq_mdp_loop_reset(enum cg_clk_id clkId, */
  46. int cmdq_mdp_loop_reset(enum CMDQ_CLK_ENUM clkId,
  47. const unsigned long resetReg,
  48. const unsigned long resetStateReg,
  49. const uint32_t resetMask,
  50. const uint32_t resetValue, const char *name, const bool pollInitResult)
  51. {
  52. #ifdef CMDQ_PWR_AWARE
  53. int resetStatus = 0;
  54. int initStatus = 0;
  55. /* CCF */
  56. /* if (clock_is_on(clkId)) { */
  57. if (cmdq_core_clock_is_on(clkId)) {
  58. CMDQ_PROF_START(current->pid, __func__);
  59. CMDQ_PROF_MMP(cmdq_mmp_get_event()->MDP_reset,
  60. MMProfileFlagStart, resetReg, resetStateReg);
  61. /* loop reset */
  62. resetStatus = cmdq_mdp_loop_reset_impl(resetReg, 0x1,
  63. resetStateReg, resetMask, resetValue,
  64. name, CMDQ_MAX_LOOP_COUNT);
  65. if (pollInitResult) {
  66. /* loop init */
  67. initStatus = cmdq_mdp_loop_reset_impl(resetReg, 0x0,
  68. resetStateReg, resetMask, 0x0,
  69. name, CMDQ_MAX_LOOP_COUNT);
  70. }
  71. /* always clear to init state no matter what polling result */
  72. else
  73. CMDQ_REG_SET32(resetReg, 0x0);
  74. CMDQ_PROF_MMP(cmdq_mmp_get_event()->MDP_reset,
  75. MMProfileFlagEnd, resetReg, resetStateReg);
  76. CMDQ_PROF_END(current->pid, __func__);
  77. /* retrun failed if loop failed */
  78. if ((0 > resetStatus) || (0 > initStatus)) {
  79. CMDQ_ERR("Reset MDP %s failed, resetStatus:%d, initStatus:%d\n",
  80. name, resetStatus, initStatus);
  81. return -EFAULT;
  82. }
  83. }
  84. #endif
  85. return 0;
  86. };
  87. /* CCF */
  88. /* void cmdq_mdp_loop_off(enum cg_clk_id clkId, */
  89. void cmdq_mdp_loop_off(enum CMDQ_CLK_ENUM clkId,
  90. const unsigned long resetReg,
  91. const unsigned long resetStateReg,
  92. const uint32_t resetMask,
  93. const uint32_t resetValue, const char *name, const bool pollInitResult)
  94. {
  95. #ifdef CMDQ_PWR_AWARE
  96. int resetStatus = 0;
  97. int initStatus = 0;
  98. /* CCF */
  99. /* if (clock_is_on(clkId)) { */
  100. if (cmdq_core_clock_is_on(clkId)) {
  101. /* loop reset */
  102. resetStatus = cmdq_mdp_loop_reset_impl(resetReg, 0x1,
  103. resetStateReg, resetMask, resetValue,
  104. name, CMDQ_MAX_LOOP_COUNT);
  105. if (pollInitResult) {
  106. /* loop init */
  107. initStatus = cmdq_mdp_loop_reset_impl(resetReg, 0x0,
  108. resetStateReg, resetMask, 0x0,
  109. name, CMDQ_MAX_LOOP_COUNT);
  110. }
  111. /* always clear to init state no matter what polling result */
  112. else
  113. CMDQ_REG_SET32(resetReg, 0x0);
  114. /* retrun failed if loop failed */
  115. if ((0 > resetStatus) || (0 > initStatus)) {
  116. CMDQ_ERR("Disable %s engine failed, resetStatus:%d, initStatus:%d\n",
  117. name, resetStatus, initStatus);
  118. CMDQ_AEE("MDP", "Disable %s engine failed, resetStatus:%d, initStatus:%d\n",
  119. name, resetStatus, initStatus);
  120. return;
  121. }
  122. CMDQ_MSG("Disable %s clock\n", name);
  123. /* CCF */
  124. /* disable_clock(clkId, (char *)name); */
  125. cmdq_core_disable_ccf_clk(clkId);
  126. }
  127. #endif
  128. }
  129. void cmdq_mdp_dump_venc(const unsigned long base, const char *label)
  130. {
  131. CMDQ_ERR("======== cmdq_mdp_dump_venc + ========\n");
  132. CMDQ_ERR("[0x%lx] to [0x%lx]\n", base, base + 0x1000 * 4);
  133. print_hex_dump(KERN_ERR, "[CMDQ][ERR][VENC]", DUMP_PREFIX_ADDRESS, 16, 4,
  134. (void *)base, 0x1000, false);
  135. CMDQ_ERR("======== cmdq_mdp_dump_venc - ========\n");
  136. }
  137. const char *cmdq_mdp_get_rdma_state(uint32_t state)
  138. {
  139. switch (state) {
  140. case 0x1:
  141. return "idle";
  142. case 0x2:
  143. return "wait sof";
  144. case 0x4:
  145. return "reg update";
  146. case 0x8:
  147. return "clear0";
  148. case 0x10:
  149. return "clear1";
  150. case 0x20:
  151. return "int0";
  152. case 0x40:
  153. return "int1";
  154. case 0x80:
  155. return "data running";
  156. case 0x100:
  157. return "wait done";
  158. case 0x200:
  159. return "warm reset";
  160. case 0x400:
  161. return "wait reset";
  162. default:
  163. return "";
  164. }
  165. }
  166. void cmdq_mdp_dump_rdma(const unsigned long base, const char *label)
  167. {
  168. uint32_t value[15] = { 0 };
  169. uint32_t state = 0;
  170. uint32_t grep = 0;
  171. value[0] = CMDQ_REG_GET32(base + 0x030);
  172. value[1] = CMDQ_REG_GET32(base + 0xF00);
  173. value[2] = CMDQ_REG_GET32(base + 0x060);
  174. value[3] = CMDQ_REG_GET32(base + 0x070);
  175. value[4] = CMDQ_REG_GET32(base + 0x078);
  176. value[5] = CMDQ_REG_GET32(base + 0x080);
  177. value[6] = CMDQ_REG_GET32(base + 0x100);
  178. value[7] = CMDQ_REG_GET32(base + 0x118);
  179. value[8] = CMDQ_REG_GET32(base + 0x130);
  180. value[9] = CMDQ_REG_GET32(base + 0x400);
  181. value[10] = CMDQ_REG_GET32(base + 0x408);
  182. value[11] = CMDQ_REG_GET32(base + 0x410);
  183. value[12] = CMDQ_REG_GET32(base + 0x420);
  184. value[13] = CMDQ_REG_GET32(base + 0x430);
  185. value[14] = CMDQ_REG_GET32(base + 0x4D0);
  186. CMDQ_ERR("=============== [CMDQ] %s Status ====================================\n", label);
  187. CMDQ_ERR
  188. ("RDMA_SRC_CON: 0x%08x, RDMA_SRC_BASE_0: 0x%08x, RDMA_MF_BKGD_SIZE_IN_BYTE: 0x%08x\n",
  189. value[0], value[1], value[2]);
  190. CMDQ_ERR("RDMA_MF_SRC_SIZE: 0x%08x, RDMA_MF_CLIP_SIZE: 0x%08x, RDMA_MF_OFFSET_1: 0x%08x\n",
  191. value[3], value[4], value[5]);
  192. CMDQ_ERR("RDMA_SRC_END_0: 0x%08x, RDMA_SRC_OFFSET_0: 0x%08x, RDMA_SRC_OFFSET_W_0: 0x%08x\n",
  193. value[6], value[7], value[8]);
  194. CMDQ_ERR("RDMA_MON_STA_0: 0x%08x, RDMA_MON_STA_1: 0x%08x, RDMA_MON_STA_2: 0x%08x\n",
  195. value[9], value[10], value[11]);
  196. CMDQ_ERR("RDMA_MON_STA_4: 0x%08x, RDMA_MON_STA_6: 0x%08x, RDMA_MON_STA_26: 0x%08x\n",
  197. value[12], value[13], value[14]);
  198. /* parse state */
  199. CMDQ_ERR("RDMA ack:%d req:%d\n", (value[9] & (1 << 11)) >> 11,
  200. (value[9] & (1 << 10)) >> 10);
  201. state = (value[10] >> 8) & 0x7FF;
  202. grep = (value[10] >> 20) & 0x1;
  203. CMDQ_ERR("RDMA state: 0x%x (%s)\n", state, cmdq_mdp_get_rdma_state(state));
  204. CMDQ_ERR("RDMA horz_cnt: %d vert_cnt:%d\n", value[14] & 0xFFF, (value[14] >> 16) & 0xFFF);
  205. CMDQ_ERR("RDMA grep:%d => suggest to ask SMI help:%d\n", grep, grep);
  206. }
  207. const char *cmdq_mdp_get_rsz_state(const uint32_t state)
  208. {
  209. switch (state) {
  210. case 0x5:
  211. return "downstream hang"; /* 0,1,0,1 */
  212. case 0xa:
  213. return "upstream hang"; /* 1,0,1,0 */
  214. default:
  215. return "";
  216. }
  217. }
  218. void cmdq_mdp_dump_rsz(const unsigned long base, const char *label)
  219. {
  220. uint32_t value[8] = { 0 };
  221. uint32_t request[4] = { 0 };
  222. uint32_t state = 0;
  223. value[0] = CMDQ_REG_GET32(base + 0x004);
  224. value[1] = CMDQ_REG_GET32(base + 0x00C);
  225. value[2] = CMDQ_REG_GET32(base + 0x010);
  226. value[3] = CMDQ_REG_GET32(base + 0x014);
  227. value[4] = CMDQ_REG_GET32(base + 0x018);
  228. CMDQ_REG_SET32(base + 0x040, 0x00000001);
  229. value[5] = CMDQ_REG_GET32(base + 0x044);
  230. CMDQ_REG_SET32(base + 0x040, 0x00000002);
  231. value[6] = CMDQ_REG_GET32(base + 0x044);
  232. CMDQ_REG_SET32(base + 0x040, 0x00000003);
  233. value[7] = CMDQ_REG_GET32(base + 0x044);
  234. CMDQ_ERR("=============== [CMDQ] %s Status ====================================\n", label);
  235. CMDQ_ERR("RSZ_CONTROL: 0x%08x, RSZ_INPUT_IMAGE: 0x%08x RSZ_OUTPUT_IMAGE: 0x%08x\n",
  236. value[0], value[1], value[2]);
  237. CMDQ_ERR("RSZ_HORIZONTAL_COEFF_STEP: 0x%08x, RSZ_VERTICAL_COEFF_STEP: 0x%08x\n",
  238. value[3], value[4]);
  239. CMDQ_ERR("RSZ_DEBUG_1: 0x%08x, RSZ_DEBUG_2: 0x%08x, RSZ_DEBUG_3: 0x%08x\n",
  240. value[5], value[6], value[7]);
  241. /* parse state */
  242. /* .valid=1/request=1: upstream module sends data */
  243. /* .ready=1: downstream module receives data */
  244. state = value[6] & 0xF;
  245. request[0] = state & (0x1); /* out valid */
  246. request[1] = state & (0x1 << 1) >> 1; /* out ready */
  247. request[2] = state & (0x1 << 2) >> 2; /* in valid */
  248. request[3] = state & (0x1 << 3) >> 3; /* in ready */
  249. CMDQ_ERR("RSZ inRdy,inRsq,outRdy,outRsq: %d,%d,%d,%d (%s)\n",
  250. request[3], request[2], request[1], request[0], cmdq_mdp_get_rsz_state(state));
  251. }
  252. void cmdq_mdp_dump_rot(const unsigned long base, const char *label)
  253. {
  254. uint32_t value[32] = { 0 };
  255. value[0] = CMDQ_REG_GET32(base + 0x000);
  256. value[1] = CMDQ_REG_GET32(base + 0x008);
  257. value[2] = CMDQ_REG_GET32(base + 0x00C);
  258. value[3] = CMDQ_REG_GET32(base + 0x024);
  259. value[4] = CMDQ_REG_GET32(base + 0xF00);
  260. value[5] = CMDQ_REG_GET32(base + 0x02C);
  261. value[6] = CMDQ_REG_GET32(base + 0x004);
  262. value[7] = CMDQ_REG_GET32(base + 0x030);
  263. value[8] = CMDQ_REG_GET32(base + 0x078);
  264. value[9] = CMDQ_REG_GET32(base + 0x070);
  265. CMDQ_REG_SET32(base + 0x018, 0x00000100);
  266. value[10] = CMDQ_REG_GET32(base + 0x0D0);
  267. CMDQ_REG_SET32(base + 0x018, 0x00000200);
  268. value[11] = CMDQ_REG_GET32(base + 0x0D0);
  269. CMDQ_REG_SET32(base + 0x018, 0x00000300);
  270. value[12] = CMDQ_REG_GET32(base + 0x0D0);
  271. CMDQ_REG_SET32(base + 0x018, 0x00000400);
  272. value[13] = CMDQ_REG_GET32(base + 0x0D0);
  273. CMDQ_REG_SET32(base + 0x018, 0x00000500);
  274. value[14] = CMDQ_REG_GET32(base + 0x0D0);
  275. CMDQ_REG_SET32(base + 0x018, 0x00000600);
  276. value[15] = CMDQ_REG_GET32(base + 0x0D0);
  277. CMDQ_REG_SET32(base + 0x018, 0x00000700);
  278. value[16] = CMDQ_REG_GET32(base + 0x0D0);
  279. CMDQ_REG_SET32(base + 0x018, 0x00000800);
  280. value[17] = CMDQ_REG_GET32(base + 0x0D0);
  281. CMDQ_REG_SET32(base + 0x018, 0x00000900);
  282. value[18] = CMDQ_REG_GET32(base + 0x0D0);
  283. CMDQ_REG_SET32(base + 0x018, 0x00000A00);
  284. value[19] = CMDQ_REG_GET32(base + 0x0D0);
  285. CMDQ_REG_SET32(base + 0x018, 0x00000B00);
  286. value[20] = CMDQ_REG_GET32(base + 0x0D0);
  287. CMDQ_REG_SET32(base + 0x018, 0x00000C00);
  288. value[21] = CMDQ_REG_GET32(base + 0x0D0);
  289. CMDQ_REG_SET32(base + 0x018, 0x00000D00);
  290. value[22] = CMDQ_REG_GET32(base + 0x0D0);
  291. CMDQ_REG_SET32(base + 0x018, 0x00000E00);
  292. value[23] = CMDQ_REG_GET32(base + 0x0D0);
  293. CMDQ_REG_SET32(base + 0x018, 0x00000F00);
  294. value[24] = CMDQ_REG_GET32(base + 0x0D0);
  295. CMDQ_REG_SET32(base + 0x018, 0x00001000);
  296. value[25] = CMDQ_REG_GET32(base + 0x0D0);
  297. CMDQ_REG_SET32(base + 0x018, 0x00001100);
  298. value[26] = CMDQ_REG_GET32(base + 0x0D0);
  299. CMDQ_REG_SET32(base + 0x018, 0x00001200);
  300. value[27] = CMDQ_REG_GET32(base + 0x0D0);
  301. CMDQ_REG_SET32(base + 0x018, 0x00001300);
  302. value[28] = CMDQ_REG_GET32(base + 0x0D0);
  303. CMDQ_REG_SET32(base + 0x018, 0x00001400);
  304. value[29] = CMDQ_REG_GET32(base + 0x0D0);
  305. value[30] = CMDQ_REG_GET32(base + 0x01C);
  306. CMDQ_ERR("=============== [CMDQ] %s Status ====================================\n", label);
  307. CMDQ_ERR("ROT_CTRL: 0x%08x, ROT_MAIN_BUF_SIZE: 0x%08x, ROT_SUB_BUF_SIZE: 0x%08x\n",
  308. value[0], value[1], value[2]);
  309. CMDQ_ERR("ROT_TAR_SIZE: 0x%08x, ROT_BASE_ADDR: 0x%08x, ROT_OFST_ADDR: 0x%08x\n",
  310. value[3], value[4], value[5]);
  311. CMDQ_ERR("ROT_DMA_PERF: 0x%08x, ROT_STRIDE: 0x%08x, ROT_IN_SIZE: 0x%08x\n",
  312. value[6], value[7], value[8]);
  313. CMDQ_ERR("ROT_EOL: 0x%08x, ROT_DBUGG_1: 0x%08x, ROT_DEBUBG_2: 0x%08x\n",
  314. value[9], value[10], value[11]);
  315. CMDQ_ERR("ROT_DBUGG_3: 0x%08x, ROT_DBUGG_4: 0x%08x, ROT_DEBUBG_5: 0x%08x\n",
  316. value[12], value[13], value[14]);
  317. CMDQ_ERR("ROT_DBUGG_6: 0x%08x, ROT_DBUGG_7: 0x%08x, ROT_DEBUBG_8: 0x%08x\n",
  318. value[15], value[16], value[17]);
  319. CMDQ_ERR("ROT_DBUGG_9: 0x%08x, ROT_DBUGG_A: 0x%08x, ROT_DEBUBG_B: 0x%08x\n",
  320. value[18], value[19], value[20]);
  321. CMDQ_ERR("ROT_DBUGG_C: 0x%08x, ROT_DBUGG_D: 0x%08x, ROT_DEBUBG_E: 0x%08x\n",
  322. value[21], value[22], value[23]);
  323. CMDQ_ERR("ROT_DBUGG_F: 0x%08x, ROT_DBUGG_10: 0x%08x, ROT_DEBUBG_11: 0x%08x\n",
  324. value[24], value[25], value[26]);
  325. CMDQ_ERR("ROT_DEBUG_12: 0x%08x, ROT_DBUGG_13: 0x%08x, ROT_DBUGG_14: 0x%08x\n",
  326. value[27], value[28], value[29]);
  327. CMDQ_ERR("VIDO_INT: 0x%08x\n", value[30]);
  328. }
  329. void cmdq_mdp_dump_tdshp(const unsigned long base, const char *label)
  330. {
  331. uint32_t value[8] = { 0 };
  332. value[0] = CMDQ_REG_GET32(base + 0x114);
  333. value[1] = CMDQ_REG_GET32(base + 0x11C);
  334. value[2] = CMDQ_REG_GET32(base + 0x104);
  335. value[3] = CMDQ_REG_GET32(base + 0x108);
  336. value[4] = CMDQ_REG_GET32(base + 0x10C);
  337. value[5] = CMDQ_REG_GET32(base + 0x120);
  338. value[6] = CMDQ_REG_GET32(base + 0x128);
  339. value[7] = CMDQ_REG_GET32(base + 0x110);
  340. CMDQ_ERR("=============== [CMDQ] %s Status ====================================\n", label);
  341. CMDQ_ERR("TDSHP INPUT_CNT: 0x%08x, OUTPUT_CNT: 0x%08x\n", value[0], value[1]);
  342. CMDQ_ERR("TDSHP INTEN: 0x%08x, INTSTA: 0x%08x, 0x10C: 0x%08x\n", value[2], value[3],
  343. value[4]);
  344. CMDQ_ERR("TDSHP CFG: 0x%08x, IN_SIZE: 0x%08x, OUT_SIZE: 0x%08x\n", value[7], value[5],
  345. value[6]);
  346. }
  347. const char *cmdq_mdp_get_wdma_state(uint32_t state)
  348. {
  349. switch (state) {
  350. case 0x1:
  351. return "idle";
  352. case 0x2:
  353. return "clear";
  354. case 0x4:
  355. return "prepare";
  356. case 0x8:
  357. return "prepare";
  358. case 0x10:
  359. return "data running";
  360. case 0x20:
  361. return "eof wait";
  362. case 0x40:
  363. return "soft reset wait";
  364. case 0x80:
  365. return "eof done";
  366. case 0x100:
  367. return "sof reset done";
  368. case 0x200:
  369. return "frame complete";
  370. default:
  371. return "";
  372. }
  373. }
  374. void cmdq_mdp_dump_wdma(const unsigned long base, const char *label)
  375. {
  376. uint32_t value[40] = { 0 };
  377. uint32_t state = 0;
  378. uint32_t grep = 0; /* grep bit = 1, WDMA has sent request to SMI, and not receive done yet */
  379. uint32_t isFIFOFull = 0; /* 1 for WDMA FIFO full */
  380. value[0] = CMDQ_REG_GET32(base + 0x014);
  381. value[1] = CMDQ_REG_GET32(base + 0x018);
  382. value[2] = CMDQ_REG_GET32(base + 0x028);
  383. value[3] = CMDQ_REG_GET32(base + 0xF00);
  384. value[4] = CMDQ_REG_GET32(base + 0x078);
  385. value[5] = CMDQ_REG_GET32(base + 0x080);
  386. value[6] = CMDQ_REG_GET32(base + 0x0A0);
  387. value[7] = CMDQ_REG_GET32(base + 0x0A8);
  388. CMDQ_REG_SET32(base + 0x014, (value[0] & (0x0FFFFFFF)));
  389. value[8] = CMDQ_REG_GET32(base + 0x014);
  390. value[9] = CMDQ_REG_GET32(base + 0x0AC);
  391. CMDQ_REG_SET32(base + 0x014, 0x10000000 | (value[0] & (0x0FFFFFFF)));
  392. value[10] = CMDQ_REG_GET32(base + 0x014);
  393. value[11] = CMDQ_REG_GET32(base + 0x0AC);
  394. CMDQ_REG_SET32(base + 0x014, 0x20000000 | (value[0] & (0x0FFFFFFF)));
  395. value[12] = CMDQ_REG_GET32(base + 0x014);
  396. value[13] = CMDQ_REG_GET32(base + 0x0AC);
  397. CMDQ_REG_SET32(base + 0x014, 0x30000000 | (value[0] & (0x0FFFFFFF)));
  398. value[14] = CMDQ_REG_GET32(base + 0x014);
  399. value[15] = CMDQ_REG_GET32(base + 0x0AC);
  400. CMDQ_REG_SET32(base + 0x014, 0x40000000 | (value[0] & (0x0FFFFFFF)));
  401. value[16] = CMDQ_REG_GET32(base + 0x014);
  402. value[17] = CMDQ_REG_GET32(base + 0x0AC);
  403. CMDQ_REG_SET32(base + 0x014, 0x50000000 | (value[0] & (0x0FFFFFFF)));
  404. value[18] = CMDQ_REG_GET32(base + 0x014);
  405. value[19] = CMDQ_REG_GET32(base + 0x0AC);
  406. CMDQ_REG_SET32(base + 0x014, 0x60000000 | (value[0] & (0x0FFFFFFF)));
  407. value[20] = CMDQ_REG_GET32(base + 0x014);
  408. value[21] = CMDQ_REG_GET32(base + 0x0AC);
  409. CMDQ_REG_SET32(base + 0x014, 0x70000000 | (value[0] & (0x0FFFFFFF)));
  410. value[22] = CMDQ_REG_GET32(base + 0x014);
  411. value[23] = CMDQ_REG_GET32(base + 0x0AC);
  412. CMDQ_REG_SET32(base + 0x014, 0x80000000 | (value[0] & (0x0FFFFFFF)));
  413. value[24] = CMDQ_REG_GET32(base + 0x014);
  414. value[25] = CMDQ_REG_GET32(base + 0x0AC);
  415. CMDQ_REG_SET32(base + 0x014, 0x90000000 | (value[0] & (0x0FFFFFFF)));
  416. value[26] = CMDQ_REG_GET32(base + 0x014);
  417. value[27] = CMDQ_REG_GET32(base + 0x0AC);
  418. CMDQ_REG_SET32(base + 0x014, 0xA0000000 | (value[0] & (0x0FFFFFFF)));
  419. value[28] = CMDQ_REG_GET32(base + 0x014);
  420. value[29] = CMDQ_REG_GET32(base + 0x0AC);
  421. CMDQ_REG_SET32(base + 0x014, 0xB0000000 | (value[0] & (0x0FFFFFFF)));
  422. value[30] = CMDQ_REG_GET32(base + 0x014);
  423. value[31] = CMDQ_REG_GET32(base + 0x0AC);
  424. CMDQ_REG_SET32(base + 0x014, 0xC0000000 | (value[0] & (0x0FFFFFFF)));
  425. value[32] = CMDQ_REG_GET32(base + 0x014);
  426. value[33] = CMDQ_REG_GET32(base + 0x0AC);
  427. CMDQ_REG_SET32(base + 0x014, 0xD0000000 | (value[0] & (0x0FFFFFFF)));
  428. value[34] = CMDQ_REG_GET32(base + 0x014);
  429. value[35] = CMDQ_REG_GET32(base + 0x0AC);
  430. CMDQ_REG_SET32(base + 0x014, 0xE0000000 | (value[0] & (0x0FFFFFFF)));
  431. value[36] = CMDQ_REG_GET32(base + 0x014);
  432. value[37] = CMDQ_REG_GET32(base + 0x0AC);
  433. CMDQ_REG_SET32(base + 0x014, 0xF0000000 | (value[0] & (0x0FFFFFFF)));
  434. value[38] = CMDQ_REG_GET32(base + 0x014);
  435. value[39] = CMDQ_REG_GET32(base + 0x0AC);
  436. CMDQ_ERR("=============== [CMDQ] %s Status ====================================\n", label);
  437. CMDQ_ERR("[CMDQ]WDMA_CFG: 0x%08x, WDMA_SRC_SIZE: 0x%08x, WDMA_DST_W_IN_BYTE = 0x%08x\n",
  438. value[0], value[1], value[2]);
  439. CMDQ_ERR
  440. ("[CMDQ]WDMA_DST_ADDR0: 0x%08x, WDMA_DST_UV_PITCH: 0x%08x, WDMA_DST_ADDR_OFFSET0 = 0x%08x\n",
  441. value[3], value[4], value[5]);
  442. CMDQ_ERR("[CMDQ]WDMA_STATUS: 0x%08x, WDMA_INPUT_CNT: 0x%08x\n", value[6], value[7]);
  443. /* Dump Addtional WDMA debug info */
  444. CMDQ_ERR("WDMA_DEBUG_0 +014: 0x%08x , +0ac: 0x%08x\n", value[8], value[9]);
  445. CMDQ_ERR("WDMA_DEBUG_1 +014: 0x%08x , +0ac: 0x%08x\n", value[10], value[11]);
  446. CMDQ_ERR("WDMA_DEBUG_2 +014: 0x%08x , +0ac: 0x%08x\n", value[12], value[13]);
  447. CMDQ_ERR("WDMA_DEBUG_3 +014: 0x%08x , +0ac: 0x%08x\n", value[14], value[15]);
  448. CMDQ_ERR("WDMA_DEBUG_4 +014: 0x%08x , +0ac: 0x%08x\n", value[16], value[17]);
  449. CMDQ_ERR("WDMA_DEBUG_5 +014: 0x%08x , +0ac: 0x%08x\n", value[18], value[19]);
  450. CMDQ_ERR("WDMA_DEBUG_6 +014: 0x%08x , +0ac: 0x%08x\n", value[20], value[21]);
  451. CMDQ_ERR("WDMA_DEBUG_7 +014: 0x%08x , +0ac: 0x%08x\n", value[22], value[23]);
  452. CMDQ_ERR("WDMA_DEBUG_8 +014: 0x%08x , +0ac: 0x%08x\n", value[24], value[25]);
  453. CMDQ_ERR("WDMA_DEBUG_9 +014: 0x%08x , +0ac: 0x%08x\n", value[26], value[27]);
  454. CMDQ_ERR("WDMA_DEBUG_A +014: 0x%08x , +0ac: 0x%08x\n", value[28], value[29]);
  455. CMDQ_ERR("WDMA_DEBUG_B +014: 0x%08x , +0ac: 0x%08x\n", value[30], value[31]);
  456. CMDQ_ERR("WDMA_DEBUG_C +014: 0x%08x , +0ac: 0x%08x\n", value[32], value[33]);
  457. CMDQ_ERR("WDMA_DEBUG_D +014: 0x%08x , +0ac: 0x%08x\n", value[34], value[35]);
  458. CMDQ_ERR("WDMA_DEBUG_E +014: 0x%08x , +0ac: 0x%08x\n", value[36], value[37]);
  459. CMDQ_ERR("WDMA_DEBUG_F +014: 0x%08x , +0ac: 0x%08x\n", value[38], value[39]);
  460. /* parse WDMA state */
  461. state = value[6] & 0x3FF;
  462. grep = (value[6] >> 13) & 0x1;
  463. isFIFOFull = (value[6] >> 12) & 0x1;
  464. CMDQ_ERR("WDMA state:0x%x (%s)\n", state, cmdq_mdp_get_wdma_state(state));
  465. CMDQ_ERR("WDMA in_req:%d in_ack:%d\n", (value[6] >> 15) & 0x1, (value[6] >> 14) & 0x1);
  466. /* note WDMA send request(i.e command) to SMI first, then SMI takes request data from WDMA FIFO */
  467. /* if SMI dose not process request and upstream HWs */
  468. /* such as MDP_RSZ send data to WDMA, WDMA FIFO will full finally */
  469. CMDQ_ERR("WDMA grep:%d, FIFO full:%d\n", grep, isFIFOFull);
  470. CMDQ_ERR("WDMA suggest: Need SMI help:%d, Need check WDMA config:%d\n", (grep),
  471. ((0 == grep) && (1 == isFIFOFull)));
  472. }