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