On Wed, May 7, 2025 at 6:58 AM Huang Yiwei <quic_hyiwei@xxxxxxxxxxx> wrote: > > 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 dc4e8c07e9e2 ("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: dc4e8c07e9e2 ("ACPI: APEI: explicit init of HEST and GHES in apci_init()") > Cc: Shuai Xue <xueshuai@xxxxxxxxxxxxxxxxx> > Signed-off-by: Huang Yiwei <quic_hyiwei@xxxxxxxxxxx> Acked-by: Rafael J. Wysocki <rafael.j.wysocki@xxxxxxxxx> for the ACPI bits and please route this through ARM. Thanks! > --- > drivers/acpi/apei/Kconfig | 1 + > drivers/acpi/apei/ghes.c | 2 +- > drivers/firmware/Kconfig | 1 - > drivers/firmware/arm_sdei.c | 11 ++++++++--- > include/linux/arm_sdei.h | 4 ++-- > 5 files changed, 12 insertions(+), 7 deletions(-) > > diff --git a/drivers/acpi/apei/Kconfig b/drivers/acpi/apei/Kconfig > index 3cfe7e7475f2..070c07d68dfb 100644 > --- a/drivers/acpi/apei/Kconfig > +++ b/drivers/acpi/apei/Kconfig > @@ -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 > diff --git a/drivers/acpi/apei/ghes.c b/drivers/acpi/apei/ghes.c > index 289e365f84b2..0f3c663c1b0a 100644 > --- a/drivers/acpi/apei/ghes.c > +++ b/drivers/acpi/apei/ghes.c > @@ -1715,7 +1715,7 @@ void __init acpi_ghes_init(void) > { > int rc; > > - sdei_init(); > + acpi_sdei_init(); > > if (acpi_disabled) > return; > diff --git a/drivers/firmware/Kconfig b/drivers/firmware/Kconfig > index aadc395ee168..7df19d82aa68 100644 > --- a/drivers/firmware/Kconfig > +++ b/drivers/firmware/Kconfig > @@ -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 > diff --git a/drivers/firmware/arm_sdei.c b/drivers/firmware/arm_sdei.c > index 3e8051fe8296..71e2a9a89f6a 100644 > --- a/drivers/firmware/arm_sdei.c > +++ b/drivers/firmware/arm_sdei.c > @@ -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) > { > diff --git a/include/linux/arm_sdei.h b/include/linux/arm_sdei.h > index 255701e1251b..f652a5028b59 100644 > --- a/include/linux/arm_sdei.h > +++ b/include/linux/arm_sdei.h > @@ -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 */ > > -- > 2.25.1 >