1 /*-
2 * Copyright (c) 2002-2007 Neterion, Inc.
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 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 *
14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24 * SUCH DAMAGE.
25 *
26 * $FreeBSD: stable/10/sys/dev/nxge/include/xge-debug.h 173139 2007-10-29 14:19:32Z rwatson $
27 */
28
29 #ifndef XGE_DEBUG_H
30 #define XGE_DEBUG_H
31
32 #include <dev/nxge/include/xge-os-pal.h>
33
34 __EXTERN_BEGIN_DECLS
35
36 /*
37 * __FUNCTION__ is, together with __PRETTY_FUNCTION__ or something similar,
38 * a gcc extension. we'll have to #ifdef around that, and provide some
39 * meaningful replacement for those, so to make some gcc versions happier
40 */
41 #ifndef __func__
42 #ifdef __FUNCTION__
43 #define __func__ __FUNCTION__
44 #endif
45 #endif
46
47
48 #ifdef XGE_DEBUG_FP
49 #define XGE_DEBUG_FP_DEVICE 0x1
50 #define XGE_DEBUG_FP_CHANNEL 0x2
51 #define XGE_DEBUG_FP_FIFO 0x4
52 #define XGE_DEBUG_FP_RING 0x8
53 #define XGE_DEBUG_FP_ALL 0xff
54 #endif
55
56 /**
57 * enum xge_debug_level_e
58 * @XGE_NONE: debug disabled
59 * @XGE_ERR: all errors going to be logged out
60 * @XGE_TRACE: all errors plus all kind of verbose tracing print outs
61 * going to be logged out. Very noisy.
62 *
63 * This enumeration going to be used to switch between different
64 * debug levels during runtime if DEBUG macro defined during
65 * compilation. If DEBUG macro not defined than code will be
66 * compiled out.
67 */
68 typedef enum xge_debug_level_e {
69 XGE_NONE = 0,
70 XGE_TRACE = 1,
71 XGE_ERR = 2,
72 } xge_debug_level_e;
73
74 #define XGE_DEBUG_MODULE_MASK_DEF 0x30000030
75 #define XGE_DEBUG_LEVEL_DEF XGE_ERR
76
77 #if defined(XGE_DEBUG_TRACE_MASK) || defined(XGE_DEBUG_ERR_MASK)
78
79 extern unsigned long *g_module_mask;
80 extern int *g_level;
81
82 #ifndef XGE_DEBUG_TRACE_MASK
83 #define XGE_DEBUG_TRACE_MASK 0
84 #endif
85
86 #ifndef XGE_DEBUG_ERR_MASK
87 #define XGE_DEBUG_ERR_MASK 0
88 #endif
89
90 /*
91 * @XGE_COMPONENT_HAL_CONFIG: do debug for xge core config module
92 * @XGE_COMPONENT_HAL_FIFO: do debug for xge core fifo module
93 * @XGE_COMPONENT_HAL_RING: do debug for xge core ring module
94 * @XGE_COMPONENT_HAL_CHANNEL: do debug for xge core channel module
95 * @XGE_COMPONENT_HAL_DEVICE: do debug for xge core device module
96 * @XGE_COMPONENT_HAL_DMQ: do debug for xge core DMQ module
97 * @XGE_COMPONENT_HAL_UMQ: do debug for xge core UMQ module
98 * @XGE_COMPONENT_HAL_SQ: do debug for xge core SQ module
99 * @XGE_COMPONENT_HAL_SRQ: do debug for xge core SRQ module
100 * @XGE_COMPONENT_HAL_CQRQ: do debug for xge core CRQ module
101 * @XGE_COMPONENT_HAL_POOL: do debug for xge core memory pool module
102 * @XGE_COMPONENT_HAL_BITMAP: do debug for xge core BITMAP module
103 * @XGE_COMPONENT_CORE: do debug for xge KMA core module
104 * @XGE_COMPONENT_OSDEP: do debug for xge KMA os dependent parts
105 * @XGE_COMPONENT_LL: do debug for xge link layer module
106 * @XGE_COMPONENT_ALL: activate debug for all modules with no exceptions
107 *
108 * This enumeration going to be used to distinguish modules
109 * or libraries during compilation and runtime. Makefile must declare
110 * XGE_DEBUG_MODULE_MASK macro and set it to proper value.
111 */
112 #define XGE_COMPONENT_HAL_CONFIG 0x00000001
113 #define XGE_COMPONENT_HAL_FIFO 0x00000002
114 #define XGE_COMPONENT_HAL_RING 0x00000004
115 #define XGE_COMPONENT_HAL_CHANNEL 0x00000008
116 #define XGE_COMPONENT_HAL_DEVICE 0x00000010
117 #define XGE_COMPONENT_HAL_MM 0x00000020
118 #define XGE_COMPONENT_HAL_QUEUE 0x00000040
119 #define XGE_COMPONENT_HAL_INTERRUPT 0x00000080
120 #define XGE_COMPONENT_HAL_STATS 0x00000100
121
122 /* space for CORE_XXX */
123 #define XGE_COMPONENT_OSDEP 0x10000000
124 #define XGE_COMPONENT_LL 0x20000000
125 #define XGE_COMPONENT_ALL 0xffffffff
126
127 #ifndef XGE_DEBUG_MODULE_MASK
128 #error "XGE_DEBUG_MODULE_MASK macro must be defined for DEBUG mode..."
129 #endif
130
131 #ifndef __GNUC__
132 #ifdef XGE_TRACE_INTO_CIRCULAR_ARR
133 #define xge_trace_aux(fmt) xge_os_vatrace(g_xge_os_tracebuf, fmt)
134 #else
135 #define xge_trace_aux(fmt) xge_os_vaprintf(fmt)
136 #endif
137
138 /**
139 * xge_debug
140 * @level: level of debug verbosity.
141 * @fmt: printf like format string
142 *
143 * Provides logging facilities. Can be customized on per-module
144 * basis or/and with debug levels. Input parameters, except
145 * module and level, are the same as posix printf. This function
146 * may be compiled out if DEBUG macro was never defined.
147 * See also: xge_debug_level_e{}.
148 */
149 #define xge_debug(module, level, fmt) { \
150 if (((level >= XGE_TRACE && ((module & XGE_DEBUG_TRACE_MASK) == module)) || \
151 (level >= XGE_ERR && ((module & XGE_DEBUG_ERR_MASK) == module))) && \
152 level >= *g_level && module & *(unsigned int *)g_module_mask) { \
153 xge_trace_aux(fmt); \
154 } \
155 }
156 #else /* __GNUC__ */
157
158 #ifdef XGE_TRACE_INTO_CIRCULAR_ARR
159 #define xge_trace_aux(fmt...) xge_os_trace(g_xge_os_tracebuf, fmt)
160 #else
161 #define xge_trace_aux(fmt...) xge_os_printf(fmt)
162 #endif
163
164 #define xge_debug(module, level, fmt...) { \
165 if (((level >= XGE_TRACE && ((module & XGE_DEBUG_TRACE_MASK) == module)) || \
166 (level >= XGE_ERR && ((module & XGE_DEBUG_ERR_MASK) == module))) && \
167 level >= *g_level && module & *(unsigned int *)g_module_mask) { \
168 xge_trace_aux(fmt); \
169 } \
170 }
171 #endif /* __GNUC__ */
172
173 #if (XGE_COMPONENT_HAL_STATS & XGE_DEBUG_MODULE_MASK)
174 #ifndef __GNUC__
xge_debug_stats(xge_debug_level_e level,char * fmt,...)175 static inline void xge_debug_stats(xge_debug_level_e level, char *fmt, ...) {
176 u32 module = XGE_COMPONENT_HAL_STATS;
177 xge_debug(module, level, fmt);
178 }
179 #else /* __GNUC__ */
180 #define xge_debug_stats(level, fmt...) \
181 xge_debug(XGE_COMPONENT_HAL_STATS, level, fmt)
182 #endif /* __GNUC__ */
183 #else
184 #ifndef __GNUC__
xge_debug_stats(xge_debug_level_e level,char * fmt,...)185 static inline void xge_debug_stats(xge_debug_level_e level, char *fmt, ...) {}
186 #else /* __GNUC__ */
187 #define xge_debug_stats(level, fmt...)
188 #endif /* __GNUC__ */
189 #endif
190
191 /* Interrupt Related */
192 #if (XGE_COMPONENT_HAL_INTERRUPT & XGE_DEBUG_MODULE_MASK)
193 #ifndef __GNUC__
xge_debug_interrupt(xge_debug_level_e level,char * fmt,...)194 static inline void xge_debug_interrupt(xge_debug_level_e level, char *fmt, ...) {
195 u32 module = XGE_COMPONENT_HAL_INTERRUPT;
196 xge_debug(module, level, fmt);
197 }
198 #else /* __GNUC__ */
199 #define xge_debug_interrupt(level, fmt...) \
200 xge_debug(XGE_COMPONENT_HAL_INTERRUPT, level, fmt)
201 #endif /* __GNUC__ */
202 #else
203 #ifndef __GNUC__
xge_debug_interrupt(xge_debug_level_e level,char * fmt,...)204 static inline void xge_debug_interrupt(xge_debug_level_e level, char *fmt, ...) {}
205 #else /* __GNUC__ */
206 #define xge_debug_interrupt(level, fmt...)
207 #endif /* __GNUC__ */
208 #endif
209
210 #if (XGE_COMPONENT_HAL_QUEUE & XGE_DEBUG_MODULE_MASK)
211 #ifndef __GNUC__
xge_debug_queue(xge_debug_level_e level,char * fmt,...)212 static inline void xge_debug_queue(xge_debug_level_e level, char *fmt, ...) {
213 u32 module = XGE_COMPONENT_HAL_QUEUE;
214 xge_debug(module, level, fmt);
215 }
216 #else /* __GNUC__ */
217 #define xge_debug_queue(level, fmt...) \
218 xge_debug(XGE_COMPONENT_HAL_QUEUE, level, fmt)
219 #endif /* __GNUC__ */
220 #else
221 #ifndef __GNUC__
xge_debug_queue(xge_debug_level_e level,char * fmt,...)222 static inline void xge_debug_queue(xge_debug_level_e level, char *fmt,
223 ...) {}
224 #else /* __GNUC__ */
225 #define xge_debug_queue(level, fmt...)
226 #endif /* __GNUC__ */
227 #endif
228
229 #if (XGE_COMPONENT_HAL_MM & XGE_DEBUG_MODULE_MASK)
230 #ifndef __GNUC__
xge_debug_mm(xge_debug_level_e level,char * fmt,...)231 static inline void xge_debug_mm(xge_debug_level_e level, char *fmt, ...)
232 {
233 u32 module = XGE_COMPONENT_HAL_MM;
234 xge_debug(module, level, fmt);
235 }
236 #else /* __GNUC__ */
237 #define xge_debug_mm(level, fmt...) \
238 xge_debug(XGE_COMPONENT_HAL_MM, level, fmt)
239 #endif /* __GNUC__ */
240 #else
241 #ifndef __GNUC__
xge_debug_mm(xge_debug_level_e level,char * fmt,...)242 static inline void xge_debug_mm(xge_debug_level_e level, char *fmt, ...)
243 {}
244 #else /* __GNUC__ */
245 #define xge_debug_mm(level, fmt...)
246 #endif /* __GNUC__ */
247 #endif
248
249 #if (XGE_COMPONENT_HAL_CONFIG & XGE_DEBUG_MODULE_MASK)
250 #ifndef __GNUC__
xge_debug_config(xge_debug_level_e level,char * fmt,...)251 static inline void xge_debug_config(xge_debug_level_e level, char *fmt, ...) {
252 u32 module = XGE_COMPONENT_HAL_CONFIG;
253 xge_debug(module, level, fmt);
254 }
255 #else /* __GNUC__ */
256 #define xge_debug_config(level, fmt...) \
257 xge_debug(XGE_COMPONENT_HAL_CONFIG, level, fmt)
258 #endif /* __GNUC__ */
259 #else
260 #ifndef __GNUC__
xge_debug_config(xge_debug_level_e level,char * fmt,...)261 static inline void xge_debug_config(xge_debug_level_e level, char *fmt,
262 ...) {}
263 #else /* __GNUC__ */
264 #define xge_debug_config(level, fmt...)
265 #endif /* __GNUC__ */
266 #endif
267
268 #if (XGE_COMPONENT_HAL_FIFO & XGE_DEBUG_MODULE_MASK)
269 #ifndef __GNUC__
xge_debug_fifo(xge_debug_level_e level,char * fmt,...)270 static inline void xge_debug_fifo(xge_debug_level_e level, char *fmt, ...) {
271 u32 module = XGE_COMPONENT_HAL_FIFO;
272 xge_debug(module, level, fmt);
273 }
274 #else /* __GNUC__ */
275 #define xge_debug_fifo(level, fmt...) \
276 xge_debug(XGE_COMPONENT_HAL_FIFO, level, fmt)
277 #endif /* __GNUC__ */
278 #else
279 #ifndef __GNUC__
xge_debug_fifo(xge_debug_level_e level,char * fmt,...)280 static inline void xge_debug_fifo(xge_debug_level_e level, char *fmt, ...) {}
281 #else /* __GNUC__ */
282 #define xge_debug_fifo(level, fmt...)
283 #endif /* __GNUC__ */
284 #endif
285
286 #if (XGE_COMPONENT_HAL_RING & XGE_DEBUG_MODULE_MASK)
287 #ifndef __GNUC__
xge_debug_ring(xge_debug_level_e level,char * fmt,...)288 static inline void xge_debug_ring(xge_debug_level_e level, char *fmt, ...) {
289 u32 module = XGE_COMPONENT_HAL_RING;
290 xge_debug(module, level, fmt);
291 }
292 #else /* __GNUC__ */
293 #define xge_debug_ring(level, fmt...) \
294 xge_debug(XGE_COMPONENT_HAL_RING, level, fmt)
295 #endif /* __GNUC__ */
296 #else
297 #ifndef __GNUC__
xge_debug_ring(xge_debug_level_e level,char * fmt,...)298 static inline void xge_debug_ring(xge_debug_level_e level, char *fmt, ...) {}
299 #else /* __GNUC__ */
300 #define xge_debug_ring(level, fmt...)
301 #endif /* __GNUC__ */
302 #endif
303
304 #if (XGE_COMPONENT_HAL_CHANNEL & XGE_DEBUG_MODULE_MASK)
305 #ifndef __GNUC__
xge_debug_channel(xge_debug_level_e level,char * fmt,...)306 static inline void xge_debug_channel(xge_debug_level_e level, char *fmt, ...) {
307 u32 module = XGE_COMPONENT_HAL_CHANNEL;
308 xge_debug(module, level, fmt);
309 }
310 #else /* __GNUC__ */
311 #define xge_debug_channel(level, fmt...) \
312 xge_debug(XGE_COMPONENT_HAL_CHANNEL, level, fmt)
313 #endif /* __GNUC__ */
314 #else
315 #ifndef __GNUC__
xge_debug_channel(xge_debug_level_e level,char * fmt,...)316 static inline void xge_debug_channel(xge_debug_level_e level, char *fmt, ...) {}
317 #else /* __GNUC__ */
318 #define xge_debug_channel(level, fmt...)
319 #endif /* __GNUC__ */
320 #endif
321
322 #if (XGE_COMPONENT_HAL_DEVICE & XGE_DEBUG_MODULE_MASK)
323 #ifndef __GNUC__
xge_debug_device(xge_debug_level_e level,char * fmt,...)324 static inline void xge_debug_device(xge_debug_level_e level, char *fmt, ...) {
325 u32 module = XGE_COMPONENT_HAL_DEVICE;
326 xge_debug(module, level, fmt);
327 }
328 #else /* __GNUC__ */
329 #define xge_debug_device(level, fmt...) \
330 xge_debug(XGE_COMPONENT_HAL_DEVICE, level, fmt)
331 #endif /* __GNUC__ */
332 #else
333 #ifndef __GNUC__
xge_debug_device(xge_debug_level_e level,char * fmt,...)334 static inline void xge_debug_device(xge_debug_level_e level, char *fmt, ...) {}
335 #else /* __GNUC__ */
336 #define xge_debug_device(level, fmt...)
337 #endif /* __GNUC__ */
338 #endif
339
340 #if (XGE_COMPONENT_OSDEP & XGE_DEBUG_MODULE_MASK)
341 #ifndef __GNUC__
xge_debug_osdep(xge_debug_level_e level,char * fmt,...)342 static inline void xge_debug_osdep(xge_debug_level_e level, char *fmt, ...) {
343 u32 module = XGE_COMPONENT_OSDEP;
344 xge_debug(module, level, fmt);
345 }
346 #else /* __GNUC__ */
347 #define xge_debug_osdep(level, fmt...) \
348 xge_debug(XGE_COMPONENT_OSDEP, level, fmt)
349 #endif /* __GNUC__ */
350 #else
351 #ifndef __GNUC__
xge_debug_osdep(xge_debug_level_e level,char * fmt,...)352 static inline void xge_debug_osdep(xge_debug_level_e level, char *fmt, ...) {}
353 #else /* __GNUC__ */
354 #define xge_debug_osdep(level, fmt...)
355 #endif /* __GNUC__ */
356 #endif
357
358 #if (XGE_COMPONENT_LL & XGE_DEBUG_MODULE_MASK)
359 #ifndef __GNUC__
xge_debug_ll(xge_debug_level_e level,char * fmt,...)360 static inline void xge_debug_ll(xge_debug_level_e level, char *fmt, ...)
361 {
362 u32 module = XGE_COMPONENT_LL;
363 xge_debug(module, level, fmt);
364 }
365 #else /* __GNUC__ */
366 #define xge_debug_ll(level, fmt...) \
367 xge_debug(XGE_COMPONENT_LL, level, fmt)
368 #endif /* __GNUC__ */
369 #else
370 #ifndef __GNUC__
xge_debug_ll(xge_debug_level_e level,char * fmt,...)371 static inline void xge_debug_ll(xge_debug_level_e level, char *fmt, ...) {}
372 #else /* __GNUC__ */
373 #define xge_debug_ll(level, fmt...)
374 #endif /* __GNUC__ */
375 #endif
376
377 #else
378
xge_debug_interrupt(xge_debug_level_e level,char * fmt,...)379 static inline void xge_debug_interrupt(xge_debug_level_e level, char *fmt, ...) {}
xge_debug_stats(xge_debug_level_e level,char * fmt,...)380 static inline void xge_debug_stats(xge_debug_level_e level, char *fmt, ...) {}
xge_debug_queue(xge_debug_level_e level,char * fmt,...)381 static inline void xge_debug_queue(xge_debug_level_e level, char *fmt, ...) {}
xge_debug_mm(xge_debug_level_e level,char * fmt,...)382 static inline void xge_debug_mm(xge_debug_level_e level, char *fmt, ...) {}
xge_debug_config(xge_debug_level_e level,char * fmt,...)383 static inline void xge_debug_config(xge_debug_level_e level, char *fmt, ...) {}
xge_debug_fifo(xge_debug_level_e level,char * fmt,...)384 static inline void xge_debug_fifo(xge_debug_level_e level, char *fmt, ...) {}
xge_debug_ring(xge_debug_level_e level,char * fmt,...)385 static inline void xge_debug_ring(xge_debug_level_e level, char *fmt, ...) {}
xge_debug_channel(xge_debug_level_e level,char * fmt,...)386 static inline void xge_debug_channel(xge_debug_level_e level, char *fmt, ...) {}
xge_debug_device(xge_debug_level_e level,char * fmt,...)387 static inline void xge_debug_device(xge_debug_level_e level, char *fmt, ...) {}
xge_debug_hal(xge_debug_level_e level,char * fmt,...)388 static inline void xge_debug_hal(xge_debug_level_e level, char *fmt, ...) {}
xge_debug_osdep(xge_debug_level_e level,char * fmt,...)389 static inline void xge_debug_osdep(xge_debug_level_e level, char *fmt, ...) {}
xge_debug_ll(xge_debug_level_e level,char * fmt,...)390 static inline void xge_debug_ll(xge_debug_level_e level, char *fmt, ...) {}
391
392 #endif /* end of XGE_DEBUG_*_MASK */
393
394 #ifdef XGE_DEBUG_ASSERT
395
396 /**
397 * xge_assert
398 * @test: C-condition to check
399 * @fmt: printf like format string
400 *
401 * This function implements traditional assert. By default assertions
402 * are enabled. It can be disabled by defining XGE_DEBUG_ASSERT macro in
403 * compilation
404 * time.
405 */
406 #define xge_assert(test) { \
407 if (!(test)) xge_os_bug("bad cond: "#test" at %s:%d\n", \
408 __FILE__, __LINE__); }
409 #else
410 #define xge_assert(test)
411 #endif /* end of XGE_DEBUG_ASSERT */
412
413 __EXTERN_END_DECLS
414
415 #endif /* XGE_DEBUG_H */
416