Commit 59529bbe authored by Huang Yiwei's avatar Huang Yiwei Committed by Will Deacon
Browse files

firmware: SDEI: Allow sdei initialization without ACPI_APEI_GHES



SDEI usually initialize with the ACPI table, but on platforms where
ACPI is not used, the SDEI feature can still be used to handle
specific firmware calls or other customized purposes. Therefore, it
is not necessary for ARM_SDE_INTERFACE to depend on ACPI_APEI_GHES.

In commit dc4e8c07 ("ACPI: APEI: explicit init of HEST and GHES
in acpi_init()"), to make APEI ready earlier, sdei_init was moved
into acpi_ghes_init instead of being a standalone initcall, adding
ACPI_APEI_GHES dependency to ARM_SDE_INTERFACE. This restricts the
flexibility and usability of SDEI.

This patch corrects the dependency in Kconfig and splits sdei_init()
into two separate functions: sdei_init() and acpi_sdei_init().
sdei_init() will be called by arch_initcall and will only initialize
the platform driver, while acpi_sdei_init() will initialize the
device from acpi_ghes_init() when ACPI is ready. This allows the
initialization of SDEI without ACPI_APEI_GHES enabled.

Fixes: dc4e8c07 ("ACPI: APEI: explicit init of HEST and GHES in apci_init()")
Cc: Shuai Xue <xueshuai@linux.alibaba.com>
Signed-off-by: default avatarHuang Yiwei <quic_hyiwei@quicinc.com>
Reviewed-by: default avatarShuai Xue <xueshuai@linux.alibaba.com>
Reviewed-by: default avatarGavin Shan <gshan@redhat.com>
Acked-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
Link: https://lore.kernel.org/r/20250507045757.2658795-1-quic_hyiwei@quicinc.com


Signed-off-by: default avatarWill Deacon <will@kernel.org>
parent 0af2f6be
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@ config ACPI_APEI_GHES
	select ACPI_HED
	select IRQ_WORK
	select GENERIC_ALLOCATOR
	select ARM_SDE_INTERFACE if ARM64
	help
	  Generic Hardware Error Source provides a way to report
	  platform hardware errors (such as that from chipset). It
+1 −1
Original line number Diff line number Diff line
@@ -1715,7 +1715,7 @@ void __init acpi_ghes_init(void)
{
	int rc;

	sdei_init();
	acpi_sdei_init();

	if (acpi_disabled)
		return;
+0 −1
Original line number Diff line number Diff line
@@ -31,7 +31,6 @@ config ARM_SCPI_PROTOCOL
config ARM_SDE_INTERFACE
	bool "ARM Software Delegated Exception Interface (SDEI)"
	depends on ARM64
	depends on ACPI_APEI_GHES
	help
	  The Software Delegated Exception Interface (SDEI) is an ARM
	  standard for registering callbacks from the platform firmware
+8 −3
Original line number Diff line number Diff line
@@ -1062,13 +1062,12 @@ static bool __init sdei_present_acpi(void)
	return true;
}

void __init sdei_init(void)
void __init acpi_sdei_init(void)
{
	struct platform_device *pdev;
	int ret;

	ret = platform_driver_register(&sdei_driver);
	if (ret || !sdei_present_acpi())
	if (!sdei_present_acpi())
		return;

	pdev = platform_device_register_simple(sdei_driver.driver.name,
@@ -1081,6 +1080,12 @@ void __init sdei_init(void)
	}
}

static int __init sdei_init(void)
{
	return platform_driver_register(&sdei_driver);
}
arch_initcall(sdei_init);

int sdei_event_handler(struct pt_regs *regs,
		       struct sdei_registered_event *arg)
{
+2 −2
Original line number Diff line number Diff line
@@ -46,12 +46,12 @@ int sdei_unregister_ghes(struct ghes *ghes);
/* For use by arch code when CPU hotplug notifiers are not appropriate. */
int sdei_mask_local_cpu(void);
int sdei_unmask_local_cpu(void);
void __init sdei_init(void);
void __init acpi_sdei_init(void);
void sdei_handler_abort(void);
#else
static inline int sdei_mask_local_cpu(void) { return 0; }
static inline int sdei_unmask_local_cpu(void) { return 0; }
static inline void sdei_init(void) { }
static inline void acpi_sdei_init(void) { }
static inline void sdei_handler_abort(void) { }
#endif /* CONFIG_ARM_SDE_INTERFACE */