summaryrefslogtreecommitdiff
path: root/usr/src
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src')
-rw-r--r--usr/src/cmd/fm/eversholt/files/i386/i86pc/intel.esc38
-rw-r--r--usr/src/uts/intel/io/intel_nb5000/intel_nbdrv.c3
-rw-r--r--usr/src/uts/intel/io/intel_nb5000/nb5000_init.c82
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