162306a36Sopenharmony_ci// SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0
262306a36Sopenharmony_ci/******************************************************************************
362306a36Sopenharmony_ci *
462306a36Sopenharmony_ci * Module Name: dsargs - Support for execution of dynamic arguments for static
562306a36Sopenharmony_ci *                       objects (regions, fields, buffer fields, etc.)
662306a36Sopenharmony_ci *
762306a36Sopenharmony_ci * Copyright (C) 2000 - 2023, Intel Corp.
862306a36Sopenharmony_ci *
962306a36Sopenharmony_ci *****************************************************************************/
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci#include <acpi/acpi.h>
1262306a36Sopenharmony_ci#include "accommon.h"
1362306a36Sopenharmony_ci#include "acparser.h"
1462306a36Sopenharmony_ci#include "amlcode.h"
1562306a36Sopenharmony_ci#include "acdispat.h"
1662306a36Sopenharmony_ci#include "acnamesp.h"
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_ci#define _COMPONENT          ACPI_DISPATCHER
1962306a36Sopenharmony_ciACPI_MODULE_NAME("dsargs")
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_ci/* Local prototypes */
2262306a36Sopenharmony_cistatic acpi_status
2362306a36Sopenharmony_ciacpi_ds_execute_arguments(struct acpi_namespace_node *node,
2462306a36Sopenharmony_ci			  struct acpi_namespace_node *scope_node,
2562306a36Sopenharmony_ci			  u32 aml_length, u8 *aml_start);
2662306a36Sopenharmony_ci
2762306a36Sopenharmony_ci/*******************************************************************************
2862306a36Sopenharmony_ci *
2962306a36Sopenharmony_ci * FUNCTION:    acpi_ds_execute_arguments
3062306a36Sopenharmony_ci *
3162306a36Sopenharmony_ci * PARAMETERS:  node                - Object NS node
3262306a36Sopenharmony_ci *              scope_node          - Parent NS node
3362306a36Sopenharmony_ci *              aml_length          - Length of executable AML
3462306a36Sopenharmony_ci *              aml_start           - Pointer to the AML
3562306a36Sopenharmony_ci *
3662306a36Sopenharmony_ci * RETURN:      Status.
3762306a36Sopenharmony_ci *
3862306a36Sopenharmony_ci * DESCRIPTION: Late (deferred) execution of region or field arguments
3962306a36Sopenharmony_ci *
4062306a36Sopenharmony_ci ******************************************************************************/
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_cistatic acpi_status
4362306a36Sopenharmony_ciacpi_ds_execute_arguments(struct acpi_namespace_node *node,
4462306a36Sopenharmony_ci			  struct acpi_namespace_node *scope_node,
4562306a36Sopenharmony_ci			  u32 aml_length, u8 *aml_start)
4662306a36Sopenharmony_ci{
4762306a36Sopenharmony_ci	acpi_status status;
4862306a36Sopenharmony_ci	union acpi_parse_object *op;
4962306a36Sopenharmony_ci	struct acpi_walk_state *walk_state;
5062306a36Sopenharmony_ci
5162306a36Sopenharmony_ci	ACPI_FUNCTION_TRACE_PTR(ds_execute_arguments, aml_start);
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_ci	/* Allocate a new parser op to be the root of the parsed tree */
5462306a36Sopenharmony_ci
5562306a36Sopenharmony_ci	op = acpi_ps_alloc_op(AML_INT_EVAL_SUBTREE_OP, aml_start);
5662306a36Sopenharmony_ci	if (!op) {
5762306a36Sopenharmony_ci		return_ACPI_STATUS(AE_NO_MEMORY);
5862306a36Sopenharmony_ci	}
5962306a36Sopenharmony_ci
6062306a36Sopenharmony_ci	/* Save the Node for use in acpi_ps_parse_aml */
6162306a36Sopenharmony_ci
6262306a36Sopenharmony_ci	op->common.node = scope_node;
6362306a36Sopenharmony_ci
6462306a36Sopenharmony_ci	/* Create and initialize a new parser state */
6562306a36Sopenharmony_ci
6662306a36Sopenharmony_ci	walk_state = acpi_ds_create_walk_state(0, NULL, NULL, NULL);
6762306a36Sopenharmony_ci	if (!walk_state) {
6862306a36Sopenharmony_ci		status = AE_NO_MEMORY;
6962306a36Sopenharmony_ci		goto cleanup;
7062306a36Sopenharmony_ci	}
7162306a36Sopenharmony_ci
7262306a36Sopenharmony_ci	status = acpi_ds_init_aml_walk(walk_state, op, NULL, aml_start,
7362306a36Sopenharmony_ci				       aml_length, NULL, ACPI_IMODE_LOAD_PASS1);
7462306a36Sopenharmony_ci	if (ACPI_FAILURE(status)) {
7562306a36Sopenharmony_ci		acpi_ds_delete_walk_state(walk_state);
7662306a36Sopenharmony_ci		goto cleanup;
7762306a36Sopenharmony_ci	}
7862306a36Sopenharmony_ci
7962306a36Sopenharmony_ci	/* Mark this parse as a deferred opcode */
8062306a36Sopenharmony_ci
8162306a36Sopenharmony_ci	walk_state->parse_flags = ACPI_PARSE_DEFERRED_OP;
8262306a36Sopenharmony_ci	walk_state->deferred_node = node;
8362306a36Sopenharmony_ci
8462306a36Sopenharmony_ci	/* Pass1: Parse the entire declaration */
8562306a36Sopenharmony_ci
8662306a36Sopenharmony_ci	status = acpi_ps_parse_aml(walk_state);
8762306a36Sopenharmony_ci	if (ACPI_FAILURE(status)) {
8862306a36Sopenharmony_ci		goto cleanup;
8962306a36Sopenharmony_ci	}
9062306a36Sopenharmony_ci
9162306a36Sopenharmony_ci	/* Get and init the Op created above */
9262306a36Sopenharmony_ci
9362306a36Sopenharmony_ci	op->common.node = node;
9462306a36Sopenharmony_ci	acpi_ps_delete_parse_tree(op);
9562306a36Sopenharmony_ci
9662306a36Sopenharmony_ci	/* Evaluate the deferred arguments */
9762306a36Sopenharmony_ci
9862306a36Sopenharmony_ci	op = acpi_ps_alloc_op(AML_INT_EVAL_SUBTREE_OP, aml_start);
9962306a36Sopenharmony_ci	if (!op) {
10062306a36Sopenharmony_ci		return_ACPI_STATUS(AE_NO_MEMORY);
10162306a36Sopenharmony_ci	}
10262306a36Sopenharmony_ci
10362306a36Sopenharmony_ci	op->common.node = scope_node;
10462306a36Sopenharmony_ci
10562306a36Sopenharmony_ci	/* Create and initialize a new parser state */
10662306a36Sopenharmony_ci
10762306a36Sopenharmony_ci	walk_state = acpi_ds_create_walk_state(0, NULL, NULL, NULL);
10862306a36Sopenharmony_ci	if (!walk_state) {
10962306a36Sopenharmony_ci		status = AE_NO_MEMORY;
11062306a36Sopenharmony_ci		goto cleanup;
11162306a36Sopenharmony_ci	}
11262306a36Sopenharmony_ci
11362306a36Sopenharmony_ci	/* Execute the opcode and arguments */
11462306a36Sopenharmony_ci
11562306a36Sopenharmony_ci	status = acpi_ds_init_aml_walk(walk_state, op, NULL, aml_start,
11662306a36Sopenharmony_ci				       aml_length, NULL, ACPI_IMODE_EXECUTE);
11762306a36Sopenharmony_ci	if (ACPI_FAILURE(status)) {
11862306a36Sopenharmony_ci		acpi_ds_delete_walk_state(walk_state);
11962306a36Sopenharmony_ci		goto cleanup;
12062306a36Sopenharmony_ci	}
12162306a36Sopenharmony_ci
12262306a36Sopenharmony_ci	/* Mark this execution as a deferred opcode */
12362306a36Sopenharmony_ci
12462306a36Sopenharmony_ci	walk_state->deferred_node = node;
12562306a36Sopenharmony_ci	status = acpi_ps_parse_aml(walk_state);
12662306a36Sopenharmony_ci
12762306a36Sopenharmony_cicleanup:
12862306a36Sopenharmony_ci	acpi_ps_delete_parse_tree(op);
12962306a36Sopenharmony_ci	return_ACPI_STATUS(status);
13062306a36Sopenharmony_ci}
13162306a36Sopenharmony_ci
13262306a36Sopenharmony_ci/*******************************************************************************
13362306a36Sopenharmony_ci *
13462306a36Sopenharmony_ci * FUNCTION:    acpi_ds_get_buffer_field_arguments
13562306a36Sopenharmony_ci *
13662306a36Sopenharmony_ci * PARAMETERS:  obj_desc        - A valid buffer_field object
13762306a36Sopenharmony_ci *
13862306a36Sopenharmony_ci * RETURN:      Status.
13962306a36Sopenharmony_ci *
14062306a36Sopenharmony_ci * DESCRIPTION: Get buffer_field Buffer and Index. This implements the late
14162306a36Sopenharmony_ci *              evaluation of these field attributes.
14262306a36Sopenharmony_ci *
14362306a36Sopenharmony_ci ******************************************************************************/
14462306a36Sopenharmony_ci
14562306a36Sopenharmony_ciacpi_status
14662306a36Sopenharmony_ciacpi_ds_get_buffer_field_arguments(union acpi_operand_object *obj_desc)
14762306a36Sopenharmony_ci{
14862306a36Sopenharmony_ci	union acpi_operand_object *extra_desc;
14962306a36Sopenharmony_ci	struct acpi_namespace_node *node;
15062306a36Sopenharmony_ci	acpi_status status;
15162306a36Sopenharmony_ci
15262306a36Sopenharmony_ci	ACPI_FUNCTION_TRACE_PTR(ds_get_buffer_field_arguments, obj_desc);
15362306a36Sopenharmony_ci
15462306a36Sopenharmony_ci	if (obj_desc->common.flags & AOPOBJ_DATA_VALID) {
15562306a36Sopenharmony_ci		return_ACPI_STATUS(AE_OK);
15662306a36Sopenharmony_ci	}
15762306a36Sopenharmony_ci
15862306a36Sopenharmony_ci	/* Get the AML pointer (method object) and buffer_field node */
15962306a36Sopenharmony_ci
16062306a36Sopenharmony_ci	extra_desc = acpi_ns_get_secondary_object(obj_desc);
16162306a36Sopenharmony_ci	node = obj_desc->buffer_field.node;
16262306a36Sopenharmony_ci
16362306a36Sopenharmony_ci	ACPI_DEBUG_EXEC(acpi_ut_display_init_pathname
16462306a36Sopenharmony_ci			(ACPI_TYPE_BUFFER_FIELD, node, NULL));
16562306a36Sopenharmony_ci
16662306a36Sopenharmony_ci	ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "[%4.4s] BufferField Arg Init\n",
16762306a36Sopenharmony_ci			  acpi_ut_get_node_name(node)));
16862306a36Sopenharmony_ci
16962306a36Sopenharmony_ci	/* Execute the AML code for the term_arg arguments */
17062306a36Sopenharmony_ci
17162306a36Sopenharmony_ci	status = acpi_ds_execute_arguments(node, node->parent,
17262306a36Sopenharmony_ci					   extra_desc->extra.aml_length,
17362306a36Sopenharmony_ci					   extra_desc->extra.aml_start);
17462306a36Sopenharmony_ci	return_ACPI_STATUS(status);
17562306a36Sopenharmony_ci}
17662306a36Sopenharmony_ci
17762306a36Sopenharmony_ci/*******************************************************************************
17862306a36Sopenharmony_ci *
17962306a36Sopenharmony_ci * FUNCTION:    acpi_ds_get_bank_field_arguments
18062306a36Sopenharmony_ci *
18162306a36Sopenharmony_ci * PARAMETERS:  obj_desc        - A valid bank_field object
18262306a36Sopenharmony_ci *
18362306a36Sopenharmony_ci * RETURN:      Status.
18462306a36Sopenharmony_ci *
18562306a36Sopenharmony_ci * DESCRIPTION: Get bank_field bank_value. This implements the late
18662306a36Sopenharmony_ci *              evaluation of these field attributes.
18762306a36Sopenharmony_ci *
18862306a36Sopenharmony_ci ******************************************************************************/
18962306a36Sopenharmony_ci
19062306a36Sopenharmony_ciacpi_status
19162306a36Sopenharmony_ciacpi_ds_get_bank_field_arguments(union acpi_operand_object *obj_desc)
19262306a36Sopenharmony_ci{
19362306a36Sopenharmony_ci	union acpi_operand_object *extra_desc;
19462306a36Sopenharmony_ci	struct acpi_namespace_node *node;
19562306a36Sopenharmony_ci	acpi_status status;
19662306a36Sopenharmony_ci
19762306a36Sopenharmony_ci	ACPI_FUNCTION_TRACE_PTR(ds_get_bank_field_arguments, obj_desc);
19862306a36Sopenharmony_ci
19962306a36Sopenharmony_ci	if (obj_desc->common.flags & AOPOBJ_DATA_VALID) {
20062306a36Sopenharmony_ci		return_ACPI_STATUS(AE_OK);
20162306a36Sopenharmony_ci	}
20262306a36Sopenharmony_ci
20362306a36Sopenharmony_ci	/* Get the AML pointer (method object) and bank_field node */
20462306a36Sopenharmony_ci
20562306a36Sopenharmony_ci	extra_desc = acpi_ns_get_secondary_object(obj_desc);
20662306a36Sopenharmony_ci	node = obj_desc->bank_field.node;
20762306a36Sopenharmony_ci
20862306a36Sopenharmony_ci	ACPI_DEBUG_EXEC(acpi_ut_display_init_pathname
20962306a36Sopenharmony_ci			(ACPI_TYPE_LOCAL_BANK_FIELD, node, NULL));
21062306a36Sopenharmony_ci
21162306a36Sopenharmony_ci	ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "[%4.4s] BankField Arg Init\n",
21262306a36Sopenharmony_ci			  acpi_ut_get_node_name(node)));
21362306a36Sopenharmony_ci
21462306a36Sopenharmony_ci	/* Execute the AML code for the term_arg arguments */
21562306a36Sopenharmony_ci
21662306a36Sopenharmony_ci	status = acpi_ds_execute_arguments(node, node->parent,
21762306a36Sopenharmony_ci					   extra_desc->extra.aml_length,
21862306a36Sopenharmony_ci					   extra_desc->extra.aml_start);
21962306a36Sopenharmony_ci	if (ACPI_FAILURE(status)) {
22062306a36Sopenharmony_ci		return_ACPI_STATUS(status);
22162306a36Sopenharmony_ci	}
22262306a36Sopenharmony_ci
22362306a36Sopenharmony_ci	status = acpi_ut_add_address_range(obj_desc->region.space_id,
22462306a36Sopenharmony_ci					   obj_desc->region.address,
22562306a36Sopenharmony_ci					   obj_desc->region.length, node);
22662306a36Sopenharmony_ci	return_ACPI_STATUS(status);
22762306a36Sopenharmony_ci}
22862306a36Sopenharmony_ci
22962306a36Sopenharmony_ci/*******************************************************************************
23062306a36Sopenharmony_ci *
23162306a36Sopenharmony_ci * FUNCTION:    acpi_ds_get_buffer_arguments
23262306a36Sopenharmony_ci *
23362306a36Sopenharmony_ci * PARAMETERS:  obj_desc        - A valid Buffer object
23462306a36Sopenharmony_ci *
23562306a36Sopenharmony_ci * RETURN:      Status.
23662306a36Sopenharmony_ci *
23762306a36Sopenharmony_ci * DESCRIPTION: Get Buffer length and initializer byte list. This implements
23862306a36Sopenharmony_ci *              the late evaluation of these attributes.
23962306a36Sopenharmony_ci *
24062306a36Sopenharmony_ci ******************************************************************************/
24162306a36Sopenharmony_ci
24262306a36Sopenharmony_ciacpi_status acpi_ds_get_buffer_arguments(union acpi_operand_object *obj_desc)
24362306a36Sopenharmony_ci{
24462306a36Sopenharmony_ci	struct acpi_namespace_node *node;
24562306a36Sopenharmony_ci	acpi_status status;
24662306a36Sopenharmony_ci
24762306a36Sopenharmony_ci	ACPI_FUNCTION_TRACE_PTR(ds_get_buffer_arguments, obj_desc);
24862306a36Sopenharmony_ci
24962306a36Sopenharmony_ci	if (obj_desc->common.flags & AOPOBJ_DATA_VALID) {
25062306a36Sopenharmony_ci		return_ACPI_STATUS(AE_OK);
25162306a36Sopenharmony_ci	}
25262306a36Sopenharmony_ci
25362306a36Sopenharmony_ci	/* Get the Buffer node */
25462306a36Sopenharmony_ci
25562306a36Sopenharmony_ci	node = obj_desc->buffer.node;
25662306a36Sopenharmony_ci	if (!node) {
25762306a36Sopenharmony_ci		ACPI_ERROR((AE_INFO,
25862306a36Sopenharmony_ci			    "No pointer back to namespace node in buffer object %p",
25962306a36Sopenharmony_ci			    obj_desc));
26062306a36Sopenharmony_ci		return_ACPI_STATUS(AE_AML_INTERNAL);
26162306a36Sopenharmony_ci	}
26262306a36Sopenharmony_ci
26362306a36Sopenharmony_ci	ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "Buffer Arg Init\n"));
26462306a36Sopenharmony_ci
26562306a36Sopenharmony_ci	/* Execute the AML code for the term_arg arguments */
26662306a36Sopenharmony_ci
26762306a36Sopenharmony_ci	status = acpi_ds_execute_arguments(node, node,
26862306a36Sopenharmony_ci					   obj_desc->buffer.aml_length,
26962306a36Sopenharmony_ci					   obj_desc->buffer.aml_start);
27062306a36Sopenharmony_ci	return_ACPI_STATUS(status);
27162306a36Sopenharmony_ci}
27262306a36Sopenharmony_ci
27362306a36Sopenharmony_ci/*******************************************************************************
27462306a36Sopenharmony_ci *
27562306a36Sopenharmony_ci * FUNCTION:    acpi_ds_get_package_arguments
27662306a36Sopenharmony_ci *
27762306a36Sopenharmony_ci * PARAMETERS:  obj_desc        - A valid Package object
27862306a36Sopenharmony_ci *
27962306a36Sopenharmony_ci * RETURN:      Status.
28062306a36Sopenharmony_ci *
28162306a36Sopenharmony_ci * DESCRIPTION: Get Package length and initializer byte list. This implements
28262306a36Sopenharmony_ci *              the late evaluation of these attributes.
28362306a36Sopenharmony_ci *
28462306a36Sopenharmony_ci ******************************************************************************/
28562306a36Sopenharmony_ci
28662306a36Sopenharmony_ciacpi_status acpi_ds_get_package_arguments(union acpi_operand_object *obj_desc)
28762306a36Sopenharmony_ci{
28862306a36Sopenharmony_ci	struct acpi_namespace_node *node;
28962306a36Sopenharmony_ci	acpi_status status;
29062306a36Sopenharmony_ci
29162306a36Sopenharmony_ci	ACPI_FUNCTION_TRACE_PTR(ds_get_package_arguments, obj_desc);
29262306a36Sopenharmony_ci
29362306a36Sopenharmony_ci	if (obj_desc->common.flags & AOPOBJ_DATA_VALID) {
29462306a36Sopenharmony_ci		return_ACPI_STATUS(AE_OK);
29562306a36Sopenharmony_ci	}
29662306a36Sopenharmony_ci
29762306a36Sopenharmony_ci	/* Get the Package node */
29862306a36Sopenharmony_ci
29962306a36Sopenharmony_ci	node = obj_desc->package.node;
30062306a36Sopenharmony_ci	if (!node) {
30162306a36Sopenharmony_ci		ACPI_ERROR((AE_INFO,
30262306a36Sopenharmony_ci			    "No pointer back to namespace node in package %p",
30362306a36Sopenharmony_ci			    obj_desc));
30462306a36Sopenharmony_ci		return_ACPI_STATUS(AE_AML_INTERNAL);
30562306a36Sopenharmony_ci	}
30662306a36Sopenharmony_ci
30762306a36Sopenharmony_ci	ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "Package Argument Init, AML Ptr: %p\n",
30862306a36Sopenharmony_ci			  obj_desc->package.aml_start));
30962306a36Sopenharmony_ci
31062306a36Sopenharmony_ci	/* Execute the AML code for the term_arg arguments */
31162306a36Sopenharmony_ci
31262306a36Sopenharmony_ci	status = acpi_ds_execute_arguments(node, node,
31362306a36Sopenharmony_ci					   obj_desc->package.aml_length,
31462306a36Sopenharmony_ci					   obj_desc->package.aml_start);
31562306a36Sopenharmony_ci
31662306a36Sopenharmony_ci	return_ACPI_STATUS(status);
31762306a36Sopenharmony_ci}
31862306a36Sopenharmony_ci
31962306a36Sopenharmony_ci/*******************************************************************************
32062306a36Sopenharmony_ci *
32162306a36Sopenharmony_ci * FUNCTION:    acpi_ds_get_region_arguments
32262306a36Sopenharmony_ci *
32362306a36Sopenharmony_ci * PARAMETERS:  obj_desc        - A valid region object
32462306a36Sopenharmony_ci *
32562306a36Sopenharmony_ci * RETURN:      Status.
32662306a36Sopenharmony_ci *
32762306a36Sopenharmony_ci * DESCRIPTION: Get region address and length. This implements the late
32862306a36Sopenharmony_ci *              evaluation of these region attributes.
32962306a36Sopenharmony_ci *
33062306a36Sopenharmony_ci ******************************************************************************/
33162306a36Sopenharmony_ci
33262306a36Sopenharmony_ciacpi_status acpi_ds_get_region_arguments(union acpi_operand_object *obj_desc)
33362306a36Sopenharmony_ci{
33462306a36Sopenharmony_ci	struct acpi_namespace_node *node;
33562306a36Sopenharmony_ci	acpi_status status;
33662306a36Sopenharmony_ci	union acpi_operand_object *extra_desc;
33762306a36Sopenharmony_ci
33862306a36Sopenharmony_ci	ACPI_FUNCTION_TRACE_PTR(ds_get_region_arguments, obj_desc);
33962306a36Sopenharmony_ci
34062306a36Sopenharmony_ci	if (obj_desc->region.flags & AOPOBJ_DATA_VALID) {
34162306a36Sopenharmony_ci		return_ACPI_STATUS(AE_OK);
34262306a36Sopenharmony_ci	}
34362306a36Sopenharmony_ci
34462306a36Sopenharmony_ci	extra_desc = acpi_ns_get_secondary_object(obj_desc);
34562306a36Sopenharmony_ci	if (!extra_desc) {
34662306a36Sopenharmony_ci		return_ACPI_STATUS(AE_NOT_EXIST);
34762306a36Sopenharmony_ci	}
34862306a36Sopenharmony_ci
34962306a36Sopenharmony_ci	/* Get the Region node */
35062306a36Sopenharmony_ci
35162306a36Sopenharmony_ci	node = obj_desc->region.node;
35262306a36Sopenharmony_ci
35362306a36Sopenharmony_ci	ACPI_DEBUG_EXEC(acpi_ut_display_init_pathname
35462306a36Sopenharmony_ci			(ACPI_TYPE_REGION, node, NULL));
35562306a36Sopenharmony_ci
35662306a36Sopenharmony_ci	ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
35762306a36Sopenharmony_ci			  "[%4.4s] OpRegion Arg Init at AML %p\n",
35862306a36Sopenharmony_ci			  acpi_ut_get_node_name(node),
35962306a36Sopenharmony_ci			  extra_desc->extra.aml_start));
36062306a36Sopenharmony_ci
36162306a36Sopenharmony_ci	/* Execute the argument AML */
36262306a36Sopenharmony_ci
36362306a36Sopenharmony_ci	status = acpi_ds_execute_arguments(node, extra_desc->extra.scope_node,
36462306a36Sopenharmony_ci					   extra_desc->extra.aml_length,
36562306a36Sopenharmony_ci					   extra_desc->extra.aml_start);
36662306a36Sopenharmony_ci	if (ACPI_FAILURE(status)) {
36762306a36Sopenharmony_ci		return_ACPI_STATUS(status);
36862306a36Sopenharmony_ci	}
36962306a36Sopenharmony_ci
37062306a36Sopenharmony_ci	status = acpi_ut_add_address_range(obj_desc->region.space_id,
37162306a36Sopenharmony_ci					   obj_desc->region.address,
37262306a36Sopenharmony_ci					   obj_desc->region.length, node);
37362306a36Sopenharmony_ci	return_ACPI_STATUS(status);
37462306a36Sopenharmony_ci}
375