i7core: enrich error information based on memory transaction type
authorMauro Carvalho Chehab <mchehab@redhat.com>
Fri, 17 Jul 2009 13:54:23 +0000 (10:54 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Mon, 10 May 2010 14:44:53 +0000 (11:44 -0300)
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/edac/i7core_edac.c

index 08149d5..9f39d3d 100644 (file)
@@ -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);