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