diff options
-rw-r--r-- | drivers/acpi/acpica/acnamesp.h | 4 | ||||
-rw-r--r-- | drivers/acpi/acpica/exconfig.c | 14 | ||||
-rw-r--r-- | drivers/acpi/acpica/nsinit.c | 76 |
3 files changed, 74 insertions, 20 deletions
diff --git a/drivers/acpi/acpica/acnamesp.h b/drivers/acpi/acpica/acnamesp.h index 514aaf948ea9..3825df923480 100644 --- a/drivers/acpi/acpica/acnamesp.h +++ b/drivers/acpi/acpica/acnamesp.h | |||
@@ -56,6 +56,10 @@ acpi_status acpi_ns_initialize_objects(void); | |||
56 | 56 | ||
57 | acpi_status acpi_ns_initialize_devices(u32 flags); | 57 | acpi_status acpi_ns_initialize_devices(u32 flags); |
58 | 58 | ||
59 | acpi_status | ||
60 | acpi_ns_init_one_package(acpi_handle obj_handle, | ||
61 | u32 level, void *context, void **return_value); | ||
62 | |||
59 | /* | 63 | /* |
60 | * nsload - Namespace loading | 64 | * nsload - Namespace loading |
61 | */ | 65 | */ |
diff --git a/drivers/acpi/acpica/exconfig.c b/drivers/acpi/acpica/exconfig.c index 99d92cb32803..f85c6f3271f6 100644 --- a/drivers/acpi/acpica/exconfig.c +++ b/drivers/acpi/acpica/exconfig.c | |||
@@ -174,6 +174,13 @@ acpi_ex_load_table_op(struct acpi_walk_state *walk_state, | |||
174 | return_ACPI_STATUS(status); | 174 | return_ACPI_STATUS(status); |
175 | } | 175 | } |
176 | 176 | ||
177 | /* Complete the initialization/resolution of package objects */ | ||
178 | |||
179 | status = acpi_ns_walk_namespace(ACPI_TYPE_PACKAGE, ACPI_ROOT_OBJECT, | ||
180 | ACPI_UINT32_MAX, 0, | ||
181 | acpi_ns_init_one_package, NULL, NULL, | ||
182 | NULL); | ||
183 | |||
177 | /* Parameter Data (optional) */ | 184 | /* Parameter Data (optional) */ |
178 | 185 | ||
179 | if (parameter_node) { | 186 | if (parameter_node) { |
@@ -430,6 +437,13 @@ acpi_ex_load_op(union acpi_operand_object *obj_desc, | |||
430 | return_ACPI_STATUS(status); | 437 | return_ACPI_STATUS(status); |
431 | } | 438 | } |
432 | 439 | ||
440 | /* Complete the initialization/resolution of package objects */ | ||
441 | |||
442 | status = acpi_ns_walk_namespace(ACPI_TYPE_PACKAGE, ACPI_ROOT_OBJECT, | ||
443 | ACPI_UINT32_MAX, 0, | ||
444 | acpi_ns_init_one_package, NULL, NULL, | ||
445 | NULL); | ||
446 | |||
433 | /* Store the ddb_handle into the Target operand */ | 447 | /* Store the ddb_handle into the Target operand */ |
434 | 448 | ||
435 | status = acpi_ex_store(ddb_handle, target, walk_state); | 449 | status = acpi_ex_store(ddb_handle, target, walk_state); |
diff --git a/drivers/acpi/acpica/nsinit.c b/drivers/acpi/acpica/nsinit.c index 77f2b5f4948a..d77257d1c827 100644 --- a/drivers/acpi/acpica/nsinit.c +++ b/drivers/acpi/acpica/nsinit.c | |||
@@ -242,6 +242,58 @@ error_exit: | |||
242 | 242 | ||
243 | /******************************************************************************* | 243 | /******************************************************************************* |
244 | * | 244 | * |
245 | * FUNCTION: acpi_ns_init_one_package | ||
246 | * | ||
247 | * PARAMETERS: obj_handle - Node | ||
248 | * level - Current nesting level | ||
249 | * context - Not used | ||
250 | * return_value - Not used | ||
251 | * | ||
252 | * RETURN: Status | ||
253 | * | ||
254 | * DESCRIPTION: Callback from acpi_walk_namespace. Invoked for every package | ||
255 | * within the namespace. Used during dynamic load of an SSDT. | ||
256 | * | ||
257 | ******************************************************************************/ | ||
258 | |||
259 | acpi_status | ||
260 | acpi_ns_init_one_package(acpi_handle obj_handle, | ||
261 | u32 level, void *context, void **return_value) | ||
262 | { | ||
263 | acpi_status status; | ||
264 | union acpi_operand_object *obj_desc; | ||
265 | struct acpi_namespace_node *node = | ||
266 | (struct acpi_namespace_node *)obj_handle; | ||
267 | |||
268 | obj_desc = acpi_ns_get_attached_object(node); | ||
269 | if (!obj_desc) { | ||
270 | return (AE_OK); | ||
271 | } | ||
272 | |||
273 | /* Exit if package is already initialized */ | ||
274 | |||
275 | if (obj_desc->package.flags & AOPOBJ_DATA_VALID) { | ||
276 | return (AE_OK); | ||
277 | } | ||
278 | |||
279 | status = acpi_ds_get_package_arguments(obj_desc); | ||
280 | if (ACPI_FAILURE(status)) { | ||
281 | return (AE_OK); | ||
282 | } | ||
283 | |||
284 | status = | ||
285 | acpi_ut_walk_package_tree(obj_desc, NULL, | ||
286 | acpi_ds_init_package_element, NULL); | ||
287 | if (ACPI_FAILURE(status)) { | ||
288 | return (AE_OK); | ||
289 | } | ||
290 | |||
291 | obj_desc->package.flags |= AOPOBJ_DATA_VALID; | ||
292 | return (AE_OK); | ||
293 | } | ||
294 | |||
295 | /******************************************************************************* | ||
296 | * | ||
245 | * FUNCTION: acpi_ns_init_one_object | 297 | * FUNCTION: acpi_ns_init_one_object |
246 | * | 298 | * |
247 | * PARAMETERS: obj_handle - Node | 299 | * PARAMETERS: obj_handle - Node |
@@ -360,27 +412,11 @@ acpi_ns_init_one_object(acpi_handle obj_handle, | |||
360 | 412 | ||
361 | case ACPI_TYPE_PACKAGE: | 413 | case ACPI_TYPE_PACKAGE: |
362 | 414 | ||
363 | info->package_init++; | 415 | /* Complete the initialization/resolution of the package object */ |
364 | status = acpi_ds_get_package_arguments(obj_desc); | ||
365 | if (ACPI_FAILURE(status)) { | ||
366 | break; | ||
367 | } | ||
368 | |||
369 | ACPI_DEBUG_PRINT_RAW((ACPI_DB_PARSE, | ||
370 | "%s: Completing resolution of Package elements\n", | ||
371 | ACPI_GET_FUNCTION_NAME)); | ||
372 | 416 | ||
373 | /* | 417 | info->package_init++; |
374 | * Resolve all named references in package objects (and all | 418 | status = |
375 | * sub-packages). This action has been deferred until the entire | 419 | acpi_ns_init_one_package(obj_handle, level, NULL, NULL); |
376 | * namespace has been loaded, in order to support external and | ||
377 | * forward references from individual package elements (05/2017). | ||
378 | */ | ||
379 | status = acpi_ut_walk_package_tree(obj_desc, NULL, | ||
380 | acpi_ds_init_package_element, | ||
381 | NULL); | ||
382 | |||
383 | obj_desc->package.flags |= AOPOBJ_DATA_VALID; | ||
384 | break; | 420 | break; |
385 | 421 | ||
386 | default: | 422 | default: |