diff options
author | H. Peter Anvin <hpa@zytor.com> | 2012-05-30 15:11:26 -0400 |
---|---|---|
committer | H. Peter Anvin <hpa@zytor.com> | 2012-05-30 15:11:32 -0400 |
commit | bbd771474ec44b516107685d77e1c80bbe09f141 (patch) | |
tree | 0cb15781539a68f27b4ea6c89f827282630cbce6 /drivers/edac/i82875p_edac.c | |
parent | 403e1c5b7495d7b80fae9fc4d0a7a6f5abdc3307 (diff) | |
parent | 319b6ffc6df892e4ccffff823cc5521a4a5d2dca (diff) |
Merge branch 'x86/trampoline' into x86/urgent
x86/trampoline contains an urgent commit which is necessarily on a
newer baseline.
Signed-off-by: H. Peter Anvin <hpa@zytor.com>
Diffstat (limited to 'drivers/edac/i82875p_edac.c')
-rw-r--r-- | drivers/edac/i82875p_edac.c | 51 |
1 files changed, 36 insertions, 15 deletions
diff --git a/drivers/edac/i82875p_edac.c b/drivers/edac/i82875p_edac.c index 10f15d85fb5e..b613e31c16e5 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 | } |
@@ -342,11 +349,13 @@ static void i82875p_init_csrows(struct mem_ctl_info *mci, | |||
342 | void __iomem * ovrfl_window, u32 drc) | 349 | void __iomem * ovrfl_window, u32 drc) |
343 | { | 350 | { |
344 | struct csrow_info *csrow; | 351 | struct csrow_info *csrow; |
352 | struct dimm_info *dimm; | ||
353 | unsigned nr_chans = dual_channel_active(drc) + 1; | ||
345 | unsigned long last_cumul_size; | 354 | unsigned long last_cumul_size; |
346 | u8 value; | 355 | u8 value; |
347 | u32 drc_ddim; /* DRAM Data Integrity Mode 0=none,2=edac */ | 356 | u32 drc_ddim; /* DRAM Data Integrity Mode 0=none,2=edac */ |
348 | u32 cumul_size; | 357 | u32 cumul_size, nr_pages; |
349 | int index; | 358 | int index, j; |
350 | 359 | ||
351 | drc_ddim = (drc >> 18) & 0x1; | 360 | drc_ddim = (drc >> 18) & 0x1; |
352 | last_cumul_size = 0; | 361 | last_cumul_size = 0; |
@@ -369,12 +378,18 @@ static void i82875p_init_csrows(struct mem_ctl_info *mci, | |||
369 | 378 | ||
370 | csrow->first_page = last_cumul_size; | 379 | csrow->first_page = last_cumul_size; |
371 | csrow->last_page = cumul_size - 1; | 380 | csrow->last_page = cumul_size - 1; |
372 | csrow->nr_pages = cumul_size - last_cumul_size; | 381 | nr_pages = cumul_size - last_cumul_size; |
373 | last_cumul_size = cumul_size; | 382 | last_cumul_size = cumul_size; |
374 | csrow->grain = 1 << 12; /* I82875P_EAP has 4KiB reolution */ | 383 | |
375 | csrow->mtype = MEM_DDR; | 384 | for (j = 0; j < nr_chans; j++) { |
376 | csrow->dtype = DEV_UNKNOWN; | 385 | dimm = csrow->channels[j].dimm; |
377 | csrow->edac_mode = drc_ddim ? EDAC_SECDED : EDAC_NONE; | 386 | |
387 | dimm->nr_pages = nr_pages / nr_chans; | ||
388 | dimm->grain = 1 << 12; /* I82875P_EAP has 4KiB reolution */ | ||
389 | dimm->mtype = MEM_DDR; | ||
390 | dimm->dtype = DEV_UNKNOWN; | ||
391 | dimm->edac_mode = drc_ddim ? EDAC_SECDED : EDAC_NONE; | ||
392 | } | ||
378 | } | 393 | } |
379 | } | 394 | } |
380 | 395 | ||
@@ -382,6 +397,7 @@ static int i82875p_probe1(struct pci_dev *pdev, int dev_idx) | |||
382 | { | 397 | { |
383 | int rc = -ENODEV; | 398 | int rc = -ENODEV; |
384 | struct mem_ctl_info *mci; | 399 | struct mem_ctl_info *mci; |
400 | struct edac_mc_layer layers[2]; | ||
385 | struct i82875p_pvt *pvt; | 401 | struct i82875p_pvt *pvt; |
386 | struct pci_dev *ovrfl_pdev; | 402 | struct pci_dev *ovrfl_pdev; |
387 | void __iomem *ovrfl_window; | 403 | void __iomem *ovrfl_window; |
@@ -397,9 +413,14 @@ static int i82875p_probe1(struct pci_dev *pdev, int dev_idx) | |||
397 | return -ENODEV; | 413 | return -ENODEV; |
398 | drc = readl(ovrfl_window + I82875P_DRC); | 414 | drc = readl(ovrfl_window + I82875P_DRC); |
399 | nr_chans = dual_channel_active(drc) + 1; | 415 | nr_chans = dual_channel_active(drc) + 1; |
400 | mci = edac_mc_alloc(sizeof(*pvt), I82875P_NR_CSROWS(nr_chans), | ||
401 | nr_chans, 0); | ||
402 | 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 = edac_mc_alloc(0, ARRAY_SIZE(layers), layers, sizeof(*pvt)); | ||
403 | if (!mci) { | 424 | if (!mci) { |
404 | rc = -ENOMEM; | 425 | rc = -ENOMEM; |
405 | goto fail0; | 426 | goto fail0; |