aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/acpi/acpica/utxfinit.c
diff options
context:
space:
mode:
authorLv Zheng <lv.zheng@intel.com>2016-03-09 21:54:29 -0500
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>2016-03-10 15:31:14 -0500
commit5508df89756f8378024828e185724a9bd2348985 (patch)
tree963ef8e30311e1161922f8c259078b97a489e74f /drivers/acpi/acpica/utxfinit.c
parent1e059e20ac297346512d9581a8cd3f3cca6a29f9 (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.c43
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.