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