162306a36Sopenharmony_ci// SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0 262306a36Sopenharmony_ci/******************************************************************************* 362306a36Sopenharmony_ci * 462306a36Sopenharmony_ci * Module Name: nsobject - Utilities for objects attached to namespace 562306a36Sopenharmony_ci * table entries 662306a36Sopenharmony_ci * 762306a36Sopenharmony_ci ******************************************************************************/ 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci#include <acpi/acpi.h> 1062306a36Sopenharmony_ci#include "accommon.h" 1162306a36Sopenharmony_ci#include "acnamesp.h" 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci#define _COMPONENT ACPI_NAMESPACE 1462306a36Sopenharmony_ciACPI_MODULE_NAME("nsobject") 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ci/******************************************************************************* 1762306a36Sopenharmony_ci * 1862306a36Sopenharmony_ci * FUNCTION: acpi_ns_attach_object 1962306a36Sopenharmony_ci * 2062306a36Sopenharmony_ci * PARAMETERS: node - Parent Node 2162306a36Sopenharmony_ci * object - Object to be attached 2262306a36Sopenharmony_ci * type - Type of object, or ACPI_TYPE_ANY if not 2362306a36Sopenharmony_ci * known 2462306a36Sopenharmony_ci * 2562306a36Sopenharmony_ci * RETURN: Status 2662306a36Sopenharmony_ci * 2762306a36Sopenharmony_ci * DESCRIPTION: Record the given object as the value associated with the 2862306a36Sopenharmony_ci * name whose acpi_handle is passed. If Object is NULL 2962306a36Sopenharmony_ci * and Type is ACPI_TYPE_ANY, set the name as having no value. 3062306a36Sopenharmony_ci * Note: Future may require that the Node->Flags field be passed 3162306a36Sopenharmony_ci * as a parameter. 3262306a36Sopenharmony_ci * 3362306a36Sopenharmony_ci * MUTEX: Assumes namespace is locked 3462306a36Sopenharmony_ci * 3562306a36Sopenharmony_ci ******************************************************************************/ 3662306a36Sopenharmony_ciacpi_status 3762306a36Sopenharmony_ciacpi_ns_attach_object(struct acpi_namespace_node *node, 3862306a36Sopenharmony_ci union acpi_operand_object *object, acpi_object_type type) 3962306a36Sopenharmony_ci{ 4062306a36Sopenharmony_ci union acpi_operand_object *obj_desc; 4162306a36Sopenharmony_ci union acpi_operand_object *last_obj_desc; 4262306a36Sopenharmony_ci acpi_object_type object_type = ACPI_TYPE_ANY; 4362306a36Sopenharmony_ci 4462306a36Sopenharmony_ci ACPI_FUNCTION_TRACE(ns_attach_object); 4562306a36Sopenharmony_ci 4662306a36Sopenharmony_ci /* 4762306a36Sopenharmony_ci * Parameter validation 4862306a36Sopenharmony_ci */ 4962306a36Sopenharmony_ci if (!node) { 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_ci /* Invalid handle */ 5262306a36Sopenharmony_ci 5362306a36Sopenharmony_ci ACPI_ERROR((AE_INFO, "Null NamedObj handle")); 5462306a36Sopenharmony_ci return_ACPI_STATUS(AE_BAD_PARAMETER); 5562306a36Sopenharmony_ci } 5662306a36Sopenharmony_ci 5762306a36Sopenharmony_ci if (!object && (ACPI_TYPE_ANY != type)) { 5862306a36Sopenharmony_ci 5962306a36Sopenharmony_ci /* Null object */ 6062306a36Sopenharmony_ci 6162306a36Sopenharmony_ci ACPI_ERROR((AE_INFO, 6262306a36Sopenharmony_ci "Null object, but type not ACPI_TYPE_ANY")); 6362306a36Sopenharmony_ci return_ACPI_STATUS(AE_BAD_PARAMETER); 6462306a36Sopenharmony_ci } 6562306a36Sopenharmony_ci 6662306a36Sopenharmony_ci if (ACPI_GET_DESCRIPTOR_TYPE(node) != ACPI_DESC_TYPE_NAMED) { 6762306a36Sopenharmony_ci 6862306a36Sopenharmony_ci /* Not a name handle */ 6962306a36Sopenharmony_ci 7062306a36Sopenharmony_ci ACPI_ERROR((AE_INFO, "Invalid handle %p [%s]", 7162306a36Sopenharmony_ci node, acpi_ut_get_descriptor_name(node))); 7262306a36Sopenharmony_ci return_ACPI_STATUS(AE_BAD_PARAMETER); 7362306a36Sopenharmony_ci } 7462306a36Sopenharmony_ci 7562306a36Sopenharmony_ci /* Check if this object is already attached */ 7662306a36Sopenharmony_ci 7762306a36Sopenharmony_ci if (node->object == object) { 7862306a36Sopenharmony_ci ACPI_DEBUG_PRINT((ACPI_DB_EXEC, 7962306a36Sopenharmony_ci "Obj %p already installed in NameObj %p\n", 8062306a36Sopenharmony_ci object, node)); 8162306a36Sopenharmony_ci 8262306a36Sopenharmony_ci return_ACPI_STATUS(AE_OK); 8362306a36Sopenharmony_ci } 8462306a36Sopenharmony_ci 8562306a36Sopenharmony_ci /* If null object, we will just install it */ 8662306a36Sopenharmony_ci 8762306a36Sopenharmony_ci if (!object) { 8862306a36Sopenharmony_ci obj_desc = NULL; 8962306a36Sopenharmony_ci object_type = ACPI_TYPE_ANY; 9062306a36Sopenharmony_ci } 9162306a36Sopenharmony_ci 9262306a36Sopenharmony_ci /* 9362306a36Sopenharmony_ci * If the source object is a namespace Node with an attached object, 9462306a36Sopenharmony_ci * we will use that (attached) object 9562306a36Sopenharmony_ci */ 9662306a36Sopenharmony_ci else if ((ACPI_GET_DESCRIPTOR_TYPE(object) == ACPI_DESC_TYPE_NAMED) && 9762306a36Sopenharmony_ci ((struct acpi_namespace_node *)object)->object) { 9862306a36Sopenharmony_ci /* 9962306a36Sopenharmony_ci * Value passed is a name handle and that name has a 10062306a36Sopenharmony_ci * non-null value. Use that name's value and type. 10162306a36Sopenharmony_ci */ 10262306a36Sopenharmony_ci obj_desc = ((struct acpi_namespace_node *)object)->object; 10362306a36Sopenharmony_ci object_type = ((struct acpi_namespace_node *)object)->type; 10462306a36Sopenharmony_ci } 10562306a36Sopenharmony_ci 10662306a36Sopenharmony_ci /* 10762306a36Sopenharmony_ci * Otherwise, we will use the parameter object, but we must type 10862306a36Sopenharmony_ci * it first 10962306a36Sopenharmony_ci */ 11062306a36Sopenharmony_ci else { 11162306a36Sopenharmony_ci obj_desc = (union acpi_operand_object *)object; 11262306a36Sopenharmony_ci 11362306a36Sopenharmony_ci /* Use the given type */ 11462306a36Sopenharmony_ci 11562306a36Sopenharmony_ci object_type = type; 11662306a36Sopenharmony_ci } 11762306a36Sopenharmony_ci 11862306a36Sopenharmony_ci ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "Installing %p into Node %p [%4.4s]\n", 11962306a36Sopenharmony_ci obj_desc, node, acpi_ut_get_node_name(node))); 12062306a36Sopenharmony_ci 12162306a36Sopenharmony_ci /* Detach an existing attached object if present */ 12262306a36Sopenharmony_ci 12362306a36Sopenharmony_ci if (node->object) { 12462306a36Sopenharmony_ci acpi_ns_detach_object(node); 12562306a36Sopenharmony_ci } 12662306a36Sopenharmony_ci 12762306a36Sopenharmony_ci if (obj_desc) { 12862306a36Sopenharmony_ci /* 12962306a36Sopenharmony_ci * Must increment the new value's reference count 13062306a36Sopenharmony_ci * (if it is an internal object) 13162306a36Sopenharmony_ci */ 13262306a36Sopenharmony_ci acpi_ut_add_reference(obj_desc); 13362306a36Sopenharmony_ci 13462306a36Sopenharmony_ci /* 13562306a36Sopenharmony_ci * Handle objects with multiple descriptors - walk 13662306a36Sopenharmony_ci * to the end of the descriptor list 13762306a36Sopenharmony_ci */ 13862306a36Sopenharmony_ci last_obj_desc = obj_desc; 13962306a36Sopenharmony_ci while (last_obj_desc->common.next_object) { 14062306a36Sopenharmony_ci last_obj_desc = last_obj_desc->common.next_object; 14162306a36Sopenharmony_ci } 14262306a36Sopenharmony_ci 14362306a36Sopenharmony_ci /* Install the object at the front of the object list */ 14462306a36Sopenharmony_ci 14562306a36Sopenharmony_ci last_obj_desc->common.next_object = node->object; 14662306a36Sopenharmony_ci } 14762306a36Sopenharmony_ci 14862306a36Sopenharmony_ci node->type = (u8) object_type; 14962306a36Sopenharmony_ci node->object = obj_desc; 15062306a36Sopenharmony_ci 15162306a36Sopenharmony_ci return_ACPI_STATUS(AE_OK); 15262306a36Sopenharmony_ci} 15362306a36Sopenharmony_ci 15462306a36Sopenharmony_ci/******************************************************************************* 15562306a36Sopenharmony_ci * 15662306a36Sopenharmony_ci * FUNCTION: acpi_ns_detach_object 15762306a36Sopenharmony_ci * 15862306a36Sopenharmony_ci * PARAMETERS: node - A Namespace node whose object will be detached 15962306a36Sopenharmony_ci * 16062306a36Sopenharmony_ci * RETURN: None. 16162306a36Sopenharmony_ci * 16262306a36Sopenharmony_ci * DESCRIPTION: Detach/delete an object associated with a namespace node. 16362306a36Sopenharmony_ci * if the object is an allocated object, it is freed. 16462306a36Sopenharmony_ci * Otherwise, the field is simply cleared. 16562306a36Sopenharmony_ci * 16662306a36Sopenharmony_ci ******************************************************************************/ 16762306a36Sopenharmony_ci 16862306a36Sopenharmony_civoid acpi_ns_detach_object(struct acpi_namespace_node *node) 16962306a36Sopenharmony_ci{ 17062306a36Sopenharmony_ci union acpi_operand_object *obj_desc; 17162306a36Sopenharmony_ci 17262306a36Sopenharmony_ci ACPI_FUNCTION_TRACE(ns_detach_object); 17362306a36Sopenharmony_ci 17462306a36Sopenharmony_ci obj_desc = node->object; 17562306a36Sopenharmony_ci 17662306a36Sopenharmony_ci if (!obj_desc || (obj_desc->common.type == ACPI_TYPE_LOCAL_DATA)) { 17762306a36Sopenharmony_ci return_VOID; 17862306a36Sopenharmony_ci } 17962306a36Sopenharmony_ci 18062306a36Sopenharmony_ci if (node->flags & ANOBJ_ALLOCATED_BUFFER) { 18162306a36Sopenharmony_ci 18262306a36Sopenharmony_ci /* Free the dynamic aml buffer */ 18362306a36Sopenharmony_ci 18462306a36Sopenharmony_ci if (obj_desc->common.type == ACPI_TYPE_METHOD) { 18562306a36Sopenharmony_ci ACPI_FREE(obj_desc->method.aml_start); 18662306a36Sopenharmony_ci } 18762306a36Sopenharmony_ci } 18862306a36Sopenharmony_ci 18962306a36Sopenharmony_ci if (obj_desc->common.type == ACPI_TYPE_REGION) { 19062306a36Sopenharmony_ci acpi_ut_remove_address_range(obj_desc->region.space_id, node); 19162306a36Sopenharmony_ci } 19262306a36Sopenharmony_ci 19362306a36Sopenharmony_ci /* Clear the Node entry in all cases */ 19462306a36Sopenharmony_ci 19562306a36Sopenharmony_ci node->object = NULL; 19662306a36Sopenharmony_ci if (ACPI_GET_DESCRIPTOR_TYPE(obj_desc) == ACPI_DESC_TYPE_OPERAND) { 19762306a36Sopenharmony_ci 19862306a36Sopenharmony_ci /* Unlink object from front of possible object list */ 19962306a36Sopenharmony_ci 20062306a36Sopenharmony_ci node->object = obj_desc->common.next_object; 20162306a36Sopenharmony_ci 20262306a36Sopenharmony_ci /* Handle possible 2-descriptor object */ 20362306a36Sopenharmony_ci 20462306a36Sopenharmony_ci if (node->object && 20562306a36Sopenharmony_ci (node->object->common.type != ACPI_TYPE_LOCAL_DATA)) { 20662306a36Sopenharmony_ci node->object = node->object->common.next_object; 20762306a36Sopenharmony_ci } 20862306a36Sopenharmony_ci 20962306a36Sopenharmony_ci /* 21062306a36Sopenharmony_ci * Detach the object from any data objects (which are still held by 21162306a36Sopenharmony_ci * the namespace node) 21262306a36Sopenharmony_ci */ 21362306a36Sopenharmony_ci if (obj_desc->common.next_object && 21462306a36Sopenharmony_ci ((obj_desc->common.next_object)->common.type == 21562306a36Sopenharmony_ci ACPI_TYPE_LOCAL_DATA)) { 21662306a36Sopenharmony_ci obj_desc->common.next_object = NULL; 21762306a36Sopenharmony_ci } 21862306a36Sopenharmony_ci } 21962306a36Sopenharmony_ci 22062306a36Sopenharmony_ci /* Reset the node type to untyped */ 22162306a36Sopenharmony_ci 22262306a36Sopenharmony_ci node->type = ACPI_TYPE_ANY; 22362306a36Sopenharmony_ci 22462306a36Sopenharmony_ci ACPI_DEBUG_PRINT((ACPI_DB_NAMES, "Node %p [%4.4s] Object %p\n", 22562306a36Sopenharmony_ci node, acpi_ut_get_node_name(node), obj_desc)); 22662306a36Sopenharmony_ci 22762306a36Sopenharmony_ci /* Remove one reference on the object (and all subobjects) */ 22862306a36Sopenharmony_ci 22962306a36Sopenharmony_ci acpi_ut_remove_reference(obj_desc); 23062306a36Sopenharmony_ci return_VOID; 23162306a36Sopenharmony_ci} 23262306a36Sopenharmony_ci 23362306a36Sopenharmony_ci/******************************************************************************* 23462306a36Sopenharmony_ci * 23562306a36Sopenharmony_ci * FUNCTION: acpi_ns_get_attached_object 23662306a36Sopenharmony_ci * 23762306a36Sopenharmony_ci * PARAMETERS: node - Namespace node 23862306a36Sopenharmony_ci * 23962306a36Sopenharmony_ci * RETURN: Current value of the object field from the Node whose 24062306a36Sopenharmony_ci * handle is passed 24162306a36Sopenharmony_ci * 24262306a36Sopenharmony_ci * DESCRIPTION: Obtain the object attached to a namespace node. 24362306a36Sopenharmony_ci * 24462306a36Sopenharmony_ci ******************************************************************************/ 24562306a36Sopenharmony_ci 24662306a36Sopenharmony_ciunion acpi_operand_object *acpi_ns_get_attached_object(struct 24762306a36Sopenharmony_ci acpi_namespace_node 24862306a36Sopenharmony_ci *node) 24962306a36Sopenharmony_ci{ 25062306a36Sopenharmony_ci ACPI_FUNCTION_TRACE_PTR(ns_get_attached_object, node); 25162306a36Sopenharmony_ci 25262306a36Sopenharmony_ci if (!node) { 25362306a36Sopenharmony_ci ACPI_WARNING((AE_INFO, "Null Node ptr")); 25462306a36Sopenharmony_ci return_PTR(NULL); 25562306a36Sopenharmony_ci } 25662306a36Sopenharmony_ci 25762306a36Sopenharmony_ci if (!node->object || 25862306a36Sopenharmony_ci ((ACPI_GET_DESCRIPTOR_TYPE(node->object) != ACPI_DESC_TYPE_OPERAND) 25962306a36Sopenharmony_ci && (ACPI_GET_DESCRIPTOR_TYPE(node->object) != 26062306a36Sopenharmony_ci ACPI_DESC_TYPE_NAMED)) 26162306a36Sopenharmony_ci || ((node->object)->common.type == ACPI_TYPE_LOCAL_DATA)) { 26262306a36Sopenharmony_ci return_PTR(NULL); 26362306a36Sopenharmony_ci } 26462306a36Sopenharmony_ci 26562306a36Sopenharmony_ci return_PTR(node->object); 26662306a36Sopenharmony_ci} 26762306a36Sopenharmony_ci 26862306a36Sopenharmony_ci/******************************************************************************* 26962306a36Sopenharmony_ci * 27062306a36Sopenharmony_ci * FUNCTION: acpi_ns_get_secondary_object 27162306a36Sopenharmony_ci * 27262306a36Sopenharmony_ci * PARAMETERS: node - Namespace node 27362306a36Sopenharmony_ci * 27462306a36Sopenharmony_ci * RETURN: Current value of the object field from the Node whose 27562306a36Sopenharmony_ci * handle is passed. 27662306a36Sopenharmony_ci * 27762306a36Sopenharmony_ci * DESCRIPTION: Obtain a secondary object associated with a namespace node. 27862306a36Sopenharmony_ci * 27962306a36Sopenharmony_ci ******************************************************************************/ 28062306a36Sopenharmony_ci 28162306a36Sopenharmony_ciunion acpi_operand_object *acpi_ns_get_secondary_object(union 28262306a36Sopenharmony_ci acpi_operand_object 28362306a36Sopenharmony_ci *obj_desc) 28462306a36Sopenharmony_ci{ 28562306a36Sopenharmony_ci ACPI_FUNCTION_TRACE_PTR(ns_get_secondary_object, obj_desc); 28662306a36Sopenharmony_ci 28762306a36Sopenharmony_ci if ((!obj_desc) || 28862306a36Sopenharmony_ci (obj_desc->common.type == ACPI_TYPE_LOCAL_DATA) || 28962306a36Sopenharmony_ci (!obj_desc->common.next_object) || 29062306a36Sopenharmony_ci ((obj_desc->common.next_object)->common.type == 29162306a36Sopenharmony_ci ACPI_TYPE_LOCAL_DATA)) { 29262306a36Sopenharmony_ci return_PTR(NULL); 29362306a36Sopenharmony_ci } 29462306a36Sopenharmony_ci 29562306a36Sopenharmony_ci return_PTR(obj_desc->common.next_object); 29662306a36Sopenharmony_ci} 29762306a36Sopenharmony_ci 29862306a36Sopenharmony_ci/******************************************************************************* 29962306a36Sopenharmony_ci * 30062306a36Sopenharmony_ci * FUNCTION: acpi_ns_attach_data 30162306a36Sopenharmony_ci * 30262306a36Sopenharmony_ci * PARAMETERS: node - Namespace node 30362306a36Sopenharmony_ci * handler - Handler to be associated with the data 30462306a36Sopenharmony_ci * data - Data to be attached 30562306a36Sopenharmony_ci * 30662306a36Sopenharmony_ci * RETURN: Status 30762306a36Sopenharmony_ci * 30862306a36Sopenharmony_ci * DESCRIPTION: Low-level attach data. Create and attach a Data object. 30962306a36Sopenharmony_ci * 31062306a36Sopenharmony_ci ******************************************************************************/ 31162306a36Sopenharmony_ci 31262306a36Sopenharmony_ciacpi_status 31362306a36Sopenharmony_ciacpi_ns_attach_data(struct acpi_namespace_node *node, 31462306a36Sopenharmony_ci acpi_object_handler handler, void *data) 31562306a36Sopenharmony_ci{ 31662306a36Sopenharmony_ci union acpi_operand_object *prev_obj_desc; 31762306a36Sopenharmony_ci union acpi_operand_object *obj_desc; 31862306a36Sopenharmony_ci union acpi_operand_object *data_desc; 31962306a36Sopenharmony_ci 32062306a36Sopenharmony_ci /* We only allow one attachment per handler */ 32162306a36Sopenharmony_ci 32262306a36Sopenharmony_ci prev_obj_desc = NULL; 32362306a36Sopenharmony_ci obj_desc = node->object; 32462306a36Sopenharmony_ci while (obj_desc) { 32562306a36Sopenharmony_ci if ((obj_desc->common.type == ACPI_TYPE_LOCAL_DATA) && 32662306a36Sopenharmony_ci (obj_desc->data.handler == handler)) { 32762306a36Sopenharmony_ci return (AE_ALREADY_EXISTS); 32862306a36Sopenharmony_ci } 32962306a36Sopenharmony_ci 33062306a36Sopenharmony_ci prev_obj_desc = obj_desc; 33162306a36Sopenharmony_ci obj_desc = obj_desc->common.next_object; 33262306a36Sopenharmony_ci } 33362306a36Sopenharmony_ci 33462306a36Sopenharmony_ci /* Create an internal object for the data */ 33562306a36Sopenharmony_ci 33662306a36Sopenharmony_ci data_desc = acpi_ut_create_internal_object(ACPI_TYPE_LOCAL_DATA); 33762306a36Sopenharmony_ci if (!data_desc) { 33862306a36Sopenharmony_ci return (AE_NO_MEMORY); 33962306a36Sopenharmony_ci } 34062306a36Sopenharmony_ci 34162306a36Sopenharmony_ci data_desc->data.handler = handler; 34262306a36Sopenharmony_ci data_desc->data.pointer = data; 34362306a36Sopenharmony_ci 34462306a36Sopenharmony_ci /* Install the data object */ 34562306a36Sopenharmony_ci 34662306a36Sopenharmony_ci if (prev_obj_desc) { 34762306a36Sopenharmony_ci prev_obj_desc->common.next_object = data_desc; 34862306a36Sopenharmony_ci } else { 34962306a36Sopenharmony_ci node->object = data_desc; 35062306a36Sopenharmony_ci } 35162306a36Sopenharmony_ci 35262306a36Sopenharmony_ci return (AE_OK); 35362306a36Sopenharmony_ci} 35462306a36Sopenharmony_ci 35562306a36Sopenharmony_ci/******************************************************************************* 35662306a36Sopenharmony_ci * 35762306a36Sopenharmony_ci * FUNCTION: acpi_ns_detach_data 35862306a36Sopenharmony_ci * 35962306a36Sopenharmony_ci * PARAMETERS: node - Namespace node 36062306a36Sopenharmony_ci * handler - Handler associated with the data 36162306a36Sopenharmony_ci * 36262306a36Sopenharmony_ci * RETURN: Status 36362306a36Sopenharmony_ci * 36462306a36Sopenharmony_ci * DESCRIPTION: Low-level detach data. Delete the data node, but the caller 36562306a36Sopenharmony_ci * is responsible for the actual data. 36662306a36Sopenharmony_ci * 36762306a36Sopenharmony_ci ******************************************************************************/ 36862306a36Sopenharmony_ci 36962306a36Sopenharmony_ciacpi_status 37062306a36Sopenharmony_ciacpi_ns_detach_data(struct acpi_namespace_node *node, 37162306a36Sopenharmony_ci acpi_object_handler handler) 37262306a36Sopenharmony_ci{ 37362306a36Sopenharmony_ci union acpi_operand_object *obj_desc; 37462306a36Sopenharmony_ci union acpi_operand_object *prev_obj_desc; 37562306a36Sopenharmony_ci 37662306a36Sopenharmony_ci prev_obj_desc = NULL; 37762306a36Sopenharmony_ci obj_desc = node->object; 37862306a36Sopenharmony_ci while (obj_desc) { 37962306a36Sopenharmony_ci if ((obj_desc->common.type == ACPI_TYPE_LOCAL_DATA) && 38062306a36Sopenharmony_ci (obj_desc->data.handler == handler)) { 38162306a36Sopenharmony_ci if (prev_obj_desc) { 38262306a36Sopenharmony_ci prev_obj_desc->common.next_object = 38362306a36Sopenharmony_ci obj_desc->common.next_object; 38462306a36Sopenharmony_ci } else { 38562306a36Sopenharmony_ci node->object = obj_desc->common.next_object; 38662306a36Sopenharmony_ci } 38762306a36Sopenharmony_ci 38862306a36Sopenharmony_ci acpi_ut_remove_reference(obj_desc); 38962306a36Sopenharmony_ci return (AE_OK); 39062306a36Sopenharmony_ci } 39162306a36Sopenharmony_ci 39262306a36Sopenharmony_ci prev_obj_desc = obj_desc; 39362306a36Sopenharmony_ci obj_desc = obj_desc->common.next_object; 39462306a36Sopenharmony_ci } 39562306a36Sopenharmony_ci 39662306a36Sopenharmony_ci return (AE_NOT_FOUND); 39762306a36Sopenharmony_ci} 39862306a36Sopenharmony_ci 39962306a36Sopenharmony_ci/******************************************************************************* 40062306a36Sopenharmony_ci * 40162306a36Sopenharmony_ci * FUNCTION: acpi_ns_get_attached_data 40262306a36Sopenharmony_ci * 40362306a36Sopenharmony_ci * PARAMETERS: node - Namespace node 40462306a36Sopenharmony_ci * handler - Handler associated with the data 40562306a36Sopenharmony_ci * data - Where the data is returned 40662306a36Sopenharmony_ci * 40762306a36Sopenharmony_ci * RETURN: Status 40862306a36Sopenharmony_ci * 40962306a36Sopenharmony_ci * DESCRIPTION: Low level interface to obtain data previously associated with 41062306a36Sopenharmony_ci * a namespace node. 41162306a36Sopenharmony_ci * 41262306a36Sopenharmony_ci ******************************************************************************/ 41362306a36Sopenharmony_ci 41462306a36Sopenharmony_ciacpi_status 41562306a36Sopenharmony_ciacpi_ns_get_attached_data(struct acpi_namespace_node *node, 41662306a36Sopenharmony_ci acpi_object_handler handler, void **data) 41762306a36Sopenharmony_ci{ 41862306a36Sopenharmony_ci union acpi_operand_object *obj_desc; 41962306a36Sopenharmony_ci 42062306a36Sopenharmony_ci obj_desc = node->object; 42162306a36Sopenharmony_ci while (obj_desc) { 42262306a36Sopenharmony_ci if ((obj_desc->common.type == ACPI_TYPE_LOCAL_DATA) && 42362306a36Sopenharmony_ci (obj_desc->data.handler == handler)) { 42462306a36Sopenharmony_ci *data = obj_desc->data.pointer; 42562306a36Sopenharmony_ci return (AE_OK); 42662306a36Sopenharmony_ci } 42762306a36Sopenharmony_ci 42862306a36Sopenharmony_ci obj_desc = obj_desc->common.next_object; 42962306a36Sopenharmony_ci } 43062306a36Sopenharmony_ci 43162306a36Sopenharmony_ci return (AE_NOT_FOUND); 43262306a36Sopenharmony_ci} 433