1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26#ifndef DRM_PRINT_H_
27#define DRM_PRINT_H_
28
29#include <linux/compiler.h>
30#include <linux/printk.h>
31#include <linux/seq_file.h>
32#include <linux/device.h>
33#include <linux/debugfs.h>
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70struct drm_printer {
71
72 void (*printfn)(struct drm_printer *p, struct va_format *vaf);
73 void (*puts)(struct drm_printer *p, const char *str);
74 void *arg;
75 const char *prefix;
76};
77
78void __drm_printfn_coredump(struct drm_printer *p, struct va_format *vaf);
79void __drm_puts_coredump(struct drm_printer *p, const char *str);
80void __drm_printfn_seq_file(struct drm_printer *p, struct va_format *vaf);
81void __drm_puts_seq_file(struct drm_printer *p, const char *str);
82void __drm_printfn_info(struct drm_printer *p, struct va_format *vaf);
83void __drm_printfn_debug(struct drm_printer *p, struct va_format *vaf);
84
85__printf(2, 3)
86void drm_printf(struct drm_printer *p, const char *f, ...);
87void drm_puts(struct drm_printer *p, const char *str);
88void drm_print_regset32(struct drm_printer *p, struct debugfs_regset32 *regset);
89
90__printf(2, 0)
91
92
93
94
95
96
97static inline void
98drm_vprintf(struct drm_printer *p, const char *fmt, va_list *va)
99{
100 struct va_format vaf = { .fmt = fmt, .va = va };
101
102 p->printfn(p, &vaf);
103}
104
105
106
107
108
109
110
111#define drm_printf_indent(printer, indent, fmt, ...) \
112 drm_printf((printer), "%.*s" fmt, (indent), "\t\t\t\t\tX", ##__VA_ARGS__)
113
114
115
116
117
118
119
120struct drm_print_iterator {
121 void *data;
122 ssize_t start;
123 ssize_t remain;
124
125 ssize_t offset;
126};
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164static inline struct drm_printer
165drm_coredump_printer(struct drm_print_iterator *iter)
166{
167 struct drm_printer p = {
168 .printfn = __drm_printfn_coredump,
169 .puts = __drm_puts_coredump,
170 .arg = iter,
171 };
172
173
174 iter->offset = 0;
175
176 return p;
177}
178
179
180
181
182
183
184
185
186static inline struct drm_printer drm_seq_file_printer(struct seq_file *f)
187{
188 struct drm_printer p = {
189 .printfn = __drm_printfn_seq_file,
190 .puts = __drm_puts_seq_file,
191 .arg = f,
192 };
193 return p;
194}
195
196
197
198
199
200
201
202
203static inline struct drm_printer drm_info_printer(struct device *dev)
204{
205 struct drm_printer p = {
206 .printfn = __drm_printfn_info,
207 .arg = dev,
208 };
209 return p;
210}
211
212
213
214
215
216
217
218
219static inline struct drm_printer drm_debug_printer(const char *prefix)
220{
221 struct drm_printer p = {
222 .printfn = __drm_printfn_debug,
223 .prefix = prefix
224 };
225 return p;
226}
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262#define DRM_UT_NONE 0x00
263#define DRM_UT_CORE 0x01
264#define DRM_UT_DRIVER 0x02
265#define DRM_UT_KMS 0x04
266#define DRM_UT_PRIME 0x08
267#define DRM_UT_ATOMIC 0x10
268#define DRM_UT_VBL 0x20
269#define DRM_UT_STATE 0x40
270#define DRM_UT_LEASE 0x80
271#define DRM_UT_DP 0x100
272
273__printf(3, 4)
274void drm_dev_printk(const struct device *dev, const char *level,
275 const char *format, ...);
276__printf(3, 4)
277void drm_dev_dbg(const struct device *dev, unsigned int category,
278 const char *format, ...);
279
280__printf(2, 3)
281void drm_dbg(unsigned int category, const char *format, ...);
282__printf(1, 2)
283void drm_err(const char *format, ...);
284
285
286
287#define _DRM_PRINTK(once, level, fmt, ...) \
288 printk##once(KERN_##level "[" DRM_NAME "] " fmt, ##__VA_ARGS__)
289
290#define DRM_INFO(fmt, ...) \
291 _DRM_PRINTK(, INFO, fmt, ##__VA_ARGS__)
292#define DRM_NOTE(fmt, ...) \
293 _DRM_PRINTK(, NOTICE, fmt, ##__VA_ARGS__)
294#define DRM_WARN(fmt, ...) \
295 _DRM_PRINTK(, WARNING, fmt, ##__VA_ARGS__)
296
297#define DRM_INFO_ONCE(fmt, ...) \
298 _DRM_PRINTK(_once, INFO, fmt, ##__VA_ARGS__)
299#define DRM_NOTE_ONCE(fmt, ...) \
300 _DRM_PRINTK(_once, NOTICE, fmt, ##__VA_ARGS__)
301#define DRM_WARN_ONCE(fmt, ...) \
302 _DRM_PRINTK(_once, WARNING, fmt, ##__VA_ARGS__)
303
304
305
306
307
308
309
310#define DRM_DEV_ERROR(dev, fmt, ...) \
311 drm_dev_printk(dev, KERN_ERR, "*ERROR* " fmt, ##__VA_ARGS__)
312#define DRM_ERROR(fmt, ...) \
313 drm_err(fmt, ##__VA_ARGS__)
314
315
316
317
318
319
320
321#define DRM_DEV_ERROR_RATELIMITED(dev, fmt, ...) \
322({ \
323 static DEFINE_RATELIMIT_STATE(_rs, \
324 DEFAULT_RATELIMIT_INTERVAL, \
325 DEFAULT_RATELIMIT_BURST); \
326 \
327 if (__ratelimit(&_rs)) \
328 DRM_DEV_ERROR(dev, fmt, ##__VA_ARGS__); \
329})
330#define DRM_ERROR_RATELIMITED(fmt, ...) \
331 DRM_DEV_ERROR_RATELIMITED(NULL, fmt, ##__VA_ARGS__)
332
333#define DRM_DEV_INFO(dev, fmt, ...) \
334 drm_dev_printk(dev, KERN_INFO, fmt, ##__VA_ARGS__)
335
336#define DRM_DEV_INFO_ONCE(dev, fmt, ...) \
337({ \
338 static bool __print_once __read_mostly; \
339 if (!__print_once) { \
340 __print_once = true; \
341 DRM_DEV_INFO(dev, fmt, ##__VA_ARGS__); \
342 } \
343})
344
345
346
347
348
349
350
351#define DRM_DEV_DEBUG(dev, fmt, ...) \
352 drm_dev_dbg(dev, DRM_UT_CORE, fmt, ##__VA_ARGS__)
353#define DRM_DEBUG(fmt, ...) \
354 drm_dbg(DRM_UT_CORE, fmt, ##__VA_ARGS__)
355
356#define DRM_DEV_DEBUG_DRIVER(dev, fmt, ...) \
357 drm_dev_dbg(dev, DRM_UT_DRIVER, fmt, ##__VA_ARGS__)
358#define DRM_DEBUG_DRIVER(fmt, ...) \
359 drm_dbg(DRM_UT_DRIVER, fmt, ##__VA_ARGS__)
360
361#define DRM_DEV_DEBUG_KMS(dev, fmt, ...) \
362 drm_dev_dbg(dev, DRM_UT_KMS, fmt, ##__VA_ARGS__)
363#define DRM_DEBUG_KMS(fmt, ...) \
364 drm_dbg(DRM_UT_KMS, fmt, ##__VA_ARGS__)
365
366#define DRM_DEV_DEBUG_PRIME(dev, fmt, ...) \
367 drm_dev_dbg(dev, DRM_UT_PRIME, fmt, ##__VA_ARGS__)
368#define DRM_DEBUG_PRIME(fmt, ...) \
369 drm_dbg(DRM_UT_PRIME, fmt, ##__VA_ARGS__)
370
371#define DRM_DEV_DEBUG_ATOMIC(dev, fmt, ...) \
372 drm_dev_dbg(dev, DRM_UT_ATOMIC, fmt, ##__VA_ARGS__)
373#define DRM_DEBUG_ATOMIC(fmt, ...) \
374 drm_dbg(DRM_UT_ATOMIC, fmt, ##__VA_ARGS__)
375
376#define DRM_DEV_DEBUG_VBL(dev, fmt, ...) \
377 drm_dev_dbg(dev, DRM_UT_VBL, fmt, ##__VA_ARGS__)
378#define DRM_DEBUG_VBL(fmt, ...) \
379 drm_dbg(DRM_UT_VBL, fmt, ##__VA_ARGS__)
380
381#define DRM_DEBUG_LEASE(fmt, ...) \
382 drm_dbg(DRM_UT_LEASE, fmt, ##__VA_ARGS__)
383
384#define DRM_DEV_DEBUG_DP(dev, fmt, ...) \
385 drm_dev_dbg(dev, DRM_UT_DP, fmt, ## __VA_ARGS__)
386#define DRM_DEBUG_DP(fmt, ...) \
387 drm_dbg(DRM_UT_DP, fmt, ## __VA_ARGS__)
388
389#define _DRM_DEV_DEFINE_DEBUG_RATELIMITED(dev, category, fmt, ...) \
390({ \
391 static DEFINE_RATELIMIT_STATE(_rs, \
392 DEFAULT_RATELIMIT_INTERVAL, \
393 DEFAULT_RATELIMIT_BURST); \
394 if (__ratelimit(&_rs)) \
395 drm_dev_dbg(dev, category, fmt, ##__VA_ARGS__); \
396})
397
398
399
400
401
402
403
404#define DRM_DEV_DEBUG_RATELIMITED(dev, fmt, ...) \
405 _DEV_DRM_DEFINE_DEBUG_RATELIMITED(dev, DRM_UT_CORE, \
406 fmt, ##__VA_ARGS__)
407#define DRM_DEBUG_RATELIMITED(fmt, ...) \
408 DRM_DEV_DEBUG_RATELIMITED(NULL, fmt, ##__VA_ARGS__)
409
410#define DRM_DEV_DEBUG_DRIVER_RATELIMITED(dev, fmt, ...) \
411 _DRM_DEV_DEFINE_DEBUG_RATELIMITED(dev, DRM_UT_DRIVER, \
412 fmt, ##__VA_ARGS__)
413#define DRM_DEBUG_DRIVER_RATELIMITED(fmt, ...) \
414 DRM_DEV_DEBUG_DRIVER_RATELIMITED(NULL, fmt, ##__VA_ARGS__)
415
416#define DRM_DEV_DEBUG_KMS_RATELIMITED(dev, fmt, ...) \
417 _DRM_DEV_DEFINE_DEBUG_RATELIMITED(dev, DRM_UT_KMS, \
418 fmt, ##__VA_ARGS__)
419#define DRM_DEBUG_KMS_RATELIMITED(fmt, ...) \
420 DRM_DEV_DEBUG_KMS_RATELIMITED(NULL, fmt, ##__VA_ARGS__)
421
422#define DRM_DEV_DEBUG_PRIME_RATELIMITED(dev, fmt, ...) \
423 _DRM_DEV_DEFINE_DEBUG_RATELIMITED(dev, DRM_UT_PRIME, \
424 fmt, ##__VA_ARGS__)
425#define DRM_DEBUG_PRIME_RATELIMITED(fmt, ...) \
426 DRM_DEV_DEBUG_PRIME_RATELIMITED(NULL, fmt, ##__VA_ARGS__)
427
428#endif
429