diff options
Diffstat (limited to 'drivers/edac')
-rw-r--r-- | drivers/edac/i82875p_edac.c | 29 |
1 files changed, 21 insertions, 8 deletions
diff --git a/drivers/edac/i82875p_edac.c b/drivers/edac/i82875p_edac.c index e16281b41f3b..89ca38a779a3 100644 --- a/drivers/edac/i82875p_edac.c +++ b/drivers/edac/i82875p_edac.c | |||
@@ -38,7 +38,8 @@ | |||
38 | #endif /* PCI_DEVICE_ID_INTEL_82875_6 */ | 38 | #endif /* PCI_DEVICE_ID_INTEL_82875_6 */ |
39 | 39 | ||
40 | /* four csrows in dual channel, eight in single channel */ | 40 | /* four csrows in dual channel, eight in single channel */ |
41 | #define I82875P_NR_CSROWS(nr_chans) (8/(nr_chans)) | 41 | #define I82875P_NR_DIMMS 8 |
42 | #define I82875P_NR_CSROWS(nr_chans) (I82875P_NR_DIMMS / (nr_chans)) | ||
42 | 43 | ||
43 | /* Intel 82875p register addresses - device 0 function 0 - DRAM Controller */ | 44 | /* Intel 82875p register addresses - device 0 function 0 - DRAM Controller */ |
44 | #define I82875P_EAP 0x58 /* Error Address Pointer (32b) | 45 | #define I82875P_EAP 0x58 /* Error Address Pointer (32b) |
@@ -235,7 +236,9 @@ static int i82875p_process_error_info(struct mem_ctl_info *mci, | |||
235 | return 1; | 236 | return 1; |
236 | 237 | ||
237 | if ((info->errsts ^ info->errsts2) & 0x0081) { | 238 | if ((info->errsts ^ info->errsts2) & 0x0081) { |
238 | edac_mc_handle_ce_no_info(mci, "UE overwrote CE"); | 239 | edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, 0, 0, 0, |
240 | -1, -1, -1, | ||
241 | "UE overwrote CE", "", NULL); | ||
239 | info->errsts = info->errsts2; | 242 | info->errsts = info->errsts2; |
240 | } | 243 | } |
241 | 244 | ||
@@ -243,11 +246,15 @@ static int i82875p_process_error_info(struct mem_ctl_info *mci, | |||
243 | row = edac_mc_find_csrow_by_page(mci, info->eap); | 246 | row = edac_mc_find_csrow_by_page(mci, info->eap); |
244 | 247 | ||
245 | if (info->errsts & 0x0080) | 248 | if (info->errsts & 0x0080) |
246 | edac_mc_handle_ue(mci, info->eap, 0, row, "i82875p UE"); | 249 | edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, |
250 | info->eap, 0, 0, | ||
251 | row, -1, -1, | ||
252 | "i82875p UE", "", NULL); | ||
247 | else | 253 | else |
248 | edac_mc_handle_ce(mci, info->eap, 0, info->derrsyn, row, | 254 | edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, |
249 | multi_chan ? (info->des & 0x1) : 0, | 255 | info->eap, 0, info->derrsyn, |
250 | "i82875p CE"); | 256 | row, multi_chan ? (info->des & 0x1) : 0, |
257 | -1, "i82875p CE", "", NULL); | ||
251 | 258 | ||
252 | return 1; | 259 | return 1; |
253 | } | 260 | } |
@@ -390,6 +397,7 @@ static int i82875p_probe1(struct pci_dev *pdev, int dev_idx) | |||
390 | { | 397 | { |
391 | int rc = -ENODEV; | 398 | int rc = -ENODEV; |
392 | struct mem_ctl_info *mci; | 399 | struct mem_ctl_info *mci; |
400 | struct edac_mc_layer layers[2]; | ||
393 | struct i82875p_pvt *pvt; | 401 | struct i82875p_pvt *pvt; |
394 | struct pci_dev *ovrfl_pdev; | 402 | struct pci_dev *ovrfl_pdev; |
395 | void __iomem *ovrfl_window; | 403 | void __iomem *ovrfl_window; |
@@ -405,9 +413,14 @@ static int i82875p_probe1(struct pci_dev *pdev, int dev_idx) | |||
405 | return -ENODEV; | 413 | return -ENODEV; |
406 | drc = readl(ovrfl_window + I82875P_DRC); | 414 | drc = readl(ovrfl_window + I82875P_DRC); |
407 | nr_chans = dual_channel_active(drc) + 1; | 415 | nr_chans = dual_channel_active(drc) + 1; |
408 | mci = edac_mc_alloc(sizeof(*pvt), I82875P_NR_CSROWS(nr_chans), | ||
409 | nr_chans, 0); | ||
410 | 416 | ||
417 | layers[0].type = EDAC_MC_LAYER_CHIP_SELECT; | ||
418 | layers[0].size = I82875P_NR_CSROWS(nr_chans); | ||
419 | layers[0].is_virt_csrow = true; | ||
420 | layers[1].type = EDAC_MC_LAYER_CHANNEL; | ||
421 | layers[1].size = nr_chans; | ||
422 | layers[1].is_virt_csrow = false; | ||
423 | mci = new_edac_mc_alloc(0, ARRAY_SIZE(layers), layers, sizeof(*pvt)); | ||
411 | if (!mci) { | 424 | if (!mci) { |
412 | rc = -ENOMEM; | 425 | rc = -ENOMEM; |
413 | goto fail0; | 426 | goto fail0; |