blob: 2c7925ce9f41f48996fd002ff451a5b9147c5bd9 [file] [log] [blame]
Samantha Tran1eae18f2018-10-15 14:04:01 -07001/* SPDX-License-Identifier: GPL-2.0 */
2/*
3 * Copyright (c) 2016-2018, The Linux Foundation. All rights reserved.
4 */
5
6#ifndef SDE_DBG_H_
7#define SDE_DBG_H_
8
9#include <stdarg.h>
10#include <linux/debugfs.h>
11#include <linux/list.h>
12
13/* select an uncommon hex value for the limiter */
14#define SDE_EVTLOG_DATA_LIMITER (0xC0DEBEEF)
15#define SDE_EVTLOG_FUNC_ENTRY 0x1111
16#define SDE_EVTLOG_FUNC_EXIT 0x2222
17#define SDE_EVTLOG_FUNC_CASE1 0x3333
18#define SDE_EVTLOG_FUNC_CASE2 0x4444
19#define SDE_EVTLOG_FUNC_CASE3 0x5555
20#define SDE_EVTLOG_FUNC_CASE4 0x6666
21#define SDE_EVTLOG_FUNC_CASE5 0x7777
22#define SDE_EVTLOG_FUNC_CASE6 0x8888
23#define SDE_EVTLOG_FUNC_CASE7 0x9999
24#define SDE_EVTLOG_FUNC_CASE8 0xaaaa
25#define SDE_EVTLOG_FUNC_CASE9 0xbbbb
26#define SDE_EVTLOG_FUNC_CASE10 0xcccc
27#define SDE_EVTLOG_PANIC 0xdead
28#define SDE_EVTLOG_FATAL 0xbad
29#define SDE_EVTLOG_ERROR 0xebad
30
31#define SDE_DBG_DUMP_DATA_LIMITER (NULL)
32
33enum sde_dbg_evtlog_flag {
34 SDE_EVTLOG_CRITICAL = BIT(0),
35 SDE_EVTLOG_IRQ = BIT(1),
36 SDE_EVTLOG_VERBOSE = BIT(2),
37 SDE_EVTLOG_ALWAYS = -1
38};
39
40enum sde_dbg_dump_flag {
41 SDE_DBG_DUMP_IN_LOG = BIT(0),
42 SDE_DBG_DUMP_IN_MEM = BIT(1),
43};
44
45#ifdef CONFIG_DRM_SDE_EVTLOG_DEBUG
46#define SDE_EVTLOG_DEFAULT_ENABLE (SDE_EVTLOG_CRITICAL | SDE_EVTLOG_IRQ)
47#else
48#define SDE_EVTLOG_DEFAULT_ENABLE 0
49#endif
50
51/*
52 * evtlog will print this number of entries when it is called through
53 * sysfs node or panic. This prevents kernel log from evtlog message
54 * flood.
55 */
56#define SDE_EVTLOG_PRINT_ENTRY 256
57
58/*
59 * evtlog keeps this number of entries in memory for debug purpose. This
60 * number must be greater than print entry to prevent out of bound evtlog
61 * entry array access.
62 */
63#define SDE_EVTLOG_ENTRY (SDE_EVTLOG_PRINT_ENTRY * 8)
64#define SDE_EVTLOG_MAX_DATA 15
65#define SDE_EVTLOG_BUF_MAX 512
66#define SDE_EVTLOG_BUF_ALIGN 32
67
68struct sde_dbg_power_ctrl {
69 void *handle;
70 void *client;
71 int (*enable_fn)(void *handle, void *client, bool enable);
72};
73
74struct sde_dbg_evtlog_log {
75 s64 time;
76 const char *name;
77 int line;
78 u32 data[SDE_EVTLOG_MAX_DATA];
79 u32 data_cnt;
80 int pid;
81};
82
83/**
84 * @last_dump: Index of last entry to be output during evtlog dumps
85 * @filter_list: Linked list of currently active filter strings
86 */
87struct sde_dbg_evtlog {
88 struct sde_dbg_evtlog_log logs[SDE_EVTLOG_ENTRY];
89 u32 first;
90 u32 last;
91 u32 last_dump;
92 u32 curr;
93 u32 next;
94 u32 enable;
95 spinlock_t spin_lock;
96 struct list_head filter_list;
97};
98
99extern struct sde_dbg_evtlog *sde_dbg_base_evtlog;
100
101/**
102 * SDE_EVT32 - Write a list of 32bit values to the event log, default area
103 * ... - variable arguments
104 */
105#define SDE_EVT32(...) sde_evtlog_log(sde_dbg_base_evtlog, __func__, \
106 __LINE__, SDE_EVTLOG_ALWAYS, ##__VA_ARGS__, \
107 SDE_EVTLOG_DATA_LIMITER)
108
109/**
110 * SDE_EVT32_VERBOSE - Write a list of 32bit values for verbose event logging
111 * ... - variable arguments
112 */
113#define SDE_EVT32_VERBOSE(...) sde_evtlog_log(sde_dbg_base_evtlog, __func__, \
114 __LINE__, SDE_EVTLOG_VERBOSE, ##__VA_ARGS__, \
115 SDE_EVTLOG_DATA_LIMITER)
116
117/**
118 * SDE_EVT32_IRQ - Write a list of 32bit values to the event log, IRQ area
119 * ... - variable arguments
120 */
121#define SDE_EVT32_IRQ(...) sde_evtlog_log(sde_dbg_base_evtlog, __func__, \
122 __LINE__, SDE_EVTLOG_IRQ, ##__VA_ARGS__, \
123 SDE_EVTLOG_DATA_LIMITER)
124
125/**
126 * SDE_DBG_DUMP - trigger dumping of all sde_dbg facilities
127 * @va_args: list of named register dump ranges and regions to dump, as
128 * registered previously through sde_dbg_reg_register_base and
129 * sde_dbg_reg_register_dump_range.
130 * Including the special name "panic" will trigger a panic after
131 * the dumping work has completed.
132 */
133#define SDE_DBG_DUMP(...) sde_dbg_dump(false, __func__, ##__VA_ARGS__, \
134 SDE_DBG_DUMP_DATA_LIMITER)
135
136/**
137 * SDE_DBG_DUMP_WQ - trigger dumping of all sde_dbg facilities, queuing the work
138 * @va_args: list of named register dump ranges and regions to dump, as
139 * registered previously through sde_dbg_reg_register_base and
140 * sde_dbg_reg_register_dump_range.
141 * Including the special name "panic" will trigger a panic after
142 * the dumping work has completed.
143 */
144#define SDE_DBG_DUMP_WQ(...) sde_dbg_dump(true, __func__, ##__VA_ARGS__, \
145 SDE_DBG_DUMP_DATA_LIMITER)
146
147/**
148 * SDE_DBG_EVT_CTRL - trigger a different driver events
149 * event: event that trigger different behavior in the driver
150 */
151#define SDE_DBG_CTRL(...) sde_dbg_ctrl(__func__, ##__VA_ARGS__, \
152 SDE_DBG_DUMP_DATA_LIMITER)
153
154#if defined(CONFIG_DEBUG_FS)
155
156/**
157 * sde_evtlog_init - allocate a new event log object
158 * Returns: evtlog or -ERROR
159 */
160struct sde_dbg_evtlog *sde_evtlog_init(void);
161
162/**
163 * sde_evtlog_destroy - destroy previously allocated event log
164 * @evtlog: pointer to evtlog
165 * Returns: none
166 */
167void sde_evtlog_destroy(struct sde_dbg_evtlog *evtlog);
168
169/**
170 * sde_evtlog_log - log an entry into the event log.
171 * log collection may be enabled/disabled entirely via debugfs
172 * log area collection may be filtered by user provided flags via debugfs.
173 * @evtlog: pointer to evtlog
174 * @name: function name of call site
175 * @line: line number of call site
176 * @flag: log area filter flag checked against user's debugfs request
177 * Returns: none
178 */
179void sde_evtlog_log(struct sde_dbg_evtlog *evtlog, const char *name, int line,
180 int flag, ...);
181
182/**
183 * sde_evtlog_dump_all - print all entries in event log to kernel log
184 * @evtlog: pointer to evtlog
185 * Returns: none
186 */
187void sde_evtlog_dump_all(struct sde_dbg_evtlog *evtlog);
188
189/**
190 * sde_evtlog_is_enabled - check whether log collection is enabled for given
191 * event log and log area flag
192 * @evtlog: pointer to evtlog
193 * @flag: log area filter flag
194 * Returns: none
195 */
196bool sde_evtlog_is_enabled(struct sde_dbg_evtlog *evtlog, u32 flag);
197
198/**
199 * sde_evtlog_dump_to_buffer - print content of event log to the given buffer
200 * @evtlog: pointer to evtlog
201 * @evtlog_buf: target buffer to print into
202 * @evtlog_buf_size: size of target buffer
203 * @update_last_entry: whether or not to stop at most recent entry
204 * Returns: number of bytes written to buffer
205 */
206ssize_t sde_evtlog_dump_to_buffer(struct sde_dbg_evtlog *evtlog,
207 char *evtlog_buf, ssize_t evtlog_buf_size,
208 bool update_last_entry);
209
210/**
211 * sde_dbg_init_dbg_buses - initialize debug bus dumping support for the chipset
212 * @hwversion: Chipset revision
213 */
214void sde_dbg_init_dbg_buses(u32 hwversion);
215
216/**
217 * sde_dbg_init - initialize global sde debug facilities: evtlog, regdump
218 * @dev: device handle
219 * @power_ctrl: power control callback structure for enabling clocks
220 * during register dumping
221 * Returns: 0 or -ERROR
222 */
223int sde_dbg_init(struct device *dev, struct sde_dbg_power_ctrl *power_ctrl);
224
225/**
226 * sde_dbg_debugfs_register - register entries at the given debugfs dir
227 * @debugfs_root: debugfs root in which to create sde debug entries
228 * Returns: 0 or -ERROR
229 */
230int sde_dbg_debugfs_register(struct dentry *debugfs_root);
231
232/**
233 * sde_dbg_destroy - destroy the global sde debug facilities
234 * Returns: none
235 */
236void sde_dbg_destroy(void);
237
238/**
239 * sde_dbg_dump - trigger dumping of all sde_dbg facilities
240 * @queue_work: whether to queue the dumping work to the work_struct
241 * @name: string indicating origin of dump
242 * @va_args: list of named register dump ranges and regions to dump, as
243 * registered previously through sde_dbg_reg_register_base and
244 * sde_dbg_reg_register_dump_range.
245 * Including the special name "panic" will trigger a panic after
246 * the dumping work has completed.
247 * Returns: none
248 */
249void sde_dbg_dump(bool queue_work, const char *name, ...);
250
251/**
252 * sde_dbg_ctrl - trigger specific actions for the driver with debugging
253 * purposes. Those actions need to be enabled by the debugfs entry
254 * so the driver executes those actions in the corresponding calls.
255 * @va_args: list of actions to trigger
256 * Returns: none
257 */
258void sde_dbg_ctrl(const char *name, ...);
259
260/**
261 * sde_dbg_reg_register_base - register a hw register address section for later
262 * dumping. call this before calling sde_dbg_reg_register_dump_range
263 * to be able to specify sub-ranges within the base hw range.
264 * @name: name of base region
265 * @base: base pointer of region
266 * @max_offset: length of region
267 * Returns: 0 or -ERROR
268 */
269int sde_dbg_reg_register_base(const char *name, void __iomem *base,
270 size_t max_offset);
271
272/**
273 * sde_dbg_reg_register_cb - register a hw register callback for later
274 * dumping.
275 * @name: name of base region
276 * @cb: callback of external region
277 * @cb_ptr: private pointer of external region
278 * Returns: 0 or -ERROR
279 */
280int sde_dbg_reg_register_cb(const char *name, void (*cb)(void *), void *ptr);
281
282/**
283 * sde_dbg_reg_unregister_cb - register a hw unregister callback for later
284 * dumping.
285 * @name: name of base region
286 * @cb: callback of external region
287 * @cb_ptr: private pointer of external region
288 * Returns: None
289 */
290void sde_dbg_reg_unregister_cb(const char *name, void (*cb)(void *), void *ptr);
291
292/**
293 * sde_dbg_reg_register_dump_range - register a hw register sub-region for
294 * later register dumping associated with base specified by
295 * sde_dbg_reg_register_base
296 * @base_name: name of base region
297 * @range_name: name of sub-range within base region
298 * @offset_start: sub-range's start offset from base's base pointer
299 * @offset_end: sub-range's end offset from base's base pointer
300 * @xin_id: xin id
301 * Returns: none
302 */
303void sde_dbg_reg_register_dump_range(const char *base_name,
304 const char *range_name, u32 offset_start, u32 offset_end,
305 uint32_t xin_id);
306
307/**
308 * sde_dbg_set_sde_top_offset - set the target specific offset from mdss base
309 * address of the top registers. Used for accessing debug bus controls.
310 * @blk_off: offset from mdss base of the top block
311 */
312void sde_dbg_set_sde_top_offset(u32 blk_off);
313
314/**
315 * sde_evtlog_set_filter - update evtlog filtering
316 * @evtlog: pointer to evtlog
317 * @filter: pointer to optional function name filter, set to NULL to disable
318 */
319void sde_evtlog_set_filter(struct sde_dbg_evtlog *evtlog, char *filter);
320
321/**
322 * sde_evtlog_get_filter - query configured evtlog filters
323 * @evtlog: pointer to evtlog
324 * @index: filter index to retrieve
325 * @buf: pointer to output filter buffer
326 * @bufsz: size of output filter buffer
327 * Returns: zero if a filter string was returned
328 */
329int sde_evtlog_get_filter(struct sde_dbg_evtlog *evtlog, int index,
330 char *buf, size_t bufsz);
331
332/**
333 * sde_rsc_debug_dump - sde rsc debug dump status
334 * @mux_sel: select mux on rsc debug bus
335 */
336void sde_rsc_debug_dump(u32 mux_sel);
337
338/**
339 * dsi_ctrl_debug_dump - dump dsi debug dump status
340 */
341void dsi_ctrl_debug_dump(void);
342
343#else
344static inline struct sde_dbg_evtlog *sde_evtlog_init(void)
345{
346 return NULL;
347}
348
349static inline void sde_evtlog_destroy(struct sde_dbg_evtlog *evtlog)
350{
351}
352
353static inline void sde_evtlog_log(struct sde_dbg_evtlog *evtlog,
354 const char *name, int line, int flag, ...)
355{
356}
357
358static inline void sde_evtlog_dump_all(struct sde_dbg_evtlog *evtlog)
359{
360}
361
362static inline bool sde_evtlog_is_enabled(struct sde_dbg_evtlog *evtlog,
363 u32 flag)
364{
365 return false;
366}
367
368static inline ssize_t sde_evtlog_dump_to_buffer(struct sde_dbg_evtlog *evtlog,
369 char *evtlog_buf, ssize_t evtlog_buf_size,
370 bool update_last_entry)
371{
372 return 0;
373}
374
375static inline void sde_dbg_init_dbg_buses(u32 hwversion)
376{
377}
378
379static inline int sde_dbg_init(struct device *dev,
380 struct sde_dbg_power_ctrl *power_ctrl)
381{
382 return 0;
383}
384
385static inline int sde_dbg_debugfs_register(struct dentry *debugfs_root)
386{
387 return 0;
388}
389
390static inline void sde_dbg_destroy(void)
391{
392}
393
394static inline void sde_dbg_dump(bool queue_work, const char *name, ...)
395{
396}
397
398static inline void sde_dbg_ctrl(const char *name, ...)
399{
400}
401
402static inline int sde_dbg_reg_register_base(const char *name,
403 void __iomem *base, size_t max_offset)
404{
405 return 0;
406}
407
408static inline void sde_dbg_reg_register_dump_range(const char *base_name,
409 const char *range_name, u32 offset_start, u32 offset_end,
410 uint32_t xin_id)
411{
412}
413
414void sde_dbg_set_sde_top_offset(u32 blk_off)
415{
416}
417
418static inline void sde_evtlog_set_filter(
419 struct sde_dbg_evtlog *evtlog, char *filter)
420{
421}
422
423static inline int sde_evtlog_get_filter(struct sde_dbg_evtlog *evtlog,
424 int index, char *buf, size_t bufsz)
425{
426 return -EINVAL;
427}
428
429static inline void sde_rsc_debug_dump(u32 mux_sel)
430{
431}
432
433static inline void dsi_ctrl_debug_dump(void)
434{
435}
436
437#endif /* defined(CONFIG_DEBUG_FS) */
438
439
440#endif /* SDE_DBG_H_ */