ddp_debug.c 30 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091
  1. #define LOG_TAG "DEBUG"
  2. #include <linux/string.h>
  3. #include <linux/uaccess.h>
  4. #include <linux/debugfs.h>
  5. #include <mt-plat/aee.h>
  6. #include "disp_assert_layer.h"
  7. #include <linux/dma-mapping.h>
  8. #include <linux/delay.h>
  9. #include <linux/sched.h>
  10. #include <linux/interrupt.h>
  11. #include <linux/time.h>
  12. #include "m4u.h"
  13. #include "cmdq_def.h"
  14. #include "cmdq_record.h"
  15. #include "cmdq_reg.h"
  16. #include "cmdq_core.h"
  17. #include "disp_drv_ddp.h"
  18. #include "ddp_debug.h"
  19. #include "ddp_reg.h"
  20. #include "ddp_drv.h"
  21. #include "ddp_wdma.h"
  22. #include "ddp_wdma_ex.h"
  23. #include "ddp_hal.h"
  24. #include "ddp_path.h"
  25. #include "ddp_aal.h"
  26. #include "ddp_pwm.h"
  27. #include "ddp_info.h"
  28. #include "ddp_dsi.h"
  29. #include "ddp_ovl.h"
  30. #include "ddp_manager.h"
  31. #include "ddp_log.h"
  32. #include "ddp_met.h"
  33. #include "display_recorder.h"
  34. #include "disp_session.h"
  35. #include "primary_display.h"
  36. #include "ddp_irq.h"
  37. #include "mtk_disp_mgr.h"
  38. #include "disp_drv_platform.h"
  39. #pragma GCC optimize("O0")
  40. #ifndef DISP_NO_AEE
  41. #define ddp_aee_print(string, args...) do { \
  42. char ddp_name[100]; \
  43. snprintf(ddp_name, 100, "[DDP]"string, ##args); \
  44. aee_kernel_warning_api(__FILE__, __LINE__, DB_OPT_MMPROFILE_BUFFER, \
  45. ddp_name, "[DDP] error"string, ##args); \
  46. pr_err("DDP " "error: "string, ##args); \
  47. } while (0)
  48. #else
  49. #define ddp_aee_print(string, args...) pr_err("DDP " "error: "string, ##args)
  50. #endif
  51. /* --------------------------------------------------------------------------- */
  52. /* External variable declarations */
  53. /* --------------------------------------------------------------------------- */
  54. /* --------------------------------------------------------------------------- */
  55. /* Debug Options */
  56. /* --------------------------------------------------------------------------- */
  57. static struct dentry *debugfs;
  58. static struct dentry *debugDir;
  59. static struct dentry *debugfs_dump;
  60. static const long int DEFAULT_LOG_FPS_WND_SIZE = 30;
  61. static int debug_init;
  62. unsigned char pq_debug_flag = 0;
  63. unsigned char aal_debug_flag = 0;
  64. static unsigned int dbg_log_level;
  65. static unsigned int irq_log_level;
  66. static unsigned int dump_to_buffer;
  67. unsigned int gOVLBackground = 0x0;
  68. unsigned int gUltraEnable = 1;
  69. unsigned int gDumpMemoutCmdq = 0;
  70. unsigned int gEnableUnderflowAEE = 0;
  71. unsigned int disp_low_power_enlarge_blanking = 0;
  72. unsigned int disp_low_power_disable_ddp_clock = 0;
  73. unsigned int disp_low_power_disable_fence_thread = 0;
  74. unsigned int disp_low_power_remove_ovl = 1;
  75. unsigned int gSkipIdleDetect = 0;
  76. unsigned int gDumpClockStatus = 1;
  77. #ifdef DISP_ENABLE_SODI_FOR_VIDEO_MODE
  78. unsigned int gEnableSODIControl = 1;
  79. /* workaround for SVP IT, todo: please K fix it */
  80. #if defined(CONFIG_TRUSTONIC_TEE_SUPPORT) && defined(CONFIG_MTK_SEC_VIDEO_PATH_SUPPORT)
  81. unsigned int gPrefetchControl = 0;
  82. #else
  83. unsigned int gPrefetchControl = 1;
  84. #endif
  85. #else
  86. unsigned int gEnableSODIControl = 0;
  87. unsigned int gPrefetchControl = 0;
  88. #endif
  89. /* enable it when use UART to grab log */
  90. unsigned int gEnableUartLog = 0;
  91. /* mutex SOF at raing edge of vsync, can save more time for cmdq config */
  92. unsigned int gEnableMutexRisingEdge = 0;
  93. /* only write dirty register, reduce register number write by cmdq */
  94. unsigned int gEnableReduceRegWrite = 0;
  95. unsigned int gDumpConfigCMD = 0;
  96. unsigned int gDumpESDCMD = 0;
  97. unsigned int gESDEnableSODI = 1;
  98. unsigned int gEnableOVLStatusCheck = 0;
  99. unsigned int gEnableDSIStateCheck = 0;
  100. unsigned int gResetRDMAEnable = 1;
  101. unsigned int gEnableSWTrigger = 0;
  102. unsigned int gMutexFreeRun = 1;
  103. unsigned int gResetOVLInAALTrigger = 0;
  104. unsigned int gDisableOVLTF = 0;
  105. unsigned long int gRDMAUltraSetting = 0; /* so we can modify RDMA ultra at run-time */
  106. unsigned long int gRDMAFIFOLen = 32;
  107. #ifdef _MTK_USER_
  108. unsigned int gEnableIRQ = 0;
  109. /* #error eng_error */
  110. #else
  111. unsigned int gEnableIRQ = 1;
  112. /* #error user_error */
  113. #endif
  114. unsigned int gDisableSODIForTriggerLoop = 1;
  115. static char STR_HELP[] =
  116. "USAGE:\n"
  117. " echo [ACTION]>/d/dispsys\n"
  118. "ACTION:\n"
  119. " regr:addr\n :regr:0xf400c000\n"
  120. " regw:addr,value :regw:0xf400c000,0x1\n"
  121. " dbg_log:0|1|2 :0 off, 1 dbg, 2 all\n"
  122. " irq_log:0|1 :0 off, !0 on\n"
  123. " met_on:[0|1],[0|1],[0|1] :fist[0|1]on|off,other [0|1]direct|decouple\n"
  124. " backlight:level\n"
  125. " dump_aal:arg\n"
  126. " mmp\n"
  127. " dump_reg:moduleID\n" " dump_path:mutexID\n" " dpfd_ut1:channel\n";
  128. /* --------------------------------------------------------------------------- */
  129. /* Command Processor */
  130. /* --------------------------------------------------------------------------- */
  131. static char dbg_buf[2048];
  132. static unsigned int is_reg_addr_valid(unsigned int isVa, unsigned long addr)
  133. {
  134. unsigned int i = 0;
  135. for (i = 0; i < DISP_REG_NUM; i++) {
  136. if ((isVa == 1) && (addr >= dispsys_reg[i]) && (addr <= dispsys_reg[i] + 0x1000))
  137. break;
  138. if ((isVa == 0) && (addr >= ddp_reg_pa_base[i]) && (addr <= ddp_reg_pa_base[i] + 0x1000))
  139. break;
  140. }
  141. if (i < DISP_REG_NUM) {
  142. DDPMSG("addr valid, isVa=0x%x, addr=0x%lx, module=%s!\n", isVa, addr,
  143. ddp_get_reg_module_name(i));
  144. return 1;
  145. }
  146. DDPERR("is_reg_addr_valid return fail, isVa=0x%x, addr=0x%lx!\n", isVa, addr);
  147. return 0;
  148. }
  149. static void process_dbg_debug(const char *opt)
  150. {
  151. static disp_session_config config;
  152. unsigned long int enable = 0;
  153. char *p;
  154. char *buf = dbg_buf + strlen(dbg_buf);
  155. int ret;
  156. p = (char *)opt + 6;
  157. ret = kstrtoul(p, 10, &enable);
  158. if (ret)
  159. pr_err("DISP/%s: errno %d\n", __func__, ret);
  160. if (enable == 1) {
  161. DDPMSG("[DDP] debug=1, trigger AEE\n");
  162. /* aee_kernel_exception("DDP-TEST-ASSERT", "[DDP] DDP-TEST-ASSERT"); */
  163. } else if (enable == 2) {
  164. ddp_mem_test();
  165. } else if (enable == 3) {
  166. ddp_lcd_test();
  167. } else if (enable == 4) {
  168. DDPAEE("test enable=%d\n", (unsigned int)enable);
  169. sprintf(buf, "test enable=%d\n", (unsigned int)enable);
  170. } else if (enable == 5) {
  171. if (gDDPError == 0)
  172. gDDPError = 1;
  173. else
  174. gDDPError = 0;
  175. sprintf(buf, "bypass PQ: %d\n", gDDPError);
  176. DDPMSG("bypass PQ: %d\n", gDDPError);
  177. } else if (enable == 6) {
  178. unsigned int i = 0;
  179. int *modules = ddp_get_scenario_list(DDP_SCENARIO_PRIMARY_DISP);
  180. int module_num = ddp_get_module_num(DDP_SCENARIO_PRIMARY_DISP);
  181. pr_debug("dump path status:");
  182. for (i = 0; i < module_num; i++)
  183. pr_debug("%s-", ddp_get_module_name(modules[i]));
  184. pr_debug("\n");
  185. ddp_dump_analysis(DISP_MODULE_CONFIG);
  186. ddp_dump_analysis(DISP_MODULE_MUTEX);
  187. for (i = 0; i < module_num; i++)
  188. ddp_dump_analysis(modules[i]);
  189. if (primary_display_is_decouple_mode()) {
  190. ddp_dump_analysis(DISP_MODULE_OVL0);
  191. #if defined(OVL_CASCADE_SUPPORT)
  192. ddp_dump_analysis(DISP_MODULE_OVL1);
  193. #endif
  194. ddp_dump_analysis(DISP_MODULE_WDMA0);
  195. }
  196. ddp_dump_reg(DISP_MODULE_CONFIG);
  197. ddp_dump_reg(DISP_MODULE_MUTEX);
  198. if (primary_display_is_decouple_mode()) {
  199. ddp_dump_reg(DISP_MODULE_OVL0);
  200. ddp_dump_reg(DISP_MODULE_OVL1);
  201. ddp_dump_reg(DISP_MODULE_WDMA0);
  202. }
  203. for (i = 0; i < module_num; i++)
  204. ddp_dump_reg(modules[i]);
  205. } else if (enable == 7) {
  206. if (dbg_log_level < 3)
  207. dbg_log_level++;
  208. else
  209. dbg_log_level = 0;
  210. pr_debug("DDP: dbg_log_level=%d\n", dbg_log_level);
  211. sprintf(buf, "dbg_log_level: %d\n", dbg_log_level);
  212. } else if (enable == 8) {
  213. DDPDUMP("clock_mm setting:%u\n", DISP_REG_GET(DISP_REG_CONFIG_C11));
  214. if ((DISP_REG_GET(DISP_REG_CONFIG_C11) & 0xff000000) != 0xff000000)
  215. DDPDUMP("error, MM clock bit 24~bit31 should be 1, but real value=0x%x",
  216. DISP_REG_GET(DISP_REG_CONFIG_C11));
  217. } else if (enable == 9) {
  218. gOVLBackground = 0xFF0000FF;
  219. pr_debug("DDP: gOVLBackground=%d\n", gOVLBackground);
  220. sprintf(buf, "gOVLBackground: %d\n", gOVLBackground);
  221. } else if (enable == 10) {
  222. gOVLBackground = 0xFF000000;
  223. pr_debug("DDP: gOVLBackground=%d\n", gOVLBackground);
  224. sprintf(buf, "gOVLBackground: %d\n", gOVLBackground);
  225. } else if (enable == 11) {
  226. unsigned int i = 0;
  227. char *buf_temp = buf;
  228. for (i = 0; i < DISP_REG_NUM; i++) {
  229. DDPDUMP("i=%d, module=%s, va=0x%lx, pa=0x%x, irq(%d,%d)\n",
  230. i, ddp_get_reg_module_name(i), dispsys_reg[i],
  231. ddp_reg_pa_base[i], dispsys_irq[i], ddp_irq_num[i]);
  232. sprintf(buf_temp, "i=%d, module=%s, va=0x%lx, pa=0x%x, irq(%d,%d)\n", i,
  233. ddp_get_reg_module_name(i), dispsys_reg[i],
  234. ddp_reg_pa_base[i], dispsys_irq[i], ddp_irq_num[i]);
  235. buf_temp += strlen(buf_temp);
  236. }
  237. } else if (enable == 12) {
  238. if (gUltraEnable == 0)
  239. gUltraEnable = 1;
  240. else
  241. gUltraEnable = 0;
  242. pr_debug("DDP: gUltraEnable=%d\n", gUltraEnable);
  243. sprintf(buf, "gUltraEnable: %d\n", gUltraEnable);
  244. } else if (enable == 13) {
  245. int ovl_status = ovl_get_status();
  246. config.type = DISP_SESSION_MEMORY;
  247. config.device_id = 0;
  248. disp_create_session(&config);
  249. pr_debug("old status=%d, ovl1 status=%d\n", ovl_status, ovl_get_status());
  250. sprintf(buf, "old status=%d, ovl1 status=%d\n", ovl_status,
  251. ovl_get_status());
  252. } else if (enable == 14) {
  253. int ovl_status = ovl_get_status();
  254. disp_destroy_session(&config);
  255. pr_debug("old status=%d, ovl1 status=%d\n", ovl_status, ovl_get_status());
  256. sprintf(buf, "old status=%d, ovl1 status=%d\n", ovl_status,
  257. ovl_get_status());
  258. } else if (enable == 15) {
  259. /* extern smi_dumpDebugMsg(void); */
  260. ddp_dump_analysis(DISP_MODULE_CONFIG);
  261. ddp_dump_analysis(DISP_MODULE_RDMA0);
  262. ddp_dump_analysis(DISP_MODULE_OVL0);
  263. #if defined(OVL_CASCADE_SUPPORT)
  264. ddp_dump_analysis(DISP_MODULE_OVL1);
  265. #endif
  266. /* dump ultra/preultra related regs */
  267. DDPMSG("wdma_con1(2c)=0x%x, wdma_con2(0x38)=0x%x,\n",
  268. DISP_REG_GET(DISP_REG_WDMA_BUF_CON1),
  269. DISP_REG_GET(DISP_REG_WDMA_BUF_CON2));
  270. DDPMSG("rdma_gmc0(30)=0x%x, rdma_gmc1(38)=0x%x, fifo_con(40)=0x%x\n",
  271. DISP_REG_GET(DISP_REG_RDMA_MEM_GMC_SETTING_0),
  272. DISP_REG_GET(DISP_REG_RDMA_MEM_GMC_SETTING_1),
  273. DISP_REG_GET(DISP_REG_RDMA_FIFO_CON));
  274. DDPMSG("ovl0_gmc: 0x%x, 0x%x, 0x%x, 0x%x, ovl1_gmc: 0x%x, 0x%x, 0x%x, 0x%x,\n",
  275. DISP_REG_GET(DISP_REG_OVL_RDMA0_MEM_GMC_SETTING),
  276. DISP_REG_GET(DISP_REG_OVL_RDMA1_MEM_GMC_SETTING),
  277. DISP_REG_GET(DISP_REG_OVL_RDMA2_MEM_GMC_SETTING),
  278. DISP_REG_GET(DISP_REG_OVL_RDMA3_MEM_GMC_SETTING),
  279. DISP_REG_GET(DISP_REG_OVL_RDMA0_MEM_GMC_SETTING +
  280. DISP_OVL_INDEX_OFFSET),
  281. DISP_REG_GET(DISP_REG_OVL_RDMA1_MEM_GMC_SETTING +
  282. DISP_OVL_INDEX_OFFSET),
  283. DISP_REG_GET(DISP_REG_OVL_RDMA2_MEM_GMC_SETTING +
  284. DISP_OVL_INDEX_OFFSET),
  285. DISP_REG_GET(DISP_REG_OVL_RDMA3_MEM_GMC_SETTING +
  286. DISP_OVL_INDEX_OFFSET));
  287. /* dump smi regs */
  288. /* smi_dumpDebugMsg(); */
  289. } else if (enable == 16) {
  290. if (gDumpMemoutCmdq == 0)
  291. gDumpMemoutCmdq = 1;
  292. else
  293. gDumpMemoutCmdq = 0;
  294. pr_debug("DDP: gDumpMemoutCmdq=%d\n", gDumpMemoutCmdq);
  295. sprintf(buf, "gDumpMemoutCmdq: %d\n", gDumpMemoutCmdq);
  296. } else if (enable == 21) {
  297. if (gEnableSODIControl == 0)
  298. gEnableSODIControl = 1;
  299. else
  300. gEnableSODIControl = 0;
  301. pr_debug("DDP: gEnableSODIControl=%d\n", gEnableSODIControl);
  302. sprintf(buf, "gEnableSODIControl: %d\n", gEnableSODIControl);
  303. } else if (enable == 22) {
  304. if (gPrefetchControl == 0)
  305. gPrefetchControl = 1;
  306. else
  307. gPrefetchControl = 0;
  308. pr_debug("DDP: gPrefetchControl=%d\n", gPrefetchControl);
  309. sprintf(buf, "gPrefetchControl: %d\n", gPrefetchControl);
  310. } else if (enable == 23) {
  311. if (disp_low_power_enlarge_blanking == 0)
  312. disp_low_power_enlarge_blanking = 1;
  313. else
  314. disp_low_power_enlarge_blanking = 0;
  315. pr_debug("DDP: disp_low_power_enlarge_blanking=%d\n",
  316. disp_low_power_enlarge_blanking);
  317. sprintf(buf, "disp_low_power_enlarge_blanking: %d\n",
  318. disp_low_power_enlarge_blanking);
  319. } else if (enable == 24) {
  320. if (disp_low_power_disable_ddp_clock == 0)
  321. disp_low_power_disable_ddp_clock = 1;
  322. else
  323. disp_low_power_disable_ddp_clock = 0;
  324. pr_debug("DDP: disp_low_power_disable_ddp_clock=%d\n",
  325. disp_low_power_disable_ddp_clock);
  326. sprintf(buf, "disp_low_power_disable_ddp_clock: %d\n",
  327. disp_low_power_disable_ddp_clock);
  328. } else if (enable == 25) {
  329. if (disp_low_power_disable_fence_thread == 0)
  330. disp_low_power_disable_fence_thread = 1;
  331. else
  332. disp_low_power_disable_fence_thread = 0;
  333. pr_debug("DDP: disp_low_power_disable_fence_thread=%d\n",
  334. disp_low_power_disable_fence_thread);
  335. sprintf(buf, "disp_low_power_disable_fence_thread: %d\n",
  336. disp_low_power_disable_fence_thread);
  337. } else if (enable == 26) {
  338. if (disp_low_power_remove_ovl == 0)
  339. disp_low_power_remove_ovl = 1;
  340. else
  341. disp_low_power_remove_ovl = 0;
  342. pr_debug("DDP: disp_low_power_remove_ovl=%d\n", disp_low_power_remove_ovl);
  343. sprintf(buf, "disp_low_power_remove_ovl: %d\n", disp_low_power_remove_ovl);
  344. } else if (enable == 27) {
  345. if (gSkipIdleDetect == 0)
  346. gSkipIdleDetect = 1;
  347. else
  348. gSkipIdleDetect = 0;
  349. pr_debug("DDP: gSkipIdleDetect=%d\n", gSkipIdleDetect);
  350. sprintf(buf, "gSkipIdleDetect: %d\n", gSkipIdleDetect);
  351. } else if (enable == 28) {
  352. if (gDumpClockStatus == 0)
  353. gDumpClockStatus = 1;
  354. else
  355. gDumpClockStatus = 0;
  356. pr_debug("DDP: gDumpClockStatus=%d\n", gDumpClockStatus);
  357. sprintf(buf, "gDumpClockStatus: %d\n", gDumpClockStatus);
  358. } else if (enable == 29) {
  359. if (gEnableUartLog == 0)
  360. gEnableUartLog = 1;
  361. else
  362. gEnableUartLog = 0;
  363. pr_debug("DDP: gEnableUartLog=%d\n", gEnableUartLog);
  364. sprintf(buf, "gEnableUartLog: %d\n", gEnableUartLog);
  365. } else if (enable == 30) {
  366. if (gEnableMutexRisingEdge == 0) {
  367. gEnableMutexRisingEdge = 1;
  368. DISP_REG_SET_FIELD(0, SOF_FLD_MUTEX0_SOF_TIMING,
  369. DISP_REG_CONFIG_MUTEX0_SOF, 1);
  370. } else {
  371. gEnableMutexRisingEdge = 0;
  372. DISP_REG_SET_FIELD(0, SOF_FLD_MUTEX0_SOF_TIMING,
  373. DISP_REG_CONFIG_MUTEX0_SOF, 0);
  374. }
  375. pr_debug("DDP: gEnableMutexRisingEdge=%d\n", gEnableMutexRisingEdge);
  376. sprintf(buf, "gEnableMutexRisingEdge: %d\n", gEnableMutexRisingEdge);
  377. } else if (enable == 31) {
  378. if (gEnableReduceRegWrite == 0)
  379. gEnableReduceRegWrite = 1;
  380. else
  381. gEnableReduceRegWrite = 0;
  382. pr_debug("DDP: gEnableReduceRegWrite=%d\n", gEnableReduceRegWrite);
  383. sprintf(buf, "gEnableReduceRegWrite: %d\n", gEnableReduceRegWrite);
  384. } else if (enable == 32) {
  385. DDPAEE("DDP: (32)gEnableReduceRegWrite=%d\n", gEnableReduceRegWrite);
  386. } else if (enable == 33) {
  387. if (gDumpConfigCMD == 0)
  388. gDumpConfigCMD = 1;
  389. else
  390. gDumpConfigCMD = 0;
  391. pr_debug("DDP: gDumpConfigCMD=%d\n", gDumpConfigCMD);
  392. sprintf(buf, "gDumpConfigCMD: %d\n", gDumpConfigCMD);
  393. } else if (enable == 34) {
  394. if (gESDEnableSODI == 0)
  395. gESDEnableSODI = 1;
  396. else
  397. gESDEnableSODI = 0;
  398. pr_debug("DDP: gESDEnableSODI=%d\n", gESDEnableSODI);
  399. sprintf(buf, "gESDEnableSODI: %d\n", gESDEnableSODI);
  400. } else if (enable == 35) {
  401. if (gEnableOVLStatusCheck == 0)
  402. gEnableOVLStatusCheck = 1;
  403. else
  404. gEnableOVLStatusCheck = 0;
  405. pr_debug("DDP: gEnableOVLStatusCheck=%d\n", gEnableOVLStatusCheck);
  406. sprintf(buf, "gEnableOVLStatusCheck: %d\n", gEnableOVLStatusCheck);
  407. } else if (enable == 36) {
  408. if (gResetRDMAEnable == 0)
  409. gResetRDMAEnable = 1;
  410. else
  411. gResetRDMAEnable = 0;
  412. pr_debug("DDP: gResetRDMAEnable=%d\n", gResetRDMAEnable);
  413. sprintf(buf, "gResetRDMAEnable: %d\n", gResetRDMAEnable);
  414. } else if (enable == 37) {
  415. unsigned int reg_value = 0;
  416. if (gEnableIRQ == 0) {
  417. gEnableIRQ = 1;
  418. DISP_CPU_REG_SET(DISP_REG_OVL_INTEN, 0x1e2);
  419. DISP_CPU_REG_SET(DISP_REG_OVL_INTEN + DISP_OVL_INDEX_OFFSET, 0x1e2);
  420. reg_value = DISP_REG_GET(DISP_REG_CONFIG_MUTEX_INTEN);
  421. DISP_CPU_REG_SET(DISP_REG_CONFIG_MUTEX_INTEN,
  422. reg_value | (1 << 0) | (1 << DISP_MUTEX_TOTAL));
  423. } else {
  424. gEnableIRQ = 0;
  425. DISP_CPU_REG_SET(DISP_REG_OVL_INTEN, 0x1e0);
  426. DISP_CPU_REG_SET(DISP_REG_OVL_INTEN + DISP_OVL_INDEX_OFFSET, 0x1e0);
  427. reg_value = DISP_REG_GET(DISP_REG_CONFIG_MUTEX_INTEN);
  428. DISP_CPU_REG_SET(DISP_REG_CONFIG_MUTEX_INTEN,
  429. reg_value & (~(1 << 0)) &
  430. (~(1 << DISP_MUTEX_TOTAL)));
  431. }
  432. pr_debug("DDP: gEnableIRQ=%d\n", gEnableIRQ);
  433. sprintf(buf, "gEnableIRQ: %d\n", gEnableIRQ);
  434. } else if (enable == 38) {
  435. if (gDisableSODIForTriggerLoop == 0)
  436. gDisableSODIForTriggerLoop = 1;
  437. else
  438. gDisableSODIForTriggerLoop = 0;
  439. pr_debug("DDP: gDisableSODIForTriggerLoop=%d\n",
  440. gDisableSODIForTriggerLoop);
  441. sprintf(buf, "gDisableSODIForTriggerLoop: %d\n",
  442. gDisableSODIForTriggerLoop);
  443. } else if (enable == 39) {
  444. cmdqCoreSetEvent(CMDQ_SYNC_TOKEN_STREAM_EOF);
  445. cmdqCoreSetEvent(CMDQ_EVENT_DISP_RDMA0_EOF);
  446. sprintf(buf, "enable=%d\n", (unsigned int)enable);
  447. } else if (enable == 41) {
  448. if (gResetOVLInAALTrigger == 0)
  449. gResetOVLInAALTrigger = 1;
  450. else
  451. gResetOVLInAALTrigger = 0;
  452. pr_debug("DDP: gResetOVLInAALTrigger=%d\n", gResetOVLInAALTrigger);
  453. sprintf(buf, "gResetOVLInAALTrigger: %d\n", gResetOVLInAALTrigger);
  454. } else if (enable == 42) {
  455. if (gDisableOVLTF == 0)
  456. gDisableOVLTF = 1;
  457. else
  458. gDisableOVLTF = 0;
  459. pr_debug("DDP: gDisableOVLTF=%d\n", gDisableOVLTF);
  460. sprintf(buf, "gDisableOVLTF: %d\n", gDisableOVLTF);
  461. } else if (enable == 43) {
  462. if (gDumpESDCMD == 0)
  463. gDumpESDCMD = 1;
  464. else
  465. gDumpESDCMD = 0;
  466. pr_debug("DDP: gDumpESDCMD=%d\n", gDumpESDCMD);
  467. sprintf(buf, "gDumpESDCMD: %d\n", gDumpESDCMD);
  468. } else if (enable == 44) {
  469. /* extern void disp_dump_emi_status(void); */
  470. disp_dump_emi_status();
  471. sprintf(buf, "dump emi status!\n");
  472. } else if (enable == 40) {
  473. sprintf(buf, "version: %d\n", 7);
  474. } else if (enable == 45) {
  475. ddp_aee_print("DDP AEE DUMP!!\n");
  476. } else if (enable == 46) {
  477. ASSERT(0);
  478. } else if (enable == 47) {
  479. if (gEnableDSIStateCheck == 0)
  480. gEnableDSIStateCheck = 1;
  481. else
  482. gEnableDSIStateCheck = 0;
  483. pr_debug("DDP: gEnableDSIStateCheck=%d\n", gEnableDSIStateCheck);
  484. sprintf(buf, "gEnableDSIStateCheck: %d\n", gEnableDSIStateCheck);
  485. } else if (enable == 48) {
  486. if (gMutexFreeRun == 0)
  487. gMutexFreeRun = 1;
  488. else
  489. gMutexFreeRun = 0;
  490. pr_debug("DDP: gMutexFreeRun=%d\n", gMutexFreeRun);
  491. sprintf(buf, "gMutexFreeRun: %d\n", gMutexFreeRun);
  492. }
  493. }
  494. static void process_dbg_opt(const char *opt)
  495. {
  496. char *buf = dbg_buf + strlen(dbg_buf);
  497. int ret = 0;
  498. char *p;
  499. if (0 == strncmp(opt, "regr:", 5)) {
  500. unsigned long addr = 0;
  501. p = (char *)opt + 5;
  502. ret = kstrtoul(p, 16, (unsigned long int *)&addr);
  503. if (ret)
  504. pr_err("DISP/%s: errno %d\n", __func__, ret);
  505. if (is_reg_addr_valid(1, addr) == 1) { /* (addr >= 0xf0000000U && addr <= 0xff000000U) */
  506. unsigned int regVal = DISP_REG_GET(addr);
  507. DDPMSG("regr: 0x%lx = 0x%08X\n", addr, regVal);
  508. sprintf(buf, "regr: 0x%lx = 0x%08X\n", addr, regVal);
  509. } else {
  510. sprintf(buf, "regr, invalid address 0x%lx\n", addr);
  511. goto Error;
  512. }
  513. } else if (0 == strncmp(opt, "regw:", 5)) {
  514. unsigned long addr = 0;
  515. unsigned long val = 0;
  516. p = (char *)opt + 5;
  517. ret = kstrtoul(p, 16, (unsigned long int *)&addr);
  518. if (ret)
  519. pr_err("DISP/%s: errno %d\n", __func__, ret);
  520. ret = kstrtoul(p + 1, 16, (unsigned long int *)&val);
  521. if (ret)
  522. pr_err("DISP/%s: errno %d\n", __func__, ret);
  523. if (is_reg_addr_valid(1, addr) == 1) { /* (addr >= 0xf0000000U && addr <= 0xff000000U) */
  524. unsigned int regVal;
  525. DISP_CPU_REG_SET(addr, val);
  526. regVal = DISP_REG_GET(addr);
  527. DDPMSG("regw: 0x%lx, 0x%08X = 0x%08X\n", addr, (int) val, regVal);
  528. sprintf(buf, "regw: 0x%lx, 0x%08X = 0x%08X\n", addr, (int) val, regVal);
  529. } else {
  530. sprintf(buf, "regw, invalid address 0x%lx\n", addr);
  531. goto Error;
  532. }
  533. } else if (0 == strncmp(opt, "rdma_ultra:", 11)) {
  534. p = (char *)opt + 11;
  535. ret = kstrtoul(p, 16, &gRDMAUltraSetting);
  536. if (ret)
  537. pr_err("DISP/%s: errno %d\n", __func__, ret);
  538. DISP_CPU_REG_SET(DISP_REG_RDMA_MEM_GMC_SETTING_0, gRDMAUltraSetting);
  539. sprintf(buf, "rdma_ultra, gRDMAUltraSetting=0x%x, reg=0x%x\n",
  540. (unsigned int)gRDMAUltraSetting, DISP_REG_GET(DISP_REG_RDMA_MEM_GMC_SETTING_0));
  541. } else if (0 == strncmp(opt, "rdma_fifo:", 10)) {
  542. p = (char *)opt + 10;
  543. ret = kstrtoul(p, 16, &gRDMAFIFOLen);
  544. if (ret)
  545. pr_err("DISP/%s: errno %d\n", __func__, ret);
  546. DISP_CPU_REG_SET_FIELD(FIFO_CON_FLD_OUTPUT_VALID_FIFO_THRESHOLD,
  547. DISP_REG_RDMA_FIFO_CON, gRDMAFIFOLen);
  548. sprintf(buf, "rdma_fifo, gRDMAFIFOLen=0x%x, reg=0x%x\n",
  549. (unsigned int)gRDMAFIFOLen, DISP_REG_GET(DISP_REG_RDMA_FIFO_CON));
  550. } else if (0 == strncmp(opt, "g_regr:", 7)) {
  551. unsigned int reg_va_before;
  552. unsigned long reg_va;
  553. unsigned long reg_pa = 0;
  554. p = (char *)opt + 7;
  555. ret = kstrtoul(p, 16, (unsigned long int *)&reg_pa);
  556. if (ret)
  557. pr_err("DISP/%s: errno %d\n", __func__, ret);
  558. if (reg_pa < 0x10000000 || reg_pa > 0x18000000) {
  559. sprintf(buf, "g_regr, invalid pa=0x%lx\n", reg_pa);
  560. } else {
  561. reg_va = (unsigned long)ioremap_nocache(reg_pa, sizeof(unsigned long));
  562. reg_va_before = DISP_REG_GET(reg_va);
  563. pr_debug("g_regr, pa=%lx, va=0x%lx, reg_val=0x%x\n",
  564. reg_pa, reg_va, reg_va_before);
  565. sprintf(buf, "g_regr, pa=%lx, va=0x%lx, reg_val=0x%x\n",
  566. reg_pa, reg_va, reg_va_before);
  567. iounmap((void *)reg_va);
  568. }
  569. } else if (0 == strncmp(opt, "g_regw:", 7)) {
  570. unsigned int reg_va_before;
  571. unsigned int reg_va_after;
  572. unsigned long int val;
  573. unsigned long reg_va;
  574. unsigned long reg_pa = 0;
  575. p = (char *)opt + 7;
  576. ret = kstrtoul(p, 16, (unsigned long int *)&reg_pa);
  577. if (ret)
  578. pr_err("DISP/%s: errno %d\n", __func__, ret);
  579. if (reg_pa < 0x10000000 || reg_pa > 0x18000000) {
  580. sprintf(buf, "g_regw, invalid pa=0x%lx\n", reg_pa);
  581. } else {
  582. ret = kstrtoul(p + 1, 16, &val);
  583. if (ret)
  584. pr_err("DISP/%s: errno %d\n", __func__, ret);
  585. reg_va = (unsigned long)ioremap_nocache(reg_pa, sizeof(unsigned long));
  586. reg_va_before = DISP_REG_GET(reg_va);
  587. DISP_CPU_REG_SET(reg_va, val);
  588. reg_va_after = DISP_REG_GET(reg_va);
  589. pr_debug("g_regw, pa=%lx, va=0x%lx, value=0x%x, reg_val_before=0x%x, reg_val_after=0x%x\n",
  590. reg_pa, reg_va, (unsigned int)val, reg_va_before, reg_va_after);
  591. sprintf(buf, "g_regw, pa=%lx, va=0x%lx, value=0x%x, reg_val_before=0x%x, reg_val_after=0x%x\n",
  592. reg_pa, reg_va, (unsigned int)val, reg_va_before, reg_va_after);
  593. iounmap((void *)reg_va);
  594. }
  595. } else if (0 == strncmp(opt, "dbg_log:", 8)) {
  596. unsigned long int enable = 0;
  597. p = (char *)opt + 8;
  598. ret = kstrtoul(p, 10, &enable);
  599. if (ret)
  600. pr_err("DISP/%s: errno %d\n", __func__, ret);
  601. if (enable)
  602. dbg_log_level = 1;
  603. else
  604. dbg_log_level = 0;
  605. sprintf(buf, "dbg_log: %d\n", dbg_log_level);
  606. } else if (0 == strncmp(opt, "irq_log:", 8)) {
  607. unsigned long int enable = 0;
  608. p = (char *)opt + 8;
  609. ret = kstrtoul(p, 10, &enable);
  610. if (ret)
  611. pr_err("DISP/%s: errno %d\n", __func__, ret);
  612. if (enable)
  613. irq_log_level = 1;
  614. else
  615. irq_log_level = 0;
  616. sprintf(buf, "irq_log: %d\n", irq_log_level);
  617. } else if (0 == strncmp(opt, "met_on:", 7)) {
  618. unsigned long int met_on = 0;
  619. int rdma0_mode = 0;
  620. int rdma1_mode = 0;
  621. p = (char *)opt + 7;
  622. ret = kstrtoul(p, 10, &met_on);
  623. if (ret)
  624. pr_err("DISP/%s: errno %d\n", __func__, ret);
  625. if (0 == strncmp(p, "1", 1))
  626. met_on = 1;
  627. ddp_init_met_tag((unsigned int)met_on, rdma0_mode, rdma1_mode);
  628. DDPMSG("process_dbg_opt, met_on=%d,rdma0_mode %d, rdma1 %d\n",
  629. (unsigned int)met_on, rdma0_mode, rdma1_mode);
  630. sprintf(buf, "met_on:%d,rdma0_mode:%d,rdma1_mode:%d\n",
  631. (unsigned int)met_on, rdma0_mode, rdma1_mode);
  632. } else if (0 == strncmp(opt, "backlight:", 10)) {
  633. unsigned long level = 0;
  634. p = (char *)opt + 10;
  635. ret = kstrtoul(p, 10, (unsigned long int *)&level);
  636. if (ret)
  637. pr_err("DISP/%s: errno %d\n", __func__, ret);
  638. if (level) {
  639. disp_bls_set_backlight(level);
  640. sprintf(buf, "backlight: %d\n", (int) level);
  641. } else {
  642. goto Error;
  643. }
  644. } else if (0 == strncmp(opt, "pwm0:", 5) || 0 == strncmp(opt, "pwm1:", 5)) {
  645. unsigned long int level = 0;
  646. p = (char *)opt + 5;
  647. ret = kstrtoul(p, 10, &level);
  648. if (ret)
  649. pr_err("DISP/%s: errno %d\n", __func__, ret);
  650. if (level) {
  651. disp_pwm_id_t pwm_id = DISP_PWM0;
  652. if (opt[3] == '1')
  653. pwm_id = DISP_PWM1;
  654. disp_pwm_set_backlight(pwm_id, (unsigned int)level);
  655. sprintf(buf, "PWM 0x%x : %d\n", pwm_id, (unsigned int)level);
  656. } else {
  657. goto Error;
  658. }
  659. } else if (0 == strncmp(opt, "aal_dbg:", 8)) {
  660. unsigned long int tmp;
  661. ret = kstrtoul(opt + 8, 10, &tmp);
  662. if (ret)
  663. pr_err("DISP/%s: errno %d\n", __func__, ret);
  664. aal_dbg_en = (int)tmp;
  665. sprintf(buf, "aal_dbg_en = 0x%x\n", aal_dbg_en);
  666. } else if (0 == strncmp(opt, "aal_test:", 9)) {
  667. aal_test(opt + 9, buf);
  668. } else if (0 == strncmp(opt, "pwm_test:", 9)) {
  669. disp_pwm_test(opt + 9, buf);
  670. } else if (0 == strncmp(opt, "dump_reg:", 9)) {
  671. unsigned long int module = 0;
  672. p = (char *)opt + 9;
  673. ret = kstrtoul(p, 10, &module);
  674. if (ret)
  675. pr_err("DISP/%s: errno %d\n", __func__, ret);
  676. DDPMSG("process_dbg_opt, module=%d\n", (unsigned int)module);
  677. if (module < DISP_MODULE_NUM) {
  678. ddp_dump_reg(module);
  679. sprintf(buf, "dump_reg: %d\n", (unsigned int)module);
  680. } else {
  681. DDPMSG("process_dbg_opt2, module=%d\n", (unsigned int)module);
  682. goto Error;
  683. }
  684. } else if (0 == strncmp(opt, "dump_path:", 10)) {
  685. unsigned long int mutex_idx = 0;
  686. p = (char *)opt + 10;
  687. ret = kstrtoul(p, 10, &mutex_idx);
  688. if (ret)
  689. pr_err("DISP/%s: errno %d\n", __func__, ret);
  690. DDPMSG("process_dbg_opt, path mutex=%d\n", (unsigned int)mutex_idx);
  691. dpmgr_debug_path_status((unsigned int)mutex_idx);
  692. sprintf(buf, "dump_path: %d\n", (unsigned int)mutex_idx);
  693. } else if (0 == strncmp(opt, "debug:", 6)) {
  694. process_dbg_debug(opt);
  695. } else if (0 == strncmp(opt, "mmp", 3)) {
  696. init_ddp_mmp_events();
  697. } else {
  698. dbg_buf[0] = '\0';
  699. goto Error;
  700. }
  701. return;
  702. Error:
  703. DDPERR("parse command error!\n%s\n\n%s", opt, STR_HELP);
  704. }
  705. static void process_dbg_cmd(char *cmd)
  706. {
  707. char *tok;
  708. DDPDBG("cmd: %s\n", cmd);
  709. memset(dbg_buf, 0, sizeof(dbg_buf));
  710. while ((tok = strsep(&cmd, " ")) != NULL)
  711. process_dbg_opt(tok);
  712. }
  713. /* --------------------------------------------------------------------------- */
  714. /* Debug FileSystem Routines */
  715. /* --------------------------------------------------------------------------- */
  716. static int debug_open(struct inode *inode, struct file *file)
  717. {
  718. file->private_data = inode->i_private;
  719. return 0;
  720. }
  721. static char cmd_buf[512];
  722. static ssize_t debug_read(struct file *file, char __user *ubuf, size_t count, loff_t *ppos)
  723. {
  724. if (strlen(dbg_buf))
  725. return simple_read_from_buffer(ubuf, count, ppos, dbg_buf, strlen(dbg_buf));
  726. else
  727. return simple_read_from_buffer(ubuf, count, ppos, STR_HELP, strlen(STR_HELP));
  728. }
  729. static ssize_t debug_write(struct file *file, const char __user *ubuf, size_t count, loff_t *ppos)
  730. {
  731. const int debug_bufmax = sizeof(cmd_buf) - 1;
  732. size_t ret;
  733. ret = count;
  734. if (count > debug_bufmax)
  735. count = debug_bufmax;
  736. if (copy_from_user(&cmd_buf, ubuf, count))
  737. return -EFAULT;
  738. cmd_buf[count] = 0;
  739. process_dbg_cmd(cmd_buf);
  740. return ret;
  741. }
  742. static const struct file_operations debug_fops = {
  743. .read = debug_read,
  744. .write = debug_write,
  745. .open = debug_open,
  746. };
  747. static ssize_t debug_dump_read(struct file *file, char __user *buf, size_t size, loff_t *ppos)
  748. {
  749. dprec_logger_dump_reset();
  750. dump_to_buffer = 1;
  751. /* dump all */
  752. dpmgr_debug_path_status(-1);
  753. dump_to_buffer = 0;
  754. return simple_read_from_buffer(buf, size, ppos, dprec_logger_get_dump_addr(),
  755. dprec_logger_get_dump_len());
  756. }
  757. static const struct file_operations debug_fops_dump = {
  758. .read = debug_dump_read,
  759. };
  760. void ddp_debug_init(void)
  761. {
  762. if (!debug_init) {
  763. debug_init = 1;
  764. debugfs = debugfs_create_file("dispsys", S_IFREG | S_IRUGO, NULL, (void *)0, &debug_fops);
  765. debugDir = debugfs_create_dir("disp", NULL);
  766. if (debugDir)
  767. debugfs_dump = debugfs_create_file("dump", S_IFREG | S_IRUGO, debugDir, NULL, &debug_fops_dump);
  768. }
  769. }
  770. unsigned int ddp_debug_analysis_to_buffer(void)
  771. {
  772. return dump_to_buffer;
  773. }
  774. unsigned int ddp_debug_dbg_log_level(void)
  775. {
  776. return dbg_log_level;
  777. }
  778. unsigned int ddp_debug_irq_log_level(void)
  779. {
  780. return irq_log_level;
  781. }
  782. void ddp_debug_exit(void)
  783. {
  784. debugfs_remove(debugfs);
  785. debugfs_remove(debugfs_dump);
  786. debug_init = 0;
  787. }
  788. int ddp_mem_test(void)
  789. {
  790. return -1;
  791. }
  792. int ddp_lcd_test(void)
  793. {
  794. return -1;
  795. }
  796. char *disp_get_fmt_name(DP_COLOR_ENUM color)
  797. {
  798. switch (color) {
  799. case DP_COLOR_FULLG8:
  800. return "fullg8";
  801. case DP_COLOR_FULLG10:
  802. return "fullg10";
  803. case DP_COLOR_FULLG12:
  804. return "fullg12";
  805. case DP_COLOR_FULLG14:
  806. return "fullg14";
  807. case DP_COLOR_UFO10:
  808. return "ufo10";
  809. case DP_COLOR_BAYER8:
  810. return "bayer8";
  811. case DP_COLOR_BAYER10:
  812. return "bayer10";
  813. case DP_COLOR_BAYER12:
  814. return "bayer12";
  815. case DP_COLOR_RGB565:
  816. return "rgb565";
  817. case DP_COLOR_BGR565:
  818. return "bgr565";
  819. case DP_COLOR_RGB888:
  820. return "rgb888";
  821. case DP_COLOR_BGR888:
  822. return "bgr888";
  823. case DP_COLOR_RGBA8888:
  824. return "rgba";
  825. case DP_COLOR_BGRA8888:
  826. return "bgra";
  827. case DP_COLOR_ARGB8888:
  828. return "argb";
  829. case DP_COLOR_ABGR8888:
  830. return "abgr";
  831. case DP_COLOR_I420:
  832. return "i420";
  833. case DP_COLOR_YV12:
  834. return "yv12";
  835. case DP_COLOR_NV12:
  836. return "nv12";
  837. case DP_COLOR_NV21:
  838. return "nv21";
  839. case DP_COLOR_I422:
  840. return "i422";
  841. case DP_COLOR_YV16:
  842. return "yv16";
  843. case DP_COLOR_NV16:
  844. return "nv16";
  845. case DP_COLOR_NV61:
  846. return "nv61";
  847. case DP_COLOR_YUYV:
  848. return "yuyv";
  849. case DP_COLOR_YVYU:
  850. return "yvyu";
  851. case DP_COLOR_UYVY:
  852. return "uyvy";
  853. case DP_COLOR_VYUY:
  854. return "vyuy";
  855. case DP_COLOR_I444:
  856. return "i444";
  857. case DP_COLOR_YV24:
  858. return "yv24";
  859. case DP_COLOR_IYU2:
  860. return "iyu2";
  861. case DP_COLOR_NV24:
  862. return "nv24";
  863. case DP_COLOR_NV42:
  864. return "nv42";
  865. case DP_COLOR_GREY:
  866. return "grey";
  867. default:
  868. return "undefined";
  869. }
  870. }
  871. unsigned int ddp_dump_reg_to_buf(unsigned int start_module, unsigned long *addr)
  872. {
  873. unsigned int cnt = 0;
  874. unsigned long reg_addr;
  875. switch (start_module) {
  876. case 0: /* DISP_MODULE_WDMA0: */
  877. reg_addr = DISP_REG_WDMA_INTEN;
  878. while (reg_addr <= DISP_REG_WDMA_PRE_ADD2) {
  879. addr[cnt++] = DISP_REG_GET(reg_addr);
  880. reg_addr += 4;
  881. }
  882. /* fallthrough */
  883. case 1: /* DISP_MODULE_OVL: */
  884. reg_addr = DISP_REG_OVL_STA;
  885. while (reg_addr <= DISP_REG_OVL_L3_PITCH) {
  886. addr[cnt++] = DISP_REG_GET(reg_addr);
  887. reg_addr += 4;
  888. }
  889. /* fallthrough */
  890. case 2: /* DISP_MODULE_RDMA: */
  891. reg_addr = DISP_REG_RDMA_INT_ENABLE;
  892. while (reg_addr <= DISP_REG_RDMA_PRE_ADD_1) {
  893. addr[cnt++] = DISP_REG_GET(reg_addr);
  894. reg_addr += 4;
  895. }
  896. break;
  897. }
  898. return cnt * sizeof(unsigned long);
  899. }
  900. /* ddp_dump_lcm_paramter */
  901. unsigned int ddp_dump_lcm_param_to_buf(unsigned int start_module, unsigned long *addr)
  902. {
  903. unsigned int cnt = 0;
  904. if (start_module == 3) {/*3 correspond dbg4*/
  905. addr[cnt++] = primary_display_get_width();
  906. addr[cnt++] = primary_display_get_height();
  907. }
  908. return cnt * sizeof(unsigned long);
  909. }