Skip to content

Commit

Permalink
ACPICA: Add deferred package support for the Load and loadTable opera…
Browse files Browse the repository at this point in the history
…tors

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: 5a8361f (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>
  • Loading branch information
Bob Moore authored and Rafael J. Wysocki committed May 14, 2018
1 parent 67b8d5c commit 7b34c0f
Show file tree
Hide file tree
Showing 3 changed files with 74 additions and 20 deletions.
4 changes: 4 additions & 0 deletions drivers/acpi/acpica/acnamesp.h
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,10 @@ acpi_status acpi_ns_initialize_objects(void);

acpi_status acpi_ns_initialize_devices(u32 flags);

acpi_status
acpi_ns_init_one_package(acpi_handle obj_handle,
u32 level, void *context, void **return_value);

/*
* nsload - Namespace loading
*/
Expand Down
14 changes: 14 additions & 0 deletions drivers/acpi/acpica/exconfig.c
Original file line number Diff line number Diff line change
Expand Up @@ -174,6 +174,13 @@ acpi_ex_load_table_op(struct acpi_walk_state *walk_state,
return_ACPI_STATUS(status);
}

/* Complete the initialization/resolution of package objects */

status = acpi_ns_walk_namespace(ACPI_TYPE_PACKAGE, ACPI_ROOT_OBJECT,
ACPI_UINT32_MAX, 0,
acpi_ns_init_one_package, NULL, NULL,
NULL);

/* Parameter Data (optional) */

if (parameter_node) {
Expand Down Expand Up @@ -430,6 +437,13 @@ acpi_ex_load_op(union acpi_operand_object *obj_desc,
return_ACPI_STATUS(status);
}

/* Complete the initialization/resolution of package objects */

status = acpi_ns_walk_namespace(ACPI_TYPE_PACKAGE, ACPI_ROOT_OBJECT,
ACPI_UINT32_MAX, 0,
acpi_ns_init_one_package, NULL, NULL,
NULL);

/* Store the ddb_handle into the Target operand */

status = acpi_ex_store(ddb_handle, target, walk_state);
Expand Down
76 changes: 56 additions & 20 deletions drivers/acpi/acpica/nsinit.c
Original file line number Diff line number Diff line change
Expand Up @@ -240,6 +240,58 @@ acpi_status acpi_ns_initialize_devices(u32 flags)
return_ACPI_STATUS(status);
}

/*******************************************************************************
*
* FUNCTION: acpi_ns_init_one_package
*
* PARAMETERS: obj_handle - Node
* level - Current nesting level
* context - Not used
* return_value - Not used
*
* RETURN: Status
*
* DESCRIPTION: Callback from acpi_walk_namespace. Invoked for every package
* within the namespace. Used during dynamic load of an SSDT.
*
******************************************************************************/

acpi_status
acpi_ns_init_one_package(acpi_handle obj_handle,
u32 level, void *context, void **return_value)
{
acpi_status status;
union acpi_operand_object *obj_desc;
struct acpi_namespace_node *node =
(struct acpi_namespace_node *)obj_handle;

obj_desc = acpi_ns_get_attached_object(node);
if (!obj_desc) {
return (AE_OK);
}

/* Exit if package is already initialized */

if (obj_desc->package.flags & AOPOBJ_DATA_VALID) {
return (AE_OK);
}

status = acpi_ds_get_package_arguments(obj_desc);
if (ACPI_FAILURE(status)) {
return (AE_OK);
}

status =
acpi_ut_walk_package_tree(obj_desc, NULL,
acpi_ds_init_package_element, NULL);
if (ACPI_FAILURE(status)) {
return (AE_OK);
}

obj_desc->package.flags |= AOPOBJ_DATA_VALID;
return (AE_OK);
}

/*******************************************************************************
*
* FUNCTION: acpi_ns_init_one_object
Expand Down Expand Up @@ -360,27 +412,11 @@ acpi_ns_init_one_object(acpi_handle obj_handle,

case ACPI_TYPE_PACKAGE:

info->package_init++;
status = acpi_ds_get_package_arguments(obj_desc);
if (ACPI_FAILURE(status)) {
break;
}

ACPI_DEBUG_PRINT_RAW((ACPI_DB_PARSE,
"%s: Completing resolution of Package elements\n",
ACPI_GET_FUNCTION_NAME));
/* Complete the initialization/resolution of the package object */

/*
* Resolve all named references in package objects (and all
* sub-packages). This action has been deferred until the entire
* namespace has been loaded, in order to support external and
* forward references from individual package elements (05/2017).
*/
status = acpi_ut_walk_package_tree(obj_desc, NULL,
acpi_ds_init_package_element,
NULL);

obj_desc->package.flags |= AOPOBJ_DATA_VALID;
info->package_init++;
status =
acpi_ns_init_one_package(obj_handle, level, NULL, NULL);
break;

default:
Expand Down

0 comments on commit 7b34c0f

Please sign in to comment.