ACPI / APEI: Switch NOTIFY_SEA to use the estatus queue
Now that the estatus queue can be used by more than one notification method, we can move notifications that have NMI-like behaviour over. Switch NOTIFY_SEA over to use the estatus queue. This makes it behave in the same way as x86's NOTIFY_NMI. Remove Kconfig's ability to turn ACPI_APEI_SEA off if ACPI_APEI_GHES is selected. This roughly matches the x86 NOTIFY_NMI behaviour, and means each architecture has at least one user of the estatus-queue, meaning it doesn't need guarding with ifdef. Signed-off-by: James Morse <james.morse@arm.com> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
This commit is contained in:
parent
9c9d080513
commit
255097c82d
@ -41,19 +41,9 @@ config ACPI_APEI_PCIEAER
|
|||||||
Turn on this option to enable the corresponding support.
|
Turn on this option to enable the corresponding support.
|
||||||
|
|
||||||
config ACPI_APEI_SEA
|
config ACPI_APEI_SEA
|
||||||
bool "APEI Synchronous External Abort logging/recovering support"
|
bool
|
||||||
depends on ARM64 && ACPI_APEI_GHES
|
depends on ARM64 && ACPI_APEI_GHES
|
||||||
default y
|
default y
|
||||||
help
|
|
||||||
This option should be enabled if the system supports
|
|
||||||
firmware first handling of SEA (Synchronous External Abort).
|
|
||||||
SEA happens with certain faults of data abort or instruction
|
|
||||||
abort synchronous exceptions on ARMv8 systems. If a system
|
|
||||||
supports firmware first handling of SEA, the platform analyzes
|
|
||||||
and handles hardware error notifications from SEA, and it may then
|
|
||||||
form a HW error record for the OS to parse and handle. This
|
|
||||||
option allows the OS to look for such hardware error record, and
|
|
||||||
take appropriate action.
|
|
||||||
|
|
||||||
config ACPI_APEI_MEMORY_FAILURE
|
config ACPI_APEI_MEMORY_FAILURE
|
||||||
bool "APEI memory error recovering support"
|
bool "APEI memory error recovering support"
|
||||||
|
@ -767,7 +767,6 @@ static struct notifier_block ghes_notifier_hed = {
|
|||||||
.notifier_call = ghes_notify_hed,
|
.notifier_call = ghes_notify_hed,
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifdef CONFIG_HAVE_ACPI_APEI_NMI
|
|
||||||
/*
|
/*
|
||||||
* Handlers for CPER records may not be NMI safe. For example,
|
* Handlers for CPER records may not be NMI safe. For example,
|
||||||
* memory_failure_queue() takes spinlocks and calls schedule_work_on().
|
* memory_failure_queue() takes spinlocks and calls schedule_work_on().
|
||||||
@ -903,7 +902,6 @@ static int ghes_in_nmi_spool_from_list(struct list_head *rcu_list)
|
|||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
#endif /* CONFIG_HAVE_ACPI_APEI_NMI */
|
|
||||||
|
|
||||||
#ifdef CONFIG_ACPI_APEI_SEA
|
#ifdef CONFIG_ACPI_APEI_SEA
|
||||||
static LIST_HEAD(ghes_sea);
|
static LIST_HEAD(ghes_sea);
|
||||||
@ -914,16 +912,7 @@ static LIST_HEAD(ghes_sea);
|
|||||||
*/
|
*/
|
||||||
int ghes_notify_sea(void)
|
int ghes_notify_sea(void)
|
||||||
{
|
{
|
||||||
struct ghes *ghes;
|
return ghes_in_nmi_spool_from_list(&ghes_sea);
|
||||||
int ret = -ENOENT;
|
|
||||||
|
|
||||||
rcu_read_lock();
|
|
||||||
list_for_each_entry_rcu(ghes, &ghes_sea, list) {
|
|
||||||
if (!ghes_proc(ghes))
|
|
||||||
ret = 0;
|
|
||||||
}
|
|
||||||
rcu_read_unlock();
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ghes_sea_add(struct ghes *ghes)
|
static void ghes_sea_add(struct ghes *ghes)
|
||||||
@ -990,16 +979,15 @@ static void ghes_nmi_remove(struct ghes *ghes)
|
|||||||
*/
|
*/
|
||||||
synchronize_rcu();
|
synchronize_rcu();
|
||||||
}
|
}
|
||||||
|
#else /* CONFIG_HAVE_ACPI_APEI_NMI */
|
||||||
|
static inline void ghes_nmi_add(struct ghes *ghes) { }
|
||||||
|
static inline void ghes_nmi_remove(struct ghes *ghes) { }
|
||||||
|
#endif /* CONFIG_HAVE_ACPI_APEI_NMI */
|
||||||
|
|
||||||
static void ghes_nmi_init_cxt(void)
|
static void ghes_nmi_init_cxt(void)
|
||||||
{
|
{
|
||||||
init_irq_work(&ghes_proc_irq_work, ghes_proc_in_irq);
|
init_irq_work(&ghes_proc_irq_work, ghes_proc_in_irq);
|
||||||
}
|
}
|
||||||
#else /* CONFIG_HAVE_ACPI_APEI_NMI */
|
|
||||||
static inline void ghes_nmi_add(struct ghes *ghes) { }
|
|
||||||
static inline void ghes_nmi_remove(struct ghes *ghes) { }
|
|
||||||
static inline void ghes_nmi_init_cxt(void) { }
|
|
||||||
#endif /* CONFIG_HAVE_ACPI_APEI_NMI */
|
|
||||||
|
|
||||||
static int ghes_probe(struct platform_device *ghes_dev)
|
static int ghes_probe(struct platform_device *ghes_dev)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user