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