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$
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 */
68typedef 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
79extern unsigned long *g_module_mask;
80extern 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) { \
150if (((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...) { \
165if (((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__
175static 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__
185static 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__
194static 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__
204static 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__
212static 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__
222static 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__
231static 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__
242static 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__
251static 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__
261static 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__
270static 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__
280static 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__
288static 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__
298static 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__
306static 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__
316static 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__
324static 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__
334static 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__
342static 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__
352static 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__
360static 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__
371static 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
379static inline void xge_debug_interrupt(xge_debug_level_e level, char *fmt, ...) {}
380static inline void xge_debug_stats(xge_debug_level_e level, char *fmt, ...) {}
381static inline void xge_debug_queue(xge_debug_level_e level, char *fmt, ...) {}
382static inline void xge_debug_mm(xge_debug_level_e level, char *fmt, ...) {}
383static inline void xge_debug_config(xge_debug_level_e level, char *fmt, ...) {}
384static inline void xge_debug_fifo(xge_debug_level_e level, char *fmt, ...) {}
385static inline void xge_debug_ring(xge_debug_level_e level, char *fmt, ...) {}
386static inline void xge_debug_channel(xge_debug_level_e level, char *fmt, ...) {}
387static inline void xge_debug_device(xge_debug_level_e level, char *fmt, ...) {}
388static inline void xge_debug_hal(xge_debug_level_e level, char *fmt, ...) {}
389static inline void xge_debug_osdep(xge_debug_level_e level, char *fmt, ...) {}
390static 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