xref: /titanic_50/usr/src/cmd/fm/modules/sun4/cpumem-diagnosis/cmd.h (revision 47e946e784719ae402ace34695f67b0e6e76ae5c)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 /*
22  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
23  * Use is subject to license terms.
24  */
25 
26 #ifndef _CMD_H
27 #define	_CMD_H
28 
29 #pragma ident	"%Z%%M%	%I%	%E% SMI"
30 
31 #include <stdarg.h>
32 #include <fm/fmd_api.h>
33 #include <sys/param.h>
34 
35 #include <cmd_list.h>
36 
37 #ifdef __cplusplus
38 extern "C" {
39 #endif
40 
41 /*
42  * Diagnosis of certain errors requires that either a) the type of ereport be
43  * recorded in a persistent buffer or b) that a single value be used to
44  * represent multiple ereport classes.  We start the values at 0x8 to avoid
45  * collisions with an earlier class code enum.  While we have 64 bits available
46  * to us, cmd_errcl_t's are saved in persistent buffers, and thus can't easily
47  * grow beyond that size.  As such, ereports should only be assigned class codes
48  * when needed.  NEVER CHANGE the values of these constants once assigned.
49  */
50 #ifdef sun4u
51 #define	CMD_ERRCL_UCC		0x0000000000000008ULL
52 #define	CMD_ERRCL_UCU		0x0000000000000010ULL
53 #define	CMD_ERRCL_CPC		0x0000000000000020ULL
54 #define	CMD_ERRCL_CPU		0x0000000000000040ULL
55 #define	CMD_ERRCL_WDC		0x0000000000000080ULL
56 #define	CMD_ERRCL_WDU		0x0000000000000100ULL
57 #define	CMD_ERRCL_EDC		0x0000000000000200ULL
58 #define	CMD_ERRCL_EDU_ST	0x0000000000000400ULL
59 #define	CMD_ERRCL_EDU_BL	0x0000000000000800ULL
60 #define	CMD_ERRCL_L3_UCC	0x0000000000001000ULL
61 #define	CMD_ERRCL_L3_UCU	0x0000000000002000ULL
62 #define	CMD_ERRCL_L3_CPC	0x0000000000004000ULL
63 #define	CMD_ERRCL_L3_CPU	0x0000000000008000ULL
64 #define	CMD_ERRCL_L3_WDC	0x0000000000010000ULL
65 #define	CMD_ERRCL_L3_WDU	0x0000000000020000ULL
66 #define	CMD_ERRCL_L3_EDC	0x0000000000040000ULL
67 #define	CMD_ERRCL_L3_EDU_ST	0x0000000000080000ULL
68 #define	CMD_ERRCL_L3_EDU_BL	0x0000000000100000ULL
69 #define	CMD_ERRCL_L3_MECC	0x0000000000200000ULL
70 				/* hole for sequential expansion */
71 #define	CMD_ERRCL_RCE		0x0000040000000000ULL
72 #define	CMD_ERRCL_RUE		0x0000080000000000ULL
73 #define	CMD_ERRCL_FRC		0x0000100000000000ULL
74 #define	CMD_ERRCL_FRU		0x0000200000000000ULL
75 #define	CMD_ERRCL_IOCE		0x0000400000000000ULL
76 #define	CMD_ERRCL_IOUE		0x0000800000000000ULL
77 #else /* sun4u */
78 #define	CMD_ERRCL_IL2U		0x0000000000000008ULL
79 #define	CMD_ERRCL_DL2U		0x0000000000000010ULL
80 #define	CMD_ERRCL_L2ND		0x0000000000000020ULL
81 #define	CMD_ERRCL_IL2ND		0x0000000000000040ULL
82 #define	CMD_ERRCL_DL2ND		0x0000000000000080ULL
83 #define	CMD_ERRCL_DBU		0x0000000000000100ULL
84 #define	CMD_ERRCL_FBU		0x0000000000000200ULL
85 #define	CMD_ERRCL_DCDP		0x0000000000000400ULL
86 #define	CMD_ERRCL_ICDP		0x0000000000000800ULL
87 #define	CMD_ERRCL_WBUE		0x0000000000001000ULL
88 #define	CMD_ERRCL_CBCE		0x0000000000002000ULL
89 #define	CMD_ERRCL_DAC		0x0001000000000000ULL
90 #define	CMD_ERRCL_DSC		0x0002000000000000ULL
91 #define	CMD_ERRCL_DAU		0x0004000000000000ULL
92 #define	CMD_ERRCL_DSU		0x0008000000000000ULL
93 #define	CMD_ERRCL_LDAC		0x0010000000000000ULL
94 #define	CMD_ERRCL_LDWC		0x0020000000000000ULL
95 #define	CMD_ERRCL_LDRC		0x0040000000000000ULL
96 #define	CMD_ERRCL_LDSC		0x0080000000000000ULL
97 #define	CMD_ERRCL_LDAU		0x0100000000000000ULL
98 #define	CMD_ERRCL_LDWU		0x0200000000000000ULL
99 #define	CMD_ERRCL_LDRU		0x0400000000000000ULL
100 #define	CMD_ERRCL_LDSU		0x0800000000000000ULL
101 
102 #define	CMD_ERRCL_SBDPC		0x1000000000000000ULL
103 #define	CMD_ERRCL_SBDLC		0x2000000000000000ULL
104 #define	CMD_ERRCL_TCCP		0x4000000000000000ULL
105 #define	CMD_ERRCL_TCCD		0x8000000000000000ULL
106 #endif /* sun4u */
107 
108 #ifdef sun4u
109 #define	CMD_ERRCL_ISL2XXCU(clcode) \
110 	((clcode) >= CMD_ERRCL_UCC && (clcode) <= CMD_ERRCL_EDU_BL)
111 #define	CMD_ERRCL_ISL3XXCU(clcode) \
112 	((clcode) >= CMD_ERRCL_L3_UCC && (clcode) <= CMD_ERRCL_L3_MECC)
113 
114 #define	CMD_ERRCL_ISIOXE(clcode) \
115 	(((clcode) & (CMD_ERRCL_IOCE | CMD_ERRCL_IOUE)) != 0)
116 #else /* sun4u */
117 /*
118  * If changing the CMD_ERRCL_ISL2XXCU definition, should also
119  * change all the lines below it.
120  */
121 #define	CMD_ERRCL_ISL2XXCU(clcode) \
122 	(((clcode) >= CMD_ERRCL_LDAC && (clcode) <= CMD_ERRCL_LDSU) || \
123 	((clcode) >= CMD_ERRCL_IL2U && (clcode) <= CMD_ERRCL_DL2U))
124 
125 #define	CMD_ERRCL_ISMISCREGS(clcode) \
126 	((clcode) >= CMD_ERRCL_SBDPC && (clcode) <= CMD_ERRCL_TCCD)
127 
128 #define	CMD_ERRCL_ISL2CE(clcode) \
129 	(((clcode) >= CMD_ERRCL_LDAC && (clcode) <= CMD_ERRCL_LDSC) || \
130 	(clcode == CMD_ERRCL_CBCE))
131 
132 #define	CMD_ERRCL_ISL2ND(clcode) \
133 	((clcode) >= CMD_ERRCL_L2ND && (clcode) <= CMD_ERRCL_DL2ND)
134 
135 #define	CMD_ERRCL_ISMEM(clcode) \
136 	((clcode & (CMD_ERRCL_DAU | CMD_ERRCL_DBU | CMD_ERRCL_FBU)) != 0)
137 
138 #define	CMD_ERRCL_ISDCDP(clcode) \
139 	(clcode == CMD_ERRCL_DCDP)
140 
141 #define	CMD_ERRCL_ISICDP(clcode) \
142 	(clcode == CMD_ERRCL_ICDP)
143 
144 #define	CMD_ERRCL_L2UE_WRITEBACK(clcode) \
145 	((clcode & (CMD_ERRCL_LDWU | CMD_ERRCL_WBUE)) != 0)
146 
147 #define	CMD_ERRCL_REMOTEL2(clcode) \
148 	((clcode & (CMD_ERRCL_WBUE | CMD_ERRCL_CBCE)) != 0)
149 
150 #endif /* sun4u */
151 
152 #ifdef sun4v
153 #define	L2_ERR		1
154 #define	MISCREGS_ERR	2
155 #define	L2ND_ERR	3
156 #define	MEM_ERR		4
157 #define	DCDP_ERR	5
158 #define	ICDP_ERR	6
159 #define	REMOTE_L2ERR	7
160 #define	UNKNOWN_ERR	8
161 #endif
162 
163 
164 #define	CMD_ERRCL_MATCH(clcode, mask) \
165 	(((clcode) & (mask)) != 0)
166 
167 typedef uint64_t cmd_errcl_t;
168 
169 /*
170  * Use low order 2 bits of cmd_errcl_t in order to pass cpu grouping level.
171  * The DE never shipped with code using low order 3 bits.
172  */
173 
174 #define	CMD_ERRCL_LEVEL_EXTRACT		0X0000000000000003ULL
175 #define	CMD_ERRCL_LEVEL_MASK		0XFFFFFFFFFFFFFFF8ULL
176 
177 #define	CMD_STAT_BUMP(name)		cmd.cmd_stats->name.fmds_value.ui64++
178 
179 #define	CMD_FLTMAXCONF		95	/* maximum confidence for faults */
180 
181 struct cmd_xxcu_trw;
182 
183 typedef struct cmd_stat {
184 	fmd_stat_t bad_det;		/* # of malformed detectors */
185 	fmd_stat_t bad_cpu_asru;	/* # of malformed cpu-scheme ASRUs */
186 	fmd_stat_t bad_mem_asru;	/* # of malformed mem-scheme ASRUs */
187 	fmd_stat_t bad_close;		/* # of inapplicable case closes */
188 	fmd_stat_t old_erpt;		/* # of erpts for removed components */
189 	fmd_stat_t cpu_creat;		/* # of CPU state structs created */
190 	fmd_stat_t dimm_creat;		/* # of DIMM state structs created */
191 	fmd_stat_t bank_creat;		/* # of bank state structs created */
192 	fmd_stat_t page_creat;		/* # of page state structs created */
193 	fmd_stat_t cache_creat;		/* # of cache state structs created */
194 	fmd_stat_t ce_unknown;		/* # of unknown CEs seen */
195 	fmd_stat_t ce_interm;		/* # of intermittent CEs seen */
196 	fmd_stat_t ce_ppersis;		/* # of possible persistent CEs seen */
197 	fmd_stat_t ce_persis;		/* # of persistent CEs seen */
198 	fmd_stat_t ce_leaky;		/* # of leaky CEs seen */
199 					/* # of possible sticky CEs: */
200 	fmd_stat_t ce_psticky_noptnr;		/* - no valid partner test */
201 	fmd_stat_t ce_psticky_ptnrnoerr;	/* - partner could not see CE */
202 	fmd_stat_t ce_psticky_ptnrclrd;		/* - partner could fix CE */
203 	fmd_stat_t ce_sticky;		/* # of sticky CEs seen */
204 	fmd_stat_t xxu_ue_match;	/* # of xxUs that matched in a UE $ */
205 	fmd_stat_t xxu_retr_flt;	/* # of xxUs unnecessary by fault */
206 	fmd_stat_t cpu_migrat;		/* # of CPUs migrated to new version */
207 	fmd_stat_t dimm_migrat;		/* # of DIMMs migrated to new version */
208 	fmd_stat_t bank_migrat;		/* # of banks migrated to new version */
209 #ifdef sun4u
210 	fmd_stat_t dp_ignored_ce;	/* # of CEs ignored due to DP flt/err */
211 	fmd_stat_t dp_ignored_ue;	/* # of UEs ignored due to DP fault */
212 	fmd_stat_t dp_deferred_ue;	/* # of UEs deferred due to DP error */
213 #endif
214 #ifdef sun4v
215 	fmd_stat_t branch_creat;	/* # of branch state structs created */
216 #endif
217 } cmd_stat_t;
218 
219 typedef struct cmd_serd {
220 	const char *cs_name;
221 	uint_t cs_n;
222 	hrtime_t cs_t;
223 } cmd_serd_t;
224 
225 typedef struct cmd {
226 	cmd_list_t cmd_cpus;		/* List of CPU state structures */
227 	cmd_list_t cmd_dimms;		/* List of DIMM state structures */
228 	cmd_list_t cmd_banks;		/* List of bank state structures */
229 	cmd_list_t cmd_pages;		/* List of page state structures */
230 	cmd_list_t cmd_iorxefrx;	/* List of IOxE/RxE/FRx correlation */
231 #ifdef sun4u
232 	cmd_list_t cmd_datapaths;	/* List of datapath state structures */
233 	cmd_list_t cmd_deferred_pages;	/* Pages deferred due to a DP error */
234 #endif
235 	hrtime_t cmd_iorxefrx_window;	/* Max int between IOxE/RxE/FRx pairs */
236 	cmd_stat_t *cmd_stats;		/* Module statistics */
237 	size_t cmd_pagesize;		/* Page size, in bytes */
238 	uint64_t cmd_pagemask;		/* Mask for page alignments */
239 	char cmd_ecache_dev[MAXPATHLEN]; /* Mem ctrlr drv path for E$ flush */
240 	struct cmd_xxcu_trw *cmd_xxcu_trw; /* Array of xxC/U train waiters */
241 	size_t cmd_xxcu_ntrw;		/* Number of waiters in array */
242 	hrtime_t cmd_xxcu_trdelay;	/* Delay for xxC/U redelivery */
243 	cmd_list_t cmd_xxcu_redelivs;	/* Pending xxC/U redeliveries */
244 	cmd_serd_t cmd_l2data_serd;	/* Params for L2$ SERD engine */
245 	cmd_serd_t cmd_l3data_serd;	/* Params for L3$ SERD engine */
246 	uint64_t cmd_thresh_tpct_sysmem; /* Pg ret warning thresh (% of mem) */
247 	uint64_t cmd_thresh_abs_sysmem;	/* Pg ret warning thresh (# of pages) */
248 	uint64_t cmd_thresh_abs_badrw;	/* Bad r/w retire thresh (# of pages) */
249 	cmd_serd_t cmd_miscregs_serd;   /* params for misregs serd */
250 	cmd_serd_t cmd_dcache_serd;	/* params for dcache serd */
251 	cmd_serd_t cmd_icache_serd;	/* params for icache serd */
252 #ifdef sun4u
253 	uint16_t cmd_dp_flag;		/* datapath error in progress if set */
254 #endif
255 #ifdef sun4v
256 	cmd_list_t cmd_branches;	/* List of branches state structures */
257 	uint64_t cmd_delta_ena;		/* the sun4v train delta ena */
258 #endif
259 	nvlist_t *cmd_auth;		/* DE's fault authority value */
260 } cmd_t;
261 
262 extern cmd_t cmd;
263 
264 extern int cmd_set_errno(int);
265 
266 extern void *cmd_buf_read(fmd_hdl_t *, fmd_case_t *, const char *, size_t);
267 extern void cmd_bufname(char *, size_t, const char *, ...);
268 extern void cmd_vbufname(char *, size_t, const char *, va_list);
269 extern nvlist_t *cmd_nvl_create_fault(fmd_hdl_t *,
270     const char *, uint8_t, nvlist_t *, nvlist_t *, nvlist_t *);
271 
272 #ifdef __cplusplus
273 }
274 #endif
275 
276 #endif /* _CMD_H */
277