]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
firmware: SDEI: Allow sdei initialization without ACPI_APEI_GHES
authorHuang Yiwei <quic_hyiwei@quicinc.com>
Wed, 7 May 2025 04:57:57 +0000 (12:57 +0800)
committerWill Deacon <will@kernel.org>
Thu, 8 May 2025 12:35:22 +0000 (13:35 +0100)
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@linux.alibaba.com>
Signed-off-by: Huang Yiwei <quic_hyiwei@quicinc.com>
Reviewed-by: Shuai Xue <xueshuai@linux.alibaba.com>
Reviewed-by: Gavin Shan <gshan@redhat.com>
Acked-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Link: https://lore.kernel.org/r/20250507045757.2658795-1-quic_hyiwei@quicinc.com
Signed-off-by: Will Deacon <will@kernel.org>
drivers/acpi/apei/Kconfig
drivers/acpi/apei/ghes.c
drivers/firmware/Kconfig
drivers/firmware/arm_sdei.c
include/linux/arm_sdei.h

index 3cfe7e7475f2fdb96f78eafc44ccb479b2ebb396..070c07d68dfb2fd288c3003780fa4c336f75824e 100644 (file)
@@ -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
index 289e365f84b24912c1b6cd436166886301d0c9f2..0f3c663c1b0a3391179ab1e47b66f56e8a73f64d 100644 (file)
@@ -1715,7 +1715,7 @@ void __init acpi_ghes_init(void)
 {
        int rc;
 
-       sdei_init();
+       acpi_sdei_init();
 
        if (acpi_disabled)
                return;
index aadc395ee16813ca1df828db812173529bb35aa2..7df19d82aa689ec7ec0c15ae98e3134e821b2fef 100644 (file)
@@ -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
index 3e8051fe829657294cbb29c49c2b3848f98a990f..71e2a9a89f6adabf2848f61bfdcfcbb908f2a732 100644 (file)
@@ -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)
 {
index 255701e1251b4ac242456693f998e3940a36851c..f652a5028b5907ba914550d92009592c3a8f7838 100644 (file)
@@ -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 */