aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/edac/i7300_edac.c
diff options
context:
space:
mode:
authorMauro Carvalho Chehab <mchehab@redhat.com>2010-08-27 10:51:48 -0400
committerMauro Carvalho Chehab <mchehab@redhat.com>2010-08-30 13:57:01 -0400
commit8199d8cc65787bfd83abbfb69d9de1b51e027c41 (patch)
treeb14cbb177aed1c3d479883bee7a271638d449a10 /drivers/edac/i7300_edac.c
parent85580ea4f72ce08e4d9140a3bb22806185a0bba9 (diff)
i7300_edac: enrich FBD error info for fatal errors
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/edac/i7300_edac.c')
-rw-r--r--drivers/edac/i7300_edac.c43
1 files changed, 39 insertions, 4 deletions
diff --git a/drivers/edac/i7300_edac.c b/drivers/edac/i7300_edac.c
index 4c239ce6986b..e33c9900e269 100644
--- a/drivers/edac/i7300_edac.c
+++ b/drivers/edac/i7300_edac.c
@@ -268,6 +268,16 @@ static const char *ferr_global_lo_name[] = {
268}; 268};
269#define ferr_global_lo_is_fatal(errno) ((errno < 16) ? 0 : 1) 269#define ferr_global_lo_is_fatal(errno) ((errno < 16) ? 0 : 1)
270 270
271#define NRECMEMA 0xbe
272 #define NRECMEMA_BANK(v) (((v) >> 12) & 7)
273 #define NRECMEMA_RANK(v) (((v) >> 8) & 15)
274
275#define NRECMEMB 0xc0
276 #define NRECMEMB_IS_WR(v) ((v) & (1 << 31))
277 #define NRECMEMB_CAS(v) (((v) >> 16) & 0x1fff)
278 #define NRECMEMB_RAS(v) ((v) & 0xffff)
279
280
271/* Device name and register DID (Device ID) */ 281/* Device name and register DID (Device ID) */
272struct i7300_dev_info { 282struct i7300_dev_info {
273 const char *ctl_name; /* name for this device */ 283 const char *ctl_name; /* name for this device */
@@ -392,10 +402,11 @@ static void i7300_process_fbd_error(struct mem_ctl_info *mci)
392{ 402{
393 struct i7300_pvt *pvt; 403 struct i7300_pvt *pvt;
394 u32 errnum, value; 404 u32 errnum, value;
395 int branch; 405 u16 val16;
406 int branch, bank, rank, cas, ras;
396 unsigned long errors; 407 unsigned long errors;
397 const char *specific; 408 const char *specific;
398 bool is_fatal; 409 bool is_fatal, is_wr;
399 410
400 pvt = mci->pvt_info; 411 pvt = mci->pvt_info;
401 412
@@ -410,8 +421,31 @@ static void i7300_process_fbd_error(struct mem_ctl_info *mci)
410 is_fatal = 1; 421 is_fatal = 1;
411 422
412 branch = (GET_FBD_FAT_IDX(value) == 2) ? 1 : 0; 423 branch = (GET_FBD_FAT_IDX(value) == 2) ? 1 : 0;
413 424 pci_read_config_word(pvt->pci_dev_16_1_fsb_addr_map,
414 goto error_fbd; 425 NRECMEMA, &val16);
426 bank = NRECMEMA_BANK(val16);
427 rank = NRECMEMA_RANK(val16);
428
429 pci_read_config_dword(pvt->pci_dev_16_1_fsb_addr_map,
430 NRECMEMB, &value);
431
432 is_wr = NRECMEMB_IS_WR(value);
433 cas = NRECMEMB_CAS(value);
434 ras = NRECMEMB_RAS(value);
435
436 snprintf(pvt->tmp_prt_buffer, PAGE_SIZE,
437 "FATAL (Branch=%d DRAM-Bank=%d %s "
438 "RAS=%d CAS=%d Err=0x%lx (%s))",
439 branch >> 1, bank,
440 is_wr ? "RDWR" : "RD",
441 ras, cas,
442 errors, specific);
443
444 /* Call the helper to output message */
445 edac_mc_handle_fbd_ue(mci, rank, branch << 1,
446 (branch << 1) + 1,
447 pvt->tmp_prt_buffer);
448 return;
415 } 449 }
416 450
417 /* read in the 1st NON-FATAL error register */ 451 /* read in the 1st NON-FATAL error register */
@@ -433,6 +467,7 @@ static void i7300_process_fbd_error(struct mem_ctl_info *mci)
433 return; 467 return;
434 468
435error_fbd: 469error_fbd:
470
436 i7300_mc_printk(mci, KERN_EMERG, "%s FBD error on branch %d: %s\n", 471 i7300_mc_printk(mci, KERN_EMERG, "%s FBD error on branch %d: %s\n",
437 is_fatal ? "Fatal" : "NOT fatal", branch, specific); 472 is_fatal ? "Fatal" : "NOT fatal", branch, specific);
438} 473}