Commit dc4e8c07 authored by Shuai Xue's avatar Shuai Xue Committed by Rafael J. Wysocki
Browse files

ACPI: APEI: explicit init of HEST and GHES in apci_init()



From commit e147133a ("ACPI / APEI: Make hest.c manage the estatus
memory pool") was merged, ghes_init() relies on acpi_hest_init() to manage
the estatus memory pool. On the other hand, ghes_init() relies on
sdei_init() to detect the SDEI version and (un)register events. The
dependencies are as follows:

    ghes_init() => acpi_hest_init() => acpi_bus_init() => acpi_init()
    ghes_init() => sdei_init()

HEST is not PCI-specific and initcall ordering is implicit and not
well-defined within a level.

Based on above, remove acpi_hest_init() from acpi_pci_root_init() and
convert ghes_init() and sdei_init() from initcalls to explicit calls in the
following order:

    acpi_hest_init()
    ghes_init()
        sdei_init()

Signed-off-by: default avatarShuai Xue <xueshuai@linux.alibaba.com>
Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
parent 7e57714c
Loading
Loading
Loading
Loading
+8 −11
Original line number Diff line number Diff line
@@ -1457,33 +1457,35 @@ static struct platform_driver ghes_platform_driver = {
	.remove		= ghes_remove,
};

static int __init ghes_init(void)
void __init ghes_init(void)
{
	int rc;

	sdei_init();

	if (acpi_disabled)
		return -ENODEV;
		return;

	switch (hest_disable) {
	case HEST_NOT_FOUND:
		return -ENODEV;
		return;
	case HEST_DISABLED:
		pr_info(GHES_PFX "HEST is not enabled!\n");
		return -EINVAL;
		return;
	default:
		break;
	}

	if (ghes_disable) {
		pr_info(GHES_PFX "GHES is not enabled!\n");
		return -EINVAL;
		return;
	}

	ghes_nmi_init_cxt();

	rc = platform_driver_register(&ghes_platform_driver);
	if (rc)
		goto err;
		return;

	rc = apei_osc_setup();
	if (rc == 0 && osc_sb_apei_support_acked)
@@ -1494,9 +1496,4 @@ static int __init ghes_init(void)
		pr_info(GHES_PFX "APEI firmware first mode is enabled by APEI bit.\n");
	else
		pr_info(GHES_PFX "Failed to enable APEI firmware first mode.\n");

	return 0;
err:
	return rc;
}
device_initcall(ghes_init);
+2 −0
Original line number Diff line number Diff line
@@ -1331,6 +1331,8 @@ static int __init acpi_init(void)

	pci_mmcfg_late_init();
	acpi_iort_init();
	acpi_hest_init();
	ghes_init();
	acpi_scan_init();
	acpi_ec_init();
	acpi_debugfs_init();
+0 −3
Original line number Diff line number Diff line
@@ -22,8 +22,6 @@
#include <linux/slab.h>
#include <linux/dmi.h>
#include <linux/platform_data/x86/apple.h>
#include <acpi/apei.h>	/* for acpi_hest_init() */

#include "internal.h"

#define ACPI_PCI_ROOT_CLASS		"pci_bridge"
@@ -943,7 +941,6 @@ struct pci_bus *acpi_pci_root_create(struct acpi_pci_root *root,

void __init acpi_pci_root_init(void)
{
	acpi_hest_init();
	if (acpi_pci_disabled)
		return;

+1 −0
Original line number Diff line number Diff line
@@ -40,6 +40,7 @@ config ARM_SCPI_POWER_DOMAIN
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
+2 −11
Original line number Diff line number Diff line
@@ -1059,14 +1059,14 @@ static bool __init sdei_present_acpi(void)
	return true;
}

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

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

	pdev = platform_device_register_simple(sdei_driver.driver.name,
					       0, NULL, 0);
@@ -1076,17 +1076,8 @@ static int __init sdei_init(void)
		pr_info("Failed to register ACPI:SDEI platform device %d\n",
			ret);
	}

	return ret;
}

/*
 * On an ACPI system SDEI needs to be ready before HEST:GHES tries to register
 * its events. ACPI is initialised from a subsys_initcall(), GHES is initialised
 * by device_initcall(). We want to be called in the middle.
 */
subsys_initcall_sync(sdei_init);

int sdei_event_handler(struct pt_regs *regs,
		       struct sdei_registered_event *arg)
{
Loading