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> 34ee7d633fSJim Cromie #include <linux/dynamic_debug.h> 35d8187177SRob Clark 36656600efSSam Ravnborg #include <drm/drm.h> 37656600efSSam Ravnborg 389f0ac028SJani Nikula /* Do *not* use outside of drm_print.[ch]! */ 39f158936bSJim Cromie extern unsigned long __drm_debug; 40959b077fSJani Nikula 41d8187177SRob Clark /** 42d8187177SRob Clark * DOC: print 43d8187177SRob Clark * 44d8187177SRob Clark * A simple wrapper for dev_printk(), seq_printf(), etc. Allows same 45d8187177SRob Clark * debug code to be used for both debugfs and printk logging. 46d8187177SRob Clark * 47d8187177SRob Clark * For example:: 48d8187177SRob Clark * 49d8187177SRob Clark * void log_some_info(struct drm_printer *p) 50d8187177SRob Clark * { 51d8187177SRob Clark * drm_printf(p, "foo=%d\n", foo); 52d8187177SRob Clark * drm_printf(p, "bar=%d\n", bar); 53d8187177SRob Clark * } 54d8187177SRob Clark * 55d8187177SRob Clark * #ifdef CONFIG_DEBUG_FS 56d8187177SRob Clark * void debugfs_show(struct seq_file *f) 57d8187177SRob Clark * { 58d8187177SRob Clark * struct drm_printer p = drm_seq_file_printer(f); 59d8187177SRob Clark * log_some_info(&p); 60d8187177SRob Clark * } 61d8187177SRob Clark * #endif 62d8187177SRob Clark * 63d8187177SRob Clark * void some_other_function(...) 64d8187177SRob Clark * { 65d8187177SRob Clark * struct drm_printer p = drm_info_printer(drm->dev); 66d8187177SRob Clark * log_some_info(&p); 67d8187177SRob Clark * } 68d8187177SRob Clark */ 69d8187177SRob Clark 70d8187177SRob Clark /** 71d8187177SRob Clark * struct drm_printer - drm output "stream" 72d8187177SRob Clark * 73d8187177SRob Clark * Do not use struct members directly. Use drm_printer_seq_file(), 74d8187177SRob Clark * drm_printer_info(), etc to initialize. And drm_printf() for output. 75d8187177SRob Clark */ 76d8187177SRob Clark struct drm_printer { 773d387d92SDaniel Vetter /* private: */ 78d8187177SRob Clark void (*printfn)(struct drm_printer *p, struct va_format *vaf); 7963f4cc01SJordan Crouse void (*puts)(struct drm_printer *p, const char *str); 80d8187177SRob Clark void *arg; 813d387d92SDaniel Vetter const char *prefix; 82d8187177SRob Clark }; 83d8187177SRob Clark 84cfc57a18SJordan Crouse void __drm_printfn_coredump(struct drm_printer *p, struct va_format *vaf); 855dc634bdSJordan Crouse void __drm_puts_coredump(struct drm_printer *p, const char *str); 86d8187177SRob Clark void __drm_printfn_seq_file(struct drm_printer *p, struct va_format *vaf); 874538d732SJordan Crouse void __drm_puts_seq_file(struct drm_printer *p, const char *str); 88d8187177SRob Clark void __drm_printfn_info(struct drm_printer *p, struct va_format *vaf); 893d387d92SDaniel Vetter void __drm_printfn_debug(struct drm_printer *p, struct va_format *vaf); 900de54fb2SLyude Paul void __drm_printfn_err(struct drm_printer *p, struct va_format *vaf); 91d8187177SRob Clark 923c6d6e0fSJoe Perches __printf(2, 3) 93d8187177SRob Clark void drm_printf(struct drm_printer *p, const char *f, ...); 9463f4cc01SJordan Crouse void drm_puts(struct drm_printer *p, const char *str); 955f513cc8SEric Anholt void drm_print_regset32(struct drm_printer *p, struct debugfs_regset32 *regset); 96141f6357SGerd Hoffmann void drm_print_bits(struct drm_printer *p, unsigned long value, 97141f6357SGerd Hoffmann const char * const bits[], unsigned int nbits); 98d8187177SRob Clark 9942f1b310SDaniel Vetter __printf(2, 0) 100bf6234a2SNoralf Trønnes /** 101e2b155e9SChris Wilson * drm_vprintf - print to a &drm_printer stream 102e2b155e9SChris Wilson * @p: the &drm_printer 103e2b155e9SChris Wilson * @fmt: format string 104e2b155e9SChris Wilson * @va: the va_list 105e2b155e9SChris Wilson */ 106e2b155e9SChris Wilson static inline void 107e2b155e9SChris Wilson drm_vprintf(struct drm_printer *p, const char *fmt, va_list *va) 108e2b155e9SChris Wilson { 109e2b155e9SChris Wilson struct va_format vaf = { .fmt = fmt, .va = va }; 110e2b155e9SChris Wilson 111e2b155e9SChris Wilson p->printfn(p, &vaf); 112e2b155e9SChris Wilson } 113e2b155e9SChris Wilson 114e2b155e9SChris Wilson /** 115bf6234a2SNoralf Trønnes * drm_printf_indent - Print to a &drm_printer stream with indentation 116bf6234a2SNoralf Trønnes * @printer: DRM printer 117bf6234a2SNoralf Trønnes * @indent: Tab indentation level (max 5) 118bf6234a2SNoralf Trønnes * @fmt: Format string 119bf6234a2SNoralf Trønnes */ 120bf6234a2SNoralf Trønnes #define drm_printf_indent(printer, indent, fmt, ...) \ 121bf6234a2SNoralf Trønnes drm_printf((printer), "%.*s" fmt, (indent), "\t\t\t\t\tX", ##__VA_ARGS__) 122d8187177SRob Clark 123d8187177SRob Clark /** 124cfc57a18SJordan Crouse * struct drm_print_iterator - local struct used with drm_printer_coredump 125cfc57a18SJordan Crouse * @data: Pointer to the devcoredump output buffer 126cfc57a18SJordan Crouse * @start: The offset within the buffer to start writing 127cfc57a18SJordan Crouse * @remain: The number of bytes to write for this iteration 128cfc57a18SJordan Crouse */ 129cfc57a18SJordan Crouse struct drm_print_iterator { 130cfc57a18SJordan Crouse void *data; 131cfc57a18SJordan Crouse ssize_t start; 132cfc57a18SJordan Crouse ssize_t remain; 133cfc57a18SJordan Crouse /* private: */ 134cfc57a18SJordan Crouse ssize_t offset; 135cfc57a18SJordan Crouse }; 136cfc57a18SJordan Crouse 137cfc57a18SJordan Crouse /** 138cfc57a18SJordan Crouse * drm_coredump_printer - construct a &drm_printer that can output to a buffer 139cfc57a18SJordan Crouse * from the read function for devcoredump 140cfc57a18SJordan Crouse * @iter: A pointer to a struct drm_print_iterator for the read instance 141cfc57a18SJordan Crouse * 142cfc57a18SJordan Crouse * This wrapper extends drm_printf() to work with a dev_coredumpm() callback 143cfc57a18SJordan Crouse * function. The passed in drm_print_iterator struct contains the buffer 144cfc57a18SJordan Crouse * pointer, size and offset as passed in from devcoredump. 145cfc57a18SJordan Crouse * 146cfc57a18SJordan Crouse * For example:: 147cfc57a18SJordan Crouse * 148cfc57a18SJordan Crouse * void coredump_read(char *buffer, loff_t offset, size_t count, 149cfc57a18SJordan Crouse * void *data, size_t datalen) 150cfc57a18SJordan Crouse * { 151cfc57a18SJordan Crouse * struct drm_print_iterator iter; 152cfc57a18SJordan Crouse * struct drm_printer p; 153cfc57a18SJordan Crouse * 154cfc57a18SJordan Crouse * iter.data = buffer; 155cfc57a18SJordan Crouse * iter.start = offset; 156cfc57a18SJordan Crouse * iter.remain = count; 157cfc57a18SJordan Crouse * 158cfc57a18SJordan Crouse * p = drm_coredump_printer(&iter); 159cfc57a18SJordan Crouse * 160cfc57a18SJordan Crouse * drm_printf(p, "foo=%d\n", foo); 161cfc57a18SJordan Crouse * } 162cfc57a18SJordan Crouse * 163cfc57a18SJordan Crouse * void makecoredump(...) 164cfc57a18SJordan Crouse * { 165cfc57a18SJordan Crouse * ... 166cfc57a18SJordan Crouse * dev_coredumpm(dev, THIS_MODULE, data, 0, GFP_KERNEL, 167cfc57a18SJordan Crouse * coredump_read, ...) 168cfc57a18SJordan Crouse * } 169cfc57a18SJordan Crouse * 170cfc57a18SJordan Crouse * RETURNS: 171cfc57a18SJordan Crouse * The &drm_printer object 172cfc57a18SJordan Crouse */ 173cfc57a18SJordan Crouse static inline struct drm_printer 174cfc57a18SJordan Crouse drm_coredump_printer(struct drm_print_iterator *iter) 175cfc57a18SJordan Crouse { 176cfc57a18SJordan Crouse struct drm_printer p = { 177cfc57a18SJordan Crouse .printfn = __drm_printfn_coredump, 1785dc634bdSJordan Crouse .puts = __drm_puts_coredump, 179cfc57a18SJordan Crouse .arg = iter, 180cfc57a18SJordan Crouse }; 181cfc57a18SJordan Crouse 182cfc57a18SJordan Crouse /* Set the internal offset of the iterator to zero */ 183cfc57a18SJordan Crouse iter->offset = 0; 184cfc57a18SJordan Crouse 185cfc57a18SJordan Crouse return p; 186cfc57a18SJordan Crouse } 187cfc57a18SJordan Crouse 188cfc57a18SJordan Crouse /** 189d8187177SRob Clark * drm_seq_file_printer - construct a &drm_printer that outputs to &seq_file 190ea0dd85aSDaniel Vetter * @f: the &struct seq_file to output to 191d8187177SRob Clark * 192d8187177SRob Clark * RETURNS: 193d8187177SRob Clark * The &drm_printer object 194d8187177SRob Clark */ 195d8187177SRob Clark static inline struct drm_printer drm_seq_file_printer(struct seq_file *f) 196d8187177SRob Clark { 197d8187177SRob Clark struct drm_printer p = { 198d8187177SRob Clark .printfn = __drm_printfn_seq_file, 1994538d732SJordan Crouse .puts = __drm_puts_seq_file, 200d8187177SRob Clark .arg = f, 201d8187177SRob Clark }; 202d8187177SRob Clark return p; 203d8187177SRob Clark } 204d8187177SRob Clark 205d8187177SRob Clark /** 206d8187177SRob Clark * drm_info_printer - construct a &drm_printer that outputs to dev_printk() 207ea0dd85aSDaniel Vetter * @dev: the &struct device pointer 208d8187177SRob Clark * 209d8187177SRob Clark * RETURNS: 210d8187177SRob Clark * The &drm_printer object 211d8187177SRob Clark */ 212d8187177SRob Clark static inline struct drm_printer drm_info_printer(struct device *dev) 213d8187177SRob Clark { 214d8187177SRob Clark struct drm_printer p = { 215d8187177SRob Clark .printfn = __drm_printfn_info, 216d8187177SRob Clark .arg = dev, 217d8187177SRob Clark }; 218d8187177SRob Clark return p; 219d8187177SRob Clark } 220d8187177SRob Clark 2213d387d92SDaniel Vetter /** 2223d387d92SDaniel Vetter * drm_debug_printer - construct a &drm_printer that outputs to pr_debug() 2233d387d92SDaniel Vetter * @prefix: debug output prefix 2243d387d92SDaniel Vetter * 2253d387d92SDaniel Vetter * RETURNS: 2263d387d92SDaniel Vetter * The &drm_printer object 2273d387d92SDaniel Vetter */ 2283d387d92SDaniel Vetter static inline struct drm_printer drm_debug_printer(const char *prefix) 2293d387d92SDaniel Vetter { 2303d387d92SDaniel Vetter struct drm_printer p = { 2313d387d92SDaniel Vetter .printfn = __drm_printfn_debug, 2323d387d92SDaniel Vetter .prefix = prefix 2333d387d92SDaniel Vetter }; 2343d387d92SDaniel Vetter return p; 2353d387d92SDaniel Vetter } 23602c9656bSHaneen Mohammed 2370de54fb2SLyude Paul /** 2380de54fb2SLyude Paul * drm_err_printer - construct a &drm_printer that outputs to pr_err() 2390de54fb2SLyude Paul * @prefix: debug output prefix 2400de54fb2SLyude Paul * 2410de54fb2SLyude Paul * RETURNS: 2420de54fb2SLyude Paul * The &drm_printer object 2430de54fb2SLyude Paul */ 2440de54fb2SLyude Paul static inline struct drm_printer drm_err_printer(const char *prefix) 2450de54fb2SLyude Paul { 2460de54fb2SLyude Paul struct drm_printer p = { 2470de54fb2SLyude Paul .printfn = __drm_printfn_err, 2480de54fb2SLyude Paul .prefix = prefix 2490de54fb2SLyude Paul }; 2500de54fb2SLyude Paul return p; 2510de54fb2SLyude Paul } 2520de54fb2SLyude Paul 253876905b8SJani Nikula /** 254876905b8SJani Nikula * enum drm_debug_category - The DRM debug categories 25502c9656bSHaneen Mohammed * 256876905b8SJani Nikula * Each of the DRM debug logging macros use a specific category, and the logging 257876905b8SJani Nikula * is filtered by the drm.debug module parameter. This enum specifies the values 258876905b8SJani Nikula * for the interface. 25902c9656bSHaneen Mohammed * 260876905b8SJani Nikula * Each DRM_DEBUG_<CATEGORY> macro logs to DRM_UT_<CATEGORY> category, except 261876905b8SJani Nikula * DRM_DEBUG() logs to DRM_UT_CORE. 26202c9656bSHaneen Mohammed * 263876905b8SJani Nikula * Enabling verbose debug messages is done through the drm.debug parameter, each 264876905b8SJani Nikula * category being enabled by a bit: 26502c9656bSHaneen Mohammed * 266876905b8SJani Nikula * - drm.debug=0x1 will enable CORE messages 267876905b8SJani Nikula * - drm.debug=0x2 will enable DRIVER messages 268876905b8SJani Nikula * - drm.debug=0x3 will enable CORE and DRIVER messages 269876905b8SJani Nikula * - ... 270876905b8SJani Nikula * - drm.debug=0x1ff will enable all messages 27102c9656bSHaneen Mohammed * 27202c9656bSHaneen Mohammed * An interesting feature is that it's possible to enable verbose logging at 273876905b8SJani Nikula * run-time by echoing the debug value in its sysfs node:: 274876905b8SJani Nikula * 27502c9656bSHaneen Mohammed * # echo 0xf > /sys/module/drm/parameters/debug 276876905b8SJani Nikula * 27702c9656bSHaneen Mohammed */ 278876905b8SJani Nikula enum drm_debug_category { 279f158936bSJim Cromie /* These names must match those in DYNAMIC_DEBUG_CLASSBITS */ 280876905b8SJani Nikula /** 281876905b8SJani Nikula * @DRM_UT_CORE: Used in the generic drm code: drm_ioctl.c, drm_mm.c, 282876905b8SJani Nikula * drm_memory.c, ... 283876905b8SJani Nikula */ 2840406faf2SJim Cromie DRM_UT_CORE, 285876905b8SJani Nikula /** 286876905b8SJani Nikula * @DRM_UT_DRIVER: Used in the vendor specific part of the driver: i915, 287876905b8SJani Nikula * radeon, ... macro. 288876905b8SJani Nikula */ 2890406faf2SJim Cromie DRM_UT_DRIVER, 290876905b8SJani Nikula /** 291876905b8SJani Nikula * @DRM_UT_KMS: Used in the modesetting code. 292876905b8SJani Nikula */ 2930406faf2SJim Cromie DRM_UT_KMS, 294876905b8SJani Nikula /** 295876905b8SJani Nikula * @DRM_UT_PRIME: Used in the prime code. 296876905b8SJani Nikula */ 2970406faf2SJim Cromie DRM_UT_PRIME, 298876905b8SJani Nikula /** 299876905b8SJani Nikula * @DRM_UT_ATOMIC: Used in the atomic code. 300876905b8SJani Nikula */ 3010406faf2SJim Cromie DRM_UT_ATOMIC, 302876905b8SJani Nikula /** 303876905b8SJani Nikula * @DRM_UT_VBL: Used for verbose debug message in the vblank code. 304876905b8SJani Nikula */ 3050406faf2SJim Cromie DRM_UT_VBL, 306876905b8SJani Nikula /** 307876905b8SJani Nikula * @DRM_UT_STATE: Used for verbose atomic state debugging. 308876905b8SJani Nikula */ 3090406faf2SJim Cromie DRM_UT_STATE, 310876905b8SJani Nikula /** 311876905b8SJani Nikula * @DRM_UT_LEASE: Used in the lease code. 312876905b8SJani Nikula */ 3130406faf2SJim Cromie DRM_UT_LEASE, 314876905b8SJani Nikula /** 315876905b8SJani Nikula * @DRM_UT_DP: Used in the DP code. 316876905b8SJani Nikula */ 3170406faf2SJim Cromie DRM_UT_DP, 318c6603c74SDaniel Vetter /** 319c6603c74SDaniel Vetter * @DRM_UT_DRMRES: Used in the drm managed resources code. 320c6603c74SDaniel Vetter */ 3210406faf2SJim Cromie DRM_UT_DRMRES 322876905b8SJani Nikula }; 32302c9656bSHaneen Mohammed 324*6ce6fae8SJim Cromie static inline bool drm_debug_enabled_raw(enum drm_debug_category category) 325f0a8f533SJani Nikula { 3260406faf2SJim Cromie return unlikely(__drm_debug & BIT(category)); 327f0a8f533SJani Nikula } 328f0a8f533SJani Nikula 329*6ce6fae8SJim Cromie #define drm_debug_enabled_instrumented(category) \ 330*6ce6fae8SJim Cromie ({ \ 331*6ce6fae8SJim Cromie pr_debug("todo: is this frequent enough to optimize ?\n"); \ 332*6ce6fae8SJim Cromie drm_debug_enabled_raw(category); \ 333*6ce6fae8SJim Cromie }) 334*6ce6fae8SJim Cromie 335*6ce6fae8SJim Cromie #if defined(CONFIG_DRM_USE_DYNAMIC_DEBUG) 336*6ce6fae8SJim Cromie /* 337*6ce6fae8SJim Cromie * the drm.debug API uses dyndbg, so each drm_*dbg macro/callsite gets 338*6ce6fae8SJim Cromie * a descriptor, and only enabled callsites are reachable. They use 339*6ce6fae8SJim Cromie * the private macro to avoid re-testing the enable-bit. 340*6ce6fae8SJim Cromie */ 341*6ce6fae8SJim Cromie #define __drm_debug_enabled(category) true 342*6ce6fae8SJim Cromie #define drm_debug_enabled(category) drm_debug_enabled_instrumented(category) 343*6ce6fae8SJim Cromie #else 344*6ce6fae8SJim Cromie #define __drm_debug_enabled(category) drm_debug_enabled_raw(category) 345*6ce6fae8SJim Cromie #define drm_debug_enabled(category) drm_debug_enabled_raw(category) 346*6ce6fae8SJim Cromie #endif 347*6ce6fae8SJim Cromie 3483bf149bdSJani Nikula /* 3493bf149bdSJani Nikula * struct device based logging 350fb6c7ab8SJani Nikula * 35151fdf091SJim Cromie * Prefer drm_device based logging over device or printk based logging. 3523bf149bdSJani Nikula */ 3533bf149bdSJani Nikula 354db870864SJoe Perches __printf(3, 4) 35502c9656bSHaneen Mohammed void drm_dev_printk(const struct device *dev, const char *level, 356db870864SJoe Perches const char *format, ...); 357db870864SJoe Perches __printf(3, 4) 358e820f525SJim Cromie void __drm_dev_dbg(const struct device *dev, enum drm_debug_category category, 359db870864SJoe Perches const char *format, ...); 360db870864SJoe Perches 3613bf149bdSJani Nikula /** 362b52817e9SMauro Carvalho Chehab * DRM_DEV_ERROR() - Error output. 3633bf149bdSJani Nikula * 36430658985SDouglas Anderson * NOTE: this is deprecated in favor of drm_err() or dev_err(). 36530658985SDouglas Anderson * 3663bf149bdSJani Nikula * @dev: device pointer 3673bf149bdSJani Nikula * @fmt: printf() like format string. 3683bf149bdSJani Nikula */ 3693bf149bdSJani Nikula #define DRM_DEV_ERROR(dev, fmt, ...) \ 3703bf149bdSJani Nikula drm_dev_printk(dev, KERN_ERR, "*ERROR* " fmt, ##__VA_ARGS__) 3713bf149bdSJani Nikula 3723bf149bdSJani Nikula /** 373b52817e9SMauro Carvalho Chehab * DRM_DEV_ERROR_RATELIMITED() - Rate limited error output. 3743bf149bdSJani Nikula * 37530658985SDouglas Anderson * NOTE: this is deprecated in favor of drm_err_ratelimited() or 37630658985SDouglas Anderson * dev_err_ratelimited(). 37730658985SDouglas Anderson * 3783bf149bdSJani Nikula * @dev: device pointer 3793bf149bdSJani Nikula * @fmt: printf() like format string. 380b52817e9SMauro Carvalho Chehab * 381b52817e9SMauro Carvalho Chehab * Like DRM_ERROR() but won't flood the log. 3823bf149bdSJani Nikula */ 3833bf149bdSJani Nikula #define DRM_DEV_ERROR_RATELIMITED(dev, fmt, ...) \ 3843bf149bdSJani Nikula ({ \ 3853bf149bdSJani Nikula static DEFINE_RATELIMIT_STATE(_rs, \ 3863bf149bdSJani Nikula DEFAULT_RATELIMIT_INTERVAL, \ 3873bf149bdSJani Nikula DEFAULT_RATELIMIT_BURST); \ 3883bf149bdSJani Nikula \ 3893bf149bdSJani Nikula if (__ratelimit(&_rs)) \ 3903bf149bdSJani Nikula DRM_DEV_ERROR(dev, fmt, ##__VA_ARGS__); \ 3913bf149bdSJani Nikula }) 3923bf149bdSJani Nikula 39330658985SDouglas Anderson /* NOTE: this is deprecated in favor of drm_info() or dev_info(). */ 3943bf149bdSJani Nikula #define DRM_DEV_INFO(dev, fmt, ...) \ 3953bf149bdSJani Nikula drm_dev_printk(dev, KERN_INFO, fmt, ##__VA_ARGS__) 3963bf149bdSJani Nikula 39730658985SDouglas Anderson /* NOTE: this is deprecated in favor of drm_info_once() or dev_info_once(). */ 3983bf149bdSJani Nikula #define DRM_DEV_INFO_ONCE(dev, fmt, ...) \ 3993bf149bdSJani Nikula ({ \ 4003bf149bdSJani Nikula static bool __print_once __read_mostly; \ 4013bf149bdSJani Nikula if (!__print_once) { \ 4023bf149bdSJani Nikula __print_once = true; \ 4033bf149bdSJani Nikula DRM_DEV_INFO(dev, fmt, ##__VA_ARGS__); \ 4043bf149bdSJani Nikula } \ 4053bf149bdSJani Nikula }) 4063bf149bdSJani Nikula 40784ec6728SJim Cromie #if !defined(CONFIG_DRM_USE_DYNAMIC_DEBUG) 408e820f525SJim Cromie #define drm_dev_dbg(dev, cat, fmt, ...) \ 409e820f525SJim Cromie __drm_dev_dbg(dev, cat, fmt, ##__VA_ARGS__) 41084ec6728SJim Cromie #else 41184ec6728SJim Cromie #define drm_dev_dbg(dev, cat, fmt, ...) \ 41284ec6728SJim Cromie _dynamic_func_call_no_desc(fmt, __drm_dev_dbg, \ 41384ec6728SJim Cromie dev, cat, fmt, ##__VA_ARGS__) 41484ec6728SJim Cromie #endif 415e820f525SJim Cromie 4163bf149bdSJani Nikula /** 417b52817e9SMauro Carvalho Chehab * DRM_DEV_DEBUG() - Debug output for generic drm code 4183bf149bdSJani Nikula * 41930658985SDouglas Anderson * NOTE: this is deprecated in favor of drm_dbg_core(). 42030658985SDouglas Anderson * 4213bf149bdSJani Nikula * @dev: device pointer 4223bf149bdSJani Nikula * @fmt: printf() like format string. 4233bf149bdSJani Nikula */ 4243bf149bdSJani Nikula #define DRM_DEV_DEBUG(dev, fmt, ...) \ 4253bf149bdSJani Nikula drm_dev_dbg(dev, DRM_UT_CORE, fmt, ##__VA_ARGS__) 426b52817e9SMauro Carvalho Chehab /** 427b52817e9SMauro Carvalho Chehab * DRM_DEV_DEBUG_DRIVER() - Debug output for vendor specific part of the driver 428b52817e9SMauro Carvalho Chehab * 42930658985SDouglas Anderson * NOTE: this is deprecated in favor of drm_dbg() or dev_dbg(). 43030658985SDouglas Anderson * 431b52817e9SMauro Carvalho Chehab * @dev: device pointer 432b52817e9SMauro Carvalho Chehab * @fmt: printf() like format string. 433b52817e9SMauro Carvalho Chehab */ 4343bf149bdSJani Nikula #define DRM_DEV_DEBUG_DRIVER(dev, fmt, ...) \ 4353bf149bdSJani Nikula drm_dev_dbg(dev, DRM_UT_DRIVER, fmt, ##__VA_ARGS__) 436b52817e9SMauro Carvalho Chehab /** 437b52817e9SMauro Carvalho Chehab * DRM_DEV_DEBUG_KMS() - Debug output for modesetting code 438b52817e9SMauro Carvalho Chehab * 43930658985SDouglas Anderson * NOTE: this is deprecated in favor of drm_dbg_kms(). 44030658985SDouglas Anderson * 441b52817e9SMauro Carvalho Chehab * @dev: device pointer 442b52817e9SMauro Carvalho Chehab * @fmt: printf() like format string. 443b52817e9SMauro Carvalho Chehab */ 4443bf149bdSJani Nikula #define DRM_DEV_DEBUG_KMS(dev, fmt, ...) \ 4453bf149bdSJani Nikula drm_dev_dbg(dev, DRM_UT_KMS, fmt, ##__VA_ARGS__) 4463bf149bdSJani Nikula 4473bf149bdSJani Nikula /* 448fb6c7ab8SJani Nikula * struct drm_device based logging 449fb6c7ab8SJani Nikula * 450fb6c7ab8SJani Nikula * Prefer drm_device based logging over device or prink based logging. 451fb6c7ab8SJani Nikula */ 452fb6c7ab8SJani Nikula 453fb6c7ab8SJani Nikula /* Helper for struct drm_device based logging. */ 454fb6c7ab8SJani Nikula #define __drm_printk(drm, level, type, fmt, ...) \ 455fb6c7ab8SJani Nikula dev_##level##type((drm)->dev, "[drm] " fmt, ##__VA_ARGS__) 456fb6c7ab8SJani Nikula 457fb6c7ab8SJani Nikula 458fb6c7ab8SJani Nikula #define drm_info(drm, fmt, ...) \ 459fb6c7ab8SJani Nikula __drm_printk((drm), info,, fmt, ##__VA_ARGS__) 460fb6c7ab8SJani Nikula 461fb6c7ab8SJani Nikula #define drm_notice(drm, fmt, ...) \ 462fb6c7ab8SJani Nikula __drm_printk((drm), notice,, fmt, ##__VA_ARGS__) 463fb6c7ab8SJani Nikula 464fb6c7ab8SJani Nikula #define drm_warn(drm, fmt, ...) \ 465fb6c7ab8SJani Nikula __drm_printk((drm), warn,, fmt, ##__VA_ARGS__) 466fb6c7ab8SJani Nikula 467fb6c7ab8SJani Nikula #define drm_err(drm, fmt, ...) \ 468fb6c7ab8SJani Nikula __drm_printk((drm), err,, "*ERROR* " fmt, ##__VA_ARGS__) 469fb6c7ab8SJani Nikula 470fb6c7ab8SJani Nikula 471fb6c7ab8SJani Nikula #define drm_info_once(drm, fmt, ...) \ 472fb6c7ab8SJani Nikula __drm_printk((drm), info, _once, fmt, ##__VA_ARGS__) 473fb6c7ab8SJani Nikula 474fb6c7ab8SJani Nikula #define drm_notice_once(drm, fmt, ...) \ 475fb6c7ab8SJani Nikula __drm_printk((drm), notice, _once, fmt, ##__VA_ARGS__) 476fb6c7ab8SJani Nikula 477fb6c7ab8SJani Nikula #define drm_warn_once(drm, fmt, ...) \ 478fb6c7ab8SJani Nikula __drm_printk((drm), warn, _once, fmt, ##__VA_ARGS__) 479fb6c7ab8SJani Nikula 480fb6c7ab8SJani Nikula #define drm_err_once(drm, fmt, ...) \ 481fb6c7ab8SJani Nikula __drm_printk((drm), err, _once, "*ERROR* " fmt, ##__VA_ARGS__) 482fb6c7ab8SJani Nikula 483fb6c7ab8SJani Nikula 484fb6c7ab8SJani Nikula #define drm_err_ratelimited(drm, fmt, ...) \ 485fb6c7ab8SJani Nikula __drm_printk((drm), err, _ratelimited, "*ERROR* " fmt, ##__VA_ARGS__) 486fb6c7ab8SJani Nikula 487fb6c7ab8SJani Nikula 488fb6c7ab8SJani Nikula #define drm_dbg_core(drm, fmt, ...) \ 48979119021SLyude Paul drm_dev_dbg((drm) ? (drm)->dev : NULL, DRM_UT_CORE, fmt, ##__VA_ARGS__) 49095a77b63SJim Cromie #define drm_dbg_driver(drm, fmt, ...) \ 49179119021SLyude Paul drm_dev_dbg((drm) ? (drm)->dev : NULL, DRM_UT_DRIVER, fmt, ##__VA_ARGS__) 492fb6c7ab8SJani Nikula #define drm_dbg_kms(drm, fmt, ...) \ 49379119021SLyude Paul drm_dev_dbg((drm) ? (drm)->dev : NULL, DRM_UT_KMS, fmt, ##__VA_ARGS__) 494fb6c7ab8SJani Nikula #define drm_dbg_prime(drm, fmt, ...) \ 49579119021SLyude Paul drm_dev_dbg((drm) ? (drm)->dev : NULL, DRM_UT_PRIME, fmt, ##__VA_ARGS__) 496fb6c7ab8SJani Nikula #define drm_dbg_atomic(drm, fmt, ...) \ 49779119021SLyude Paul drm_dev_dbg((drm) ? (drm)->dev : NULL, DRM_UT_ATOMIC, fmt, ##__VA_ARGS__) 498fb6c7ab8SJani Nikula #define drm_dbg_vbl(drm, fmt, ...) \ 49979119021SLyude Paul drm_dev_dbg((drm) ? (drm)->dev : NULL, DRM_UT_VBL, fmt, ##__VA_ARGS__) 500fb6c7ab8SJani Nikula #define drm_dbg_state(drm, fmt, ...) \ 50179119021SLyude Paul drm_dev_dbg((drm) ? (drm)->dev : NULL, DRM_UT_STATE, fmt, ##__VA_ARGS__) 502fb6c7ab8SJani Nikula #define drm_dbg_lease(drm, fmt, ...) \ 50379119021SLyude Paul drm_dev_dbg((drm) ? (drm)->dev : NULL, DRM_UT_LEASE, fmt, ##__VA_ARGS__) 504fb6c7ab8SJani Nikula #define drm_dbg_dp(drm, fmt, ...) \ 50579119021SLyude Paul drm_dev_dbg((drm) ? (drm)->dev : NULL, DRM_UT_DP, fmt, ##__VA_ARGS__) 506c6603c74SDaniel Vetter #define drm_dbg_drmres(drm, fmt, ...) \ 50779119021SLyude Paul drm_dev_dbg((drm) ? (drm)->dev : NULL, DRM_UT_DRMRES, fmt, ##__VA_ARGS__) 508fb6c7ab8SJani Nikula 50995a77b63SJim Cromie #define drm_dbg(drm, fmt, ...) drm_dbg_driver(drm, fmt, ##__VA_ARGS__) 510fb6c7ab8SJani Nikula 511fb6c7ab8SJani Nikula /* 5123bf149bdSJani Nikula * printk based logging 513fb6c7ab8SJani Nikula * 514fb6c7ab8SJani Nikula * Prefer drm_device based logging over device or prink based logging. 5153bf149bdSJani Nikula */ 5163bf149bdSJani Nikula 51799a95487SJoe Perches __printf(2, 3) 518e820f525SJim Cromie void ___drm_dbg(enum drm_debug_category category, const char *format, ...); 51999a95487SJoe Perches __printf(1, 2) 52099acf471SJani Nikula void __drm_err(const char *format, ...); 521091756bbSHaneen Mohammed 52284ec6728SJim Cromie #if !defined(CONFIG_DRM_USE_DYNAMIC_DEBUG) 523e820f525SJim Cromie #define __drm_dbg(fmt, ...) ___drm_dbg(fmt, ##__VA_ARGS__) 52484ec6728SJim Cromie #else 52584ec6728SJim Cromie #define __drm_dbg(cat, fmt, ...) \ 52684ec6728SJim Cromie _dynamic_func_call_no_desc(fmt, ___drm_dbg, \ 52784ec6728SJim Cromie cat, fmt, ##__VA_ARGS__) 52884ec6728SJim Cromie #endif 529e820f525SJim Cromie 530091756bbSHaneen Mohammed /* Macros to make printk easier */ 53102c9656bSHaneen Mohammed 53202c9656bSHaneen Mohammed #define _DRM_PRINTK(once, level, fmt, ...) \ 533db870864SJoe Perches printk##once(KERN_##level "[" DRM_NAME "] " fmt, ##__VA_ARGS__) 53402c9656bSHaneen Mohammed 53530658985SDouglas Anderson /* NOTE: this is deprecated in favor of pr_info(). */ 53602c9656bSHaneen Mohammed #define DRM_INFO(fmt, ...) \ 53702c9656bSHaneen Mohammed _DRM_PRINTK(, INFO, fmt, ##__VA_ARGS__) 53830658985SDouglas Anderson /* NOTE: this is deprecated in favor of pr_notice(). */ 53902c9656bSHaneen Mohammed #define DRM_NOTE(fmt, ...) \ 54002c9656bSHaneen Mohammed _DRM_PRINTK(, NOTICE, fmt, ##__VA_ARGS__) 54130658985SDouglas Anderson /* NOTE: this is deprecated in favor of pr_warn(). */ 54202c9656bSHaneen Mohammed #define DRM_WARN(fmt, ...) \ 54302c9656bSHaneen Mohammed _DRM_PRINTK(, WARNING, fmt, ##__VA_ARGS__) 54402c9656bSHaneen Mohammed 54530658985SDouglas Anderson /* NOTE: this is deprecated in favor of pr_info_once(). */ 54602c9656bSHaneen Mohammed #define DRM_INFO_ONCE(fmt, ...) \ 54702c9656bSHaneen Mohammed _DRM_PRINTK(_once, INFO, fmt, ##__VA_ARGS__) 54830658985SDouglas Anderson /* NOTE: this is deprecated in favor of pr_notice_once(). */ 54902c9656bSHaneen Mohammed #define DRM_NOTE_ONCE(fmt, ...) \ 55002c9656bSHaneen Mohammed _DRM_PRINTK(_once, NOTICE, fmt, ##__VA_ARGS__) 55130658985SDouglas Anderson /* NOTE: this is deprecated in favor of pr_warn_once(). */ 55202c9656bSHaneen Mohammed #define DRM_WARN_ONCE(fmt, ...) \ 55302c9656bSHaneen Mohammed _DRM_PRINTK(_once, WARNING, fmt, ##__VA_ARGS__) 55402c9656bSHaneen Mohammed 55530658985SDouglas Anderson /* NOTE: this is deprecated in favor of pr_err(). */ 55602c9656bSHaneen Mohammed #define DRM_ERROR(fmt, ...) \ 55799acf471SJani Nikula __drm_err(fmt, ##__VA_ARGS__) 55802c9656bSHaneen Mohammed 55930658985SDouglas Anderson /* NOTE: this is deprecated in favor of pr_err_ratelimited(). */ 56002c9656bSHaneen Mohammed #define DRM_ERROR_RATELIMITED(fmt, ...) \ 56102c9656bSHaneen Mohammed DRM_DEV_ERROR_RATELIMITED(NULL, fmt, ##__VA_ARGS__) 56202c9656bSHaneen Mohammed 56330658985SDouglas Anderson /* NOTE: this is deprecated in favor of drm_dbg_core(NULL, ...). */ 56402c9656bSHaneen Mohammed #define DRM_DEBUG(fmt, ...) \ 56599acf471SJani Nikula __drm_dbg(DRM_UT_CORE, fmt, ##__VA_ARGS__) 56602c9656bSHaneen Mohammed 56730658985SDouglas Anderson /* NOTE: this is deprecated in favor of drm_dbg(NULL, ...). */ 56802c9656bSHaneen Mohammed #define DRM_DEBUG_DRIVER(fmt, ...) \ 56999acf471SJani Nikula __drm_dbg(DRM_UT_DRIVER, fmt, ##__VA_ARGS__) 57002c9656bSHaneen Mohammed 57130658985SDouglas Anderson /* NOTE: this is deprecated in favor of drm_dbg_kms(NULL, ...). */ 57202c9656bSHaneen Mohammed #define DRM_DEBUG_KMS(fmt, ...) \ 57399acf471SJani Nikula __drm_dbg(DRM_UT_KMS, fmt, ##__VA_ARGS__) 57402c9656bSHaneen Mohammed 57530658985SDouglas Anderson /* NOTE: this is deprecated in favor of drm_dbg_prime(NULL, ...). */ 57602c9656bSHaneen Mohammed #define DRM_DEBUG_PRIME(fmt, ...) \ 57799acf471SJani Nikula __drm_dbg(DRM_UT_PRIME, fmt, ##__VA_ARGS__) 57802c9656bSHaneen Mohammed 57930658985SDouglas Anderson /* NOTE: this is deprecated in favor of drm_dbg_atomic(NULL, ...). */ 58002c9656bSHaneen Mohammed #define DRM_DEBUG_ATOMIC(fmt, ...) \ 58199acf471SJani Nikula __drm_dbg(DRM_UT_ATOMIC, fmt, ##__VA_ARGS__) 58202c9656bSHaneen Mohammed 58330658985SDouglas Anderson /* NOTE: this is deprecated in favor of drm_dbg_vbl(NULL, ...). */ 58402c9656bSHaneen Mohammed #define DRM_DEBUG_VBL(fmt, ...) \ 58599acf471SJani Nikula __drm_dbg(DRM_UT_VBL, fmt, ##__VA_ARGS__) 58602c9656bSHaneen Mohammed 58730658985SDouglas Anderson /* NOTE: this is deprecated in favor of drm_dbg_lease(NULL, ...). */ 58870c5f936SDaniel Vetter #define DRM_DEBUG_LEASE(fmt, ...) \ 58999acf471SJani Nikula __drm_dbg(DRM_UT_LEASE, fmt, ##__VA_ARGS__) 59070c5f936SDaniel Vetter 59130658985SDouglas Anderson /* NOTE: this is deprecated in favor of drm_dbg_dp(NULL, ...). */ 592106b6c39SLyude Paul #define DRM_DEBUG_DP(fmt, ...) \ 59399acf471SJani Nikula __drm_dbg(DRM_UT_DP, fmt, ## __VA_ARGS__) 594a18b2192SLyude Paul 595c5261e93SLyude Paul #define __DRM_DEFINE_DBG_RATELIMITED(category, drm, fmt, ...) \ 596acce61bfSSam Ravnborg ({ \ 597c5261e93SLyude Paul static DEFINE_RATELIMIT_STATE(rs_, DEFAULT_RATELIMIT_INTERVAL, DEFAULT_RATELIMIT_BURST);\ 598c5261e93SLyude Paul const struct drm_device *drm_ = (drm); \ 599c5261e93SLyude Paul \ 600c5261e93SLyude Paul if (drm_debug_enabled(DRM_UT_ ## category) && __ratelimit(&rs_)) \ 601c5261e93SLyude Paul drm_dev_printk(drm_ ? drm_->dev : NULL, KERN_DEBUG, fmt, ## __VA_ARGS__); \ 602acce61bfSSam Ravnborg }) 603db870864SJoe Perches 604c5261e93SLyude Paul #define drm_dbg_kms_ratelimited(drm, fmt, ...) \ 605c5261e93SLyude Paul __DRM_DEFINE_DBG_RATELIMITED(KMS, drm, fmt, ## __VA_ARGS__) 606c5261e93SLyude Paul 60730658985SDouglas Anderson /* NOTE: this is deprecated in favor of drm_dbg_kms_ratelimited(NULL, ...). */ 608c5261e93SLyude Paul #define DRM_DEBUG_KMS_RATELIMITED(fmt, ...) drm_dbg_kms_ratelimited(NULL, fmt, ## __VA_ARGS__) 609c5261e93SLyude Paul 610dc1a73e5SPankaj Bharadiya /* 611dc1a73e5SPankaj Bharadiya * struct drm_device based WARNs 612dc1a73e5SPankaj Bharadiya * 613dc1a73e5SPankaj Bharadiya * drm_WARN*() acts like WARN*(), but with the key difference of 614dc1a73e5SPankaj Bharadiya * using device specific information so that we know from which device 615dc1a73e5SPankaj Bharadiya * warning is originating from. 616dc1a73e5SPankaj Bharadiya * 617dc1a73e5SPankaj Bharadiya * Prefer drm_device based drm_WARN* over regular WARN* 618dc1a73e5SPankaj Bharadiya */ 619dc1a73e5SPankaj Bharadiya 620dc1a73e5SPankaj Bharadiya /* Helper for struct drm_device based WARNs */ 621dc1a73e5SPankaj Bharadiya #define drm_WARN(drm, condition, format, arg...) \ 622dc1a73e5SPankaj Bharadiya WARN(condition, "%s %s: " format, \ 623dc1a73e5SPankaj Bharadiya dev_driver_string((drm)->dev), \ 624dc1a73e5SPankaj Bharadiya dev_name((drm)->dev), ## arg) 625dc1a73e5SPankaj Bharadiya 626dc1a73e5SPankaj Bharadiya #define drm_WARN_ONCE(drm, condition, format, arg...) \ 627dc1a73e5SPankaj Bharadiya WARN_ONCE(condition, "%s %s: " format, \ 628dc1a73e5SPankaj Bharadiya dev_driver_string((drm)->dev), \ 629dc1a73e5SPankaj Bharadiya dev_name((drm)->dev), ## arg) 630dc1a73e5SPankaj Bharadiya 631dc1a73e5SPankaj Bharadiya #define drm_WARN_ON(drm, x) \ 632dc1a73e5SPankaj Bharadiya drm_WARN((drm), (x), "%s", \ 633dc1a73e5SPankaj Bharadiya "drm_WARN_ON(" __stringify(x) ")") 634dc1a73e5SPankaj Bharadiya 635dc1a73e5SPankaj Bharadiya #define drm_WARN_ON_ONCE(drm, x) \ 636dc1a73e5SPankaj Bharadiya drm_WARN_ONCE((drm), (x), "%s", \ 637dc1a73e5SPankaj Bharadiya "drm_WARN_ON_ONCE(" __stringify(x) ")") 638dc1a73e5SPankaj Bharadiya 639d8187177SRob Clark #endif /* DRM_PRINT_H_ */ 640