ddp_dump.c 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952
  1. /* Copyright Statement:
  2. *
  3. * This software/firmware and related documentation ("MediaTek Software") are
  4. * protected under relevant copyright laws. The information contained herein
  5. * is confidential and proprietary to MediaTek Inc. and/or its licensors.
  6. * Without the prior written permission of MediaTek inc. and/or its licensors,
  7. * any reproduction, modification, use or disclosure of MediaTek Software,
  8. * and information contained herein, in whole or in part, shall be strictly prohibited.
  9. */
  10. /* MediaTek Inc. (C) 2015. All rights reserved.
  11. *
  12. * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
  13. * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
  14. * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON
  15. * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
  16. * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
  17. * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
  18. * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
  19. * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
  20. * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH
  21. * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES
  22. * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES
  23. * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK
  24. * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
  25. * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND
  26. * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
  27. * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
  28. * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO
  29. * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
  30. */
  31. #define LOG_TAG "DUMP"
  32. #include <platform/ddp_info.h>
  33. #include <platform/ddp_log.h>
  34. #include <platform/ddp_path.h>
  35. #include <platform/ddp_dump.h>
  36. #include <platform/disp_drv_platform.h>
  37. #include "platform/ddp_reg.h"
  38. #include <platform/ddp_dsi.h>
  39. #include <platform/ddp_rdma.h>
  40. #include <platform/ddp_ovl.h>
  41. #include <string.h>
  42. static const char* ddp_signal[3][32] = {
  43. {
  44. "aal0_to_gamma0",
  45. "aal1_to_gamma1",
  46. "ccorr0_to_aal0",
  47. "ccorr1_to_aal1",
  48. "color0_to_ccorr0",
  49. "color0_sel_to_color0",
  50. "color1_to_ccorr1",
  51. "color1_sel_to_color1",
  52. "path0_sel_to_path0_sout",
  53. "path0_sout_out_0_to_ufoe_sel_in_0",
  54. "path0_sout_out_1_to_dsc_sel_in_0",
  55. "path1_sel_to_path1",
  56. "path1_sout_out_0_to_dsc_sel_in_1",
  57. "path1_sout_out_1_to_ufoe_sel_in_1",
  58. "rdma0_to_rdma0_sout",
  59. "rdma0_sout_out_0_to_path0_sel_in_0",
  60. "rdma0_sout_out_1_to_color0_sel_in_0",
  61. "rdma0_sout_out_2_to_dsi0_sel_in_2",
  62. "rdma0_sout_out_3_to_dsi1_sel_in_1",
  63. "rdma0_sout_out_4_to_dpi0_sel_in_1",
  64. "rdma1_to_rdma1_sout",
  65. "rdma1_sout_out_0_to_path1_sel_in_0",
  66. "rdma1_sout_out_1_to_color1_sel_in_0",
  67. "rdma1_sout_out_2_to_dsi0_sel_in_4",
  68. "rdma1_sout_out_3_to_dsi1_sel_in_4",
  69. "rdma1_sout_out_4_to_dpi0_sel_in_3",
  70. "rdma2_to_dpi0_sel_in_4",
  71. "split_out_0_to_dsi0_1",
  72. "split_1_to_dsi1_0",
  73. "wdma0_sel_to_wdma0",
  74. "wdma1_sel_to_wdma1",
  75. "dither0_to_dither0_mout",
  76. },
  77. {
  78. "dither0_mout_out_0_to_rdma0",
  79. "dither0_mout_out_1_to_path0_sel_in_1",
  80. "dither0_mout_out_2_to_wdma0_sel_in_1",
  81. "dither1_to_dither1_mout",
  82. "dither1_mout_out_0_to_rdma1",
  83. "dither1_mout_out_1_to_path1_sel_in_1",
  84. "dither1_mout_out_2_to_wdma1_sel_in_1",
  85. "dpi0_sel_to_dpi0",
  86. "dsc_mout_out_0_to_dsi0_sel_in_3",
  87. "dsc_mout_out_1_to_dsi1_sel_in_2",
  88. "dsc_mout_out_2_to_dpi0_sel_in_2",
  89. "dsc_mout_out_3_to_wdma1_sel_in_2",
  90. "dsc_sel_to_dsc_wrap",
  91. "dsi0_sel_to_dsi0",
  92. "dsi1_sel_to_dsi1",
  93. "gamma0_to_od",
  94. "gamma1_to_dither1",
  95. "od_to_dither0",
  96. "ovl0_2L_to_ovl0_sout",
  97. "ovl0_to_ovl0_mout",
  98. "ovl0_mout_out_0_to_ovl0_2L",
  99. "ovl0_mout_out_1_to_wdma0_sel_in_3",
  100. "ovl0_pq_mout_out_0_to_color0_sel_in_1",
  101. "ovl0_pq_mout_out_1_to_wdma0_sel_in_0",
  102. "ovl0_sel_to_ovl_pq_mout",
  103. "ovl0_sout_out_0_to_ovl0_sel_in_0",
  104. "ovl0_sout_out_1_to_ovl1",
  105. "ovl0_sout_out_2_to_ovl1_2L_sel_in_0",
  106. "ovl1_2L_to_ovl1_pq_mout",
  107. "ovl1_2L_sel_to_ovl1_2L",
  108. "ovl1_2L_to_ovl1_mout",
  109. "ovl1_2L_mout_out_0_to_ovl1_2L_sel_in_1",
  110. },
  111. {
  112. "ovl1_mout_out_1_to_ovl0_sel_in_2",
  113. "ovl1_mout_out_2_to_wdma1_sel_in_3",
  114. "ovl1_mout_out_3_to_color1_sel_in_2",
  115. "ovl1_pq_mout_out_0_to_color1_sel_in_1",
  116. "ovl1_pq_mout_out_1_to_wdma1_sel_in_0",
  117. "ovl1_pq_mout_out_2_to_ovl0_sel_in_1",
  118. "ufoe_to_ufoe_mout",
  119. "ufoe_mout_out_0_to_dsi0_sel_in_0",
  120. "ufoe_mout_out_1_to_split",
  121. "ufoe_mout_out_2_to_dpi0_sel_in_0",
  122. "ufoe_mout_out_3_to_wdma0_sel_in_2",
  123. "ufoe_mout_out_4_to_dsi1_sel_in_3",
  124. "ufoe_sel_to_ufoe",
  125. "dsc_wrap_to_dsc_mout",
  126. }
  127. };
  128. static char *ddp_greq_name(int bit)
  129. {
  130. switch (bit) {
  131. case 0:
  132. return "OVL0";
  133. case 1:
  134. return "OVL0_2L";
  135. case 2:
  136. return "RDMA0";
  137. case 3:
  138. return "WDMA0";
  139. case 4:
  140. return "MDP_RDMA0";
  141. case 5:
  142. return "MDP_WDMA";
  143. case 6:
  144. return "MDP_WROT0";
  145. case 16:
  146. return "OVL1";
  147. case 17:
  148. return "OVL1_2L";
  149. case 18:
  150. return "RDMA1";
  151. case 19:
  152. return "RDMA2";
  153. case 20:
  154. return "WDMA1";
  155. case 21:
  156. return "OD_R";
  157. case 22:
  158. return "OD_W";
  159. case 23:
  160. return "OVL0_2L_LARB4";
  161. case 26:
  162. return "WMDA0_LARB5";
  163. default:
  164. return NULL;
  165. }
  166. }
  167. static char *ddp_get_mutex_module0_name(unsigned int bit)
  168. {
  169. switch (bit) {
  170. case 0: return "rdma0";
  171. case 1: return "rdma1";
  172. case 2: return "mdp_rdma0";
  173. case 4: return "mdp_rsz0";
  174. case 5: return "mdp_rsz1";
  175. case 6: return "mdp_tdshp";
  176. case 7: return "mdp_wrot0";
  177. case 8: return "mdp_wrot1";
  178. case 9: return "ovl0";
  179. case 10: return "ovl0_2L";
  180. case 11: return "ovl1_2L";
  181. case 12: return "wdma0";
  182. case 13: return "color0";
  183. case 14: return "ccorr0";
  184. case 15: return "aal0";
  185. case 16: return "gamma0";
  186. case 17: return "dither0";
  187. case 18: return "PWM0";
  188. case 19: return "DSI";
  189. case 20: return "DPI";
  190. default: return "mutex-unknown";
  191. }
  192. }
  193. static char *ddp_get_mutex_module1_name(unsigned int bit)
  194. {
  195. switch (bit) {
  196. case 0: return "pwm";
  197. case 1: return "dsi0";
  198. case 2: return "dsi1";
  199. default:
  200. return "mutex-unknown";
  201. }
  202. }
  203. char *ddp_get_fmt_name(DISP_MODULE_ENUM module, unsigned int fmt)
  204. {
  205. if (module == DISP_MODULE_WDMA0) {
  206. switch (fmt) {
  207. case 0:
  208. return "rgb565";
  209. case 1:
  210. return "rgb888";
  211. case 2:
  212. return "rgba8888";
  213. case 3:
  214. return "argb8888";
  215. case 4:
  216. return "uyvy";
  217. case 5:
  218. return "yuy2";
  219. case 7:
  220. return "y-only";
  221. case 8:
  222. return "iyuv";
  223. case 12:
  224. return "nv12";
  225. default:
  226. DDPDUMP("ddp_get_fmt_name, unknown fmt=%d, module=%d\n", fmt, module);
  227. return "unknown";
  228. }
  229. } else if (module == DISP_MODULE_OVL0) {
  230. switch (fmt) {
  231. case 0:
  232. return "rgb565";
  233. case 1:
  234. return "rgb888";
  235. case 2:
  236. return "rgba8888";
  237. case 3:
  238. return "argb8888";
  239. case 4:
  240. return "uyvy";
  241. case 5:
  242. return "yuyv";
  243. default:
  244. DDPDUMP("ddp_get_fmt_name, unknown fmt=%d, module=%d\n", fmt, module);
  245. return "unknown";
  246. }
  247. } else if (module == DISP_MODULE_RDMA0 || module == DISP_MODULE_RDMA1 || module == DISP_MODULE_RDMA2) {
  248. switch (fmt) {
  249. case 0:
  250. return "rgb565";
  251. case 1:
  252. return "rgb888";
  253. case 2:
  254. return "rgba8888";
  255. case 3:
  256. return "argb8888";
  257. case 4:
  258. return "uyvy";
  259. case 5:
  260. return "yuyv";
  261. default:
  262. DDPDUMP("ddp_get_fmt_name, unknown fmt=%d, module=%d\n", fmt, module);
  263. return "unknown";
  264. }
  265. } else {
  266. DDPDUMP("ddp_get_fmt_name, unknown module=%d\n", module);
  267. }
  268. return "unknown";
  269. }
  270. static char *ddp_clock_0(int bit)
  271. {
  272. switch (bit) {
  273. case 0:
  274. return "smi_common(cg), ";
  275. case 1:
  276. return "smi_larb0(cg), ";
  277. case 2:
  278. return "smi_larb1(cg), ";
  279. case 19:
  280. return "fake_engine, ";
  281. case 20:
  282. return "ovl0, ";
  283. case 21:
  284. return "ovl0_2L, ";
  285. case 22:
  286. return "ovl1_2L, ";
  287. case 23:
  288. return "rdma0, ";
  289. case 24:
  290. return "rdma1, ";
  291. case 25:
  292. return "wdma0, ";
  293. case 26:
  294. return "color, ";
  295. case 27:
  296. return "ccorr, ";
  297. case 28:
  298. return "aal, ";
  299. case 29:
  300. return "gamma, ";
  301. case 30:
  302. return "dither, ";
  303. case 31:
  304. return "split, ";
  305. default:
  306. return NULL;
  307. }
  308. }
  309. static char *ddp_clock_1(int bit)
  310. {
  311. switch (bit) {
  312. case 0:
  313. return "dsi0_mm(cg), ";
  314. case 1:
  315. return "dsi0_interface(cg), ";
  316. case 2:
  317. return "dsi1_mm(cg), ";
  318. case 3:
  319. return "dsi1_interface(cg), ";
  320. case 4:
  321. return "fake_engine2, ";
  322. case 7:
  323. return "26m, ";
  324. case 8:
  325. return "mmsys_r2y, ";
  326. case 9:
  327. return "disp_rsz, ";
  328. default:
  329. return NULL;
  330. }
  331. }
  332. static void mutex_dump_reg(void)
  333. {
  334. DDPDUMP("==DISP MUTEX REGS==\n");
  335. DDPDUMP("(0x000)M_INTEN =0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_MUTEX_INTEN));
  336. DDPDUMP("(0x004)M_INTSTA =0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_MUTEX_INTSTA));
  337. DDPDUMP("(0x020)M0_EN =0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_MUTEX0_EN));
  338. /*DDPDUMP("(0x024)M0_GET =0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_MUTEX0_GET));*/
  339. DDPDUMP("(0x028)M0_RST =0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_MUTEX0_RST));
  340. DDPDUMP("(0x02c)M0_SOF =0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_MUTEX0_SOF));
  341. DDPDUMP("(0x030)M0_MOD0 =0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_MUTEX0_MOD0));
  342. /*DDPDUMP("(0x034)M0_MOD1 =0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_MUTEX0_MOD1));*/
  343. DDPDUMP("(0x040)M1_EN =0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_MUTEX1_EN));
  344. /*DDPDUMP("(0x044)M1_GET =0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_MUTEX1_GET));*/
  345. DDPDUMP("(0x048)M1_RST =0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_MUTEX1_RST));
  346. DDPDUMP("(0x04c)M1_SOF =0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_MUTEX1_SOF));
  347. DDPDUMP("(0x050)M1_MOD0 =0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_MUTEX1_MOD0));
  348. /*DDPDUMP("(0x054)M1_MOD1 =0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_MUTEX1_MOD1));*/
  349. DDPDUMP("(0x060)M2_EN =0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_MUTEX2_EN));
  350. /*DDPDUMP("(0x064)M2_GET =0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_MUTEX2_GET));*/
  351. DDPDUMP("(0x068)M2_RST =0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_MUTEX2_RST));
  352. DDPDUMP("(0x06c)M2_SOF =0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_MUTEX2_SOF));
  353. DDPDUMP("(0x070)M2_MOD0 =0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_MUTEX2_MOD0));
  354. /*DDPDUMP("(0x074)M2_MOD1 =0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_MUTEX2_MOD1));*/
  355. DDPDUMP("(0x080)M3_EN =0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_MUTEX3_EN));
  356. /*DDPDUMP("(0x084)M3_GET =0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_MUTEX3_GET));*/
  357. DDPDUMP("(0x088)M3_RST =0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_MUTEX3_RST));
  358. DDPDUMP("(0x08C)M3_SOF =0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_MUTEX3_SOF));
  359. DDPDUMP("(0x090)M3_MOD0 =0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_MUTEX3_MOD0));
  360. /*DDPDUMP("(0x090)M3_MOD1 =0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_MUTEX3_MOD1));*/
  361. DDPDUMP("(0x0a0)M4_EN =0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_MUTEX4_EN));
  362. /*DDPDUMP("(0x0a4)M4_GET =0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_MUTEX4_GET));*/
  363. DDPDUMP("(0x0a8)M4_RST =0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_MUTEX4_RST));
  364. DDPDUMP("(0x0ac)M4_SOF =0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_MUTEX4_SOF));
  365. DDPDUMP("(0x0b0)M4_MOD0 =0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_MUTEX4_MOD0));
  366. /*DDPDUMP("(0x0b4)M4_MOD1 =0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_MUTEX4_MOD1));*/
  367. DDPDUMP("(0x0c0)M5_EN =0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_MUTEX5_EN));
  368. /*DDPDUMP("(0x0c4)M5_GET =0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_MUTEX5_GET));*/
  369. DDPDUMP("(0x0c8)M5_RST =0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_MUTEX5_RST));
  370. DDPDUMP("(0x0cc)M5_SOF =0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_MUTEX5_SOF));
  371. DDPDUMP("(0x0d0)M5_MOD0 =0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_MUTEX5_MOD0));
  372. /* DDPDUMP("(0x0d4)M5_MOD1 =0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_MUTEX5_MOD1));
  373. DDPDUMP("(0x300)DISP_REG_CONFIG_MUTEX_DUMMY0 =0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_MUTEX_DUMMY0));
  374. DDPDUMP("(0x304)DISP_REG_CONFIG_MUTEX_DUMMY1 =0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_MUTEX_DUMMY1));
  375. */
  376. DDPDUMP("(0x30c)DEBUG_OUT_SEL =0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_DEBUG_OUT_SEL));
  377. return;
  378. }
  379. static void mutex_dump_analysis(void)
  380. {
  381. int i = 0;
  382. int j = 0;
  383. char mutex_module[512] = { '\0' };
  384. char *p = NULL;
  385. int len = 0;
  386. unsigned int val;
  387. DDPDUMP("== DISP Mutex Analysis ==\n");
  388. for (i = 0; i < 5; i++) {
  389. p = mutex_module;
  390. len = 0;
  391. if (DISP_REG_GET(DISP_REG_CONFIG_MUTEX_MOD0(i)) == 0)
  392. continue;
  393. val = DISP_REG_GET(DISP_REG_CONFIG_MUTEX_SOF(i));
  394. len = sprintf(p, "MUTEX%d :SOF=%s,EOF=%s,WAIT=%d,module=(",
  395. i,
  396. ddp_get_mutex_sof_name(REG_FLD_VAL_GET(SOF_FLD_MUTEX0_SOF, val)),
  397. ddp_get_mutex_sof_name(REG_FLD_VAL_GET(SOF_FLD_MUTEX0_EOF, val)),
  398. REG_FLD_VAL_GET(SOF_FLD_MUTEX0_SOF_WAIT, val));
  399. p += len;
  400. for (j = 0; j < 32; j++) {
  401. unsigned int regval = DISP_REG_GET(DISP_REG_CONFIG_MUTEX_MOD0(i));
  402. if ((regval & (1 << j))) {
  403. len = sprintf(p, "%s,", ddp_get_mutex_module0_name(j));
  404. p += len;
  405. }
  406. }
  407. /* for (j = 0; j < 32; j++) {
  408. unsigned int regval = DISP_REG_GET(DISP_REG_CONFIG_MUTEX_MOD1(i));
  409. if ((regval & (1 << j))) {
  410. len = sprintf(p, "%s,", ddp_get_mutex_module1_name(j));
  411. p += len;
  412. }
  413. }
  414. */
  415. DDPDUMP("%s)\n", mutex_module);
  416. }
  417. }
  418. static void mmsys_config_dump_reg(void)
  419. {
  420. DDPDUMP("== DISP MMSYS_Config REGS ==\n");
  421. DDPDUMP("MMSYS_INTEN=0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_MMSYS_INTEN));
  422. DDPDUMP("MMSYS_INTSTA=0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_MMSYS_INTSTA));
  423. DDPDUMP("OVL0_MOUT_EN=0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_DISP_OVL0_MOUT_EN));
  424. DDPDUMP("OVL0_2L_MOUT_EN=0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_DISP_OVL0_2L_MOUT_EN));
  425. DDPDUMP("OVL1_2L_MOUT_EN=0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_DISP_OVL1_2L_MOUT_EN));
  426. DDPDUMP("DITHER_MOUT_EN=0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_DISP_DITHER_MOUT_EN));
  427. DDPDUMP("RSZ_MOUT_EN=0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_DISP_RSZ_MOUT_EN));
  428. DDPDUMP("MMSYS_MOUT_RST=0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_MMSYS_MOUT_RST));
  429. DDPDUMP("COLOR0_SIN=0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_DISP_COLOR_OUT_SEL_IN));
  430. DDPDUMP("WDMA0_SIN=0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_DISP_WDMA0_SEL_IN));
  431. DDPDUMP("DSI0_SIN=0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_DISP_DSI0_SEL_IN));
  432. DDPDUMP("DPI0_SIN=0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_DISP_DPI0_SEL_IN));
  433. DDPDUMP("DISP_PATH_SOUT_SIN=0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_DISP_PATH0_SEL_IN));
  434. DDPDUMP("RDMA0_SOUT_SIN=0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_DISP_RDMA0_SOUT_SEL_IN));
  435. DDPDUMP("RDMA1_SOUT_SIN=0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_DISP_RDMA1_SOUT_SEL_IN));
  436. DDPDUMP("WDMA0_SOUT_SIN=0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_DISP_OVLTOWDMA_SEL_IN));
  437. DDPDUMP("OVL1_INT_SOUT_SIN=0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_DISP_OVLTOWDMA_SEL_IN));
  438. DDPDUMP("MM_MISC=0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_MMSYS_MISC));
  439. DDPDUMP("MM_CG_CON0=0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_MMSYS_CG_CON0));
  440. DDPDUMP("MM_CG_CON1=0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_MMSYS_CG_CON1));
  441. DDPDUMP("MM_HW_DCM_DIS0=0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_MMSYS_HW_DCM_DIS0));
  442. DDPDUMP("MM_HW_DCM_DIS1=0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_MMSYS_HW_DCM_DIS1));
  443. DDPDUMP("MM_SW0_RST_B=0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_MMSYS_SW0_RST_B));
  444. DDPDUMP("MM_SW1_RST_B=0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_MMSYS_SW1_RST_B));
  445. DDPDUMP("MM_LCM_RST_B=0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_MMSYS_LCM_RST_B));
  446. DDPDUMP("MM_DBG_OUT_SEL=0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_MMSYS_DEBUG_OUT_SEL));
  447. DDPDUMP("MM_DUMMY0=0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_MMSYS_DUMMY0));
  448. DDPDUMP("MM_DUMMY1=0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_MMSYS_DUMMY1));
  449. DDPDUMP("MM_DUMMY2=0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_MMSYS_DUMMY2));
  450. DDPDUMP("MM_DUMMY3=0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_MMSYS_DUMMY3));
  451. DDPDUMP("DISP_VALID_0=0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_DISP_DL_VALID_0));
  452. DDPDUMP("DISP_VALID_1=0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_DISP_DL_VALID_1));
  453. DDPDUMP("DISP_READY_0=0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_DISP_DL_READY_0));
  454. DDPDUMP("DISP_READY_1=0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_DISP_DL_READY_1));
  455. }
  456. /* ------ clock:
  457. Before power on mmsys:
  458. CLK_CFG_0_CLR (address is 0x10000048) = 0x80000000 (bit 31).
  459. Before using DISP_PWM0 or DISP_PWM1:
  460. CLK_CFG_1_CLR(address is 0x10000058)=0x80 (bit 7).
  461. Before using DPI pixel clock:
  462. CLK_CFG_6_CLR(address is 0x100000A8)=0x80 (bit 7).
  463. Only need to enable the corresponding bits of MMSYS_CG_CON0 and MMSYS_CG_CON1 for the modules:
  464. smi_common, larb0, mdp_crop, fake_eng, mutex_32k, pwm0, pwm1, dsi0, dsi1, dpi.
  465. Other bits could keep 1. Suggest to keep smi_common and larb0 always clock on.
  466. --------valid & ready
  467. example:
  468. ovl0 -> ovl0_mout_ready=1 means engines after ovl_mout are ready for receiving data
  469. ovl0_mout_ready=0 means ovl0_mout can not receive data, maybe ovl0_mout or after engines config error
  470. ovl0 -> ovl0_mout_valid=1 means engines before ovl0_mout is OK,
  471. ovl0_mout_valid=0 means ovl can not transfer data to ovl0_mout, means ovl0 or before engines are not ready.
  472. */
  473. static void mmsys_config_dump_analysis(void)
  474. {
  475. unsigned int i = 0, j;
  476. unsigned int reg = 0;
  477. char clock_on[512] = { '\0' };
  478. char *pos = NULL;
  479. const char *name;
  480. /* int len = 0; */
  481. unsigned int valid[3], ready[3];
  482. unsigned int greq;
  483. valid[0] = DISP_REG_GET(DISP_REG_CONFIG_DISP_DL_VALID_0);
  484. valid[1] = DISP_REG_GET(DISP_REG_CONFIG_DISP_DL_VALID_1);
  485. valid[2] = DISP_REG_GET(DISP_REG_CONFIG_DISP_DL_VALID_2);
  486. ready[0] = DISP_REG_GET(DISP_REG_CONFIG_DISP_DL_READY_0);
  487. ready[1] = DISP_REG_GET(DISP_REG_CONFIG_DISP_DL_READY_1);
  488. ready[2] = DISP_REG_GET(DISP_REG_CONFIG_DISP_DL_READY_2);
  489. greq = DISP_REG_GET(DISP_REG_CONFIG_SMI_LARB0_GREQ);
  490. DDPDUMP("== DISP MMSYS_CONFIG ANALYSIS ==\n");
  491. #if 0 /* TODO: mmsys clk?? */
  492. DDPDUMP("mmsys clock=0x%x, CG_CON0=0x%x, CG_CON1=0x%x\n",
  493. DISP_REG_GET(DISP_REG_CLK_CFG_0_MM_CLK),
  494. DISP_REG_GET(DISP_REG_CONFIG_MMSYS_CG_CON0),
  495. DISP_REG_GET(DISP_REG_CONFIG_MMSYS_CG_CON1));
  496. if ((DISP_REG_GET(DISP_REG_CLK_CFG_0_MM_CLK) >> 31) & 0x1)
  497. DDPERR("mmsys clock abnormal!!\n");
  498. #endif
  499. DDPDUMP("MMSYS_CG_CON0: 0x%08x\n", INREG32(DISP_REG_CONFIG_MMSYS_CG_CON0));
  500. DDPDUMP("MMSYS_CG_CON1: 0x%08x\n", INREG32(DISP_REG_CONFIG_MMSYS_CG_CON1));
  501. reg = DISP_REG_GET(DISP_REG_CONFIG_MMSYS_CG_CON0);
  502. for (i = 0; i < 32; i++) {
  503. if ((reg & (1 << i)) == 0) {
  504. name = ddp_clock_0(i);
  505. if (name)
  506. strncat(clock_on, name, (sizeof(clock_on) - strlen(clock_on) - 1));
  507. }
  508. }
  509. reg = DISP_REG_GET(DISP_REG_CONFIG_MMSYS_CG_CON1);
  510. for (i = 0; i < 32; i++) {
  511. if ((reg & (1 << i)) == 0) {
  512. name = ddp_clock_1(i);
  513. if (name)
  514. strncat(clock_on, name, (sizeof(clock_on) - strlen(clock_on) - 1));
  515. }
  516. }
  517. DDPDUMP("clock on modules:%s\n", clock_on);
  518. DDPDUMP("valid0=0x%x,valid1=0x%x,valid2=0x%x,ready0=0x%x,ready1=0x%x,ready2=0x%x,greq=0%x\n",
  519. valid[0], valid[1], valid[2], ready[0], ready[1], ready[2], greq);
  520. for (j = 0; j < ARRAY_SIZE(valid); j++) {
  521. for (i = 0; i < 32; i++) {
  522. name = ddp_signal[j][i];
  523. if (!name)
  524. continue;
  525. pos = clock_on;
  526. if ((valid[j] & (1 << i)))
  527. pos += snprintf(pos, (sizeof(clock_on) - strlen(clock_on) - 1), "%s,", "v");
  528. else
  529. pos += snprintf(pos, (sizeof(clock_on) - strlen(clock_on) - 1), "%s,", "n");
  530. if ((ready[j] & (1 << i)))
  531. pos += snprintf(pos, (sizeof(clock_on) - strlen(clock_on) - 1), "%s", "r");
  532. else
  533. pos += snprintf(pos, (sizeof(clock_on) - strlen(clock_on) - 1), "%s", "n");
  534. pos += snprintf(pos, (sizeof(clock_on) - strlen(clock_on) - 1), ": %s", name);
  535. DDPDUMP("%s\n", clock_on);
  536. }
  537. }
  538. /* greq: 1 means SMI dose not grant, maybe SMI hang */
  539. if (greq)
  540. DDPDUMP("smi greq not grant module: (greq: 1 means SMI dose not grant, maybe SMI hang)");
  541. clock_on[0] = '\0';
  542. for (i = 0; i < 32; i++) {
  543. if (greq & (1 << i)) {
  544. name = ddp_greq_name(i);
  545. if (!name)
  546. continue;
  547. strncat(clock_on, name, (sizeof(clock_on) - strlen(clock_on) - 1));
  548. }
  549. }
  550. DDPDUMP("%s\n", clock_on);
  551. }
  552. static void gamma_dump_reg(void)
  553. {
  554. DDPDUMP("== DISP GAMMA REGS ==\n");
  555. DDPDUMP("(0x000)GA_EN=0x%x\n", DISP_REG_GET(DISP_REG_GAMMA_EN));
  556. DDPDUMP("(0x004)GA_RESET=0x%x\n", DISP_REG_GET(DISP_REG_GAMMA_RESET));
  557. DDPDUMP("(0x008)GA_INTEN=0x%x\n", DISP_REG_GET(DISP_REG_GAMMA_INTEN));
  558. DDPDUMP("(0x00c)GA_INTSTA=0x%x\n", DISP_REG_GET(DISP_REG_GAMMA_INTSTA));
  559. DDPDUMP("(0x010)GA_STATUS=0x%x\n", DISP_REG_GET(DISP_REG_GAMMA_STATUS));
  560. DDPDUMP("(0x020)GA_CFG=0x%x\n", DISP_REG_GET(DISP_REG_GAMMA_CFG));
  561. DDPDUMP("(0x024)GA_IN_COUNT=0x%x\n", DISP_REG_GET(DISP_REG_GAMMA_INPUT_COUNT));
  562. DDPDUMP("(0x028)GA_OUT_COUNT=0x%x\n", DISP_REG_GET(DISP_REG_GAMMA_OUTPUT_COUNT));
  563. DDPDUMP("(0x02c)GA_CHKSUM=0x%x\n", DISP_REG_GET(DISP_REG_GAMMA_CHKSUM));
  564. DDPDUMP("(0x030)GA_SIZE=0x%x\n", DISP_REG_GET(DISP_REG_GAMMA_SIZE));
  565. DDPDUMP("(0x0c0)GA_DUMMY_REG=0x%x\n", DISP_REG_GET(DISP_REG_GAMMA_DUMMY_REG));
  566. DDPDUMP("(0x800)GA_LUT=0x%x\n", DISP_REG_GET(DISP_REG_GAMMA_LUT));
  567. }
  568. static void gamma_dump_analysis(void)
  569. {
  570. DDPDUMP("== DISP GAMMA ANALYSIS ==\n");
  571. DDPDUMP("gamma: en=%d, w=%d, h=%d, in_p_cnt=%d, in_l_cnt=%d, out_p_cnt=%d, out_l_cnt=%d\n",
  572. DISP_REG_GET(DISP_REG_GAMMA_EN),
  573. (DISP_REG_GET(DISP_REG_GAMMA_SIZE) >> 16) & 0x1fff,
  574. DISP_REG_GET(DISP_REG_GAMMA_SIZE) & 0x1fff,
  575. DISP_REG_GET(DISP_REG_GAMMA_INPUT_COUNT) & 0x1fff,
  576. (DISP_REG_GET(DISP_REG_GAMMA_INPUT_COUNT) >> 16) & 0x1fff,
  577. DISP_REG_GET(DISP_REG_GAMMA_OUTPUT_COUNT) & 0x1fff,
  578. (DISP_REG_GET(DISP_REG_GAMMA_OUTPUT_COUNT) >> 16) & 0x1fff);
  579. }
  580. static void color_dump_reg(DISP_MODULE_ENUM module)
  581. {
  582. int index = 0;
  583. if (DISP_MODULE_COLOR0 == module) {
  584. index = 0;
  585. } else if (DISP_MODULE_COLOR1 == module) {
  586. DDPDUMP("error: DISP COLOR%d dose not exist!\n", index);
  587. return;
  588. }
  589. DDPDUMP("== DISP COLOR%d REGS ==\n", index);
  590. DDPDUMP("(0x400)COLOR_CFG_MAIN=0x%x\n", DISP_REG_GET(DISP_COLOR_CFG_MAIN));
  591. DDPDUMP("(0x404)COLOR_PXL_CNT_MAIN=0x%x\n", DISP_REG_GET(DISP_COLOR_PXL_CNT_MAIN));
  592. DDPDUMP("(0x408)COLOR_LINE_CNT_MAIN=0x%x\n", DISP_REG_GET(DISP_COLOR_LINE_CNT_MAIN));
  593. DDPDUMP("(0xc00)COLOR_START=0x%x\n", DISP_REG_GET(DISP_COLOR_START));
  594. DDPDUMP("(0xc28)DISP_COLOR_CK_ON=0x%x\n", DISP_REG_GET(DISP_COLOR_CK_ON));
  595. DDPDUMP("(0xc50)COLOR_INTER_IP_W=0x%x\n", DISP_REG_GET(DISP_COLOR_INTERNAL_IP_WIDTH));
  596. DDPDUMP("(0xc54)COLOR_INTER_IP_H=0x%x\n", DISP_REG_GET(DISP_COLOR_INTERNAL_IP_HEIGHT));
  597. return;
  598. }
  599. static void color_dump_analysis(DISP_MODULE_ENUM module)
  600. {
  601. int index = 0;
  602. if (DISP_MODULE_COLOR0 == module) {
  603. index = 0;
  604. } else if (DISP_MODULE_COLOR1 == module) {
  605. DDPDUMP("error: DISP COLOR%d dose not exist!\n", index);
  606. return;
  607. }
  608. DDPDUMP("== DISP COLOR%d ANALYSIS ==\n", index);
  609. DDPDUMP("color%d: bypass=%d, w=%d, h=%d, pixel_cnt=%d, line_cnt=%d,\n",
  610. index,
  611. (DISP_REG_GET(DISP_COLOR_CFG_MAIN) >> 7) & 0x1,
  612. DISP_REG_GET(DISP_COLOR_INTERNAL_IP_WIDTH),
  613. DISP_REG_GET(DISP_COLOR_INTERNAL_IP_HEIGHT),
  614. DISP_REG_GET(DISP_COLOR_PXL_CNT_MAIN) & 0xffff,
  615. (DISP_REG_GET(DISP_COLOR_LINE_CNT_MAIN) >> 16) & 0x1fff);
  616. return;
  617. }
  618. static void aal_dump_reg(void)
  619. {
  620. DDPDUMP("== DISP AAL REGS ==\n");
  621. DDPDUMP("(0x000)AAL_EN=0x%x\n", DISP_REG_GET(DISP_AAL_EN));
  622. DDPDUMP("(0x008)AAL_INTEN=0x%x\n", DISP_REG_GET(DISP_AAL_INTEN));
  623. DDPDUMP("(0x00c)AAL_INTSTA=0x%x\n", DISP_REG_GET(DISP_AAL_INTSTA));
  624. DDPDUMP("(0x020)AAL_CFG=0x%x\n", DISP_REG_GET(DISP_AAL_CFG));
  625. DDPDUMP("(0x024)AAL_IN_CNT=0x%x\n", DISP_REG_GET(DISP_AAL_IN_CNT));
  626. DDPDUMP("(0x028)AAL_OUT_CNT=0x%x\n", DISP_REG_GET(DISP_AAL_OUT_CNT));
  627. DDPDUMP("(0x030)AAL_SIZE=0x%x\n", DISP_REG_GET(DISP_AAL_SIZE));
  628. DDPDUMP("(0x20c)AAL_CABC_00=0x%x\n", DISP_REG_GET(DISP_AAL_CABC_00));
  629. DDPDUMP("(0x214)AAL_CABC_02=0x%x\n", DISP_REG_GET(DISP_AAL_CABC_02));
  630. DDPDUMP("(0x20c)AAL_STATUS_00=0x%x\n", DISP_REG_GET(DISP_AAL_STATUS_00));
  631. DDPDUMP("(0x210)AAL_STATUS_01=0x%x\n", DISP_REG_GET(DISP_AAL_STATUS_00 + 0x4));
  632. DDPDUMP("(0x2a0)AAL_STATUS_31=0x%x\n", DISP_REG_GET(DISP_AAL_STATUS_32 - 0x4));
  633. DDPDUMP("(0x2a4)AAL_STATUS_32=0x%x\n", DISP_REG_GET(DISP_AAL_STATUS_32));
  634. DDPDUMP("(0x3b0)AAL_DRE_MAPPING_00=0x%x\n", DISP_REG_GET(DISP_AAL_DRE_MAPPING_00));
  635. return;
  636. }
  637. static void aal_dump_analysis(void)
  638. {
  639. DDPDUMP("== DISP AAL ANALYSIS ==\n");
  640. DDPDUMP("aal: bypass=%d, relay=%d, en=%d, w=%d, h=%d, in(%d,%d),out(%d,%d)\n",
  641. DISP_REG_GET(DISP_AAL_EN) == 0x0,
  642. DISP_REG_GET(DISP_AAL_CFG) & 0x01,
  643. DISP_REG_GET(DISP_AAL_EN),
  644. (DISP_REG_GET(DISP_AAL_SIZE) >> 16) & 0x1fff,
  645. DISP_REG_GET(DISP_AAL_SIZE) & 0x1fff,
  646. DISP_REG_GET(DISP_AAL_IN_CNT) & 0x1fff,
  647. (DISP_REG_GET(DISP_AAL_IN_CNT) >> 16) & 0x1fff,
  648. DISP_REG_GET(DISP_AAL_OUT_CNT) & 0x1fff,
  649. (DISP_REG_GET(DISP_AAL_OUT_CNT) >> 16) & 0x1fff);
  650. }
  651. static void pwm_dump_reg(DISP_MODULE_ENUM module)
  652. {
  653. int index = 0;
  654. unsigned long reg_base = 0;
  655. if (module == DISP_MODULE_PWM0) {
  656. index = 0;
  657. reg_base = DISPSYS_PWM0_BASE;
  658. } else {
  659. index = 1;
  660. reg_base = DISPSYS_PWM0_BASE;
  661. }
  662. DDPDUMP("== DISP PWM%d REGS ==\n", index);
  663. DDPDUMP("(0x000)PWM_EN=0x%x\n", DISP_REG_GET(reg_base + DISP_PWM_EN_OFF));
  664. DDPDUMP("(0x008)PWM_CON_0=0x%x\n", DISP_REG_GET(reg_base + DISP_PWM_CON_0_OFF));
  665. DDPDUMP("(0x010)PWM_CON_1=0x%x\n", DISP_REG_GET(reg_base + DISP_PWM_CON_1_OFF));
  666. DDPDUMP("(0x028)PWM_DEBUG=0x%x\n", DISP_REG_GET(reg_base + 0x28));
  667. return;
  668. }
  669. static void pwm_dump_analysis(DISP_MODULE_ENUM module)
  670. {
  671. int index = 0;
  672. //unsigned int reg_base = 0;
  673. if (module == DISP_MODULE_PWM0) {
  674. index = 0;
  675. //reg_base = DISPSYS_PWM0_BASE;
  676. } else {
  677. index = 1;
  678. //reg_base = DISPSYS_PWM0_BASE;
  679. }
  680. DDPDUMP("== DISP PWM%d ANALYSIS ==\n", index);
  681. #if 0 /* TODO: clk reg?? */
  682. DDPDUMP("pwm clock=%d\n", (DISP_REG_GET(DISP_REG_CLK_CFG_1_CLR) >> 7) & 0x1);
  683. #endif
  684. return;
  685. }
  686. static void ccorr_dump_reg(void)
  687. {
  688. DDPDUMP("== DISP CCORR REGS ==\n");
  689. DDPDUMP("(00)EN=0x%x\n", DISP_REG_GET(DISP_REG_CCORR_EN));
  690. DDPDUMP("(20)CFG=0x%x\n", DISP_REG_GET(DISP_REG_CCORR_CFG));
  691. DDPDUMP("(24)IN_CNT=0x%x\n", DISP_REG_GET(DISP_REG_CCORR_IN_CNT));
  692. DDPDUMP("(28)OUT_CNT=0x%x\n", DISP_REG_GET(DISP_REG_CCORR_OUT_CNT));
  693. DDPDUMP("(30)SIZE=0x%x\n", DISP_REG_GET(DISP_REG_CCORR_SIZE));
  694. }
  695. static void ccorr_dump_analyze(void)
  696. {
  697. DDPDUMP("ccorr: en=%d, config=%d, w=%d, h=%d, in_p_cnt=%d, in_l_cnt=%d, out_p_cnt=%d, out_l_cnt=%d\n",
  698. DISP_REG_GET(DISP_REG_CCORR_EN), DISP_REG_GET(DISP_REG_CCORR_CFG),
  699. (DISP_REG_GET(DISP_REG_CCORR_SIZE) >> 16) & 0x1fff,
  700. DISP_REG_GET(DISP_REG_CCORR_SIZE) & 0x1fff,
  701. DISP_REG_GET(DISP_REG_CCORR_IN_CNT) & 0x1fff,
  702. (DISP_REG_GET(DISP_REG_CCORR_IN_CNT) >> 16) & 0x1fff,
  703. DISP_REG_GET(DISP_REG_CCORR_IN_CNT) & 0x1fff,
  704. (DISP_REG_GET(DISP_REG_CCORR_IN_CNT) >> 16) & 0x1fff);
  705. }
  706. static void dither_dump_reg(void)
  707. {
  708. DDPDUMP("== DISP DITHER REGS ==\n");
  709. DDPDUMP("(00)EN=0x%x\n", DISP_REG_GET(DISP_REG_DITHER_EN));
  710. DDPDUMP("(20)CFG=0x%x\n", DISP_REG_GET(DISP_REG_DITHER_CFG));
  711. DDPDUMP("(24)IN_CNT=0x%x\n", DISP_REG_GET(DISP_REG_DITHER_IN_CNT));
  712. DDPDUMP("(28)OUT_CNT=0x%x\n", DISP_REG_GET(DISP_REG_DITHER_OUT_CNT));
  713. DDPDUMP("(30)SIZE=0x%x\n", DISP_REG_GET(DISP_REG_DITHER_SIZE));
  714. }
  715. static void dither_dump_analyze(void)
  716. {
  717. DDPDUMP("dither: en=%d, config=%d, w=%d, h=%d, in_p_cnt=%d, in_l_cnt=%d, out_p_cnt=%d, out_l_cnt=%d\n",
  718. DISP_REG_GET(DISPSYS_DITHER0_BASE + 0x000), DISP_REG_GET(DISPSYS_DITHER0_BASE + 0x020),
  719. (DISP_REG_GET(DISP_REG_DITHER_SIZE) >> 16) & 0x1fff,
  720. DISP_REG_GET(DISP_REG_DITHER_SIZE) & 0x1fff,
  721. DISP_REG_GET(DISP_REG_DITHER_IN_CNT) & 0x1fff,
  722. (DISP_REG_GET(DISP_REG_DITHER_IN_CNT) >> 16) & 0x1fff,
  723. DISP_REG_GET(DISP_REG_DITHER_OUT_CNT) & 0x1fff,
  724. (DISP_REG_GET(DISP_REG_DITHER_OUT_CNT) >> 16) & 0x1fff);
  725. }
  726. static void dsi_dump_reg(DISP_MODULE_ENUM module)
  727. {
  728. DSI_DumpRegisters(module, 1);
  729. #if 0
  730. if (DISP_MODULE_DSI0) {
  731. int i = 0;
  732. DDPDUMP("== DISP DSI0 REGS ==\n");
  733. for (i = 0; i < 25 * 16; i += 16) {
  734. DDPDUMP("DSI0+%04x: 0x%08x 0x%08x 0x%08x 0x%08x\n", i,
  735. INREG32(DISPSYS_DSI0_BASE + i), INREG32(DISPSYS_DSI0_BASE + i + 0x4),
  736. INREG32(DISPSYS_DSI0_BASE + i + 0x8),
  737. INREG32(DISPSYS_DSI0_BASE + i + 0xc));
  738. }
  739. DDPDUMP("DSI0 CMDQ+0x200: 0x%08x 0x%08x 0x%08x 0x%08x\n",
  740. INREG32(DISPSYS_DSI0_BASE + 0x200), INREG32(DISPSYS_DSI0_BASE + 0x200 + 0x4),
  741. INREG32(DISPSYS_DSI0_BASE + 0x200 + 0x8),
  742. INREG32(DISPSYS_DSI0_BASE + 0x200 + 0xc));
  743. }
  744. #endif
  745. }
  746. static void dpi_dump_reg(void)
  747. {
  748. int i;
  749. DDPDUMP("-- Start dump DPI registers --\n");
  750. for (i = 0; i <= 0x40; i += 4)
  751. DDPDUMP("DPI+%04x: 0x%08x\n", i, INREG32(DISPSYS_DPI_BASE + i));
  752. for (i = 0x68; i <= 0x7C; i += 4)
  753. DDPDUMP("DPI+%04x: 0x%08x\n", i, INREG32(DISPSYS_DPI_BASE + i));
  754. DDPDUMP("DPI+Color Bar : 0x%04x : 0x%08x\n", 0xF00, INREG32(DISPSYS_DPI_BASE + 0xF00));
  755. DDPDUMP("DPI MMSYS_CG_CON0: 0x%08x\n", INREG32(DISP_REG_CONFIG_MMSYS_CG_CON0));
  756. DDPDUMP("DPI MMSYS_CG_CON1: 0x%08x\n", INREG32(DISP_REG_CONFIG_MMSYS_CG_CON1));
  757. }
  758. static void dpi_dump_analysis(void)
  759. {
  760. #if 0
  761. DDPDUMP("== DISP DPI ANALYSIS ==\n");
  762. /* TODO: mmsys clk?? */
  763. DDPDUMP("DPI clock=0x%x\n", DISP_REG_GET(DISP_REG_CLK_CFG_6_DPI));
  764. DDPDUMP("DPI clock_clear=%d\n", (DISP_REG_GET(DISP_REG_CLK_CFG_6_CLR) >> 7) & 0x1);
  765. #endif
  766. }
  767. int ddp_dump_reg(DISP_MODULE_ENUM module)
  768. {
  769. switch (module) {
  770. case DISP_MODULE_WDMA0:
  771. //wdma_dump_reg(module);
  772. break;
  773. case DISP_MODULE_RDMA0:
  774. case DISP_MODULE_RDMA1:
  775. case DISP_MODULE_RDMA2:
  776. RDMADump(module);
  777. break;
  778. case DISP_MODULE_OVL0:
  779. case DISP_MODULE_OVL1:
  780. case DISP_MODULE_OVL0_2L:
  781. case DISP_MODULE_OVL1_2L:
  782. OVLDump(module);
  783. break;
  784. case DISP_MODULE_GAMMA0:
  785. gamma_dump_reg();
  786. break;
  787. case DISP_MODULE_CONFIG:
  788. mmsys_config_dump_reg();
  789. break;
  790. case DISP_MODULE_MUTEX:
  791. mutex_dump_reg();
  792. break;
  793. case DISP_MODULE_COLOR0:
  794. case DISP_MODULE_COLOR1:
  795. color_dump_reg(module);
  796. break;
  797. case DISP_MODULE_AAL0:
  798. aal_dump_reg();
  799. break;
  800. case DISP_MODULE_PWM0:
  801. pwm_dump_reg(module);
  802. break;
  803. case DISP_MODULE_DSI0:
  804. case DISP_MODULE_DSI1:
  805. case DISP_MODULE_DSIDUAL:
  806. dsi_dump_reg(module);
  807. break;
  808. case DISP_MODULE_DPI:
  809. dpi_dump_reg();
  810. break;
  811. case DISP_MODULE_CCORR0:
  812. ccorr_dump_reg();
  813. break;
  814. case DISP_MODULE_DITHER0:
  815. dither_dump_reg();
  816. break;
  817. default:
  818. DDPDUMP("no dump_reg for module %s(%d)\n", ddp_get_module_name(module), module);
  819. }
  820. return 0;
  821. }
  822. int ddp_dump_analysis(DISP_MODULE_ENUM module)
  823. {
  824. switch (module) {
  825. case DISP_MODULE_WDMA0:
  826. //wdma_dump_analysis(module);
  827. break;
  828. case DISP_MODULE_RDMA0:
  829. case DISP_MODULE_RDMA1:
  830. case DISP_MODULE_RDMA2:
  831. rdma_dump_analysis(module);
  832. break;
  833. case DISP_MODULE_OVL0:
  834. case DISP_MODULE_OVL1:
  835. case DISP_MODULE_OVL0_2L:
  836. case DISP_MODULE_OVL1_2L:
  837. ovl_dump_analysis(module);
  838. break;
  839. case DISP_MODULE_GAMMA0:
  840. gamma_dump_analysis();
  841. break;
  842. case DISP_MODULE_CONFIG:
  843. mmsys_config_dump_analysis();
  844. break;
  845. case DISP_MODULE_MUTEX:
  846. mutex_dump_analysis();
  847. break;
  848. case DISP_MODULE_COLOR0:
  849. case DISP_MODULE_COLOR1:
  850. color_dump_analysis(module);
  851. break;
  852. case DISP_MODULE_AAL0:
  853. aal_dump_analysis();
  854. break;
  855. case DISP_MODULE_PWM0:
  856. pwm_dump_analysis(module);
  857. break;
  858. case DISP_MODULE_DSI0:
  859. case DISP_MODULE_DSI1:
  860. case DISP_MODULE_DSIDUAL:
  861. dsi_analysis(module);
  862. break;
  863. case DISP_MODULE_DPI:
  864. dpi_dump_analysis();
  865. break;
  866. case DISP_MODULE_CCORR0:
  867. ccorr_dump_analyze();
  868. break;
  869. case DISP_MODULE_DITHER0:
  870. dither_dump_analyze();
  871. break;
  872. default:
  873. DDPDUMP("no dump_analysis for module %s(%d)\n", ddp_get_module_name(module),
  874. module);
  875. }
  876. return 0;
  877. }