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