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