summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMauro Carvalho Chehab <mchehab@redhat.com>2009-07-17 10:54:23 -0300
committerMauro Carvalho Chehab <mchehab@redhat.com>2010-05-10 11:44:53 -0300
commita639539fa28531924c6b5e0f3963cc63d060947d (patch)
tree8fdbfaa89c1cde5e0e5277cdbc32040bbd3f9408
parentc5d34528696acadc40d2ba7601dbf35d65b74ad5 (diff)
i7core: enrich error information based on memory transaction type
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
-rw-r--r--drivers/edac/i7core_edac.c32
1 files changed, 27 insertions, 5 deletions
diff --git a/drivers/edac/i7core_edac.c b/drivers/edac/i7core_edac.c
index 08149d5addff..9f39d3d5502e 100644
--- a/drivers/edac/i7core_edac.c
+++ b/drivers/edac/i7core_edac.c
@@ -1352,9 +1352,9 @@ static void check_mc_test_err(struct mem_ctl_info *mci, u8 socket)
static void i7core_mce_output_error(struct mem_ctl_info *mci,
struct mce *m)
{
- char *type;
- char *err, *msg;
+ char *type, *optype, *err, *msg;
unsigned long error = m->status & 0x1ff0000l;
+ u32 optypenum = (m->status >> 4) & 0x07;
u32 core_err_cnt = (m->status >> 38) && 0x7fff;
u32 dimm = (m->misc >> 16) & 0x3;
u32 channel = (m->misc >> 18) & 0x3;
@@ -1366,6 +1366,27 @@ static void i7core_mce_output_error(struct mem_ctl_info *mci,
else
type = "NON_FATAL";
+ switch (optypenum) {
+ case 0:
+ optype = "generic undef request";
+ break;
+ case 1:
+ optype = "read error";
+ break;
+ case 2:
+ optype = "write error";
+ break;
+ case 3:
+ optype = "addr/cmd error";
+ break;
+ case 4:
+ optype = "scrubbing error";
+ break;
+ default:
+ optype = "reserved";
+ break;
+ }
+
switch (errnum) {
case 16:
err = "read ECC error";
@@ -1400,10 +1421,11 @@ static void i7core_mce_output_error(struct mem_ctl_info *mci,
/* FIXME: should convert addr into bank and rank information */
msg = kasprintf(GFP_ATOMIC,
- "%s (addr = 0x%08llx Dimm=%d, Channel=%d, "
- "syndrome=0x%08x, count=%d Err=%d (%s))\n",
+ "%s (addr = 0x%08llx, Dimm=%d, Channel=%d, "
+ "syndrome=0x%08x, count=%d, Err=%08llx:%08llx (%s: %s))\n",
type, (long long) m->addr, dimm, channel,
- syndrome, core_err_cnt,errnum, err);
+ syndrome, core_err_cnt, (long long)m->status,
+ (long long)m->misc, optype, err);
debugf0("%s", msg);