blob: 786451c352a02629cf1ef92ea32a3985e04d3bc8 [file] [log] [blame]
Lloyd Atkinson113aefd2016-10-23 13:15:18 -04001/* Copyright (c) 2016-2017, The Linux Foundation. All rights reserved.
Lloyd Atkinson5d40d312016-09-06 08:34:13 -04002 *
3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License version 2 and
5 * only version 2 as published by the Free Software Foundation.
6 *
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
11 */
12
13#ifndef SDE_DBG_H_
14#define SDE_DBG_H_
15
16#include <stdarg.h>
17#include <linux/debugfs.h>
18#include <linux/list.h>
19
20#define SDE_EVTLOG_DATA_LIMITER (-1)
21#define SDE_EVTLOG_FUNC_ENTRY 0x1111
22#define SDE_EVTLOG_FUNC_EXIT 0x2222
Dhaval Patel6c666622017-03-21 23:02:59 -070023#define SDE_EVTLOG_FUNC_CASE1 0x3333
24#define SDE_EVTLOG_FUNC_CASE2 0x4444
25#define SDE_EVTLOG_FUNC_CASE3 0x5555
26#define SDE_EVTLOG_FUNC_CASE4 0x6666
27#define SDE_EVTLOG_FUNC_CASE5 0x7777
Lloyd Atkinsonf68a2132017-07-17 10:16:30 -040028#define SDE_EVTLOG_FUNC_CASE6 0x8888
Dhaval Patel1b5605b2017-07-26 18:19:50 -070029#define SDE_EVTLOG_FUNC_CASE7 0x9999
30#define SDE_EVTLOG_FUNC_CASE8 0xaaaa
31#define SDE_EVTLOG_FUNC_CASE9 0xbbbb
32#define SDE_EVTLOG_FUNC_CASE10 0xcccc
Dhaval Patel6c666622017-03-21 23:02:59 -070033#define SDE_EVTLOG_PANIC 0xdead
34#define SDE_EVTLOG_FATAL 0xbad
Lloyd Atkinsonde4270ab2017-06-27 16:43:53 -040035#define SDE_EVTLOG_ERROR 0xebad
Lloyd Atkinson5d40d312016-09-06 08:34:13 -040036
Lloyd Atkinsona54513f2016-10-03 22:31:43 -040037#define SDE_DBG_DUMP_DATA_LIMITER (NULL)
38
Lloyd Atkinson5d40d312016-09-06 08:34:13 -040039enum sde_dbg_evtlog_flag {
Clarence Ip6ac61cc2017-03-22 15:01:53 -040040 SDE_EVTLOG_CRITICAL = BIT(0),
Lloyd Atkinson5d40d312016-09-06 08:34:13 -040041 SDE_EVTLOG_IRQ = BIT(1),
Clarence Ip6ac61cc2017-03-22 15:01:53 -040042 SDE_EVTLOG_VERBOSE = BIT(2),
43 SDE_EVTLOG_ALWAYS = -1
Lloyd Atkinson5d40d312016-09-06 08:34:13 -040044};
45
Lloyd Atkinson113aefd2016-10-23 13:15:18 -040046enum sde_dbg_dump_flag {
47 SDE_DBG_DUMP_IN_LOG = BIT(0),
48 SDE_DBG_DUMP_IN_MEM = BIT(1),
49};
50
51#ifdef CONFIG_DRM_SDE_EVTLOG_DEBUG
Dhaval Patel6c666622017-03-21 23:02:59 -070052#define SDE_EVTLOG_DEFAULT_ENABLE (SDE_EVTLOG_CRITICAL | SDE_EVTLOG_IRQ)
Lloyd Atkinson113aefd2016-10-23 13:15:18 -040053#else
54#define SDE_EVTLOG_DEFAULT_ENABLE 0
55#endif
56
57/*
58 * evtlog will print this number of entries when it is called through
59 * sysfs node or panic. This prevents kernel log from evtlog message
60 * flood.
61 */
62#define SDE_EVTLOG_PRINT_ENTRY 256
63
64/*
65 * evtlog keeps this number of entries in memory for debug purpose. This
66 * number must be greater than print entry to prevent out of bound evtlog
67 * entry array access.
68 */
69#define SDE_EVTLOG_ENTRY (SDE_EVTLOG_PRINT_ENTRY * 4)
70#define SDE_EVTLOG_MAX_DATA 15
71#define SDE_EVTLOG_BUF_MAX 512
72#define SDE_EVTLOG_BUF_ALIGN 32
73
74struct sde_dbg_power_ctrl {
75 void *handle;
76 void *client;
77 int (*enable_fn)(void *handle, void *client, bool enable);
78};
79
80struct sde_dbg_evtlog_log {
Lloyd Atkinson113aefd2016-10-23 13:15:18 -040081 s64 time;
82 const char *name;
83 int line;
84 u32 data[SDE_EVTLOG_MAX_DATA];
85 u32 data_cnt;
86 int pid;
87};
88
Clarence Ip6ac61cc2017-03-22 15:01:53 -040089/**
90 * @filter_list: Linked list of currently active filter strings
91 */
Lloyd Atkinson113aefd2016-10-23 13:15:18 -040092struct sde_dbg_evtlog {
93 struct sde_dbg_evtlog_log logs[SDE_EVTLOG_ENTRY];
94 u32 first;
95 u32 last;
96 u32 curr;
97 u32 next;
98 u32 enable;
99 spinlock_t spin_lock;
Clarence Ip6ac61cc2017-03-22 15:01:53 -0400100 struct list_head filter_list;
Lloyd Atkinson113aefd2016-10-23 13:15:18 -0400101};
102
103extern struct sde_dbg_evtlog *sde_dbg_base_evtlog;
104
Lloyd Atkinson5d40d312016-09-06 08:34:13 -0400105/**
Lloyd Atkinson113aefd2016-10-23 13:15:18 -0400106 * SDE_EVT32 - Write a list of 32bit values to the event log, default area
Lloyd Atkinson5d40d312016-09-06 08:34:13 -0400107 * ... - variable arguments
108 */
Lloyd Atkinson113aefd2016-10-23 13:15:18 -0400109#define SDE_EVT32(...) sde_evtlog_log(sde_dbg_base_evtlog, __func__, \
Clarence Ip6ac61cc2017-03-22 15:01:53 -0400110 __LINE__, SDE_EVTLOG_ALWAYS, ##__VA_ARGS__, \
111 SDE_EVTLOG_DATA_LIMITER)
112
113/**
114 * SDE_EVT32_VERBOSE - Write a list of 32bit values for verbose event logging
115 * ... - variable arguments
116 */
117#define SDE_EVT32_VERBOSE(...) sde_evtlog_log(sde_dbg_base_evtlog, __func__, \
118 __LINE__, SDE_EVTLOG_VERBOSE, ##__VA_ARGS__, \
Lloyd Atkinson113aefd2016-10-23 13:15:18 -0400119 SDE_EVTLOG_DATA_LIMITER)
Lloyd Atkinson5d40d312016-09-06 08:34:13 -0400120
Lloyd Atkinson113aefd2016-10-23 13:15:18 -0400121/**
122 * SDE_EVT32_IRQ - Write a list of 32bit values to the event log, IRQ area
123 * ... - variable arguments
124 */
125#define SDE_EVT32_IRQ(...) sde_evtlog_log(sde_dbg_base_evtlog, __func__, \
126 __LINE__, SDE_EVTLOG_IRQ, ##__VA_ARGS__, \
127 SDE_EVTLOG_DATA_LIMITER)
128
129/**
130 * SDE_DBG_DUMP - trigger dumping of all sde_dbg facilities
131 * @va_args: list of named register dump ranges and regions to dump, as
132 * registered previously through sde_dbg_reg_register_base and
133 * sde_dbg_reg_register_dump_range.
134 * Including the special name "panic" will trigger a panic after
135 * the dumping work has completed.
136 */
137#define SDE_DBG_DUMP(...) sde_dbg_dump(false, __func__, ##__VA_ARGS__, \
Lloyd Atkinsona54513f2016-10-03 22:31:43 -0400138 SDE_DBG_DUMP_DATA_LIMITER)
139
Lloyd Atkinson113aefd2016-10-23 13:15:18 -0400140/**
141 * SDE_DBG_DUMP_WQ - trigger dumping of all sde_dbg facilities, queuing the work
142 * @va_args: list of named register dump ranges and regions to dump, as
143 * registered previously through sde_dbg_reg_register_base and
144 * sde_dbg_reg_register_dump_range.
145 * Including the special name "panic" will trigger a panic after
146 * the dumping work has completed.
147 */
148#define SDE_DBG_DUMP_WQ(...) sde_dbg_dump(true, __func__, ##__VA_ARGS__, \
Lloyd Atkinsona54513f2016-10-03 22:31:43 -0400149 SDE_DBG_DUMP_DATA_LIMITER)
Lloyd Atkinson5d40d312016-09-06 08:34:13 -0400150
151#if defined(CONFIG_DEBUG_FS)
152
Lloyd Atkinson113aefd2016-10-23 13:15:18 -0400153/**
154 * sde_evtlog_init - allocate a new event log object
155 * Returns: evtlog or -ERROR
156 */
157struct sde_dbg_evtlog *sde_evtlog_init(void);
158
159/**
160 * sde_evtlog_destroy - destroy previously allocated event log
161 * @evtlog: pointer to evtlog
162 * Returns: none
163 */
164void sde_evtlog_destroy(struct sde_dbg_evtlog *evtlog);
165
166/**
167 * sde_evtlog_log - log an entry into the event log.
168 * log collection may be enabled/disabled entirely via debugfs
169 * log area collection may be filtered by user provided flags via debugfs.
170 * @evtlog: pointer to evtlog
171 * @name: function name of call site
172 * @line: line number of call site
173 * @flag: log area filter flag checked against user's debugfs request
174 * Returns: none
175 */
176void sde_evtlog_log(struct sde_dbg_evtlog *evtlog, const char *name, int line,
177 int flag, ...);
178
179/**
180 * sde_evtlog_dump_all - print all entries in event log to kernel log
181 * @evtlog: pointer to evtlog
182 * Returns: none
183 */
184void sde_evtlog_dump_all(struct sde_dbg_evtlog *evtlog);
185
186/**
187 * sde_evtlog_is_enabled - check whether log collection is enabled for given
188 * event log and log area flag
189 * @evtlog: pointer to evtlog
190 * @flag: log area filter flag
191 * Returns: none
192 */
193bool sde_evtlog_is_enabled(struct sde_dbg_evtlog *evtlog, u32 flag);
194
195/**
196 * sde_evtlog_dump_to_buffer - print content of event log to the given buffer
197 * @evtlog: pointer to evtlog
198 * @evtlog_buf: target buffer to print into
199 * @evtlog_buf_size: size of target buffer
200 * Returns: number of bytes written to buffer
201 */
202ssize_t sde_evtlog_dump_to_buffer(struct sde_dbg_evtlog *evtlog,
203 char *evtlog_buf, ssize_t evtlog_buf_size);
204
205/**
Lloyd Atkinson274cc462017-02-21 11:52:06 -0500206 * sde_dbg_init_dbg_buses - initialize debug bus dumping support for the chipset
207 * @hwversion: Chipset revision
208 */
209void sde_dbg_init_dbg_buses(u32 hwversion);
210
211/**
Lloyd Atkinson113aefd2016-10-23 13:15:18 -0400212 * sde_dbg_init - initialize global sde debug facilities: evtlog, regdump
Lloyd Atkinson113aefd2016-10-23 13:15:18 -0400213 * @dev: device handle
214 * @power_ctrl: power control callback structure for enabling clocks
215 * during register dumping
216 * Returns: 0 or -ERROR
217 */
Lloyd Atkinsonb020e0f2017-03-14 08:05:18 -0700218int sde_dbg_init(struct device *dev, struct sde_dbg_power_ctrl *power_ctrl);
219
220/**
221 * sde_dbg_debugfs_register - register entries at the given debugfs dir
222 * @debugfs_root: debugfs root in which to create sde debug entries
223 * Returns: 0 or -ERROR
224 */
225int sde_dbg_debugfs_register(struct dentry *debugfs_root);
Lloyd Atkinson113aefd2016-10-23 13:15:18 -0400226
227/**
228 * sde_dbg_destroy - destroy the global sde debug facilities
229 * Returns: none
230 */
231void sde_dbg_destroy(void);
232
233/**
234 * sde_dbg_dump - trigger dumping of all sde_dbg facilities
235 * @queue_work: whether to queue the dumping work to the work_struct
236 * @name: string indicating origin of dump
237 * @va_args: list of named register dump ranges and regions to dump, as
238 * registered previously through sde_dbg_reg_register_base and
239 * sde_dbg_reg_register_dump_range.
240 * Including the special name "panic" will trigger a panic after
241 * the dumping work has completed.
242 * Returns: none
243 */
244void sde_dbg_dump(bool queue_work, const char *name, ...);
245
246/**
247 * sde_dbg_reg_register_base - register a hw register address section for later
248 * dumping. call this before calling sde_dbg_reg_register_dump_range
249 * to be able to specify sub-ranges within the base hw range.
250 * @name: name of base region
251 * @base: base pointer of region
252 * @max_offset: length of region
253 * Returns: 0 or -ERROR
254 */
255int sde_dbg_reg_register_base(const char *name, void __iomem *base,
256 size_t max_offset);
257
258/**
Alan Kwongaa53e682017-07-31 18:21:15 -0400259 * sde_dbg_reg_register_cb - register a hw register callback for later
260 * dumping.
261 * @name: name of base region
262 * @cb: callback of external region
263 * @cb_ptr: private pointer of external region
264 * Returns: 0 or -ERROR
265 */
266int sde_dbg_reg_register_cb(const char *name, void (*cb)(void *), void *ptr);
267
268/**
269 * sde_dbg_reg_unregister_cb - register a hw unregister callback for later
270 * dumping.
271 * @name: name of base region
272 * @cb: callback of external region
273 * @cb_ptr: private pointer of external region
274 * Returns: None
275 */
276void sde_dbg_reg_unregister_cb(const char *name, void (*cb)(void *), void *ptr);
277
278/**
Lloyd Atkinson113aefd2016-10-23 13:15:18 -0400279 * sde_dbg_reg_register_dump_range - register a hw register sub-region for
280 * later register dumping associated with base specified by
281 * sde_dbg_reg_register_base
282 * @base_name: name of base region
283 * @range_name: name of sub-range within base region
284 * @offset_start: sub-range's start offset from base's base pointer
285 * @offset_end: sub-range's end offset from base's base pointer
286 * @xin_id: xin id
287 * Returns: none
288 */
289void sde_dbg_reg_register_dump_range(const char *base_name,
290 const char *range_name, u32 offset_start, u32 offset_end,
291 uint32_t xin_id);
292
Clarence Ip6ac61cc2017-03-22 15:01:53 -0400293/**
Lloyd Atkinsonac4b6e02017-03-23 11:43:48 -0700294 * sde_dbg_set_sde_top_offset - set the target specific offset from mdss base
295 * address of the top registers. Used for accessing debug bus controls.
296 * @blk_off: offset from mdss base of the top block
297 */
298void sde_dbg_set_sde_top_offset(u32 blk_off);
299
300/**
Clarence Ip6ac61cc2017-03-22 15:01:53 -0400301 * sde_evtlog_set_filter - update evtlog filtering
302 * @evtlog: pointer to evtlog
303 * @filter: pointer to optional function name filter, set to NULL to disable
304 */
305void sde_evtlog_set_filter(struct sde_dbg_evtlog *evtlog, char *filter);
306
307/**
308 * sde_evtlog_get_filter - query configured evtlog filters
309 * @evtlog: pointer to evtlog
310 * @index: filter index to retrieve
311 * @buf: pointer to output filter buffer
312 * @bufsz: size of output filter buffer
313 * Returns: zero if a filter string was returned
314 */
315int sde_evtlog_get_filter(struct sde_dbg_evtlog *evtlog, int index,
316 char *buf, size_t bufsz);
317
Dhaval Patelc5a2e5d2017-09-18 12:39:41 -0700318/**
319 * sde_rsc_debug_dump - sde rsc debug dump status
320 * @mux_sel: select mux on rsc debug bus
321 */
322void sde_rsc_debug_dump(u32 mux_sel);
323
Dhaval Patelf9f3ffe2017-08-16 16:03:10 -0700324/**
325 * dsi_ctrl_debug_dump - dump dsi debug dump status
326 */
327void dsi_ctrl_debug_dump(void);
328
Lloyd Atkinson5d40d312016-09-06 08:34:13 -0400329#else
Lloyd Atkinson113aefd2016-10-23 13:15:18 -0400330static inline struct sde_dbg_evtlog *sde_evtlog_init(void)
331{
332 return NULL;
333}
334
335static inline void sde_evtlog_destroy(struct sde_dbg_evtlog *evtlog)
336{
337}
338
339static inline void sde_evtlog_log(struct sde_dbg_evtlog *evtlog,
340 const char *name, int line, int flag, ...)
341{
342}
343
344static inline void sde_evtlog_dump_all(struct sde_dbg_evtlog *evtlog)
345{
346}
347
348static inline bool sde_evtlog_is_enabled(struct sde_dbg_evtlog *evtlog,
349 u32 flag)
350{
351 return false;
352}
353
354static inline ssize_t sde_evtlog_dump_to_buffer(struct sde_dbg_evtlog *evtlog,
355 char *evtlog_buf, ssize_t evtlog_buf_size)
356{
357 return 0;
358}
359
Clarence Ip6ac61cc2017-03-22 15:01:53 -0400360static inline void sde_dbg_init_dbg_buses(u32 hwversion)
Lloyd Atkinson274cc462017-02-21 11:52:06 -0500361{
362}
363
Lloyd Atkinsonb020e0f2017-03-14 08:05:18 -0700364static inline int sde_dbg_init(struct device *dev,
Lloyd Atkinson113aefd2016-10-23 13:15:18 -0400365 struct sde_dbg_power_ctrl *power_ctrl)
366{
367 return 0;
368}
369
Clarence Ip6ac61cc2017-03-22 15:01:53 -0400370static inline int sde_dbg_debugfs_register(struct dentry *debugfs_root)
Lloyd Atkinsonb020e0f2017-03-14 08:05:18 -0700371{
372 return 0;
373}
374
Lloyd Atkinson113aefd2016-10-23 13:15:18 -0400375static inline void sde_dbg_destroy(void)
376{
377}
378
379static inline void sde_dbg_dump(bool queue_work, const char *name, ...)
380{
381}
382
383static inline int sde_dbg_reg_register_base(const char *name,
384 void __iomem *base, size_t max_offset)
385{
386 return 0;
387}
388
389static inline void sde_dbg_reg_register_dump_range(const char *base_name,
390 const char *range_name, u32 offset_start, u32 offset_end,
391 uint32_t xin_id)
392{
393}
394
Lloyd Atkinsonac4b6e02017-03-23 11:43:48 -0700395void sde_dbg_set_sde_top_offset(u32 blk_off)
396{
397}
398
Clarence Ip6ac61cc2017-03-22 15:01:53 -0400399static inline void sde_evtlog_set_filter(
400 struct sde_dbg_evtlog *evtlog, char *filter)
401{
402}
403
404static inline int sde_evtlog_get_filter(struct sde_dbg_evtlog *evtlog,
405 int index, char *buf, size_t bufsz)
406{
407 return -EINVAL;
408}
409
Dhaval Patelc5a2e5d2017-09-18 12:39:41 -0700410static inline void sde_rsc_debug_dump(u32 mux_sel)
411{
412}
Dhaval Patelf9f3ffe2017-08-16 16:03:10 -0700413
414static inline void dsi_ctrl_debug_dump(void)
415{
416}
417
Lloyd Atkinson113aefd2016-10-23 13:15:18 -0400418#endif /* defined(CONFIG_DEBUG_FS) */
419
Lloyd Atkinson5d40d312016-09-06 08:34:13 -0400420
421#endif /* SDE_DBG_H_ */