Home | History | Annotate | Line # | Download | only in drm
      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