mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-10 07:10:27 +00:00
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>
This commit is contained in:
parent
67b8d5c708
commit
7b34c0fb1b
@ -56,6 +56,10 @@ acpi_status acpi_ns_initialize_objects(void);
|
|||||||
|
|
||||||
acpi_status acpi_ns_initialize_devices(u32 flags);
|
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
|
* nsload - Namespace loading
|
||||||
*/
|
*/
|
||||||
|
@ -174,6 +174,13 @@ acpi_ex_load_table_op(struct acpi_walk_state *walk_state,
|
|||||||
return_ACPI_STATUS(status);
|
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) */
|
/* Parameter Data (optional) */
|
||||||
|
|
||||||
if (parameter_node) {
|
if (parameter_node) {
|
||||||
@ -430,6 +437,13 @@ acpi_ex_load_op(union acpi_operand_object *obj_desc,
|
|||||||
return_ACPI_STATUS(status);
|
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 */
|
/* Store the ddb_handle into the Target operand */
|
||||||
|
|
||||||
status = acpi_ex_store(ddb_handle, target, walk_state);
|
status = acpi_ex_store(ddb_handle, target, walk_state);
|
||||||
|
@ -240,6 +240,58 @@ error_exit:
|
|||||||
return_ACPI_STATUS(status);
|
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
|
* FUNCTION: acpi_ns_init_one_object
|
||||||
@ -360,27 +412,11 @@ acpi_ns_init_one_object(acpi_handle obj_handle,
|
|||||||
|
|
||||||
case ACPI_TYPE_PACKAGE:
|
case ACPI_TYPE_PACKAGE:
|
||||||
|
|
||||||
|
/* Complete the initialization/resolution of the package object */
|
||||||
|
|
||||||
info->package_init++;
|
info->package_init++;
|
||||||
status = acpi_ds_get_package_arguments(obj_desc);
|
status =
|
||||||
if (ACPI_FAILURE(status)) {
|
acpi_ns_init_one_package(obj_handle, level, NULL, NULL);
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
ACPI_DEBUG_PRINT_RAW((ACPI_DB_PARSE,
|
|
||||||
"%s: Completing resolution of Package elements\n",
|
|
||||||
ACPI_GET_FUNCTION_NAME));
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 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;
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user