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:
Lv Zheng 2016-03-24 10:43:00 +08:00 committed by Rafael J. Wysocki
parent 59f0aa9480
commit fe6cbea0f0
1 changed files with 25 additions and 14 deletions

View File

@ -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");