EDAC: Add an edac_report parameter to EDAC
authorChen, Gong <gong.chen@linux.intel.com>
Fri, 6 Dec 2013 06:17:08 +0000 (01:17 -0500)
committerBorislav Petkov <bp@suse.de>
Wed, 11 Dec 2013 17:06:47 +0000 (18:06 +0100)
This new parameter is used to control how to report HW error reporting,
especially for newer Intel platform, like Ivybridge-EX, which contains
an enhanced error decoding functionality in the firmware, i.e. eMCA.

Signed-off-by: Chen, Gong <gong.chen@linux.intel.com>
Acked-by: Tony Luck <tony.luck@intel.com>
Link: http://lkml.kernel.org/r/1386310630-12529-2-git-send-email-gong.chen@linux.intel.com
[ Boris: massage commit message. ]
Signed-off-by: Borislav Petkov <bp@suse.de>
Documentation/kernel-parameters.txt
drivers/edac/edac_stub.c
include/linux/edac.h

index 50680a5..453092c 100644 (file)
@@ -881,6 +881,14 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
 
                        The xen output can only be used by Xen PV guests.
 
+       edac_report=    [HW,EDAC] Control how to report EDAC event
+                       Format: {"on" | "off" | "force"}
+                       on: enable EDAC to report H/W event. May be overridden
+                       by other higher priority error reporting module.
+                       off: disable H/W event reporting through EDAC.
+                       force: enforce the use of EDAC to report H/W event.
+                       default: on.
+
        ekgdboc=        [X86,KGDB] Allow early kernel console debugging
                        ekgdboc=kbd
 
index 351945f..9d9e18a 100644 (file)
@@ -29,6 +29,25 @@ EXPORT_SYMBOL_GPL(edac_err_assert);
 
 static atomic_t edac_subsys_valid = ATOMIC_INIT(0);
 
+int edac_report_status = EDAC_REPORTING_ENABLED;
+EXPORT_SYMBOL_GPL(edac_report_status);
+
+static int __init edac_report_setup(char *str)
+{
+       if (!str)
+               return -EINVAL;
+
+       if (!strncmp(str, "on", 2))
+               set_edac_report_status(EDAC_REPORTING_ENABLED);
+       else if (!strncmp(str, "off", 3))
+               set_edac_report_status(EDAC_REPORTING_DISABLED);
+       else if (!strncmp(str, "force", 5))
+               set_edac_report_status(EDAC_REPORTING_FORCE);
+
+       return 0;
+}
+__setup("edac_report=", edac_report_setup);
+
 /*
  * called to determine if there is an EDAC driver interested in
  * knowing an event (such as NMI) occurred
index dbdffe8..8e6c20a 100644 (file)
@@ -35,6 +35,34 @@ extern void edac_atomic_assert_error(void);
 extern struct bus_type *edac_get_sysfs_subsys(void);
 extern void edac_put_sysfs_subsys(void);
 
+enum {
+       EDAC_REPORTING_ENABLED,
+       EDAC_REPORTING_DISABLED,
+       EDAC_REPORTING_FORCE
+};
+
+extern int edac_report_status;
+#ifdef CONFIG_EDAC
+static inline int get_edac_report_status(void)
+{
+       return edac_report_status;
+}
+
+static inline void set_edac_report_status(int new)
+{
+       edac_report_status = new;
+}
+#else
+static inline int get_edac_report_status(void)
+{
+       return EDAC_REPORTING_DISABLED;
+}
+
+static inline void set_edac_report_status(int new)
+{
+}
+#endif
+
 static inline void opstate_init(void)
 {
        switch (edac_op_state) {