]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
ACPI, APEI, GHES: Do not report only correctable errors with SCI
authorChen, Gong <gong.chen@linux.intel.com>
Mon, 25 Nov 2013 07:15:00 +0000 (02:15 -0500)
committerBorislav Petkov <bp@suse.de>
Sat, 21 Dec 2013 12:31:06 +0000 (13:31 +0100)
Currently SCI is employed to handle corrected errors - memory corrected
errors, more specifically but in fact SCI still can be used to handle
any errors, e.g. uncorrected or even fatal ones if enabled by the BIOS.
Enable logging for those kinds of errors too.

Signed-off-by: Chen, Gong <gong.chen@linux.intel.com>
Acked-by: Naveen N. Rao <naveen.n.rao@linux.vnet.ibm.com>
Cc: Tony Luck <tony.luck@intel.com>
Link: http://lkml.kernel.org/r/1385363701-12387-1-git-send-email-gong.chen@linux.intel.com
[ Boris: massage commit message, rename function arg. ]
Signed-off-by: Borislav Petkov <bp@suse.de>
arch/x86/kernel/cpu/mcheck/mce-apei.c
drivers/acpi/apei/ghes.c

index de8b60a53f695f486664d0dac307279d31207be8..a1aef9533154b8c7be7cbc5dd271cadf78761093 100644 (file)
 #include <linux/acpi.h>
 #include <linux/cper.h>
 #include <acpi/apei.h>
+#include <acpi/ghes.h>
 #include <asm/mce.h>
 
 #include "mce-internal.h"
 
-void apei_mce_report_mem_error(int corrected, struct cper_sec_mem_err *mem_err)
+void apei_mce_report_mem_error(int severity, struct cper_sec_mem_err *mem_err)
 {
        struct mce m;
 
-       /* Only corrected MC is reported */
-       if (!corrected || !(mem_err->validation_bits & CPER_MEM_VALID_PA))
+       if (!(mem_err->validation_bits & CPER_MEM_VALID_PA))
                return;
 
        mce_setup(&m);
        m.bank = 1;
-       /* Fake a memory read corrected error with unknown channel */
+       /* Fake a memory read error with unknown channel */
        m.status = MCI_STATUS_VAL | MCI_STATUS_EN | MCI_STATUS_ADDRV | 0x9f;
+
+       if (severity >= GHES_SEV_RECOVERABLE)
+               m.status |= MCI_STATUS_UC;
+       if (severity >= GHES_SEV_PANIC)
+               m.status |= MCI_STATUS_PCC;
+
        m.addr = mem_err->physical_addr;
        mce_log(&m);
        mce_notify_irq();
index a30bc313787be65523797da950f3982e13844c35..ce3683d93a137a25b4ca8e863ed448d6fbc2b7cd 100644 (file)
@@ -453,8 +453,7 @@ static void ghes_do_proc(struct ghes *ghes,
                        ghes_edac_report_mem_error(ghes, sev, mem_err);
 
 #ifdef CONFIG_X86_MCE
-                       apei_mce_report_mem_error(sev == GHES_SEV_CORRECTED,
-                                                 mem_err);
+                       apei_mce_report_mem_error(sev, mem_err);
 #endif
                        ghes_handle_memory_failure(gdata, sev);
                }