Mercurial > illumos > illumos-gate
changeset 10668:e0d0c98c8bae
6872640 intel_nb5000 chipset driver puts unused bit 22 into the mcerr_fbd register
6877601 supermicro X7DCL-i with chipset 5100 panic at boot time
author | Vuong Nguyen <Vuong.Nguyen@Sun.COM> |
---|---|
date | Mon, 28 Sep 2009 13:33:49 -0400 |
parents | bc413e63c72c |
children | ccf9f7e81ff9 |
files | usr/src/uts/intel/io/intel_nb5000/nb5000.h usr/src/uts/intel/io/intel_nb5000/nb5000_init.c |
diffstat | 2 files changed, 42 insertions(+), 13 deletions(-) [+] |
line wrap: on
line diff
--- a/usr/src/uts/intel/io/intel_nb5000/nb5000.h Mon Sep 28 16:13:05 2009 +0100 +++ b/usr/src/uts/intel/io/intel_nb5000/nb5000.h Mon Sep 28 13:33:49 2009 -0400 @@ -319,7 +319,7 @@ #define EMASK_5000_FBD_RES (EMASK_FBD_M24|EMASK_FBD_M16) #define EMASK_FBD_RES (nb_chipset == INTEL_NB_5400 ? 0 : EMASK_5000_FBD_RES) -#define EMASK_FBD_FATAL (EMASK_FBD_M23|EMASK_FBD_M3|EMASK_FBD_M2|EMASK_FBD_M1) +#define EMASK_FBD_FATAL (EMASK_FBD_M3|EMASK_FBD_M2|EMASK_FBD_M1) #define EMASK_FBD_NF (EMASK_FBD_M28|EMASK_FBD_M27|EMASK_FBD_M26|EMASK_FBD_M25| \ EMASK_FBD_M22|EMASK_FBD_M21|EMASK_FBD_M20|EMASK_FBD_M19|EMASK_FBD_M18| \ EMASK_FBD_M17|EMASK_FBD_M15|EMASK_FBD_M14|EMASK_FBD_M13|EMASK_FBD_M12| \ @@ -332,6 +332,9 @@ EMASK_FBD_M15|EMASK_FBD_M14|EMASK_FBD_M13|EMASK_FBD_M12| \ EMASK_FBD_M11|EMASK_FBD_M10|EMASK_FBD_M9|EMASK_FBD_M8|EMASK_FBD_M7| \ EMASK_FBD_M6|EMASK_FBD_M5|EMASK_FBD_M4) +#define EMASK_7300_FBD_FATAL (EMASK_FBD_M23|EMASK_FBD_M3|EMASK_FBD_M2| \ + EMASK_FBD_M1) +#define EMASK_7300_FBD_NF EMASK_FBD_NF /* FERR_NF_MEM: MC First non-fatal errors */ #define ERR_MEM_CH_SHIFT 28 /* channel index in nf_mem */ @@ -429,8 +432,10 @@ #define EMASK_INT_B2 0x02 /* B2Msk Multi-tag hit SF */ #define EMASK_INT_B1 0x01 /* B1Msk DM parity error */ -/* MCH 5000 errata 2 */ +/* MCH 5000 errata 2: disable B1 */ #define EMASK_INT_5000 EMASK_INT_B1 +/* MCH 5100: mask all except B3 and B5 */ +#define EMASK_INT_5100 (~(EMASK_INT_B5|EMASK_INT_B3) & 0xff) /* MCH 7300 errata 17 & 20 */ #define EMASK_INT_7300 (EMASK_INT_B3|EMASK_INT_B1) /* MCH 7300 errata 17,20 & 21 */ @@ -440,6 +445,9 @@ #define EMASK_INT_FATAL (EMASK_INT_B7|EMASK_INT_B4|EMASK_INT_B3|EMASK_INT_B2| \ EMASK_INT_B1) #define EMASK_INT_NF (EMASK_INT_B8|EMASK_INT_B6|EMASK_INT_B5) +#define EMASK_INT_5100_FATAL (EMASK_INT_B3|EMASK_INT_B1) +#define EMASK_INT_5100_NF (EMASK_INT_B5) + #define GE_FBD_FATAL ((nb_chipset == INTEL_NB_5400) ? GE_FERR_FBD_FATAL : \ (nb_chipset == INTEL_NB_5100) ? 0 : \ (GE_FERR_FBD0_FATAL|GE_FERR_FBD1_FATAL|GE_FERR_FBD2_FATAL| \
--- a/usr/src/uts/intel/io/intel_nb5000/nb5000_init.c Mon Sep 28 16:13:05 2009 +0100 +++ b/usr/src/uts/intel/io/intel_nb5000/nb5000_init.c Mon Sep 28 13:33:49 2009 -0400 @@ -120,6 +120,8 @@ uint_t nb5000_mask_bios_fbd = EMASK_FBD_FATAL; uint_t nb5400_mask_poll_fbd = EMASK_5400_FBD_NF; uint_t nb5400_mask_bios_fbd = EMASK_5400_FBD_FATAL; +uint_t nb7300_mask_poll_fbd = EMASK_7300_FBD_NF; +uint_t nb7300_mask_bios_fbd = EMASK_7300_FBD_FATAL; int nb5100_reset_emask_mem = 1; uint_t nb5100_mask_poll_mem = EMASK_MEM_NF; @@ -129,6 +131,7 @@ uint_t nb5000_mask_poll_fsb = EMASK_FSB_NF; uint_t nb5000_mask_bios_fsb = EMASK_FSB_FATAL; +uint_t nb5100_emask_int = EMASK_INT_5100; uint_t nb5400_emask_int = EMASK_INT_5400; uint_t nb7300_emask_int = EMASK_INT_7300; @@ -137,6 +140,8 @@ int nb5000_reset_emask_int = 1; uint_t nb5000_mask_poll_int = EMASK_INT_NF; uint_t nb5000_mask_bios_int = EMASK_INT_FATAL; +uint_t nb5100_mask_poll_int = EMASK_INT_5100_NF; +uint_t nb5100_mask_bios_int = EMASK_INT_5100_FATAL; uint_t nb_mask_poll_thr = EMASK_THR_NF; uint_t nb_mask_bios_thr = EMASK_THR_FATAL; @@ -970,8 +975,17 @@ uint32_t err2_int; uint32_t mcerr_int; uint32_t emask_int; + uint32_t nb_mask_bios_int; + uint32_t nb_mask_poll_int; uint16_t stepping; + if (nb_chipset == INTEL_NB_5100) { + nb_mask_bios_int = nb5100_mask_bios_int; + nb_mask_poll_int = nb5100_mask_poll_int; + } else { + nb_mask_bios_int = nb5000_mask_bios_int; + nb_mask_poll_int = nb5000_mask_poll_int; + } err0_int = ERR0_INT_RD(); err1_int = ERR1_INT_RD(); err2_int = ERR2_INT_RD(); @@ -990,12 +1004,12 @@ MCERR_INT_WR(ERR_INT_ALL); EMASK_INT_WR(ERR_INT_ALL); - mcerr_int &= ~nb5000_mask_bios_int; - mcerr_int |= nb5000_mask_bios_int & (~err0_int | ~err1_int | ~err2_int); - mcerr_int |= nb5000_mask_poll_int; - err0_int |= nb5000_mask_poll_int; - err1_int |= nb5000_mask_poll_int; - err2_int |= nb5000_mask_poll_int; + mcerr_int &= ~nb_mask_bios_int; + mcerr_int |= nb_mask_bios_int & (~err0_int | ~err1_int | ~err2_int); + mcerr_int |= nb_mask_poll_int; + err0_int |= nb_mask_poll_int; + err1_int |= nb_mask_poll_int; + err2_int |= nb_mask_poll_int; l_mcerr_int = mcerr_int; ERR0_INT_WR(err0_int); @@ -1012,6 +1026,8 @@ } else if (nb_chipset == INTEL_NB_5400) { EMASK_5400_INT_WR(nb5400_emask_int | (emask_int & EMASK_INT_RES)); + } else if (nb_chipset == INTEL_NB_5100) { + EMASK_5000_INT_WR(nb5100_emask_int); } else { EMASK_5000_INT_WR(nb5000_emask_int); } @@ -1077,11 +1093,16 @@ MCERR_FBD_WR(0xffffffff); EMASK_FBD_WR(0xffffffff); - if (nb_chipset == INTEL_NB_7300 && nb_mode == NB_MEMORY_MIRROR) { - /* MCH 7300 errata 34 */ - emask_bios_fbd = nb5000_mask_bios_fbd & ~EMASK_FBD_M23; - emask_poll_fbd = nb5000_mask_poll_fbd; - mcerr_fbd |= EMASK_FBD_M23; + if (nb_chipset == INTEL_NB_7300) { + if (nb_mode == NB_MEMORY_MIRROR) { + /* MCH 7300 errata 34 */ + emask_bios_fbd = nb7300_mask_bios_fbd & ~EMASK_FBD_M23; + emask_poll_fbd = nb7300_mask_poll_fbd; + mcerr_fbd |= EMASK_FBD_M23; + } else { + emask_bios_fbd = nb7300_mask_bios_fbd; + emask_poll_fbd = nb7300_mask_poll_fbd; + } } else if (nb_chipset == INTEL_NB_5400) { emask_bios_fbd = nb5400_mask_bios_fbd; emask_poll_fbd = nb5400_mask_poll_fbd;