Commit 5508df89 authored by Lv Zheng's avatar Lv Zheng Committed by Rafael J. Wysocki

ACPICA / Interpreter: Fix a regression triggered because of wrong Linux ECDT support

It is reported that the following commit triggers regressions:
 Linux commit: efaed9be
 ACPICA commit: 31178590dde82368fdb0f6b0e466b6c0add96c57
 Subject: ACPICA: Events: Enhance acpi_ev_execute_reg_method() to
          ensure no _REG evaluations can happen during OS early boot
          stages

This is because that the ECDT support is not corrected in Linux, and Linux
requires to execute _REG for ECDT (though this sounds so wrong), we need to
ensure acpi_gbl_namespace_initialized is set before ECDT probing in order
for _REG to be executed. Since we have to move
"acpi_gbl_namespace_initialized = TRUE" to the initialization step
happening before ECDT probing, acpi_load_tables() is the best candidate for
now. Thus this patch fixes the regression by doing so.

But if the ECDT support is fixed, Linux will not execute _REG for ECDT, and
ECDT probing will happen before acpi_load_tables(). At that time, we still
want to ensure acpi_gbl_namespace_initialized is set after executing
acpi_ns_initialize_objects() (under the condition of
acpi_gbl_group_module_level_code = FALSE), this patch also moves
acpi_ns_initialize_objects() to acpi_load_tables() accordingly.

Since acpi_ns_initialize_objects() doesn't seem to be skippable, this
patch also removes ACPI_NO_OBJECT_INIT for the one invoked in
acpi_load_tables(). And since the default region handlers should always be
installed before loading the tables, this patch also removes useless
acpi_gbl_group_module_level_code check accordingly. Reported by Chris
Bainbridge, Fixed by Lv Zheng.

Fixes: efaed9be (ACPICA: Events: Enhance acpi_ev_execute_reg_method() to ensure no _REG evaluations can happen during OS early boot stages)
Reported-and-tested-by: default avatarChris Bainbridge <chris.bainbridge@gmail.com>
Signed-off-by: default avatarLv Zheng <lv.zheng@intel.com>
Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
parent 1e059e20
...@@ -84,6 +84,8 @@ acpi_status acpi_ns_initialize_objects(void) ...@@ -84,6 +84,8 @@ acpi_status acpi_ns_initialize_objects(void)
ACPI_FUNCTION_TRACE(ns_initialize_objects); ACPI_FUNCTION_TRACE(ns_initialize_objects);
ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
"[Init] Completing Initialization of ACPI Objects\n"));
ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH, ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH,
"**** Starting initialization of namespace objects ****\n")); "**** Starting initialization of namespace objects ****\n"));
ACPI_DEBUG_PRINT_RAW((ACPI_DB_INIT, ACPI_DEBUG_PRINT_RAW((ACPI_DB_INIT,
......
...@@ -81,13 +81,11 @@ acpi_status __init acpi_load_tables(void) ...@@ -81,13 +81,11 @@ acpi_status __init acpi_load_tables(void)
* between acpi_initialize_subsystem() and acpi_load_tables() to use * between acpi_initialize_subsystem() and acpi_load_tables() to use
* their customized default region handlers. * their customized default region handlers.
*/ */
if (acpi_gbl_group_module_level_code) { status = acpi_ev_install_region_handlers();
status = acpi_ev_install_region_handlers(); if (ACPI_FAILURE(status) && status != AE_ALREADY_EXISTS) {
if (ACPI_FAILURE(status) && status != AE_ALREADY_EXISTS) { ACPI_EXCEPTION((AE_INFO, status,
ACPI_EXCEPTION((AE_INFO, status, "During Region initialization"));
"During Region initialization")); return_ACPI_STATUS(status);
return_ACPI_STATUS(status);
}
} }
/* Load the namespace from the tables */ /* Load the namespace from the tables */
...@@ -105,6 +103,20 @@ acpi_status __init acpi_load_tables(void) ...@@ -105,6 +103,20 @@ acpi_status __init acpi_load_tables(void)
"While loading namespace from ACPI tables")); "While loading namespace from ACPI tables"));
} }
if (!acpi_gbl_group_module_level_code) {
/*
* Initialize the objects that remain uninitialized. This
* runs the executable AML that may be part of the
* declaration of these objects:
* operation_regions, buffer_fields, Buffers, and Packages.
*/
status = acpi_ns_initialize_objects();
if (ACPI_FAILURE(status)) {
return_ACPI_STATUS(status);
}
}
acpi_gbl_namespace_initialized = TRUE;
return_ACPI_STATUS(status); return_ACPI_STATUS(status);
} }
......
...@@ -154,23 +154,6 @@ acpi_status __init acpi_enable_subsystem(u32 flags) ...@@ -154,23 +154,6 @@ acpi_status __init acpi_enable_subsystem(u32 flags)
*/ */
acpi_gbl_early_initialization = FALSE; acpi_gbl_early_initialization = FALSE;
/*
* Install the default operation region handlers. These are the
* handlers that are defined by the ACPI specification to be
* "always accessible" -- namely, system_memory, system_IO, and
* PCI_Config. This also means that no _REG methods need to be
* run for these address spaces. We need to have these handlers
* installed before any AML code can be executed, especially any
* module-level code (11/2015).
*/
if (!acpi_gbl_group_module_level_code) {
status = acpi_ev_install_region_handlers();
if (ACPI_FAILURE(status)) {
ACPI_EXCEPTION((AE_INFO, status,
"During Region initialization"));
return_ACPI_STATUS(status);
}
}
#if (!ACPI_REDUCED_HARDWARE) #if (!ACPI_REDUCED_HARDWARE)
/* Enable ACPI mode */ /* Enable ACPI mode */
...@@ -284,25 +267,21 @@ acpi_status __init acpi_initialize_objects(u32 flags) ...@@ -284,25 +267,21 @@ acpi_status __init acpi_initialize_objects(u32 flags)
*/ */
if (acpi_gbl_group_module_level_code) { if (acpi_gbl_group_module_level_code) {
acpi_ns_exec_module_code_list(); acpi_ns_exec_module_code_list();
}
/* /*
* Initialize the objects that remain uninitialized. This runs the * Initialize the objects that remain uninitialized. This
* executable AML that may be part of the declaration of these objects: * runs the executable AML that may be part of the
* operation_regions, buffer_fields, Buffers, and Packages. * declaration of these objects:
*/ * operation_regions, buffer_fields, Buffers, and Packages.
if (!(flags & ACPI_NO_OBJECT_INIT)) { */
ACPI_DEBUG_PRINT((ACPI_DB_EXEC, if (!(flags & ACPI_NO_OBJECT_INIT)) {
"[Init] Completing Initialization of ACPI Objects\n")); status = acpi_ns_initialize_objects();
if (ACPI_FAILURE(status)) {
status = acpi_ns_initialize_objects(); return_ACPI_STATUS(status);
if (ACPI_FAILURE(status)) { }
return_ACPI_STATUS(status);
} }
} }
acpi_gbl_namespace_initialized = TRUE;
/* /*
* Initialize all device/region objects in the namespace. This runs * Initialize all device/region objects in the namespace. This runs
* the device _STA and _INI methods and region _REG methods. * the device _STA and _INI methods and region _REG methods.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment