diff options
author | Bob Moore <robert.moore@intel.com> | 2018-05-08 17:06:15 -0400 |
---|---|---|
committer | Rafael J. Wysocki <rafael.j.wysocki@intel.com> | 2018-05-14 16:25:45 -0400 |
commit | 7b34c0fb1b51a6377752fc971e57577eeb102d60 (patch) | |
tree | 879c4d9f3ccdbeda8f4d0caf5e3538540da53586 /drivers/acpi/acpica/nsinit.c | |
parent | 67b8d5c7081221efa252e111cd52532ec6d4266f (diff) |
ACPICA: Add deferred package support for the Load and loadTable operators
Completes the support and fixes a regression introduced in
version 20180209.
The regression caused package objects that were loaded by the Load and
loadTable operators. This created an error message like the following:
[ 0.251922] ACPI Error: No pointer back to namespace node in package
00000000fd2a44cd (20180313/dsargs-303)
Link: https://bugzilla.kernel.org/show_bug.cgi?id=199413
Fixes: 5a8361f7ecce (ACPICA: Integrate package handling with module-level code)
Signed-off-by: Bob Moore <robert.moore@intel.com>
Signed-off-by: Erik Schmauss <erik.schmauss@intel.com>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Diffstat (limited to 'drivers/acpi/acpica/nsinit.c')
-rw-r--r-- | drivers/acpi/acpica/nsinit.c | 76 |
1 files changed, 56 insertions, 20 deletions
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: |