xref: /freebsd/sys/dev/bhnd/bhnd_debug.h (revision 4d846d260e2b9a3d4d0a701462568268cbfe7a5b)
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 /* $FreeBSD$ */
33fb403678SAdrian Chadd 
34fb403678SAdrian Chadd /*
35fb403678SAdrian Chadd  * This file provides set of macros for logging:
36fb403678SAdrian Chadd  *  - BHND_<LEVEL> and
37fb403678SAdrian Chadd  *  - BHND_<LEVEL>_DEV
38fb403678SAdrian Chadd  * where LEVEL = {ERROR,WARN,INFO,DEBUG}
39fb403678SAdrian Chadd  *
40fb403678SAdrian Chadd  * BHND_<LEVEL> macros is proxies to printf call and accept same parameters,
41fb403678SAdrian Chadd  * for instance:
42fb403678SAdrian Chadd  * 	BHND_INFO("register %d has value %d", reg, val);
43fb403678SAdrian Chadd  *
44fb403678SAdrian Chadd  * BHND_<LEVEL>_DEV macros is proxies to device_printf call and accept
45fb403678SAdrian Chadd  * same parameters, for instance:
46fb403678SAdrian Chadd  * 	BHND_INFO_DEV(dev, "register %d has value %d", reg, val);
47fb403678SAdrian Chadd  *
48fb403678SAdrian Chadd  * All macros contains newline char at the end of each call
49fb403678SAdrian Chadd  *
50fb403678SAdrian Chadd  * ERROR, WARN, INFO messages are printed only if:
51fb403678SAdrian Chadd  * 	- log message level is lower than BHND_LOGGING (logging threshold)
52fb403678SAdrian Chadd  *
53fb403678SAdrian Chadd  * DEBUG, TRACE messages are printed only if:
54fb403678SAdrian Chadd  * 	- bootverbose and
55fb403678SAdrian Chadd  * 	- log message level is lower than BHND_LOGGING (logging threshold)
56fb403678SAdrian Chadd  *
57fb403678SAdrian Chadd  * In addition, for debugging purpose log message contains information about
58fb403678SAdrian Chadd  * file name and line number if BHND_LOGGING is more than BHND_INFO_LEVEL
59fb403678SAdrian Chadd  *
60fb403678SAdrian Chadd  * NOTE: macros starting with underscore (_) are private and should be not used
61fb403678SAdrian Chadd  *
62fb403678SAdrian Chadd  * To override logging (for instance, force tracing), you can use:
63fb403678SAdrian Chadd  *  - "options BHND_LOGLEVEL=BHND_TRACE_LEVEL" in kernel configuration
64fb403678SAdrian Chadd  *  - "#define	BHND_LOGGING	BHND_TRACE_LEVEL" in source code file
65fb403678SAdrian Chadd  *
66fb403678SAdrian Chadd  * NOTE: kernel config option doesn't override log level defined on file level,
67fb403678SAdrian Chadd  * so try to avoid "#define	BHND_LOGGING"
68fb403678SAdrian Chadd  */
69fb403678SAdrian Chadd 
70fb403678SAdrian Chadd #ifndef _BHND_BHND_DEBUG_H_
71fb403678SAdrian Chadd #define _BHND_BHND_DEBUG_H_
72fb403678SAdrian Chadd 
73fb403678SAdrian Chadd #include <sys/systm.h>
74fb403678SAdrian Chadd 
75fb403678SAdrian Chadd #define	BHND_ERROR_LEVEL	0x00
76fb403678SAdrian Chadd #define	BHND_ERROR_MSG		"ERROR"
77fb403678SAdrian Chadd #define	BHND_WARN_LEVEL		0x10
78fb403678SAdrian Chadd #define	BHND_WARN_MSG		"!WARN"
79fb403678SAdrian Chadd #define	BHND_INFO_LEVEL		0x20
80fb403678SAdrian Chadd #define	BHND_INFO_MSG		" info"
81fb403678SAdrian Chadd #define	BHND_DEBUG_LEVEL	0x30
82fb403678SAdrian Chadd #define	BHND_DEBUG_MSG		"debug"
83fb403678SAdrian Chadd #define	BHND_TRACE_LEVEL	0x40
84fb403678SAdrian Chadd #define	BHND_TRACE_MSG		"trace"
85fb403678SAdrian Chadd 
86fb403678SAdrian Chadd #if !(defined(BHND_LOGGING))
87fb403678SAdrian Chadd #if !(defined(BHND_LOGLEVEL))
88fb403678SAdrian Chadd /* By default logging will print only INFO+ message*/
89fb403678SAdrian Chadd #define	BHND_LOGGING		BHND_INFO_LEVEL
90fb403678SAdrian Chadd #else /* defined(BHND_LOGLEVEL) */
91fb403678SAdrian Chadd /* Kernel configuration specifies logging level */
92fb403678SAdrian Chadd #define	BHND_LOGGING		BHND_LOGLEVEL
93fb403678SAdrian Chadd #endif /* !(defined(BHND_LOGLEVEL)) */
94fb403678SAdrian Chadd #endif /* !(defined(BHND_LOGGING)) */
95fb403678SAdrian Chadd 
96fb403678SAdrian Chadd #if BHND_LOGGING > BHND_INFO_LEVEL
97fb403678SAdrian Chadd #define	_BHND_PRINT(fn, level, fmt, ...)				\
98fb403678SAdrian Chadd 	do {								\
99fb403678SAdrian Chadd 		if (level##LEVEL < BHND_DEBUG_LEVEL || bootverbose)	\
100fb403678SAdrian Chadd 		    fn "[BHND " level##MSG "] %s:%d => " fmt "\n",	\
101fb403678SAdrian Chadd 			__func__, __LINE__, ## __VA_ARGS__);		\
102fb403678SAdrian Chadd 	} while(0);
103fb403678SAdrian Chadd #else /* BHND_LOGGING <= BHND_INFO_LEVEL */
104fb403678SAdrian Chadd #define	_BHND_PRINT(fn, level, fmt, ...)				\
105fb403678SAdrian Chadd 	do {								\
106fb403678SAdrian Chadd 		if (level##LEVEL < BHND_DEBUG_LEVEL || bootverbose)	\
107fb403678SAdrian Chadd 		    fn "bhnd: " fmt "\n", ## __VA_ARGS__);		\
108fb403678SAdrian Chadd 	} while(0);
109fb403678SAdrian Chadd #endif /* BHND_LOGGING > BHND_INFO_LEVEL */
110fb403678SAdrian Chadd 
111fb403678SAdrian Chadd #define	_BHND_RAWPRINTFN	printf(
112fb403678SAdrian Chadd #define	_BHND_DEVPRINTFN(dev)	device_printf(dev,
113fb403678SAdrian Chadd 
114fb403678SAdrian Chadd #define	_BHND_LOGPRINT(level, fmt, ...) 				\
115fb403678SAdrian Chadd 	_BHND_PRINT(_BHND_RAWPRINTFN, level, fmt, ## __VA_ARGS__)
116fb403678SAdrian Chadd #define	_BHND_DEVPRINT(dev, level, fmt, ...)				\
117fb403678SAdrian Chadd 	_BHND_PRINT(_BHND_DEVPRINTFN(dev), level, fmt, ## __VA_ARGS__)
118fb403678SAdrian Chadd 
119fb403678SAdrian Chadd #define	BHND_ERROR(fmt, ...)						\
120fb403678SAdrian Chadd 	_BHND_LOGPRINT(BHND_ERROR_, fmt, ## __VA_ARGS__);
121fb403678SAdrian Chadd #define	BHND_ERROR_DEV(dev, fmt, ...)					\
122fb403678SAdrian Chadd 	_BHND_DEVPRINT(dev, BHND_ERROR_, fmt, ## __VA_ARGS__)
123fb403678SAdrian Chadd 
124fb403678SAdrian Chadd #if BHND_LOGGING >= BHND_WARN_LEVEL
125fb403678SAdrian Chadd #define	BHND_WARN(fmt, ...)						\
126fb403678SAdrian Chadd 	_BHND_LOGPRINT(BHND_WARN_, fmt, ## __VA_ARGS__)
127fb403678SAdrian Chadd #define	BHND_WARN_DEV(dev, fmt, ...)					\
128fb403678SAdrian Chadd 	_BHND_DEVPRINT(dev, BHND_WARN_, fmt, ## __VA_ARGS__)
129fb403678SAdrian Chadd 
130fb403678SAdrian Chadd #if BHND_LOGGING >= BHND_INFO_LEVEL
131fb403678SAdrian Chadd #define	BHND_INFO(fmt, ...)						\
132fb403678SAdrian Chadd 	_BHND_LOGPRINT(BHND_INFO_, fmt, ## __VA_ARGS__)
133fb403678SAdrian Chadd #define	BHND_INFO_DEV(dev, fmt, ...)					\
134fb403678SAdrian Chadd 	_BHND_DEVPRINT(dev, BHND_INFO_, fmt, ## __VA_ARGS__)
135fb403678SAdrian Chadd 
136fb403678SAdrian Chadd #if BHND_LOGGING >= BHND_DEBUG_LEVEL
137fb403678SAdrian Chadd #define	BHND_DEBUG(fmt, ...)						\
138fb403678SAdrian Chadd 	_BHND_LOGPRINT(BHND_DEBUG_, fmt, ## __VA_ARGS__)
139fb403678SAdrian Chadd #define	BHND_DEBUG_DEV(dev, fmt, ...)					\
140fb403678SAdrian Chadd 	_BHND_DEVPRINT(dev, BHND_DEBUG_, fmt, ## __VA_ARGS__)
141fb403678SAdrian Chadd 
142fb403678SAdrian Chadd #if BHND_LOGGING >= BHND_TRACE_LEVEL
143fb403678SAdrian Chadd #define	BHND_TRACE(fmt, ...)						\
144fb403678SAdrian Chadd 	_BHND_LOGPRINT(BHND_TRACE_, fmt, ## __VA_ARGS__)
145fb403678SAdrian Chadd #define	BHND_TRACE_DEV(dev, fmt, ...)					\
146fb403678SAdrian Chadd 	_BHND_DEVPRINT(dev, BHND_TRACE_, fmt, ## __VA_ARGS__)
147fb403678SAdrian Chadd 
148fb403678SAdrian Chadd #endif /* BHND_LOGGING >= BHND_TRACE_LEVEL */
149fb403678SAdrian Chadd #endif /* BHND_LOGGING >= BHND_DEBUG_LEVEL */
150fb403678SAdrian Chadd #endif /* BHND_LOGGING >= BHND_INFO_LEVEL */
151fb403678SAdrian Chadd #endif /* BHND_LOGGING >= BHND_WARN_LEVEL */
152fb403678SAdrian Chadd 
153fb403678SAdrian Chadd /*
154fb403678SAdrian Chadd  * Empty defines without device context
155fb403678SAdrian Chadd  */
156fb403678SAdrian Chadd #if !(defined(BHND_WARN))
157fb403678SAdrian Chadd #define	BHND_WARN(fmt, ...);
158fb403678SAdrian Chadd #endif
159fb403678SAdrian Chadd 
160fb403678SAdrian Chadd #if !(defined(BHND_INFO))
161fb403678SAdrian Chadd #define	BHND_INFO(fmt, ...);
162fb403678SAdrian Chadd #endif
163fb403678SAdrian Chadd 
164fb403678SAdrian Chadd #if !(defined(BHND_DEBUG))
165fb403678SAdrian Chadd #define	BHND_DEBUG(fmt, ...);
166fb403678SAdrian Chadd #endif
167fb403678SAdrian Chadd 
168fb403678SAdrian Chadd #if !(defined(BHND_TRACE))
169fb403678SAdrian Chadd #define	BHND_TRACE(fmt, ...);
170fb403678SAdrian Chadd #endif
171fb403678SAdrian Chadd 
172fb403678SAdrian Chadd /*
173fb403678SAdrian Chadd  * Empty defines with device context
174fb403678SAdrian Chadd  */
175fb403678SAdrian Chadd #if !(defined(BHND_WARN_DEV))
176fb403678SAdrian Chadd #define	BHND_WARN_DEV(dev, fmt, ...);
177fb403678SAdrian Chadd #endif
178fb403678SAdrian Chadd 
179fb403678SAdrian Chadd #if !(defined(BHND_INFO_DEV))
180fb403678SAdrian Chadd #define	BHND_INFO_DEV(dev, fmt, ...);
181fb403678SAdrian Chadd #endif
182fb403678SAdrian Chadd 
183fb403678SAdrian Chadd #if !(defined(BHND_DEBUG_DEV))
184fb403678SAdrian Chadd #define	BHND_DEBUG_DEV(dev, fmt, ...);
185fb403678SAdrian Chadd #endif
186fb403678SAdrian Chadd 
187fb403678SAdrian Chadd #if !(defined(BHND_TRACE_DEV))
188fb403678SAdrian Chadd #define	BHND_TRACE_DEV(dev, fmt, ...);
189fb403678SAdrian Chadd #endif
190fb403678SAdrian Chadd 
191fb403678SAdrian Chadd #endif /* _BHND_BHND_DEBUG_H_ */
192