dlog.c 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922
  1. #ifdef __KERNEL__
  2. #define __DLOG_IMPLEMENTAION_MODULE__
  3. #include <linux/module.h>
  4. #include <linux/kernel.h>
  5. #include <linux/sched.h>
  6. #include <linux/time.h>
  7. #include <linux/init.h>
  8. #include <linux/interrupt.h>
  9. #include <linux/hrtimer.h>
  10. #include <linux/delay.h>
  11. #include <linux/io.h>
  12. #include <linux/semaphore.h>
  13. #include <linux/spinlock.h>
  14. #include <linux/fb.h>
  15. #include <linux/msm_mdp.h>
  16. #include <linux/ktime.h>
  17. #include <linux/wakelock.h>
  18. #include <linux/time.h>
  19. #include <asm/system.h>
  20. #include <asm/mach-types.h>
  21. #include <mach/hardware.h>
  22. #include <linux/lcd.h>
  23. #include <linux/gpio.h>
  24. #include <linux/kernel.h>
  25. #include "mdss_dsi.h"
  26. #include "mdss_mdp.h"
  27. #include "mdss_fb.h"
  28. #include <linux/version.h>
  29. #include <linux/kernel.h>
  30. #include <linux/types.h>
  31. #include <linux/kdev_t.h>
  32. #include <linux/fs.h>
  33. #include <linux/version.h>
  34. #include <linux/module.h>
  35. #include <linux/moduleparam.h>
  36. #include <linux/init.h>
  37. #include <linux/kernel.h>
  38. #include <linux/slab.h>
  39. #include <linux/fs.h>
  40. #include <linux/errno.h>
  41. #include <linux/err.h>
  42. #include <linux/cdev.h>
  43. #include <linux/device.h>
  44. #include <linux/mutex.h>
  45. #include <asm/uaccess.h>
  46. #include "mdss_panel.h"
  47. #include "mdss_mdp.h"
  48. #include "mdss_edp.h"
  49. #include "mdss_debug.h"
  50. #include <linux/input.h>
  51. #include "linux/debugfs.h"
  52. #define CFAKE_DEVICE_NAME "ddebugger"
  53. #else
  54. #include <ctype.h>
  55. #include <debug.h>
  56. #include <stdlib.h>
  57. #include <printf.h>
  58. #include <list.h>
  59. #include <string.h>
  60. #include <arch/ops.h>
  61. #include <platform.h>
  62. #include <platform/debug.h>
  63. #include <kernel/thread.h>
  64. #include <kernel/timer.h>
  65. #include <reg.h>
  66. #define pr_debug(fmt,...) dprintf(CRITICAL,fmt,##__VA_ARGS__);
  67. #define pr_info(fmt,...) dprintf(CRITICAL,fmt,##__VA_ARGS__);
  68. #define MIPI_INP(X) readl(X);
  69. #endif
  70. #include "mdss.h"
  71. #ifndef __KERNEL__
  72. u32 __debug_mdp_phys = 0x7FD00000;
  73. #else
  74. u32 __debug_mdp_phys = 0x00000;
  75. #endif
  76. static u32 dump_size;
  77. struct debug_mdp *debug_mdp;
  78. //MDP Instace Variable
  79. #ifdef __KERNEL__
  80. #ifdef CONFIG_SEC_DEBUG_SCHED_LOG
  81. extern struct sec_debug_log *secdbg_log;
  82. extern struct sec_debug_subsys_data_krait *secdbg_krait;
  83. extern struct _dlogdebug __start___dlog[];
  84. extern struct _dlogdebug __stop___dlog[];
  85. extern struct mdss_data_type *mdss_res;
  86. #endif
  87. static spinlock_t xlock;
  88. extern struct msm_mdp_interface mdp5;
  89. static int sec_debug_level = 1;
  90. #endif
  91. #define DLOG_BUFFER_SIZE 2000
  92. #define DLOG_BUFFER_SIZE_SHIP 200
  93. #define REGISTER_LOG_LEN 110
  94. #define EVENT_DESC_LEN 10
  95. #define CLOCK_DUMP_LEN 2
  96. #if defined(CONFIG_ARCH_MSM8974)
  97. #define CHIP_GPIO_COUNT_8974 146
  98. static struct reg_desc mdss_reg_desc[]=
  99. {
  100. {0xFD900000,0x22100}, //mdp
  101. {0xFD922804,0x0600}, //dsi0
  102. {0xFD922E04,0x0600}, //dsi1
  103. {0xFD923404,0x0700}, //edp
  104. {0xFD511000,(CHIP_GPIO_COUNT_8974*4*4)} //gpio
  105. };
  106. #elif defined(CONFIG_ARCH_MSM8226)
  107. #define CHIP_GPIO_COUNT_8226 117
  108. static struct reg_desc mdss_reg_desc[]=
  109. {
  110. {0xFD900000,0x22100}, //mdp
  111. {0xFD922804,0x0600}, //dsi0
  112. {0xFD511000,(CHIP_GPIO_COUNT_8226*4*4)} //gpio
  113. };
  114. #endif
  115. /* mdp_reg_info.txt contains the values to be initialized */
  116. int read_ongoing;
  117. volatile u32 mdp_reg_info[257] = {16, 260, 5243152, 7340336, 2097504, 10486144, 10486320, 3146464, 2097920, 2097936, 2097952, 8389536, 992, 1049588, 2098176, 1072, 10486864, 5244072, 3146992, 8390144, 1584, 8390400, 1840, 8390656, 2096, 8390912, 2352, 8391168, 2608, 1053696, 11539472, 5200, 5216, 5232, 3151044, 5344, 5360, 5376, 20976912, 10490368, 3150384, 4198984, 4720, 7344804, 2101968, 2101984, 1054720, 11540496, 6224, 6240, 6256, 3152068, 6368, 6384, 6400, 20977936, 10491392, 3151408, 4200008, 5744, 7345828, 2102992, 2103008, 1055744, 11541520, 7248, 7264, 7280, 3153092, 7392, 7408, 7424, 20978960, 10492416, 3152432, 4201032, 6768, 7346852, 2104016, 2104032, 8196, 1056784, 1056800, 10493440, 3153456, 4202056, 7792, 7347876, 2105040, 2105056, 9220, 1057808, 1057824, 10494464, 3154480, 4203080, 8816, 7348900, 2106064, 2106080, 10244, 1058832, 1058848, 10495488, 3155504, 4204104, 9840, 7349924, 2107088, 2107104, 10496512, 3156528, 4205128, 10864, 7350948, 2108112, 2108128, 10497536, 3157552, 4206152, 11888, 7351972, 2109136, 2109152, 2109952, 12816, 10498592, 10498640, 10498688, 27275952, 2110240, 2110256, 1061888, 1061904, 2110496, 2110976, 13840, 10499616, 10499664, 10499712, 27276976, 2111264, 2111280, 1062912, 1062928, 2111520, 2112000, 14864, 10500640, 10500688, 10500736, 27278000, 2112288, 2112304, 1063936, 1063952, 2112544, 2113024, 15888, 10501664, 10501712, 10501760, 27279024, 2113312, 2113328, 1064960, 1064976, 2113568, 2114048, 16912, 10502688, 10502736, 10502784, 27280048, 2114336, 2114352, 1065984, 1066000, 2114592, 17920, 18256, 3164004, 3164176, 6309932, 2115760, 2115776, 27281616, 18944, 19280, 3165028, 3165200, 6310956, 2116784, 2116800, 27282640, 19968, 20304, 3166052, 3166224, 6311980, 2117808, 2117824, 27283664, 3215616, 1118496, 3215664, 69960, 1118580, 16847712, 70576, 9515264, 3223856, 78152, 1126772, 16855904, 78768, 9523456, 3232048, 86344, 1134964, 16864096, 86960, 9531648, 3240240, 94536, 1143156, 16872288, 95152, 9539840, 3248432, 102728, 1151348, 16880480, 103344, 24252672, 135556, 135568, 1184172, 7475712, 24253184, 136068, 136080, 1184684, 7476224, 24253696, 136580, 136592, 1185196, 7476736, 24254208, 137092, 137104, 1185708, 7477248, 12720896, 12721152, 12721408};
  118. u32 mdp_reg_vaddr[257];
  119. /*TODO: Optimize/correct this function*/
  120. int check_duplicate_event(u32 *event_buff, u32 address) {
  121. int i;
  122. for (i=0; i<debug_mdp->event_desc.len/sizeof(u32); i++) {
  123. if(event_buff[i] == address)
  124. return -1;
  125. i+=15; //as the event dump struct is 64 bytes
  126. }
  127. return 0;
  128. }
  129. void inc_put(u32 *buff,u32 l){
  130. buff[debug_mdp->log_buff.last] = l;
  131. debug_mdp->log_buff.last++;
  132. debug_mdp->log_buff.last %= (debug_mdp->log_buff.len/sizeof(u32));
  133. if(debug_mdp->log_buff.last == debug_mdp->log_buff.first) {
  134. int count = buff[debug_mdp->log_buff.first] &0x1F;
  135. debug_mdp->log_buff.first += count;
  136. debug_mdp->log_buff.first %= (debug_mdp->log_buff.len/sizeof(u32));
  137. }
  138. pr_debug("[DDEBUGGER] buff:%pK, first:%d, last:%d, Val: %x\n",buff,debug_mdp->log_buff.first,debug_mdp->log_buff.last,(u32)l);
  139. return ;
  140. }
  141. #if defined(CONFIG_ARCH_MSM8974)
  142. static struct dclock clock_list[] = {
  143. {"mdss_ahb_clk",HWIO_MMSS_MDSS_AHB_CBCR_ADDR,CLK_TEST_MDSS_AHB_CLK,0},
  144. {"mdss_axi_clk",HWIO_MMSS_MDSS_AXI_CBCR_ADDR,CLK_TEST_MDSS_AXI_CLK,0},
  145. {"mdss_byte0_clk",HWIO_MMSS_MDSS_BYTE0_CBCR_ADDR,CLK_TEST_MDSS_BYTE0_CLK,0},
  146. {"mdss_byte1_clk",HWIO_MMSS_MDSS_BYTE1_CBCR_ADDR,CLK_TEST_MDSS_BYTE1_CLK,0},
  147. {"mdss_edpaux_clk",HWIO_MMSS_MDSS_EDPAUX_CBCR_ADDR,CLK_TEST_MDSS_EDPAUX_CLK,0},
  148. {"mdss_edplink_clk",HWIO_MMSS_MDSS_EDPLINK_CBCR_ADDR,CLK_TEST_MDSS_EDPLINK_CLK,0},
  149. {"mdss_edppixel_clk",HWIO_MMSS_MDSS_EDPPIXEL_CBCR_ADDR,CLK_TEST_MDSS_EDPPIXEL_CLK,0},
  150. {"mdss_esc0_clk",HWIO_MMSS_MDSS_ESC0_CBCR_ADDR,CLK_TEST_MDSS_ESC0_CLK,0},
  151. {"mdss_esc1_clk",HWIO_MMSS_MDSS_ESC1_CBCR_ADDR,CLK_TEST_MDSS_ESC1_CLK,0},
  152. {"mdss_extpclk_clk",HWIO_MMSS_MDSS_EXTPCLK_CBCR_ADDR,CLK_TEST_MDSS_EXTPCLK_CLK,0},
  153. {"mdss_hdmi_ahb_clk",HWIO_MMSS_MDSS_HDMI_AHB_CBCR_ADDR,CLK_TEST_MDSS_HDMI_AHB_CLK,0},
  154. {"mdss_hdmi_clk",HWIO_MMSS_MDSS_HDMI_CBCR_ADDR,CLK_TEST_MDSS_HDMI_CLK,0},
  155. {"mdss_mdp_clk",HWIO_MMSS_MDSS_MDP_CBCR_ADDR,CLK_TEST_MDSS_MDP_CLK,0},
  156. {"mdss_mdp_lut_clk",HWIO_MMSS_MDSS_MDP_LUT_CBCR_ADDR,CLK_TEST_MDSS_MDP_LUT_CLK,0},
  157. {"mdss_pclk0_clk",HWIO_MMSS_MDSS_PCLK0_CBCR_ADDR,CLK_TEST_MDSS_PCLK0_CLK,0},
  158. {"mdss_pclk1_clk",HWIO_MMSS_MDSS_PCLK1_CBCR_ADDR,CLK_TEST_MDSS_PCLK1_CLK,0},
  159. {"mdss_vsync_clk",HWIO_MMSS_MDSS_VSYNC_CBCR_ADDR,CLK_TEST_MDSS_VSYNC_CLK,0},
  160. };
  161. #elif defined(CONFIG_ARCH_MSM8226)
  162. static struct dclock clock_list[] = {
  163. {"mdss_ahb_clk",HWIO_MMSS_MDSS_AHB_CBCR_ADDR,CLK_TEST_MDSS_AHB_CLK,0},
  164. {"mdss_axi_clk",HWIO_MMSS_MDSS_AXI_CBCR_ADDR,CLK_TEST_MDSS_AXI_CLK,0},
  165. {"mdss_byte0_clk",HWIO_MMSS_MDSS_BYTE0_CBCR_ADDR,CLK_TEST_MDSS_BYTE0_CLK,0},
  166. {"mdss_esc0_clk",HWIO_MMSS_MDSS_ESC0_CBCR_ADDR,CLK_TEST_MDSS_ESC0_CLK,0},
  167. {"mdss_mdp_clk",HWIO_MMSS_MDSS_MDP_CBCR_ADDR,CLK_TEST_MDSS_MDP_CLK,0},
  168. {"mdss_mdp_lut_clk",HWIO_MMSS_MDSS_MDP_LUT_CBCR_ADDR,CLK_TEST_MDSS_MDP_LUT_CLK,0},
  169. {"mdss_pclk0_clk",HWIO_MMSS_MDSS_PCLK0_CBCR_ADDR,CLK_TEST_MDSS_PCLK0_CLK,0},
  170. {"mdss_vsync_clk",HWIO_MMSS_MDSS_VSYNC_CBCR_ADDR,CLK_TEST_MDSS_VSYNC_CLK,0},
  171. };
  172. #endif
  173. #define writelx(r,v) writel((v),(r))
  174. void *vHWIO_GCC_DEBUG_CLK_CTL_ADDR = (void*)0xfc401880;
  175. void *vHWIO_MMSS_DEBUG_CLK_CTL_ADDR = (void*)0xfd8c0900;
  176. void *vHWIO_GCC_CLOCK_FRQ_MEASURE_STATUS_ADDR = (void*)0xfc401888;
  177. void *vHWIO_GCC_CLOCK_FRQ_MEASURE_CTL_ADDR =(void*) 0xfc401884;
  178. void *vHWIO_GCC_XO_DIV4_CBCR_ADDR = (void*)0xfc4010c8;
  179. static long read_clock(u32 clk_test,u32 clk_reg){
  180. long clock_val;
  181. pr_debug("%s: test:0x%x reg:%x\n",__func__,clk_test,clk_reg);
  182. //Print_Clk_Info_Line
  183. {
  184. u32 is_on=0;
  185. u32 clk_freq=0;
  186. //u32 clk_freq_val=0;
  187. if(clk_reg != 0){
  188. if((readl_relaxed(clk_reg) & 0x80000000) == 0x0)
  189. is_on = 1;
  190. }
  191. pr_debug("%s:is_on:%d\n",__func__,is_on);
  192. if(!is_on) return 0;
  193. //Program Clock Test
  194. {
  195. u32 testval = clk_test & CLK_TEST_TYPE_MASK;
  196. u32 setval = clk_test & CLK_TEST_SEL_MASK;
  197. //u32 submuxval = clk_test & CLK_TEST_SUB_MUX_MASK;
  198. if(setval == CLK_MMSS_TEST) {
  199. writelx(vHWIO_GCC_DEBUG_CLK_CTL_ADDR,0x00013000|(0x2c&0x000001FF));
  200. writelx(vHWIO_MMSS_DEBUG_CLK_CTL_ADDR,0x00010000|(testval&0x00000FFF));
  201. }
  202. }
  203. pr_debug("%s:2\n",__func__);
  204. //Calc_Clk_Freq
  205. {
  206. //Configure l2cpuclkselr...for accuaracy
  207. u32 xo_div4_cbcr = readl_relaxed(vHWIO_GCC_XO_DIV4_CBCR_ADDR);
  208. u32 multiplier = 4;
  209. u32 tcxo_count = 0x800;
  210. u32 measure_ctl = 0;
  211. u32 short_clock_count;
  212. u32 clock_count = 0;
  213. u32 dbg_clk_ctl = 0;
  214. u32 temp = 0;
  215. //Measure a short run
  216. //Config XO DIV4 comparator clock
  217. writelx(vHWIO_GCC_XO_DIV4_CBCR_ADDR,readl_relaxed(vHWIO_GCC_XO_DIV4_CBCR_ADDR)|0x1);
  218. // Start with the counter disabled
  219. measure_ctl=readl_relaxed(vHWIO_GCC_CLOCK_FRQ_MEASURE_CTL_ADDR) ;
  220. measure_ctl=measure_ctl&~0x1FFFFF ;
  221. writelx(vHWIO_GCC_CLOCK_FRQ_MEASURE_CTL_ADDR,measure_ctl);
  222. // Program the starting counter value, high enough to get good accuracy
  223. pr_debug("%s:measure_ctl:0x%x xo_div4_cbcr:0x%x \n",__func__,measure_ctl
  224. ,xo_div4_cbcr);
  225. measure_ctl= measure_ctl| tcxo_count;
  226. //Start the counting
  227. measure_ctl=measure_ctl|0x100000;
  228. writelx(vHWIO_GCC_CLOCK_FRQ_MEASURE_CTL_ADDR,measure_ctl);
  229. pr_debug("HWIO_GCC_CLOCK_FRQ_MEASURE_CTL_ADDR:0x%X",
  230. readl_relaxed(vHWIO_GCC_CLOCK_FRQ_MEASURE_CTL_ADDR) );
  231. //Wait for the counters to finish
  232. mdelay(1);
  233. while ((temp = readl_relaxed(vHWIO_GCC_CLOCK_FRQ_MEASURE_STATUS_ADDR)&0x2000000)==0)
  234. pr_debug("HWIO_GCC_CLOCK_FRQ_MEASURE_STATUS_ADDR:0x%X\n",temp);
  235. pr_debug("%s:4\n",__func__);
  236. // Turn off the test clock and read the clock count
  237. measure_ctl = readl_relaxed(vHWIO_GCC_CLOCK_FRQ_MEASURE_CTL_ADDR);
  238. writelx(vHWIO_GCC_CLOCK_FRQ_MEASURE_CTL_ADDR, measure_ctl&~0x100000);
  239. pr_debug("%s:5\n",__func__);
  240. short_clock_count=readl_relaxed(vHWIO_GCC_CLOCK_FRQ_MEASURE_STATUS_ADDR)&0x1FFFFFF;
  241. //Restore the register
  242. writelx(vHWIO_GCC_XO_DIV4_CBCR_ADDR,xo_div4_cbcr);
  243. pr_debug("%s:6:short_clock_count: %d\n",__func__,short_clock_count);
  244. //Longer count and compare
  245. xo_div4_cbcr = readl_relaxed(vHWIO_GCC_XO_DIV4_CBCR_ADDR);
  246. multiplier = 4;
  247. tcxo_count = 0x8000;
  248. //Config XO DIV4 comparator clock
  249. writelx(vHWIO_GCC_XO_DIV4_CBCR_ADDR,readl_relaxed(vHWIO_GCC_XO_DIV4_CBCR_ADDR)|0x1);
  250. pr_debug("%s:7\n",__func__);
  251. // Start with the counter disabled
  252. measure_ctl=readl_relaxed(vHWIO_GCC_CLOCK_FRQ_MEASURE_CTL_ADDR) ;
  253. measure_ctl=measure_ctl&~0x1FFFFF ;
  254. writelx(vHWIO_GCC_CLOCK_FRQ_MEASURE_CTL_ADDR,measure_ctl);
  255. // Program the starting counter value, high enough to get good accuracy
  256. pr_debug("%s:8\n",__func__);
  257. measure_ctl= measure_ctl| tcxo_count;
  258. //Start the counting
  259. measure_ctl=measure_ctl|0x100000;
  260. writelx(vHWIO_GCC_CLOCK_FRQ_MEASURE_CTL_ADDR,measure_ctl);
  261. pr_debug("%s:9\n",__func__);
  262. //Wait for the counters to finish
  263. mdelay(1);
  264. while ((readl_relaxed(vHWIO_GCC_CLOCK_FRQ_MEASURE_STATUS_ADDR)&0x2000000)==0) ;
  265. // Turn off the test clock and read the clock count
  266. measure_ctl = readl_relaxed(vHWIO_GCC_CLOCK_FRQ_MEASURE_CTL_ADDR);
  267. writelx(vHWIO_GCC_CLOCK_FRQ_MEASURE_CTL_ADDR, measure_ctl&~0x100000);
  268. pr_debug("%s:10\n",__func__);
  269. clock_count=readl_relaxed(vHWIO_GCC_CLOCK_FRQ_MEASURE_STATUS_ADDR)&0x1FFFFFF;
  270. if( clock_count == short_clock_count)
  271. clk_freq = 0;
  272. else
  273. clk_freq = (48*(2*multiplier)/10)*(2*clock_count+3)*2/(2*tcxo_count+7); /* need this for furthur implementation*/
  274. //Restore the register
  275. writelx(vHWIO_GCC_XO_DIV4_CBCR_ADDR,xo_div4_cbcr);
  276. pr_debug("%s:11\n",__func__);
  277. //Clear the divide by 4 in DEBUG_CLK_CTL to make the scope view of the clock
  278. //the correct frequency
  279. dbg_clk_ctl=readl_relaxed(vHWIO_GCC_DEBUG_CLK_CTL_ADDR);
  280. dbg_clk_ctl=dbg_clk_ctl&~0x00003000;
  281. writelx(vHWIO_GCC_DEBUG_CLK_CTL_ADDR, dbg_clk_ctl);
  282. pr_debug("%s:12\n",__func__);
  283. //store freq
  284. clock_val = clock_count;
  285. }
  286. }
  287. return clock_val;
  288. }
  289. static int init_clock_va(void){
  290. int i = 0;
  291. u32 clock_base_phy = 0xfd8c2300;
  292. u32 clock_base_virt = (u32)ioremap(0xfd8c2300,0xFF);
  293. if(!clock_base_virt)
  294. pr_err("Error Mapping Clock adress for %s",clock_list[i].name);
  295. for(;i < sizeof(clock_list)/sizeof(struct dclock);i++){
  296. pr_debug("Mapping: clk: %s addr: %x\n",clock_list[i].name,clock_list[i].reg_addr);
  297. #ifdef __KERNEL__
  298. if((clock_list[i].reg_addr - clock_base_phy) < 0)
  299. pr_err("Check clock base @@@@@@@@@@@@@!!!!!!!!!!!!!!!!\n");
  300. else
  301. clock_list[i].vreg_addr = clock_base_virt + (clock_list[i].reg_addr - clock_base_phy);
  302. #else
  303. clock_list[i].vreg_addr = clock_list[i].reg_addr;
  304. #endif
  305. }
  306. for(i = 1; i < sizeof(mdss_reg_desc)/sizeof(struct reg_desc) ; i++){
  307. mdss_reg_desc[i].vaddr = (u32)ioremap(mdss_reg_desc[i].base,mdss_reg_desc[i].len*4);
  308. }
  309. return 0;
  310. }
  311. void dump_clock_state(void)
  312. {
  313. static u32 *buff = NULL;
  314. int i = 0;
  315. if(debug_mdp && debug_mdp->clock_state.len == 0)
  316. return;
  317. if(debug_mdp && buff == NULL) {
  318. buff = (u32 *)((char *)debug_mdp + (sizeof(struct debug_mdp) + debug_mdp->clock_state.offset));
  319. } else if(!debug_mdp){
  320. pr_debug("Debug module not Initialized\n");
  321. return ;
  322. }
  323. pr_debug("debug_mdp : %pK buff: %pK end: %pK",debug_mdp,buff,buff+ debug_mdp->clock_state.len);
  324. for(;i < sizeof(clock_list)/sizeof(struct dclock);i++){
  325. u32 clock_val ;
  326. char *clk_ptr ;
  327. pr_debug("reading: %s i = %d, last: %d\n",clock_list[i].name,i,debug_mdp->clock_state.last);
  328. clk_ptr = (char *) &buff[debug_mdp->clock_state.last];
  329. memcpy(clk_ptr,clock_list[i].name,sizeof(clock_list[i].name));
  330. clock_val = read_clock(clock_list[i].test_reg, clock_list[i].vreg_addr);
  331. debug_mdp->clock_state.last += sizeof(clock_list[i].name)/sizeof(u32);
  332. pr_debug(" %s : %u :last : %d\n",clk_ptr,clock_val,debug_mdp->clock_state.last);
  333. buff[debug_mdp->clock_state.last++] = clock_val;
  334. pr_debug("buff[debug_mdp->clock_state.last++]: %pK",&buff[debug_mdp->clock_state.last-1]);
  335. }
  336. }
  337. int fill_reg_log(u32 *buff, u32 base, int len)
  338. {
  339. int i;
  340. unsigned char *buf;
  341. #ifdef __KERNEL__
  342. buf = (void*)base;
  343. #else
  344. buf = base;
  345. #endif
  346. for(i = 0; i < len/4; i++){
  347. pr_debug("buff:%pK ",&buff[debug_mdp->reg_log.last]);
  348. buff[debug_mdp->reg_log.last] = MIPI_INP(buf+i*4);
  349. debug_mdp->reg_log.last++;
  350. }
  351. return 0;
  352. }
  353. /* void klog(void) is used to dump register values of dsi0, dsi1, edp and
  354. mdp registers respectively. Each section is identified by START_MAGIC
  355. followed by start address of registers. For mdp case the detailed
  356. information of register adresses is found in mdp_reg_addrs_and_len.txt
  357. */
  358. void klog(void)
  359. {
  360. int i;
  361. static u32 *buff = NULL;
  362. int mdp_reg_count = 0;
  363. struct mdss_panel_data *pdata = NULL;
  364. struct mdss_dsi_ctrl_pdata *ctrl_pdata = NULL;
  365. struct mdss_data_type *mdata = mdss_mdp_get_mdata();
  366. int mdp_reg_dump_en;
  367. unsigned long flags;
  368. /* NULL Checks */
  369. if(mdata == NULL) return;
  370. if(mdata->ctl_off == NULL) return;
  371. pdata = (mdata->ctl_off+0)->panel_data;
  372. if(pdata ==NULL) return;
  373. ctrl_pdata = container_of(pdata, struct mdss_dsi_ctrl_pdata,
  374. panel_data);
  375. mdp_reg_dump_en = (ctrl_pdata->ctrl_state & CTRL_STATE_PANEL_INIT);
  376. if(debug_mdp->reg_log.last*4 >= debug_mdp->reg_log.len ) return;
  377. if(debug_mdp->reg_log.len == 0) return;
  378. pr_debug("KK: -----------> Inside %s",__func__);
  379. #ifdef __KERNEL__
  380. mdss_mdp_clk_ctrl(MDP_BLOCK_POWER_ON, false);
  381. spin_lock_irqsave(&xlock, flags);
  382. #else
  383. if((readl_relaxed(HWIO_MMSS_MDSS_AHB_CBCR_ADDR) & 0x80000000) != 0x0) {
  384. pr_info("AHB Clock not ON, Cannot Read MDP Regs\n");
  385. }
  386. //Switch on clcok
  387. #endif
  388. if(debug_mdp && buff == NULL){
  389. buff = (u32 *)((char *)debug_mdp + (sizeof(struct debug_mdp) + debug_mdp->reg_log.offset));
  390. }
  391. else if(!debug_mdp){
  392. pr_info("Debug module not Initialized\n");
  393. return ;
  394. }
  395. pr_debug("KK:------------------->(%s)::>> first: %x \t last: %x buff:%pK-%pK\n", __func__, debug_mdp->reg_log.first, debug_mdp->reg_log.last,buff,buff+debug_mdp->reg_log.len);
  396. if(!mdp_reg_dump_en)
  397. i = sizeof(mdss_reg_desc)/sizeof(struct reg_desc) -1;
  398. else
  399. i = 1;
  400. for(; i < sizeof(mdss_reg_desc)/sizeof(struct reg_desc) ; i++){
  401. buff[debug_mdp->reg_log.last++] = START_MAGIC;
  402. buff[debug_mdp->reg_log.last++] = mdss_reg_desc[i].base;
  403. #if defined(__KERNEL__)
  404. if(fill_reg_log(buff, mdss_reg_desc[i].vaddr, mdss_reg_desc[i].len))
  405. pr_info("failed to dump lcd regs at %x ----------> KK\n",mdss_reg_desc[i].base);
  406. #else
  407. if(fill_reg_log(buff, base, len*4))
  408. pr_info("failed to dump lcd regs at %x ----------> KK\n",base);
  409. #endif
  410. }
  411. #if defined(CONFIG_ARCH_MSM8974) || defined(CONFIG_ARCH_MSM8226)
  412. if(mdp_reg_dump_en){
  413. buff[debug_mdp->reg_log.last++] = START_MAGIC;
  414. buff[debug_mdp->reg_log.last++] = mdss_reg_desc[0].base;
  415. for(i = 0; i < sizeof(mdp_reg_info)/sizeof(u32); i++){
  416. int len;
  417. u32 base;
  418. len = mdp_reg_info[i] & 0xfff00000;
  419. len = len >> 20;
  420. len += 1;
  421. mdp_reg_count += len;
  422. base = mdp_reg_info[i] & 0x000fffff;
  423. #if defined(__KERNEL__)
  424. if(fill_reg_log(buff, (u32) mdss_res->mdp_base +base, len*4))
  425. pr_info("failed to dump lcd regs at %x ----------> KK\n",base);
  426. #else
  427. base = base | mdss_reg_desc[0].base;
  428. if(fill_reg_log(buff, base, len*4))
  429. pr_info("failed to dump lcd regs at %x ----------> KK\n",base);
  430. #endif
  431. }
  432. }
  433. #endif
  434. #ifdef __KERNEL__
  435. spin_unlock_irqrestore(&xlock, flags);
  436. mdss_mdp_clk_ctrl(MDP_BLOCK_POWER_OFF, false);
  437. #else
  438. //Switch off clock
  439. #endif
  440. pr_debug("total mdp regs: %d\n",mdp_reg_count);
  441. }
  442. void dlog(struct _dlogdebug *desc, ...)
  443. {
  444. va_list argp;
  445. static u32 *buff = NULL;
  446. unsigned long flags;
  447. int ev_idx = desc - __start___dlog;
  448. int para_count = 0;
  449. int temp_main_idx = 0 ;
  450. #ifdef __KERNEL__
  451. ktime_t time;
  452. if(!debug_mdp) return;
  453. spin_lock_irqsave(&xlock, flags);
  454. if(read_ongoing) {
  455. spin_unlock_irqrestore(&xlock, flags);
  456. return;
  457. }
  458. #else
  459. time_t time;
  460. #endif
  461. if(debug_mdp && buff == NULL ) {
  462. buff= (u32 *)((char *)debug_mdp + (sizeof(struct debug_mdp) + debug_mdp->log_buff.offset));
  463. }
  464. else if(!debug_mdp){
  465. #ifdef __KERNEL__
  466. spin_unlock_irqrestore(&xlock, flags);
  467. #endif
  468. pr_info("Debug Module Not Initialized\n");
  469. return;
  470. }
  471. //Store the reference of 32bit header
  472. temp_main_idx = debug_mdp->log_buff.last;
  473. inc_put(buff,(current->pid<<16)|(ev_idx<<5));
  474. #ifdef __KERNEL__
  475. time = ktime_get();
  476. inc_put(buff,(u32)ktime_to_us(time));
  477. #else
  478. time = current_time();
  479. inc_put(buff,(u32)time);
  480. #endif
  481. va_start(argp,(u32) desc);
  482. do{
  483. u32 l = va_arg(argp, u32);
  484. // pr_info("[DLOG],%pS: %x\n",__builtin_return_address(0),l);
  485. if(l==0xBABEBABE)
  486. break;
  487. inc_put(buff,l);
  488. para_count++;
  489. }while(1);
  490. va_end(argp);
  491. para_count += 2;// 1 for main indx, 1 for time
  492. //Put the length
  493. buff[temp_main_idx] = buff[temp_main_idx] | (para_count & 0x1F); //5 bits for length
  494. #ifdef __KERNEL__
  495. spin_unlock_irqrestore(&xlock, flags);
  496. #endif
  497. }
  498. #ifdef __KERNEL__
  499. static unsigned long read_byte;
  500. /*
  501. * Called when a process tries to open the device file, like
  502. * "cat /dev/mycharfile"
  503. */
  504. static int device_open(struct inode *inode, struct file *file)
  505. {
  506. read_byte = 0;
  507. printk(" Dlogger Opened>>>\n");
  508. return 0;
  509. }
  510. static enum { DLOG_BUFFER_READING, KLOG_BUFFER_READING, SECLOG_BUFFER_READING, }read_state;
  511. int dlog_read(struct file *filp, char __user *buf, size_t count,
  512. loff_t *f_pos)
  513. {
  514. ssize_t retval = 0;
  515. unsigned long flags;
  516. int ret = 0;
  517. if(*f_pos == 0) {
  518. pr_info("===DLogger Header=====\n");
  519. pr_info(" DUMP SIZE: %u, read: %lu\n",debug_mdp->size,read_byte);
  520. pr_info("[0] first: %d last: %d off: %d size: %d\n",
  521. debug_mdp->log_buff.first, debug_mdp->log_buff.last,
  522. debug_mdp->log_buff.offset, debug_mdp->log_buff.len);
  523. pr_info("[1] first: %d last: %d off: %d size: %d\n",
  524. debug_mdp->event_desc.first, debug_mdp->event_desc.last,
  525. debug_mdp->event_desc.offset, debug_mdp->event_desc.len);
  526. pr_info("[2] first: %d last: %d off: %d size: %d\n",
  527. debug_mdp->reg_log.first, debug_mdp->reg_log.last,
  528. debug_mdp->reg_log.offset, debug_mdp->reg_log.len);
  529. pr_info("[3] first: %d last: %d off: %d size: %d\n",
  530. debug_mdp->clock_state.first, debug_mdp->clock_state.last,
  531. debug_mdp->clock_state.offset, debug_mdp->clock_state.len);
  532. #ifdef __KERNEL__
  533. spin_lock_irqsave(&xlock, flags);
  534. read_ongoing = 1;
  535. debug_mdp->reserv = CONFIG_NR_CPUS;
  536. #ifdef CONFIG_SEC_DEBUG_SCHED_LOG
  537. debug_mdp->klog_size =secdbg_krait->log.size;
  538. debug_mdp->seclog_size = 0;
  539. pr_debug("Klog Size: %d SecLog Size: %d\n", debug_mdp->klog_size, debug_mdp->seclog_size);
  540. #endif
  541. spin_unlock_irqrestore(&xlock, flags);
  542. #endif
  543. }
  544. if(read_state == DLOG_BUFFER_READING && read_byte >= debug_mdp->size ) {
  545. #ifdef __KERNEL__
  546. spin_lock_irqsave(&xlock, flags);
  547. read_ongoing = 0;
  548. debug_mdp->reg_log.first = 0;
  549. debug_mdp->reg_log.last = 0;
  550. debug_mdp->clock_state.first = 0;
  551. debug_mdp->clock_state.last = 0;
  552. read_state = KLOG_BUFFER_READING;
  553. spin_unlock_irqrestore(&xlock, flags);
  554. #endif
  555. #ifndef CONFIG_SEC_DEBUG_SCHED_LOG
  556. read_state = DLOG_BUFFER_READING;
  557. read_byte = 0;
  558. pr_info("Reading complete...\n");
  559. return 0;
  560. #endif
  561. }
  562. if(read_state == DLOG_BUFFER_READING)
  563. {
  564. pr_debug("(count + *f_pos - 1):=%llu\n",(count + *f_pos - 1));
  565. retval = ((count + *f_pos - 1)< debug_mdp->size)? count-1:(debug_mdp->size - *f_pos);
  566. ret = copy_to_user(buf, (char *)debug_mdp + *f_pos, retval);
  567. if(ret < 0)
  568. return 0;
  569. read_byte += retval;
  570. *f_pos = read_byte;
  571. pr_debug("-read: %lu, fpos = %llu :count = %d:retval: %d: dump_size: %d\n",read_byte,*f_pos,count,retval,debug_mdp->size);
  572. }
  573. #ifdef CONFIG_SEC_DEBUG_SCHED_LOG
  574. if(read_state == KLOG_BUFFER_READING && read_byte >= debug_mdp->size + debug_mdp->klog_size ) {
  575. read_state = DLOG_BUFFER_READING;
  576. read_byte = 0;
  577. pr_info("Reading complete...\n");
  578. }
  579. if(read_state == KLOG_BUFFER_READING)
  580. {
  581. int start = *f_pos - debug_mdp->size;
  582. retval = ((count + *f_pos - 1)< debug_mdp->size +debug_mdp->klog_size)? count-1:(debug_mdp->size +debug_mdp->klog_size- *f_pos);
  583. ret = copy_to_user(buf, (char *)__va(secdbg_krait->log.log_paddr) + start, retval);
  584. if(ret < 0)
  585. return 0;
  586. read_byte += retval;
  587. *f_pos = read_byte;
  588. }
  589. #endif
  590. return retval;
  591. }
  592. static int reg_open(struct inode *inode, struct file *file)
  593. {
  594. pr_info("Register dump opened\n");
  595. return 0;
  596. }
  597. int reg_read(struct file *filp, char __user *buf, size_t count,
  598. loff_t *f_pos)
  599. {
  600. dump_clock_state();
  601. klog();
  602. return 0;
  603. }
  604. static const struct file_operations reg_fops = {
  605. .open = reg_open,
  606. .release = NULL,
  607. .read = reg_read,
  608. .write = NULL,
  609. };
  610. static const struct file_operations dlog_fops = {
  611. .open = device_open,
  612. .release = NULL,
  613. .read = dlog_read,
  614. .write = NULL,
  615. };
  616. static int __init setup_debug_memory(char *mode)
  617. {
  618. __debug_mdp_phys = 0;
  619. if(!sscanf(mode,"%x", &(__debug_mdp_phys)))
  620. pr_err("Error parsing display logging mem base:%s\n",mode);
  621. else
  622. pr_info("Display Logging base: %x\n",__debug_mdp_phys);
  623. return 1;
  624. }
  625. /* Get the size of description section needed */
  626. static int get_desc_size(void){
  627. int len = __stop___dlog - __start___dlog;
  628. int i = 0;
  629. int str_len = 0;
  630. for(; i < len; i++) {
  631. struct _dlogdebug *ptr = __start___dlog + i;
  632. str_len += strlen(ptr->filename) + 1;
  633. str_len += strlen(ptr->format) + 1;
  634. str_len += strlen(ptr->function) + 1;
  635. str_len += 4; //flags + lineno
  636. }
  637. return str_len;
  638. }
  639. /* Initialize event descriptor section */
  640. static void init_event_desc(char *buff,int length){
  641. int len = __stop___dlog - __start___dlog;
  642. int i = 0;
  643. int str_len = 0;
  644. memset(buff,0x0,length);
  645. for(; (i < len && str_len < length); i++) {
  646. struct _dlogdebug *ptr = __start___dlog + i;
  647. int *line_ptr = 0;
  648. str_len += (snprintf(buff+str_len,length-str_len,"%s", ptr->filename) + 1);
  649. str_len += (snprintf(buff+str_len,length-str_len,"%s", ptr->format) + 1);
  650. str_len += (snprintf(buff+str_len,length-str_len,"%s", ptr->function) + 1);
  651. line_ptr = (int *) (buff + str_len);
  652. *line_ptr = ptr->lineno | ptr->flags<<24;
  653. str_len += 4; //flags + lineno
  654. if(str_len >= length) break;
  655. }
  656. }
  657. int dlog_sec_get_debug_level(void) {
  658. return sec_debug_level;
  659. }
  660. __setup("lcd_dlog_base=", setup_debug_memory);
  661. #endif
  662. #ifdef __KERNEL__
  663. static int __init mdss_debug_init(void) {
  664. #else
  665. int mdss_debug_init(void) {
  666. #endif
  667. u32 log_buff_len = DLOG_BUFFER_SIZE_SHIP*1024 - sizeof(struct debug_mdp);
  668. u32 event_desc_len = 0;
  669. u32 reg_log_len = 0;
  670. u32 clock_state_len = 0;
  671. struct dentry *dent = debugfs_create_dir("dlog", NULL);
  672. #if defined(CONFIG_SEC_DEBUG)
  673. sec_debug_level = sec_debug_is_enabled();
  674. #endif
  675. if(sec_debug_level){
  676. log_buff_len = DLOG_BUFFER_SIZE*1024;
  677. event_desc_len = get_desc_size();
  678. reg_log_len = REGISTER_LOG_LEN*1024;
  679. clock_state_len = CLOCK_DUMP_LEN*1024;
  680. }
  681. dump_size = log_buff_len + event_desc_len+ reg_log_len \
  682. +clock_state_len+ sizeof(struct debug_mdp);
  683. #ifdef __KERNEL__
  684. if(__debug_mdp_phys){
  685. debug_mdp = ioremap_nocache(__debug_mdp_phys,CARVEOUT_MEM_SIZE);
  686. pr_info("Using MDSS debug memory from LK:Phys: %x, VA: %pK\n",__debug_mdp_phys,debug_mdp);
  687. }
  688. if(!__debug_mdp_phys || !debug_mdp) {
  689. debug_mdp = kzalloc (dump_size, GFP_KERNEL);
  690. if(!debug_mdp) {
  691. pr_err("Memory allocation failed for MDP DEBUG MODULE\n");
  692. return -1;
  693. }
  694. }
  695. //debug_mdp->log_buff.offset = 0;
  696. pr_info(KERN_INFO "MDP debug init:debug_mdp: %pK \n",debug_mdp);
  697. #else
  698. debug_mdp = __debug_mdp_phys;
  699. memset(debug_mdp,0x0,CARVEOUT_MEM_SIZE);
  700. #endif
  701. if(!__debug_mdp_phys || (__debug_mdp_phys == (u32)debug_mdp)){
  702. /* Initialize buffer header */
  703. debug_mdp->log_buff.len = log_buff_len;
  704. debug_mdp->event_desc.offset = debug_mdp->log_buff.offset + debug_mdp->log_buff.len;
  705. debug_mdp->event_desc.len = event_desc_len;
  706. debug_mdp->reg_log.offset = debug_mdp->event_desc.offset + debug_mdp->event_desc.len;
  707. debug_mdp->reg_log.len = reg_log_len;
  708. debug_mdp->clock_state.offset = debug_mdp->reg_log.offset + debug_mdp->reg_log.len;
  709. debug_mdp->clock_state.len = clock_state_len;
  710. debug_mdp->size = dump_size;
  711. pr_info("size:%d",sizeof(debug_mdp->size));
  712. strncpy(debug_mdp->marker,"*#$$_START_OF_MDP_DEBUG_DUMP##$", sizeof("*#$$_START_OF_MDP_DEBUG_DUMP##$"));
  713. if(debug_mdp !=NULL)
  714. init_event_desc((char *)debug_mdp + (sizeof(struct debug_mdp) + debug_mdp->event_desc.offset), debug_mdp->event_desc.len);
  715. }else {
  716. pr_info("===DLogger Header=====\n");
  717. pr_info(" DUMP SIZE: %u\n",debug_mdp->size);
  718. pr_info("[0] first: %d last: %d off: %d size: %d\n",
  719. debug_mdp->log_buff.first, debug_mdp->log_buff.last,
  720. debug_mdp->log_buff.offset, debug_mdp->log_buff.len);
  721. pr_info("[1] first: %d last: %d off: %d size: %d\n",
  722. debug_mdp->event_desc.first, debug_mdp->event_desc.last,
  723. debug_mdp->event_desc.offset, debug_mdp->event_desc.len);
  724. pr_info("[2] first: %d last: %d off: %d size: %d\n",
  725. debug_mdp->reg_log.first, debug_mdp->reg_log.last,
  726. debug_mdp->reg_log.offset, debug_mdp->reg_log.len);
  727. pr_info("[2] first: %d last: %d off: %d size: %d\n",
  728. debug_mdp->clock_state.first, debug_mdp->clock_state.last,
  729. debug_mdp->clock_state.offset, debug_mdp->clock_state.len);
  730. }
  731. #ifdef __KERNEL__
  732. spin_lock_init(&xlock);
  733. {
  734. if(sec_debug_level) {
  735. init_clock_va();
  736. vHWIO_GCC_DEBUG_CLK_CTL_ADDR = ioremap((0xfc401880),4);
  737. vHWIO_MMSS_DEBUG_CLK_CTL_ADDR = ioremap(0xfd8c0900,4);
  738. vHWIO_GCC_CLOCK_FRQ_MEASURE_STATUS_ADDR = ioremap(0xfc401888,4);
  739. vHWIO_GCC_CLOCK_FRQ_MEASURE_CTL_ADDR = ioremap(0xfc401884,4);
  740. vHWIO_GCC_XO_DIV4_CBCR_ADDR = ioremap(0xfc4010c8,4);
  741. if (debugfs_create_file("reg_dump", 0644, dent, 0, &reg_fops)
  742. == NULL) {
  743. printk(KERN_ERR "%s(%d): debugfs_create_file: debug fail\n",
  744. __FILE__, __LINE__);
  745. return -1;
  746. }
  747. pr_info("Init Section: %pK",__start___dlog);
  748. }
  749. if (debugfs_create_file("dlogger", 0644, dent, 0, &dlog_fops)
  750. == NULL) {
  751. printk(KERN_ERR "%s(%d): debugfs_create_file: debug fail\n",
  752. __FILE__, __LINE__);
  753. return -1;
  754. }
  755. }
  756. #endif
  757. return 0;
  758. }
  759. #ifdef __KERNEL__
  760. arch_initcall(mdss_debug_init);
  761. #endif