ddp_dump.c 35 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077
  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. static const char* ddp_signal[3][32] = {
  40. {
  41. "aal0_to_gamma0",
  42. "aal1_to_gamma1",
  43. "ccorr0_to_aal0",
  44. "ccorr1_to_aal1",
  45. "color0_to_ccorr0",
  46. "color0_sel_to_color0",
  47. "color1_to_ccorr1",
  48. "color1_sel_to_color1",
  49. "path0_sel_to_path0_sout",
  50. "path0_sout_out_0_to_ufoe_sel_in_0",
  51. "path0_sout_out_1_to_dsc_sel_in_0",
  52. "path1_sel_to_path1",
  53. "path1_sout_out_0_to_dsc_sel_in_1",
  54. "path1_sout_out_1_to_ufoe_sel_in_1",
  55. "rdma0_to_rdma0_sout",
  56. "rdma0_sout_out_0_to_path0_sel_in_0",
  57. "rdma0_sout_out_1_to_color0_sel_in_0",
  58. "rdma0_sout_out_2_to_dsi0_sel_in_2",
  59. "rdma0_sout_out_3_to_dsi1_sel_in_1",
  60. "rdma0_sout_out_4_to_dpi0_sel_in_1",
  61. "rdma1_to_rdma1_sout",
  62. "rdma1_sout_out_0_to_path1_sel_in_0",
  63. "rdma1_sout_out_1_to_color1_sel_in_0",
  64. "rdma1_sout_out_2_to_dsi0_sel_in_4",
  65. "rdma1_sout_out_3_to_dsi1_sel_in_4",
  66. "rdma1_sout_out_4_to_dpi0_sel_in_3",
  67. "rdma2_to_dpi0_sel_in_4",
  68. "split_out_0_to_dsi0_1",
  69. "split_1_to_dsi1_0",
  70. "wdma0_sel_to_wdma0",
  71. "wdma1_sel_to_wdma1",
  72. "dither0_to_dither0_mout",
  73. },
  74. {
  75. "dither0_mout_out_0_to_rdma0",
  76. "dither0_mout_out_1_to_path0_sel_in_1",
  77. "dither0_mout_out_2_to_wdma0_sel_in_1",
  78. "dither1_to_dither1_mout",
  79. "dither1_mout_out_0_to_rdma1",
  80. "dither1_mout_out_1_to_path1_sel_in_1",
  81. "dither1_mout_out_2_to_wdma1_sel_in_1",
  82. "dpi0_sel_to_dpi0",
  83. "dsc_mout_out_0_to_dsi0_sel_in_3",
  84. "dsc_mout_out_1_to_dsi1_sel_in_2",
  85. "dsc_mout_out_2_to_dpi0_sel_in_2",
  86. "dsc_mout_out_3_to_wdma1_sel_in_2",
  87. "dsc_sel_to_dsc_wrap",
  88. "dsi0_sel_to_dsi0",
  89. "dsi1_sel_to_dsi1",
  90. "gamma0_to_od",
  91. "gamma1_to_dither1",
  92. "od_to_dither0",
  93. "ovl0_2L_to_ovl0_sout",
  94. "ovl0_to_ovl0_mout",
  95. "ovl0_mout_out_0_to_ovl0_2L",
  96. "ovl0_mout_out_1_to_wdma0_sel_in_3",
  97. "ovl0_pq_mout_out_0_to_color0_sel_in_1",
  98. "ovl0_pq_mout_out_1_to_wdma0_sel_in_0",
  99. "ovl0_sel_to_ovl_pq_mout",
  100. "ovl0_sout_out_0_to_ovl0_sel_in_0",
  101. "ovl0_sout_out_1_to_ovl1",
  102. "ovl0_sout_out_2_to_ovl1_2L_sel_in_0",
  103. "ovl1_2L_to_ovl1_pq_mout",
  104. "ovl1_2L_sel_to_ovl1_2L",
  105. "ovl1_2L_to_ovl1_mout",
  106. "ovl1_2L_mout_out_0_to_ovl1_2L_sel_in_1",
  107. },
  108. {
  109. "ovl1_mout_out_1_to_ovl0_sel_in_2",
  110. "ovl1_mout_out_2_to_wdma1_sel_in_3",
  111. "ovl1_mout_out_3_to_color1_sel_in_2",
  112. "ovl1_pq_mout_out_0_to_color1_sel_in_1",
  113. "ovl1_pq_mout_out_1_to_wdma1_sel_in_0",
  114. "ovl1_pq_mout_out_2_to_ovl0_sel_in_1",
  115. "ufoe_to_ufoe_mout",
  116. "ufoe_mout_out_0_to_dsi0_sel_in_0",
  117. "ufoe_mout_out_1_to_split",
  118. "ufoe_mout_out_2_to_dpi0_sel_in_0",
  119. "ufoe_mout_out_3_to_wdma0_sel_in_2",
  120. "ufoe_mout_out_4_to_dsi1_sel_in_3",
  121. "ufoe_sel_to_ufoe",
  122. "dsc_wrap_to_dsc_mout",
  123. }
  124. };
  125. static char *ddp_greq_name(int bit)
  126. {
  127. switch (bit) {
  128. case 0:
  129. return "OVL0";
  130. case 1:
  131. return "OVL0_2L";
  132. case 2:
  133. return "RDMA0";
  134. case 3:
  135. return "WDMA0";
  136. case 4:
  137. return "MDP_RDMA0";
  138. case 5:
  139. return "MDP_WDMA";
  140. case 6:
  141. return "MDP_WROT0";
  142. case 16:
  143. return "OVL1";
  144. case 17:
  145. return "OVL1_2L";
  146. case 18:
  147. return "RDMA1";
  148. case 19:
  149. return "RDMA2";
  150. case 20:
  151. return "WDMA1";
  152. case 21:
  153. return "OD_R";
  154. case 22:
  155. return "OD_W";
  156. case 23:
  157. return "OVL0_2L_LARB4";
  158. case 26:
  159. return "WMDA0_LARB5";
  160. default:
  161. return NULL;
  162. }
  163. }
  164. static char *ddp_get_mutex_module0_name(unsigned int bit)
  165. {
  166. switch (bit) {
  167. case 0: return "rdma0";
  168. case 1: return "rdma1";
  169. case 2: return "rdma2";
  170. case 3: return "mdp_rdma0";
  171. case 4: return "mdp_rdma1";
  172. case 5: return "mdp_rsz0";
  173. case 6: return "mdp_rsz1";
  174. case 7: return "mdp_rsz2";
  175. case 8: return "mdp_tdshp";
  176. case 9: return "mdp_color";
  177. case 10: return "mdp_wdma";
  178. case 11: return "mdp_wrot0";
  179. case 12: return "mdp_wrot1";
  180. case 13: return "ovl0";
  181. case 14: return "ovl1";
  182. case 15: return "ovl0_2L";
  183. case 16: return "ovl1_2L";
  184. case 17: return "wdma0";
  185. case 18: return "wdma1";
  186. case 19: return "color0";
  187. case 20: return "color1";
  188. case 21: return "ccorr0";
  189. case 22: return "ccorr1";
  190. case 23: return "aal0";
  191. case 24: return "aal1";
  192. case 25: return "gamma0";
  193. case 26: return "gamma1";
  194. case 27: return "od";
  195. case 28: return "dither0";
  196. case 29: return "dither1";
  197. case 30: return "ufoe";
  198. case 31: return "dsc";
  199. default:
  200. return "mutex-unknown";
  201. }
  202. }
  203. static char *ddp_get_mutex_module1_name(unsigned int bit)
  204. {
  205. switch (bit) {
  206. case 0: return "pwm";
  207. case 1: return "dsi0";
  208. case 2: return "dsi1";
  209. default:
  210. return "mutex-unknown";
  211. }
  212. }
  213. char *ddp_get_fmt_name(DISP_MODULE_ENUM module, unsigned int fmt)
  214. {
  215. if (module == DISP_MODULE_WDMA0) {
  216. switch (fmt) {
  217. case 0:
  218. return "rgb565";
  219. case 1:
  220. return "rgb888";
  221. case 2:
  222. return "rgba8888";
  223. case 3:
  224. return "argb8888";
  225. case 4:
  226. return "uyvy";
  227. case 5:
  228. return "yuy2";
  229. case 7:
  230. return "y-only";
  231. case 8:
  232. return "iyuv";
  233. case 12:
  234. return "nv12";
  235. default:
  236. DDPDUMP("ddp_get_fmt_name, unknown fmt=%d, module=%d\n", fmt, module);
  237. return "unknown";
  238. }
  239. } else if (module == DISP_MODULE_OVL0) {
  240. switch (fmt) {
  241. case 0:
  242. return "rgb565";
  243. case 1:
  244. return "rgb888";
  245. case 2:
  246. return "rgba8888";
  247. case 3:
  248. return "argb8888";
  249. case 4:
  250. return "uyvy";
  251. case 5:
  252. return "yuyv";
  253. default:
  254. DDPDUMP("ddp_get_fmt_name, unknown fmt=%d, module=%d\n", fmt, module);
  255. return "unknown";
  256. }
  257. } else if (module == DISP_MODULE_RDMA0 || module == DISP_MODULE_RDMA1 || module == DISP_MODULE_RDMA2) {
  258. switch (fmt) {
  259. case 0:
  260. return "rgb565";
  261. case 1:
  262. return "rgb888";
  263. case 2:
  264. return "rgba8888";
  265. case 3:
  266. return "argb8888";
  267. case 4:
  268. return "uyvy";
  269. case 5:
  270. return "yuyv";
  271. default:
  272. DDPDUMP("ddp_get_fmt_name, unknown fmt=%d, module=%d\n", fmt, module);
  273. return "unknown";
  274. }
  275. } else {
  276. DDPDUMP("ddp_get_fmt_name, unknown module=%d\n", module);
  277. }
  278. return "unknown";
  279. }
  280. static char *ddp_clock_0(int bit)
  281. {
  282. switch (bit) {
  283. case 0:
  284. return "smi_common(cg), ";
  285. case 1:
  286. return "smi_larb0(cg), ";
  287. case 2:
  288. return "smi_larb4(cg), ";
  289. case 15:
  290. return "ovl0, ";
  291. case 16:
  292. return "ovl1, ";
  293. case 17:
  294. return "ovl0_2L, ";
  295. case 18:
  296. return "ovl1_2L, ";
  297. case 19:
  298. return "rdma0, ";
  299. case 20:
  300. return "rdma1, ";
  301. case 21:
  302. return "wdma0, ";
  303. case 22:
  304. return "wdma1, ";
  305. case 23:
  306. return "color, ";
  307. case 24:
  308. return "ccorr, ";
  309. case 25:
  310. return "aal, ";
  311. case 26:
  312. return "gamma, ";
  313. case 27:
  314. return "od, ";
  315. case 28:
  316. return "dither, ";
  317. case 29:
  318. return "ufoe_mout, ";
  319. case 30:
  320. return "dsc, ";
  321. case 31:
  322. return "split, ";
  323. default:
  324. return NULL;
  325. }
  326. }
  327. static char *ddp_clock_1(int bit)
  328. {
  329. switch (bit) {
  330. case 0:
  331. return "dsi0_mm(cg), ";
  332. case 1:
  333. return "dsi0_interface(cg), ";
  334. case 2:
  335. return "dsi1_mm(cg), ";
  336. case 3:
  337. return "dsi1_interface(cg), ";
  338. case 4:
  339. return "dpi_mm(cg), ";
  340. case 5:
  341. return "dpi_interface, ";
  342. case 8:
  343. return "ovl0_mout, ";
  344. default:
  345. return NULL;
  346. }
  347. }
  348. static void mutex_dump_reg(void)
  349. {
  350. DDPDUMP("==DISP MUTEX REGS==\n");
  351. DDPDUMP("(0x000)M_INTEN =0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_MUTEX_INTEN));
  352. DDPDUMP("(0x004)M_INTSTA =0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_MUTEX_INTSTA));
  353. DDPDUMP("(0x020)M0_EN =0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_MUTEX0_EN));
  354. DDPDUMP("(0x024)M0_GET =0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_MUTEX0_GET));
  355. DDPDUMP("(0x028)M0_RST =0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_MUTEX0_RST));
  356. DDPDUMP("(0x02c)M0_SOF =0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_MUTEX0_SOF));
  357. DDPDUMP("(0x030)M0_MOD0 =0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_MUTEX0_MOD0));
  358. DDPDUMP("(0x034)M0_MOD1 =0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_MUTEX0_MOD1));
  359. DDPDUMP("(0x040)M1_EN =0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_MUTEX1_EN));
  360. DDPDUMP("(0x044)M1_GET =0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_MUTEX1_GET));
  361. DDPDUMP("(0x048)M1_RST =0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_MUTEX1_RST));
  362. DDPDUMP("(0x04c)M1_SOF =0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_MUTEX1_SOF));
  363. DDPDUMP("(0x050)M1_MOD0 =0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_MUTEX1_MOD0));
  364. DDPDUMP("(0x054)M1_MOD1 =0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_MUTEX1_MOD1));
  365. DDPDUMP("(0x060)M2_EN =0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_MUTEX2_EN));
  366. DDPDUMP("(0x064)M2_GET =0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_MUTEX2_GET));
  367. DDPDUMP("(0x068)M2_RST =0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_MUTEX2_RST));
  368. DDPDUMP("(0x06c)M2_SOF =0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_MUTEX2_SOF));
  369. DDPDUMP("(0x070)M2_MOD0 =0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_MUTEX2_MOD0));
  370. DDPDUMP("(0x074)M2_MOD1 =0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_MUTEX2_MOD1));
  371. DDPDUMP("(0x080)M3_EN =0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_MUTEX3_EN));
  372. DDPDUMP("(0x084)M3_GET =0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_MUTEX3_GET));
  373. DDPDUMP("(0x088)M3_RST =0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_MUTEX3_RST));
  374. DDPDUMP("(0x08C)M3_SOF =0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_MUTEX3_SOF));
  375. DDPDUMP("(0x090)M3_MOD0 =0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_MUTEX3_MOD0));
  376. DDPDUMP("(0x090)M3_MOD1 =0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_MUTEX3_MOD1));
  377. DDPDUMP("(0x0a0)M4_EN =0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_MUTEX4_EN));
  378. DDPDUMP("(0x0a4)M4_GET =0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_MUTEX4_GET));
  379. DDPDUMP("(0x0a8)M4_RST =0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_MUTEX4_RST));
  380. DDPDUMP("(0x0ac)M4_SOF =0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_MUTEX4_SOF));
  381. DDPDUMP("(0x0b0)M4_MOD0 =0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_MUTEX4_MOD0));
  382. DDPDUMP("(0x0b4)M4_MOD1 =0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_MUTEX4_MOD1));
  383. DDPDUMP("(0x0c0)M5_EN =0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_MUTEX5_EN));
  384. DDPDUMP("(0x0c4)M5_GET =0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_MUTEX5_GET));
  385. DDPDUMP("(0x0c8)M5_RST =0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_MUTEX5_RST));
  386. DDPDUMP("(0x0cc)M5_SOF =0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_MUTEX5_SOF));
  387. DDPDUMP("(0x0d0)M5_MOD0 =0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_MUTEX5_MOD0));
  388. DDPDUMP("(0x0d4)M5_MOD1 =0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_MUTEX5_MOD1));
  389. DDPDUMP("(0x300)DISP_REG_CONFIG_MUTEX_DUMMY0 =0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_MUTEX_DUMMY0));
  390. DDPDUMP("(0x304)DISP_REG_CONFIG_MUTEX_DUMMY1 =0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_MUTEX_DUMMY1));
  391. DDPDUMP("(0x30c)DEBUG_OUT_SEL =0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_DEBUG_OUT_SEL));
  392. return;
  393. }
  394. static void mutex_dump_analysis(void)
  395. {
  396. int i = 0;
  397. int j = 0;
  398. char mutex_module[512] = { '\0' };
  399. char *p = NULL;
  400. int len = 0;
  401. unsigned int val;
  402. DDPDUMP("== DISP Mutex Analysis ==\n");
  403. for (i = 0; i < 5; i++) {
  404. p = mutex_module;
  405. len = 0;
  406. if (DISP_REG_GET(DISP_REG_CONFIG_MUTEX_MOD0(i)) == 0)
  407. continue;
  408. val = DISP_REG_GET(DISP_REG_CONFIG_MUTEX_SOF(i));
  409. len = sprintf(p, "MUTEX%d :SOF=%s,EOF=%s,WAIT=%d,module=(",
  410. i,
  411. ddp_get_mutex_sof_name(REG_FLD_VAL_GET(SOF_FLD_MUTEX0_SOF, val)),
  412. ddp_get_mutex_sof_name(REG_FLD_VAL_GET(SOF_FLD_MUTEX0_EOF, val)),
  413. REG_FLD_VAL_GET(SOF_FLD_MUTEX0_SOF_WAIT, val));
  414. p += len;
  415. for (j = 0; j < 32; j++) {
  416. unsigned int regval = DISP_REG_GET(DISP_REG_CONFIG_MUTEX_MOD0(i));
  417. if ((regval & (1 << j))) {
  418. len = sprintf(p, "%s,", ddp_get_mutex_module0_name(j));
  419. p += len;
  420. }
  421. }
  422. for (j = 0; j < 32; j++) {
  423. unsigned int regval = DISP_REG_GET(DISP_REG_CONFIG_MUTEX_MOD1(i));
  424. if ((regval & (1 << j))) {
  425. len = sprintf(p, "%s,", ddp_get_mutex_module1_name(j));
  426. p += len;
  427. }
  428. }
  429. DDPDUMP("%s)\n", mutex_module);
  430. }
  431. }
  432. static void mmsys_config_dump_reg(void)
  433. {
  434. DDPDUMP("== DISP MMSYS_Config REGS ==\n");
  435. DDPDUMP("OVL0_MOUT_EN=0x%x\n" , DISP_REG_GET(DISP_REG_CONFIG_DISP_OVL0_MOUT_EN ));
  436. DDPDUMP("OVL0_PQ_MOUT_EN=0x%x\n" , DISP_REG_GET(DISP_REG_CONFIG_DISP_OVL0_PQ_MOUT_EN ));
  437. DDPDUMP("OVL1_MOUT_EN=0x%x\n" , DISP_REG_GET(DISP_REG_CONFIG_DISP_OVL1_MOUT_EN ));
  438. DDPDUMP("OVL1_PQ_MOUT_EN=0x%x\n" , DISP_REG_GET(DISP_REG_CONFIG_DISP_OVL1_PQ_MOUT_EN ));
  439. DDPDUMP("DITHER_MOUT_EN=0x%x\n" , DISP_REG_GET(DISP_REG_CONFIG_DISP_DITHER_MOUT_EN ));
  440. DDPDUMP("DITHER1_MOUT_EN=0x%x\n" , DISP_REG_GET(DISP_REG_CONFIG_DISP_DITHER1_MOUT_EN ));
  441. DDPDUMP("UFOE_MOUT_EN=0x%x\n" , DISP_REG_GET(DISP_REG_CONFIG_DISP_UFOE_MOUT_EN ));
  442. DDPDUMP("DSC_MOUT_EN=0x%x\n" , DISP_REG_GET(DISP_REG_CONFIG_DISP_DSC_MOUT_EN ));
  443. DDPDUMP("COLOR0_SEL_IN=0x%x\n" , DISP_REG_GET(DISP_REG_CONFIG_DISP_COLOR0_SEL_IN ));
  444. DDPDUMP("COLOR1_SEL_IN=0x%x\n" , DISP_REG_GET(DISP_REG_CONFIG_DISP_COLOR1_SEL_IN ));
  445. DDPDUMP("WDMA0_SEL_IN=0x%x\n" , DISP_REG_GET(DISP_REG_CONFIG_DISP_WDMA0_SEL_IN ));
  446. DDPDUMP("WDMA1_SEL_IN=0x%x\n" , DISP_REG_GET(DISP_REG_CONFIG_DISP_WDMA1_SEL_IN ));
  447. DDPDUMP("UFOE_SEL_IN=0x%x\n" , DISP_REG_GET(DISP_REG_CONFIG_DISP_UFOE_SEL_IN ));
  448. DDPDUMP("DSC_SEL_IN=0x%x\n" , DISP_REG_GET(DISP_REG_CONFIG_DISP_DSC_SEL_IN ));
  449. DDPDUMP("DSI0_SEL_IN=0x%x\n" , DISP_REG_GET(DISP_REG_CONFIG_DSI0_SEL_IN ));
  450. DDPDUMP("DSI1_SEL_IN=0x%x\n" , DISP_REG_GET(DISP_REG_CONFIG_DSI1_SEL_IN ));
  451. DDPDUMP("DPI_SEL_IN=0x%x\n" , DISP_REG_GET(DISP_REG_CONFIG_DPI0_SEL_IN ));
  452. DDPDUMP("PATH0_SEL_IN=0x%x\n" , DISP_REG_GET(DISP_REG_CONFIG_DISP_PATH0_SEL_IN ));
  453. DDPDUMP("PATH1_SEL_IN=0x%x\n" , DISP_REG_GET(DISP_REG_CONFIG_DISP_PATH1_SEL_IN ));
  454. DDPDUMP("OVL0_SEL_IN=0x%x\n" , DISP_REG_GET(DISP_REG_CONFIG_DISP_OVL0_SEL_IN ));
  455. DDPDUMP("OVL1_2L_SEL_IN=0x%x\n" , DISP_REG_GET(DISP_REG_CONFIG_DISP_OVL1_2L_SEL_IN ));
  456. DDPDUMP("PATH0_SOUT_SEL_IN=0x%x\n" , DISP_REG_GET(DISP_REG_CONFIG_DISP_PATH0_SOUT_SEL_IN ));
  457. DDPDUMP("PATH1_SOUT_SEL_IN=0x%x\n" , DISP_REG_GET(DISP_REG_CONFIG_DISP_PATH1_SOUT_SEL_IN ));
  458. DDPDUMP("RDMA0_SOUT_SEL_IN=0x%x\n" , DISP_REG_GET(DISP_REG_CONFIG_DISP_RDMA0_SOUT_SEL_IN ));
  459. DDPDUMP("RDMA1_SOUT_SEL_IN=0x%x\n" , DISP_REG_GET(DISP_REG_CONFIG_DISP_RDMA1_SOUT_SEL_IN ));
  460. DDPDUMP("OVL0_SOUT_SEL_IN=0x%x\n" , DISP_REG_GET(DISP_REG_CONFIG_DISP_OVL0_SOUT_SEL_IN ));
  461. DDPDUMP("(0x0F0)MM_MISC=0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_MMSYS_MISC));
  462. DDPDUMP("(0x100)MM_CG_CON0=0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_MMSYS_CG_CON0));
  463. DDPDUMP("(0x110)MM_CG_CON1=0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_MMSYS_CG_CON1));
  464. DDPDUMP("(0x120)MM_HW_DCM_DIS0=0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_MMSYS_HW_DCM_DIS0));
  465. DDPDUMP("(0x130)MM_HW_DCM_DIS1=0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_MMSYS_HW_DCM_DIS1));
  466. DDPDUMP("(0x140)MM_SW0_RST_B=0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_MMSYS_SW0_RST_B));
  467. DDPDUMP("(0x144)MM_SW1_RST_B=0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_MMSYS_SW1_RST_B));
  468. DDPDUMP("(0x150)MM_LCM_RST_B=0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_MMSYS_LCM_RST_B));
  469. DDPDUMP("(0x880)MM_DBG_OUT_SEL=0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_MMSYS_DEBUG_OUT_SEL));
  470. DDPDUMP("(0x890)MM_DUMMY0=0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_MMSYS_DUMMY0));
  471. DDPDUMP("(0x894)MM_DUMMY1=0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_MMSYS_DUMMY1));
  472. DDPDUMP("(0x898)MM_DUMMY2=0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_MMSYS_DUMMY2));
  473. DDPDUMP("(0x89C)MM_DUMMY3=0x%x\n", DISP_REG_GET(DISP_REG_CONFIG_MMSYS_DUMMY3));
  474. return;
  475. }
  476. /* ------ clock:
  477. Before power on mmsys:
  478. CLK_CFG_0_CLR (address is 0x10000048) = 0x80000000 (bit 31).
  479. Before using DISP_PWM0 or DISP_PWM1:
  480. CLK_CFG_1_CLR(address is 0x10000058)=0x80 (bit 7).
  481. Before using DPI pixel clock:
  482. CLK_CFG_6_CLR(address is 0x100000A8)=0x80 (bit 7).
  483. Only need to enable the corresponding bits of MMSYS_CG_CON0 and MMSYS_CG_CON1 for the modules:
  484. smi_common, larb0, mdp_crop, fake_eng, mutex_32k, pwm0, pwm1, dsi0, dsi1, dpi.
  485. Other bits could keep 1. Suggest to keep smi_common and larb0 always clock on.
  486. --------valid & ready
  487. example:
  488. ovl0 -> ovl0_mout_ready=1 means engines after ovl_mout are ready for receiving data
  489. ovl0_mout_ready=0 means ovl0_mout can not receive data, maybe ovl0_mout or after engines config error
  490. ovl0 -> ovl0_mout_valid=1 means engines before ovl0_mout is OK,
  491. ovl0_mout_valid=0 means ovl can not transfer data to ovl0_mout, means ovl0 or before engines are not ready.
  492. */
  493. static void mmsys_config_dump_analysis(void)
  494. {
  495. unsigned int i = 0, j;
  496. unsigned int reg = 0;
  497. char clock_on[512] = { '\0' };
  498. char *pos = NULL;
  499. const char *name;
  500. /* int len = 0; */
  501. unsigned int valid[3], ready[3];
  502. unsigned int greq;
  503. valid[0] = DISP_REG_GET(DISP_REG_CONFIG_DISP_DL_VALID_0);
  504. valid[1] = DISP_REG_GET(DISP_REG_CONFIG_DISP_DL_VALID_1);
  505. valid[2] = DISP_REG_GET(DISP_REG_CONFIG_DISP_DL_VALID_2);
  506. ready[0] = DISP_REG_GET(DISP_REG_CONFIG_DISP_DL_READY_0);
  507. ready[1] = DISP_REG_GET(DISP_REG_CONFIG_DISP_DL_READY_1);
  508. ready[2] = DISP_REG_GET(DISP_REG_CONFIG_DISP_DL_READY_2);
  509. greq = DISP_REG_GET(DISP_REG_CONFIG_SMI_LARB0_GREQ);
  510. DDPDUMP("== DISP MMSYS_CONFIG ANALYSIS ==\n");
  511. #if 0 /* TODO: mmsys clk?? */
  512. DDPDUMP("mmsys clock=0x%x, CG_CON0=0x%x, CG_CON1=0x%x\n",
  513. DISP_REG_GET(DISP_REG_CLK_CFG_0_MM_CLK),
  514. DISP_REG_GET(DISP_REG_CONFIG_MMSYS_CG_CON0),
  515. DISP_REG_GET(DISP_REG_CONFIG_MMSYS_CG_CON1));
  516. if ((DISP_REG_GET(DISP_REG_CLK_CFG_0_MM_CLK) >> 31) & 0x1)
  517. DDPERR("mmsys clock abnormal!!\n");
  518. #endif
  519. reg = DISP_REG_GET(DISP_REG_CONFIG_MMSYS_CG_CON0);
  520. for (i = 0; i < 32; i++) {
  521. if ((reg & (1 << i)) == 0) {
  522. name = ddp_clock_0(i);
  523. if (name)
  524. strncat(clock_on, name, sizeof(clock_on));
  525. }
  526. }
  527. reg = DISP_REG_GET(DISP_REG_CONFIG_MMSYS_CG_CON1);
  528. for (i = 0; i < 32; i++) {
  529. if ((reg & (1 << i)) == 0) {
  530. name = ddp_clock_1(i);
  531. if (name)
  532. strncat(clock_on, name, sizeof(clock_on));
  533. }
  534. }
  535. DDPDUMP("clock on modules:%s\n", clock_on);
  536. DDPDUMP("valid0=0x%x,valid1=0x%x,valid2=0x%x,ready0=0x%x,ready1=0x%x,ready2=0x%x,greq=0%x\n",
  537. valid[0], valid[1], valid[2], ready[0], ready[1], ready[2], greq);
  538. for (j = 0; j < ARRAY_SIZE(valid); j++) {
  539. for (i = 0; i < 32; i++) {
  540. name = ddp_signal[j][i];
  541. if (!name)
  542. continue;
  543. pos = clock_on;
  544. if ((valid[j] & (1 << i)))
  545. pos += snprintf(pos, sizeof(clock_on), "%s,", "v");
  546. else
  547. pos += snprintf(pos, sizeof(clock_on), "%s,", "n");
  548. if ((ready[j] & (1 << i)))
  549. pos += snprintf(pos, sizeof(clock_on), "%s", "r");
  550. else
  551. pos += snprintf(pos, sizeof(clock_on), "%s", "n");
  552. pos += snprintf(pos, sizeof(clock_on), ": %s", name);
  553. DDPDUMP("%s\n", clock_on);
  554. }
  555. }
  556. /* greq: 1 means SMI dose not grant, maybe SMI hang */
  557. if (greq)
  558. DDPDUMP("smi greq not grant module: (greq: 1 means SMI dose not grant, maybe SMI hang)");
  559. clock_on[0] = '\0';
  560. for (i = 0; i < 32; i++) {
  561. if (greq & (1 << i)) {
  562. name = ddp_greq_name(i);
  563. if (!name)
  564. continue;
  565. strncat(clock_on, name, sizeof(clock_on));
  566. }
  567. }
  568. DDPDUMP("%s\n", clock_on);
  569. }
  570. static void gamma_dump_reg(void)
  571. {
  572. DDPDUMP("== DISP GAMMA REGS ==\n");
  573. DDPDUMP("(0x000)GA_EN=0x%x\n", DISP_REG_GET(DISP_REG_GAMMA_EN));
  574. DDPDUMP("(0x004)GA_RESET=0x%x\n", DISP_REG_GET(DISP_REG_GAMMA_RESET));
  575. DDPDUMP("(0x008)GA_INTEN=0x%x\n", DISP_REG_GET(DISP_REG_GAMMA_INTEN));
  576. DDPDUMP("(0x00c)GA_INTSTA=0x%x\n", DISP_REG_GET(DISP_REG_GAMMA_INTSTA));
  577. DDPDUMP("(0x010)GA_STATUS=0x%x\n", DISP_REG_GET(DISP_REG_GAMMA_STATUS));
  578. DDPDUMP("(0x020)GA_CFG=0x%x\n", DISP_REG_GET(DISP_REG_GAMMA_CFG));
  579. DDPDUMP("(0x024)GA_IN_COUNT=0x%x\n", DISP_REG_GET(DISP_REG_GAMMA_INPUT_COUNT));
  580. DDPDUMP("(0x028)GA_OUT_COUNT=0x%x\n", DISP_REG_GET(DISP_REG_GAMMA_OUTPUT_COUNT));
  581. DDPDUMP("(0x02c)GA_CHKSUM=0x%x\n", DISP_REG_GET(DISP_REG_GAMMA_CHKSUM));
  582. DDPDUMP("(0x030)GA_SIZE=0x%x\n", DISP_REG_GET(DISP_REG_GAMMA_SIZE));
  583. DDPDUMP("(0x0c0)GA_DUMMY_REG=0x%x\n", DISP_REG_GET(DISP_REG_GAMMA_DUMMY_REG));
  584. DDPDUMP("(0x800)GA_LUT=0x%x\n", DISP_REG_GET(DISP_REG_GAMMA_LUT));
  585. }
  586. static void gamma_dump_analysis(void)
  587. {
  588. DDPDUMP("== DISP GAMMA ANALYSIS ==\n");
  589. 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",
  590. DISP_REG_GET(DISP_REG_GAMMA_EN),
  591. (DISP_REG_GET(DISP_REG_GAMMA_SIZE) >> 16) & 0x1fff,
  592. DISP_REG_GET(DISP_REG_GAMMA_SIZE) & 0x1fff,
  593. DISP_REG_GET(DISP_REG_GAMMA_INPUT_COUNT) & 0x1fff,
  594. (DISP_REG_GET(DISP_REG_GAMMA_INPUT_COUNT) >> 16) & 0x1fff,
  595. DISP_REG_GET(DISP_REG_GAMMA_OUTPUT_COUNT) & 0x1fff,
  596. (DISP_REG_GET(DISP_REG_GAMMA_OUTPUT_COUNT) >> 16) & 0x1fff);
  597. }
  598. static void color_dump_reg(DISP_MODULE_ENUM module)
  599. {
  600. int index = 0;
  601. if (DISP_MODULE_COLOR0 == module) {
  602. index = 0;
  603. } else if (DISP_MODULE_COLOR1 == module) {
  604. DDPDUMP("error: DISP COLOR%d dose not exist!\n", index);
  605. return;
  606. }
  607. DDPDUMP("== DISP COLOR%d REGS ==\n", index);
  608. DDPDUMP("(0x400)COLOR_CFG_MAIN=0x%x\n", DISP_REG_GET(DISP_COLOR_CFG_MAIN));
  609. DDPDUMP("(0x404)COLOR_PXL_CNT_MAIN=0x%x\n", DISP_REG_GET(DISP_COLOR_PXL_CNT_MAIN));
  610. DDPDUMP("(0x408)COLOR_LINE_CNT_MAIN=0x%x\n", DISP_REG_GET(DISP_COLOR_LINE_CNT_MAIN));
  611. DDPDUMP("(0xc00)COLOR_START=0x%x\n", DISP_REG_GET(DISP_COLOR_START));
  612. DDPDUMP("(0xc28)DISP_COLOR_CK_ON=0x%x\n", DISP_REG_GET(DISP_COLOR_CK_ON));
  613. DDPDUMP("(0xc50)COLOR_INTER_IP_W=0x%x\n", DISP_REG_GET(DISP_COLOR_INTERNAL_IP_WIDTH));
  614. DDPDUMP("(0xc54)COLOR_INTER_IP_H=0x%x\n", DISP_REG_GET(DISP_COLOR_INTERNAL_IP_HEIGHT));
  615. return;
  616. }
  617. static void color_dump_analysis(DISP_MODULE_ENUM module)
  618. {
  619. int index = 0;
  620. if (DISP_MODULE_COLOR0 == module) {
  621. index = 0;
  622. } else if (DISP_MODULE_COLOR1 == module) {
  623. DDPDUMP("error: DISP COLOR%d dose not exist!\n", index);
  624. return;
  625. }
  626. DDPDUMP("== DISP COLOR%d ANALYSIS ==\n", index);
  627. DDPDUMP("color%d: bypass=%d, w=%d, h=%d, pixel_cnt=%d, line_cnt=%d,\n",
  628. index,
  629. (DISP_REG_GET(DISP_COLOR_CFG_MAIN) >> 7) & 0x1,
  630. DISP_REG_GET(DISP_COLOR_INTERNAL_IP_WIDTH),
  631. DISP_REG_GET(DISP_COLOR_INTERNAL_IP_HEIGHT),
  632. DISP_REG_GET(DISP_COLOR_PXL_CNT_MAIN) & 0xffff,
  633. (DISP_REG_GET(DISP_COLOR_LINE_CNT_MAIN) >> 16) & 0x1fff);
  634. return;
  635. }
  636. static void aal_dump_reg(void)
  637. {
  638. DDPDUMP("== DISP AAL REGS ==\n");
  639. DDPDUMP("(0x000)AAL_EN=0x%x\n", DISP_REG_GET(DISP_AAL_EN));
  640. DDPDUMP("(0x008)AAL_INTEN=0x%x\n", DISP_REG_GET(DISP_AAL_INTEN));
  641. DDPDUMP("(0x00c)AAL_INTSTA=0x%x\n", DISP_REG_GET(DISP_AAL_INTSTA));
  642. DDPDUMP("(0x020)AAL_CFG=0x%x\n", DISP_REG_GET(DISP_AAL_CFG));
  643. DDPDUMP("(0x024)AAL_IN_CNT=0x%x\n", DISP_REG_GET(DISP_AAL_IN_CNT));
  644. DDPDUMP("(0x028)AAL_OUT_CNT=0x%x\n", DISP_REG_GET(DISP_AAL_OUT_CNT));
  645. DDPDUMP("(0x030)AAL_SIZE=0x%x\n", DISP_REG_GET(DISP_AAL_SIZE));
  646. DDPDUMP("(0x20c)AAL_CABC_00=0x%x\n", DISP_REG_GET(DISP_AAL_CABC_00));
  647. DDPDUMP("(0x214)AAL_CABC_02=0x%x\n", DISP_REG_GET(DISP_AAL_CABC_02));
  648. DDPDUMP("(0x20c)AAL_STATUS_00=0x%x\n", DISP_REG_GET(DISP_AAL_STATUS_00));
  649. DDPDUMP("(0x210)AAL_STATUS_01=0x%x\n", DISP_REG_GET(DISP_AAL_STATUS_00 + 0x4));
  650. DDPDUMP("(0x2a0)AAL_STATUS_31=0x%x\n", DISP_REG_GET(DISP_AAL_STATUS_32 - 0x4));
  651. DDPDUMP("(0x2a4)AAL_STATUS_32=0x%x\n", DISP_REG_GET(DISP_AAL_STATUS_32));
  652. DDPDUMP("(0x3b0)AAL_DRE_MAPPING_00=0x%x\n", DISP_REG_GET(DISP_AAL_DRE_MAPPING_00));
  653. return;
  654. }
  655. static void aal_dump_analysis(void)
  656. {
  657. DDPDUMP("== DISP AAL ANALYSIS ==\n");
  658. DDPDUMP("aal: bypass=%d, relay=%d, en=%d, w=%d, h=%d, in(%d,%d),out(%d,%d)\n",
  659. DISP_REG_GET(DISP_AAL_EN) == 0x0,
  660. DISP_REG_GET(DISP_AAL_CFG) & 0x01,
  661. DISP_REG_GET(DISP_AAL_EN),
  662. (DISP_REG_GET(DISP_AAL_SIZE) >> 16) & 0x1fff,
  663. DISP_REG_GET(DISP_AAL_SIZE) & 0x1fff,
  664. DISP_REG_GET(DISP_AAL_IN_CNT) & 0x1fff,
  665. (DISP_REG_GET(DISP_AAL_IN_CNT) >> 16) & 0x1fff,
  666. DISP_REG_GET(DISP_AAL_OUT_CNT) & 0x1fff,
  667. (DISP_REG_GET(DISP_AAL_OUT_CNT) >> 16) & 0x1fff);
  668. }
  669. static void pwm_dump_reg(DISP_MODULE_ENUM module)
  670. {
  671. int index = 0;
  672. unsigned long 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 REGS ==\n", index);
  681. DDPDUMP("(0x000)PWM_EN=0x%x\n", DISP_REG_GET(reg_base + DISP_PWM_EN_OFF));
  682. DDPDUMP("(0x008)PWM_CON_0=0x%x\n", DISP_REG_GET(reg_base + DISP_PWM_CON_0_OFF));
  683. DDPDUMP("(0x010)PWM_CON_1=0x%x\n", DISP_REG_GET(reg_base + DISP_PWM_CON_1_OFF));
  684. DDPDUMP("(0x028)PWM_DEBUG=0x%x\n", DISP_REG_GET(reg_base + 0x28));
  685. return;
  686. }
  687. static void pwm_dump_analysis(DISP_MODULE_ENUM module)
  688. {
  689. int index = 0;
  690. unsigned int reg_base = 0;
  691. if (module == DISP_MODULE_PWM0) {
  692. index = 0;
  693. reg_base = DISPSYS_PWM0_BASE;
  694. } else {
  695. index = 1;
  696. reg_base = DISPSYS_PWM0_BASE;
  697. }
  698. DDPDUMP("== DISP PWM%d ANALYSIS ==\n", index);
  699. #if 0 /* TODO: clk reg?? */
  700. DDPDUMP("pwm clock=%d\n", (DISP_REG_GET(DISP_REG_CLK_CFG_1_CLR) >> 7) & 0x1);
  701. #endif
  702. return;
  703. }
  704. static void od_dump_reg(void)
  705. {
  706. DDPDUMP("== DISP OD REGS ==\n");
  707. DDPDUMP("(00)EN=0x%x\n", DISP_REG_GET(DISP_REG_OD_EN));
  708. DDPDUMP("(04)RESET=0x%x\n", DISP_REG_GET(DISP_REG_OD_RESET));
  709. DDPDUMP("(08)INTEN=0x%x\n", DISP_REG_GET(DISP_REG_OD_INTEN));
  710. DDPDUMP("(0C)INTSTA=0x%x\n", DISP_REG_GET(DISP_REG_OD_INTSTA));
  711. DDPDUMP("(10)STATUS=0x%x\n", DISP_REG_GET(DISP_REG_OD_STATUS));
  712. DDPDUMP("(20)CFG=0x%x\n", DISP_REG_GET(DISP_REG_OD_CFG));
  713. DDPDUMP("(24)INPUT_COUNT=0x%x\n", DISP_REG_GET(DISP_REG_OD_INPUT_COUNT));
  714. DDPDUMP("(28)OUTPUT_COUNT=0x%x\n", DISP_REG_GET(DISP_REG_OD_OUTPUT_COUNT));
  715. DDPDUMP("(2C)CHKSUM=0x%x\n", DISP_REG_GET(DISP_REG_OD_CHKSUM));
  716. DDPDUMP("(30)SIZE=0x%x\n", DISP_REG_GET(DISP_REG_OD_SIZE));
  717. DDPDUMP("(40)HSYNC_WIDTH=0x%x\n", DISP_REG_GET(DISP_REG_OD_HSYNC_WIDTH));
  718. DDPDUMP("(44)VSYNC_WIDTH=0x%x\n", DISP_REG_GET(DISP_REG_OD_VSYNC_WIDTH));
  719. DDPDUMP("(48)MISC=0x%x\n", DISP_REG_GET(DISP_REG_OD_MISC));
  720. DDPDUMP("(C0)DUMMY_REG=0x%x\n", DISP_REG_GET(DISP_REG_OD_DUMMY_REG));
  721. return;
  722. }
  723. static void od_dump_analysis(void)
  724. {
  725. DDPDUMP("== DISP OD ANALYSIS ==\n");
  726. DDPDUMP("od: w=%d, h=%d, bypass=%d\n",
  727. (DISP_REG_GET(DISP_REG_OD_SIZE) >> 16) & 0xffff,
  728. DISP_REG_GET(DISP_REG_OD_SIZE) & 0xffff, DISP_REG_GET(DISP_REG_OD_CFG) & 0x1);
  729. return;
  730. }
  731. static void ccorr_dump_reg(void)
  732. {
  733. DDPDUMP("== DISP CCORR REGS ==\n");
  734. DDPDUMP("(00)EN=0x%x\n", DISP_REG_GET(DISP_REG_CCORR_EN));
  735. DDPDUMP("(20)CFG=0x%x\n", DISP_REG_GET(DISP_REG_CCORR_CFG));
  736. DDPDUMP("(24)IN_CNT=0x%x\n", DISP_REG_GET(DISP_REG_CCORR_IN_CNT));
  737. DDPDUMP("(28)OUT_CNT=0x%x\n", DISP_REG_GET(DISP_REG_CCORR_OUT_CNT));
  738. DDPDUMP("(30)SIZE=0x%x\n", DISP_REG_GET(DISP_REG_CCORR_SIZE));
  739. }
  740. static void ccorr_dump_analyze(void)
  741. {
  742. 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",
  743. DISP_REG_GET(DISP_REG_CCORR_EN), DISP_REG_GET(DISP_REG_CCORR_CFG),
  744. (DISP_REG_GET(DISP_REG_CCORR_SIZE) >> 16) & 0x1fff,
  745. DISP_REG_GET(DISP_REG_CCORR_SIZE) & 0x1fff,
  746. DISP_REG_GET(DISP_REG_CCORR_IN_CNT) & 0x1fff,
  747. (DISP_REG_GET(DISP_REG_CCORR_IN_CNT) >> 16) & 0x1fff,
  748. DISP_REG_GET(DISP_REG_CCORR_IN_CNT) & 0x1fff,
  749. (DISP_REG_GET(DISP_REG_CCORR_IN_CNT) >> 16) & 0x1fff);
  750. }
  751. static void dither_dump_reg(void)
  752. {
  753. DDPDUMP("== DISP DITHER REGS ==\n");
  754. DDPDUMP("(00)EN=0x%x\n", DISP_REG_GET(DISP_REG_DITHER_EN));
  755. DDPDUMP("(20)CFG=0x%x\n", DISP_REG_GET(DISP_REG_DITHER_CFG));
  756. DDPDUMP("(24)IN_CNT=0x%x\n", DISP_REG_GET(DISP_REG_DITHER_IN_CNT));
  757. DDPDUMP("(28)OUT_CNT=0x%x\n", DISP_REG_GET(DISP_REG_DITHER_OUT_CNT));
  758. DDPDUMP("(30)SIZE=0x%x\n", DISP_REG_GET(DISP_REG_DITHER_SIZE));
  759. }
  760. static void dither_dump_analyze(void)
  761. {
  762. 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",
  763. DISP_REG_GET(DISPSYS_DITHER_BASE + 0x000), DISP_REG_GET(DISPSYS_DITHER_BASE + 0x020),
  764. (DISP_REG_GET(DISP_REG_DITHER_SIZE) >> 16) & 0x1fff,
  765. DISP_REG_GET(DISP_REG_DITHER_SIZE) & 0x1fff,
  766. DISP_REG_GET(DISP_REG_DITHER_IN_CNT) & 0x1fff,
  767. (DISP_REG_GET(DISP_REG_DITHER_IN_CNT) >> 16) & 0x1fff,
  768. DISP_REG_GET(DISP_REG_DITHER_OUT_CNT) & 0x1fff,
  769. (DISP_REG_GET(DISP_REG_DITHER_OUT_CNT) >> 16) & 0x1fff);
  770. }
  771. static void ufoe_dump(void)
  772. {
  773. DDPDUMP("== DISP UFOE REGS ==\n");
  774. DDPDUMP("(0x000)UFOE_START=0x%x\n", DISP_REG_GET(DISP_REG_UFO_START));
  775. DDPDUMP("(0x020)UFOE_PAD=0x%x\n", DISP_REG_GET(DISP_REG_UFO_CR0P6_PAD));
  776. DDPDUMP("(0x050)UFOE_WIDTH=0x%x\n", DISP_REG_GET(DISP_REG_UFO_FRAME_WIDTH));
  777. DDPDUMP("(0x054)UFOE_HEIGHT=0x%x\n", DISP_REG_GET(DISP_REG_UFO_FRAME_HEIGHT));
  778. DDPDUMP("(0x100)UFOE_CFG0=0x%x\n", DISP_REG_GET(DISP_REG_UFO_CFG_0B));
  779. DDPDUMP("(0x104)UFOE_CFG1=0x%x\n", DISP_REG_GET(DISP_REG_UFO_CFG_1B));
  780. }
  781. static void dsc_dump(void)
  782. {
  783. #if 0
  784. u32 i = 0;
  785. DDPDUMP("== DISP DSC REGS ==\n");
  786. DDPDUMP("(0x000)DSC_START=0x%x\n", DISP_REG_GET(DISP_REG_DSC_CON));
  787. DDPDUMP("(0x000)DSC_SLICE_WIDTH=0x%x\n", DISP_REG_GET(DISP_REG_DSC_SLICE_W));
  788. DDPDUMP("(0x000)DSC_SLICE_HIGHT=0x%x\n", DISP_REG_GET(DISP_REG_DSC_SLICE_H));
  789. DDPDUMP("(0x000)DSC_WIDTH=0x%x\n", DISP_REG_GET(DISP_REG_DSC_PIC_W));
  790. DDPDUMP("(0x000)DSC_HEIGHT=0x%x\n", DISP_REG_GET(DISP_REG_DSC_PIC_H));
  791. DDPDUMP("-- Start dump dsc registers --\n");
  792. for (i = 0; i < 204; i += 16) {
  793. DDPDUMP("DSC+%x: 0x%x 0x%x 0x%x 0x%x\n", i, DISP_REG_GET(DISPSYS_DSC_BASE + i),
  794. DISP_REG_GET(DISPSYS_DSC_BASE + i + 0x4), DISP_REG_GET(DISPSYS_DSC_BASE + i + 0x8),
  795. DISP_REG_GET(DISPSYS_DSC_BASE + i + 0xc));
  796. }
  797. #endif
  798. }
  799. static void dsi_dump_reg(DISP_MODULE_ENUM module)
  800. {
  801. DSI_DumpRegisters(module, 1);
  802. #if 0
  803. if (DISP_MODULE_DSI0) {
  804. int i = 0;
  805. DDPDUMP("== DISP DSI0 REGS ==\n");
  806. for (i = 0; i < 25 * 16; i += 16) {
  807. DDPDUMP("DSI0+%04x: 0x%08x 0x%08x 0x%08x 0x%08x\n", i,
  808. INREG32(DISPSYS_DSI0_BASE + i), INREG32(DISPSYS_DSI0_BASE + i + 0x4),
  809. INREG32(DISPSYS_DSI0_BASE + i + 0x8),
  810. INREG32(DISPSYS_DSI0_BASE + i + 0xc));
  811. }
  812. DDPDUMP("DSI0 CMDQ+0x200: 0x%08x 0x%08x 0x%08x 0x%08x\n",
  813. INREG32(DISPSYS_DSI0_BASE + 0x200), INREG32(DISPSYS_DSI0_BASE + 0x200 + 0x4),
  814. INREG32(DISPSYS_DSI0_BASE + 0x200 + 0x8),
  815. INREG32(DISPSYS_DSI0_BASE + 0x200 + 0xc));
  816. }
  817. #endif
  818. }
  819. static void dpi_dump_reg(void)
  820. {
  821. int i;
  822. DDPDUMP("-- Start dump DPI registers --\n");
  823. for (i = 0; i <= 0x40; i += 4)
  824. DDPDUMP("DPI+%04x: 0x%08x\n", i, INREG32(DISPSYS_DPI_BASE + i));
  825. for (i = 0x68; i <= 0x7C; i += 4)
  826. DDPDUMP("DPI+%04x: 0x%08x\n", i, INREG32(DISPSYS_DPI_BASE + i));
  827. DDPDUMP("DPI+Color Bar : 0x%04x : 0x%08x\n", 0xF00, INREG32(DISPSYS_DPI_BASE + 0xF00));
  828. DDPDUMP("DPI MMSYS_CG_CON0: 0x%08x\n", INREG32(DISP_REG_CONFIG_MMSYS_CG_CON0));
  829. DDPDUMP("DPI MMSYS_CG_CON1: 0x%08x\n", INREG32(DISP_REG_CONFIG_MMSYS_CG_CON1));
  830. }
  831. static void dpi_dump_analysis(void)
  832. {
  833. #if 0
  834. DDPDUMP("== DISP DPI ANALYSIS ==\n");
  835. /* TODO: mmsys clk?? */
  836. DDPDUMP("DPI clock=0x%x\n", DISP_REG_GET(DISP_REG_CLK_CFG_6_DPI));
  837. DDPDUMP("DPI clock_clear=%d\n", (DISP_REG_GET(DISP_REG_CLK_CFG_6_CLR) >> 7) & 0x1);
  838. #endif
  839. }
  840. static int split_dump_regs(void)
  841. {
  842. DDPDUMP("== DISP SPLIT0 REGS ==\n");
  843. DDPDUMP("(0x000)S_ENABLE=0x%x\n", DISP_REG_GET(DISP_REG_SPLIT_ENABLE));
  844. DDPDUMP("(0x004)S_SW_RST=0x%x\n", DISP_REG_GET(DISP_REG_SPLIT_SW_RESET));
  845. DDPDUMP("(0x008)S_DEBUG=0x%x\n", DISP_REG_GET(DISP_REG_SPLIT_DEBUG));
  846. return 0;
  847. }
  848. static char *split_state(unsigned int state)
  849. {
  850. switch (state) {
  851. case 1:
  852. return "idle";
  853. case 2:
  854. return "wait";
  855. case 4:
  856. return "busy";
  857. default:
  858. return "unknown";
  859. }
  860. return "unknown";
  861. }
  862. static int split_dump_analysis(void)
  863. {
  864. unsigned int pixel = DISP_REG_GET_FIELD(DEBUG_FLD_IN_PIXEL_CNT, DISP_REG_SPLIT_DEBUG);
  865. unsigned int state = DISP_REG_GET_FIELD(DEBUG_FLD_SPLIT_FSM, DISP_REG_SPLIT_DEBUG);
  866. DDPDUMP("== DISP SPLIT0 ANALYSIS ==\n");
  867. DDPDUMP("cur_pixel %u, state %s\n", pixel, split_state(state));
  868. return 0;
  869. }
  870. int ddp_dump_reg(DISP_MODULE_ENUM module)
  871. {
  872. switch (module) {
  873. case DISP_MODULE_WDMA0:
  874. //wdma_dump_reg(module);
  875. break;
  876. case DISP_MODULE_RDMA0:
  877. case DISP_MODULE_RDMA1:
  878. case DISP_MODULE_RDMA2:
  879. RDMADump(module);
  880. break;
  881. case DISP_MODULE_OVL0:
  882. case DISP_MODULE_OVL1:
  883. case DISP_MODULE_OVL0_2L:
  884. case DISP_MODULE_OVL1_2L:
  885. OVLDump(module);
  886. break;
  887. case DISP_MODULE_GAMMA0:
  888. gamma_dump_reg();
  889. break;
  890. case DISP_MODULE_CONFIG:
  891. mmsys_config_dump_reg();
  892. break;
  893. case DISP_MODULE_MUTEX:
  894. mutex_dump_reg();
  895. break;
  896. case DISP_MODULE_SPLIT0:
  897. split_dump_regs();
  898. break;
  899. case DISP_MODULE_COLOR0:
  900. case DISP_MODULE_COLOR1:
  901. color_dump_reg(module);
  902. break;
  903. case DISP_MODULE_AAL0:
  904. aal_dump_reg();
  905. break;
  906. case DISP_MODULE_PWM0:
  907. pwm_dump_reg(module);
  908. break;
  909. case DISP_MODULE_OD:
  910. od_dump_reg();
  911. break;
  912. case DISP_MODULE_DSI0:
  913. case DISP_MODULE_DSI1:
  914. case DISP_MODULE_DSIDUAL:
  915. dsi_dump_reg(module);
  916. break;
  917. case DISP_MODULE_DPI:
  918. dpi_dump_reg();
  919. break;
  920. case DISP_MODULE_CCORR0:
  921. ccorr_dump_reg();
  922. break;
  923. case DISP_MODULE_DITHER0:
  924. dither_dump_reg();
  925. break;
  926. case DISP_MODULE_UFOE:
  927. ufoe_dump();
  928. break;
  929. case DISP_MODULE_DSC:
  930. dsc_dump();
  931. break;
  932. default:
  933. DDPDUMP("no dump_reg for module %s(%d)\n", ddp_get_module_name(module), module);
  934. }
  935. return 0;
  936. }
  937. int ddp_dump_analysis(DISP_MODULE_ENUM module)
  938. {
  939. switch (module) {
  940. case DISP_MODULE_WDMA0:
  941. //wdma_dump_analysis(module);
  942. break;
  943. case DISP_MODULE_RDMA0:
  944. case DISP_MODULE_RDMA1:
  945. case DISP_MODULE_RDMA2:
  946. rdma_dump_analysis(module);
  947. break;
  948. case DISP_MODULE_OVL0:
  949. case DISP_MODULE_OVL1:
  950. case DISP_MODULE_OVL0_2L:
  951. case DISP_MODULE_OVL1_2L:
  952. ovl_dump_analysis(module);
  953. break;
  954. case DISP_MODULE_GAMMA0:
  955. gamma_dump_analysis();
  956. break;
  957. case DISP_MODULE_CONFIG:
  958. mmsys_config_dump_analysis();
  959. break;
  960. case DISP_MODULE_MUTEX:
  961. mutex_dump_analysis();
  962. break;
  963. case DISP_MODULE_SPLIT0:
  964. split_dump_analysis();
  965. break;
  966. case DISP_MODULE_COLOR0:
  967. case DISP_MODULE_COLOR1:
  968. color_dump_analysis(module);
  969. break;
  970. case DISP_MODULE_AAL0:
  971. aal_dump_analysis();
  972. break;
  973. case DISP_MODULE_OD:
  974. od_dump_analysis();
  975. break;
  976. case DISP_MODULE_PWM0:
  977. pwm_dump_analysis(module);
  978. break;
  979. case DISP_MODULE_DSI0:
  980. case DISP_MODULE_DSI1:
  981. case DISP_MODULE_DSIDUAL:
  982. dsi_analysis(module);
  983. break;
  984. case DISP_MODULE_DPI:
  985. dpi_dump_analysis();
  986. break;
  987. case DISP_MODULE_CCORR0:
  988. ccorr_dump_analyze();
  989. break;
  990. case DISP_MODULE_DITHER0:
  991. dither_dump_analyze();
  992. break;
  993. default:
  994. DDPDUMP("no dump_analysis for module %s(%d)\n", ddp_get_module_name(module),
  995. module);
  996. }
  997. return 0;
  998. }