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