1/*
2 *	Copyright IBM Corp. 2001, 2007
3 *	Authors:	Peter Tiedemann (ptiedem@de.ibm.com)
4 *
5 */
6
7#ifndef _CTCM_DBUG_H_
8#define _CTCM_DBUG_H_
9
10/*
11 * Debug Facility stuff
12 */
13
14#include <asm/debug.h>
15
16#ifdef DEBUG
17 #define do_debug 1
18#else
19 #define do_debug 0
20#endif
21#ifdef DEBUGCCW
22 #define do_debug_ccw 1
23 #define DEBUGDATA 1
24#else
25 #define do_debug_ccw 0
26#endif
27#ifdef DEBUGDATA
28 #define do_debug_data 1
29#else
30 #define do_debug_data 0
31#endif
32
33/* define dbf debug levels similar to kernel msg levels */
34#define	CTC_DBF_ALWAYS	0	/* always print this 			*/
35#define	CTC_DBF_EMERG	0	/* system is unusable			*/
36#define	CTC_DBF_ALERT	1	/* action must be taken immediately	*/
37#define	CTC_DBF_CRIT	2	/* critical conditions			*/
38#define	CTC_DBF_ERROR	3	/* error conditions			*/
39#define	CTC_DBF_WARN	4	/* warning conditions			*/
40#define	CTC_DBF_NOTICE	5	/* normal but significant condition	*/
41#define	CTC_DBF_INFO	5	/* informational			*/
42#define	CTC_DBF_DEBUG	6	/* debug-level messages			*/
43
44enum ctcm_dbf_names {
45	CTCM_DBF_SETUP,
46	CTCM_DBF_ERROR,
47	CTCM_DBF_TRACE,
48	CTCM_DBF_MPC_SETUP,
49	CTCM_DBF_MPC_ERROR,
50	CTCM_DBF_MPC_TRACE,
51	CTCM_DBF_INFOS	/* must be last element */
52};
53
54struct ctcm_dbf_info {
55	char name[DEBUG_MAX_NAME_LEN];
56	int pages;
57	int areas;
58	int len;
59	int level;
60	debug_info_t *id;
61};
62
63extern struct ctcm_dbf_info ctcm_dbf[CTCM_DBF_INFOS];
64
65int ctcm_register_dbf_views(void);
66void ctcm_unregister_dbf_views(void);
67void ctcm_dbf_longtext(enum ctcm_dbf_names dbf_nix, int level, char *text, ...);
68
69static inline const char *strtail(const char *s, int n)
70{
71	int l = strlen(s);
72	return (l > n) ? s + (l - n) : s;
73}
74
75#define CTCM_FUNTAIL strtail((char *)__func__, 16)
76
77#define CTCM_DBF_TEXT(name, level, text) \
78	do { \
79		debug_text_event(ctcm_dbf[CTCM_DBF_##name].id, level, text); \
80	} while (0)
81
82#define CTCM_DBF_HEX(name, level, addr, len) \
83	do { \
84		debug_event(ctcm_dbf[CTCM_DBF_##name].id, \
85					level, (void *)(addr), len); \
86	} while (0)
87
88#define CTCM_DBF_TEXT_(name, level, text...) \
89	ctcm_dbf_longtext(CTCM_DBF_##name, level, text)
90
91/*
92 * cat : one of {setup, mpc_setup, trace, mpc_trace, error, mpc_error}.
93 * dev : netdevice with valid name field.
94 * text: any text string.
95 */
96#define CTCM_DBF_DEV_NAME(cat, dev, text) \
97	do { \
98		CTCM_DBF_TEXT_(cat, CTC_DBF_INFO, "%s(%s) :- %s", \
99			CTCM_FUNTAIL, dev->name, text); \
100	} while (0)
101
102#define MPC_DBF_DEV_NAME(cat, dev, text) \
103	do { \
104		CTCM_DBF_TEXT_(MPC_##cat, CTC_DBF_INFO, "%s(%s) := %s", \
105			CTCM_FUNTAIL, dev->name, text); \
106	} while (0)
107
108#define CTCMY_DBF_DEV_NAME(cat, dev, text) \
109	do { \
110		if (IS_MPCDEV(dev)) \
111			MPC_DBF_DEV_NAME(cat, dev, text); \
112		else \
113			CTCM_DBF_DEV_NAME(cat, dev, text); \
114	} while (0)
115
116/*
117 * cat : one of {setup, mpc_setup, trace, mpc_trace, error, mpc_error}.
118 * dev : netdevice.
119 * text: any text string.
120 */
121#define CTCM_DBF_DEV(cat, dev, text) \
122	do { \
123		CTCM_DBF_TEXT_(cat, CTC_DBF_INFO, "%s(%p) :-: %s", \
124			CTCM_FUNTAIL, dev, text); \
125	} while (0)
126
127#define MPC_DBF_DEV(cat, dev, text) \
128	do { \
129		CTCM_DBF_TEXT_(MPC_##cat, CTC_DBF_INFO, "%s(%p) :=: %s", \
130			CTCM_FUNTAIL, dev, text); \
131	} while (0)
132
133#define CTCMY_DBF_DEV(cat, dev, text) \
134	do { \
135		if (IS_MPCDEV(dev)) \
136			MPC_DBF_DEV(cat, dev, text); \
137		else \
138			CTCM_DBF_DEV(cat, dev, text); \
139	} while (0)
140
141#endif
142