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 | |
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>
-rw-r--r-- | drivers/acpi/acpica/nsinit.c | 2 | ||||
-rw-r--r-- | drivers/acpi/acpica/tbxfload.c | 26 | ||||
-rw-r--r-- | drivers/acpi/acpica/utxfinit.c | 43 |
3 files changed, 32 insertions, 39 deletions
diff --git a/drivers/acpi/acpica/nsinit.c b/drivers/acpi/acpica/nsinit.c index f029a3da67eb..d4aa8b696ee9 100644 --- a/drivers/acpi/acpica/nsinit.c +++ b/drivers/acpi/acpica/nsinit.c | |||
@@ -84,6 +84,8 @@ acpi_status acpi_ns_initialize_objects(void) | |||
84 | 84 | ||
85 | ACPI_FUNCTION_TRACE(ns_initialize_objects); | 85 | ACPI_FUNCTION_TRACE(ns_initialize_objects); |
86 | 86 | ||
87 | ACPI_DEBUG_PRINT((ACPI_DB_EXEC, | ||
88 | "[Init] Completing Initialization of ACPI Objects\n")); | ||
87 | ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH, | 89 | ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH, |
88 | "**** Starting initialization of namespace objects ****\n")); | 90 | "**** Starting initialization of namespace objects ****\n")); |
89 | ACPI_DEBUG_PRINT_RAW((ACPI_DB_INIT, | 91 | ACPI_DEBUG_PRINT_RAW((ACPI_DB_INIT, |
diff --git a/drivers/acpi/acpica/tbxfload.c b/drivers/acpi/acpica/tbxfload.c index 9496b84476a4..3151968c10d1 100644 --- a/drivers/acpi/acpica/tbxfload.c +++ b/drivers/acpi/acpica/tbxfload.c | |||
@@ -81,13 +81,11 @@ acpi_status __init acpi_load_tables(void) | |||
81 | * between acpi_initialize_subsystem() and acpi_load_tables() to use | 81 | * between acpi_initialize_subsystem() and acpi_load_tables() to use |
82 | * their customized default region handlers. | 82 | * their customized default region handlers. |
83 | */ | 83 | */ |
84 | if (acpi_gbl_group_module_level_code) { | 84 | status = acpi_ev_install_region_handlers(); |
85 | status = acpi_ev_install_region_handlers(); | 85 | if (ACPI_FAILURE(status) && status != AE_ALREADY_EXISTS) { |
86 | if (ACPI_FAILURE(status) && status != AE_ALREADY_EXISTS) { | 86 | ACPI_EXCEPTION((AE_INFO, status, |
87 | ACPI_EXCEPTION((AE_INFO, status, | 87 | "During Region initialization")); |
88 | "During Region initialization")); | 88 | return_ACPI_STATUS(status); |
89 | return_ACPI_STATUS(status); | ||
90 | } | ||
91 | } | 89 | } |
92 | 90 | ||
93 | /* Load the namespace from the tables */ | 91 | /* Load the namespace from the tables */ |
@@ -105,6 +103,20 @@ acpi_status __init acpi_load_tables(void) | |||
105 | "While loading namespace from ACPI tables")); | 103 | "While loading namespace from ACPI tables")); |
106 | } | 104 | } |
107 | 105 | ||
106 | if (!acpi_gbl_group_module_level_code) { | ||
107 | /* | ||
108 | * Initialize the objects that remain uninitialized. This | ||
109 | * runs the executable AML that may be part of the | ||
110 | * declaration of these objects: | ||
111 | * operation_regions, buffer_fields, Buffers, and Packages. | ||
112 | */ | ||
113 | status = acpi_ns_initialize_objects(); | ||
114 | if (ACPI_FAILURE(status)) { | ||
115 | return_ACPI_STATUS(status); | ||
116 | } | ||
117 | } | ||
118 | |||
119 | acpi_gbl_namespace_initialized = TRUE; | ||
108 | return_ACPI_STATUS(status); | 120 | return_ACPI_STATUS(status); |
109 | } | 121 | } |
110 | 122 | ||
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. |