diff options
-rw-r--r-- | drivers/edac/i3000_edac.c | 25 |
1 files changed, 20 insertions, 5 deletions
diff --git a/drivers/edac/i3000_edac.c b/drivers/edac/i3000_edac.c index 719ccbed7435..195a92e1c0ae 100644 --- a/drivers/edac/i3000_edac.c +++ b/drivers/edac/i3000_edac.c | |||
@@ -245,7 +245,9 @@ static int i3000_process_error_info(struct mem_ctl_info *mci, | |||
245 | return 1; | 245 | return 1; |
246 | 246 | ||
247 | if ((info->errsts ^ info->errsts2) & I3000_ERRSTS_BITS) { | 247 | if ((info->errsts ^ info->errsts2) & I3000_ERRSTS_BITS) { |
248 | edac_mc_handle_ce_no_info(mci, "UE overwrote CE"); | 248 | edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, 0, 0, 0, |
249 | -1, -1, -1, | ||
250 | "UE overwrote CE", "", NULL); | ||
249 | info->errsts = info->errsts2; | 251 | info->errsts = info->errsts2; |
250 | } | 252 | } |
251 | 253 | ||
@@ -256,10 +258,15 @@ static int i3000_process_error_info(struct mem_ctl_info *mci, | |||
256 | row = edac_mc_find_csrow_by_page(mci, pfn); | 258 | row = edac_mc_find_csrow_by_page(mci, pfn); |
257 | 259 | ||
258 | if (info->errsts & I3000_ERRSTS_UE) | 260 | if (info->errsts & I3000_ERRSTS_UE) |
259 | edac_mc_handle_ue(mci, pfn, offset, row, "i3000 UE"); | 261 | edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, |
262 | pfn, offset, 0, | ||
263 | row, -1, -1, | ||
264 | "i3000 UE", "", NULL); | ||
260 | else | 265 | else |
261 | edac_mc_handle_ce(mci, pfn, offset, info->derrsyn, row, | 266 | edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, |
262 | multi_chan ? channel : 0, "i3000 CE"); | 267 | pfn, offset, info->derrsyn, |
268 | row, multi_chan ? channel : 0, -1, | ||
269 | "i3000 CE", "", NULL); | ||
263 | 270 | ||
264 | return 1; | 271 | return 1; |
265 | } | 272 | } |
@@ -306,6 +313,7 @@ static int i3000_probe1(struct pci_dev *pdev, int dev_idx) | |||
306 | int rc; | 313 | int rc; |
307 | int i, j; | 314 | int i, j; |
308 | struct mem_ctl_info *mci = NULL; | 315 | struct mem_ctl_info *mci = NULL; |
316 | struct edac_mc_layer layers[2]; | ||
309 | unsigned long last_cumul_size, nr_pages; | 317 | unsigned long last_cumul_size, nr_pages; |
310 | int interleaved, nr_channels; | 318 | int interleaved, nr_channels; |
311 | unsigned char dra[I3000_RANKS / 2], drb[I3000_RANKS]; | 319 | unsigned char dra[I3000_RANKS / 2], drb[I3000_RANKS]; |
@@ -347,7 +355,14 @@ static int i3000_probe1(struct pci_dev *pdev, int dev_idx) | |||
347 | */ | 355 | */ |
348 | interleaved = i3000_is_interleaved(c0dra, c1dra, c0drb, c1drb); | 356 | interleaved = i3000_is_interleaved(c0dra, c1dra, c0drb, c1drb); |
349 | nr_channels = interleaved ? 2 : 1; | 357 | nr_channels = interleaved ? 2 : 1; |
350 | mci = edac_mc_alloc(0, I3000_RANKS / nr_channels, nr_channels, 0); | 358 | |
359 | layers[0].type = EDAC_MC_LAYER_CHIP_SELECT; | ||
360 | layers[0].size = I3000_RANKS / nr_channels; | ||
361 | layers[0].is_virt_csrow = true; | ||
362 | layers[1].type = EDAC_MC_LAYER_CHANNEL; | ||
363 | layers[1].size = nr_channels; | ||
364 | layers[1].is_virt_csrow = false; | ||
365 | mci = new_edac_mc_alloc(0, ARRAY_SIZE(layers), layers, 0); | ||
351 | if (!mci) | 366 | if (!mci) |
352 | return -ENOMEM; | 367 | return -ENOMEM; |
353 | 368 | ||