1d8187177SRob Clark /* 2d8187177SRob Clark * Copyright (C) 2016 Red Hat 3d8187177SRob Clark * 4d8187177SRob Clark * Permission is hereby granted, free of charge, to any person obtaining a 5d8187177SRob Clark * copy of this software and associated documentation files (the "Software"), 6d8187177SRob Clark * to deal in the Software without restriction, including without limitation 7d8187177SRob Clark * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8d8187177SRob Clark * and/or sell copies of the Software, and to permit persons to whom the 9d8187177SRob Clark * Software is furnished to do so, subject to the following conditions: 10d8187177SRob Clark * 11d8187177SRob Clark * The above copyright notice and this permission notice shall be included in 12d8187177SRob Clark * all copies or substantial portions of the Software. 13d8187177SRob Clark * 14d8187177SRob Clark * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15d8187177SRob Clark * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16d8187177SRob Clark * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 17d8187177SRob Clark * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 18d8187177SRob Clark * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 19d8187177SRob Clark * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 20d8187177SRob Clark * OTHER DEALINGS IN THE SOFTWARE. 21d8187177SRob Clark * 22d8187177SRob Clark * Authors: 23d8187177SRob Clark * Rob Clark <robdclark@gmail.com> 24d8187177SRob Clark */ 25d8187177SRob Clark 26d8187177SRob Clark #ifndef DRM_PRINT_H_ 27d8187177SRob Clark #define DRM_PRINT_H_ 28d8187177SRob Clark 293c6d6e0fSJoe Perches #include <linux/compiler.h> 303c6d6e0fSJoe Perches #include <linux/printk.h> 31d8187177SRob Clark #include <linux/seq_file.h> 32d8187177SRob Clark #include <linux/device.h> 335f513cc8SEric Anholt #include <linux/debugfs.h> 34d8187177SRob Clark 35656600efSSam Ravnborg #include <drm/drm.h> 36656600efSSam Ravnborg 37d8187177SRob Clark /** 38d8187177SRob Clark * DOC: print 39d8187177SRob Clark * 40d8187177SRob Clark * A simple wrapper for dev_printk(), seq_printf(), etc. Allows same 41d8187177SRob Clark * debug code to be used for both debugfs and printk logging. 42d8187177SRob Clark * 43d8187177SRob Clark * For example:: 44d8187177SRob Clark * 45d8187177SRob Clark * void log_some_info(struct drm_printer *p) 46d8187177SRob Clark * { 47d8187177SRob Clark * drm_printf(p, "foo=%d\n", foo); 48d8187177SRob Clark * drm_printf(p, "bar=%d\n", bar); 49d8187177SRob Clark * } 50d8187177SRob Clark * 51d8187177SRob Clark * #ifdef CONFIG_DEBUG_FS 52d8187177SRob Clark * void debugfs_show(struct seq_file *f) 53d8187177SRob Clark * { 54d8187177SRob Clark * struct drm_printer p = drm_seq_file_printer(f); 55d8187177SRob Clark * log_some_info(&p); 56d8187177SRob Clark * } 57d8187177SRob Clark * #endif 58d8187177SRob Clark * 59d8187177SRob Clark * void some_other_function(...) 60d8187177SRob Clark * { 61d8187177SRob Clark * struct drm_printer p = drm_info_printer(drm->dev); 62d8187177SRob Clark * log_some_info(&p); 63d8187177SRob Clark * } 64d8187177SRob Clark */ 65d8187177SRob Clark 66d8187177SRob Clark /** 67d8187177SRob Clark * struct drm_printer - drm output "stream" 68d8187177SRob Clark * 69d8187177SRob Clark * Do not use struct members directly. Use drm_printer_seq_file(), 70d8187177SRob Clark * drm_printer_info(), etc to initialize. And drm_printf() for output. 71d8187177SRob Clark */ 72d8187177SRob Clark struct drm_printer { 733d387d92SDaniel Vetter /* private: */ 74d8187177SRob Clark void (*printfn)(struct drm_printer *p, struct va_format *vaf); 7563f4cc01SJordan Crouse void (*puts)(struct drm_printer *p, const char *str); 76d8187177SRob Clark void *arg; 773d387d92SDaniel Vetter const char *prefix; 78d8187177SRob Clark }; 79d8187177SRob Clark 80cfc57a18SJordan Crouse void __drm_printfn_coredump(struct drm_printer *p, struct va_format *vaf); 815dc634bdSJordan Crouse void __drm_puts_coredump(struct drm_printer *p, const char *str); 82d8187177SRob Clark void __drm_printfn_seq_file(struct drm_printer *p, struct va_format *vaf); 834538d732SJordan Crouse void __drm_puts_seq_file(struct drm_printer *p, const char *str); 84d8187177SRob Clark void __drm_printfn_info(struct drm_printer *p, struct va_format *vaf); 853d387d92SDaniel Vetter void __drm_printfn_debug(struct drm_printer *p, struct va_format *vaf); 860de54fb2SLyude Paul void __drm_printfn_err(struct drm_printer *p, struct va_format *vaf); 87d8187177SRob Clark 883c6d6e0fSJoe Perches __printf(2, 3) 89d8187177SRob Clark void drm_printf(struct drm_printer *p, const char *f, ...); 9063f4cc01SJordan Crouse void drm_puts(struct drm_printer *p, const char *str); 915f513cc8SEric Anholt void drm_print_regset32(struct drm_printer *p, struct debugfs_regset32 *regset); 92d8187177SRob Clark 9342f1b310SDaniel Vetter __printf(2, 0) 94bf6234a2SNoralf Trønnes /** 95e2b155e9SChris Wilson * drm_vprintf - print to a &drm_printer stream 96e2b155e9SChris Wilson * @p: the &drm_printer 97e2b155e9SChris Wilson * @fmt: format string 98e2b155e9SChris Wilson * @va: the va_list 99e2b155e9SChris Wilson */ 100e2b155e9SChris Wilson static inline void 101e2b155e9SChris Wilson drm_vprintf(struct drm_printer *p, const char *fmt, va_list *va) 102e2b155e9SChris Wilson { 103e2b155e9SChris Wilson struct va_format vaf = { .fmt = fmt, .va = va }; 104e2b155e9SChris Wilson 105e2b155e9SChris Wilson p->printfn(p, &vaf); 106e2b155e9SChris Wilson } 107e2b155e9SChris Wilson 108e2b155e9SChris Wilson /** 109bf6234a2SNoralf Trønnes * drm_printf_indent - Print to a &drm_printer stream with indentation 110bf6234a2SNoralf Trønnes * @printer: DRM printer 111bf6234a2SNoralf Trønnes * @indent: Tab indentation level (max 5) 112bf6234a2SNoralf Trønnes * @fmt: Format string 113bf6234a2SNoralf Trønnes */ 114bf6234a2SNoralf Trønnes #define drm_printf_indent(printer, indent, fmt, ...) \ 115bf6234a2SNoralf Trønnes drm_printf((printer), "%.*s" fmt, (indent), "\t\t\t\t\tX", ##__VA_ARGS__) 116d8187177SRob Clark 117d8187177SRob Clark /** 118cfc57a18SJordan Crouse * struct drm_print_iterator - local struct used with drm_printer_coredump 119cfc57a18SJordan Crouse * @data: Pointer to the devcoredump output buffer 120cfc57a18SJordan Crouse * @start: The offset within the buffer to start writing 121cfc57a18SJordan Crouse * @remain: The number of bytes to write for this iteration 122cfc57a18SJordan Crouse */ 123cfc57a18SJordan Crouse struct drm_print_iterator { 124cfc57a18SJordan Crouse void *data; 125cfc57a18SJordan Crouse ssize_t start; 126cfc57a18SJordan Crouse ssize_t remain; 127cfc57a18SJordan Crouse /* private: */ 128cfc57a18SJordan Crouse ssize_t offset; 129cfc57a18SJordan Crouse }; 130cfc57a18SJordan Crouse 131cfc57a18SJordan Crouse /** 132cfc57a18SJordan Crouse * drm_coredump_printer - construct a &drm_printer that can output to a buffer 133cfc57a18SJordan Crouse * from the read function for devcoredump 134cfc57a18SJordan Crouse * @iter: A pointer to a struct drm_print_iterator for the read instance 135cfc57a18SJordan Crouse * 136cfc57a18SJordan Crouse * This wrapper extends drm_printf() to work with a dev_coredumpm() callback 137cfc57a18SJordan Crouse * function. The passed in drm_print_iterator struct contains the buffer 138cfc57a18SJordan Crouse * pointer, size and offset as passed in from devcoredump. 139cfc57a18SJordan Crouse * 140cfc57a18SJordan Crouse * For example:: 141cfc57a18SJordan Crouse * 142cfc57a18SJordan Crouse * void coredump_read(char *buffer, loff_t offset, size_t count, 143cfc57a18SJordan Crouse * void *data, size_t datalen) 144cfc57a18SJordan Crouse * { 145cfc57a18SJordan Crouse * struct drm_print_iterator iter; 146cfc57a18SJordan Crouse * struct drm_printer p; 147cfc57a18SJordan Crouse * 148cfc57a18SJordan Crouse * iter.data = buffer; 149cfc57a18SJordan Crouse * iter.start = offset; 150cfc57a18SJordan Crouse * iter.remain = count; 151cfc57a18SJordan Crouse * 152cfc57a18SJordan Crouse * p = drm_coredump_printer(&iter); 153cfc57a18SJordan Crouse * 154cfc57a18SJordan Crouse * drm_printf(p, "foo=%d\n", foo); 155cfc57a18SJordan Crouse * } 156cfc57a18SJordan Crouse * 157cfc57a18SJordan Crouse * void makecoredump(...) 158cfc57a18SJordan Crouse * { 159cfc57a18SJordan Crouse * ... 160cfc57a18SJordan Crouse * dev_coredumpm(dev, THIS_MODULE, data, 0, GFP_KERNEL, 161cfc57a18SJordan Crouse * coredump_read, ...) 162cfc57a18SJordan Crouse * } 163cfc57a18SJordan Crouse * 164cfc57a18SJordan Crouse * RETURNS: 165cfc57a18SJordan Crouse * The &drm_printer object 166cfc57a18SJordan Crouse */ 167cfc57a18SJordan Crouse static inline struct drm_printer 168cfc57a18SJordan Crouse drm_coredump_printer(struct drm_print_iterator *iter) 169cfc57a18SJordan Crouse { 170cfc57a18SJordan Crouse struct drm_printer p = { 171cfc57a18SJordan Crouse .printfn = __drm_printfn_coredump, 1725dc634bdSJordan Crouse .puts = __drm_puts_coredump, 173cfc57a18SJordan Crouse .arg = iter, 174cfc57a18SJordan Crouse }; 175cfc57a18SJordan Crouse 176cfc57a18SJordan Crouse /* Set the internal offset of the iterator to zero */ 177cfc57a18SJordan Crouse iter->offset = 0; 178cfc57a18SJordan Crouse 179cfc57a18SJordan Crouse return p; 180cfc57a18SJordan Crouse } 181cfc57a18SJordan Crouse 182cfc57a18SJordan Crouse /** 183d8187177SRob Clark * drm_seq_file_printer - construct a &drm_printer that outputs to &seq_file 184ea0dd85aSDaniel Vetter * @f: the &struct seq_file to output to 185d8187177SRob Clark * 186d8187177SRob Clark * RETURNS: 187d8187177SRob Clark * The &drm_printer object 188d8187177SRob Clark */ 189d8187177SRob Clark static inline struct drm_printer drm_seq_file_printer(struct seq_file *f) 190d8187177SRob Clark { 191d8187177SRob Clark struct drm_printer p = { 192d8187177SRob Clark .printfn = __drm_printfn_seq_file, 1934538d732SJordan Crouse .puts = __drm_puts_seq_file, 194d8187177SRob Clark .arg = f, 195d8187177SRob Clark }; 196d8187177SRob Clark return p; 197d8187177SRob Clark } 198d8187177SRob Clark 199d8187177SRob Clark /** 200d8187177SRob Clark * drm_info_printer - construct a &drm_printer that outputs to dev_printk() 201ea0dd85aSDaniel Vetter * @dev: the &struct device pointer 202d8187177SRob Clark * 203d8187177SRob Clark * RETURNS: 204d8187177SRob Clark * The &drm_printer object 205d8187177SRob Clark */ 206d8187177SRob Clark static inline struct drm_printer drm_info_printer(struct device *dev) 207d8187177SRob Clark { 208d8187177SRob Clark struct drm_printer p = { 209d8187177SRob Clark .printfn = __drm_printfn_info, 210d8187177SRob Clark .arg = dev, 211d8187177SRob Clark }; 212d8187177SRob Clark return p; 213d8187177SRob Clark } 214d8187177SRob Clark 2153d387d92SDaniel Vetter /** 2163d387d92SDaniel Vetter * drm_debug_printer - construct a &drm_printer that outputs to pr_debug() 2173d387d92SDaniel Vetter * @prefix: debug output prefix 2183d387d92SDaniel Vetter * 2193d387d92SDaniel Vetter * RETURNS: 2203d387d92SDaniel Vetter * The &drm_printer object 2213d387d92SDaniel Vetter */ 2223d387d92SDaniel Vetter static inline struct drm_printer drm_debug_printer(const char *prefix) 2233d387d92SDaniel Vetter { 2243d387d92SDaniel Vetter struct drm_printer p = { 2253d387d92SDaniel Vetter .printfn = __drm_printfn_debug, 2263d387d92SDaniel Vetter .prefix = prefix 2273d387d92SDaniel Vetter }; 2283d387d92SDaniel Vetter return p; 2293d387d92SDaniel Vetter } 23002c9656bSHaneen Mohammed 2310de54fb2SLyude Paul /** 2320de54fb2SLyude Paul * drm_err_printer - construct a &drm_printer that outputs to pr_err() 2330de54fb2SLyude Paul * @prefix: debug output prefix 2340de54fb2SLyude Paul * 2350de54fb2SLyude Paul * RETURNS: 2360de54fb2SLyude Paul * The &drm_printer object 2370de54fb2SLyude Paul */ 2380de54fb2SLyude Paul static inline struct drm_printer drm_err_printer(const char *prefix) 2390de54fb2SLyude Paul { 2400de54fb2SLyude Paul struct drm_printer p = { 2410de54fb2SLyude Paul .printfn = __drm_printfn_err, 2420de54fb2SLyude Paul .prefix = prefix 2430de54fb2SLyude Paul }; 2440de54fb2SLyude Paul return p; 2450de54fb2SLyude Paul } 2460de54fb2SLyude Paul 24702c9656bSHaneen Mohammed /* 24802c9656bSHaneen Mohammed * The following categories are defined: 24902c9656bSHaneen Mohammed * 25002c9656bSHaneen Mohammed * CORE: Used in the generic drm code: drm_ioctl.c, drm_mm.c, drm_memory.c, ... 25102c9656bSHaneen Mohammed * This is the category used by the DRM_DEBUG() macro. 25202c9656bSHaneen Mohammed * 25302c9656bSHaneen Mohammed * DRIVER: Used in the vendor specific part of the driver: i915, radeon, ... 25402c9656bSHaneen Mohammed * This is the category used by the DRM_DEBUG_DRIVER() macro. 25502c9656bSHaneen Mohammed * 25602c9656bSHaneen Mohammed * KMS: used in the modesetting code. 25702c9656bSHaneen Mohammed * This is the category used by the DRM_DEBUG_KMS() macro. 25802c9656bSHaneen Mohammed * 25902c9656bSHaneen Mohammed * PRIME: used in the prime code. 26002c9656bSHaneen Mohammed * This is the category used by the DRM_DEBUG_PRIME() macro. 26102c9656bSHaneen Mohammed * 26202c9656bSHaneen Mohammed * ATOMIC: used in the atomic code. 26302c9656bSHaneen Mohammed * This is the category used by the DRM_DEBUG_ATOMIC() macro. 26402c9656bSHaneen Mohammed * 26502c9656bSHaneen Mohammed * VBL: used for verbose debug message in the vblank code 26602c9656bSHaneen Mohammed * This is the category used by the DRM_DEBUG_VBL() macro. 26702c9656bSHaneen Mohammed * 26802c9656bSHaneen Mohammed * Enabling verbose debug messages is done through the drm.debug parameter, 26902c9656bSHaneen Mohammed * each category being enabled by a bit. 27002c9656bSHaneen Mohammed * 27102c9656bSHaneen Mohammed * drm.debug=0x1 will enable CORE messages 27202c9656bSHaneen Mohammed * drm.debug=0x2 will enable DRIVER messages 27302c9656bSHaneen Mohammed * drm.debug=0x3 will enable CORE and DRIVER messages 27402c9656bSHaneen Mohammed * ... 27502c9656bSHaneen Mohammed * drm.debug=0x3f will enable all messages 27602c9656bSHaneen Mohammed * 27702c9656bSHaneen Mohammed * An interesting feature is that it's possible to enable verbose logging at 27802c9656bSHaneen Mohammed * run-time by echoing the debug value in its sysfs node: 27902c9656bSHaneen Mohammed * # echo 0xf > /sys/module/drm/parameters/debug 28002c9656bSHaneen Mohammed */ 28102c9656bSHaneen Mohammed #define DRM_UT_NONE 0x00 28202c9656bSHaneen Mohammed #define DRM_UT_CORE 0x01 28302c9656bSHaneen Mohammed #define DRM_UT_DRIVER 0x02 28402c9656bSHaneen Mohammed #define DRM_UT_KMS 0x04 28502c9656bSHaneen Mohammed #define DRM_UT_PRIME 0x08 28602c9656bSHaneen Mohammed #define DRM_UT_ATOMIC 0x10 28702c9656bSHaneen Mohammed #define DRM_UT_VBL 0x20 28802c9656bSHaneen Mohammed #define DRM_UT_STATE 0x40 28970c5f936SDaniel Vetter #define DRM_UT_LEASE 0x80 290a18b2192SLyude Paul #define DRM_UT_DP 0x100 29102c9656bSHaneen Mohammed 292db870864SJoe Perches __printf(3, 4) 29302c9656bSHaneen Mohammed void drm_dev_printk(const struct device *dev, const char *level, 294db870864SJoe Perches const char *format, ...); 295db870864SJoe Perches __printf(3, 4) 296db870864SJoe Perches void drm_dev_dbg(const struct device *dev, unsigned int category, 297db870864SJoe Perches const char *format, ...); 298db870864SJoe Perches 29999a95487SJoe Perches __printf(2, 3) 30099a95487SJoe Perches void drm_dbg(unsigned int category, const char *format, ...); 30199a95487SJoe Perches __printf(1, 2) 30299a95487SJoe Perches void drm_err(const char *format, ...); 303091756bbSHaneen Mohammed 304091756bbSHaneen Mohammed /* Macros to make printk easier */ 30502c9656bSHaneen Mohammed 30602c9656bSHaneen Mohammed #define _DRM_PRINTK(once, level, fmt, ...) \ 307db870864SJoe Perches printk##once(KERN_##level "[" DRM_NAME "] " fmt, ##__VA_ARGS__) 30802c9656bSHaneen Mohammed 30902c9656bSHaneen Mohammed #define DRM_INFO(fmt, ...) \ 31002c9656bSHaneen Mohammed _DRM_PRINTK(, INFO, fmt, ##__VA_ARGS__) 31102c9656bSHaneen Mohammed #define DRM_NOTE(fmt, ...) \ 31202c9656bSHaneen Mohammed _DRM_PRINTK(, NOTICE, fmt, ##__VA_ARGS__) 31302c9656bSHaneen Mohammed #define DRM_WARN(fmt, ...) \ 31402c9656bSHaneen Mohammed _DRM_PRINTK(, WARNING, fmt, ##__VA_ARGS__) 31502c9656bSHaneen Mohammed 31602c9656bSHaneen Mohammed #define DRM_INFO_ONCE(fmt, ...) \ 31702c9656bSHaneen Mohammed _DRM_PRINTK(_once, INFO, fmt, ##__VA_ARGS__) 31802c9656bSHaneen Mohammed #define DRM_NOTE_ONCE(fmt, ...) \ 31902c9656bSHaneen Mohammed _DRM_PRINTK(_once, NOTICE, fmt, ##__VA_ARGS__) 32002c9656bSHaneen Mohammed #define DRM_WARN_ONCE(fmt, ...) \ 32102c9656bSHaneen Mohammed _DRM_PRINTK(_once, WARNING, fmt, ##__VA_ARGS__) 32202c9656bSHaneen Mohammed 32302c9656bSHaneen Mohammed /** 32402c9656bSHaneen Mohammed * Error output. 32502c9656bSHaneen Mohammed * 326091756bbSHaneen Mohammed * @dev: device pointer 327091756bbSHaneen Mohammed * @fmt: printf() like format string. 32802c9656bSHaneen Mohammed */ 32902c9656bSHaneen Mohammed #define DRM_DEV_ERROR(dev, fmt, ...) \ 330db870864SJoe Perches drm_dev_printk(dev, KERN_ERR, "*ERROR* " fmt, ##__VA_ARGS__) 33102c9656bSHaneen Mohammed #define DRM_ERROR(fmt, ...) \ 33299a95487SJoe Perches drm_err(fmt, ##__VA_ARGS__) 33302c9656bSHaneen Mohammed 33402c9656bSHaneen Mohammed /** 33502c9656bSHaneen Mohammed * Rate limited error output. Like DRM_ERROR() but won't flood the log. 33602c9656bSHaneen Mohammed * 337091756bbSHaneen Mohammed * @dev: device pointer 338091756bbSHaneen Mohammed * @fmt: printf() like format string. 33902c9656bSHaneen Mohammed */ 34002c9656bSHaneen Mohammed #define DRM_DEV_ERROR_RATELIMITED(dev, fmt, ...) \ 34102c9656bSHaneen Mohammed ({ \ 34202c9656bSHaneen Mohammed static DEFINE_RATELIMIT_STATE(_rs, \ 34302c9656bSHaneen Mohammed DEFAULT_RATELIMIT_INTERVAL, \ 34402c9656bSHaneen Mohammed DEFAULT_RATELIMIT_BURST); \ 34502c9656bSHaneen Mohammed \ 34602c9656bSHaneen Mohammed if (__ratelimit(&_rs)) \ 34702c9656bSHaneen Mohammed DRM_DEV_ERROR(dev, fmt, ##__VA_ARGS__); \ 34802c9656bSHaneen Mohammed }) 34902c9656bSHaneen Mohammed #define DRM_ERROR_RATELIMITED(fmt, ...) \ 35002c9656bSHaneen Mohammed DRM_DEV_ERROR_RATELIMITED(NULL, fmt, ##__VA_ARGS__) 35102c9656bSHaneen Mohammed 35202c9656bSHaneen Mohammed #define DRM_DEV_INFO(dev, fmt, ...) \ 353db870864SJoe Perches drm_dev_printk(dev, KERN_INFO, fmt, ##__VA_ARGS__) 35402c9656bSHaneen Mohammed 35502c9656bSHaneen Mohammed #define DRM_DEV_INFO_ONCE(dev, fmt, ...) \ 35602c9656bSHaneen Mohammed ({ \ 35702c9656bSHaneen Mohammed static bool __print_once __read_mostly; \ 35802c9656bSHaneen Mohammed if (!__print_once) { \ 35902c9656bSHaneen Mohammed __print_once = true; \ 36002c9656bSHaneen Mohammed DRM_DEV_INFO(dev, fmt, ##__VA_ARGS__); \ 36102c9656bSHaneen Mohammed } \ 36202c9656bSHaneen Mohammed }) 36302c9656bSHaneen Mohammed 36402c9656bSHaneen Mohammed /** 36502c9656bSHaneen Mohammed * Debug output. 36602c9656bSHaneen Mohammed * 367091756bbSHaneen Mohammed * @dev: device pointer 368091756bbSHaneen Mohammed * @fmt: printf() like format string. 36902c9656bSHaneen Mohammed */ 370db870864SJoe Perches #define DRM_DEV_DEBUG(dev, fmt, ...) \ 371db870864SJoe Perches drm_dev_dbg(dev, DRM_UT_CORE, fmt, ##__VA_ARGS__) 37202c9656bSHaneen Mohammed #define DRM_DEBUG(fmt, ...) \ 37399a95487SJoe Perches drm_dbg(DRM_UT_CORE, fmt, ##__VA_ARGS__) 37402c9656bSHaneen Mohammed 375db870864SJoe Perches #define DRM_DEV_DEBUG_DRIVER(dev, fmt, ...) \ 376db870864SJoe Perches drm_dev_dbg(dev, DRM_UT_DRIVER, fmt, ##__VA_ARGS__) 37702c9656bSHaneen Mohammed #define DRM_DEBUG_DRIVER(fmt, ...) \ 37899a95487SJoe Perches drm_dbg(DRM_UT_DRIVER, fmt, ##__VA_ARGS__) 37902c9656bSHaneen Mohammed 380db870864SJoe Perches #define DRM_DEV_DEBUG_KMS(dev, fmt, ...) \ 381db870864SJoe Perches drm_dev_dbg(dev, DRM_UT_KMS, fmt, ##__VA_ARGS__) 38202c9656bSHaneen Mohammed #define DRM_DEBUG_KMS(fmt, ...) \ 38399a95487SJoe Perches drm_dbg(DRM_UT_KMS, fmt, ##__VA_ARGS__) 38402c9656bSHaneen Mohammed 385db870864SJoe Perches #define DRM_DEV_DEBUG_PRIME(dev, fmt, ...) \ 386db870864SJoe Perches drm_dev_dbg(dev, DRM_UT_PRIME, fmt, ##__VA_ARGS__) 38702c9656bSHaneen Mohammed #define DRM_DEBUG_PRIME(fmt, ...) \ 38899a95487SJoe Perches drm_dbg(DRM_UT_PRIME, fmt, ##__VA_ARGS__) 38902c9656bSHaneen Mohammed 390db870864SJoe Perches #define DRM_DEV_DEBUG_ATOMIC(dev, fmt, ...) \ 391db870864SJoe Perches drm_dev_dbg(dev, DRM_UT_ATOMIC, fmt, ##__VA_ARGS__) 39202c9656bSHaneen Mohammed #define DRM_DEBUG_ATOMIC(fmt, ...) \ 39399a95487SJoe Perches drm_dbg(DRM_UT_ATOMIC, fmt, ##__VA_ARGS__) 39402c9656bSHaneen Mohammed 395db870864SJoe Perches #define DRM_DEV_DEBUG_VBL(dev, fmt, ...) \ 396db870864SJoe Perches drm_dev_dbg(dev, DRM_UT_VBL, fmt, ##__VA_ARGS__) 39702c9656bSHaneen Mohammed #define DRM_DEBUG_VBL(fmt, ...) \ 39899a95487SJoe Perches drm_dbg(DRM_UT_VBL, fmt, ##__VA_ARGS__) 39902c9656bSHaneen Mohammed 40070c5f936SDaniel Vetter #define DRM_DEBUG_LEASE(fmt, ...) \ 40199a95487SJoe Perches drm_dbg(DRM_UT_LEASE, fmt, ##__VA_ARGS__) 40270c5f936SDaniel Vetter 403a18b2192SLyude Paul #define DRM_DEV_DEBUG_DP(dev, fmt, ...) \ 404a18b2192SLyude Paul drm_dev_dbg(dev, DRM_UT_DP, fmt, ## __VA_ARGS__) 405106b6c39SLyude Paul #define DRM_DEBUG_DP(fmt, ...) \ 406a18b2192SLyude Paul drm_dbg(DRM_UT_DP, fmt, ## __VA_ARGS__) 407a18b2192SLyude Paul 408db870864SJoe Perches #define _DRM_DEV_DEFINE_DEBUG_RATELIMITED(dev, category, fmt, ...) \ 40902c9656bSHaneen Mohammed ({ \ 41002c9656bSHaneen Mohammed static DEFINE_RATELIMIT_STATE(_rs, \ 41102c9656bSHaneen Mohammed DEFAULT_RATELIMIT_INTERVAL, \ 41202c9656bSHaneen Mohammed DEFAULT_RATELIMIT_BURST); \ 41302c9656bSHaneen Mohammed if (__ratelimit(&_rs)) \ 414db870864SJoe Perches drm_dev_dbg(dev, category, fmt, ##__VA_ARGS__); \ 41502c9656bSHaneen Mohammed }) 41602c9656bSHaneen Mohammed 41702c9656bSHaneen Mohammed /** 41802c9656bSHaneen Mohammed * Rate limited debug output. Like DRM_DEBUG() but won't flood the log. 41902c9656bSHaneen Mohammed * 420091756bbSHaneen Mohammed * @dev: device pointer 421091756bbSHaneen Mohammed * @fmt: printf() like format string. 42202c9656bSHaneen Mohammed */ 423db870864SJoe Perches #define DRM_DEV_DEBUG_RATELIMITED(dev, fmt, ...) \ 424db870864SJoe Perches _DEV_DRM_DEFINE_DEBUG_RATELIMITED(dev, DRM_UT_CORE, \ 425db870864SJoe Perches fmt, ##__VA_ARGS__) 426db870864SJoe Perches #define DRM_DEBUG_RATELIMITED(fmt, ...) \ 427db870864SJoe Perches DRM_DEV_DEBUG_RATELIMITED(NULL, fmt, ##__VA_ARGS__) 428db870864SJoe Perches 429db870864SJoe Perches #define DRM_DEV_DEBUG_DRIVER_RATELIMITED(dev, fmt, ...) \ 430db870864SJoe Perches _DRM_DEV_DEFINE_DEBUG_RATELIMITED(dev, DRM_UT_DRIVER, \ 431db870864SJoe Perches fmt, ##__VA_ARGS__) 432db870864SJoe Perches #define DRM_DEBUG_DRIVER_RATELIMITED(fmt, ...) \ 433db870864SJoe Perches DRM_DEV_DEBUG_DRIVER_RATELIMITED(NULL, fmt, ##__VA_ARGS__) 434db870864SJoe Perches 435db870864SJoe Perches #define DRM_DEV_DEBUG_KMS_RATELIMITED(dev, fmt, ...) \ 436db870864SJoe Perches _DRM_DEV_DEFINE_DEBUG_RATELIMITED(dev, DRM_UT_KMS, \ 437db870864SJoe Perches fmt, ##__VA_ARGS__) 438db870864SJoe Perches #define DRM_DEBUG_KMS_RATELIMITED(fmt, ...) \ 439db870864SJoe Perches DRM_DEV_DEBUG_KMS_RATELIMITED(NULL, fmt, ##__VA_ARGS__) 440db870864SJoe Perches 441db870864SJoe Perches #define DRM_DEV_DEBUG_PRIME_RATELIMITED(dev, fmt, ...) \ 442db870864SJoe Perches _DRM_DEV_DEFINE_DEBUG_RATELIMITED(dev, DRM_UT_PRIME, \ 443db870864SJoe Perches fmt, ##__VA_ARGS__) 444db870864SJoe Perches #define DRM_DEBUG_PRIME_RATELIMITED(fmt, ...) \ 445db870864SJoe Perches DRM_DEV_DEBUG_PRIME_RATELIMITED(NULL, fmt, ##__VA_ARGS__) 44602c9656bSHaneen Mohammed 447d8187177SRob Clark #endif /* DRM_PRINT_H_ */ 448