|
|
@@ -3101,12 +3101,15 @@ static bool ecc_enabled(struct pci_dev *F3, u16 nid)
|
|
|
static inline void
|
|
|
f17h_determine_edac_ctl_cap(struct mem_ctl_info *mci, struct amd64_pvt *pvt)
|
|
|
{
|
|
|
- u8 i, ecc_en = 1, cpk_en = 1;
|
|
|
+ u8 i, ecc_en = 1, cpk_en = 1, dev_x4 = 1, dev_x16 = 1;
|
|
|
|
|
|
for (i = 0; i < NUM_UMCS; i++) {
|
|
|
if (pvt->umc[i].sdp_ctrl & UMC_SDP_INIT) {
|
|
|
ecc_en &= !!(pvt->umc[i].umc_cap_hi & UMC_ECC_ENABLED);
|
|
|
cpk_en &= !!(pvt->umc[i].umc_cap_hi & UMC_ECC_CHIPKILL_CAP);
|
|
|
+
|
|
|
+ dev_x4 &= !!(pvt->umc[i].dimm_cfg & BIT(6));
|
|
|
+ dev_x16 &= !!(pvt->umc[i].dimm_cfg & BIT(7));
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -3114,8 +3117,15 @@ f17h_determine_edac_ctl_cap(struct mem_ctl_info *mci, struct amd64_pvt *pvt)
|
|
|
if (ecc_en) {
|
|
|
mci->edac_ctl_cap |= EDAC_FLAG_SECDED;
|
|
|
|
|
|
- if (cpk_en)
|
|
|
+ if (!cpk_en)
|
|
|
+ return;
|
|
|
+
|
|
|
+ if (dev_x4)
|
|
|
mci->edac_ctl_cap |= EDAC_FLAG_S4ECD4ED;
|
|
|
+ else if (dev_x16)
|
|
|
+ mci->edac_ctl_cap |= EDAC_FLAG_S16ECD16ED;
|
|
|
+ else
|
|
|
+ mci->edac_ctl_cap |= EDAC_FLAG_S8ECD8ED;
|
|
|
}
|
|
|
}
|
|
|
|