1 /* 1 /* 2 * Copyright (C) 2016 Red Hat 2 * Copyright (C) 2016 Red Hat 3 * 3 * 4 * Permission is hereby granted, free of charg 4 * Permission is hereby granted, free of charge, to any person obtaining a 5 * copy of this software and associated docume 5 * copy of this software and associated documentation files (the "Software"), 6 * to deal in the Software without restriction 6 * to deal in the Software without restriction, including without limitation 7 * the rights to use, copy, modify, merge, pub 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8 * and/or sell copies of the Software, and to 8 * and/or sell copies of the Software, and to permit persons to whom the 9 * Software is furnished to do so, subject to 9 * Software is furnished to do so, subject to the following conditions: 10 * 10 * 11 * The above copyright notice and this permiss 11 * The above copyright notice and this permission notice shall be included in 12 * all copies or substantial portions of the S 12 * all copies or substantial portions of the Software. 13 * 13 * 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT W 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE W 15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINF 16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 17 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIA 17 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CO 18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 19 * ARISING FROM, OUT OF OR IN CONNECTION WITH 19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 20 * OTHER DEALINGS IN THE SOFTWARE. 20 * OTHER DEALINGS IN THE SOFTWARE. 21 * 21 * 22 * Authors: 22 * Authors: 23 * Rob Clark <robdclark@gmail.com> 23 * Rob Clark <robdclark@gmail.com> 24 */ 24 */ 25 25 26 #ifndef DRM_PRINT_H_ 26 #ifndef DRM_PRINT_H_ 27 #define DRM_PRINT_H_ 27 #define DRM_PRINT_H_ 28 28 29 #include <linux/compiler.h> 29 #include <linux/compiler.h> 30 #include <linux/printk.h> 30 #include <linux/printk.h> >> 31 #include <linux/seq_file.h> 31 #include <linux/device.h> 32 #include <linux/device.h> 32 #include <linux/dynamic_debug.h> !! 33 #include <linux/debugfs.h> 33 << 34 #include <drm/drm.h> << 35 << 36 struct debugfs_regset32; << 37 struct drm_device; << 38 struct seq_file; << 39 << 40 /* Do *not* use outside of drm_print.[ch]! */ << 41 extern unsigned long __drm_debug; << 42 34 43 /** 35 /** 44 * DOC: print 36 * DOC: print 45 * 37 * 46 * A simple wrapper for dev_printk(), seq_prin 38 * A simple wrapper for dev_printk(), seq_printf(), etc. Allows same 47 * debug code to be used for both debugfs and 39 * debug code to be used for both debugfs and printk logging. 48 * 40 * 49 * For example:: 41 * For example:: 50 * 42 * 51 * void log_some_info(struct drm_printer * 43 * void log_some_info(struct drm_printer *p) 52 * { 44 * { 53 * drm_printf(p, "foo=%d\n", foo); 45 * drm_printf(p, "foo=%d\n", foo); 54 * drm_printf(p, "bar=%d\n", bar); 46 * drm_printf(p, "bar=%d\n", bar); 55 * } 47 * } 56 * 48 * 57 * #ifdef CONFIG_DEBUG_FS 49 * #ifdef CONFIG_DEBUG_FS 58 * void debugfs_show(struct seq_file *f) 50 * void debugfs_show(struct seq_file *f) 59 * { 51 * { 60 * struct drm_printer p = drm_seq_ 52 * struct drm_printer p = drm_seq_file_printer(f); 61 * log_some_info(&p); 53 * log_some_info(&p); 62 * } 54 * } 63 * #endif 55 * #endif 64 * 56 * 65 * void some_other_function(...) 57 * void some_other_function(...) 66 * { 58 * { 67 * struct drm_printer p = drm_info 59 * struct drm_printer p = drm_info_printer(drm->dev); 68 * log_some_info(&p); 60 * log_some_info(&p); 69 * } 61 * } 70 */ 62 */ 71 63 72 /** 64 /** 73 * enum drm_debug_category - The DRM debug cat << 74 * << 75 * Each of the DRM debug logging macros use a << 76 * is filtered by the drm.debug module paramet << 77 * for the interface. << 78 * << 79 * Each DRM_DEBUG_<CATEGORY> macro logs to DRM << 80 * DRM_DEBUG() logs to DRM_UT_CORE. << 81 * << 82 * Enabling verbose debug messages is done thr << 83 * category being enabled by a bit: << 84 * << 85 * - drm.debug=0x1 will enable CORE messages << 86 * - drm.debug=0x2 will enable DRIVER message << 87 * - drm.debug=0x3 will enable CORE and DRIVE << 88 * - ... << 89 * - drm.debug=0x1ff will enable all messages << 90 * << 91 * An interesting feature is that it's possibl << 92 * run-time by echoing the debug value in its << 93 * << 94 * # echo 0xf > /sys/module/drm/parameters/d << 95 * << 96 */ << 97 enum drm_debug_category { << 98 /* These names must match those in DYN << 99 /** << 100 * @DRM_UT_CORE: Used in the generic d << 101 * drm_memory.c, ... << 102 */ << 103 DRM_UT_CORE, << 104 /** << 105 * @DRM_UT_DRIVER: Used in the vendor << 106 * radeon, ... macro. << 107 */ << 108 DRM_UT_DRIVER, << 109 /** << 110 * @DRM_UT_KMS: Used in the modesettin << 111 */ << 112 DRM_UT_KMS, << 113 /** << 114 * @DRM_UT_PRIME: Used in the prime co << 115 */ << 116 DRM_UT_PRIME, << 117 /** << 118 * @DRM_UT_ATOMIC: Used in the atomic << 119 */ << 120 DRM_UT_ATOMIC, << 121 /** << 122 * @DRM_UT_VBL: Used for verbose debug << 123 */ << 124 DRM_UT_VBL, << 125 /** << 126 * @DRM_UT_STATE: Used for verbose ato << 127 */ << 128 DRM_UT_STATE, << 129 /** << 130 * @DRM_UT_LEASE: Used in the lease co << 131 */ << 132 DRM_UT_LEASE, << 133 /** << 134 * @DRM_UT_DP: Used in the DP code. << 135 */ << 136 DRM_UT_DP, << 137 /** << 138 * @DRM_UT_DRMRES: Used in the drm man << 139 */ << 140 DRM_UT_DRMRES << 141 }; << 142 << 143 static inline bool drm_debug_enabled_raw(enum << 144 { << 145 return unlikely(__drm_debug & BIT(cate << 146 } << 147 << 148 #define drm_debug_enabled_instrumented(categor << 149 ({ << 150 pr_debug("todo: is this freque << 151 drm_debug_enabled_raw(category << 152 }) << 153 << 154 #if defined(CONFIG_DRM_USE_DYNAMIC_DEBUG) << 155 /* << 156 * the drm.debug API uses dyndbg, so each drm_ << 157 * a descriptor, and only enabled callsites ar << 158 * the private macro to avoid re-testing the e << 159 */ << 160 #define __drm_debug_enabled(category) true << 161 #define drm_debug_enabled(category) drm_de << 162 #else << 163 #define __drm_debug_enabled(category) drm_de << 164 #define drm_debug_enabled(category) drm_de << 165 #endif << 166 << 167 /** << 168 * struct drm_printer - drm output "stream" 65 * struct drm_printer - drm output "stream" 169 * 66 * 170 * Do not use struct members directly. Use dr 67 * Do not use struct members directly. Use drm_printer_seq_file(), 171 * drm_printer_info(), etc to initialize. And 68 * drm_printer_info(), etc to initialize. And drm_printf() for output. 172 */ 69 */ 173 struct drm_printer { 70 struct drm_printer { 174 /* private: */ 71 /* private: */ 175 void (*printfn)(struct drm_printer *p, 72 void (*printfn)(struct drm_printer *p, struct va_format *vaf); 176 void (*puts)(struct drm_printer *p, co 73 void (*puts)(struct drm_printer *p, const char *str); 177 void *arg; 74 void *arg; 178 const void *origin; << 179 const char *prefix; 75 const char *prefix; 180 enum drm_debug_category category; << 181 }; 76 }; 182 77 183 void __drm_printfn_coredump(struct drm_printer 78 void __drm_printfn_coredump(struct drm_printer *p, struct va_format *vaf); 184 void __drm_puts_coredump(struct drm_printer *p 79 void __drm_puts_coredump(struct drm_printer *p, const char *str); 185 void __drm_printfn_seq_file(struct drm_printer 80 void __drm_printfn_seq_file(struct drm_printer *p, struct va_format *vaf); 186 void __drm_puts_seq_file(struct drm_printer *p 81 void __drm_puts_seq_file(struct drm_printer *p, const char *str); 187 void __drm_printfn_info(struct drm_printer *p, 82 void __drm_printfn_info(struct drm_printer *p, struct va_format *vaf); 188 void __drm_printfn_dbg(struct drm_printer *p, !! 83 void __drm_printfn_debug(struct drm_printer *p, struct va_format *vaf); 189 void __drm_printfn_err(struct drm_printer *p, << 190 84 191 __printf(2, 3) 85 __printf(2, 3) 192 void drm_printf(struct drm_printer *p, const c 86 void drm_printf(struct drm_printer *p, const char *f, ...); 193 void drm_puts(struct drm_printer *p, const cha 87 void drm_puts(struct drm_printer *p, const char *str); 194 void drm_print_regset32(struct drm_printer *p, 88 void drm_print_regset32(struct drm_printer *p, struct debugfs_regset32 *regset); 195 void drm_print_bits(struct drm_printer *p, uns << 196 const char * const bits[], << 197 89 198 __printf(2, 0) 90 __printf(2, 0) 199 /** 91 /** 200 * drm_vprintf - print to a &drm_printer strea 92 * drm_vprintf - print to a &drm_printer stream 201 * @p: the &drm_printer 93 * @p: the &drm_printer 202 * @fmt: format string 94 * @fmt: format string 203 * @va: the va_list 95 * @va: the va_list 204 */ 96 */ 205 static inline void 97 static inline void 206 drm_vprintf(struct drm_printer *p, const char 98 drm_vprintf(struct drm_printer *p, const char *fmt, va_list *va) 207 { 99 { 208 struct va_format vaf = { .fmt = fmt, . 100 struct va_format vaf = { .fmt = fmt, .va = va }; 209 101 210 p->printfn(p, &vaf); 102 p->printfn(p, &vaf); 211 } 103 } 212 104 213 /** 105 /** 214 * drm_printf_indent - Print to a &drm_printer 106 * drm_printf_indent - Print to a &drm_printer stream with indentation 215 * @printer: DRM printer 107 * @printer: DRM printer 216 * @indent: Tab indentation level (max 5) 108 * @indent: Tab indentation level (max 5) 217 * @fmt: Format string 109 * @fmt: Format string 218 */ 110 */ 219 #define drm_printf_indent(printer, indent, fmt 111 #define drm_printf_indent(printer, indent, fmt, ...) \ 220 drm_printf((printer), "%.*s" fmt, (ind 112 drm_printf((printer), "%.*s" fmt, (indent), "\t\t\t\t\tX", ##__VA_ARGS__) 221 113 222 /** 114 /** 223 * struct drm_print_iterator - local struct us 115 * struct drm_print_iterator - local struct used with drm_printer_coredump 224 * @data: Pointer to the devcoredump output bu 116 * @data: Pointer to the devcoredump output buffer 225 * @start: The offset within the buffer to sta 117 * @start: The offset within the buffer to start writing 226 * @remain: The number of bytes to write for t 118 * @remain: The number of bytes to write for this iteration 227 */ 119 */ 228 struct drm_print_iterator { 120 struct drm_print_iterator { 229 void *data; 121 void *data; 230 ssize_t start; 122 ssize_t start; 231 ssize_t remain; 123 ssize_t remain; 232 /* private: */ 124 /* private: */ 233 ssize_t offset; 125 ssize_t offset; 234 }; 126 }; 235 127 236 /** 128 /** 237 * drm_coredump_printer - construct a &drm_pri 129 * drm_coredump_printer - construct a &drm_printer that can output to a buffer 238 * from the read function for devcoredump 130 * from the read function for devcoredump 239 * @iter: A pointer to a struct drm_print_iter 131 * @iter: A pointer to a struct drm_print_iterator for the read instance 240 * 132 * 241 * This wrapper extends drm_printf() to work w 133 * This wrapper extends drm_printf() to work with a dev_coredumpm() callback 242 * function. The passed in drm_print_iterator 134 * function. The passed in drm_print_iterator struct contains the buffer 243 * pointer, size and offset as passed in from 135 * pointer, size and offset as passed in from devcoredump. 244 * 136 * 245 * For example:: 137 * For example:: 246 * 138 * 247 * void coredump_read(char *buffer, loff_ 139 * void coredump_read(char *buffer, loff_t offset, size_t count, 248 * void *data, size_t datalen) 140 * void *data, size_t datalen) 249 * { 141 * { 250 * struct drm_print_iterator iter 142 * struct drm_print_iterator iter; 251 * struct drm_printer p; 143 * struct drm_printer p; 252 * 144 * 253 * iter.data = buffer; 145 * iter.data = buffer; 254 * iter.start = offset; 146 * iter.start = offset; 255 * iter.remain = count; 147 * iter.remain = count; 256 * 148 * 257 * p = drm_coredump_printer(&iter 149 * p = drm_coredump_printer(&iter); 258 * 150 * 259 * drm_printf(p, "foo=%d\n", foo) 151 * drm_printf(p, "foo=%d\n", foo); 260 * } 152 * } 261 * 153 * 262 * void makecoredump(...) 154 * void makecoredump(...) 263 * { 155 * { 264 * ... 156 * ... 265 * dev_coredumpm(dev, THIS_MODULE 157 * dev_coredumpm(dev, THIS_MODULE, data, 0, GFP_KERNEL, 266 * coredump_read, ...) 158 * coredump_read, ...) 267 * } 159 * } 268 * 160 * 269 * RETURNS: 161 * RETURNS: 270 * The &drm_printer object 162 * The &drm_printer object 271 */ 163 */ 272 static inline struct drm_printer 164 static inline struct drm_printer 273 drm_coredump_printer(struct drm_print_iterator 165 drm_coredump_printer(struct drm_print_iterator *iter) 274 { 166 { 275 struct drm_printer p = { 167 struct drm_printer p = { 276 .printfn = __drm_printfn_cored 168 .printfn = __drm_printfn_coredump, 277 .puts = __drm_puts_coredump, 169 .puts = __drm_puts_coredump, 278 .arg = iter, 170 .arg = iter, 279 }; 171 }; 280 172 281 /* Set the internal offset of the iter 173 /* Set the internal offset of the iterator to zero */ 282 iter->offset = 0; 174 iter->offset = 0; 283 175 284 return p; 176 return p; 285 } 177 } 286 178 287 /** 179 /** 288 * drm_seq_file_printer - construct a &drm_pri 180 * drm_seq_file_printer - construct a &drm_printer that outputs to &seq_file 289 * @f: the &struct seq_file to output to 181 * @f: the &struct seq_file to output to 290 * 182 * 291 * RETURNS: 183 * RETURNS: 292 * The &drm_printer object 184 * The &drm_printer object 293 */ 185 */ 294 static inline struct drm_printer drm_seq_file_ 186 static inline struct drm_printer drm_seq_file_printer(struct seq_file *f) 295 { 187 { 296 struct drm_printer p = { 188 struct drm_printer p = { 297 .printfn = __drm_printfn_seq_f 189 .printfn = __drm_printfn_seq_file, 298 .puts = __drm_puts_seq_file, 190 .puts = __drm_puts_seq_file, 299 .arg = f, 191 .arg = f, 300 }; 192 }; 301 return p; 193 return p; 302 } 194 } 303 195 304 /** 196 /** 305 * drm_info_printer - construct a &drm_printer 197 * drm_info_printer - construct a &drm_printer that outputs to dev_printk() 306 * @dev: the &struct device pointer 198 * @dev: the &struct device pointer 307 * 199 * 308 * RETURNS: 200 * RETURNS: 309 * The &drm_printer object 201 * The &drm_printer object 310 */ 202 */ 311 static inline struct drm_printer drm_info_prin 203 static inline struct drm_printer drm_info_printer(struct device *dev) 312 { 204 { 313 struct drm_printer p = { 205 struct drm_printer p = { 314 .printfn = __drm_printfn_info, 206 .printfn = __drm_printfn_info, 315 .arg = dev, 207 .arg = dev, 316 }; 208 }; 317 return p; 209 return p; 318 } 210 } 319 211 320 /** 212 /** 321 * drm_dbg_printer - construct a &drm_printer !! 213 * drm_debug_printer - construct a &drm_printer that outputs to pr_debug() 322 * @drm: the &struct drm_device pointer, or NU !! 214 * @prefix: debug output prefix 323 * @category: the debug category to use << 324 * @prefix: debug output prefix, or NULL for n << 325 * << 326 * RETURNS: << 327 * The &drm_printer object << 328 */ << 329 static inline struct drm_printer drm_dbg_print << 330 << 331 << 332 { << 333 struct drm_printer p = { << 334 .printfn = __drm_printfn_dbg, << 335 .arg = drm, << 336 .origin = (const void *)_THIS_ << 337 .prefix = prefix, << 338 .category = category, << 339 }; << 340 return p; << 341 } << 342 << 343 /** << 344 * drm_err_printer - construct a &drm_printer << 345 * @drm: the &struct drm_device pointer << 346 * @prefix: debug output prefix, or NULL for n << 347 * 215 * 348 * RETURNS: 216 * RETURNS: 349 * The &drm_printer object 217 * The &drm_printer object 350 */ 218 */ 351 static inline struct drm_printer drm_err_print !! 219 static inline struct drm_printer drm_debug_printer(const char *prefix) 352 << 353 { 220 { 354 struct drm_printer p = { 221 struct drm_printer p = { 355 .printfn = __drm_printfn_err, !! 222 .printfn = __drm_printfn_debug, 356 .arg = drm, << 357 .prefix = prefix 223 .prefix = prefix 358 }; 224 }; 359 return p; 225 return p; 360 } 226 } 361 227 362 /* 228 /* 363 * struct device based logging !! 229 * The following categories are defined: 364 * 230 * 365 * Prefer drm_device based logging over device !! 231 * CORE: Used in the generic drm code: drm_ioctl.c, drm_mm.c, drm_memory.c, ... >> 232 * This is the category used by the DRM_DEBUG() macro. >> 233 * >> 234 * DRIVER: Used in the vendor specific part of the driver: i915, radeon, ... >> 235 * This is the category used by the DRM_DEBUG_DRIVER() macro. >> 236 * >> 237 * KMS: used in the modesetting code. >> 238 * This is the category used by the DRM_DEBUG_KMS() macro. >> 239 * >> 240 * PRIME: used in the prime code. >> 241 * This is the category used by the DRM_DEBUG_PRIME() macro. >> 242 * >> 243 * ATOMIC: used in the atomic code. >> 244 * This is the category used by the DRM_DEBUG_ATOMIC() macro. >> 245 * >> 246 * VBL: used for verbose debug message in the vblank code >> 247 * This is the category used by the DRM_DEBUG_VBL() macro. >> 248 * >> 249 * Enabling verbose debug messages is done through the drm.debug parameter, >> 250 * each category being enabled by a bit. >> 251 * >> 252 * drm.debug=0x1 will enable CORE messages >> 253 * drm.debug=0x2 will enable DRIVER messages >> 254 * drm.debug=0x3 will enable CORE and DRIVER messages >> 255 * ... >> 256 * drm.debug=0x3f will enable all messages >> 257 * >> 258 * An interesting feature is that it's possible to enable verbose logging at >> 259 * run-time by echoing the debug value in its sysfs node: >> 260 * # echo 0xf > /sys/module/drm/parameters/debug 366 */ 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 367 272 368 __printf(3, 4) 273 __printf(3, 4) 369 void drm_dev_printk(const struct device *dev, 274 void drm_dev_printk(const struct device *dev, const char *level, 370 const char *format, ...); 275 const char *format, ...); 371 struct _ddebug; !! 276 __printf(3, 4) 372 __printf(4, 5) !! 277 void drm_dev_dbg(const struct device *dev, unsigned int category, 373 void __drm_dev_dbg(struct _ddebug *desc, const !! 278 const char *format, ...); 374 enum drm_debug_category cat !! 279 >> 280 __printf(2, 3) >> 281 void drm_dbg(unsigned int category, const char *format, ...); >> 282 __printf(1, 2) >> 283 void drm_err(const char *format, ...); >> 284 >> 285 /* Macros to make printk easier */ >> 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__) 375 303 376 /** 304 /** 377 * DRM_DEV_ERROR() - Error output. !! 305 * Error output. 378 * << 379 * NOTE: this is deprecated in favor of drm_er << 380 * 306 * 381 * @dev: device pointer 307 * @dev: device pointer 382 * @fmt: printf() like format string. 308 * @fmt: printf() like format string. 383 */ 309 */ 384 #define DRM_DEV_ERROR(dev, fmt, ...) 310 #define DRM_DEV_ERROR(dev, fmt, ...) \ 385 drm_dev_printk(dev, KERN_ERR, "*ERROR* 311 drm_dev_printk(dev, KERN_ERR, "*ERROR* " fmt, ##__VA_ARGS__) >> 312 #define DRM_ERROR(fmt, ...) \ >> 313 drm_err(fmt, ##__VA_ARGS__) 386 314 387 /** 315 /** 388 * DRM_DEV_ERROR_RATELIMITED() - Rate limited !! 316 * Rate limited error output. Like DRM_ERROR() but won't flood the log. 389 * << 390 * NOTE: this is deprecated in favor of drm_er << 391 * dev_err_ratelimited(). << 392 * 317 * 393 * @dev: device pointer 318 * @dev: device pointer 394 * @fmt: printf() like format string. 319 * @fmt: printf() like format string. 395 * << 396 * Like DRM_ERROR() but won't flood the log. << 397 */ 320 */ 398 #define DRM_DEV_ERROR_RATELIMITED(dev, fmt, .. 321 #define DRM_DEV_ERROR_RATELIMITED(dev, fmt, ...) \ 399 ({ 322 ({ \ 400 static DEFINE_RATELIMIT_STATE(_rs, 323 static DEFINE_RATELIMIT_STATE(_rs, \ 401 DEFAULT_ 324 DEFAULT_RATELIMIT_INTERVAL, \ 402 DEFAULT_ 325 DEFAULT_RATELIMIT_BURST); \ 403 326 \ 404 if (__ratelimit(&_rs)) 327 if (__ratelimit(&_rs)) \ 405 DRM_DEV_ERROR(dev, fmt, ##__VA 328 DRM_DEV_ERROR(dev, fmt, ##__VA_ARGS__); \ 406 }) 329 }) >> 330 #define DRM_ERROR_RATELIMITED(fmt, ...) \ >> 331 DRM_DEV_ERROR_RATELIMITED(NULL, fmt, ##__VA_ARGS__) 407 332 408 /* NOTE: this is deprecated in favor of drm_in !! 333 #define DRM_DEV_INFO(dev, fmt, ...) \ 409 #define DRM_DEV_INFO(dev, fmt, ...) << 410 drm_dev_printk(dev, KERN_INFO, fmt, ## 334 drm_dev_printk(dev, KERN_INFO, fmt, ##__VA_ARGS__) 411 335 412 /* NOTE: this is deprecated in favor of drm_in << 413 #define DRM_DEV_INFO_ONCE(dev, fmt, ...) 336 #define DRM_DEV_INFO_ONCE(dev, fmt, ...) \ 414 ({ 337 ({ \ 415 static bool __print_once __read_mostly 338 static bool __print_once __read_mostly; \ 416 if (!__print_once) { 339 if (!__print_once) { \ 417 __print_once = true; 340 __print_once = true; \ 418 DRM_DEV_INFO(dev, fmt, ##__VA_ 341 DRM_DEV_INFO(dev, fmt, ##__VA_ARGS__); \ 419 } 342 } \ 420 }) 343 }) 421 344 422 #if !defined(CONFIG_DRM_USE_DYNAMIC_DEBUG) << 423 #define drm_dev_dbg(dev, cat, fmt, ...) << 424 __drm_dev_dbg(NULL, dev, cat, fmt, ##_ << 425 #else << 426 #define drm_dev_dbg(dev, cat, fmt, ...) << 427 _dynamic_func_call_cls(cat, fmt, __drm << 428 dev, cat, fmt, << 429 #endif << 430 << 431 /** 345 /** 432 * DRM_DEV_DEBUG() - Debug output for generic !! 346 * Debug output. 433 * << 434 * NOTE: this is deprecated in favor of drm_db << 435 * 347 * 436 * @dev: device pointer 348 * @dev: device pointer 437 * @fmt: printf() like format string. 349 * @fmt: printf() like format string. 438 */ 350 */ 439 #define DRM_DEV_DEBUG(dev, fmt, ...) 351 #define DRM_DEV_DEBUG(dev, fmt, ...) \ 440 drm_dev_dbg(dev, DRM_UT_CORE, fmt, ##_ 352 drm_dev_dbg(dev, DRM_UT_CORE, fmt, ##__VA_ARGS__) 441 /** << 442 * DRM_DEV_DEBUG_DRIVER() - Debug output for v << 443 * << 444 * NOTE: this is deprecated in favor of drm_db << 445 * << 446 * @dev: device pointer << 447 * @fmt: printf() like format string. << 448 */ << 449 #define DRM_DEV_DEBUG_DRIVER(dev, fmt, ...) << 450 drm_dev_dbg(dev, DRM_UT_DRIVER, fmt, # << 451 /** << 452 * DRM_DEV_DEBUG_KMS() - Debug output for mode << 453 * << 454 * NOTE: this is deprecated in favor of drm_db << 455 * << 456 * @dev: device pointer << 457 * @fmt: printf() like format string. << 458 */ << 459 #define DRM_DEV_DEBUG_KMS(dev, fmt, ...) << 460 drm_dev_dbg(dev, DRM_UT_KMS, fmt, ##__ << 461 << 462 /* << 463 * struct drm_device based logging << 464 * << 465 * Prefer drm_device based logging over device << 466 */ << 467 << 468 /* Helper for struct drm_device based logging. << 469 #define __drm_printk(drm, level, type, fmt, .. << 470 dev_##level##type((drm) ? (drm)->dev : << 471 << 472 << 473 #define drm_info(drm, fmt, ...) << 474 __drm_printk((drm), info,, fmt, ##__VA << 475 << 476 #define drm_notice(drm, fmt, ...) << 477 __drm_printk((drm), notice,, fmt, ##__ << 478 << 479 #define drm_warn(drm, fmt, ...) << 480 __drm_printk((drm), warn,, fmt, ##__VA << 481 << 482 #define drm_err(drm, fmt, ...) << 483 __drm_printk((drm), err,, "*ERROR* " f << 484 << 485 << 486 #define drm_info_once(drm, fmt, ...) << 487 __drm_printk((drm), info, _once, fmt, << 488 << 489 #define drm_notice_once(drm, fmt, ...) << 490 __drm_printk((drm), notice, _once, fmt << 491 << 492 #define drm_warn_once(drm, fmt, ...) << 493 __drm_printk((drm), warn, _once, fmt, << 494 << 495 #define drm_err_once(drm, fmt, ...) << 496 __drm_printk((drm), err, _once, "*ERRO << 497 << 498 << 499 #define drm_err_ratelimited(drm, fmt, ...) << 500 __drm_printk((drm), err, _ratelimited, << 501 << 502 << 503 #define drm_dbg_core(drm, fmt, ...) << 504 drm_dev_dbg((drm) ? (drm)->dev : NULL, << 505 #define drm_dbg_driver(drm, fmt, ...) << 506 drm_dev_dbg((drm) ? (drm)->dev : NULL, << 507 #define drm_dbg_kms(drm, fmt, ...) << 508 drm_dev_dbg((drm) ? (drm)->dev : NULL, << 509 #define drm_dbg_prime(drm, fmt, ...) << 510 drm_dev_dbg((drm) ? (drm)->dev : NULL, << 511 #define drm_dbg_atomic(drm, fmt, ...) << 512 drm_dev_dbg((drm) ? (drm)->dev : NULL, << 513 #define drm_dbg_vbl(drm, fmt, ...) << 514 drm_dev_dbg((drm) ? (drm)->dev : NULL, << 515 #define drm_dbg_state(drm, fmt, ...) << 516 drm_dev_dbg((drm) ? (drm)->dev : NULL, << 517 #define drm_dbg_lease(drm, fmt, ...) << 518 drm_dev_dbg((drm) ? (drm)->dev : NULL, << 519 #define drm_dbg_dp(drm, fmt, ...) << 520 drm_dev_dbg((drm) ? (drm)->dev : NULL, << 521 #define drm_dbg_drmres(drm, fmt, ...) << 522 drm_dev_dbg((drm) ? (drm)->dev : NULL, << 523 << 524 #define drm_dbg(drm, fmt, ...) drm_dbg_driver << 525 << 526 /* << 527 * printk based logging << 528 * << 529 * Prefer drm_device based logging over device << 530 */ << 531 << 532 __printf(1, 2) << 533 void __drm_err(const char *format, ...); << 534 << 535 #if !defined(CONFIG_DRM_USE_DYNAMIC_DEBUG) << 536 #define __drm_dbg(cat, fmt, ...) __drm_ << 537 #else << 538 #define __drm_dbg(cat, fmt, ...) << 539 _dynamic_func_call_cls(cat, fmt, __drm << 540 NULL, cat, fmt, << 541 #endif << 542 << 543 /* Macros to make printk easier */ << 544 << 545 #define _DRM_PRINTK(once, level, fmt, ...) << 546 printk##once(KERN_##level "[" DRM_NAME << 547 << 548 /* NOTE: this is deprecated in favor of pr_inf << 549 #define DRM_INFO(fmt, ...) << 550 _DRM_PRINTK(, INFO, fmt, ##__VA_ARGS__ << 551 /* NOTE: this is deprecated in favor of pr_not << 552 #define DRM_NOTE(fmt, ...) << 553 _DRM_PRINTK(, NOTICE, fmt, ##__VA_ARGS << 554 /* NOTE: this is deprecated in favor of pr_war << 555 #define DRM_WARN(fmt, ...) << 556 _DRM_PRINTK(, WARNING, fmt, ##__VA_ARG << 557 << 558 /* NOTE: this is deprecated in favor of pr_inf << 559 #define DRM_INFO_ONCE(fmt, ...) << 560 _DRM_PRINTK(_once, INFO, fmt, ##__VA_A << 561 /* NOTE: this is deprecated in favor of pr_not << 562 #define DRM_NOTE_ONCE(fmt, ...) << 563 _DRM_PRINTK(_once, NOTICE, fmt, ##__VA << 564 /* NOTE: this is deprecated in favor of pr_war << 565 #define DRM_WARN_ONCE(fmt, ...) << 566 _DRM_PRINTK(_once, WARNING, fmt, ##__V << 567 << 568 /* NOTE: this is deprecated in favor of pr_err << 569 #define DRM_ERROR(fmt, ...) << 570 __drm_err(fmt, ##__VA_ARGS__) << 571 << 572 /* NOTE: this is deprecated in favor of pr_err << 573 #define DRM_ERROR_RATELIMITED(fmt, ...) << 574 DRM_DEV_ERROR_RATELIMITED(NULL, fmt, # << 575 << 576 /* NOTE: this is deprecated in favor of drm_db << 577 #define DRM_DEBUG(fmt, ...) 353 #define DRM_DEBUG(fmt, ...) \ 578 __drm_dbg(DRM_UT_CORE, fmt, ##__VA_ARG !! 354 drm_dbg(DRM_UT_CORE, fmt, ##__VA_ARGS__) 579 355 580 /* NOTE: this is deprecated in favor of drm_db !! 356 #define DRM_DEV_DEBUG_DRIVER(dev, fmt, ...) \ >> 357 drm_dev_dbg(dev, DRM_UT_DRIVER, fmt, ##__VA_ARGS__) 581 #define DRM_DEBUG_DRIVER(fmt, ...) 358 #define DRM_DEBUG_DRIVER(fmt, ...) \ 582 __drm_dbg(DRM_UT_DRIVER, fmt, ##__VA_A !! 359 drm_dbg(DRM_UT_DRIVER, fmt, ##__VA_ARGS__) 583 360 584 /* NOTE: this is deprecated in favor of drm_db !! 361 #define DRM_DEV_DEBUG_KMS(dev, fmt, ...) \ >> 362 drm_dev_dbg(dev, DRM_UT_KMS, fmt, ##__VA_ARGS__) 585 #define DRM_DEBUG_KMS(fmt, ...) 363 #define DRM_DEBUG_KMS(fmt, ...) \ 586 __drm_dbg(DRM_UT_KMS, fmt, ##__VA_ARGS !! 364 drm_dbg(DRM_UT_KMS, fmt, ##__VA_ARGS__) 587 365 588 /* NOTE: this is deprecated in favor of drm_db !! 366 #define DRM_DEV_DEBUG_PRIME(dev, fmt, ...) \ >> 367 drm_dev_dbg(dev, DRM_UT_PRIME, fmt, ##__VA_ARGS__) 589 #define DRM_DEBUG_PRIME(fmt, ...) 368 #define DRM_DEBUG_PRIME(fmt, ...) \ 590 __drm_dbg(DRM_UT_PRIME, fmt, ##__VA_AR !! 369 drm_dbg(DRM_UT_PRIME, fmt, ##__VA_ARGS__) 591 370 592 /* NOTE: this is deprecated in favor of drm_db !! 371 #define DRM_DEV_DEBUG_ATOMIC(dev, fmt, ...) \ >> 372 drm_dev_dbg(dev, DRM_UT_ATOMIC, fmt, ##__VA_ARGS__) 593 #define DRM_DEBUG_ATOMIC(fmt, ...) 373 #define DRM_DEBUG_ATOMIC(fmt, ...) \ 594 __drm_dbg(DRM_UT_ATOMIC, fmt, ##__VA_A !! 374 drm_dbg(DRM_UT_ATOMIC, fmt, ##__VA_ARGS__) 595 375 596 /* NOTE: this is deprecated in favor of drm_db !! 376 #define DRM_DEV_DEBUG_VBL(dev, fmt, ...) \ >> 377 drm_dev_dbg(dev, DRM_UT_VBL, fmt, ##__VA_ARGS__) 597 #define DRM_DEBUG_VBL(fmt, ...) 378 #define DRM_DEBUG_VBL(fmt, ...) \ 598 __drm_dbg(DRM_UT_VBL, fmt, ##__VA_ARGS !! 379 drm_dbg(DRM_UT_VBL, fmt, ##__VA_ARGS__) 599 380 600 /* NOTE: this is deprecated in favor of drm_db << 601 #define DRM_DEBUG_LEASE(fmt, ...) 381 #define DRM_DEBUG_LEASE(fmt, ...) \ 602 __drm_dbg(DRM_UT_LEASE, fmt, ##__VA_AR !! 382 drm_dbg(DRM_UT_LEASE, fmt, ##__VA_ARGS__) 603 383 604 /* NOTE: this is deprecated in favor of drm_db !! 384 #define DRM_DEV_DEBUG_DP(dev, fmt, ...) \ >> 385 drm_dev_dbg(dev, DRM_UT_DP, fmt, ## __VA_ARGS__) 605 #define DRM_DEBUG_DP(fmt, ...) 386 #define DRM_DEBUG_DP(fmt, ...) \ 606 __drm_dbg(DRM_UT_DP, fmt, ## __VA_ARGS !! 387 drm_dbg(DRM_UT_DP, fmt, ## __VA_ARGS__) 607 388 608 #define __DRM_DEFINE_DBG_RATELIMITED(category, !! 389 #define _DRM_DEV_DEFINE_DEBUG_RATELIMITED(dev, category, fmt, ...) \ 609 ({ !! 390 ({ \ 610 static DEFINE_RATELIMIT_STATE(rs_, DEF !! 391 static DEFINE_RATELIMIT_STATE(_rs, \ 611 const struct drm_device *drm_ = (drm); !! 392 DEFAULT_RATELIMIT_INTERVAL, \ 612 !! 393 DEFAULT_RATELIMIT_BURST); \ 613 if (drm_debug_enabled(DRM_UT_ ## categ !! 394 if (__ratelimit(&_rs)) \ 614 drm_dev_printk(drm_ ? drm_->de !! 395 drm_dev_dbg(dev, category, fmt, ##__VA_ARGS__); \ 615 }) 396 }) 616 397 617 #define drm_dbg_ratelimited(drm, fmt, ...) \ !! 398 /** 618 __DRM_DEFINE_DBG_RATELIMITED(DRIVER, d !! 399 * Rate limited debug output. Like DRM_DEBUG() but won't flood the log. 619 << 620 #define drm_dbg_kms_ratelimited(drm, fmt, ...) << 621 __DRM_DEFINE_DBG_RATELIMITED(KMS, drm, << 622 << 623 /* << 624 * struct drm_device based WARNs << 625 * << 626 * drm_WARN*() acts like WARN*(), but with the << 627 * using device specific information so that w << 628 * warning is originating from. << 629 * 400 * 630 * Prefer drm_device based drm_WARN* over regu !! 401 * @dev: device pointer >> 402 * @fmt: printf() like format string. 631 */ 403 */ 632 !! 404 #define DRM_DEV_DEBUG_RATELIMITED(dev, fmt, ...) \ 633 /* Helper for struct drm_device based WARNs */ !! 405 _DEV_DRM_DEFINE_DEBUG_RATELIMITED(dev, DRM_UT_CORE, \ 634 #define drm_WARN(drm, condition, format, arg.. !! 406 fmt, ##__VA_ARGS__) 635 WARN(condition, "%s %s: [drm] " format !! 407 #define DRM_DEBUG_RATELIMITED(fmt, ...) \ 636 dev_driver_string((drm !! 408 DRM_DEV_DEBUG_RATELIMITED(NULL, fmt, ##__VA_ARGS__) 637 dev_name((drm)->dev), !! 409 638 !! 410 #define DRM_DEV_DEBUG_DRIVER_RATELIMITED(dev, fmt, ...) \ 639 #define drm_WARN_ONCE(drm, condition, format, !! 411 _DRM_DEV_DEFINE_DEBUG_RATELIMITED(dev, DRM_UT_DRIVER, \ 640 WARN_ONCE(condition, "%s %s: [drm] " f !! 412 fmt, ##__VA_ARGS__) 641 dev_driver_string((drm !! 413 #define DRM_DEBUG_DRIVER_RATELIMITED(fmt, ...) \ 642 dev_name((drm)->dev), !! 414 DRM_DEV_DEBUG_DRIVER_RATELIMITED(NULL, fmt, ##__VA_ARGS__) 643 !! 415 644 #define drm_WARN_ON(drm, x) !! 416 #define DRM_DEV_DEBUG_KMS_RATELIMITED(dev, fmt, ...) \ 645 drm_WARN((drm), (x), "%s", !! 417 _DRM_DEV_DEFINE_DEBUG_RATELIMITED(dev, DRM_UT_KMS, \ 646 "drm_WARN_ON(" __stringify(x) !! 418 fmt, ##__VA_ARGS__) 647 !! 419 #define DRM_DEBUG_KMS_RATELIMITED(fmt, ...) \ 648 #define drm_WARN_ON_ONCE(drm, x) !! 420 DRM_DEV_DEBUG_KMS_RATELIMITED(NULL, fmt, ##__VA_ARGS__) 649 drm_WARN_ONCE((drm), (x), "%s", !! 421 650 "drm_WARN_ON_ONCE(" __st !! 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__) 651 427 652 #endif /* DRM_PRINT_H_ */ 428 #endif /* DRM_PRINT_H_ */ 653 429
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.