195857638SErik Schmauss // SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0 21da177e4SLinus Torvalds /******************************************************************************* 31da177e4SLinus Torvalds * 41da177e4SLinus Torvalds * Module Name: nsobject - Utilities for objects attached to namespace 51da177e4SLinus Torvalds * table entries 61da177e4SLinus Torvalds * 71da177e4SLinus Torvalds ******************************************************************************/ 81da177e4SLinus Torvalds 91da177e4SLinus Torvalds #include <acpi/acpi.h> 10e2f7a777SLen Brown #include "accommon.h" 11e2f7a777SLen Brown #include "acnamesp.h" 121da177e4SLinus Torvalds 131da177e4SLinus Torvalds #define _COMPONENT ACPI_NAMESPACE 141da177e4SLinus Torvalds ACPI_MODULE_NAME("nsobject") 151da177e4SLinus Torvalds 161da177e4SLinus Torvalds /******************************************************************************* 171da177e4SLinus Torvalds * 181da177e4SLinus Torvalds * FUNCTION: acpi_ns_attach_object 191da177e4SLinus Torvalds * 20ba494beeSBob Moore * PARAMETERS: node - Parent Node 21ba494beeSBob Moore * object - Object to be attached 22ba494beeSBob Moore * type - Type of object, or ACPI_TYPE_ANY if not 231da177e4SLinus Torvalds * known 241da177e4SLinus Torvalds * 2544f6c012SRobert Moore * RETURN: Status 2644f6c012SRobert Moore * 271da177e4SLinus Torvalds * DESCRIPTION: Record the given object as the value associated with the 281da177e4SLinus Torvalds * name whose acpi_handle is passed. If Object is NULL 291da177e4SLinus Torvalds * and Type is ACPI_TYPE_ANY, set the name as having no value. 301da177e4SLinus Torvalds * Note: Future may require that the Node->Flags field be passed 311da177e4SLinus Torvalds * as a parameter. 321da177e4SLinus Torvalds * 331da177e4SLinus Torvalds * MUTEX: Assumes namespace is locked 341da177e4SLinus Torvalds * 351da177e4SLinus Torvalds ******************************************************************************/ 361da177e4SLinus Torvalds acpi_status 374be44fcdSLen Brown acpi_ns_attach_object(struct acpi_namespace_node *node, 384be44fcdSLen Brown union acpi_operand_object *object, acpi_object_type type) 391da177e4SLinus Torvalds { 401da177e4SLinus Torvalds union acpi_operand_object *obj_desc; 411da177e4SLinus Torvalds union acpi_operand_object *last_obj_desc; 421da177e4SLinus Torvalds acpi_object_type object_type = ACPI_TYPE_ANY; 431da177e4SLinus Torvalds 44b229cf92SBob Moore ACPI_FUNCTION_TRACE(ns_attach_object); 451da177e4SLinus Torvalds 461da177e4SLinus Torvalds /* 471da177e4SLinus Torvalds * Parameter validation 481da177e4SLinus Torvalds */ 491da177e4SLinus Torvalds if (!node) { 5052fc0b02SBob Moore 511da177e4SLinus Torvalds /* Invalid handle */ 521da177e4SLinus Torvalds 53b229cf92SBob Moore ACPI_ERROR((AE_INFO, "Null NamedObj handle")); 541da177e4SLinus Torvalds return_ACPI_STATUS(AE_BAD_PARAMETER); 551da177e4SLinus Torvalds } 561da177e4SLinus Torvalds 571da177e4SLinus Torvalds if (!object && (ACPI_TYPE_ANY != type)) { 5852fc0b02SBob Moore 591da177e4SLinus Torvalds /* Null object */ 601da177e4SLinus Torvalds 61b8e4d893SBob Moore ACPI_ERROR((AE_INFO, 62b8e4d893SBob Moore "Null object, but type not ACPI_TYPE_ANY")); 631da177e4SLinus Torvalds return_ACPI_STATUS(AE_BAD_PARAMETER); 641da177e4SLinus Torvalds } 651da177e4SLinus Torvalds 661da177e4SLinus Torvalds if (ACPI_GET_DESCRIPTOR_TYPE(node) != ACPI_DESC_TYPE_NAMED) { 6752fc0b02SBob Moore 681da177e4SLinus Torvalds /* Not a name handle */ 691da177e4SLinus Torvalds 70b8e4d893SBob Moore ACPI_ERROR((AE_INFO, "Invalid handle %p [%s]", 711da177e4SLinus Torvalds node, acpi_ut_get_descriptor_name(node))); 721da177e4SLinus Torvalds return_ACPI_STATUS(AE_BAD_PARAMETER); 731da177e4SLinus Torvalds } 741da177e4SLinus Torvalds 751da177e4SLinus Torvalds /* Check if this object is already attached */ 761da177e4SLinus Torvalds 771da177e4SLinus Torvalds if (node->object == object) { 7844f6c012SRobert Moore ACPI_DEBUG_PRINT((ACPI_DB_EXEC, 79b229cf92SBob Moore "Obj %p already installed in NameObj %p\n", 801da177e4SLinus Torvalds object, node)); 811da177e4SLinus Torvalds 821da177e4SLinus Torvalds return_ACPI_STATUS(AE_OK); 831da177e4SLinus Torvalds } 841da177e4SLinus Torvalds 851da177e4SLinus Torvalds /* If null object, we will just install it */ 861da177e4SLinus Torvalds 871da177e4SLinus Torvalds if (!object) { 881da177e4SLinus Torvalds obj_desc = NULL; 891da177e4SLinus Torvalds object_type = ACPI_TYPE_ANY; 901da177e4SLinus Torvalds } 911da177e4SLinus Torvalds 921da177e4SLinus Torvalds /* 931da177e4SLinus Torvalds * If the source object is a namespace Node with an attached object, 941da177e4SLinus Torvalds * we will use that (attached) object 951da177e4SLinus Torvalds */ 961da177e4SLinus Torvalds else if ((ACPI_GET_DESCRIPTOR_TYPE(object) == ACPI_DESC_TYPE_NAMED) && 971da177e4SLinus Torvalds ((struct acpi_namespace_node *)object)->object) { 981da177e4SLinus Torvalds /* 991da177e4SLinus Torvalds * Value passed is a name handle and that name has a 1001da177e4SLinus Torvalds * non-null value. Use that name's value and type. 1011da177e4SLinus Torvalds */ 1021da177e4SLinus Torvalds obj_desc = ((struct acpi_namespace_node *)object)->object; 1031da177e4SLinus Torvalds object_type = ((struct acpi_namespace_node *)object)->type; 1041da177e4SLinus Torvalds } 1051da177e4SLinus Torvalds 1061da177e4SLinus Torvalds /* 1071da177e4SLinus Torvalds * Otherwise, we will use the parameter object, but we must type 1081da177e4SLinus Torvalds * it first 1091da177e4SLinus Torvalds */ 1101da177e4SLinus Torvalds else { 1111da177e4SLinus Torvalds obj_desc = (union acpi_operand_object *)object; 1121da177e4SLinus Torvalds 1131da177e4SLinus Torvalds /* Use the given type */ 1141da177e4SLinus Torvalds 1151da177e4SLinus Torvalds object_type = type; 1161da177e4SLinus Torvalds } 1171da177e4SLinus Torvalds 1181da177e4SLinus Torvalds ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "Installing %p into Node %p [%4.4s]\n", 1191da177e4SLinus Torvalds obj_desc, node, acpi_ut_get_node_name(node))); 1201da177e4SLinus Torvalds 1211da177e4SLinus Torvalds /* Detach an existing attached object if present */ 1221da177e4SLinus Torvalds 1231da177e4SLinus Torvalds if (node->object) { 1241da177e4SLinus Torvalds acpi_ns_detach_object(node); 1251da177e4SLinus Torvalds } 1261da177e4SLinus Torvalds 1271da177e4SLinus Torvalds if (obj_desc) { 1281da177e4SLinus Torvalds /* 1291da177e4SLinus Torvalds * Must increment the new value's reference count 1301da177e4SLinus Torvalds * (if it is an internal object) 1311da177e4SLinus Torvalds */ 1321da177e4SLinus Torvalds acpi_ut_add_reference(obj_desc); 1331da177e4SLinus Torvalds 1341da177e4SLinus Torvalds /* 1351da177e4SLinus Torvalds * Handle objects with multiple descriptors - walk 1361da177e4SLinus Torvalds * to the end of the descriptor list 1371da177e4SLinus Torvalds */ 1381da177e4SLinus Torvalds last_obj_desc = obj_desc; 1391da177e4SLinus Torvalds while (last_obj_desc->common.next_object) { 1401da177e4SLinus Torvalds last_obj_desc = last_obj_desc->common.next_object; 1411da177e4SLinus Torvalds } 1421da177e4SLinus Torvalds 1431da177e4SLinus Torvalds /* Install the object at the front of the object list */ 1441da177e4SLinus Torvalds 1451da177e4SLinus Torvalds last_obj_desc->common.next_object = node->object; 1461da177e4SLinus Torvalds } 1471da177e4SLinus Torvalds 1481da177e4SLinus Torvalds node->type = (u8) object_type; 1491da177e4SLinus Torvalds node->object = obj_desc; 1501da177e4SLinus Torvalds 1511da177e4SLinus Torvalds return_ACPI_STATUS(AE_OK); 1521da177e4SLinus Torvalds } 1531da177e4SLinus Torvalds 1541da177e4SLinus Torvalds /******************************************************************************* 1551da177e4SLinus Torvalds * 1561da177e4SLinus Torvalds * FUNCTION: acpi_ns_detach_object 1571da177e4SLinus Torvalds * 158ba494beeSBob Moore * PARAMETERS: node - A Namespace node whose object will be detached 1591da177e4SLinus Torvalds * 1601da177e4SLinus Torvalds * RETURN: None. 1611da177e4SLinus Torvalds * 1621da177e4SLinus Torvalds * DESCRIPTION: Detach/delete an object associated with a namespace node. 1631da177e4SLinus Torvalds * if the object is an allocated object, it is freed. 1641da177e4SLinus Torvalds * Otherwise, the field is simply cleared. 1651da177e4SLinus Torvalds * 1661da177e4SLinus Torvalds ******************************************************************************/ 1671da177e4SLinus Torvalds 1684be44fcdSLen Brown void acpi_ns_detach_object(struct acpi_namespace_node *node) 1691da177e4SLinus Torvalds { 1701da177e4SLinus Torvalds union acpi_operand_object *obj_desc; 1711da177e4SLinus Torvalds 172b229cf92SBob Moore ACPI_FUNCTION_TRACE(ns_detach_object); 1731da177e4SLinus Torvalds 1741da177e4SLinus Torvalds obj_desc = node->object; 1751da177e4SLinus Torvalds 1763371c19cSBob Moore if (!obj_desc || (obj_desc->common.type == ACPI_TYPE_LOCAL_DATA)) { 1771da177e4SLinus Torvalds return_VOID; 1781da177e4SLinus Torvalds } 1791da177e4SLinus Torvalds 180b2f7ddcfSLin Ming if (node->flags & ANOBJ_ALLOCATED_BUFFER) { 181b2f7ddcfSLin Ming 182b2f7ddcfSLin Ming /* Free the dynamic aml buffer */ 183b2f7ddcfSLin Ming 184b2f7ddcfSLin Ming if (obj_desc->common.type == ACPI_TYPE_METHOD) { 185b2f7ddcfSLin Ming ACPI_FREE(obj_desc->method.aml_start); 186b2f7ddcfSLin Ming } 187b2f7ddcfSLin Ming } 188b2f7ddcfSLin Ming 189*c5781ffbSErik Schmauss if (obj_desc->common.type == ACPI_TYPE_REGION) { 190*c5781ffbSErik Schmauss acpi_ut_remove_address_range(obj_desc->region.space_id, node); 191*c5781ffbSErik Schmauss } 192*c5781ffbSErik Schmauss 193f953529fSBob Moore /* Clear the Node entry in all cases */ 1941da177e4SLinus Torvalds 1951da177e4SLinus Torvalds node->object = NULL; 1961da177e4SLinus Torvalds if (ACPI_GET_DESCRIPTOR_TYPE(obj_desc) == ACPI_DESC_TYPE_OPERAND) { 197f953529fSBob Moore 198f953529fSBob Moore /* Unlink object from front of possible object list */ 199f953529fSBob Moore 2001da177e4SLinus Torvalds node->object = obj_desc->common.next_object; 201f953529fSBob Moore 202f953529fSBob Moore /* Handle possible 2-descriptor object */ 203f953529fSBob Moore 2041da177e4SLinus Torvalds if (node->object && 205f953529fSBob Moore (node->object->common.type != ACPI_TYPE_LOCAL_DATA)) { 2061da177e4SLinus Torvalds node->object = node->object->common.next_object; 2071da177e4SLinus Torvalds } 2081da177e4SLinus Torvalds 209e23d9b82SDavid E. Box /* 210e23d9b82SDavid E. Box * Detach the object from any data objects (which are still held by 211e23d9b82SDavid E. Box * the namespace node) 212e23d9b82SDavid E. Box */ 213e23d9b82SDavid E. Box if (obj_desc->common.next_object && 214e23d9b82SDavid E. Box ((obj_desc->common.next_object)->common.type == 215e23d9b82SDavid E. Box ACPI_TYPE_LOCAL_DATA)) { 216e23d9b82SDavid E. Box obj_desc->common.next_object = NULL; 217e23d9b82SDavid E. Box } 2187817e265SBob Moore } 219e23d9b82SDavid E. Box 2201da177e4SLinus Torvalds /* Reset the node type to untyped */ 2211da177e4SLinus Torvalds 2221da177e4SLinus Torvalds node->type = ACPI_TYPE_ANY; 2231da177e4SLinus Torvalds 2241da177e4SLinus Torvalds ACPI_DEBUG_PRINT((ACPI_DB_NAMES, "Node %p [%4.4s] Object %p\n", 2251da177e4SLinus Torvalds node, acpi_ut_get_node_name(node), obj_desc)); 2261da177e4SLinus Torvalds 2271da177e4SLinus Torvalds /* Remove one reference on the object (and all subobjects) */ 2281da177e4SLinus Torvalds 2291da177e4SLinus Torvalds acpi_ut_remove_reference(obj_desc); 2301da177e4SLinus Torvalds return_VOID; 2311da177e4SLinus Torvalds } 2321da177e4SLinus Torvalds 2331da177e4SLinus Torvalds /******************************************************************************* 2341da177e4SLinus Torvalds * 2351da177e4SLinus Torvalds * FUNCTION: acpi_ns_get_attached_object 2361da177e4SLinus Torvalds * 237ba494beeSBob Moore * PARAMETERS: node - Namespace node 2381da177e4SLinus Torvalds * 2391da177e4SLinus Torvalds * RETURN: Current value of the object field from the Node whose 2401da177e4SLinus Torvalds * handle is passed 2411da177e4SLinus Torvalds * 2421da177e4SLinus Torvalds * DESCRIPTION: Obtain the object attached to a namespace node. 2431da177e4SLinus Torvalds * 2441da177e4SLinus Torvalds ******************************************************************************/ 2451da177e4SLinus Torvalds 2464be44fcdSLen Brown union acpi_operand_object *acpi_ns_get_attached_object(struct 2474be44fcdSLen Brown acpi_namespace_node 2484be44fcdSLen Brown *node) 2491da177e4SLinus Torvalds { 250b229cf92SBob Moore ACPI_FUNCTION_TRACE_PTR(ns_get_attached_object, node); 2511da177e4SLinus Torvalds 2521da177e4SLinus Torvalds if (!node) { 253b8e4d893SBob Moore ACPI_WARNING((AE_INFO, "Null Node ptr")); 2541da177e4SLinus Torvalds return_PTR(NULL); 2551da177e4SLinus Torvalds } 2561da177e4SLinus Torvalds 2571da177e4SLinus Torvalds if (!node->object || 2584be44fcdSLen Brown ((ACPI_GET_DESCRIPTOR_TYPE(node->object) != ACPI_DESC_TYPE_OPERAND) 2594be44fcdSLen Brown && (ACPI_GET_DESCRIPTOR_TYPE(node->object) != 2604be44fcdSLen Brown ACPI_DESC_TYPE_NAMED)) 2613371c19cSBob Moore || ((node->object)->common.type == ACPI_TYPE_LOCAL_DATA)) { 2621da177e4SLinus Torvalds return_PTR(NULL); 2631da177e4SLinus Torvalds } 2641da177e4SLinus Torvalds 2651da177e4SLinus Torvalds return_PTR(node->object); 2661da177e4SLinus Torvalds } 2671da177e4SLinus Torvalds 2681da177e4SLinus Torvalds /******************************************************************************* 2691da177e4SLinus Torvalds * 2701da177e4SLinus Torvalds * FUNCTION: acpi_ns_get_secondary_object 2711da177e4SLinus Torvalds * 272ba494beeSBob Moore * PARAMETERS: node - Namespace node 2731da177e4SLinus Torvalds * 2741da177e4SLinus Torvalds * RETURN: Current value of the object field from the Node whose 2751da177e4SLinus Torvalds * handle is passed. 2761da177e4SLinus Torvalds * 2771da177e4SLinus Torvalds * DESCRIPTION: Obtain a secondary object associated with a namespace node. 2781da177e4SLinus Torvalds * 2791da177e4SLinus Torvalds ******************************************************************************/ 2801da177e4SLinus Torvalds 2814be44fcdSLen Brown union acpi_operand_object *acpi_ns_get_secondary_object(union 2824be44fcdSLen Brown acpi_operand_object 2834be44fcdSLen Brown *obj_desc) 2841da177e4SLinus Torvalds { 285b229cf92SBob Moore ACPI_FUNCTION_TRACE_PTR(ns_get_secondary_object, obj_desc); 2861da177e4SLinus Torvalds 2871da177e4SLinus Torvalds if ((!obj_desc) || 2883371c19cSBob Moore (obj_desc->common.type == ACPI_TYPE_LOCAL_DATA) || 2891da177e4SLinus Torvalds (!obj_desc->common.next_object) || 2903371c19cSBob Moore ((obj_desc->common.next_object)->common.type == 2914be44fcdSLen Brown ACPI_TYPE_LOCAL_DATA)) { 2921da177e4SLinus Torvalds return_PTR(NULL); 2931da177e4SLinus Torvalds } 2941da177e4SLinus Torvalds 2951da177e4SLinus Torvalds return_PTR(obj_desc->common.next_object); 2961da177e4SLinus Torvalds } 2971da177e4SLinus Torvalds 2981da177e4SLinus Torvalds /******************************************************************************* 2991da177e4SLinus Torvalds * 3001da177e4SLinus Torvalds * FUNCTION: acpi_ns_attach_data 3011da177e4SLinus Torvalds * 302ba494beeSBob Moore * PARAMETERS: node - Namespace node 303ba494beeSBob Moore * handler - Handler to be associated with the data 304ba494beeSBob Moore * data - Data to be attached 3051da177e4SLinus Torvalds * 3061da177e4SLinus Torvalds * RETURN: Status 3071da177e4SLinus Torvalds * 3081da177e4SLinus Torvalds * DESCRIPTION: Low-level attach data. Create and attach a Data object. 3091da177e4SLinus Torvalds * 3101da177e4SLinus Torvalds ******************************************************************************/ 3111da177e4SLinus Torvalds 3121da177e4SLinus Torvalds acpi_status 3134be44fcdSLen Brown acpi_ns_attach_data(struct acpi_namespace_node *node, 3144be44fcdSLen Brown acpi_object_handler handler, void *data) 3151da177e4SLinus Torvalds { 3161da177e4SLinus Torvalds union acpi_operand_object *prev_obj_desc; 3171da177e4SLinus Torvalds union acpi_operand_object *obj_desc; 3181da177e4SLinus Torvalds union acpi_operand_object *data_desc; 3191da177e4SLinus Torvalds 3201da177e4SLinus Torvalds /* We only allow one attachment per handler */ 3211da177e4SLinus Torvalds 3221da177e4SLinus Torvalds prev_obj_desc = NULL; 3231da177e4SLinus Torvalds obj_desc = node->object; 3241da177e4SLinus Torvalds while (obj_desc) { 3253371c19cSBob Moore if ((obj_desc->common.type == ACPI_TYPE_LOCAL_DATA) && 3261da177e4SLinus Torvalds (obj_desc->data.handler == handler)) { 3271da177e4SLinus Torvalds return (AE_ALREADY_EXISTS); 3281da177e4SLinus Torvalds } 3291da177e4SLinus Torvalds 3301da177e4SLinus Torvalds prev_obj_desc = obj_desc; 3311da177e4SLinus Torvalds obj_desc = obj_desc->common.next_object; 3321da177e4SLinus Torvalds } 3331da177e4SLinus Torvalds 3341da177e4SLinus Torvalds /* Create an internal object for the data */ 3351da177e4SLinus Torvalds 3361da177e4SLinus Torvalds data_desc = acpi_ut_create_internal_object(ACPI_TYPE_LOCAL_DATA); 3371da177e4SLinus Torvalds if (!data_desc) { 3381da177e4SLinus Torvalds return (AE_NO_MEMORY); 3391da177e4SLinus Torvalds } 3401da177e4SLinus Torvalds 3411da177e4SLinus Torvalds data_desc->data.handler = handler; 3421da177e4SLinus Torvalds data_desc->data.pointer = data; 3431da177e4SLinus Torvalds 3441da177e4SLinus Torvalds /* Install the data object */ 3451da177e4SLinus Torvalds 3461da177e4SLinus Torvalds if (prev_obj_desc) { 3471da177e4SLinus Torvalds prev_obj_desc->common.next_object = data_desc; 3484be44fcdSLen Brown } else { 3491da177e4SLinus Torvalds node->object = data_desc; 3501da177e4SLinus Torvalds } 3511da177e4SLinus Torvalds 3521da177e4SLinus Torvalds return (AE_OK); 3531da177e4SLinus Torvalds } 3541da177e4SLinus Torvalds 3551da177e4SLinus Torvalds /******************************************************************************* 3561da177e4SLinus Torvalds * 3571da177e4SLinus Torvalds * FUNCTION: acpi_ns_detach_data 3581da177e4SLinus Torvalds * 359ba494beeSBob Moore * PARAMETERS: node - Namespace node 360ba494beeSBob Moore * handler - Handler associated with the data 3611da177e4SLinus Torvalds * 3621da177e4SLinus Torvalds * RETURN: Status 3631da177e4SLinus Torvalds * 3641da177e4SLinus Torvalds * DESCRIPTION: Low-level detach data. Delete the data node, but the caller 3651da177e4SLinus Torvalds * is responsible for the actual data. 3661da177e4SLinus Torvalds * 3671da177e4SLinus Torvalds ******************************************************************************/ 3681da177e4SLinus Torvalds 3691da177e4SLinus Torvalds acpi_status 3704be44fcdSLen Brown acpi_ns_detach_data(struct acpi_namespace_node *node, 3711da177e4SLinus Torvalds acpi_object_handler handler) 3721da177e4SLinus Torvalds { 3731da177e4SLinus Torvalds union acpi_operand_object *obj_desc; 3741da177e4SLinus Torvalds union acpi_operand_object *prev_obj_desc; 3751da177e4SLinus Torvalds 3761da177e4SLinus Torvalds prev_obj_desc = NULL; 3771da177e4SLinus Torvalds obj_desc = node->object; 3781da177e4SLinus Torvalds while (obj_desc) { 3793371c19cSBob Moore if ((obj_desc->common.type == ACPI_TYPE_LOCAL_DATA) && 3801da177e4SLinus Torvalds (obj_desc->data.handler == handler)) { 3811da177e4SLinus Torvalds if (prev_obj_desc) { 3824be44fcdSLen Brown prev_obj_desc->common.next_object = 3834be44fcdSLen Brown obj_desc->common.next_object; 3844be44fcdSLen Brown } else { 3851da177e4SLinus Torvalds node->object = obj_desc->common.next_object; 3861da177e4SLinus Torvalds } 3871da177e4SLinus Torvalds 3881da177e4SLinus Torvalds acpi_ut_remove_reference(obj_desc); 3891da177e4SLinus Torvalds return (AE_OK); 3901da177e4SLinus Torvalds } 3911da177e4SLinus Torvalds 3921da177e4SLinus Torvalds prev_obj_desc = obj_desc; 3931da177e4SLinus Torvalds obj_desc = obj_desc->common.next_object; 3941da177e4SLinus Torvalds } 3951da177e4SLinus Torvalds 3961da177e4SLinus Torvalds return (AE_NOT_FOUND); 3971da177e4SLinus Torvalds } 3981da177e4SLinus Torvalds 3991da177e4SLinus Torvalds /******************************************************************************* 4001da177e4SLinus Torvalds * 4011da177e4SLinus Torvalds * FUNCTION: acpi_ns_get_attached_data 4021da177e4SLinus Torvalds * 403ba494beeSBob Moore * PARAMETERS: node - Namespace node 404ba494beeSBob Moore * handler - Handler associated with the data 405ba494beeSBob Moore * data - Where the data is returned 4061da177e4SLinus Torvalds * 4071da177e4SLinus Torvalds * RETURN: Status 4081da177e4SLinus Torvalds * 4091da177e4SLinus Torvalds * DESCRIPTION: Low level interface to obtain data previously associated with 4101da177e4SLinus Torvalds * a namespace node. 4111da177e4SLinus Torvalds * 4121da177e4SLinus Torvalds ******************************************************************************/ 4131da177e4SLinus Torvalds 4141da177e4SLinus Torvalds acpi_status 4154be44fcdSLen Brown acpi_ns_get_attached_data(struct acpi_namespace_node *node, 4164be44fcdSLen Brown acpi_object_handler handler, void **data) 4171da177e4SLinus Torvalds { 4181da177e4SLinus Torvalds union acpi_operand_object *obj_desc; 4191da177e4SLinus Torvalds 4201da177e4SLinus Torvalds obj_desc = node->object; 4211da177e4SLinus Torvalds while (obj_desc) { 4223371c19cSBob Moore if ((obj_desc->common.type == ACPI_TYPE_LOCAL_DATA) && 4231da177e4SLinus Torvalds (obj_desc->data.handler == handler)) { 4241da177e4SLinus Torvalds *data = obj_desc->data.pointer; 4251da177e4SLinus Torvalds return (AE_OK); 4261da177e4SLinus Torvalds } 4271da177e4SLinus Torvalds 4281da177e4SLinus Torvalds obj_desc = obj_desc->common.next_object; 4291da177e4SLinus Torvalds } 4301da177e4SLinus Torvalds 4311da177e4SLinus Torvalds return (AE_NOT_FOUND); 4321da177e4SLinus Torvalds } 433