1*3446Smrj /******************************************************************************* 2*3446Smrj * 3*3446Smrj * Module Name: nsobject - Utilities for objects attached to namespace 4*3446Smrj * table entries 5*3446Smrj * $Revision: 1.97 $ 6*3446Smrj * 7*3446Smrj ******************************************************************************/ 8*3446Smrj 9*3446Smrj /****************************************************************************** 10*3446Smrj * 11*3446Smrj * 1. Copyright Notice 12*3446Smrj * 13*3446Smrj * Some or all of this work - Copyright (c) 1999 - 2006, Intel Corp. 14*3446Smrj * All rights reserved. 15*3446Smrj * 16*3446Smrj * 2. License 17*3446Smrj * 18*3446Smrj * 2.1. This is your license from Intel Corp. under its intellectual property 19*3446Smrj * rights. You may have additional license terms from the party that provided 20*3446Smrj * you this software, covering your right to use that party's intellectual 21*3446Smrj * property rights. 22*3446Smrj * 23*3446Smrj * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a 24*3446Smrj * copy of the source code appearing in this file ("Covered Code") an 25*3446Smrj * irrevocable, perpetual, worldwide license under Intel's copyrights in the 26*3446Smrj * base code distributed originally by Intel ("Original Intel Code") to copy, 27*3446Smrj * make derivatives, distribute, use and display any portion of the Covered 28*3446Smrj * Code in any form, with the right to sublicense such rights; and 29*3446Smrj * 30*3446Smrj * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent 31*3446Smrj * license (with the right to sublicense), under only those claims of Intel 32*3446Smrj * patents that are infringed by the Original Intel Code, to make, use, sell, 33*3446Smrj * offer to sell, and import the Covered Code and derivative works thereof 34*3446Smrj * solely to the minimum extent necessary to exercise the above copyright 35*3446Smrj * license, and in no event shall the patent license extend to any additions 36*3446Smrj * to or modifications of the Original Intel Code. No other license or right 37*3446Smrj * is granted directly or by implication, estoppel or otherwise; 38*3446Smrj * 39*3446Smrj * The above copyright and patent license is granted only if the following 40*3446Smrj * conditions are met: 41*3446Smrj * 42*3446Smrj * 3. Conditions 43*3446Smrj * 44*3446Smrj * 3.1. Redistribution of Source with Rights to Further Distribute Source. 45*3446Smrj * Redistribution of source code of any substantial portion of the Covered 46*3446Smrj * Code or modification with rights to further distribute source must include 47*3446Smrj * the above Copyright Notice, the above License, this list of Conditions, 48*3446Smrj * and the following Disclaimer and Export Compliance provision. In addition, 49*3446Smrj * Licensee must cause all Covered Code to which Licensee contributes to 50*3446Smrj * contain a file documenting the changes Licensee made to create that Covered 51*3446Smrj * Code and the date of any change. Licensee must include in that file the 52*3446Smrj * documentation of any changes made by any predecessor Licensee. Licensee 53*3446Smrj * must include a prominent statement that the modification is derived, 54*3446Smrj * directly or indirectly, from Original Intel Code. 55*3446Smrj * 56*3446Smrj * 3.2. Redistribution of Source with no Rights to Further Distribute Source. 57*3446Smrj * Redistribution of source code of any substantial portion of the Covered 58*3446Smrj * Code or modification without rights to further distribute source must 59*3446Smrj * include the following Disclaimer and Export Compliance provision in the 60*3446Smrj * documentation and/or other materials provided with distribution. In 61*3446Smrj * addition, Licensee may not authorize further sublicense of source of any 62*3446Smrj * portion of the Covered Code, and must include terms to the effect that the 63*3446Smrj * license from Licensee to its licensee is limited to the intellectual 64*3446Smrj * property embodied in the software Licensee provides to its licensee, and 65*3446Smrj * not to intellectual property embodied in modifications its licensee may 66*3446Smrj * make. 67*3446Smrj * 68*3446Smrj * 3.3. Redistribution of Executable. Redistribution in executable form of any 69*3446Smrj * substantial portion of the Covered Code or modification must reproduce the 70*3446Smrj * above Copyright Notice, and the following Disclaimer and Export Compliance 71*3446Smrj * provision in the documentation and/or other materials provided with the 72*3446Smrj * distribution. 73*3446Smrj * 74*3446Smrj * 3.4. Intel retains all right, title, and interest in and to the Original 75*3446Smrj * Intel Code. 76*3446Smrj * 77*3446Smrj * 3.5. Neither the name Intel nor any other trademark owned or controlled by 78*3446Smrj * Intel shall be used in advertising or otherwise to promote the sale, use or 79*3446Smrj * other dealings in products derived from or relating to the Covered Code 80*3446Smrj * without prior written authorization from Intel. 81*3446Smrj * 82*3446Smrj * 4. Disclaimer and Export Compliance 83*3446Smrj * 84*3446Smrj * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED 85*3446Smrj * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE 86*3446Smrj * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE, 87*3446Smrj * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY 88*3446Smrj * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY 89*3446Smrj * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A 90*3446Smrj * PARTICULAR PURPOSE. 91*3446Smrj * 92*3446Smrj * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES 93*3446Smrj * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR 94*3446Smrj * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT, 95*3446Smrj * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY 96*3446Smrj * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL 97*3446Smrj * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS 98*3446Smrj * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY 99*3446Smrj * LIMITED REMEDY. 100*3446Smrj * 101*3446Smrj * 4.3. Licensee shall not export, either directly or indirectly, any of this 102*3446Smrj * software or system incorporating such software without first obtaining any 103*3446Smrj * required license or other approval from the U. S. Department of Commerce or 104*3446Smrj * any other agency or department of the United States Government. In the 105*3446Smrj * event Licensee exports any such software from the United States or 106*3446Smrj * re-exports any such software from a foreign destination, Licensee shall 107*3446Smrj * ensure that the distribution and export/re-export of the software is in 108*3446Smrj * compliance with all laws, regulations, orders, or other restrictions of the 109*3446Smrj * U.S. Export Administration Regulations. Licensee agrees that neither it nor 110*3446Smrj * any of its subsidiaries will export/re-export any technical data, process, 111*3446Smrj * software, or service, directly or indirectly, to any country for which the 112*3446Smrj * United States government or any agency thereof requires an export license, 113*3446Smrj * other governmental approval, or letter of assurance, without first obtaining 114*3446Smrj * such license, approval or letter. 115*3446Smrj * 116*3446Smrj *****************************************************************************/ 117*3446Smrj 118*3446Smrj 119*3446Smrj #define __NSOBJECT_C__ 120*3446Smrj 121*3446Smrj #include "acpi.h" 122*3446Smrj #include "acnamesp.h" 123*3446Smrj 124*3446Smrj 125*3446Smrj #define _COMPONENT ACPI_NAMESPACE 126*3446Smrj ACPI_MODULE_NAME ("nsobject") 127*3446Smrj 128*3446Smrj 129*3446Smrj /******************************************************************************* 130*3446Smrj * 131*3446Smrj * FUNCTION: AcpiNsAttachObject 132*3446Smrj * 133*3446Smrj * PARAMETERS: Node - Parent Node 134*3446Smrj * Object - Object to be attached 135*3446Smrj * Type - Type of object, or ACPI_TYPE_ANY if not 136*3446Smrj * known 137*3446Smrj * 138*3446Smrj * RETURN: Status 139*3446Smrj * 140*3446Smrj * DESCRIPTION: Record the given object as the value associated with the 141*3446Smrj * name whose ACPI_HANDLE is passed. If Object is NULL 142*3446Smrj * and Type is ACPI_TYPE_ANY, set the name as having no value. 143*3446Smrj * Note: Future may require that the Node->Flags field be passed 144*3446Smrj * as a parameter. 145*3446Smrj * 146*3446Smrj * MUTEX: Assumes namespace is locked 147*3446Smrj * 148*3446Smrj ******************************************************************************/ 149*3446Smrj 150*3446Smrj ACPI_STATUS 151*3446Smrj AcpiNsAttachObject ( 152*3446Smrj ACPI_NAMESPACE_NODE *Node, 153*3446Smrj ACPI_OPERAND_OBJECT *Object, 154*3446Smrj ACPI_OBJECT_TYPE Type) 155*3446Smrj { 156*3446Smrj ACPI_OPERAND_OBJECT *ObjDesc; 157*3446Smrj ACPI_OPERAND_OBJECT *LastObjDesc; 158*3446Smrj ACPI_OBJECT_TYPE ObjectType = ACPI_TYPE_ANY; 159*3446Smrj 160*3446Smrj 161*3446Smrj ACPI_FUNCTION_TRACE (NsAttachObject); 162*3446Smrj 163*3446Smrj 164*3446Smrj /* 165*3446Smrj * Parameter validation 166*3446Smrj */ 167*3446Smrj if (!Node) 168*3446Smrj { 169*3446Smrj /* Invalid handle */ 170*3446Smrj 171*3446Smrj ACPI_ERROR ((AE_INFO, "Null NamedObj handle")); 172*3446Smrj return_ACPI_STATUS (AE_BAD_PARAMETER); 173*3446Smrj } 174*3446Smrj 175*3446Smrj if (!Object && (ACPI_TYPE_ANY != Type)) 176*3446Smrj { 177*3446Smrj /* Null object */ 178*3446Smrj 179*3446Smrj ACPI_ERROR ((AE_INFO, 180*3446Smrj "Null object, but type not ACPI_TYPE_ANY")); 181*3446Smrj return_ACPI_STATUS (AE_BAD_PARAMETER); 182*3446Smrj } 183*3446Smrj 184*3446Smrj if (ACPI_GET_DESCRIPTOR_TYPE (Node) != ACPI_DESC_TYPE_NAMED) 185*3446Smrj { 186*3446Smrj /* Not a name handle */ 187*3446Smrj 188*3446Smrj ACPI_ERROR ((AE_INFO, "Invalid handle %p [%s]", 189*3446Smrj Node, AcpiUtGetDescriptorName (Node))); 190*3446Smrj return_ACPI_STATUS (AE_BAD_PARAMETER); 191*3446Smrj } 192*3446Smrj 193*3446Smrj /* Check if this object is already attached */ 194*3446Smrj 195*3446Smrj if (Node->Object == Object) 196*3446Smrj { 197*3446Smrj ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, 198*3446Smrj "Obj %p already installed in NameObj %p\n", 199*3446Smrj Object, Node)); 200*3446Smrj 201*3446Smrj return_ACPI_STATUS (AE_OK); 202*3446Smrj } 203*3446Smrj 204*3446Smrj /* If null object, we will just install it */ 205*3446Smrj 206*3446Smrj if (!Object) 207*3446Smrj { 208*3446Smrj ObjDesc = NULL; 209*3446Smrj ObjectType = ACPI_TYPE_ANY; 210*3446Smrj } 211*3446Smrj 212*3446Smrj /* 213*3446Smrj * If the source object is a namespace Node with an attached object, 214*3446Smrj * we will use that (attached) object 215*3446Smrj */ 216*3446Smrj else if ((ACPI_GET_DESCRIPTOR_TYPE (Object) == ACPI_DESC_TYPE_NAMED) && 217*3446Smrj ((ACPI_NAMESPACE_NODE *) Object)->Object) 218*3446Smrj { 219*3446Smrj /* 220*3446Smrj * Value passed is a name handle and that name has a 221*3446Smrj * non-null value. Use that name's value and type. 222*3446Smrj */ 223*3446Smrj ObjDesc = ((ACPI_NAMESPACE_NODE *) Object)->Object; 224*3446Smrj ObjectType = ((ACPI_NAMESPACE_NODE *) Object)->Type; 225*3446Smrj } 226*3446Smrj 227*3446Smrj /* 228*3446Smrj * Otherwise, we will use the parameter object, but we must type 229*3446Smrj * it first 230*3446Smrj */ 231*3446Smrj else 232*3446Smrj { 233*3446Smrj ObjDesc = (ACPI_OPERAND_OBJECT *) Object; 234*3446Smrj 235*3446Smrj /* Use the given type */ 236*3446Smrj 237*3446Smrj ObjectType = Type; 238*3446Smrj } 239*3446Smrj 240*3446Smrj ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Installing %p into Node %p [%4.4s]\n", 241*3446Smrj ObjDesc, Node, AcpiUtGetNodeName (Node))); 242*3446Smrj 243*3446Smrj /* Detach an existing attached object if present */ 244*3446Smrj 245*3446Smrj if (Node->Object) 246*3446Smrj { 247*3446Smrj AcpiNsDetachObject (Node); 248*3446Smrj } 249*3446Smrj 250*3446Smrj if (ObjDesc) 251*3446Smrj { 252*3446Smrj /* 253*3446Smrj * Must increment the new value's reference count 254*3446Smrj * (if it is an internal object) 255*3446Smrj */ 256*3446Smrj AcpiUtAddReference (ObjDesc); 257*3446Smrj 258*3446Smrj /* 259*3446Smrj * Handle objects with multiple descriptors - walk 260*3446Smrj * to the end of the descriptor list 261*3446Smrj */ 262*3446Smrj LastObjDesc = ObjDesc; 263*3446Smrj while (LastObjDesc->Common.NextObject) 264*3446Smrj { 265*3446Smrj LastObjDesc = LastObjDesc->Common.NextObject; 266*3446Smrj } 267*3446Smrj 268*3446Smrj /* Install the object at the front of the object list */ 269*3446Smrj 270*3446Smrj LastObjDesc->Common.NextObject = Node->Object; 271*3446Smrj } 272*3446Smrj 273*3446Smrj Node->Type = (UINT8) ObjectType; 274*3446Smrj Node->Object = ObjDesc; 275*3446Smrj 276*3446Smrj return_ACPI_STATUS (AE_OK); 277*3446Smrj } 278*3446Smrj 279*3446Smrj 280*3446Smrj /******************************************************************************* 281*3446Smrj * 282*3446Smrj * FUNCTION: AcpiNsDetachObject 283*3446Smrj * 284*3446Smrj * PARAMETERS: Node - A Namespace node whose object will be detached 285*3446Smrj * 286*3446Smrj * RETURN: None. 287*3446Smrj * 288*3446Smrj * DESCRIPTION: Detach/delete an object associated with a namespace node. 289*3446Smrj * if the object is an allocated object, it is freed. 290*3446Smrj * Otherwise, the field is simply cleared. 291*3446Smrj * 292*3446Smrj ******************************************************************************/ 293*3446Smrj 294*3446Smrj void 295*3446Smrj AcpiNsDetachObject ( 296*3446Smrj ACPI_NAMESPACE_NODE *Node) 297*3446Smrj { 298*3446Smrj ACPI_OPERAND_OBJECT *ObjDesc; 299*3446Smrj 300*3446Smrj 301*3446Smrj ACPI_FUNCTION_TRACE (NsDetachObject); 302*3446Smrj 303*3446Smrj 304*3446Smrj ObjDesc = Node->Object; 305*3446Smrj 306*3446Smrj if (!ObjDesc || 307*3446Smrj (ACPI_GET_OBJECT_TYPE (ObjDesc) == ACPI_TYPE_LOCAL_DATA)) 308*3446Smrj { 309*3446Smrj return_VOID; 310*3446Smrj } 311*3446Smrj 312*3446Smrj /* Clear the entry in all cases */ 313*3446Smrj 314*3446Smrj Node->Object = NULL; 315*3446Smrj if (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) == ACPI_DESC_TYPE_OPERAND) 316*3446Smrj { 317*3446Smrj Node->Object = ObjDesc->Common.NextObject; 318*3446Smrj if (Node->Object && 319*3446Smrj (ACPI_GET_OBJECT_TYPE (Node->Object) != ACPI_TYPE_LOCAL_DATA)) 320*3446Smrj { 321*3446Smrj Node->Object = Node->Object->Common.NextObject; 322*3446Smrj } 323*3446Smrj } 324*3446Smrj 325*3446Smrj /* Reset the node type to untyped */ 326*3446Smrj 327*3446Smrj Node->Type = ACPI_TYPE_ANY; 328*3446Smrj 329*3446Smrj ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, "Node %p [%4.4s] Object %p\n", 330*3446Smrj Node, AcpiUtGetNodeName (Node), ObjDesc)); 331*3446Smrj 332*3446Smrj /* Remove one reference on the object (and all subobjects) */ 333*3446Smrj 334*3446Smrj AcpiUtRemoveReference (ObjDesc); 335*3446Smrj return_VOID; 336*3446Smrj } 337*3446Smrj 338*3446Smrj 339*3446Smrj /******************************************************************************* 340*3446Smrj * 341*3446Smrj * FUNCTION: AcpiNsGetAttachedObject 342*3446Smrj * 343*3446Smrj * PARAMETERS: Node - Namespace node 344*3446Smrj * 345*3446Smrj * RETURN: Current value of the object field from the Node whose 346*3446Smrj * handle is passed 347*3446Smrj * 348*3446Smrj * DESCRIPTION: Obtain the object attached to a namespace node. 349*3446Smrj * 350*3446Smrj ******************************************************************************/ 351*3446Smrj 352*3446Smrj ACPI_OPERAND_OBJECT * 353*3446Smrj AcpiNsGetAttachedObject ( 354*3446Smrj ACPI_NAMESPACE_NODE *Node) 355*3446Smrj { 356*3446Smrj ACPI_FUNCTION_TRACE_PTR (NsGetAttachedObject, Node); 357*3446Smrj 358*3446Smrj 359*3446Smrj if (!Node) 360*3446Smrj { 361*3446Smrj ACPI_WARNING ((AE_INFO, "Null Node ptr")); 362*3446Smrj return_PTR (NULL); 363*3446Smrj } 364*3446Smrj 365*3446Smrj if (!Node->Object || 366*3446Smrj ((ACPI_GET_DESCRIPTOR_TYPE (Node->Object) != ACPI_DESC_TYPE_OPERAND) && 367*3446Smrj (ACPI_GET_DESCRIPTOR_TYPE (Node->Object) != ACPI_DESC_TYPE_NAMED)) || 368*3446Smrj (ACPI_GET_OBJECT_TYPE (Node->Object) == ACPI_TYPE_LOCAL_DATA)) 369*3446Smrj { 370*3446Smrj return_PTR (NULL); 371*3446Smrj } 372*3446Smrj 373*3446Smrj return_PTR (Node->Object); 374*3446Smrj } 375*3446Smrj 376*3446Smrj 377*3446Smrj /******************************************************************************* 378*3446Smrj * 379*3446Smrj * FUNCTION: AcpiNsGetSecondaryObject 380*3446Smrj * 381*3446Smrj * PARAMETERS: Node - Namespace node 382*3446Smrj * 383*3446Smrj * RETURN: Current value of the object field from the Node whose 384*3446Smrj * handle is passed. 385*3446Smrj * 386*3446Smrj * DESCRIPTION: Obtain a secondary object associated with a namespace node. 387*3446Smrj * 388*3446Smrj ******************************************************************************/ 389*3446Smrj 390*3446Smrj ACPI_OPERAND_OBJECT * 391*3446Smrj AcpiNsGetSecondaryObject ( 392*3446Smrj ACPI_OPERAND_OBJECT *ObjDesc) 393*3446Smrj { 394*3446Smrj ACPI_FUNCTION_TRACE_PTR (NsGetSecondaryObject, ObjDesc); 395*3446Smrj 396*3446Smrj 397*3446Smrj if ((!ObjDesc) || 398*3446Smrj (ACPI_GET_OBJECT_TYPE (ObjDesc) == ACPI_TYPE_LOCAL_DATA) || 399*3446Smrj (!ObjDesc->Common.NextObject) || 400*3446Smrj (ACPI_GET_OBJECT_TYPE (ObjDesc->Common.NextObject) == ACPI_TYPE_LOCAL_DATA)) 401*3446Smrj { 402*3446Smrj return_PTR (NULL); 403*3446Smrj } 404*3446Smrj 405*3446Smrj return_PTR (ObjDesc->Common.NextObject); 406*3446Smrj } 407*3446Smrj 408*3446Smrj 409*3446Smrj /******************************************************************************* 410*3446Smrj * 411*3446Smrj * FUNCTION: AcpiNsAttachData 412*3446Smrj * 413*3446Smrj * PARAMETERS: Node - Namespace node 414*3446Smrj * Handler - Handler to be associated with the data 415*3446Smrj * Data - Data to be attached 416*3446Smrj * 417*3446Smrj * RETURN: Status 418*3446Smrj * 419*3446Smrj * DESCRIPTION: Low-level attach data. Create and attach a Data object. 420*3446Smrj * 421*3446Smrj ******************************************************************************/ 422*3446Smrj 423*3446Smrj ACPI_STATUS 424*3446Smrj AcpiNsAttachData ( 425*3446Smrj ACPI_NAMESPACE_NODE *Node, 426*3446Smrj ACPI_OBJECT_HANDLER Handler, 427*3446Smrj void *Data) 428*3446Smrj { 429*3446Smrj ACPI_OPERAND_OBJECT *PrevObjDesc; 430*3446Smrj ACPI_OPERAND_OBJECT *ObjDesc; 431*3446Smrj ACPI_OPERAND_OBJECT *DataDesc; 432*3446Smrj 433*3446Smrj 434*3446Smrj /* We only allow one attachment per handler */ 435*3446Smrj 436*3446Smrj PrevObjDesc = NULL; 437*3446Smrj ObjDesc = Node->Object; 438*3446Smrj while (ObjDesc) 439*3446Smrj { 440*3446Smrj if ((ACPI_GET_OBJECT_TYPE (ObjDesc) == ACPI_TYPE_LOCAL_DATA) && 441*3446Smrj (ObjDesc->Data.Handler == Handler)) 442*3446Smrj { 443*3446Smrj return (AE_ALREADY_EXISTS); 444*3446Smrj } 445*3446Smrj 446*3446Smrj PrevObjDesc = ObjDesc; 447*3446Smrj ObjDesc = ObjDesc->Common.NextObject; 448*3446Smrj } 449*3446Smrj 450*3446Smrj /* Create an internal object for the data */ 451*3446Smrj 452*3446Smrj DataDesc = AcpiUtCreateInternalObject (ACPI_TYPE_LOCAL_DATA); 453*3446Smrj if (!DataDesc) 454*3446Smrj { 455*3446Smrj return (AE_NO_MEMORY); 456*3446Smrj } 457*3446Smrj 458*3446Smrj DataDesc->Data.Handler = Handler; 459*3446Smrj DataDesc->Data.Pointer = Data; 460*3446Smrj 461*3446Smrj /* Install the data object */ 462*3446Smrj 463*3446Smrj if (PrevObjDesc) 464*3446Smrj { 465*3446Smrj PrevObjDesc->Common.NextObject = DataDesc; 466*3446Smrj } 467*3446Smrj else 468*3446Smrj { 469*3446Smrj Node->Object = DataDesc; 470*3446Smrj } 471*3446Smrj 472*3446Smrj return (AE_OK); 473*3446Smrj } 474*3446Smrj 475*3446Smrj 476*3446Smrj /******************************************************************************* 477*3446Smrj * 478*3446Smrj * FUNCTION: AcpiNsDetachData 479*3446Smrj * 480*3446Smrj * PARAMETERS: Node - Namespace node 481*3446Smrj * Handler - Handler associated with the data 482*3446Smrj * 483*3446Smrj * RETURN: Status 484*3446Smrj * 485*3446Smrj * DESCRIPTION: Low-level detach data. Delete the data node, but the caller 486*3446Smrj * is responsible for the actual data. 487*3446Smrj * 488*3446Smrj ******************************************************************************/ 489*3446Smrj 490*3446Smrj ACPI_STATUS 491*3446Smrj AcpiNsDetachData ( 492*3446Smrj ACPI_NAMESPACE_NODE *Node, 493*3446Smrj ACPI_OBJECT_HANDLER Handler) 494*3446Smrj { 495*3446Smrj ACPI_OPERAND_OBJECT *ObjDesc; 496*3446Smrj ACPI_OPERAND_OBJECT *PrevObjDesc; 497*3446Smrj 498*3446Smrj 499*3446Smrj PrevObjDesc = NULL; 500*3446Smrj ObjDesc = Node->Object; 501*3446Smrj while (ObjDesc) 502*3446Smrj { 503*3446Smrj if ((ACPI_GET_OBJECT_TYPE (ObjDesc) == ACPI_TYPE_LOCAL_DATA) && 504*3446Smrj (ObjDesc->Data.Handler == Handler)) 505*3446Smrj { 506*3446Smrj if (PrevObjDesc) 507*3446Smrj { 508*3446Smrj PrevObjDesc->Common.NextObject = ObjDesc->Common.NextObject; 509*3446Smrj } 510*3446Smrj else 511*3446Smrj { 512*3446Smrj Node->Object = ObjDesc->Common.NextObject; 513*3446Smrj } 514*3446Smrj 515*3446Smrj AcpiUtRemoveReference (ObjDesc); 516*3446Smrj return (AE_OK); 517*3446Smrj } 518*3446Smrj 519*3446Smrj PrevObjDesc = ObjDesc; 520*3446Smrj ObjDesc = ObjDesc->Common.NextObject; 521*3446Smrj } 522*3446Smrj 523*3446Smrj return (AE_NOT_FOUND); 524*3446Smrj } 525*3446Smrj 526*3446Smrj 527*3446Smrj /******************************************************************************* 528*3446Smrj * 529*3446Smrj * FUNCTION: AcpiNsGetAttachedData 530*3446Smrj * 531*3446Smrj * PARAMETERS: Node - Namespace node 532*3446Smrj * Handler - Handler associated with the data 533*3446Smrj * Data - Where the data is returned 534*3446Smrj * 535*3446Smrj * RETURN: Status 536*3446Smrj * 537*3446Smrj * DESCRIPTION: Low level interface to obtain data previously associated with 538*3446Smrj * a namespace node. 539*3446Smrj * 540*3446Smrj ******************************************************************************/ 541*3446Smrj 542*3446Smrj ACPI_STATUS 543*3446Smrj AcpiNsGetAttachedData ( 544*3446Smrj ACPI_NAMESPACE_NODE *Node, 545*3446Smrj ACPI_OBJECT_HANDLER Handler, 546*3446Smrj void **Data) 547*3446Smrj { 548*3446Smrj ACPI_OPERAND_OBJECT *ObjDesc; 549*3446Smrj 550*3446Smrj 551*3446Smrj ObjDesc = Node->Object; 552*3446Smrj while (ObjDesc) 553*3446Smrj { 554*3446Smrj if ((ACPI_GET_OBJECT_TYPE (ObjDesc) == ACPI_TYPE_LOCAL_DATA) && 555*3446Smrj (ObjDesc->Data.Handler == Handler)) 556*3446Smrj { 557*3446Smrj *Data = ObjDesc->Data.Pointer; 558*3446Smrj return (AE_OK); 559*3446Smrj } 560*3446Smrj 561*3446Smrj ObjDesc = ObjDesc->Common.NextObject; 562*3446Smrj } 563*3446Smrj 564*3446Smrj return (AE_NOT_FOUND); 565*3446Smrj } 566*3446Smrj 567*3446Smrj 568