ACPI 2.0 / ECDT: Enable correct ECDT initialization order
With wrong ECDT fixes reverted, it is possible to put ECDT probing before acpi_enable_subsystem(). But the ultimate purpose of ECDT re-enabling is to put the ECDT probing before the namespace initialization (acpi_load_tables()). This patch achieves this with protections so that we can enable it later when all necessary corrections are upstreamed. Link 4: https://bugzilla.kernel.org/show_bug.cgi?id=112911 Signed-off-by: Lv Zheng <lv.zheng@intel.com> Tested-by: Chris Bainbridge <chris.bainbridge@gmail.com> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
This commit is contained in:
parent
59f0aa9480
commit
fe6cbea0f0
|
@ -925,12 +925,14 @@ void __init acpi_early_init(void)
|
||||||
goto error0;
|
goto error0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (acpi_gbl_group_module_level_code) {
|
||||||
status = acpi_load_tables();
|
status = acpi_load_tables();
|
||||||
if (ACPI_FAILURE(status)) {
|
if (ACPI_FAILURE(status)) {
|
||||||
printk(KERN_ERR PREFIX
|
printk(KERN_ERR PREFIX
|
||||||
"Unable to load the System Description Tables\n");
|
"Unable to load the System Description Tables\n");
|
||||||
goto error0;
|
goto error0;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_X86
|
#ifdef CONFIG_X86
|
||||||
if (!acpi_ioapic) {
|
if (!acpi_ioapic) {
|
||||||
|
@ -995,17 +997,10 @@ static int __init acpi_bus_init(void)
|
||||||
|
|
||||||
acpi_os_initialize1();
|
acpi_os_initialize1();
|
||||||
|
|
||||||
status = acpi_enable_subsystem(ACPI_NO_ACPI_ENABLE);
|
|
||||||
if (ACPI_FAILURE(status)) {
|
|
||||||
printk(KERN_ERR PREFIX
|
|
||||||
"Unable to start the ACPI Interpreter\n");
|
|
||||||
goto error1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ACPI 2.0 requires the EC driver to be loaded and work before
|
* ACPI 2.0 requires the EC driver to be loaded and work before
|
||||||
* the EC device is found in the namespace (i.e. before acpi_initialize_objects()
|
* the EC device is found in the namespace (i.e. before
|
||||||
* is called).
|
* acpi_load_tables() is called).
|
||||||
*
|
*
|
||||||
* This is accomplished by looking for the ECDT table, and getting
|
* This is accomplished by looking for the ECDT table, and getting
|
||||||
* the EC parameters out of that.
|
* the EC parameters out of that.
|
||||||
|
@ -1013,6 +1008,22 @@ static int __init acpi_bus_init(void)
|
||||||
status = acpi_ec_ecdt_probe();
|
status = acpi_ec_ecdt_probe();
|
||||||
/* Ignore result. Not having an ECDT is not fatal. */
|
/* Ignore result. Not having an ECDT is not fatal. */
|
||||||
|
|
||||||
|
if (!acpi_gbl_group_module_level_code) {
|
||||||
|
status = acpi_load_tables();
|
||||||
|
if (ACPI_FAILURE(status)) {
|
||||||
|
printk(KERN_ERR PREFIX
|
||||||
|
"Unable to load the System Description Tables\n");
|
||||||
|
goto error1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
status = acpi_enable_subsystem(ACPI_NO_ACPI_ENABLE);
|
||||||
|
if (ACPI_FAILURE(status)) {
|
||||||
|
printk(KERN_ERR PREFIX
|
||||||
|
"Unable to start the ACPI Interpreter\n");
|
||||||
|
goto error1;
|
||||||
|
}
|
||||||
|
|
||||||
status = acpi_initialize_objects(ACPI_FULL_INITIALIZATION);
|
status = acpi_initialize_objects(ACPI_FULL_INITIALIZATION);
|
||||||
if (ACPI_FAILURE(status)) {
|
if (ACPI_FAILURE(status)) {
|
||||||
printk(KERN_ERR PREFIX "Unable to initialize ACPI objects\n");
|
printk(KERN_ERR PREFIX "Unable to initialize ACPI objects\n");
|
||||||
|
|
Loading…
Reference in New Issue