Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c700f013 authored by Chen, Gong's avatar Chen, Gong Committed by Borislav Petkov
Browse files

EDAC: Add an edac_report parameter to EDAC



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: default avatarChen, Gong <gong.chen@linux.intel.com>
Acked-by: default avatarTony 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: default avatarBorislav Petkov <bp@suse.de>
parent 545104dd
Loading
Loading
Loading
Loading
+8 −0
Original line number Original line Diff line number Diff line
@@ -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.
			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=	[X86,KGDB] Allow early kernel console debugging
			ekgdboc=kbd
			ekgdboc=kbd


+19 −0
Original line number Original line Diff line number Diff line
@@ -29,6 +29,25 @@ EXPORT_SYMBOL_GPL(edac_err_assert);


static atomic_t edac_subsys_valid = ATOMIC_INIT(0);
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
 * called to determine if there is an EDAC driver interested in
 * knowing an event (such as NMI) occurred
 * knowing an event (such as NMI) occurred
+28 −0
Original line number Original line Diff line number Diff line
@@ -35,6 +35,34 @@ extern void edac_atomic_assert_error(void);
extern struct bus_type *edac_get_sysfs_subsys(void);
extern struct bus_type *edac_get_sysfs_subsys(void);
extern void edac_put_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)
static inline void opstate_init(void)
{
{
	switch (edac_op_state) {
	switch (edac_op_state) {