xref: /titanic_50/usr/src/cmd/fm/modules/sun4/cpumem-diagnosis/cmd.h (revision d4ac42a1cd3016618a9ba0330862d410f0058f89)
1822fb41dStsien /*
2822fb41dStsien  * CDDL HEADER START
3822fb41dStsien  *
4822fb41dStsien  * The contents of this file are subject to the terms of the
5816b7274Stsien  * Common Development and Distribution License (the "License").
6816b7274Stsien  * You may not use this file except in compliance with the License.
7822fb41dStsien  *
8822fb41dStsien  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9822fb41dStsien  * or http://www.opensolaris.org/os/licensing.
10822fb41dStsien  * See the License for the specific language governing permissions
11822fb41dStsien  * and limitations under the License.
12822fb41dStsien  *
13822fb41dStsien  * When distributing Covered Code, include this CDDL HEADER in each
14822fb41dStsien  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15822fb41dStsien  * If applicable, add the following below this CDDL HEADER, with the
16822fb41dStsien  * fields enclosed by brackets "[]" replaced with your own identifying
17822fb41dStsien  * information: Portions Copyright [yyyy] [name of copyright owner]
18822fb41dStsien  *
19822fb41dStsien  * CDDL HEADER END
20822fb41dStsien  */
21822fb41dStsien /*
22*d4ac42a1STrang Do  * Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved.
23822fb41dStsien  */
24822fb41dStsien 
25822fb41dStsien #ifndef _CMD_H
26822fb41dStsien #define	_CMD_H
27822fb41dStsien 
28822fb41dStsien #include <stdarg.h>
29822fb41dStsien #include <fm/fmd_api.h>
30822fb41dStsien #include <sys/param.h>
31822fb41dStsien 
32822fb41dStsien #include <cmd_list.h>
33822fb41dStsien 
34822fb41dStsien #ifdef __cplusplus
35822fb41dStsien extern "C" {
36822fb41dStsien #endif
37822fb41dStsien 
38822fb41dStsien /*
39822fb41dStsien  * Diagnosis of certain errors requires that either a) the type of ereport be
40822fb41dStsien  * recorded in a persistent buffer or b) that a single value be used to
41822fb41dStsien  * represent multiple ereport classes.  We start the values at 0x8 to avoid
42822fb41dStsien  * collisions with an earlier class code enum.  While we have 64 bits available
43822fb41dStsien  * to us, cmd_errcl_t's are saved in persistent buffers, and thus can't easily
44822fb41dStsien  * grow beyond that size.  As such, ereports should only be assigned class codes
456dfee483Stsien  * when needed.  NEVER CHANGE the values of these constants once assigned.
46822fb41dStsien  */
47050c9ebdStd122701 #ifdef sun4u
48822fb41dStsien #define	CMD_ERRCL_UCC		0x0000000000000008ULL
49822fb41dStsien #define	CMD_ERRCL_UCU		0x0000000000000010ULL
50822fb41dStsien #define	CMD_ERRCL_CPC		0x0000000000000020ULL
51822fb41dStsien #define	CMD_ERRCL_CPU		0x0000000000000040ULL
52822fb41dStsien #define	CMD_ERRCL_WDC		0x0000000000000080ULL
53822fb41dStsien #define	CMD_ERRCL_WDU		0x0000000000000100ULL
54822fb41dStsien #define	CMD_ERRCL_EDC		0x0000000000000200ULL
55822fb41dStsien #define	CMD_ERRCL_EDU_ST	0x0000000000000400ULL
56822fb41dStsien #define	CMD_ERRCL_EDU_BL	0x0000000000000800ULL
57822fb41dStsien #define	CMD_ERRCL_L3_UCC	0x0000000000001000ULL
58822fb41dStsien #define	CMD_ERRCL_L3_UCU	0x0000000000002000ULL
59822fb41dStsien #define	CMD_ERRCL_L3_CPC	0x0000000000004000ULL
60822fb41dStsien #define	CMD_ERRCL_L3_CPU	0x0000000000008000ULL
61822fb41dStsien #define	CMD_ERRCL_L3_WDC	0x0000000000010000ULL
62822fb41dStsien #define	CMD_ERRCL_L3_WDU	0x0000000000020000ULL
63822fb41dStsien #define	CMD_ERRCL_L3_EDC	0x0000000000040000ULL
64822fb41dStsien #define	CMD_ERRCL_L3_EDU_ST	0x0000000000080000ULL
65822fb41dStsien #define	CMD_ERRCL_L3_EDU_BL	0x0000000000100000ULL
66822fb41dStsien #define	CMD_ERRCL_L3_MECC	0x0000000000200000ULL
67822fb41dStsien 				/* hole for sequential expansion */
68822fb41dStsien #define	CMD_ERRCL_RCE		0x0000040000000000ULL
69822fb41dStsien #define	CMD_ERRCL_RUE		0x0000080000000000ULL
70822fb41dStsien #define	CMD_ERRCL_FRC		0x0000100000000000ULL
71822fb41dStsien #define	CMD_ERRCL_FRU		0x0000200000000000ULL
72822fb41dStsien #define	CMD_ERRCL_IOCE		0x0000400000000000ULL
73822fb41dStsien #define	CMD_ERRCL_IOUE		0x0000800000000000ULL
74050c9ebdStd122701 #else /* sun4u */
75050c9ebdStd122701 #define	CMD_ERRCL_IL2U		0x0000000000000008ULL
76050c9ebdStd122701 #define	CMD_ERRCL_DL2U		0x0000000000000010ULL
77050c9ebdStd122701 #define	CMD_ERRCL_L2ND		0x0000000000000020ULL
78050c9ebdStd122701 #define	CMD_ERRCL_IL2ND		0x0000000000000040ULL
79050c9ebdStd122701 #define	CMD_ERRCL_DL2ND		0x0000000000000080ULL
80050c9ebdStd122701 #define	CMD_ERRCL_DBU		0x0000000000000100ULL
81050c9ebdStd122701 #define	CMD_ERRCL_FBU		0x0000000000000200ULL
82050c9ebdStd122701 #define	CMD_ERRCL_DCDP		0x0000000000000400ULL
83050c9ebdStd122701 #define	CMD_ERRCL_ICDP		0x0000000000000800ULL
84050c9ebdStd122701 #define	CMD_ERRCL_WBUE		0x0000000000001000ULL
85050c9ebdStd122701 #define	CMD_ERRCL_CBCE		0x0000000000002000ULL
86822fb41dStsien #define	CMD_ERRCL_DAC		0x0001000000000000ULL
87822fb41dStsien #define	CMD_ERRCL_DSC		0x0002000000000000ULL
88822fb41dStsien #define	CMD_ERRCL_DAU		0x0004000000000000ULL
89822fb41dStsien #define	CMD_ERRCL_DSU		0x0008000000000000ULL
906dfee483Stsien #define	CMD_ERRCL_LDAC		0x0010000000000000ULL
916dfee483Stsien #define	CMD_ERRCL_LDWC		0x0020000000000000ULL
926dfee483Stsien #define	CMD_ERRCL_LDRC		0x0040000000000000ULL
936dfee483Stsien #define	CMD_ERRCL_LDSC		0x0080000000000000ULL
946dfee483Stsien #define	CMD_ERRCL_LDAU		0x0100000000000000ULL
956dfee483Stsien #define	CMD_ERRCL_LDWU		0x0200000000000000ULL
966dfee483Stsien #define	CMD_ERRCL_LDRU		0x0400000000000000ULL
976dfee483Stsien #define	CMD_ERRCL_LDSU		0x0800000000000000ULL
98822fb41dStsien 
99faff872bStd122701 #define	CMD_ERRCL_SBDPC		0x1000000000000000ULL
100faff872bStd122701 #define	CMD_ERRCL_SBDLC		0x2000000000000000ULL
101faff872bStd122701 #define	CMD_ERRCL_TCCP		0x4000000000000000ULL
102faff872bStd122701 #define	CMD_ERRCL_TCCD		0x8000000000000000ULL
103050c9ebdStd122701 #endif /* sun4u */
104faff872bStd122701 
1056dfee483Stsien #ifdef sun4u
106822fb41dStsien #define	CMD_ERRCL_ISL2XXCU(clcode) \
107822fb41dStsien 	((clcode) >= CMD_ERRCL_UCC && (clcode) <= CMD_ERRCL_EDU_BL)
108822fb41dStsien #define	CMD_ERRCL_ISL3XXCU(clcode) \
109822fb41dStsien 	((clcode) >= CMD_ERRCL_L3_UCC && (clcode) <= CMD_ERRCL_L3_MECC)
110822fb41dStsien 
111822fb41dStsien #define	CMD_ERRCL_ISIOXE(clcode) \
112822fb41dStsien 	(((clcode) & (CMD_ERRCL_IOCE | CMD_ERRCL_IOUE)) != 0)
1136dfee483Stsien #else /* sun4u */
114050c9ebdStd122701 /*
115050c9ebdStd122701  * If changing the CMD_ERRCL_ISL2XXCU definition, should also
116050c9ebdStd122701  * change all the lines below it.
117050c9ebdStd122701  */
1186dfee483Stsien #define	CMD_ERRCL_ISL2XXCU(clcode) \
119050c9ebdStd122701 	(((clcode) >= CMD_ERRCL_LDAC && (clcode) <= CMD_ERRCL_LDSU) || \
120050c9ebdStd122701 	((clcode) >= CMD_ERRCL_IL2U && (clcode) <= CMD_ERRCL_DL2U))
121822fb41dStsien 
122faff872bStd122701 #define	CMD_ERRCL_ISMISCREGS(clcode) \
123faff872bStd122701 	((clcode) >= CMD_ERRCL_SBDPC && (clcode) <= CMD_ERRCL_TCCD)
124faff872bStd122701 
125050c9ebdStd122701 #define	CMD_ERRCL_ISL2CE(clcode) \
126050c9ebdStd122701 	(((clcode) >= CMD_ERRCL_LDAC && (clcode) <= CMD_ERRCL_LDSC) || \
127050c9ebdStd122701 	(clcode == CMD_ERRCL_CBCE))
128050c9ebdStd122701 
129050c9ebdStd122701 #define	CMD_ERRCL_ISL2ND(clcode) \
130050c9ebdStd122701 	((clcode) >= CMD_ERRCL_L2ND && (clcode) <= CMD_ERRCL_DL2ND)
131050c9ebdStd122701 
132050c9ebdStd122701 #define	CMD_ERRCL_ISMEM(clcode) \
133050c9ebdStd122701 	((clcode & (CMD_ERRCL_DAU | CMD_ERRCL_DBU | CMD_ERRCL_FBU)) != 0)
134050c9ebdStd122701 
135050c9ebdStd122701 #define	CMD_ERRCL_ISDCDP(clcode) \
136050c9ebdStd122701 	(clcode == CMD_ERRCL_DCDP)
137050c9ebdStd122701 
138050c9ebdStd122701 #define	CMD_ERRCL_ISICDP(clcode) \
139050c9ebdStd122701 	(clcode == CMD_ERRCL_ICDP)
140050c9ebdStd122701 
141050c9ebdStd122701 #define	CMD_ERRCL_L2UE_WRITEBACK(clcode) \
142050c9ebdStd122701 	((clcode & (CMD_ERRCL_LDWU | CMD_ERRCL_WBUE)) != 0)
143050c9ebdStd122701 
144050c9ebdStd122701 #define	CMD_ERRCL_REMOTEL2(clcode) \
145050c9ebdStd122701 	((clcode & (CMD_ERRCL_WBUE | CMD_ERRCL_CBCE)) != 0)
146050c9ebdStd122701 
147050c9ebdStd122701 #endif /* sun4u */
148050c9ebdStd122701 
149050c9ebdStd122701 #ifdef sun4v
150050c9ebdStd122701 #define	L2_ERR		1
151050c9ebdStd122701 #define	MISCREGS_ERR	2
152050c9ebdStd122701 #define	L2ND_ERR	3
153050c9ebdStd122701 #define	MEM_ERR		4
154050c9ebdStd122701 #define	DCDP_ERR	5
155050c9ebdStd122701 #define	ICDP_ERR	6
156050c9ebdStd122701 #define	REMOTE_L2ERR	7
157050c9ebdStd122701 #define	UNKNOWN_ERR	8
158050c9ebdStd122701 #endif
159050c9ebdStd122701 
160050c9ebdStd122701 
161822fb41dStsien #define	CMD_ERRCL_MATCH(clcode, mask) \
162822fb41dStsien 	(((clcode) & (mask)) != 0)
163822fb41dStsien 
164822fb41dStsien typedef uint64_t cmd_errcl_t;
165822fb41dStsien 
166816b7274Stsien /*
167816b7274Stsien  * Use low order 2 bits of cmd_errcl_t in order to pass cpu grouping level.
168816b7274Stsien  * The DE never shipped with code using low order 3 bits.
169816b7274Stsien  */
170816b7274Stsien 
171816b7274Stsien #define	CMD_ERRCL_LEVEL_EXTRACT		0X0000000000000003ULL
172816b7274Stsien #define	CMD_ERRCL_LEVEL_MASK		0XFFFFFFFFFFFFFFF8ULL
173816b7274Stsien 
174822fb41dStsien #define	CMD_STAT_BUMP(name)		cmd.cmd_stats->name.fmds_value.ui64++
175822fb41dStsien 
176822fb41dStsien #define	CMD_FLTMAXCONF		95	/* maximum confidence for faults */
177822fb41dStsien 
178822fb41dStsien struct cmd_xxcu_trw;
179822fb41dStsien 
180822fb41dStsien typedef struct cmd_stat {
181822fb41dStsien 	fmd_stat_t bad_det;		/* # of malformed detectors */
182822fb41dStsien 	fmd_stat_t bad_cpu_asru;	/* # of malformed cpu-scheme ASRUs */
183822fb41dStsien 	fmd_stat_t bad_mem_asru;	/* # of malformed mem-scheme ASRUs */
184822fb41dStsien 	fmd_stat_t bad_close;		/* # of inapplicable case closes */
185822fb41dStsien 	fmd_stat_t old_erpt;		/* # of erpts for removed components */
186822fb41dStsien 	fmd_stat_t cpu_creat;		/* # of CPU state structs created */
187822fb41dStsien 	fmd_stat_t dimm_creat;		/* # of DIMM state structs created */
188822fb41dStsien 	fmd_stat_t bank_creat;		/* # of bank state structs created */
189822fb41dStsien 	fmd_stat_t page_creat;		/* # of page state structs created */
1907bebe46cSjc25722 	fmd_stat_t cache_creat;		/* # of cache state structs created */
191822fb41dStsien 	fmd_stat_t ce_unknown;		/* # of unknown CEs seen */
192822fb41dStsien 	fmd_stat_t ce_interm;		/* # of intermittent CEs seen */
193822fb41dStsien 	fmd_stat_t ce_ppersis;		/* # of possible persistent CEs seen */
194822fb41dStsien 	fmd_stat_t ce_persis;		/* # of persistent CEs seen */
195822fb41dStsien 	fmd_stat_t ce_leaky;		/* # of leaky CEs seen */
196822fb41dStsien 					/* # of possible sticky CEs: */
197822fb41dStsien 	fmd_stat_t ce_psticky_noptnr;		/* - no valid partner test */
198822fb41dStsien 	fmd_stat_t ce_psticky_ptnrnoerr;	/* - partner could not see CE */
199822fb41dStsien 	fmd_stat_t ce_psticky_ptnrclrd;		/* - partner could fix CE */
200822fb41dStsien 	fmd_stat_t ce_sticky;		/* # of sticky CEs seen */
201822fb41dStsien 	fmd_stat_t xxu_ue_match;	/* # of xxUs that matched in a UE $ */
202822fb41dStsien 	fmd_stat_t xxu_retr_flt;	/* # of xxUs unnecessary by fault */
203822fb41dStsien 	fmd_stat_t cpu_migrat;		/* # of CPUs migrated to new version */
204822fb41dStsien 	fmd_stat_t dimm_migrat;		/* # of DIMMs migrated to new version */
205822fb41dStsien 	fmd_stat_t bank_migrat;		/* # of banks migrated to new version */
206d00f0155Sayznaga #ifdef sun4u
207d00f0155Sayznaga 	fmd_stat_t dp_ignored_ce;	/* # of CEs ignored due to DP flt/err */
208d00f0155Sayznaga 	fmd_stat_t dp_ignored_ue;	/* # of UEs ignored due to DP fault */
209d00f0155Sayznaga 	fmd_stat_t dp_deferred_ue;	/* # of UEs deferred due to DP error */
210d00f0155Sayznaga #endif
211fbd1c0daSsd77468 #ifdef sun4v
212fbd1c0daSsd77468 	fmd_stat_t branch_creat;	/* # of branch state structs created */
213fbd1c0daSsd77468 #endif
214822fb41dStsien } cmd_stat_t;
215822fb41dStsien 
216822fb41dStsien typedef struct cmd_serd {
217822fb41dStsien 	const char *cs_name;
218822fb41dStsien 	uint_t cs_n;
219822fb41dStsien 	hrtime_t cs_t;
220822fb41dStsien } cmd_serd_t;
221822fb41dStsien 
222822fb41dStsien typedef struct cmd {
223822fb41dStsien 	cmd_list_t cmd_cpus;		/* List of CPU state structures */
224822fb41dStsien 	cmd_list_t cmd_dimms;		/* List of DIMM state structures */
225822fb41dStsien 	cmd_list_t cmd_banks;		/* List of bank state structures */
226822fb41dStsien 	cmd_list_t cmd_pages;		/* List of page state structures */
227822fb41dStsien 	cmd_list_t cmd_iorxefrx;	/* List of IOxE/RxE/FRx correlation */
228d00f0155Sayznaga #ifdef sun4u
229d00f0155Sayznaga 	cmd_list_t cmd_datapaths;	/* List of datapath state structures */
230d00f0155Sayznaga 	cmd_list_t cmd_deferred_pages;	/* Pages deferred due to a DP error */
231d00f0155Sayznaga #endif
232822fb41dStsien 	hrtime_t cmd_iorxefrx_window;	/* Max int between IOxE/RxE/FRx pairs */
233822fb41dStsien 	cmd_stat_t *cmd_stats;		/* Module statistics */
234822fb41dStsien 	size_t cmd_pagesize;		/* Page size, in bytes */
235822fb41dStsien 	uint64_t cmd_pagemask;		/* Mask for page alignments */
236822fb41dStsien 	char cmd_ecache_dev[MAXPATHLEN]; /* Mem ctrlr drv path for E$ flush */
237822fb41dStsien 	struct cmd_xxcu_trw *cmd_xxcu_trw; /* Array of xxC/U train waiters */
238822fb41dStsien 	size_t cmd_xxcu_ntrw;		/* Number of waiters in array */
239822fb41dStsien 	hrtime_t cmd_xxcu_trdelay;	/* Delay for xxC/U redelivery */
240822fb41dStsien 	cmd_list_t cmd_xxcu_redelivs;	/* Pending xxC/U redeliveries */
241822fb41dStsien 	cmd_serd_t cmd_l2data_serd;	/* Params for L2$ SERD engine */
242822fb41dStsien 	cmd_serd_t cmd_l3data_serd;	/* Params for L3$ SERD engine */
243822fb41dStsien 	uint64_t cmd_thresh_tpct_sysmem; /* Pg ret warning thresh (% of mem) */
244822fb41dStsien 	uint64_t cmd_thresh_abs_sysmem;	/* Pg ret warning thresh (# of pages) */
245822fb41dStsien 	uint64_t cmd_thresh_abs_badrw;	/* Bad r/w retire thresh (# of pages) */
246faff872bStd122701 	cmd_serd_t cmd_miscregs_serd;   /* params for misregs serd */
247050c9ebdStd122701 	cmd_serd_t cmd_dcache_serd;	/* params for dcache serd */
248050c9ebdStd122701 	cmd_serd_t cmd_icache_serd;	/* params for icache serd */
249*d4ac42a1STrang Do 	uint32_t cmd_low_ce_thresh;	/* low ce thershold */
250*d4ac42a1STrang Do 	uint32_t cmd_hi_ce_thresh;	/* hi ce threshold */
251*d4ac42a1STrang Do 	uint32_t cmd_dupce;		/* max 5b CEs */
252*d4ac42a1STrang Do 	uint32_t cmd_nupos;		/* min number of equal upos */
253d00f0155Sayznaga #ifdef sun4u
254d00f0155Sayznaga 	uint16_t cmd_dp_flag;		/* datapath error in progress if set */
255d00f0155Sayznaga #endif
256fbd1c0daSsd77468 #ifdef sun4v
257fbd1c0daSsd77468 	cmd_list_t cmd_branches;	/* List of branches state structures */
258050c9ebdStd122701 	uint64_t cmd_delta_ena;		/* the sun4v train delta ena */
259fbd1c0daSsd77468 #endif
26019d61fc7Stsien 	nvlist_t *cmd_auth;		/* DE's fault authority value */
261822fb41dStsien } cmd_t;
262822fb41dStsien 
263822fb41dStsien extern cmd_t cmd;
264822fb41dStsien 
265822fb41dStsien extern int cmd_set_errno(int);
266822fb41dStsien 
267822fb41dStsien extern void *cmd_buf_read(fmd_hdl_t *, fmd_case_t *, const char *, size_t);
268822fb41dStsien extern void cmd_bufname(char *, size_t, const char *, ...);
269822fb41dStsien extern void cmd_vbufname(char *, size_t, const char *, va_list);
27019d61fc7Stsien extern nvlist_t *cmd_nvl_create_fault(fmd_hdl_t *,
27119d61fc7Stsien     const char *, uint8_t, nvlist_t *, nvlist_t *, nvlist_t *);
272822fb41dStsien 
273822fb41dStsien #ifdef __cplusplus
274822fb41dStsien }
275822fb41dStsien #endif
276822fb41dStsien 
277822fb41dStsien #endif /* _CMD_H */
278