diff options
Diffstat (limited to 'usr/src')
-rw-r--r-- | usr/src/cmd/fm/eversholt/files/i386/i86pc/intel.esc | 38 | ||||
-rw-r--r-- | usr/src/uts/intel/io/intel_nb5000/intel_nbdrv.c | 3 | ||||
-rw-r--r-- | usr/src/uts/intel/io/intel_nb5000/nb5000_init.c | 82 |
3 files changed, 62 insertions, 61 deletions
diff --git a/usr/src/cmd/fm/eversholt/files/i386/i86pc/intel.esc b/usr/src/cmd/fm/eversholt/files/i386/i86pc/intel.esc index 4882814e8e..aad3b4b9ec 100644 --- a/usr/src/cmd/fm/eversholt/files/i386/i86pc/intel.esc +++ b/usr/src/cmd/fm/eversholt/files/i386/i86pc/intel.esc @@ -238,34 +238,15 @@ prop fault.memory.intel.page_ue@ ereport.cpu.intel.nb.mem_ue@motherboard/memory-controller, ereport.cpu.intel.nb.fbd.ma@motherboard/memory-controller; -prop fault.memory.intel.page_ue@ - motherboard/memory-controller/dram-channel/dimm/rank (1)-> - ereport.cpu.intel.nb.mem_ue@motherboard/memory-controller, - ereport.cpu.intel.nb.fbd.ma@motherboard/memory-controller; - -prop fault.memory.intel.page_ue@ - motherboard/memory-controller/dram-channel/dimm/rank (0)-> - EREPORT_BUS_ERROR; - prop fault.memory.intel.dimm_ue@ motherboard/memory-controller/dram-channel<channel_num>/dimm/rank[rank_num] { payloadprop_defined("rank") && rank_num == payloadprop("rank") } (1)-> ereport.cpu.intel.nb.mem_ue@motherboard/memory-controller, ereport.cpu.intel.nb.fbd.ma@motherboard/memory-controller; -prop fault.memory.intel.dimm_ue@ - motherboard/memory-controller/dram-channel/dimm/rank (1)-> - ereport.cpu.intel.nb.mem_ue@motherboard/memory-controller, - ereport.cpu.intel.nb.fbd.ma@motherboard/memory-controller; - -prop fault.memory.intel.dimm_ue@ - motherboard/memory-controller/dram-channel/dimm/rank (0)-> - EREPORT_BUS_ERROR; - event upset.memory.intel.discard@motherboard/memory-controller{within(1s)}; -prop upset.memory.intel.discard@motherboard/memory-controller - { !payloadprop_defined("rank") } (1)-> +prop upset.memory.intel.discard@motherboard/memory-controller (0)-> ereport.cpu.intel.nb.mem_ue@motherboard/memory-controller, ereport.cpu.intel.nb.fbd.ma@motherboard/memory-controller; @@ -442,6 +423,11 @@ prop upset.discard@rank (0)-> EREPORT_BUS_ERROR; #define CPU_MEM_CE_PGFLTS \ (count(stat.ce_pgflt@motherboard/chip/memory-controller/dram-channel/dimm)) +#define SET_RES_OFFSET \ + (!payloadprop_defined("resource[0].hc-specific.offset") || \ + setpayloadprop("asru-offset", \ + payloadprop("resource[0].hc-specific.offset"))) + engine stat.ce_pgflt@motherboard/chip/memory-controller/dram-channel/dimm; event ereport.cpu.intel.quickpath.mem_ue@motherboard/chip/memory-controller @@ -453,9 +439,9 @@ event fault.memory.intel.page_ue@ prop fault.memory.intel.page_ue@ motherboard/chip/memory-controller/dram-channel/dimm/rank - { CONTAINS_RANK && - (payloadprop_defined("physaddr") || payloadprop_defined("offset")) && - SET_ADDR && SET_OFFSET } (1)-> + { CONTAINS_RANK && (payloadprop_defined("physaddr") || + payloadprop_defined("resource[0].hc-specific.offset")) && + SET_ADDR && SET_RES_OFFSET } (1)-> ereport.cpu.intel.quickpath.mem_ue@motherboard/chip/memory-controller; event fault.memory.intel.dimm_ue@ @@ -486,9 +472,9 @@ event fault.memory.intel.page_ce@ prop fault.memory.intel.page_ce@ motherboard/chip/memory-controller/dram-channel/dimm/rank - { CONTAINS_RANK && - (payloadprop_defined("physaddr") || payloadprop_defined("offset")) && - SET_ADDR && SET_OFFSET } (1)-> + { CONTAINS_RANK && (payloadprop_defined("physaddr") || + payloadprop_defined("resource[0].hc-specific.offset")) && + SET_ADDR && SET_RES_OFFSET } (1)-> ereport.cpu.intel.quickpath.mem_ce@motherboard/chip/memory-controller; engine serd.memory.intel.dimm_ce@ diff --git a/usr/src/uts/intel/io/intel_nb5000/intel_nbdrv.c b/usr/src/uts/intel/io/intel_nb5000/intel_nbdrv.c index d91bbb7888..33aa27f187 100644 --- a/usr/src/uts/intel/io/intel_nb5000/intel_nbdrv.c +++ b/usr/src/uts/intel/io/intel_nb5000/intel_nbdrv.c @@ -55,6 +55,7 @@ uint_t inb_mc_snapshotgen; size_t inb_mc_snapshotsz; static dev_info_t *inb_dip; int nb_allow_detach = 0; +int nb_no_smbios; static uint64_t rank_to_base(uint8_t branch, uint8_t rank, uint8_t *interleave, uint64_t *limit, @@ -409,6 +410,8 @@ inb_mc_attach(dev_info_t *dip, ddi_attach_cmd_t cmd) inb_dip = dip; (void) ddi_prop_update_string(DDI_DEV_T_NONE, dip, "model", inb_mc_name()); + nb_no_smbios = ddi_prop_get_int(DDI_DEV_T_ANY, dip, + DDI_PROP_DONTPASS, "no-smbios", 0); nb_pci_cfg_setup(dip); if (nb_dev_init()) { nb_pci_cfg_free(); diff --git a/usr/src/uts/intel/io/intel_nb5000/nb5000_init.c b/usr/src/uts/intel/io/intel_nb5000/nb5000_init.c index 1ac8dd6b87..84e49af166 100644 --- a/usr/src/uts/intel/io/intel_nb5000/nb5000_init.c +++ b/usr/src/uts/intel/io/intel_nb5000/nb5000_init.c @@ -53,7 +53,6 @@ static int nb_sw_scrub_disabled = 0; int nb_5000_memory_controller = 0; int nb_number_memory_controllers = NB_5000_MAX_MEM_CONTROLLERS; int nb_dimms_per_channel = 0; -static int ndimms = 0; nb_dimm_t **nb_dimms; int nb_ndimm; @@ -64,9 +63,13 @@ rank_select_t nb_ranks[NB_5000_MAX_MEM_CONTROLLERS][NB_MAX_MEM_RANK_SELECT]; uint32_t top_of_low_memory; uint8_t spare_rank[NB_5000_MAX_MEM_CONTROLLERS]; +extern int nb_no_smbios; + errorq_t *nb_queue; kmutex_t nb_mutex; +static int nb_dimm_slots; + static uint8_t nb_err0_int; static uint8_t nb_err1_int; static uint8_t nb_err2_int; @@ -242,8 +245,7 @@ nb_fini() dimmp++; } } - kmem_free(nb_dimms, sizeof (nb_dimm_t *) * - nb_number_memory_controllers * 2 * nb_dimms_per_channel); + kmem_free(nb_dimms, sizeof (nb_dimm_t *) * nb_dimm_slots); nb_dimms = NULL; dimm_fini(); } @@ -475,19 +477,6 @@ nb_used_spare_rank(int branch, int bad_rank) } } -/*ARGSUSED*/ -static int -memoryarray(smbios_hdl_t *shp, const smbios_struct_t *sp, void *arg) -{ - smbios_memarray_t ma; - - if (sp->smbstr_type == SMB_TYPE_MEMARRAY && - smbios_info_memarray(shp, sp->smbstr_id, &ma) == 0) { - ndimms += ma.smbma_ndevs; - } - return (0); -} - find_dimm_label_t * find_dimms_per_channel() { @@ -495,10 +484,11 @@ find_dimms_per_channel() smbios_info_t si; smbios_system_t sy; id_t id; - int read_memarray = 1; + int i, j; + uint16_t mtr; find_dimm_label_t *rt = NULL; - if (ksmbios != NULL) { + if (ksmbios != NULL && nb_no_smbios == 0) { if ((id = smbios_info_system(ksmbios, &sy)) != SMB_ERR && smbios_info_common(ksmbios, id, &si) != SMB_ERR) { for (pl = platform_label; pl->sys_vendor; pl++) { @@ -509,21 +499,25 @@ find_dimms_per_channel() strlen(pl->sys_product)) == 0) { nb_dimms_per_channel = pl->dimms_per_channel; - read_memarray = 0; rt = &pl->dimm_label; break; } } } - if (read_memarray) - (void) smbios_iter(ksmbios, memoryarray, 0); } if (nb_dimms_per_channel == 0) { - if (ndimms) { - nb_dimms_per_channel = ndimms / - (nb_number_memory_controllers * 2); - } else { - nb_dimms_per_channel = NB_MAX_DIMMS_PER_CHANNEL; + /* + * Scan all memory channels if we find a channel which has more + * dimms then we have seen before set nb_dimms_per_channel to + * the number of dimms on the channel + */ + for (i = 0; i < nb_number_memory_controllers; i++) { + for (j = nb_dimms_per_channel; + j < NB_MAX_DIMMS_PER_CHANNEL; j++) { + mtr = MTR_RD(i, j); + if (MTR_PRESENT(mtr)) + nb_dimms_per_channel = j + 1; + } } } return (rt); @@ -537,13 +531,29 @@ dimm_label(smbios_hdl_t *shp, const smbios_struct_t *sp, void *arg) smbios_memdevice_t md; if (sp->smbstr_type == SMB_TYPE_MEMDEVICE) { + if (*dimmpp >= &nb_dimms[nb_dimm_slots]) + return (-1); dimmp = **dimmpp; - if (dimmp && smbios_info_memdevice(shp, sp->smbstr_id, - &md) == 0 && md.smbmd_dloc != NULL) { - (void) snprintf(dimmp->label, - sizeof (dimmp->label), "%s", md.smbmd_dloc); + if (smbios_info_memdevice(shp, sp->smbstr_id, &md) == 0 && + md.smbmd_dloc != NULL) { + if (md.smbmd_size) { + /* + * if there is no physical dimm for this smbios + * record it is because this system has less + * physical slots than the controller supports + * so skip empty slots to find the slot this + * smbios record belongs too + */ + while (dimmp == NULL) { + if (*dimmpp >= &nb_dimms[nb_dimm_slots]) + return (-1); + dimmp = *(++(*dimmpp)); + } + (void) snprintf(dimmp->label, + sizeof (dimmp->label), "%s", md.smbmd_dloc); + (*dimmpp)++; + } } - (*dimmpp)++; } return (0); } @@ -553,7 +563,7 @@ nb_smbios() { nb_dimm_t **dimmpp; - if (ksmbios != NULL) { + if (ksmbios != NULL && nb_no_smbios == 0) { dimmpp = nb_dimms; (void) smbios_iter(ksmbios, dimm_label, &dimmpp); } @@ -586,8 +596,9 @@ nb_dimms_init(find_dimm_label_t *label_function) nb_mode = NB_MEMORY_MIRROR; else nb_mode = NB_MEMORY_NORMAL; + nb_dimm_slots = nb_number_memory_controllers * 2 * nb_dimms_per_channel; nb_dimms = (nb_dimm_t **)kmem_zalloc(sizeof (nb_dimm_t *) * - nb_number_memory_controllers * 2 * nb_dimms_per_channel, KM_SLEEP); + nb_dimm_slots, KM_SLEEP); dimmpp = nb_dimms; for (i = 0; i < nb_number_memory_controllers; i++) { if (nb_mode == NB_MEMORY_NORMAL) { @@ -1193,11 +1204,13 @@ nb_dev_reinit() nb_dimm_t **old_nb_dimms; int old_nb_dimms_per_channel; find_dimm_label_t *label_function_p; + int dimm_slot = nb_dimm_slots; old_nb_dimms = nb_dimms; old_nb_dimms_per_channel = nb_dimms_per_channel; dimm_fini(); + nb_dimms_per_channel = 0; label_function_p = find_dimms_per_channel(); dimm_init(); nb_dimms_init(label_function_p); @@ -1220,8 +1233,7 @@ nb_dev_reinit() dimmp++; } } - kmem_free(old_nb_dimms, sizeof (nb_dimm_t *) * - nb_number_memory_controllers * 2 * old_nb_dimms_per_channel); + kmem_free(old_nb_dimms, sizeof (nb_dimm_t *) * dimm_slot); } void |