aboutsummaryrefslogtreecommitdiff
path: root/src/northbridge/intel/sandybridge/raminit.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/northbridge/intel/sandybridge/raminit.c')
-rw-r--r--src/northbridge/intel/sandybridge/raminit.c12
1 files changed, 12 insertions, 0 deletions
diff --git a/src/northbridge/intel/sandybridge/raminit.c b/src/northbridge/intel/sandybridge/raminit.c
index a938a49172..e138756d9b 100644
--- a/src/northbridge/intel/sandybridge/raminit.c
+++ b/src/northbridge/intel/sandybridge/raminit.c
@@ -102,6 +102,7 @@ static void dram_find_spds_ddr3(spd_raw_data *spd, ramctr_timing *ctrl)
{
int dimms = 0, ch_dimms;
int channel, slot, spd_slot;
+ bool can_use_ecc = ctrl->ecc_supported;
dimm_info *dimm = &ctrl->info;
memset (ctrl->rankmap, 0, sizeof(ctrl->rankmap));
@@ -173,6 +174,9 @@ static void dram_find_spds_ddr3(spd_raw_data *spd, ramctr_timing *ctrl)
ctrl->channel_size_mb[channel] += dimm->dimm[channel][slot].size_mb;
+ if (!dimm->dimm[channel][slot].flags.is_ecc)
+ can_use_ecc = false;
+
ctrl->auto_self_refresh &= dimm->dimm[channel][slot].flags.asr;
ctrl->extended_temperature_range &=
@@ -204,6 +208,14 @@ static void dram_find_spds_ddr3(spd_raw_data *spd, ramctr_timing *ctrl)
}
}
+ if (ctrl->ecc_forced || CONFIG(RAMINIT_ENABLE_ECC))
+ ctrl->ecc_enabled = can_use_ecc;
+ if (ctrl->ecc_forced && !ctrl->ecc_enabled)
+ die("ECC mode forced but non-ECC DIMM installed!");
+ printk(BIOS_DEBUG, "ECC is %s\n", ctrl->ecc_enabled ? "enabled" : "disabled");
+
+ ctrl->lanes = ctrl->ecc_enabled ? 9 : 8;
+
if (!dimms)
die("No DIMMs were found");
}