1 1.3 riastrad /* $NetBSD: drm_print.h,v 1.3 2021/12/19 01:54:20 riastradh Exp $ */ 2 1.1 riastrad 3 1.1 riastrad /* 4 1.1 riastrad * Copyright (C) 2016 Red Hat 5 1.1 riastrad * 6 1.1 riastrad * Permission is hereby granted, free of charge, to any person obtaining a 7 1.1 riastrad * copy of this software and associated documentation files (the "Software"), 8 1.1 riastrad * to deal in the Software without restriction, including without limitation 9 1.1 riastrad * the rights to use, copy, modify, merge, publish, distribute, sublicense, 10 1.1 riastrad * and/or sell copies of the Software, and to permit persons to whom the 11 1.1 riastrad * Software is furnished to do so, subject to the following conditions: 12 1.1 riastrad * 13 1.1 riastrad * The above copyright notice and this permission notice shall be included in 14 1.1 riastrad * all copies or substantial portions of the Software. 15 1.1 riastrad * 16 1.1 riastrad * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 1.1 riastrad * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 1.1 riastrad * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 19 1.1 riastrad * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 20 1.1 riastrad * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 21 1.1 riastrad * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 22 1.1 riastrad * OTHER DEALINGS IN THE SOFTWARE. 23 1.1 riastrad * 24 1.1 riastrad * Authors: 25 1.1 riastrad * Rob Clark <robdclark (at) gmail.com> 26 1.1 riastrad */ 27 1.1 riastrad 28 1.1 riastrad #ifndef DRM_PRINT_H_ 29 1.1 riastrad #define DRM_PRINT_H_ 30 1.1 riastrad 31 1.1 riastrad #include <linux/compiler.h> 32 1.1 riastrad #include <linux/printk.h> 33 1.1 riastrad #include <linux/seq_file.h> 34 1.1 riastrad #include <linux/device.h> 35 1.1 riastrad #include <linux/debugfs.h> 36 1.1 riastrad 37 1.1 riastrad #include <drm/drm.h> 38 1.1 riastrad 39 1.1 riastrad /* Do *not* use outside of drm_print.[ch]! */ 40 1.1 riastrad extern unsigned int __drm_debug; 41 1.1 riastrad 42 1.1 riastrad /** 43 1.1 riastrad * DOC: print 44 1.1 riastrad * 45 1.1 riastrad * A simple wrapper for dev_printk(), seq_printf(), etc. Allows same 46 1.1 riastrad * debug code to be used for both debugfs and printk logging. 47 1.1 riastrad * 48 1.1 riastrad * For example:: 49 1.1 riastrad * 50 1.1 riastrad * void log_some_info(struct drm_printer *p) 51 1.1 riastrad * { 52 1.1 riastrad * drm_printf(p, "foo=%d\n", foo); 53 1.1 riastrad * drm_printf(p, "bar=%d\n", bar); 54 1.1 riastrad * } 55 1.1 riastrad * 56 1.1 riastrad * #ifdef CONFIG_DEBUG_FS 57 1.1 riastrad * void debugfs_show(struct seq_file *f) 58 1.1 riastrad * { 59 1.1 riastrad * struct drm_printer p = drm_seq_file_printer(f); 60 1.1 riastrad * log_some_info(&p); 61 1.1 riastrad * } 62 1.1 riastrad * #endif 63 1.1 riastrad * 64 1.1 riastrad * void some_other_function(...) 65 1.1 riastrad * { 66 1.1 riastrad * struct drm_printer p = drm_info_printer(drm->dev); 67 1.1 riastrad * log_some_info(&p); 68 1.1 riastrad * } 69 1.1 riastrad */ 70 1.1 riastrad 71 1.1 riastrad /** 72 1.1 riastrad * struct drm_printer - drm output "stream" 73 1.1 riastrad * 74 1.1 riastrad * Do not use struct members directly. Use drm_printer_seq_file(), 75 1.1 riastrad * drm_printer_info(), etc to initialize. And drm_printf() for output. 76 1.1 riastrad */ 77 1.1 riastrad struct drm_printer { 78 1.1 riastrad /* private: */ 79 1.1 riastrad void (*printfn)(struct drm_printer *p, struct va_format *vaf); 80 1.1 riastrad void (*puts)(struct drm_printer *p, const char *str); 81 1.1 riastrad void *arg; 82 1.1 riastrad const char *prefix; 83 1.1 riastrad }; 84 1.1 riastrad 85 1.1 riastrad void __drm_printfn_coredump(struct drm_printer *p, struct va_format *vaf); 86 1.1 riastrad void __drm_puts_coredump(struct drm_printer *p, const char *str); 87 1.1 riastrad void __drm_printfn_seq_file(struct drm_printer *p, struct va_format *vaf); 88 1.1 riastrad void __drm_puts_seq_file(struct drm_printer *p, const char *str); 89 1.1 riastrad void __drm_printfn_info(struct drm_printer *p, struct va_format *vaf); 90 1.1 riastrad void __drm_printfn_debug(struct drm_printer *p, struct va_format *vaf); 91 1.1 riastrad void __drm_printfn_err(struct drm_printer *p, struct va_format *vaf); 92 1.1 riastrad 93 1.1 riastrad __printf(2, 3) 94 1.1 riastrad void drm_printf(struct drm_printer *p, const char *f, ...); 95 1.1 riastrad void drm_puts(struct drm_printer *p, const char *str); 96 1.3 riastrad #ifndef __NetBSD__ 97 1.1 riastrad void drm_print_regset32(struct drm_printer *p, struct debugfs_regset32 *regset); 98 1.3 riastrad #endif 99 1.1 riastrad void drm_print_bits(struct drm_printer *p, unsigned long value, 100 1.1 riastrad const char * const bits[], unsigned int nbits); 101 1.1 riastrad 102 1.1 riastrad __printf(2, 0) 103 1.1 riastrad /** 104 1.1 riastrad * drm_vprintf - print to a &drm_printer stream 105 1.1 riastrad * @p: the &drm_printer 106 1.1 riastrad * @fmt: format string 107 1.1 riastrad * @va: the va_list 108 1.1 riastrad */ 109 1.1 riastrad static inline void 110 1.1 riastrad drm_vprintf(struct drm_printer *p, const char *fmt, va_list *va) 111 1.1 riastrad { 112 1.1 riastrad struct va_format vaf = { .fmt = fmt, .va = va }; 113 1.1 riastrad 114 1.1 riastrad p->printfn(p, &vaf); 115 1.1 riastrad } 116 1.1 riastrad 117 1.1 riastrad /** 118 1.1 riastrad * drm_printf_indent - Print to a &drm_printer stream with indentation 119 1.1 riastrad * @printer: DRM printer 120 1.1 riastrad * @indent: Tab indentation level (max 5) 121 1.1 riastrad * @fmt: Format string 122 1.1 riastrad */ 123 1.1 riastrad #define drm_printf_indent(printer, indent, fmt, ...) \ 124 1.1 riastrad drm_printf((printer), "%.*s" fmt, (indent), "\t\t\t\t\tX", ##__VA_ARGS__) 125 1.1 riastrad 126 1.1 riastrad /** 127 1.1 riastrad * struct drm_print_iterator - local struct used with drm_printer_coredump 128 1.1 riastrad * @data: Pointer to the devcoredump output buffer 129 1.1 riastrad * @start: The offset within the buffer to start writing 130 1.1 riastrad * @remain: The number of bytes to write for this iteration 131 1.1 riastrad */ 132 1.1 riastrad struct drm_print_iterator { 133 1.1 riastrad void *data; 134 1.1 riastrad ssize_t start; 135 1.1 riastrad ssize_t remain; 136 1.1 riastrad /* private: */ 137 1.1 riastrad ssize_t offset; 138 1.1 riastrad }; 139 1.1 riastrad 140 1.1 riastrad /** 141 1.1 riastrad * drm_coredump_printer - construct a &drm_printer that can output to a buffer 142 1.1 riastrad * from the read function for devcoredump 143 1.1 riastrad * @iter: A pointer to a struct drm_print_iterator for the read instance 144 1.1 riastrad * 145 1.1 riastrad * This wrapper extends drm_printf() to work with a dev_coredumpm() callback 146 1.1 riastrad * function. The passed in drm_print_iterator struct contains the buffer 147 1.1 riastrad * pointer, size and offset as passed in from devcoredump. 148 1.1 riastrad * 149 1.1 riastrad * For example:: 150 1.1 riastrad * 151 1.1 riastrad * void coredump_read(char *buffer, loff_t offset, size_t count, 152 1.1 riastrad * void *data, size_t datalen) 153 1.1 riastrad * { 154 1.1 riastrad * struct drm_print_iterator iter; 155 1.1 riastrad * struct drm_printer p; 156 1.1 riastrad * 157 1.1 riastrad * iter.data = buffer; 158 1.1 riastrad * iter.start = offset; 159 1.1 riastrad * iter.remain = count; 160 1.1 riastrad * 161 1.1 riastrad * p = drm_coredump_printer(&iter); 162 1.1 riastrad * 163 1.1 riastrad * drm_printf(p, "foo=%d\n", foo); 164 1.1 riastrad * } 165 1.1 riastrad * 166 1.1 riastrad * void makecoredump(...) 167 1.1 riastrad * { 168 1.1 riastrad * ... 169 1.1 riastrad * dev_coredumpm(dev, THIS_MODULE, data, 0, GFP_KERNEL, 170 1.1 riastrad * coredump_read, ...) 171 1.1 riastrad * } 172 1.1 riastrad * 173 1.1 riastrad * RETURNS: 174 1.1 riastrad * The &drm_printer object 175 1.1 riastrad */ 176 1.1 riastrad static inline struct drm_printer 177 1.1 riastrad drm_coredump_printer(struct drm_print_iterator *iter) 178 1.1 riastrad { 179 1.1 riastrad struct drm_printer p = { 180 1.1 riastrad .printfn = __drm_printfn_coredump, 181 1.1 riastrad .puts = __drm_puts_coredump, 182 1.1 riastrad .arg = iter, 183 1.1 riastrad }; 184 1.1 riastrad 185 1.1 riastrad /* Set the internal offset of the iterator to zero */ 186 1.1 riastrad iter->offset = 0; 187 1.1 riastrad 188 1.1 riastrad return p; 189 1.1 riastrad } 190 1.1 riastrad 191 1.1 riastrad /** 192 1.1 riastrad * drm_seq_file_printer - construct a &drm_printer that outputs to &seq_file 193 1.1 riastrad * @f: the &struct seq_file to output to 194 1.1 riastrad * 195 1.1 riastrad * RETURNS: 196 1.1 riastrad * The &drm_printer object 197 1.1 riastrad */ 198 1.1 riastrad static inline struct drm_printer drm_seq_file_printer(struct seq_file *f) 199 1.1 riastrad { 200 1.1 riastrad struct drm_printer p = { 201 1.1 riastrad .printfn = __drm_printfn_seq_file, 202 1.1 riastrad .puts = __drm_puts_seq_file, 203 1.1 riastrad .arg = f, 204 1.1 riastrad }; 205 1.1 riastrad return p; 206 1.1 riastrad } 207 1.1 riastrad 208 1.1 riastrad /** 209 1.1 riastrad * drm_info_printer - construct a &drm_printer that outputs to dev_printk() 210 1.1 riastrad * @dev: the &struct device pointer 211 1.1 riastrad * 212 1.1 riastrad * RETURNS: 213 1.1 riastrad * The &drm_printer object 214 1.1 riastrad */ 215 1.1 riastrad static inline struct drm_printer drm_info_printer(struct device *dev) 216 1.1 riastrad { 217 1.1 riastrad struct drm_printer p = { 218 1.1 riastrad .printfn = __drm_printfn_info, 219 1.1 riastrad .arg = dev, 220 1.1 riastrad }; 221 1.1 riastrad return p; 222 1.1 riastrad } 223 1.1 riastrad 224 1.1 riastrad /** 225 1.1 riastrad * drm_debug_printer - construct a &drm_printer that outputs to pr_debug() 226 1.1 riastrad * @prefix: debug output prefix 227 1.1 riastrad * 228 1.1 riastrad * RETURNS: 229 1.1 riastrad * The &drm_printer object 230 1.1 riastrad */ 231 1.1 riastrad static inline struct drm_printer drm_debug_printer(const char *prefix) 232 1.1 riastrad { 233 1.1 riastrad struct drm_printer p = { 234 1.1 riastrad .printfn = __drm_printfn_debug, 235 1.1 riastrad .prefix = prefix 236 1.1 riastrad }; 237 1.1 riastrad return p; 238 1.1 riastrad } 239 1.1 riastrad 240 1.1 riastrad /** 241 1.1 riastrad * drm_err_printer - construct a &drm_printer that outputs to pr_err() 242 1.1 riastrad * @prefix: debug output prefix 243 1.1 riastrad * 244 1.1 riastrad * RETURNS: 245 1.1 riastrad * The &drm_printer object 246 1.1 riastrad */ 247 1.1 riastrad static inline struct drm_printer drm_err_printer(const char *prefix) 248 1.1 riastrad { 249 1.1 riastrad struct drm_printer p = { 250 1.1 riastrad .printfn = __drm_printfn_err, 251 1.1 riastrad .prefix = prefix 252 1.1 riastrad }; 253 1.1 riastrad return p; 254 1.1 riastrad } 255 1.1 riastrad 256 1.1 riastrad /** 257 1.1 riastrad * enum drm_debug_category - The DRM debug categories 258 1.1 riastrad * 259 1.1 riastrad * Each of the DRM debug logging macros use a specific category, and the logging 260 1.1 riastrad * is filtered by the drm.debug module parameter. This enum specifies the values 261 1.1 riastrad * for the interface. 262 1.1 riastrad * 263 1.1 riastrad * Each DRM_DEBUG_<CATEGORY> macro logs to DRM_UT_<CATEGORY> category, except 264 1.1 riastrad * DRM_DEBUG() logs to DRM_UT_CORE. 265 1.1 riastrad * 266 1.1 riastrad * Enabling verbose debug messages is done through the drm.debug parameter, each 267 1.1 riastrad * category being enabled by a bit: 268 1.1 riastrad * 269 1.1 riastrad * - drm.debug=0x1 will enable CORE messages 270 1.1 riastrad * - drm.debug=0x2 will enable DRIVER messages 271 1.1 riastrad * - drm.debug=0x3 will enable CORE and DRIVER messages 272 1.1 riastrad * - ... 273 1.1 riastrad * - drm.debug=0x1ff will enable all messages 274 1.1 riastrad * 275 1.1 riastrad * An interesting feature is that it's possible to enable verbose logging at 276 1.1 riastrad * run-time by echoing the debug value in its sysfs node:: 277 1.1 riastrad * 278 1.1 riastrad * # echo 0xf > /sys/module/drm/parameters/debug 279 1.1 riastrad * 280 1.1 riastrad */ 281 1.1 riastrad enum drm_debug_category { 282 1.1 riastrad /** 283 1.1 riastrad * @DRM_UT_CORE: Used in the generic drm code: drm_ioctl.c, drm_mm.c, 284 1.1 riastrad * drm_memory.c, ... 285 1.1 riastrad */ 286 1.1 riastrad DRM_UT_CORE = 0x01, 287 1.1 riastrad /** 288 1.1 riastrad * @DRM_UT_DRIVER: Used in the vendor specific part of the driver: i915, 289 1.1 riastrad * radeon, ... macro. 290 1.1 riastrad */ 291 1.1 riastrad DRM_UT_DRIVER = 0x02, 292 1.1 riastrad /** 293 1.1 riastrad * @DRM_UT_KMS: Used in the modesetting code. 294 1.1 riastrad */ 295 1.1 riastrad DRM_UT_KMS = 0x04, 296 1.1 riastrad /** 297 1.1 riastrad * @DRM_UT_PRIME: Used in the prime code. 298 1.1 riastrad */ 299 1.1 riastrad DRM_UT_PRIME = 0x08, 300 1.1 riastrad /** 301 1.1 riastrad * @DRM_UT_ATOMIC: Used in the atomic code. 302 1.1 riastrad */ 303 1.1 riastrad DRM_UT_ATOMIC = 0x10, 304 1.1 riastrad /** 305 1.1 riastrad * @DRM_UT_VBL: Used for verbose debug message in the vblank code. 306 1.1 riastrad */ 307 1.1 riastrad DRM_UT_VBL = 0x20, 308 1.1 riastrad /** 309 1.1 riastrad * @DRM_UT_STATE: Used for verbose atomic state debugging. 310 1.1 riastrad */ 311 1.1 riastrad DRM_UT_STATE = 0x40, 312 1.1 riastrad /** 313 1.1 riastrad * @DRM_UT_LEASE: Used in the lease code. 314 1.1 riastrad */ 315 1.1 riastrad DRM_UT_LEASE = 0x80, 316 1.1 riastrad /** 317 1.1 riastrad * @DRM_UT_DP: Used in the DP code. 318 1.1 riastrad */ 319 1.1 riastrad DRM_UT_DP = 0x100, 320 1.1 riastrad }; 321 1.1 riastrad 322 1.1 riastrad static inline bool drm_debug_enabled(enum drm_debug_category category) 323 1.1 riastrad { 324 1.1 riastrad return unlikely(__drm_debug & category); 325 1.1 riastrad } 326 1.1 riastrad 327 1.1 riastrad /* 328 1.1 riastrad * struct device based logging 329 1.1 riastrad * 330 1.1 riastrad * Prefer drm_device based logging over device or prink based logging. 331 1.1 riastrad */ 332 1.1 riastrad 333 1.1 riastrad __printf(3, 4) 334 1.1 riastrad void drm_dev_printk(const struct device *dev, const char *level, 335 1.1 riastrad const char *format, ...); 336 1.1 riastrad __printf(3, 4) 337 1.1 riastrad void drm_dev_dbg(const struct device *dev, enum drm_debug_category category, 338 1.1 riastrad const char *format, ...); 339 1.1 riastrad 340 1.1 riastrad /** 341 1.1 riastrad * Error output. 342 1.1 riastrad * 343 1.1 riastrad * @dev: device pointer 344 1.1 riastrad * @fmt: printf() like format string. 345 1.1 riastrad */ 346 1.1 riastrad #define DRM_DEV_ERROR(dev, fmt, ...) \ 347 1.1 riastrad drm_dev_printk(dev, KERN_ERR, "*ERROR* " fmt, ##__VA_ARGS__) 348 1.1 riastrad 349 1.1 riastrad /** 350 1.1 riastrad * Rate limited error output. Like DRM_ERROR() but won't flood the log. 351 1.1 riastrad * 352 1.1 riastrad * @dev: device pointer 353 1.1 riastrad * @fmt: printf() like format string. 354 1.1 riastrad */ 355 1.1 riastrad #define DRM_DEV_ERROR_RATELIMITED(dev, fmt, ...) \ 356 1.1 riastrad ({ \ 357 1.1 riastrad static DEFINE_RATELIMIT_STATE(_rs, \ 358 1.1 riastrad DEFAULT_RATELIMIT_INTERVAL, \ 359 1.1 riastrad DEFAULT_RATELIMIT_BURST); \ 360 1.1 riastrad \ 361 1.1 riastrad if (__ratelimit(&_rs)) \ 362 1.1 riastrad DRM_DEV_ERROR(dev, fmt, ##__VA_ARGS__); \ 363 1.1 riastrad }) 364 1.1 riastrad 365 1.1 riastrad #define DRM_DEV_INFO(dev, fmt, ...) \ 366 1.1 riastrad drm_dev_printk(dev, KERN_INFO, fmt, ##__VA_ARGS__) 367 1.1 riastrad 368 1.1 riastrad #define DRM_DEV_INFO_ONCE(dev, fmt, ...) \ 369 1.1 riastrad ({ \ 370 1.1 riastrad static bool __print_once __read_mostly; \ 371 1.1 riastrad if (!__print_once) { \ 372 1.1 riastrad __print_once = true; \ 373 1.1 riastrad DRM_DEV_INFO(dev, fmt, ##__VA_ARGS__); \ 374 1.1 riastrad } \ 375 1.1 riastrad }) 376 1.1 riastrad 377 1.1 riastrad /** 378 1.1 riastrad * Debug output. 379 1.1 riastrad * 380 1.1 riastrad * @dev: device pointer 381 1.1 riastrad * @fmt: printf() like format string. 382 1.1 riastrad */ 383 1.1 riastrad #define DRM_DEV_DEBUG(dev, fmt, ...) \ 384 1.1 riastrad drm_dev_dbg(dev, DRM_UT_CORE, fmt, ##__VA_ARGS__) 385 1.1 riastrad #define DRM_DEV_DEBUG_DRIVER(dev, fmt, ...) \ 386 1.1 riastrad drm_dev_dbg(dev, DRM_UT_DRIVER, fmt, ##__VA_ARGS__) 387 1.1 riastrad #define DRM_DEV_DEBUG_KMS(dev, fmt, ...) \ 388 1.1 riastrad drm_dev_dbg(dev, DRM_UT_KMS, fmt, ##__VA_ARGS__) 389 1.1 riastrad #define DRM_DEV_DEBUG_PRIME(dev, fmt, ...) \ 390 1.1 riastrad drm_dev_dbg(dev, DRM_UT_PRIME, fmt, ##__VA_ARGS__) 391 1.1 riastrad #define DRM_DEV_DEBUG_ATOMIC(dev, fmt, ...) \ 392 1.1 riastrad drm_dev_dbg(dev, DRM_UT_ATOMIC, fmt, ##__VA_ARGS__) 393 1.1 riastrad #define DRM_DEV_DEBUG_VBL(dev, fmt, ...) \ 394 1.1 riastrad drm_dev_dbg(dev, DRM_UT_VBL, fmt, ##__VA_ARGS__) 395 1.1 riastrad #define DRM_DEV_DEBUG_DP(dev, fmt, ...) \ 396 1.1 riastrad drm_dev_dbg(dev, DRM_UT_DP, fmt, ## __VA_ARGS__) 397 1.1 riastrad 398 1.1 riastrad #define _DRM_DEV_DEFINE_DEBUG_RATELIMITED(dev, category, fmt, ...) \ 399 1.1 riastrad ({ \ 400 1.1 riastrad static DEFINE_RATELIMIT_STATE(_rs, \ 401 1.1 riastrad DEFAULT_RATELIMIT_INTERVAL, \ 402 1.1 riastrad DEFAULT_RATELIMIT_BURST); \ 403 1.1 riastrad if (__ratelimit(&_rs)) \ 404 1.1 riastrad drm_dev_dbg(dev, category, fmt, ##__VA_ARGS__); \ 405 1.1 riastrad }) 406 1.1 riastrad 407 1.1 riastrad /** 408 1.1 riastrad * Rate limited debug output. Like DRM_DEBUG() but won't flood the log. 409 1.1 riastrad * 410 1.1 riastrad * @dev: device pointer 411 1.1 riastrad * @fmt: printf() like format string. 412 1.1 riastrad */ 413 1.1 riastrad #define DRM_DEV_DEBUG_RATELIMITED(dev, fmt, ...) \ 414 1.1 riastrad _DEV_DRM_DEFINE_DEBUG_RATELIMITED(dev, DRM_UT_CORE, \ 415 1.1 riastrad fmt, ##__VA_ARGS__) 416 1.1 riastrad #define DRM_DEV_DEBUG_DRIVER_RATELIMITED(dev, fmt, ...) \ 417 1.1 riastrad _DRM_DEV_DEFINE_DEBUG_RATELIMITED(dev, DRM_UT_DRIVER, \ 418 1.1 riastrad fmt, ##__VA_ARGS__) 419 1.1 riastrad #define DRM_DEV_DEBUG_KMS_RATELIMITED(dev, fmt, ...) \ 420 1.1 riastrad _DRM_DEV_DEFINE_DEBUG_RATELIMITED(dev, DRM_UT_KMS, \ 421 1.1 riastrad fmt, ##__VA_ARGS__) 422 1.1 riastrad #define DRM_DEV_DEBUG_PRIME_RATELIMITED(dev, fmt, ...) \ 423 1.1 riastrad _DRM_DEV_DEFINE_DEBUG_RATELIMITED(dev, DRM_UT_PRIME, \ 424 1.1 riastrad fmt, ##__VA_ARGS__) 425 1.1 riastrad 426 1.1 riastrad /* 427 1.1 riastrad * struct drm_device based logging 428 1.1 riastrad * 429 1.1 riastrad * Prefer drm_device based logging over device or prink based logging. 430 1.1 riastrad */ 431 1.1 riastrad 432 1.1 riastrad /* Helper for struct drm_device based logging. */ 433 1.1 riastrad #define __drm_printk(drm, level, type, fmt, ...) \ 434 1.1 riastrad dev_##level##type((drm)->dev, "[drm] " fmt, ##__VA_ARGS__) 435 1.1 riastrad 436 1.1 riastrad 437 1.1 riastrad #define drm_info(drm, fmt, ...) \ 438 1.1 riastrad __drm_printk((drm), info,, fmt, ##__VA_ARGS__) 439 1.1 riastrad 440 1.1 riastrad #define drm_notice(drm, fmt, ...) \ 441 1.1 riastrad __drm_printk((drm), notice,, fmt, ##__VA_ARGS__) 442 1.1 riastrad 443 1.1 riastrad #define drm_warn(drm, fmt, ...) \ 444 1.1 riastrad __drm_printk((drm), warn,, fmt, ##__VA_ARGS__) 445 1.1 riastrad 446 1.1 riastrad #define drm_err(drm, fmt, ...) \ 447 1.1 riastrad __drm_printk((drm), err,, "*ERROR* " fmt, ##__VA_ARGS__) 448 1.1 riastrad 449 1.1 riastrad 450 1.1 riastrad #define drm_info_once(drm, fmt, ...) \ 451 1.1 riastrad __drm_printk((drm), info, _once, fmt, ##__VA_ARGS__) 452 1.1 riastrad 453 1.1 riastrad #define drm_notice_once(drm, fmt, ...) \ 454 1.1 riastrad __drm_printk((drm), notice, _once, fmt, ##__VA_ARGS__) 455 1.1 riastrad 456 1.1 riastrad #define drm_warn_once(drm, fmt, ...) \ 457 1.1 riastrad __drm_printk((drm), warn, _once, fmt, ##__VA_ARGS__) 458 1.1 riastrad 459 1.1 riastrad #define drm_err_once(drm, fmt, ...) \ 460 1.1 riastrad __drm_printk((drm), err, _once, "*ERROR* " fmt, ##__VA_ARGS__) 461 1.1 riastrad 462 1.1 riastrad 463 1.1 riastrad #define drm_err_ratelimited(drm, fmt, ...) \ 464 1.1 riastrad __drm_printk((drm), err, _ratelimited, "*ERROR* " fmt, ##__VA_ARGS__) 465 1.1 riastrad 466 1.1 riastrad 467 1.1 riastrad #define drm_dbg_core(drm, fmt, ...) \ 468 1.1 riastrad drm_dev_dbg((drm)->dev, DRM_UT_CORE, fmt, ##__VA_ARGS__) 469 1.1 riastrad #define drm_dbg(drm, fmt, ...) \ 470 1.1 riastrad drm_dev_dbg((drm)->dev, DRM_UT_DRIVER, fmt, ##__VA_ARGS__) 471 1.1 riastrad #define drm_dbg_kms(drm, fmt, ...) \ 472 1.1 riastrad drm_dev_dbg((drm)->dev, DRM_UT_KMS, fmt, ##__VA_ARGS__) 473 1.1 riastrad #define drm_dbg_prime(drm, fmt, ...) \ 474 1.1 riastrad drm_dev_dbg((drm)->dev, DRM_UT_PRIME, fmt, ##__VA_ARGS__) 475 1.1 riastrad #define drm_dbg_atomic(drm, fmt, ...) \ 476 1.1 riastrad drm_dev_dbg((drm)->dev, DRM_UT_ATOMIC, fmt, ##__VA_ARGS__) 477 1.1 riastrad #define drm_dbg_vbl(drm, fmt, ...) \ 478 1.1 riastrad drm_dev_dbg((drm)->dev, DRM_UT_VBL, fmt, ##__VA_ARGS__) 479 1.1 riastrad #define drm_dbg_state(drm, fmt, ...) \ 480 1.1 riastrad drm_dev_dbg((drm)->dev, DRM_UT_STATE, fmt, ##__VA_ARGS__) 481 1.1 riastrad #define drm_dbg_lease(drm, fmt, ...) \ 482 1.1 riastrad drm_dev_dbg((drm)->dev, DRM_UT_LEASE, fmt, ##__VA_ARGS__) 483 1.1 riastrad #define drm_dbg_dp(drm, fmt, ...) \ 484 1.1 riastrad drm_dev_dbg((drm)->dev, DRM_UT_DP, fmt, ##__VA_ARGS__) 485 1.1 riastrad 486 1.1 riastrad 487 1.1 riastrad /* 488 1.1 riastrad * printk based logging 489 1.1 riastrad * 490 1.1 riastrad * Prefer drm_device based logging over device or prink based logging. 491 1.1 riastrad */ 492 1.1 riastrad 493 1.1 riastrad __printf(2, 3) 494 1.1 riastrad void __drm_dbg(enum drm_debug_category category, const char *format, ...); 495 1.1 riastrad __printf(1, 2) 496 1.1 riastrad void __drm_err(const char *format, ...); 497 1.1 riastrad 498 1.1 riastrad /* Macros to make printk easier */ 499 1.1 riastrad 500 1.1 riastrad #define _DRM_PRINTK(once, level, fmt, ...) \ 501 1.1 riastrad printk##once(KERN_##level "[" DRM_NAME "] " fmt, ##__VA_ARGS__) 502 1.1 riastrad 503 1.1 riastrad #define DRM_INFO(fmt, ...) \ 504 1.1 riastrad _DRM_PRINTK(, INFO, fmt, ##__VA_ARGS__) 505 1.1 riastrad #define DRM_NOTE(fmt, ...) \ 506 1.1 riastrad _DRM_PRINTK(, NOTICE, fmt, ##__VA_ARGS__) 507 1.1 riastrad #define DRM_WARN(fmt, ...) \ 508 1.1 riastrad _DRM_PRINTK(, WARNING, fmt, ##__VA_ARGS__) 509 1.1 riastrad 510 1.1 riastrad #define DRM_INFO_ONCE(fmt, ...) \ 511 1.1 riastrad _DRM_PRINTK(_once, INFO, fmt, ##__VA_ARGS__) 512 1.1 riastrad #define DRM_NOTE_ONCE(fmt, ...) \ 513 1.1 riastrad _DRM_PRINTK(_once, NOTICE, fmt, ##__VA_ARGS__) 514 1.1 riastrad #define DRM_WARN_ONCE(fmt, ...) \ 515 1.1 riastrad _DRM_PRINTK(_once, WARNING, fmt, ##__VA_ARGS__) 516 1.1 riastrad 517 1.1 riastrad #define DRM_ERROR(fmt, ...) \ 518 1.1 riastrad __drm_err(fmt, ##__VA_ARGS__) 519 1.1 riastrad 520 1.1 riastrad #define DRM_ERROR_RATELIMITED(fmt, ...) \ 521 1.1 riastrad DRM_DEV_ERROR_RATELIMITED(NULL, fmt, ##__VA_ARGS__) 522 1.1 riastrad 523 1.1 riastrad #define DRM_DEBUG(fmt, ...) \ 524 1.1 riastrad __drm_dbg(DRM_UT_CORE, fmt, ##__VA_ARGS__) 525 1.1 riastrad 526 1.1 riastrad #define DRM_DEBUG_DRIVER(fmt, ...) \ 527 1.1 riastrad __drm_dbg(DRM_UT_DRIVER, fmt, ##__VA_ARGS__) 528 1.1 riastrad 529 1.1 riastrad #define DRM_DEBUG_KMS(fmt, ...) \ 530 1.1 riastrad __drm_dbg(DRM_UT_KMS, fmt, ##__VA_ARGS__) 531 1.1 riastrad 532 1.1 riastrad #define DRM_DEBUG_PRIME(fmt, ...) \ 533 1.1 riastrad __drm_dbg(DRM_UT_PRIME, fmt, ##__VA_ARGS__) 534 1.1 riastrad 535 1.1 riastrad #define DRM_DEBUG_ATOMIC(fmt, ...) \ 536 1.1 riastrad __drm_dbg(DRM_UT_ATOMIC, fmt, ##__VA_ARGS__) 537 1.1 riastrad 538 1.1 riastrad #define DRM_DEBUG_VBL(fmt, ...) \ 539 1.1 riastrad __drm_dbg(DRM_UT_VBL, fmt, ##__VA_ARGS__) 540 1.1 riastrad 541 1.1 riastrad #define DRM_DEBUG_LEASE(fmt, ...) \ 542 1.1 riastrad __drm_dbg(DRM_UT_LEASE, fmt, ##__VA_ARGS__) 543 1.1 riastrad 544 1.1 riastrad #define DRM_DEBUG_DP(fmt, ...) \ 545 1.1 riastrad __drm_dbg(DRM_UT_DP, fmt, ## __VA_ARGS__) 546 1.1 riastrad 547 1.1 riastrad 548 1.1 riastrad #define DRM_DEBUG_RATELIMITED(fmt, ...) \ 549 1.1 riastrad DRM_DEV_DEBUG_RATELIMITED(NULL, fmt, ##__VA_ARGS__) 550 1.1 riastrad 551 1.1 riastrad #define DRM_DEBUG_DRIVER_RATELIMITED(fmt, ...) \ 552 1.1 riastrad DRM_DEV_DEBUG_DRIVER_RATELIMITED(NULL, fmt, ##__VA_ARGS__) 553 1.1 riastrad 554 1.1 riastrad #define DRM_DEBUG_KMS_RATELIMITED(fmt, ...) \ 555 1.1 riastrad DRM_DEV_DEBUG_KMS_RATELIMITED(NULL, fmt, ##__VA_ARGS__) 556 1.1 riastrad 557 1.1 riastrad #define DRM_DEBUG_PRIME_RATELIMITED(fmt, ...) \ 558 1.1 riastrad DRM_DEV_DEBUG_PRIME_RATELIMITED(NULL, fmt, ##__VA_ARGS__) 559 1.1 riastrad 560 1.1 riastrad #endif /* DRM_PRINT_H_ */ 561