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