xref: /freebsd/sys/dev/bhnd/bhnd_debug.h (revision fb403678c2d93baa95731c739128a29afb757779)
1*fb403678SAdrian Chadd /*-
2*fb403678SAdrian Chadd  * Copyright (c) 2016 Michael Zhilin <mizhka@gmail.com>
3*fb403678SAdrian Chadd  * All rights reserved.
4*fb403678SAdrian Chadd  *
5*fb403678SAdrian Chadd  * Redistribution and use in source and binary forms, with or without
6*fb403678SAdrian Chadd  * modification, are permitted provided that the following conditions
7*fb403678SAdrian Chadd  * are met:
8*fb403678SAdrian Chadd  * 1. Redistributions of source code must retain the above copyright
9*fb403678SAdrian Chadd  *    notice, this list of conditions and the following disclaimer,
10*fb403678SAdrian Chadd  *    without modification.
11*fb403678SAdrian Chadd  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
12*fb403678SAdrian Chadd  *    similar to the "NO WARRANTY" disclaimer below ("Disclaimer") and any
13*fb403678SAdrian Chadd  *    redistribution must be conditioned upon including a substantially
14*fb403678SAdrian Chadd  *    similar Disclaimer requirement for further binary redistribution.
15*fb403678SAdrian Chadd  *
16*fb403678SAdrian Chadd  * NO WARRANTY
17*fb403678SAdrian Chadd  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18*fb403678SAdrian Chadd  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19*fb403678SAdrian Chadd  * LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT, MERCHANTIBILITY
20*fb403678SAdrian Chadd  * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
21*fb403678SAdrian Chadd  * THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY,
22*fb403678SAdrian Chadd  * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23*fb403678SAdrian Chadd  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24*fb403678SAdrian Chadd  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
25*fb403678SAdrian Chadd  * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26*fb403678SAdrian Chadd  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
27*fb403678SAdrian Chadd  * THE POSSIBILITY OF SUCH DAMAGES.
28*fb403678SAdrian Chadd  */
29*fb403678SAdrian Chadd 
30*fb403678SAdrian Chadd /* $FreeBSD$ */
31*fb403678SAdrian Chadd 
32*fb403678SAdrian Chadd /*
33*fb403678SAdrian Chadd  * This file provides set of macros for logging:
34*fb403678SAdrian Chadd  *  - BHND_<LEVEL> and
35*fb403678SAdrian Chadd  *  - BHND_<LEVEL>_DEV
36*fb403678SAdrian Chadd  * where LEVEL = {ERROR,WARN,INFO,DEBUG}
37*fb403678SAdrian Chadd  *
38*fb403678SAdrian Chadd  * BHND_<LEVEL> macros is proxies to printf call and accept same parameters,
39*fb403678SAdrian Chadd  * for instance:
40*fb403678SAdrian Chadd  * 	BHND_INFO("register %d has value %d", reg, val);
41*fb403678SAdrian Chadd  *
42*fb403678SAdrian Chadd  * BHND_<LEVEL>_DEV macros is proxies to device_printf call and accept
43*fb403678SAdrian Chadd  * same parameters, for instance:
44*fb403678SAdrian Chadd  * 	BHND_INFO_DEV(dev, "register %d has value %d", reg, val);
45*fb403678SAdrian Chadd  *
46*fb403678SAdrian Chadd  * All macros contains newline char at the end of each call
47*fb403678SAdrian Chadd  *
48*fb403678SAdrian Chadd  * ERROR, WARN, INFO messages are printed only if:
49*fb403678SAdrian Chadd  * 	- log message level is lower than BHND_LOGGING (logging threshold)
50*fb403678SAdrian Chadd  *
51*fb403678SAdrian Chadd  * DEBUG, TRACE messages are printed only if:
52*fb403678SAdrian Chadd  * 	- bootverbose and
53*fb403678SAdrian Chadd  * 	- log message level is lower than BHND_LOGGING (logging threshold)
54*fb403678SAdrian Chadd  *
55*fb403678SAdrian Chadd  * In addition, for debugging purpose log message contains information about
56*fb403678SAdrian Chadd  * file name and line number if BHND_LOGGING is more than BHND_INFO_LEVEL
57*fb403678SAdrian Chadd  *
58*fb403678SAdrian Chadd  * NOTE: macros starting with underscore (_) are private and should be not used
59*fb403678SAdrian Chadd  *
60*fb403678SAdrian Chadd  * To override logging (for instance, force tracing), you can use:
61*fb403678SAdrian Chadd  *  - "options BHND_LOGLEVEL=BHND_TRACE_LEVEL" in kernel configuration
62*fb403678SAdrian Chadd  *  - "#define	BHND_LOGGING	BHND_TRACE_LEVEL" in source code file
63*fb403678SAdrian Chadd  *
64*fb403678SAdrian Chadd  * NOTE: kernel config option doesn't override log level defined on file level,
65*fb403678SAdrian Chadd  * so try to avoid "#define	BHND_LOGGING"
66*fb403678SAdrian Chadd  */
67*fb403678SAdrian Chadd 
68*fb403678SAdrian Chadd #ifndef _BHND_BHND_DEBUG_H_
69*fb403678SAdrian Chadd #define _BHND_BHND_DEBUG_H_
70*fb403678SAdrian Chadd 
71*fb403678SAdrian Chadd #include <sys/systm.h>
72*fb403678SAdrian Chadd 
73*fb403678SAdrian Chadd #include "opt_global.h"
74*fb403678SAdrian Chadd 
75*fb403678SAdrian Chadd #define	BHND_ERROR_LEVEL	0x00
76*fb403678SAdrian Chadd #define	BHND_ERROR_MSG		"ERROR"
77*fb403678SAdrian Chadd #define	BHND_WARN_LEVEL		0x10
78*fb403678SAdrian Chadd #define	BHND_WARN_MSG		"!WARN"
79*fb403678SAdrian Chadd #define	BHND_INFO_LEVEL		0x20
80*fb403678SAdrian Chadd #define	BHND_INFO_MSG		" info"
81*fb403678SAdrian Chadd #define	BHND_DEBUG_LEVEL	0x30
82*fb403678SAdrian Chadd #define	BHND_DEBUG_MSG		"debug"
83*fb403678SAdrian Chadd #define	BHND_TRACE_LEVEL	0x40
84*fb403678SAdrian Chadd #define	BHND_TRACE_MSG		"trace"
85*fb403678SAdrian Chadd 
86*fb403678SAdrian Chadd #if !(defined(BHND_LOGGING))
87*fb403678SAdrian Chadd #if !(defined(BHND_LOGLEVEL))
88*fb403678SAdrian Chadd /* By default logging will print only INFO+ message*/
89*fb403678SAdrian Chadd #define	BHND_LOGGING		BHND_INFO_LEVEL
90*fb403678SAdrian Chadd #else /* defined(BHND_LOGLEVEL) */
91*fb403678SAdrian Chadd /* Kernel configuration specifies logging level */
92*fb403678SAdrian Chadd #define	BHND_LOGGING		BHND_LOGLEVEL
93*fb403678SAdrian Chadd #endif /* !(defined(BHND_LOGLEVEL)) */
94*fb403678SAdrian Chadd #endif /* !(defined(BHND_LOGGING)) */
95*fb403678SAdrian Chadd 
96*fb403678SAdrian Chadd #if BHND_LOGGING > BHND_INFO_LEVEL
97*fb403678SAdrian Chadd #define	_BHND_PRINT(fn, level, fmt, ...)				\
98*fb403678SAdrian Chadd 	do {								\
99*fb403678SAdrian Chadd 		if (level##LEVEL < BHND_DEBUG_LEVEL || bootverbose)	\
100*fb403678SAdrian Chadd 		    fn "[BHND " level##MSG "] %s:%d => " fmt "\n",	\
101*fb403678SAdrian Chadd 			__func__, __LINE__, ## __VA_ARGS__);		\
102*fb403678SAdrian Chadd 	} while(0);
103*fb403678SAdrian Chadd #else /* BHND_LOGGING <= BHND_INFO_LEVEL */
104*fb403678SAdrian Chadd #define	_BHND_PRINT(fn, level, fmt, ...)				\
105*fb403678SAdrian Chadd 	do {								\
106*fb403678SAdrian Chadd 		if (level##LEVEL < BHND_DEBUG_LEVEL || bootverbose)	\
107*fb403678SAdrian Chadd 		    fn "bhnd: " fmt "\n", ## __VA_ARGS__);		\
108*fb403678SAdrian Chadd 	} while(0);
109*fb403678SAdrian Chadd #endif /* BHND_LOGGING > BHND_INFO_LEVEL */
110*fb403678SAdrian Chadd 
111*fb403678SAdrian Chadd 
112*fb403678SAdrian Chadd #define	_BHND_RAWPRINTFN	printf(
113*fb403678SAdrian Chadd #define	_BHND_DEVPRINTFN(dev)	device_printf(dev,
114*fb403678SAdrian Chadd 
115*fb403678SAdrian Chadd #define	_BHND_LOGPRINT(level, fmt, ...) 				\
116*fb403678SAdrian Chadd 	_BHND_PRINT(_BHND_RAWPRINTFN, level, fmt, ## __VA_ARGS__)
117*fb403678SAdrian Chadd #define	_BHND_DEVPRINT(dev, level, fmt, ...)				\
118*fb403678SAdrian Chadd 	_BHND_PRINT(_BHND_DEVPRINTFN(dev), level, fmt, ## __VA_ARGS__)
119*fb403678SAdrian Chadd 
120*fb403678SAdrian Chadd #define	BHND_ERROR(fmt, ...)						\
121*fb403678SAdrian Chadd 	_BHND_LOGPRINT(BHND_ERROR_, fmt, ## __VA_ARGS__);
122*fb403678SAdrian Chadd #define	BHND_ERROR_DEV(dev, fmt, ...)					\
123*fb403678SAdrian Chadd 	_BHND_DEVPRINT(dev, BHND_ERROR_, fmt, ## __VA_ARGS__)
124*fb403678SAdrian Chadd 
125*fb403678SAdrian Chadd #if BHND_LOGGING >= BHND_WARN_LEVEL
126*fb403678SAdrian Chadd #define	BHND_WARN(fmt, ...)						\
127*fb403678SAdrian Chadd 	_BHND_LOGPRINT(BHND_WARN_, fmt, ## __VA_ARGS__)
128*fb403678SAdrian Chadd #define	BHND_WARN_DEV(dev, fmt, ...)					\
129*fb403678SAdrian Chadd 	_BHND_DEVPRINT(dev, BHND_WARN_, fmt, ## __VA_ARGS__)
130*fb403678SAdrian Chadd 
131*fb403678SAdrian Chadd #if BHND_LOGGING >= BHND_INFO_LEVEL
132*fb403678SAdrian Chadd #define	BHND_INFO(fmt, ...)						\
133*fb403678SAdrian Chadd 	_BHND_LOGPRINT(BHND_INFO_, fmt, ## __VA_ARGS__)
134*fb403678SAdrian Chadd #define	BHND_INFO_DEV(dev, fmt, ...)					\
135*fb403678SAdrian Chadd 	_BHND_DEVPRINT(dev, BHND_INFO_, fmt, ## __VA_ARGS__)
136*fb403678SAdrian Chadd 
137*fb403678SAdrian Chadd #if BHND_LOGGING >= BHND_DEBUG_LEVEL
138*fb403678SAdrian Chadd #define	BHND_DEBUG(fmt, ...)						\
139*fb403678SAdrian Chadd 	_BHND_LOGPRINT(BHND_DEBUG_, fmt, ## __VA_ARGS__)
140*fb403678SAdrian Chadd #define	BHND_DEBUG_DEV(dev, fmt, ...)					\
141*fb403678SAdrian Chadd 	_BHND_DEVPRINT(dev, BHND_DEBUG_, fmt, ## __VA_ARGS__)
142*fb403678SAdrian Chadd 
143*fb403678SAdrian Chadd #if BHND_LOGGING >= BHND_TRACE_LEVEL
144*fb403678SAdrian Chadd #define	BHND_TRACE(fmt, ...)						\
145*fb403678SAdrian Chadd 	_BHND_LOGPRINT(BHND_TRACE_, fmt, ## __VA_ARGS__)
146*fb403678SAdrian Chadd #define	BHND_TRACE_DEV(dev, fmt, ...)					\
147*fb403678SAdrian Chadd 	_BHND_DEVPRINT(dev, BHND_TRACE_, fmt, ## __VA_ARGS__)
148*fb403678SAdrian Chadd 
149*fb403678SAdrian Chadd #endif /* BHND_LOGGING >= BHND_TRACE_LEVEL */
150*fb403678SAdrian Chadd #endif /* BHND_LOGGING >= BHND_DEBUG_LEVEL */
151*fb403678SAdrian Chadd #endif /* BHND_LOGGING >= BHND_INFO_LEVEL */
152*fb403678SAdrian Chadd #endif /* BHND_LOGGING >= BHND_WARN_LEVEL */
153*fb403678SAdrian Chadd 
154*fb403678SAdrian Chadd /*
155*fb403678SAdrian Chadd  * Empty defines without device context
156*fb403678SAdrian Chadd  */
157*fb403678SAdrian Chadd #if !(defined(BHND_WARN))
158*fb403678SAdrian Chadd #define	BHND_WARN(fmt, ...);
159*fb403678SAdrian Chadd #endif
160*fb403678SAdrian Chadd 
161*fb403678SAdrian Chadd #if !(defined(BHND_INFO))
162*fb403678SAdrian Chadd #define	BHND_INFO(fmt, ...);
163*fb403678SAdrian Chadd #endif
164*fb403678SAdrian Chadd 
165*fb403678SAdrian Chadd #if !(defined(BHND_DEBUG))
166*fb403678SAdrian Chadd #define	BHND_DEBUG(fmt, ...);
167*fb403678SAdrian Chadd #endif
168*fb403678SAdrian Chadd 
169*fb403678SAdrian Chadd #if !(defined(BHND_TRACE))
170*fb403678SAdrian Chadd #define	BHND_TRACE(fmt, ...);
171*fb403678SAdrian Chadd #endif
172*fb403678SAdrian Chadd 
173*fb403678SAdrian Chadd /*
174*fb403678SAdrian Chadd  * Empty defines with device context
175*fb403678SAdrian Chadd  */
176*fb403678SAdrian Chadd #if !(defined(BHND_WARN_DEV))
177*fb403678SAdrian Chadd #define	BHND_WARN_DEV(dev, fmt, ...);
178*fb403678SAdrian Chadd #endif
179*fb403678SAdrian Chadd 
180*fb403678SAdrian Chadd #if !(defined(BHND_INFO_DEV))
181*fb403678SAdrian Chadd #define	BHND_INFO_DEV(dev, fmt, ...);
182*fb403678SAdrian Chadd #endif
183*fb403678SAdrian Chadd 
184*fb403678SAdrian Chadd #if !(defined(BHND_DEBUG_DEV))
185*fb403678SAdrian Chadd #define	BHND_DEBUG_DEV(dev, fmt, ...);
186*fb403678SAdrian Chadd #endif
187*fb403678SAdrian Chadd 
188*fb403678SAdrian Chadd #if !(defined(BHND_TRACE_DEV))
189*fb403678SAdrian Chadd #define	BHND_TRACE_DEV(dev, fmt, ...);
190*fb403678SAdrian Chadd #endif
191*fb403678SAdrian Chadd 
192*fb403678SAdrian Chadd #endif /* _BHND_BHND_DEBUG_H_ */
193