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);  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   */ 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,  		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) { @@ -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); 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:  /*******************************************************************************   * + * 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   *   * PARAMETERS:  obj_handle      - Node @@ -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: | 
