xref: /dragonfly/sys/dev/drm/include/drm/drm_print.h (revision 9317c2d0)
1 /*
2  * Copyright (C) 2016 Red Hat
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining a
5  * copy of this software and associated documentation files (the "Software"),
6  * to deal in the Software without restriction, including without limitation
7  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8  * and/or sell copies of the Software, and to permit persons to whom the
9  * Software is furnished to do so, subject to the following conditions:
10  *
11  * The above copyright notice and this permission notice shall be included in
12  * all copies or substantial portions of the Software.
13  *
14  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
17  * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
18  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20  * OTHER DEALINGS IN THE SOFTWARE.
21  *
22  * Authors:
23  * Rob Clark <robdclark@gmail.com>
24  */
25 
26 #ifndef DRM_PRINT_H_
27 #define DRM_PRINT_H_
28 
29 #include <linux/seq_file.h>
30 #include <linux/device.h>
31 
32 /**
33  * DOC: print
34  *
35  * A simple wrapper for dev_printk(), seq_printf(), etc.  Allows same
36  * debug code to be used for both debugfs and printk logging.
37  *
38  * For example::
39  *
40  *     void log_some_info(struct drm_printer *p)
41  *     {
42  *             drm_printf(p, "foo=%d\n", foo);
43  *             drm_printf(p, "bar=%d\n", bar);
44  *     }
45  *
46  *     #ifdef CONFIG_DEBUG_FS
47  *     void debugfs_show(struct seq_file *f)
48  *     {
49  *             struct drm_printer p = drm_seq_file_printer(f);
50  *             log_some_info(&p);
51  *     }
52  *     #endif
53  *
54  *     void some_other_function(...)
55  *     {
56  *             struct drm_printer p = drm_info_printer(drm->dev);
57  *             log_some_info(&p);
58  *     }
59  */
60 
61 /**
62  * struct drm_printer - drm output "stream"
63  * @printfn: actual output fxn
64  * @arg: output fxn specific data
65  *
66  * Do not use struct members directly.  Use drm_printer_seq_file(),
67  * drm_printer_info(), etc to initialize.  And drm_printf() for output.
68  */
69 struct drm_printer {
70 	void (*printfn)(struct drm_printer *p, struct va_format *vaf);
71 	void *arg;
72 };
73 
74 void __drm_printfn_seq_file(struct drm_printer *p, struct va_format *vaf);
75 void __drm_printfn_info(struct drm_printer *p, struct va_format *vaf);
76 
77 void drm_printf(struct drm_printer *p, const char *f, ...);
78 
79 
80 /**
81  * drm_seq_file_printer - construct a &drm_printer that outputs to &seq_file
82  * @f:  the struct &seq_file to output to
83  *
84  * RETURNS:
85  * The &drm_printer object
86  */
87 static inline struct drm_printer drm_seq_file_printer(struct seq_file *f)
88 {
89 	struct drm_printer p = {
90 		.printfn = __drm_printfn_seq_file,
91 		.arg = f,
92 	};
93 	return p;
94 }
95 
96 /**
97  * drm_info_printer - construct a &drm_printer that outputs to dev_printk()
98  * @dev: the struct &device pointer
99  *
100  * RETURNS:
101  * The &drm_printer object
102  */
103 static inline struct drm_printer drm_info_printer(struct device *dev)
104 {
105 	struct drm_printer p = {
106 		.printfn = __drm_printfn_info,
107 		.arg = dev,
108 	};
109 	return p;
110 }
111 
112 #endif /* DRM_PRINT_H_ */
113