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 /* 23 * Copyright 2008 Sun Microsystems, Inc. All rights reserved. 24 * Use is subject to license terms. 25 */ 26 27 #ifndef _NB_LOG_H 28 #define _NB_LOG_H 29 30 #ifdef __cplusplus 31 extern "C" { 32 #endif 33 34 #include <sys/cpu_module.h> 35 #include "nb5000.h" 36 37 #define NB_MAX_ERRORS 4 38 39 /* North Bridge front side bus error registers */ 40 41 typedef struct nb_fsb_regs { 42 uint8_t fsb; /* cpu slot */ 43 uint8_t ferr_fat_fsb; 44 uint8_t nerr_fat_fsb; 45 uint8_t ferr_nf_fsb; 46 uint8_t nerr_nf_fsb; 47 uint64_t nrecfsb_addr; 48 uint32_t nrecfsb; 49 uint32_t recfsb; 50 } nb_fsb_regs_t; 51 52 /* PCI express ESI (South Bridge) error registers */ 53 54 typedef struct nb_pex_regs { 55 uint8_t pex; /* pci express slot */ 56 uint32_t pex_fat_ferr; 57 uint32_t pex_fat_nerr; 58 uint32_t pex_nf_corr_ferr; 59 uint32_t pex_nf_corr_nerr; 60 uint32_t uncerrsev; /* uncorrectable error severity */ 61 uint32_t rperrsts; /* root error status */ 62 uint32_t rperrsid; /* error source identification */ 63 uint32_t uncerrsts; /* uncorrectable error status */ 64 uint32_t aerrcapctrl; /* advanced error capabilities and control */ 65 uint32_t corerrsts; /* correctable error status */ 66 uint16_t pexdevsts; /* pci express device status */ 67 } nb_pex_regs_t; 68 69 /* North Bridge memory controller hub internal error registers */ 70 71 typedef struct nb_int { 72 uint16_t ferr_fat_int; /* first fatal error */ 73 uint16_t ferr_nf_int; /* first non-fatal error */ 74 uint16_t nerr_fat_int; /* next fatal error */ 75 uint16_t nerr_nf_int; /* next non-fatal error */ 76 uint32_t nrecint; /* non recoverable error log */ 77 uint32_t recint; /* recoverable error log */ 78 uint64_t nrecsf; /* non recoverable control information */ 79 uint64_t recsf; /* recoverable control information */ 80 } nb_int_t; 81 82 /* memory errors */ 83 84 typedef struct nb_fat_fbd { 85 uint32_t ferr_fat_fbd; /* fb-dimm first fatal error */ 86 uint32_t nerr_fat_fbd; /* fb-dimm next fatal error */ 87 uint32_t nrecmema; /* non recoverable memory error log */ 88 uint32_t nrecmemb; /* non recoverable memory error log */ 89 uint32_t nrecfglog; /* non recoverable dimm configuration */ 90 uint32_t nrecfbda; /* non recoverable dimm log A */ 91 uint32_t nrecfbdb; /* non recoverable dimm log B */ 92 uint32_t nrecfbdc; /* non recoverable dimm log C */ 93 uint32_t nrecfbdd; /* non recoverable dimm log D */ 94 uint32_t nrecfbde; /* non recoverable dimm log E */ 95 uint32_t nrecfbdf; /* non recoverable dimm log F */ 96 uint32_t spcpc; /* spare copy control */ 97 uint8_t spcps; /* spare copy status */ 98 uint32_t uerrcnt; /* uncorrectable error count */ 99 uint32_t uerrcnt_last; /* saved copy of uncorrectable error count */ 100 uint32_t badrama; /* bad dram marker A */ 101 uint16_t badramb; /* bad dram marker B */ 102 uint32_t badcnt; /* bad dram counter */ 103 } nb_fat_fbd_t; 104 105 typedef struct nb_nf_fbd { 106 uint32_t ferr_nf_fbd; /* fb-dimm first non-fatal error */ 107 uint32_t nerr_nf_fbd; /* fb-dimm next non-fatal error */ 108 uint32_t redmemb; /* recoverable dimm data error log */ 109 uint32_t recmema; /* recoverable memory error log A */ 110 uint32_t recmemb; /* recoverable memory error log B */ 111 uint32_t recfglog; /* recoverable dimm configuration */ 112 uint32_t recfbda; /* recoverable dimm log A */ 113 uint32_t recfbdb; /* recoverable dimm log B */ 114 uint32_t recfbdc; /* recoverable dimm log C */ 115 uint32_t recfbdd; /* recoverable dimm log D */ 116 uint32_t recfbde; /* recoverable dimm log E */ 117 uint32_t recfbdf; /* recoverable dimm log F */ 118 uint32_t spcpc; /* spare copy control */ 119 uint8_t spcps; /* spare copy status */ 120 uint32_t cerrcnta; /* correctable error count A */ 121 uint32_t cerrcntb; /* correctable error count B */ 122 uint32_t cerrcntc; /* correctable error count C */ 123 uint32_t cerrcntd; /* correctable error count D */ 124 uint32_t cerrcnta_last; /* saved copy of correctable error count A */ 125 uint32_t cerrcntb_last; /* saved copy of correctable error count B */ 126 uint32_t cerrcntc_last; /* saved copy of correctable error count C */ 127 uint32_t cerrcntd_last; /* saved copy of correctable error count D */ 128 uint32_t badrama; /* bad dram marker A */ 129 uint16_t badramb; /* bad dram marker B */ 130 uint32_t badcnt; /* bad dram counter */ 131 } nb_nf_fbd_t; 132 133 typedef struct nb_dma { 134 uint16_t pcists; 135 uint16_t pexdevsts; 136 } nb_dma_t; 137 138 typedef struct nb_thr { 139 uint8_t ferr_fat_thr; 140 uint8_t ferr_nf_thr; 141 uint8_t nerr_fat_thr; 142 uint8_t nerr_nf_thr; 143 uint8_t ctsts; 144 uint16_t thrtsts; 145 } nb_thr_t; 146 147 typedef struct nb_regs { 148 int flag; 149 uint32_t chipset; 150 uint64_t ferr; 151 uint32_t nerr; 152 union { 153 nb_fsb_regs_t fsb_regs; 154 nb_pex_regs_t pex_regs; 155 nb_int_t int_regs; 156 nb_fat_fbd_t fat_fbd_regs; 157 nb_nf_fbd_t nf_fbd_regs; 158 nb_dma_t dma_regs; 159 nb_thr_t thr_regs; 160 } nb; 161 } nb_regs_t; 162 163 #define NB_REG_LOG_FREE 0 164 #define NB_REG_LOG_FSB 1 165 #define NB_REG_LOG_PEX 2 166 #define NB_REG_LOG_INT 3 167 #define NB_REG_LOG_FAT_FBD 4 168 #define NB_REG_LOG_NF_FBD 5 169 #define NB_REG_LOG_DMA 6 170 #define NB_REG_LOG_THR 7 171 172 typedef struct nb_logout { 173 uint64_t acl_timestamp; 174 char *type; 175 nb_regs_t nb_regs; 176 } nb_logout_t; 177 178 typedef struct nb_mem_scatchpad { 179 int intel_error_list; /* error number in Chipset Error List */ 180 int branch; 181 int channel; 182 int rank; 183 int dimm; 184 int bank; 185 int cas; 186 int ras; 187 uint64_t offset; 188 uint64_t pa; 189 } nb_mem_scatchpad_t; 190 191 typedef union nb_scatchpad { 192 nb_mem_scatchpad_t ms; 193 int intel_error_list; /* error number in Chipset Error List */ 194 } nb_scatchpad_t; 195 196 typedef struct nb_dimm { 197 uint64_t dimm_size; 198 uint8_t mtr_present; 199 uint8_t nranks; 200 uint8_t nbanks; 201 uint8_t ncolumn; 202 uint8_t nrow; 203 uint8_t width; 204 uint8_t manufacture_location; 205 uint8_t manufacture_week; 206 uint8_t manufacture_year; /* years from 2000 */ 207 uint16_t manufacture_id; 208 uint32_t serial_number; 209 char part_number[16]; 210 char revision[2]; 211 char label[64]; 212 } nb_dimm_t; 213 214 typedef struct bank_select { 215 uint64_t base; 216 uint64_t limit; 217 uint8_t way[2]; 218 } bank_select_t; 219 220 typedef struct rank_select { 221 uint64_t base; 222 uint64_t limit; 223 uint32_t hole_base; 224 uint32_t hole_size; 225 uint8_t rank[4]; 226 uint8_t interleave; 227 uint8_t branch_interleave; 228 } rank_select_t; 229 230 enum nb_memory_mode { NB_MEMORY_SINGLE_CHANNEL, NB_MEMORY_NORMAL, 231 NB_MEMORY_SPARE_RANK, NB_MEMORY_MIRROR }; 232 233 extern int nb_5000_memory_controller; 234 extern int nb_number_memory_controllers; 235 extern int nb_dimms_per_channel; 236 237 extern nb_dimm_t **nb_dimms; 238 extern uint32_t nb_chipset; 239 240 extern int nb_init(void); 241 extern int nb_dev_init(void); 242 extern void nb_dev_reinit(void); 243 extern void nb_unload(void); 244 extern void nb_dev_unload(void); 245 extern uint32_t top_of_low_memory; 246 extern bank_select_t nb_banks[NB_MAX_MEM_BRANCH_SELECT]; 247 extern rank_select_t nb_ranks[NB_5000_MAX_MEM_CONTROLLERS] 248 [NB_MAX_MEM_RANK_SELECT]; 249 extern uint8_t spare_rank[NB_5000_MAX_MEM_CONTROLLERS]; 250 extern enum nb_memory_mode nb_mode; 251 252 extern int inb_mc_register(cmi_hdl_t, void *, void *, void *); 253 extern void nb_scrubber_enable(void); 254 extern void nb_error_trap(cmi_hdl_t, boolean_t, boolean_t); 255 256 extern void nb_pci_cfg_setup(dev_info_t *); 257 extern void nb_pci_cfg_free(void); 258 259 extern void *ras_regs; 260 261 extern uint8_t nb_pci_getb(int, int, int, int, int *); 262 extern uint16_t nb_pci_getw(int, int, int, int, int *); 263 extern uint32_t nb_pci_getl(int, int, int, int, int *); 264 extern void nb_pci_putb(int, int, int, int, uint8_t); 265 extern void nb_pci_putw(int, int, int, int, uint16_t); 266 extern void nb_pci_putl(int, int, int, int, uint32_t); 267 268 extern void nb_fsb_mask_mc(int, uint16_t); 269 extern void nb_fbd_mask_mc(uint32_t); 270 extern void nb_int_mask_mc(uint32_t); 271 extern void nb_thr_mask_mc(uint16_t); 272 extern void nb_mask_mc_reset(void); 273 274 extern int nb_mask_mc_set; 275 276 extern errorq_t *nb_queue; 277 extern kmutex_t nb_mutex; 278 279 extern void nb_drain(void *, const void *, const errorq_elem_t *); 280 extern void nb_used_spare_rank(int, int); 281 282 extern uint_t nb_config_gen; 283 284 #ifdef __cplusplus 285 } 286 #endif 287 288 #endif /* _NB_LOG_H */ 289