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