blob: 8822df584e1d07889a16768781dccf3f46ee7e3b [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
23
Lloyd Atkinsona54513f2016-10-03 22:31:43 -040024#define SDE_DBG_DUMP_DATA_LIMITER (NULL)
25
Lloyd Atkinson5d40d312016-09-06 08:34:13 -040026enum sde_dbg_evtlog_flag {
Clarence Ip6ac61cc2017-03-22 15:01:53 -040027 SDE_EVTLOG_CRITICAL = BIT(0),
Lloyd Atkinson5d40d312016-09-06 08:34:13 -040028 SDE_EVTLOG_IRQ = BIT(1),
Clarence Ip6ac61cc2017-03-22 15:01:53 -040029 SDE_EVTLOG_VERBOSE = BIT(2),
30 SDE_EVTLOG_ALWAYS = -1
Lloyd Atkinson5d40d312016-09-06 08:34:13 -040031};
32
Lloyd Atkinson113aefd2016-10-23 13:15:18 -040033enum sde_dbg_dump_flag {
34 SDE_DBG_DUMP_IN_LOG = BIT(0),
35 SDE_DBG_DUMP_IN_MEM = BIT(1),
36};
37
38#ifdef CONFIG_DRM_SDE_EVTLOG_DEBUG
Clarence Ip6ac61cc2017-03-22 15:01:53 -040039#define SDE_EVTLOG_DEFAULT_ENABLE SDE_EVTLOG_CRITICAL
Lloyd Atkinson113aefd2016-10-23 13:15:18 -040040#else
41#define SDE_EVTLOG_DEFAULT_ENABLE 0
42#endif
43
44/*
45 * evtlog will print this number of entries when it is called through
46 * sysfs node or panic. This prevents kernel log from evtlog message
47 * flood.
48 */
49#define SDE_EVTLOG_PRINT_ENTRY 256
50
51/*
52 * evtlog keeps this number of entries in memory for debug purpose. This
53 * number must be greater than print entry to prevent out of bound evtlog
54 * entry array access.
55 */
56#define SDE_EVTLOG_ENTRY (SDE_EVTLOG_PRINT_ENTRY * 4)
57#define SDE_EVTLOG_MAX_DATA 15
58#define SDE_EVTLOG_BUF_MAX 512
59#define SDE_EVTLOG_BUF_ALIGN 32
60
61struct sde_dbg_power_ctrl {
62 void *handle;
63 void *client;
64 int (*enable_fn)(void *handle, void *client, bool enable);
65};
66
67struct sde_dbg_evtlog_log {
Lloyd Atkinson113aefd2016-10-23 13:15:18 -040068 s64 time;
69 const char *name;
70 int line;
71 u32 data[SDE_EVTLOG_MAX_DATA];
72 u32 data_cnt;
73 int pid;
74};
75
Clarence Ip6ac61cc2017-03-22 15:01:53 -040076/**
77 * @filter_list: Linked list of currently active filter strings
78 */
Lloyd Atkinson113aefd2016-10-23 13:15:18 -040079struct sde_dbg_evtlog {
80 struct sde_dbg_evtlog_log logs[SDE_EVTLOG_ENTRY];
81 u32 first;
82 u32 last;
83 u32 curr;
84 u32 next;
85 u32 enable;
86 spinlock_t spin_lock;
Clarence Ip6ac61cc2017-03-22 15:01:53 -040087 struct list_head filter_list;
Lloyd Atkinson113aefd2016-10-23 13:15:18 -040088};
89
90extern struct sde_dbg_evtlog *sde_dbg_base_evtlog;
91
Lloyd Atkinson5d40d312016-09-06 08:34:13 -040092/**
Lloyd Atkinson113aefd2016-10-23 13:15:18 -040093 * SDE_EVT32 - Write a list of 32bit values to the event log, default area
Lloyd Atkinson5d40d312016-09-06 08:34:13 -040094 * ... - variable arguments
95 */
Lloyd Atkinson113aefd2016-10-23 13:15:18 -040096#define SDE_EVT32(...) sde_evtlog_log(sde_dbg_base_evtlog, __func__, \
Clarence Ip6ac61cc2017-03-22 15:01:53 -040097 __LINE__, SDE_EVTLOG_ALWAYS, ##__VA_ARGS__, \
98 SDE_EVTLOG_DATA_LIMITER)
99
100/**
101 * SDE_EVT32_VERBOSE - Write a list of 32bit values for verbose event logging
102 * ... - variable arguments
103 */
104#define SDE_EVT32_VERBOSE(...) sde_evtlog_log(sde_dbg_base_evtlog, __func__, \
105 __LINE__, SDE_EVTLOG_VERBOSE, ##__VA_ARGS__, \
Lloyd Atkinson113aefd2016-10-23 13:15:18 -0400106 SDE_EVTLOG_DATA_LIMITER)
Lloyd Atkinson5d40d312016-09-06 08:34:13 -0400107
Lloyd Atkinson113aefd2016-10-23 13:15:18 -0400108/**
109 * SDE_EVT32_IRQ - Write a list of 32bit values to the event log, IRQ area
110 * ... - variable arguments
111 */
112#define SDE_EVT32_IRQ(...) sde_evtlog_log(sde_dbg_base_evtlog, __func__, \
113 __LINE__, SDE_EVTLOG_IRQ, ##__VA_ARGS__, \
114 SDE_EVTLOG_DATA_LIMITER)
115
116/**
117 * SDE_DBG_DUMP - trigger dumping of all sde_dbg facilities
118 * @va_args: list of named register dump ranges and regions to dump, as
119 * registered previously through sde_dbg_reg_register_base and
120 * sde_dbg_reg_register_dump_range.
121 * Including the special name "panic" will trigger a panic after
122 * the dumping work has completed.
123 */
124#define SDE_DBG_DUMP(...) sde_dbg_dump(false, __func__, ##__VA_ARGS__, \
Lloyd Atkinsona54513f2016-10-03 22:31:43 -0400125 SDE_DBG_DUMP_DATA_LIMITER)
126
Lloyd Atkinson113aefd2016-10-23 13:15:18 -0400127/**
128 * SDE_DBG_DUMP_WQ - trigger dumping of all sde_dbg facilities, queuing the work
129 * @va_args: list of named register dump ranges and regions to dump, as
130 * registered previously through sde_dbg_reg_register_base and
131 * sde_dbg_reg_register_dump_range.
132 * Including the special name "panic" will trigger a panic after
133 * the dumping work has completed.
134 */
135#define SDE_DBG_DUMP_WQ(...) sde_dbg_dump(true, __func__, ##__VA_ARGS__, \
Lloyd Atkinsona54513f2016-10-03 22:31:43 -0400136 SDE_DBG_DUMP_DATA_LIMITER)
Lloyd Atkinson5d40d312016-09-06 08:34:13 -0400137
138#if defined(CONFIG_DEBUG_FS)
139
Lloyd Atkinson113aefd2016-10-23 13:15:18 -0400140/**
141 * sde_evtlog_init - allocate a new event log object
142 * Returns: evtlog or -ERROR
143 */
144struct sde_dbg_evtlog *sde_evtlog_init(void);
145
146/**
147 * sde_evtlog_destroy - destroy previously allocated event log
148 * @evtlog: pointer to evtlog
149 * Returns: none
150 */
151void sde_evtlog_destroy(struct sde_dbg_evtlog *evtlog);
152
153/**
154 * sde_evtlog_log - log an entry into the event log.
155 * log collection may be enabled/disabled entirely via debugfs
156 * log area collection may be filtered by user provided flags via debugfs.
157 * @evtlog: pointer to evtlog
158 * @name: function name of call site
159 * @line: line number of call site
160 * @flag: log area filter flag checked against user's debugfs request
161 * Returns: none
162 */
163void sde_evtlog_log(struct sde_dbg_evtlog *evtlog, const char *name, int line,
164 int flag, ...);
165
166/**
167 * sde_evtlog_dump_all - print all entries in event log to kernel log
168 * @evtlog: pointer to evtlog
169 * Returns: none
170 */
171void sde_evtlog_dump_all(struct sde_dbg_evtlog *evtlog);
172
173/**
174 * sde_evtlog_is_enabled - check whether log collection is enabled for given
175 * event log and log area flag
176 * @evtlog: pointer to evtlog
177 * @flag: log area filter flag
178 * Returns: none
179 */
180bool sde_evtlog_is_enabled(struct sde_dbg_evtlog *evtlog, u32 flag);
181
182/**
183 * sde_evtlog_dump_to_buffer - print content of event log to the given buffer
184 * @evtlog: pointer to evtlog
185 * @evtlog_buf: target buffer to print into
186 * @evtlog_buf_size: size of target buffer
187 * Returns: number of bytes written to buffer
188 */
189ssize_t sde_evtlog_dump_to_buffer(struct sde_dbg_evtlog *evtlog,
190 char *evtlog_buf, ssize_t evtlog_buf_size);
191
192/**
Lloyd Atkinson274cc462017-02-21 11:52:06 -0500193 * sde_dbg_init_dbg_buses - initialize debug bus dumping support for the chipset
194 * @hwversion: Chipset revision
195 */
196void sde_dbg_init_dbg_buses(u32 hwversion);
197
198/**
Lloyd Atkinson113aefd2016-10-23 13:15:18 -0400199 * sde_dbg_init - initialize global sde debug facilities: evtlog, regdump
Lloyd Atkinson113aefd2016-10-23 13:15:18 -0400200 * @dev: device handle
201 * @power_ctrl: power control callback structure for enabling clocks
202 * during register dumping
203 * Returns: 0 or -ERROR
204 */
Lloyd Atkinsonb020e0f2017-03-14 08:05:18 -0700205int sde_dbg_init(struct device *dev, struct sde_dbg_power_ctrl *power_ctrl);
206
207/**
208 * sde_dbg_debugfs_register - register entries at the given debugfs dir
209 * @debugfs_root: debugfs root in which to create sde debug entries
210 * Returns: 0 or -ERROR
211 */
212int sde_dbg_debugfs_register(struct dentry *debugfs_root);
Lloyd Atkinson113aefd2016-10-23 13:15:18 -0400213
214/**
215 * sde_dbg_destroy - destroy the global sde debug facilities
216 * Returns: none
217 */
218void sde_dbg_destroy(void);
219
220/**
221 * sde_dbg_dump - trigger dumping of all sde_dbg facilities
222 * @queue_work: whether to queue the dumping work to the work_struct
223 * @name: string indicating origin of dump
224 * @va_args: list of named register dump ranges and regions to dump, as
225 * registered previously through sde_dbg_reg_register_base and
226 * sde_dbg_reg_register_dump_range.
227 * Including the special name "panic" will trigger a panic after
228 * the dumping work has completed.
229 * Returns: none
230 */
231void sde_dbg_dump(bool queue_work, const char *name, ...);
232
233/**
234 * sde_dbg_reg_register_base - register a hw register address section for later
235 * dumping. call this before calling sde_dbg_reg_register_dump_range
236 * to be able to specify sub-ranges within the base hw range.
237 * @name: name of base region
238 * @base: base pointer of region
239 * @max_offset: length of region
240 * Returns: 0 or -ERROR
241 */
242int sde_dbg_reg_register_base(const char *name, void __iomem *base,
243 size_t max_offset);
244
245/**
246 * sde_dbg_reg_register_dump_range - register a hw register sub-region for
247 * later register dumping associated with base specified by
248 * sde_dbg_reg_register_base
249 * @base_name: name of base region
250 * @range_name: name of sub-range within base region
251 * @offset_start: sub-range's start offset from base's base pointer
252 * @offset_end: sub-range's end offset from base's base pointer
253 * @xin_id: xin id
254 * Returns: none
255 */
256void sde_dbg_reg_register_dump_range(const char *base_name,
257 const char *range_name, u32 offset_start, u32 offset_end,
258 uint32_t xin_id);
259
Clarence Ip6ac61cc2017-03-22 15:01:53 -0400260/**
Lloyd Atkinsonac4b6e02017-03-23 11:43:48 -0700261 * sde_dbg_set_sde_top_offset - set the target specific offset from mdss base
262 * address of the top registers. Used for accessing debug bus controls.
263 * @blk_off: offset from mdss base of the top block
264 */
265void sde_dbg_set_sde_top_offset(u32 blk_off);
266
267/**
Clarence Ip6ac61cc2017-03-22 15:01:53 -0400268 * sde_evtlog_set_filter - update evtlog filtering
269 * @evtlog: pointer to evtlog
270 * @filter: pointer to optional function name filter, set to NULL to disable
271 */
272void sde_evtlog_set_filter(struct sde_dbg_evtlog *evtlog, char *filter);
273
274/**
275 * sde_evtlog_get_filter - query configured evtlog filters
276 * @evtlog: pointer to evtlog
277 * @index: filter index to retrieve
278 * @buf: pointer to output filter buffer
279 * @bufsz: size of output filter buffer
280 * Returns: zero if a filter string was returned
281 */
282int sde_evtlog_get_filter(struct sde_dbg_evtlog *evtlog, int index,
283 char *buf, size_t bufsz);
284
Lloyd Atkinson5d40d312016-09-06 08:34:13 -0400285#else
Lloyd Atkinson113aefd2016-10-23 13:15:18 -0400286static inline struct sde_dbg_evtlog *sde_evtlog_init(void)
287{
288 return NULL;
289}
290
291static inline void sde_evtlog_destroy(struct sde_dbg_evtlog *evtlog)
292{
293}
294
295static inline void sde_evtlog_log(struct sde_dbg_evtlog *evtlog,
296 const char *name, int line, int flag, ...)
297{
298}
299
300static inline void sde_evtlog_dump_all(struct sde_dbg_evtlog *evtlog)
301{
302}
303
304static inline bool sde_evtlog_is_enabled(struct sde_dbg_evtlog *evtlog,
305 u32 flag)
306{
307 return false;
308}
309
310static inline ssize_t sde_evtlog_dump_to_buffer(struct sde_dbg_evtlog *evtlog,
311 char *evtlog_buf, ssize_t evtlog_buf_size)
312{
313 return 0;
314}
315
Clarence Ip6ac61cc2017-03-22 15:01:53 -0400316static inline void sde_dbg_init_dbg_buses(u32 hwversion)
Lloyd Atkinson274cc462017-02-21 11:52:06 -0500317{
318}
319
Lloyd Atkinsonb020e0f2017-03-14 08:05:18 -0700320static inline int sde_dbg_init(struct device *dev,
Lloyd Atkinson113aefd2016-10-23 13:15:18 -0400321 struct sde_dbg_power_ctrl *power_ctrl)
322{
323 return 0;
324}
325
Clarence Ip6ac61cc2017-03-22 15:01:53 -0400326static inline int sde_dbg_debugfs_register(struct dentry *debugfs_root)
Lloyd Atkinsonb020e0f2017-03-14 08:05:18 -0700327{
328 return 0;
329}
330
Lloyd Atkinson113aefd2016-10-23 13:15:18 -0400331static inline void sde_dbg_destroy(void)
332{
333}
334
335static inline void sde_dbg_dump(bool queue_work, const char *name, ...)
336{
337}
338
339static inline int sde_dbg_reg_register_base(const char *name,
340 void __iomem *base, size_t max_offset)
341{
342 return 0;
343}
344
345static inline void sde_dbg_reg_register_dump_range(const char *base_name,
346 const char *range_name, u32 offset_start, u32 offset_end,
347 uint32_t xin_id)
348{
349}
350
Lloyd Atkinsonac4b6e02017-03-23 11:43:48 -0700351void sde_dbg_set_sde_top_offset(u32 blk_off)
352{
353}
354
Clarence Ip6ac61cc2017-03-22 15:01:53 -0400355static inline void sde_evtlog_set_filter(
356 struct sde_dbg_evtlog *evtlog, char *filter)
357{
358}
359
360static inline int sde_evtlog_get_filter(struct sde_dbg_evtlog *evtlog,
361 int index, char *buf, size_t bufsz)
362{
363 return -EINVAL;
364}
365
Lloyd Atkinson113aefd2016-10-23 13:15:18 -0400366#endif /* defined(CONFIG_DEBUG_FS) */
367
Lloyd Atkinson5d40d312016-09-06 08:34:13 -0400368
369#endif /* SDE_DBG_H_ */