diff options
author | Lv Zheng <lv.zheng@intel.com> | 2016-03-09 21:54:29 -0500 |
---|---|---|
committer | Rafael J. Wysocki <rafael.j.wysocki@intel.com> | 2016-03-10 15:31:14 -0500 |
commit | 5508df89756f8378024828e185724a9bd2348985 (patch) | |
tree | 963ef8e30311e1161922f8c259078b97a489e74f /drivers/acpi/acpica/utxfinit.c | |
parent | 1e059e20ac297346512d9581a8cd3f3cca6a29f9 (diff) |
ACPICA / Interpreter: Fix a regression triggered because of wrong Linux ECDT support
It is reported that the following commit triggers regressions:
Linux commit: efaed9be998b5ae0afb7458e057e5f4402b43fa0
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: efaed9be998b (ACPICA: Events: Enhance acpi_ev_execute_reg_method() to ensure no _REG evaluations can happen during OS early boot stages)
Reported-and-tested-by: Chris Bainbridge <chris.bainbridge@gmail.com>
Signed-off-by: Lv Zheng <lv.zheng@intel.com>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Diffstat (limited to 'drivers/acpi/acpica/utxfinit.c')
-rw-r--r-- | drivers/acpi/acpica/utxfinit.c | 43 |
1 files changed, 11 insertions, 32 deletions
diff --git a/drivers/acpi/acpica/utxfinit.c b/drivers/acpi/acpica/utxfinit.c index d70649d3ac60..75b5f27da267 100644 --- a/drivers/acpi/acpica/utxfinit.c +++ b/drivers/acpi/acpica/utxfinit.c | |||
@@ -154,23 +154,6 @@ acpi_status __init acpi_enable_subsystem(u32 flags) | |||
154 | */ | 154 | */ |
155 | acpi_gbl_early_initialization = FALSE; | 155 | acpi_gbl_early_initialization = FALSE; |
156 | 156 | ||
157 | /* | ||
158 | * Install the default operation region handlers. These are the | ||
159 | * handlers that are defined by the ACPI specification to be | ||
160 | * "always accessible" -- namely, system_memory, system_IO, and | ||
161 | * PCI_Config. This also means that no _REG methods need to be | ||
162 | * run for these address spaces. We need to have these handlers | ||
163 | * installed before any AML code can be executed, especially any | ||
164 | * module-level code (11/2015). | ||
165 | */ | ||
166 | if (!acpi_gbl_group_module_level_code) { | ||
167 | status = acpi_ev_install_region_handlers(); | ||
168 | if (ACPI_FAILURE(status)) { | ||
169 | ACPI_EXCEPTION((AE_INFO, status, | ||
170 | "During Region initialization")); | ||
171 | return_ACPI_STATUS(status); | ||
172 | } | ||
173 | } | ||
174 | #if (!ACPI_REDUCED_HARDWARE) | 157 | #if (!ACPI_REDUCED_HARDWARE) |
175 | 158 | ||
176 | /* Enable ACPI mode */ | 159 | /* Enable ACPI mode */ |
@@ -284,25 +267,21 @@ acpi_status __init acpi_initialize_objects(u32 flags) | |||
284 | */ | 267 | */ |
285 | if (acpi_gbl_group_module_level_code) { | 268 | if (acpi_gbl_group_module_level_code) { |
286 | acpi_ns_exec_module_code_list(); | 269 | acpi_ns_exec_module_code_list(); |
287 | } | ||
288 | 270 | ||
289 | /* | 271 | /* |
290 | * Initialize the objects that remain uninitialized. This runs the | 272 | * Initialize the objects that remain uninitialized. This |
291 | * executable AML that may be part of the declaration of these objects: | 273 | * runs the executable AML that may be part of the |
292 | * operation_regions, buffer_fields, Buffers, and Packages. | 274 | * declaration of these objects: |
293 | */ | 275 | * operation_regions, buffer_fields, Buffers, and Packages. |
294 | if (!(flags & ACPI_NO_OBJECT_INIT)) { | 276 | */ |
295 | ACPI_DEBUG_PRINT((ACPI_DB_EXEC, | 277 | if (!(flags & ACPI_NO_OBJECT_INIT)) { |
296 | "[Init] Completing Initialization of ACPI Objects\n")); | 278 | status = acpi_ns_initialize_objects(); |
297 | 279 | if (ACPI_FAILURE(status)) { | |
298 | status = acpi_ns_initialize_objects(); | 280 | return_ACPI_STATUS(status); |
299 | if (ACPI_FAILURE(status)) { | 281 | } |
300 | return_ACPI_STATUS(status); | ||
301 | } | 282 | } |
302 | } | 283 | } |
303 | 284 | ||
304 | acpi_gbl_namespace_initialized = TRUE; | ||
305 | |||
306 | /* | 285 | /* |
307 | * Initialize all device/region objects in the namespace. This runs | 286 | * Initialize all device/region objects in the namespace. This runs |
308 | * the device _STA and _INI methods and region _REG methods. | 287 | * the device _STA and _INI methods and region _REG methods. |