1 #include <linux/string.h>
2 #include <linux/time.h>
3 #include <linux/uaccess.h>
5 #include <linux/vmalloc.h>
6 #include <linux/sched.h>
7 #include <linux/debugfs.h>
8 #include <linux/wait.h>
9 #include <mach/mt_typedefs.h>
11 #include "disp_drv_log.h"
19 struct MTKFB_MMP_Events_t MTKFB_MMP_Events
;
21 extern LCM_DRIVER
*lcm_drv
;
22 extern unsigned int EnableVSyncLog
;
24 #define MTKFB_DEBUG_FS_CAPTURE_LAYER_CONTENT_SUPPORT
26 // ---------------------------------------------------------------------------
27 // External variable declarations
28 // ---------------------------------------------------------------------------
30 extern long tpd_last_down_time
;
31 extern int tpd_start_profiling
;
32 extern void mtkfb_log_enable(int enable
);
33 extern void disp_log_enable(int enable
);
34 extern void mtkfb_vsync_log_enable(int enable
);
35 extern void mtkfb_capture_fb_only(bool enable
);
36 extern void esd_recovery_pause(BOOL en
);
37 extern int mtkfb_set_backlight_mode(unsigned int mode
);
38 extern void mtkfb_pan_disp_test(void);
39 extern void mtkfb_show_sem_cnt(void);
40 extern void mtkfb_hang_test(bool en
);
41 extern void mtkfb_switch_normal_to_factory(void);
42 extern void mtkfb_switch_factory_to_normal(void);
43 extern void set_ovlengine_debug_level(int level
);
44 extern int fb_pattern_en(int enable
);
46 extern unsigned int gCaptureLayerEnable
;
47 extern unsigned int gCaptureLayerDownX
;
48 extern unsigned int gCaptureLayerDownY
;
50 extern unsigned int gCaptureOvlThreadEnable
;
51 extern unsigned int gCaptureOvlDownX
;
52 extern unsigned int gCaptureOvlDownY
;
53 extern struct task_struct
*captureovl_task
;
55 extern unsigned int gCaptureFBEnable
;
56 extern unsigned int gCaptureFBDownX
;
57 extern unsigned int gCaptureFBDownY
;
58 extern unsigned int gCaptureFBPeriod
;
59 extern struct task_struct
*capturefb_task
;
60 extern wait_queue_head_t gCaptureFBWQ
;
62 #ifdef MTKFB_DEBUG_FS_CAPTURE_LAYER_CONTENT_SUPPORT
63 struct dentry
*mtkfb_layer_dbgfs
[DDP_OVL_LAYER_MUN
];
65 extern OVL_CONFIG_STRUCT cached_layer_config
[DDP_OVL_LAYER_MUN
];
71 } MTKFB_LAYER_DBG_OPTIONS
;
73 MTKFB_LAYER_DBG_OPTIONS mtkfb_layer_dbg_opt
[DDP_OVL_LAYER_MUN
];
76 extern LCM_DRIVER
*lcm_drv
;
78 static char debug_buffer
[2048];
80 #if defined(MTK_OVERLAY_ENGINE_SUPPORT)
81 extern unsigned int gDumpOVLEnable
;
84 // ---------------------------------------------------------------------------
86 // ---------------------------------------------------------------------------
88 static const long int DEFAULT_LOG_FPS_WND_SIZE
= 30;
91 unsigned int en_fps_log
;
92 unsigned int en_touch_latency_log
;
93 unsigned int log_fps_wnd_size
;
94 unsigned int force_dis_layers
;
97 static DBG_OPTIONS dbg_opt
= {0};
99 static char STR_HELP
[] =
102 " echo [ACTION]... > /d/mtkfb\n"
105 " mtkfblog:[on|off]\n"
106 " enable/disable [MTKFB] log\n"
108 " displog:[on|off]\n"
109 " enable/disable [DISP] log\n"
111 " mtkfb_vsynclog:[on|off]\n"
112 " enable/disable [VSYNC] log\n"
115 " enable/disable above all log\n"
118 " enable fps and lcd update time log\n"
121 " enable touch latency log\n"
124 " dump lcd layer information\n"
127 " enter suspend mode\n"
130 " leave suspend mode\n"
132 " lcm:[on|off|init]\n"
133 " power on/off lcm\n"
135 " cabc:[ui|mov|still]\n"
136 " cabc mode, UI/Moving picture/Still picture\n"
139 " power on/off display engine\n"
142 " turn on/off tearing-free control\n"
145 " turn on/off tv-out\n"
147 " tvsys:[ntsc|pal]\n"
148 " switch tv system\n"
150 " reg:[lcd|dpi|dsi|tvc|tve]\n"
151 " dump hw register values\n"
153 " cpfbonly:[on|off]\n"
154 " capture UI layer only on/off\n"
157 " esd kthread on/off\n"
158 " HQA:[NormalToFactory|FactoryToNormal]\n"
159 " for HQA requirement\n"
162 " Register MMProfile events\n"
164 " dump_fb:[on|off[,down_sample_x[,down_sample_y,[delay]]]]\n"
165 " Start/end to capture framebuffer every delay(ms)\n"
167 " dsc:rd:Addr ex. dsc:rd:0x11 read lcm addr=0x11 \n"
168 " dsc:wt:addr:val ex. dsc:wt:0x11:0x22 write lcm addr|cmd =0x11 value|paramer = 0x22\n"
169 " dsc:rw:addr:val:loop ex. dsc:wt:0x11:0x22 write lcm addr =0x11 value = 0x22,and then read back\n"
170 " compare the value and the value read back \n"
171 " if different, break,and print the current times. \n"
173 " dump_ovl:[on|off[,down_sample_x[,down_sample_y]]]\n"
174 " Start to capture OVL only once\n"
176 " dump_layer:[on|off[,down_sample_x[,down_sample_y]]]\n"
177 " Start/end to capture current enabled OVL layer every frame\n"
181 // ---------------------------------------------------------------------------
182 // Information Dump Routines
183 // ---------------------------------------------------------------------------
185 void init_mtkfb_mmp_events(void)
187 if (MTKFB_MMP_Events
.MTKFB
== 0)
189 MTKFB_MMP_Events
.MTKFB
= MMProfileRegisterEvent(MMP_RootEvent
, "MTKFB");
190 MTKFB_MMP_Events
.PanDisplay
= MMProfileRegisterEvent(MTKFB_MMP_Events
.MTKFB
, "PanDisplay");
191 MTKFB_MMP_Events
.SetOverlayLayer
= MMProfileRegisterEvent(MTKFB_MMP_Events
.MTKFB
, "SetOverlayLayer");
192 MTKFB_MMP_Events
.SetOverlayLayers
= MMProfileRegisterEvent(MTKFB_MMP_Events
.MTKFB
, "SetOverlayLayers");
193 MTKFB_MMP_Events
.TrigOverlayOut
= MMProfileRegisterEvent(MTKFB_MMP_Events
.MTKFB
, "TrigOverlayOut");
194 MTKFB_MMP_Events
.UpdateScreenImpl
= MMProfileRegisterEvent(MTKFB_MMP_Events
.MTKFB
, "UpdateScreenImpl");
195 MTKFB_MMP_Events
.VSync
= MMProfileRegisterEvent(MTKFB_MMP_Events
.MTKFB
, "VSync");
196 MTKFB_MMP_Events
.UpdateConfig
= MMProfileRegisterEvent(MTKFB_MMP_Events
.MTKFB
, "UpdateConfig");
197 MTKFB_MMP_Events
.EsdCheck
= MMProfileRegisterEvent(MTKFB_MMP_Events
.UpdateConfig
, "EsdCheck");
198 MTKFB_MMP_Events
.ConfigOVL
= MMProfileRegisterEvent(MTKFB_MMP_Events
.UpdateConfig
, "ConfigOVL");
199 MTKFB_MMP_Events
.ConfigAAL
= MMProfileRegisterEvent(MTKFB_MMP_Events
.UpdateConfig
, "ConfigAAL");
200 MTKFB_MMP_Events
.ConfigMemOut
= MMProfileRegisterEvent(MTKFB_MMP_Events
.UpdateConfig
, "ConfigMemOut");
201 MTKFB_MMP_Events
.ScreenUpdate
= MMProfileRegisterEvent(MTKFB_MMP_Events
.MTKFB
, "ScreenUpdate");
202 MTKFB_MMP_Events
.CaptureFramebuffer
= MMProfileRegisterEvent(MTKFB_MMP_Events
.MTKFB
, "CaptureFB");
203 MTKFB_MMP_Events
.RegUpdate
= MMProfileRegisterEvent(MTKFB_MMP_Events
.MTKFB
, "RegUpdate");
204 MTKFB_MMP_Events
.EarlySuspend
= MMProfileRegisterEvent(MTKFB_MMP_Events
.MTKFB
, "EarlySuspend");
205 MTKFB_MMP_Events
.DispDone
= MMProfileRegisterEvent(MTKFB_MMP_Events
.MTKFB
, "DispDone");
206 MTKFB_MMP_Events
.DSICmd
= MMProfileRegisterEvent(MTKFB_MMP_Events
.MTKFB
, "DSICmd");
207 MTKFB_MMP_Events
.DSIIRQ
= MMProfileRegisterEvent(MTKFB_MMP_Events
.MTKFB
, "DSIIrq");
208 MTKFB_MMP_Events
.WaitVSync
= MMProfileRegisterEvent(MTKFB_MMP_Events
.MTKFB
, "WaitVSync");
209 MTKFB_MMP_Events
.LayerDump
= MMProfileRegisterEvent(MTKFB_MMP_Events
.MTKFB
, "LayerDump");
210 MTKFB_MMP_Events
.Layer
[0] = MMProfileRegisterEvent(MTKFB_MMP_Events
.LayerDump
, "Layer0");
211 MTKFB_MMP_Events
.Layer
[1] = MMProfileRegisterEvent(MTKFB_MMP_Events
.LayerDump
, "Layer1");
212 MTKFB_MMP_Events
.Layer
[2] = MMProfileRegisterEvent(MTKFB_MMP_Events
.LayerDump
, "Layer2");
213 MTKFB_MMP_Events
.Layer
[3] = MMProfileRegisterEvent(MTKFB_MMP_Events
.LayerDump
, "Layer3");
214 MTKFB_MMP_Events
.OvlDump
= MMProfileRegisterEvent(MTKFB_MMP_Events
.MTKFB
, "OvlDump");
215 MTKFB_MMP_Events
.FBDump
= MMProfileRegisterEvent(MTKFB_MMP_Events
.MTKFB
, "FBDump");
216 MTKFB_MMP_Events
.DSIRead
= MMProfileRegisterEvent(MTKFB_MMP_Events
.MTKFB
, "DSIRead");
217 MTKFB_MMP_Events
.GetLayerInfo
= MMProfileRegisterEvent(MTKFB_MMP_Events
.MTKFB
, "GetLayerInfo");
218 MTKFB_MMP_Events
.LayerInfo
[0] = MMProfileRegisterEvent(MTKFB_MMP_Events
.GetLayerInfo
, "LayerInfo0");
219 MTKFB_MMP_Events
.LayerInfo
[1] = MMProfileRegisterEvent(MTKFB_MMP_Events
.GetLayerInfo
, "LayerInfo1");
220 MTKFB_MMP_Events
.LayerInfo
[2] = MMProfileRegisterEvent(MTKFB_MMP_Events
.GetLayerInfo
, "LayerInfo2");
221 MTKFB_MMP_Events
.LayerInfo
[3] = MMProfileRegisterEvent(MTKFB_MMP_Events
.GetLayerInfo
, "LayerInfo3");
222 MTKFB_MMP_Events
.IOCtrl
= MMProfileRegisterEvent(MTKFB_MMP_Events
.MTKFB
, "IOCtrl");
223 MTKFB_MMP_Events
.Debug
= MMProfileRegisterEvent(MTKFB_MMP_Events
.MTKFB
, "Debug");
225 MTKFB_MMP_Events
.QueueWork
= MMProfileRegisterEvent(MTKFB_MMP_Events
.MTKFB
, "QueueWork");
226 MTKFB_MMP_Events
.WrokHandler
= MMProfileRegisterEvent(MTKFB_MMP_Events
.MTKFB
, "WrokHandler");
227 MTKFB_MMP_Events
.FenceContrl
= MMProfileRegisterEvent(MTKFB_MMP_Events
.MTKFB
, "FenceContrl");
228 MTKFB_MMP_Events
.HWCFence
[0] = MMProfileRegisterEvent(MTKFB_MMP_Events
.FenceContrl
, "HWCFence0");
229 MTKFB_MMP_Events
.HWCFence
[1] = MMProfileRegisterEvent(MTKFB_MMP_Events
.FenceContrl
, "HWCFence1");
230 MTKFB_MMP_Events
.HWCFence
[2] = MMProfileRegisterEvent(MTKFB_MMP_Events
.FenceContrl
, "HWCFence2");
231 MTKFB_MMP_Events
.HWCFence
[3] = MMProfileRegisterEvent(MTKFB_MMP_Events
.FenceContrl
, "HWCFence3");
232 MTKFB_MMP_Events
.FBFence
= MMProfileRegisterEvent(MTKFB_MMP_Events
.FenceContrl
, "FBFence");
233 MTKFB_MMP_Events
.FBTimeline
= MMProfileRegisterEvent(MTKFB_MMP_Events
.FenceContrl
, "FBTimeline");
235 MTKFB_MMP_Events
.OVLEngine
= MMProfileRegisterEvent(MTKFB_MMP_Events
.MTKFB
, "OVLEngine");
236 MTKFB_MMP_Events
.Instance_status
[0] = MMProfileRegisterEvent(MTKFB_MMP_Events
.OVLEngine
, "Instance0_status");
237 MTKFB_MMP_Events
.Instance_status
[1] = MMProfileRegisterEvent(MTKFB_MMP_Events
.OVLEngine
, "Instance1_status");
238 MTKFB_MMP_Events
.Instance_status
[2] = MMProfileRegisterEvent(MTKFB_MMP_Events
.OVLEngine
, "Instance2_status");
239 MTKFB_MMP_Events
.OVLEngine_ovlwdma_status
= MMProfileRegisterEvent(MTKFB_MMP_Events
.OVLEngine
, "OVLEngine_ovlwdma_status");
240 MTKFB_MMP_Events
.OVLEngine_rdma_status
= MMProfileRegisterEvent(MTKFB_MMP_Events
.OVLEngine
, "OVLEngine_rdma_status");
241 MTKFB_MMP_Events
.OVLEngine_rdma_hang
= MMProfileRegisterEvent(MTKFB_MMP_Events
.OVLEngine
, "OVLEngine_rdma_hang");
242 MTKFB_MMP_Events
.OVLEngine_fence
[0] = MMProfileRegisterEvent(MTKFB_MMP_Events
.OVLEngine
, "Instance0_fence");
243 MTKFB_MMP_Events
.OVLEngine_fence
[1] = MMProfileRegisterEvent(MTKFB_MMP_Events
.OVLEngine
, "Instance1_fence");
244 MTKFB_MMP_Events
.OVLEngine_fence
[2] = MMProfileRegisterEvent(MTKFB_MMP_Events
.OVLEngine
, "Instance2_fence");
245 MTKFB_MMP_Events
.OVLEngine_timeline
[0] = MMProfileRegisterEvent(MTKFB_MMP_Events
.OVLEngine
, "Instance0_timeline");
246 MTKFB_MMP_Events
.OVLEngine_timeline
[1] = MMProfileRegisterEvent(MTKFB_MMP_Events
.OVLEngine
, "Instance1_timeline");
247 MTKFB_MMP_Events
.OVLEngine_timeline
[2] = MMProfileRegisterEvent(MTKFB_MMP_Events
.OVLEngine
, "Instance2_timeline");
248 MTKFB_MMP_Events
.OVLEngine_API
= MMProfileRegisterEvent(MTKFB_MMP_Events
.OVLEngine
, "OVLEngine_API");
249 MTKFB_MMP_Events
.OVLEngine_CORE
= MMProfileRegisterEvent(MTKFB_MMP_Events
.OVLEngine
, "OVLEngine_CORE");
250 MTKFB_MMP_Events
.OVLEngine_HW
= MMProfileRegisterEvent(MTKFB_MMP_Events
.OVLEngine
, "OVLEngine_HW");
251 MTKFB_MMP_Events
.OVLEngine_IOCTL
= MMProfileRegisterEvent(MTKFB_MMP_Events
.OVLEngine
, "OVLEngine_IOCTL");
253 MTKFB_MMP_Events
.GetInstance
= MMProfileRegisterEvent(MTKFB_MMP_Events
.OVLEngine_API
, "GetInstance");
254 MTKFB_MMP_Events
.ReleaseInstance
= MMProfileRegisterEvent(MTKFB_MMP_Events
.OVLEngine_API
, "ReleaseInstance");
255 MTKFB_MMP_Events
.Get_layer_info
= MMProfileRegisterEvent(MTKFB_MMP_Events
.OVLEngine_API
, "Get_layer_info");
256 MTKFB_MMP_Events
.Set_layer_info
= MMProfileRegisterEvent(MTKFB_MMP_Events
.OVLEngine_API
, "Set_layer_info");
257 MTKFB_MMP_Events
.Get_Ovl_layer_info
= MMProfileRegisterEvent(MTKFB_MMP_Events
.OVLEngine_API
, "Get_Ovl_layer_info");
258 MTKFB_MMP_Events
.Set_Overlayed_Buffer
= MMProfileRegisterEvent(MTKFB_MMP_Events
.OVLEngine_API
, "Set_Overlayed_Buffer");
259 MTKFB_MMP_Events
.Trigger_Overlay
= MMProfileRegisterEvent(MTKFB_MMP_Events
.OVLEngine_API
, "Trigger_Overlay");
260 MTKFB_MMP_Events
.Get_Dirty_info
= MMProfileRegisterEvent(MTKFB_MMP_Events
.OVLEngine_API
, "Get_Dirty_info");
261 MTKFB_MMP_Events
.Set_Path_Info
= MMProfileRegisterEvent(MTKFB_MMP_Events
.OVLEngine_API
, "Set_Path_Info");
262 MTKFB_MMP_Events
.Sync_Captured_layer_info
= MMProfileRegisterEvent(MTKFB_MMP_Events
.OVLEngine_API
, "Sync_Captured_layer_info");
263 MTKFB_MMP_Events
.Dump_layer_info
= MMProfileRegisterEvent(MTKFB_MMP_Events
.OVLEngine_API
, "Dump_layer_info");
264 MTKFB_MMP_Events
.Trigger_Overlay_Handler
= MMProfileRegisterEvent(MTKFB_MMP_Events
.OVLEngine_API
, "Trigger_Overlay_Handler");
265 MTKFB_MMP_Events
.Trigger_Overlay_Fence
= MMProfileRegisterEvent(MTKFB_MMP_Events
.OVLEngine_API
, "Trigger_Overlay_Fence");
266 MTKFB_MMP_Events
.Get_Fence_Fd
= MMProfileRegisterEvent(MTKFB_MMP_Events
.OVLEngine_API
, "Get_Fence_Fd");
268 MTKFB_MMP_Events
.Update_kthread
= MMProfileRegisterEvent(MTKFB_MMP_Events
.OVLEngine_CORE
, "Update_kthread");
269 MTKFB_MMP_Events
.wake_up_ovl_engine_thread
= MMProfileRegisterEvent(MTKFB_MMP_Events
.OVLEngine_CORE
, "wake_up_ovl_engine_thread");
270 MTKFB_MMP_Events
.interrupt_handler
= MMProfileRegisterEvent(MTKFB_MMP_Events
.OVLEngine_CORE
, "interrupt_handler");
272 MTKFB_MMP_Events
.hw_set_params
= MMProfileRegisterEvent(MTKFB_MMP_Events
.OVLEngine_HW
, "hw_set_params");
273 MTKFB_MMP_Events
.hw_ovl_wdma_irq_handler
= MMProfileRegisterEvent(MTKFB_MMP_Events
.OVLEngine_HW
, "hw_ovl_wdma_irq_handler");
274 MTKFB_MMP_Events
.hw_ovl_rdma_irq_handler
= MMProfileRegisterEvent(MTKFB_MMP_Events
.OVLEngine_HW
, "hw_ovl_rdma_irq_handler");
275 MTKFB_MMP_Events
.rdma0_irq_handler
= MMProfileRegisterEvent(MTKFB_MMP_Events
.OVLEngine_HW
, "rdma0_irq_handler");
276 MTKFB_MMP_Events
.trigger_hw_overlay
= MMProfileRegisterEvent(MTKFB_MMP_Events
.OVLEngine_HW
, "trigger_hw_overlay");
277 MTKFB_MMP_Events
.trigger_hw_overlay_decouple
= MMProfileRegisterEvent(MTKFB_MMP_Events
.OVLEngine_HW
, "trigger_hw_overlay_decouple");
278 MTKFB_MMP_Events
.trigger_hw_overlay_couple
= MMProfileRegisterEvent(MTKFB_MMP_Events
.OVLEngine_HW
, "trigger_hw_overlay_couple");
279 MTKFB_MMP_Events
.config_overlay
= MMProfileRegisterEvent(MTKFB_MMP_Events
.OVLEngine_HW
, "config_overlay");
280 MTKFB_MMP_Events
.direct_link_overlay
= MMProfileRegisterEvent(MTKFB_MMP_Events
.OVLEngine_HW
, "direct_link_overlay");
281 MTKFB_MMP_Events
.indirect_link_overlay
= MMProfileRegisterEvent(MTKFB_MMP_Events
.OVLEngine_HW
, "indirect_link_overlay");
282 MTKFB_MMP_Events
.set_overlay_to_buffer
= MMProfileRegisterEvent(MTKFB_MMP_Events
.OVLEngine_HW
, "set_overlay_to_buffer");
283 MTKFB_MMP_Events
.dumpallinfo
= MMProfileRegisterEvent(MTKFB_MMP_Events
.OVLEngine_HW
, "dumpallinfo");
284 MTKFB_MMP_Events
.hw_mva_map
= MMProfileRegisterEvent(MTKFB_MMP_Events
.OVLEngine_HW
, "hw_mva_map");
285 MTKFB_MMP_Events
.hw_mva_unmap
= MMProfileRegisterEvent(MTKFB_MMP_Events
.OVLEngine_HW
, "hw_mva_unmap");
286 MTKFB_MMP_Events
.hw_reset
= MMProfileRegisterEvent(MTKFB_MMP_Events
.OVLEngine_HW
, "hw_reset");
288 MTKFB_MMP_Events
.Svp
= MMProfileRegisterEvent(MTKFB_MMP_Events
.MTKFB
, "Svp");
289 MTKFB_MMP_Events
.OVL_WDMA_IRQ_InTEE
= MMProfileRegisterEvent(MTKFB_MMP_Events
.Svp
, "OVL_WDMA_IRQ_InTEE");
290 MTKFB_MMP_Events
.OVL_WDMA_M4U_InTEE
= MMProfileRegisterEvent(MTKFB_MMP_Events
.Svp
, "OVL_WDMA_M4U_InTEE");
291 MTKFB_MMP_Events
.OVL_WDMA_ADDR_InTEE
= MMProfileRegisterEvent(MTKFB_MMP_Events
.Svp
, "OVL_WDMA_ADDR_InTEE");
292 MTKFB_MMP_Events
.RDMA0_IRQ_InTEE
= MMProfileRegisterEvent(MTKFB_MMP_Events
.Svp
, "RDMA0_IRQ_InTEE");
293 MTKFB_MMP_Events
.RDMA0_M4U_InTEE
= MMProfileRegisterEvent(MTKFB_MMP_Events
.Svp
, "RDMA0_M4U_InTEE");
294 MTKFB_MMP_Events
.RDMA0_ADDR_InTEE
= MMProfileRegisterEvent(MTKFB_MMP_Events
.Svp
, "RDMA0_ADDR_InTEE");
295 MTKFB_MMP_Events
.RDMA1_IRQ_InTEE
= MMProfileRegisterEvent(MTKFB_MMP_Events
.Svp
, "RDMA1_IRQ_InTEE");
296 MTKFB_MMP_Events
.RDMA1_M4U_InTEE
= MMProfileRegisterEvent(MTKFB_MMP_Events
.Svp
, "RDMA1_M4U_InTEE");
297 MTKFB_MMP_Events
.RDMA1_ADDR_InTEE
= MMProfileRegisterEvent(MTKFB_MMP_Events
.Svp
, "RDMA1_ADDR_InTEE");
299 MMProfileEnableEventRecursive(MTKFB_MMP_Events
.MTKFB
, 1);
303 static __inline
int is_layer_enable(unsigned int roi_ctl
, unsigned int layer
)
305 return (roi_ctl
>> (31 - layer
)) & 0x1;
308 static void dump_layer_info(void)
312 pr_info("LayerInfo in LCD driver, layer=%d,layer_en=%d, source=%d, fmt=%d, addr=0x%x, x=%d, y=%d \n\
313 w=%d, h=%d, pitch=%d, keyEn=%d, key=%d, aen=%d, alpha=%d \n ",
314 cached_layer_config
[i
].layer
, // layer
315 cached_layer_config
[i
].layer_en
,
316 cached_layer_config
[i
].source
, // data source (0=memory)
317 cached_layer_config
[i
].fmt
,
318 cached_layer_config
[i
].addr
, // addr
319 cached_layer_config
[i
].dst_x
, // x
320 cached_layer_config
[i
].dst_y
, // y
321 cached_layer_config
[i
].dst_w
, // width
322 cached_layer_config
[i
].dst_h
, // height
323 cached_layer_config
[i
].src_pitch
, //pitch, pixel number
324 cached_layer_config
[i
].keyEn
, //color key
325 cached_layer_config
[i
].key
, //color key
326 cached_layer_config
[i
].aen
, // alpha enable
327 cached_layer_config
[i
].alpha
);
332 // ---------------------------------------------------------------------------
334 // ---------------------------------------------------------------------------
337 long int current_lcd_time_us
;
338 long int current_te_delay_time_us
;
339 long int total_lcd_time_us
;
340 long int total_te_delay_time_us
;
341 long int start_time_us
;
342 long int trigger_lcd_time_us
;
343 unsigned int trigger_lcd_count
;
345 long int current_hdmi_time_us
;
346 long int total_hdmi_time_us
;
347 long int hdmi_start_time_us
;
348 long int trigger_hdmi_time_us
;
349 unsigned int trigger_hdmi_count
;
352 static FPS_LOGGER fps
= {0};
353 static FPS_LOGGER hdmi_fps
= {0};
355 static long int get_current_time_us(void)
359 return (t
.tv_sec
& 0xFFF) * 1000000 + t
.tv_usec
;
363 static void __inline
reset_fps_logger(void)
365 memset(&fps
, 0, sizeof(fps
));
368 static void __inline
reset_hdmi_fps_logger(void)
370 memset(&hdmi_fps
, 0, sizeof(hdmi_fps
));
373 void DBG_OnTriggerLcd(void)
375 if (!dbg_opt
.en_fps_log
&& !dbg_opt
.en_touch_latency_log
) return;
377 fps
.trigger_lcd_time_us
= get_current_time_us();
378 if (fps
.trigger_lcd_count
== 0) {
379 fps
.start_time_us
= fps
.trigger_lcd_time_us
;
383 void DBG_OnTriggerHDMI(void)
385 if (!dbg_opt
.en_fps_log
&& !dbg_opt
.en_touch_latency_log
) return;
387 hdmi_fps
.trigger_hdmi_time_us
= get_current_time_us();
388 if (hdmi_fps
.trigger_hdmi_count
== 0) {
389 hdmi_fps
.hdmi_start_time_us
= hdmi_fps
.trigger_hdmi_time_us
;
393 void DBG_OnTeDelayDone(void)
397 if (!dbg_opt
.en_fps_log
&& !dbg_opt
.en_touch_latency_log
) return;
399 time
= get_current_time_us();
400 fps
.current_te_delay_time_us
= (time
- fps
.trigger_lcd_time_us
);
401 fps
.total_te_delay_time_us
+= fps
.current_te_delay_time_us
;
405 void DBG_OnLcdDone(void)
409 if (!dbg_opt
.en_fps_log
&& !dbg_opt
.en_touch_latency_log
) return;
411 // deal with touch latency log
413 time
= get_current_time_us();
414 fps
.current_lcd_time_us
= (time
- fps
.trigger_lcd_time_us
);
417 if (dbg_opt
.en_touch_latency_log
&& tpd_start_profiling
) {
419 DISP_LOG_PRINT(ANDROID_LOG_INFO
, "DBG", "Touch Latency: %ld ms\n",
420 (time
- tpd_last_down_time
) / 1000);
422 DISP_LOG_PRINT(ANDROID_LOG_INFO
, "DBG", "LCD update time %ld ms (TE delay %ld ms + LCD %ld ms)\n",
423 fps
.current_lcd_time_us
/ 1000,
424 fps
.current_te_delay_time_us
/ 1000,
425 (fps
.current_lcd_time_us
- fps
.current_te_delay_time_us
) / 1000);
427 tpd_start_profiling
= 0;
431 if (!dbg_opt
.en_fps_log
) return;
435 fps
.total_lcd_time_us
+= fps
.current_lcd_time_us
;
436 ++ fps
.trigger_lcd_count
;
438 if (fps
.trigger_lcd_count
>= dbg_opt
.log_fps_wnd_size
) {
440 long int f
= fps
.trigger_lcd_count
* 100 * 1000 * 1000
441 / (time
- fps
.start_time_us
);
443 long int update
= fps
.total_lcd_time_us
* 100
444 / (1000 * fps
.trigger_lcd_count
);
446 long int te
= fps
.total_te_delay_time_us
* 100
447 / (1000 * fps
.trigger_lcd_count
);
449 long int lcd
= (fps
.total_lcd_time_us
- fps
.total_te_delay_time_us
) * 100
450 / (1000 * fps
.trigger_lcd_count
);
452 DISP_LOG_PRINT(ANDROID_LOG_INFO
, "DBG", "MTKFB FPS: %ld.%02ld, Avg. update time: %ld.%02ld ms "
453 "(TE delay %ld.%02ld ms, LCD %ld.%02ld ms)\n",
455 update
/ 100, update
% 100,
457 lcd
/ 100, lcd
% 100);
462 void DBG_OnHDMIDone(void)
466 if (!dbg_opt
.en_fps_log
&& !dbg_opt
.en_touch_latency_log
) return;
468 // deal with touch latency log
470 time
= get_current_time_us();
471 hdmi_fps
.current_hdmi_time_us
= (time
- hdmi_fps
.trigger_hdmi_time_us
);
474 if (!dbg_opt
.en_fps_log
) return;
478 hdmi_fps
.total_hdmi_time_us
+= hdmi_fps
.current_hdmi_time_us
;
479 ++ hdmi_fps
.trigger_hdmi_count
;
481 if (hdmi_fps
.trigger_hdmi_count
>= dbg_opt
.log_fps_wnd_size
) {
483 long int f
= hdmi_fps
.trigger_hdmi_count
* 100 * 1000 * 1000
484 / (time
- hdmi_fps
.hdmi_start_time_us
);
486 long int update
= hdmi_fps
.total_hdmi_time_us
* 100
487 / (1000 * hdmi_fps
.trigger_hdmi_count
);
489 DISP_LOG_PRINT(ANDROID_LOG_INFO
, "DBG", "[HDMI] FPS: %ld.%02ld, Avg. update time: %ld.%02ld ms\n",
491 update
/ 100, update
% 100);
493 reset_hdmi_fps_logger();
497 // ---------------------------------------------------------------------------
499 // ---------------------------------------------------------------------------
500 extern void mtkfb_clear_lcm(void);
501 extern void hdmi_force_init(void);
503 static void process_dbg_opt(const char *opt
)
506 char *buf
= debug_buffer
+ strlen(debug_buffer
);
508 if (0 == strncmp(opt
, "hdmion", 6))
510 // hdmi_force_init();
512 else if (0 == strncmp(opt
, "fps:", 4))
514 if (0 == strncmp(opt
+ 4, "on", 2)) {
515 dbg_opt
.en_fps_log
= 1;
516 } else if (0 == strncmp(opt
+ 4, "off", 3)) {
517 dbg_opt
.en_fps_log
= 0;
523 else if (0 == strncmp(opt
, "tl:", 3))
525 if (0 == strncmp(opt
+ 3, "on", 2)) {
526 dbg_opt
.en_touch_latency_log
= 1;
527 } else if (0 == strncmp(opt
+ 3, "off", 3)) {
528 dbg_opt
.en_touch_latency_log
= 0;
533 else if (0 == strncmp(opt
, "black", 5))
537 else if (0 == strncmp(opt
, "suspend", 4))
539 DISP_PanelEnable(FALSE
);
540 DISP_PowerEnable(FALSE
);
542 else if (0 == strncmp(opt
, "resume", 4))
544 DISP_PowerEnable(TRUE
);
545 DISP_PanelEnable(TRUE
);
547 else if (0 == strncmp(opt
, "lcm:", 4))
549 if (0 == strncmp(opt
+ 4, "on", 2)) {
550 DISP_PanelEnable(TRUE
);
551 } else if (0 == strncmp(opt
+ 4, "off", 3)) {
552 DISP_PanelEnable(FALSE
);
554 else if (0 == strncmp(opt
+ 4, "init", 4)) {
555 if (NULL
!= lcm_drv
&& NULL
!= lcm_drv
->init
) {
562 else if (0 == strncmp(opt
, "cabc:", 5))
564 if (0 == strncmp(opt
+ 5, "ui", 2)) {
565 mtkfb_set_backlight_mode(1);
566 }else if (0 == strncmp(opt
+ 5, "mov", 3)) {
567 mtkfb_set_backlight_mode(3);
568 }else if (0 == strncmp(opt
+ 5, "still", 5)) {
569 mtkfb_set_backlight_mode(2);
574 else if (0 == strncmp(opt
, "lcd:", 4))
576 if (0 == strncmp(opt
+ 4, "on", 2)) {
577 DISP_PowerEnable(TRUE
);
578 } else if (0 == strncmp(opt
+ 4, "off", 3)) {
579 DISP_PowerEnable(FALSE
);
584 else if (0 == strncmp(opt
, "vsynclog:", 9))
586 if (0 == strncmp(opt
+ 9, "on", 2))
589 } else if (0 == strncmp(opt
+ 9, "off", 3))
596 else if (0 == strncmp(opt
, "layer", 5))
600 else if(0 == strncmp(opt
, "bkl:", 4))
602 char *p
= (char *)opt
+ 4;
603 unsigned int level
= (unsigned int) simple_strtoul(p
, &p
, 10);
605 DISP_LOG_PRINT(ANDROID_LOG_INFO
, "DBG", "process_dbg_opt(), set backlight level = %d\n", level
);
606 DISP_SetBacklight(level
);
608 else if(0 == strncmp(opt
, "dither:", 7))
610 unsigned lrs
, lgs
, lbs
, dbr
, dbg
, dbb
;
611 char *p
= (char *)opt
+ 7;
613 lrs
= (unsigned int) simple_strtoul(p
, &p
, 16);
615 lgs
= (unsigned int) simple_strtoul(p
, &p
, 16);
617 lbs
= (unsigned int) simple_strtoul(p
, &p
, 16);
619 dbr
= (unsigned int) simple_strtoul(p
, &p
, 16);
621 dbg
= (unsigned int) simple_strtoul(p
, &p
, 16);
623 dbb
= (unsigned int) simple_strtoul(p
, &p
, 16);
625 DISP_LOG_PRINT(ANDROID_LOG_INFO
, "DBG", "process_dbg_opt(), %d %d %d %d %d %d\n", lrs
, lgs
, lbs
, dbr
, dbg
, dbb
);
627 else if (0 == strncmp(opt
, "mtkfblog:", 9))
629 if (0 == strncmp(opt
+ 9, "on", 2)) {
630 mtkfb_log_enable(true);
631 } else if (0 == strncmp(opt
+ 9, "off", 3)) {
632 mtkfb_log_enable(false);
637 else if (0 == strncmp(opt
, "displog:", 8))
639 if (0 == strncmp(opt
+ 8, "on", 2)) {
640 disp_log_enable(true);
641 } else if (0 == strncmp(opt
+ 8, "off", 3)) {
642 disp_log_enable(false);
647 else if (0 == strncmp(opt
, "mtkfb_vsynclog:", 15))
649 if (0 == strncmp(opt
+ 15, "on", 2)) {
650 mtkfb_vsync_log_enable(true);
651 } else if (0 == strncmp(opt
+ 15, "off", 3)) {
652 mtkfb_vsync_log_enable(false);
657 else if (0 == strncmp(opt
, "log:", 4))
659 if (0 == strncmp(opt
+ 4, "on", 2)) {
660 mtkfb_log_enable(true);
661 disp_log_enable(true);
662 } else if (0 == strncmp(opt
+ 4, "off", 3)) {
663 mtkfb_log_enable(false);
664 disp_log_enable(false);
669 #if defined(MTK_OVERLAY_ENGINE_SUPPORT)
670 else if (0 == strncmp(opt
, "ovlengine_log:", 14))
673 char *p
= (char *)opt
+ 14;
674 unsigned int level
= (unsigned int) simple_strtoul(p
, &p
, 10);
676 set_ovlengine_debug_level(level
);
679 else if (0 == strncmp(opt
, "update", 6))
681 DISP_UpdateScreen(0, 0, DISP_GetScreenWidth(), DISP_GetScreenHeight());
683 else if (0 == strncmp(opt
, "pan_disp", 8))
685 mtkfb_pan_disp_test();
687 else if (0 == strncmp(opt
, "sem_cnt", 7))
689 mtkfb_show_sem_cnt();
691 else if (0 == strncmp(opt
, "hang:", 5))
693 if (0 == strncmp(opt
+ 5, "on", 2)) {
694 mtkfb_hang_test(true);
695 } else if (0 == strncmp(opt
+ 5, "off", 3)) {
696 mtkfb_hang_test(false);
701 else if (0 == strncmp(opt
, "cpfbonly:", 9))
703 if (0 == strncmp(opt
+ 9, "on", 2))
705 mtkfb_capture_fb_only(true);
707 else if (0 == strncmp(opt
+ 9, "off", 3))
709 mtkfb_capture_fb_only(false);
712 else if (0 == strncmp(opt
, "esd:", 4))
714 if (0 == strncmp(opt
+ 4, "on", 2))
716 esd_recovery_pause(FALSE
);
718 else if (0 == strncmp(opt
+ 4, "off", 3))
720 esd_recovery_pause(TRUE
);
723 else if (0 == strncmp(opt
, "HQA:", 4))
725 if (0 == strncmp(opt
+ 4, "NormalToFactory", 15))
727 mtkfb_switch_normal_to_factory();
729 else if (0 == strncmp(opt
+ 4, "FactoryToNormal", 15))
731 mtkfb_switch_factory_to_normal();
734 else if (0 == strncmp(opt
, "mmp", 3))
736 init_mtkfb_mmp_events();
738 else if (0 == strncmp(opt
, "dump_layer:", 11))
740 if (0 == strncmp(opt
+ 11, "on", 2))
742 char *p
= (char *)opt
+ 14;
743 gCaptureLayerDownX
= simple_strtoul(p
, &p
, 10);
744 gCaptureLayerDownY
= simple_strtoul(p
+1, &p
, 10);
746 if (gCaptureLayerDownX
<=0 || gCaptureLayerDownX
>100
747 || gCaptureLayerDownY
<=0 || gCaptureLayerDownY
>100)
749 gCaptureLayerDownX
= 10;
750 gCaptureLayerDownY
= 10;
753 gCaptureLayerEnable
= 1;
755 else if (0 == strncmp(opt
+ 11, "off", 3))
757 gCaptureLayerEnable
= 0;
760 else if (0 == strncmp(opt
, "dump_ovl:", 9))
762 if (0 == strncmp(opt
+ 9, "on", 2))
764 char *p
= (char *)opt
+ 12;
765 gCaptureOvlDownX
= simple_strtoul(p
, &p
, 10);
766 gCaptureOvlDownY
= simple_strtoul(p
+1, &p
, 10);
768 if (gCaptureOvlDownX
<=0 || gCaptureOvlDownX
>100
769 || gCaptureOvlDownY
<=0 || gCaptureOvlDownY
>100)
771 gCaptureOvlDownX
= 10;
772 gCaptureOvlDownY
= 10;
775 #ifndef MTK_OVERLAY_ENGINE_SUPPORT
776 gCaptureOvlThreadEnable
= 1;
777 wake_up_process(captureovl_task
);
782 else if (0 == strncmp(opt
+ 9, "off", 3))
784 #ifndef MTK_OVERLAY_ENGINE_SUPPORT
785 gCaptureOvlThreadEnable
= 0;
791 else if (0 == strncmp(opt
, "dump_fb:", 8))
793 if (0 == strncmp(opt
+ 8, "on", 2))
795 char *p
= (char *)opt
+ 11;
796 gCaptureFBDownX
= simple_strtoul(p
, &p
, 10);
797 gCaptureFBDownY
= simple_strtoul(p
+1, &p
, 10);
798 gCaptureFBPeriod
= simple_strtoul(p
+1, &p
, 10);
799 gCaptureFBEnable
= 1;
800 wake_up_interruptible(&gCaptureFBWQ
);
802 else if (0 == strncmp(opt
+ 8, "off", 3))
804 gCaptureFBEnable
= 0;
807 else if (0 == strncmp(opt
, "fb_pattern:", 11))
809 if (0 == strncmp(opt
+ 11, "on", 2))
813 else if (0 == strncmp(opt
+ 11, "off", 3))
817 else if (0 == strncmp(opt
+ 11, "svp", 3))
824 if (disphal_process_dbg_opt(opt
))
831 DISP_LOG_PRINT(ANDROID_LOG_INFO
, "ERROR", "parse command error!\n\n%s", STR_HELP
);
835 static void process_dbg_cmd(char *cmd
)
839 DISP_LOG_PRINT(ANDROID_LOG_INFO
, "DBG", "[mtkfb_dbg] %s\n", cmd
);
840 memset(debug_buffer
, 0, sizeof(debug_buffer
));
841 while ((tok
= strsep(&cmd
, " ")) != NULL
)
843 process_dbg_opt(tok
);
848 // ---------------------------------------------------------------------------
849 // Debug FileSystem Routines
850 // ---------------------------------------------------------------------------
852 struct dentry
*mtkfb_dbgfs
= NULL
;
855 static ssize_t
debug_open(struct inode
*inode
, struct file
*file
)
857 file
->private_data
= inode
->i_private
;
864 static ssize_t
debug_read(struct file
*file
,
865 char __user
*ubuf
, size_t count
, loff_t
*ppos
)
867 // const int debug_bufmax = sizeof(debug_buffer) - 1;
870 //n += scnprintf(debug_buffer + n, debug_bufmax - n, STR_HELP);
871 //debug_buffer[n++] = 0;
873 //return simple_read_from_buffer(ubuf, count, ppos, debug_buffer, n);
876 if (strlen(debug_buffer
))
877 return simple_read_from_buffer(ubuf
, count
, ppos
, debug_buffer
, strlen(debug_buffer
));
879 return simple_read_from_buffer(ubuf
, count
, ppos
, STR_HELP
, strlen(STR_HELP
));
885 static char dis_cmd_buf
[512];
886 static ssize_t
debug_write(struct file
*file
,
887 const char __user
*ubuf
, size_t count
, loff_t
*ppos
)
889 const int debug_bufmax
= sizeof(dis_cmd_buf
) - 1;
894 if (count
> debug_bufmax
)
895 count
= debug_bufmax
;
897 if (copy_from_user(&dis_cmd_buf
, ubuf
, count
))
900 dis_cmd_buf
[count
] = 0;
902 process_dbg_cmd(dis_cmd_buf
);
908 static struct file_operations debug_fops
= {
910 .write
= debug_write
,
914 #ifdef MTKFB_DEBUG_FS_CAPTURE_LAYER_CONTENT_SUPPORT
916 static ssize_t
layer_debug_open(struct inode
*inode
, struct file
*file
)
918 MTKFB_LAYER_DBG_OPTIONS
*dbgopt
;
919 ///record the private data
920 file
->private_data
= inode
->i_private
;
921 dbgopt
= (MTKFB_LAYER_DBG_OPTIONS
*)file
->private_data
;
923 dbgopt
->working_size
= DISP_GetScreenWidth()*DISP_GetScreenHeight()*2 + 32;
924 dbgopt
->working_buf
= (UINT32
)vmalloc(dbgopt
->working_size
);
925 if(dbgopt
->working_buf
== 0)
926 DISP_LOG_PRINT(ANDROID_LOG_INFO
, "DBG", "Vmalloc to get temp buffer failed\n");
932 static ssize_t
layer_debug_read(struct file
*file
,
933 char __user
*ubuf
, size_t count
, loff_t
*ppos
)
939 static ssize_t
layer_debug_write(struct file
*file
,
940 const char __user
*ubuf
, size_t count
, loff_t
*ppos
)
942 MTKFB_LAYER_DBG_OPTIONS
*dbgopt
= (MTKFB_LAYER_DBG_OPTIONS
*)file
->private_data
;
944 DISP_LOG_PRINT(ANDROID_LOG_INFO
, "DBG", "mtkfb_layer%d write is not implemented yet \n", dbgopt
->layer_index
);
949 static int layer_debug_release(struct inode
*inode
, struct file
*file
)
951 MTKFB_LAYER_DBG_OPTIONS
*dbgopt
;
952 dbgopt
= (MTKFB_LAYER_DBG_OPTIONS
*)file
->private_data
;
954 if(dbgopt
->working_buf
!= 0)
955 vfree((void *)dbgopt
->working_buf
);
957 dbgopt
->working_buf
= 0;
963 static struct file_operations layer_debug_fops
= {
964 .read
= layer_debug_read
,
965 .write
= layer_debug_write
,
966 .open
= layer_debug_open
,
967 .release
= layer_debug_release
,
974 mtkfb_dbgfs
= debugfs_create_file("mtkfb",
975 S_IFREG
|S_IRUGO
, NULL
, (void *)0, &debug_fops
);
977 memset(&dbg_opt
, sizeof(dbg_opt
), 0);
978 memset(&fps
, sizeof(fps
), 0);
979 dbg_opt
.log_fps_wnd_size
= DEFAULT_LOG_FPS_WND_SIZE
;
981 #ifdef MTKFB_DEBUG_FS_CAPTURE_LAYER_CONTENT_SUPPORT
1000 for(i
=0;i
<DDP_OVL_LAYER_MUN
;i
++)
1003 mtkfb_layer_dbg_opt
[i
].layer_index
= i
;
1004 mtkfb_layer_dbgfs
[i
] = debugfs_create_file(a
,
1005 S_IFREG
|S_IRUGO
, NULL
, (void *)&mtkfb_layer_dbg_opt
[i
], &layer_debug_fops
);
1012 void DBG_Deinit(void)
1014 debugfs_remove(mtkfb_dbgfs
);
1015 #ifdef MTKFB_DEBUG_FS_CAPTURE_LAYER_CONTENT_SUPPORT
1019 for(i
=0;i
<DDP_OVL_LAYER_MUN
;i
++)
1020 debugfs_remove(mtkfb_layer_dbgfs
[i
]);