xref: /titanic_53/usr/src/uts/intel/io/acpica/executer/exresolv.c (revision 385cc6b4ad1792caef3f84eb61eed3f27085801f)
1db2bae30SDana Myers /******************************************************************************
2db2bae30SDana Myers  *
3db2bae30SDana Myers  * Module Name: exresolv - AML Interpreter object resolution
4db2bae30SDana Myers  *
5db2bae30SDana Myers  *****************************************************************************/
6db2bae30SDana Myers 
726f3cdf0SGordon Ross /*
8*385cc6b4SJerry Jelinek  * Copyright (C) 2000 - 2016, Intel Corp.
9db2bae30SDana Myers  * All rights reserved.
10db2bae30SDana Myers  *
1126f3cdf0SGordon Ross  * Redistribution and use in source and binary forms, with or without
1226f3cdf0SGordon Ross  * modification, are permitted provided that the following conditions
1326f3cdf0SGordon Ross  * are met:
1426f3cdf0SGordon Ross  * 1. Redistributions of source code must retain the above copyright
1526f3cdf0SGordon Ross  *    notice, this list of conditions, and the following disclaimer,
1626f3cdf0SGordon Ross  *    without modification.
1726f3cdf0SGordon Ross  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
1826f3cdf0SGordon Ross  *    substantially similar to the "NO WARRANTY" disclaimer below
1926f3cdf0SGordon Ross  *    ("Disclaimer") and any redistribution must be conditioned upon
2026f3cdf0SGordon Ross  *    including a substantially similar Disclaimer requirement for further
2126f3cdf0SGordon Ross  *    binary redistribution.
2226f3cdf0SGordon Ross  * 3. Neither the names of the above-listed copyright holders nor the names
2326f3cdf0SGordon Ross  *    of any contributors may be used to endorse or promote products derived
2426f3cdf0SGordon Ross  *    from this software without specific prior written permission.
25db2bae30SDana Myers  *
2626f3cdf0SGordon Ross  * Alternatively, this software may be distributed under the terms of the
2726f3cdf0SGordon Ross  * GNU General Public License ("GPL") version 2 as published by the Free
2826f3cdf0SGordon Ross  * Software Foundation.
29db2bae30SDana Myers  *
3026f3cdf0SGordon Ross  * NO WARRANTY
3126f3cdf0SGordon Ross  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
3226f3cdf0SGordon Ross  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
3326f3cdf0SGordon Ross  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
3426f3cdf0SGordon Ross  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
3526f3cdf0SGordon Ross  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
3626f3cdf0SGordon Ross  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
3726f3cdf0SGordon Ross  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
3826f3cdf0SGordon Ross  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
3926f3cdf0SGordon Ross  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
4026f3cdf0SGordon Ross  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
4126f3cdf0SGordon Ross  * POSSIBILITY OF SUCH DAMAGES.
4226f3cdf0SGordon Ross  */
43db2bae30SDana Myers 
44db2bae30SDana Myers #include "acpi.h"
45aa2aa9a6SDana Myers #include "accommon.h"
46db2bae30SDana Myers #include "amlcode.h"
47db2bae30SDana Myers #include "acdispat.h"
48db2bae30SDana Myers #include "acinterp.h"
49db2bae30SDana Myers #include "acnamesp.h"
50db2bae30SDana Myers 
51db2bae30SDana Myers 
52db2bae30SDana Myers #define _COMPONENT          ACPI_EXECUTER
53db2bae30SDana Myers         ACPI_MODULE_NAME    ("exresolv")
54db2bae30SDana Myers 
55db2bae30SDana Myers /* Local prototypes */
56db2bae30SDana Myers 
57db2bae30SDana Myers static ACPI_STATUS
58db2bae30SDana Myers AcpiExResolveObjectToValue (
59db2bae30SDana Myers     ACPI_OPERAND_OBJECT     **StackPtr,
60db2bae30SDana Myers     ACPI_WALK_STATE         *WalkState);
61db2bae30SDana Myers 
62db2bae30SDana Myers 
63db2bae30SDana Myers /*******************************************************************************
64db2bae30SDana Myers  *
65db2bae30SDana Myers  * FUNCTION:    AcpiExResolveToValue
66db2bae30SDana Myers  *
67db2bae30SDana Myers  * PARAMETERS:  **StackPtr          - Points to entry on ObjStack, which can
68db2bae30SDana Myers  *                                    be either an (ACPI_OPERAND_OBJECT *)
69db2bae30SDana Myers  *                                    or an ACPI_HANDLE.
70db2bae30SDana Myers  *              WalkState           - Current method state
71db2bae30SDana Myers  *
72db2bae30SDana Myers  * RETURN:      Status
73db2bae30SDana Myers  *
74db2bae30SDana Myers  * DESCRIPTION: Convert Reference objects to values
75db2bae30SDana Myers  *
76db2bae30SDana Myers  ******************************************************************************/
77db2bae30SDana Myers 
78db2bae30SDana Myers ACPI_STATUS
AcpiExResolveToValue(ACPI_OPERAND_OBJECT ** StackPtr,ACPI_WALK_STATE * WalkState)79db2bae30SDana Myers AcpiExResolveToValue (
80db2bae30SDana Myers     ACPI_OPERAND_OBJECT     **StackPtr,
81db2bae30SDana Myers     ACPI_WALK_STATE         *WalkState)
82db2bae30SDana Myers {
83db2bae30SDana Myers     ACPI_STATUS             Status;
84db2bae30SDana Myers 
85db2bae30SDana Myers 
86db2bae30SDana Myers     ACPI_FUNCTION_TRACE_PTR (ExResolveToValue, StackPtr);
87db2bae30SDana Myers 
88db2bae30SDana Myers 
89db2bae30SDana Myers     if (!StackPtr || !*StackPtr)
90db2bae30SDana Myers     {
91db2bae30SDana Myers         ACPI_ERROR ((AE_INFO, "Internal - null pointer"));
92db2bae30SDana Myers         return_ACPI_STATUS (AE_AML_NO_OPERAND);
93db2bae30SDana Myers     }
94db2bae30SDana Myers 
95db2bae30SDana Myers     /*
96db2bae30SDana Myers      * The entity pointed to by the StackPtr can be either
97db2bae30SDana Myers      * 1) A valid ACPI_OPERAND_OBJECT, or
98db2bae30SDana Myers      * 2) A ACPI_NAMESPACE_NODE (NamedObj)
99db2bae30SDana Myers      */
100db2bae30SDana Myers     if (ACPI_GET_DESCRIPTOR_TYPE (*StackPtr) == ACPI_DESC_TYPE_OPERAND)
101db2bae30SDana Myers     {
102db2bae30SDana Myers         Status = AcpiExResolveObjectToValue (StackPtr, WalkState);
103db2bae30SDana Myers         if (ACPI_FAILURE (Status))
104db2bae30SDana Myers         {
105db2bae30SDana Myers             return_ACPI_STATUS (Status);
106db2bae30SDana Myers         }
107db2bae30SDana Myers 
108db2bae30SDana Myers         if (!*StackPtr)
109db2bae30SDana Myers         {
110db2bae30SDana Myers             ACPI_ERROR ((AE_INFO, "Internal - null pointer"));
111db2bae30SDana Myers             return_ACPI_STATUS (AE_AML_NO_OPERAND);
112db2bae30SDana Myers         }
113db2bae30SDana Myers     }
114db2bae30SDana Myers 
115db2bae30SDana Myers     /*
116db2bae30SDana Myers      * Object on the stack may have changed if AcpiExResolveObjectToValue()
117db2bae30SDana Myers      * was called (i.e., we can't use an _else_ here.)
118db2bae30SDana Myers      */
119db2bae30SDana Myers     if (ACPI_GET_DESCRIPTOR_TYPE (*StackPtr) == ACPI_DESC_TYPE_NAMED)
120db2bae30SDana Myers     {
121db2bae30SDana Myers         Status = AcpiExResolveNodeToValue (
122db2bae30SDana Myers             ACPI_CAST_INDIRECT_PTR (ACPI_NAMESPACE_NODE, StackPtr),
123db2bae30SDana Myers             WalkState);
124db2bae30SDana Myers         if (ACPI_FAILURE (Status))
125db2bae30SDana Myers         {
126db2bae30SDana Myers             return_ACPI_STATUS (Status);
127db2bae30SDana Myers         }
128db2bae30SDana Myers     }
129db2bae30SDana Myers 
130db2bae30SDana Myers     ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Resolved object %p\n", *StackPtr));
131db2bae30SDana Myers     return_ACPI_STATUS (AE_OK);
132db2bae30SDana Myers }
133db2bae30SDana Myers 
134db2bae30SDana Myers 
135db2bae30SDana Myers /*******************************************************************************
136db2bae30SDana Myers  *
137db2bae30SDana Myers  * FUNCTION:    AcpiExResolveObjectToValue
138db2bae30SDana Myers  *
139db2bae30SDana Myers  * PARAMETERS:  StackPtr        - Pointer to an internal object
140db2bae30SDana Myers  *              WalkState       - Current method state
141db2bae30SDana Myers  *
142db2bae30SDana Myers  * RETURN:      Status
143db2bae30SDana Myers  *
144db2bae30SDana Myers  * DESCRIPTION: Retrieve the value from an internal object. The Reference type
145db2bae30SDana Myers  *              uses the associated AML opcode to determine the value.
146db2bae30SDana Myers  *
147db2bae30SDana Myers  ******************************************************************************/
148db2bae30SDana Myers 
149db2bae30SDana Myers static ACPI_STATUS
AcpiExResolveObjectToValue(ACPI_OPERAND_OBJECT ** StackPtr,ACPI_WALK_STATE * WalkState)150db2bae30SDana Myers AcpiExResolveObjectToValue (
151db2bae30SDana Myers     ACPI_OPERAND_OBJECT     **StackPtr,
152db2bae30SDana Myers     ACPI_WALK_STATE         *WalkState)
153db2bae30SDana Myers {
154db2bae30SDana Myers     ACPI_STATUS             Status = AE_OK;
155db2bae30SDana Myers     ACPI_OPERAND_OBJECT     *StackDesc;
156db2bae30SDana Myers     ACPI_OPERAND_OBJECT     *ObjDesc = NULL;
157db2bae30SDana Myers     UINT8                   RefType;
158db2bae30SDana Myers 
159db2bae30SDana Myers 
160db2bae30SDana Myers     ACPI_FUNCTION_TRACE (ExResolveObjectToValue);
161db2bae30SDana Myers 
162db2bae30SDana Myers 
163db2bae30SDana Myers     StackDesc = *StackPtr;
164db2bae30SDana Myers 
165*385cc6b4SJerry Jelinek     /* This is an object of type ACPI_OPERAND_OBJECT */
166db2bae30SDana Myers 
167aa2aa9a6SDana Myers     switch (StackDesc->Common.Type)
168db2bae30SDana Myers     {
169db2bae30SDana Myers     case ACPI_TYPE_LOCAL_REFERENCE:
170db2bae30SDana Myers 
171db2bae30SDana Myers         RefType = StackDesc->Reference.Class;
172db2bae30SDana Myers 
173db2bae30SDana Myers         switch (RefType)
174db2bae30SDana Myers         {
175db2bae30SDana Myers         case ACPI_REFCLASS_LOCAL:
176db2bae30SDana Myers         case ACPI_REFCLASS_ARG:
177db2bae30SDana Myers             /*
178db2bae30SDana Myers              * Get the local from the method's state info
179db2bae30SDana Myers              * Note: this increments the local's object reference count
180db2bae30SDana Myers              */
181db2bae30SDana Myers             Status = AcpiDsMethodDataGetValue (RefType,
182db2bae30SDana Myers                 StackDesc->Reference.Value, WalkState, &ObjDesc);
183db2bae30SDana Myers             if (ACPI_FAILURE (Status))
184db2bae30SDana Myers             {
185db2bae30SDana Myers                 return_ACPI_STATUS (Status);
186db2bae30SDana Myers             }
187db2bae30SDana Myers 
188db2bae30SDana Myers             ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "[Arg/Local %X] ValueObj is %p\n",
189db2bae30SDana Myers                 StackDesc->Reference.Value, ObjDesc));
190db2bae30SDana Myers 
191db2bae30SDana Myers             /*
192db2bae30SDana Myers              * Now we can delete the original Reference Object and
193db2bae30SDana Myers              * replace it with the resolved value
194db2bae30SDana Myers              */
195db2bae30SDana Myers             AcpiUtRemoveReference (StackDesc);
196db2bae30SDana Myers             *StackPtr = ObjDesc;
197db2bae30SDana Myers             break;
198db2bae30SDana Myers 
199db2bae30SDana Myers         case ACPI_REFCLASS_INDEX:
200db2bae30SDana Myers 
201db2bae30SDana Myers             switch (StackDesc->Reference.TargetType)
202db2bae30SDana Myers             {
203db2bae30SDana Myers             case ACPI_TYPE_BUFFER_FIELD:
204db2bae30SDana Myers 
205db2bae30SDana Myers                 /* Just return - do not dereference */
206db2bae30SDana Myers                 break;
207db2bae30SDana Myers 
208db2bae30SDana Myers             case ACPI_TYPE_PACKAGE:
209db2bae30SDana Myers 
210db2bae30SDana Myers                 /* If method call or CopyObject - do not dereference */
211db2bae30SDana Myers 
212db2bae30SDana Myers                 if ((WalkState->Opcode == AML_INT_METHODCALL_OP) ||
213db2bae30SDana Myers                     (WalkState->Opcode == AML_COPY_OP))
214db2bae30SDana Myers                 {
215db2bae30SDana Myers                     break;
216db2bae30SDana Myers                 }
217db2bae30SDana Myers 
218db2bae30SDana Myers                 /* Otherwise, dereference the PackageIndex to a package element */
219db2bae30SDana Myers 
220db2bae30SDana Myers                 ObjDesc = *StackDesc->Reference.Where;
221db2bae30SDana Myers                 if (ObjDesc)
222db2bae30SDana Myers                 {
223db2bae30SDana Myers                     /*
224db2bae30SDana Myers                      * Valid object descriptor, copy pointer to return value
225db2bae30SDana Myers                      * (i.e., dereference the package index)
226db2bae30SDana Myers                      * Delete the ref object, increment the returned object
227db2bae30SDana Myers                      */
228db2bae30SDana Myers                     AcpiUtAddReference (ObjDesc);
229db2bae30SDana Myers                     *StackPtr = ObjDesc;
230db2bae30SDana Myers                 }
231db2bae30SDana Myers                 else
232db2bae30SDana Myers                 {
233db2bae30SDana Myers                     /*
234db2bae30SDana Myers                      * A NULL object descriptor means an uninitialized element of
235db2bae30SDana Myers                      * the package, can't dereference it
236db2bae30SDana Myers                      */
237db2bae30SDana Myers                     ACPI_ERROR ((AE_INFO,
238*385cc6b4SJerry Jelinek                         "Attempt to dereference an Index to "
239*385cc6b4SJerry Jelinek                         "NULL package element Idx=%p",
240db2bae30SDana Myers                         StackDesc));
241db2bae30SDana Myers                     Status = AE_AML_UNINITIALIZED_ELEMENT;
242db2bae30SDana Myers                 }
243db2bae30SDana Myers                 break;
244db2bae30SDana Myers 
245db2bae30SDana Myers             default:
246db2bae30SDana Myers 
247db2bae30SDana Myers                 /* Invalid reference object */
248db2bae30SDana Myers 
249db2bae30SDana Myers                 ACPI_ERROR ((AE_INFO,
25026f3cdf0SGordon Ross                     "Unknown TargetType 0x%X in Index/Reference object %p",
251db2bae30SDana Myers                     StackDesc->Reference.TargetType, StackDesc));
252db2bae30SDana Myers                 Status = AE_AML_INTERNAL;
253db2bae30SDana Myers                 break;
254db2bae30SDana Myers             }
255db2bae30SDana Myers             break;
256db2bae30SDana Myers 
257db2bae30SDana Myers         case ACPI_REFCLASS_REFOF:
258db2bae30SDana Myers         case ACPI_REFCLASS_DEBUG:
259db2bae30SDana Myers         case ACPI_REFCLASS_TABLE:
260db2bae30SDana Myers 
261db2bae30SDana Myers             /* Just leave the object as-is, do not dereference */
262db2bae30SDana Myers 
263db2bae30SDana Myers             break;
264db2bae30SDana Myers 
265db2bae30SDana Myers         case ACPI_REFCLASS_NAME:   /* Reference to a named object */
266db2bae30SDana Myers 
267db2bae30SDana Myers             /* Dereference the name */
268db2bae30SDana Myers 
269db2bae30SDana Myers             if ((StackDesc->Reference.Node->Type == ACPI_TYPE_DEVICE) ||
270db2bae30SDana Myers                 (StackDesc->Reference.Node->Type == ACPI_TYPE_THERMAL))
271db2bae30SDana Myers             {
272db2bae30SDana Myers                 /* These node types do not have 'real' subobjects */
273db2bae30SDana Myers 
274db2bae30SDana Myers                 *StackPtr = (void *) StackDesc->Reference.Node;
275db2bae30SDana Myers             }
276db2bae30SDana Myers             else
277db2bae30SDana Myers             {
278db2bae30SDana Myers                 /* Get the object pointed to by the namespace node */
279db2bae30SDana Myers 
280db2bae30SDana Myers                 *StackPtr = (StackDesc->Reference.Node)->Object;
281db2bae30SDana Myers                 AcpiUtAddReference (*StackPtr);
282db2bae30SDana Myers             }
283db2bae30SDana Myers 
284db2bae30SDana Myers             AcpiUtRemoveReference (StackDesc);
285db2bae30SDana Myers             break;
286db2bae30SDana Myers 
287db2bae30SDana Myers         default:
288db2bae30SDana Myers 
289db2bae30SDana Myers             ACPI_ERROR ((AE_INFO,
290*385cc6b4SJerry Jelinek                 "Unknown Reference type 0x%X in %p",
291*385cc6b4SJerry Jelinek                 RefType, StackDesc));
292db2bae30SDana Myers             Status = AE_AML_INTERNAL;
293db2bae30SDana Myers             break;
294db2bae30SDana Myers         }
295db2bae30SDana Myers         break;
296db2bae30SDana Myers 
297db2bae30SDana Myers     case ACPI_TYPE_BUFFER:
298db2bae30SDana Myers 
299db2bae30SDana Myers         Status = AcpiDsGetBufferArguments (StackDesc);
300db2bae30SDana Myers         break;
301db2bae30SDana Myers 
302db2bae30SDana Myers     case ACPI_TYPE_PACKAGE:
303db2bae30SDana Myers 
304db2bae30SDana Myers         Status = AcpiDsGetPackageArguments (StackDesc);
305db2bae30SDana Myers         break;
306db2bae30SDana Myers 
307db2bae30SDana Myers     case ACPI_TYPE_BUFFER_FIELD:
308db2bae30SDana Myers     case ACPI_TYPE_LOCAL_REGION_FIELD:
309db2bae30SDana Myers     case ACPI_TYPE_LOCAL_BANK_FIELD:
310db2bae30SDana Myers     case ACPI_TYPE_LOCAL_INDEX_FIELD:
311db2bae30SDana Myers 
312*385cc6b4SJerry Jelinek         ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
313*385cc6b4SJerry Jelinek             "FieldRead SourceDesc=%p Type=%X\n",
314aa2aa9a6SDana Myers             StackDesc, StackDesc->Common.Type));
315db2bae30SDana Myers 
316db2bae30SDana Myers         Status = AcpiExReadDataFromField (WalkState, StackDesc, &ObjDesc);
317db2bae30SDana Myers 
318db2bae30SDana Myers         /* Remove a reference to the original operand, then override */
319db2bae30SDana Myers 
320db2bae30SDana Myers         AcpiUtRemoveReference (*StackPtr);
321db2bae30SDana Myers         *StackPtr = (void *) ObjDesc;
322db2bae30SDana Myers         break;
323db2bae30SDana Myers 
324db2bae30SDana Myers     default:
325*385cc6b4SJerry Jelinek 
326db2bae30SDana Myers         break;
327db2bae30SDana Myers     }
328db2bae30SDana Myers 
329db2bae30SDana Myers     return_ACPI_STATUS (Status);
330db2bae30SDana Myers }
331db2bae30SDana Myers 
332db2bae30SDana Myers 
333db2bae30SDana Myers /*******************************************************************************
334db2bae30SDana Myers  *
335db2bae30SDana Myers  * FUNCTION:    AcpiExResolveMultiple
336db2bae30SDana Myers  *
337db2bae30SDana Myers  * PARAMETERS:  WalkState           - Current state (contains AML opcode)
338db2bae30SDana Myers  *              Operand             - Starting point for resolution
339db2bae30SDana Myers  *              ReturnType          - Where the object type is returned
340db2bae30SDana Myers  *              ReturnDesc          - Where the resolved object is returned
341db2bae30SDana Myers  *
342db2bae30SDana Myers  * RETURN:      Status
343db2bae30SDana Myers  *
344db2bae30SDana Myers  * DESCRIPTION: Return the base object and type. Traverse a reference list if
345db2bae30SDana Myers  *              necessary to get to the base object.
346db2bae30SDana Myers  *
347db2bae30SDana Myers  ******************************************************************************/
348db2bae30SDana Myers 
349db2bae30SDana Myers ACPI_STATUS
AcpiExResolveMultiple(ACPI_WALK_STATE * WalkState,ACPI_OPERAND_OBJECT * Operand,ACPI_OBJECT_TYPE * ReturnType,ACPI_OPERAND_OBJECT ** ReturnDesc)350db2bae30SDana Myers AcpiExResolveMultiple (
351db2bae30SDana Myers     ACPI_WALK_STATE         *WalkState,
352db2bae30SDana Myers     ACPI_OPERAND_OBJECT     *Operand,
353db2bae30SDana Myers     ACPI_OBJECT_TYPE        *ReturnType,
354db2bae30SDana Myers     ACPI_OPERAND_OBJECT     **ReturnDesc)
355db2bae30SDana Myers {
356*385cc6b4SJerry Jelinek     ACPI_OPERAND_OBJECT     *ObjDesc = ACPI_CAST_PTR (void, Operand);
357*385cc6b4SJerry Jelinek     ACPI_NAMESPACE_NODE     *Node = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, Operand);
358db2bae30SDana Myers     ACPI_OBJECT_TYPE        Type;
359db2bae30SDana Myers     ACPI_STATUS             Status;
360db2bae30SDana Myers 
361db2bae30SDana Myers 
362db2bae30SDana Myers     ACPI_FUNCTION_TRACE (AcpiExResolveMultiple);
363db2bae30SDana Myers 
364db2bae30SDana Myers 
365db2bae30SDana Myers     /* Operand can be either a namespace node or an operand descriptor */
366db2bae30SDana Myers 
367db2bae30SDana Myers     switch (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc))
368db2bae30SDana Myers     {
369db2bae30SDana Myers     case ACPI_DESC_TYPE_OPERAND:
370*385cc6b4SJerry Jelinek 
371db2bae30SDana Myers         Type = ObjDesc->Common.Type;
372db2bae30SDana Myers         break;
373db2bae30SDana Myers 
374db2bae30SDana Myers     case ACPI_DESC_TYPE_NAMED:
375*385cc6b4SJerry Jelinek 
376db2bae30SDana Myers         Type = ((ACPI_NAMESPACE_NODE *) ObjDesc)->Type;
377*385cc6b4SJerry Jelinek         ObjDesc = AcpiNsGetAttachedObject (Node);
378db2bae30SDana Myers 
379db2bae30SDana Myers         /* If we had an Alias node, use the attached object for type info */
380db2bae30SDana Myers 
381db2bae30SDana Myers         if (Type == ACPI_TYPE_LOCAL_ALIAS)
382db2bae30SDana Myers         {
383db2bae30SDana Myers             Type = ((ACPI_NAMESPACE_NODE *) ObjDesc)->Type;
384*385cc6b4SJerry Jelinek             ObjDesc = AcpiNsGetAttachedObject (
385*385cc6b4SJerry Jelinek                 (ACPI_NAMESPACE_NODE *) ObjDesc);
386*385cc6b4SJerry Jelinek         }
387*385cc6b4SJerry Jelinek 
388*385cc6b4SJerry Jelinek         if (!ObjDesc)
389*385cc6b4SJerry Jelinek         {
390*385cc6b4SJerry Jelinek             ACPI_ERROR ((AE_INFO,
391*385cc6b4SJerry Jelinek                 "[%4.4s] Node is unresolved or uninitialized",
392*385cc6b4SJerry Jelinek                 AcpiUtGetNodeName (Node)));
393*385cc6b4SJerry Jelinek             return_ACPI_STATUS (AE_AML_UNINITIALIZED_NODE);
394db2bae30SDana Myers         }
395db2bae30SDana Myers         break;
396db2bae30SDana Myers 
397db2bae30SDana Myers     default:
398db2bae30SDana Myers         return_ACPI_STATUS (AE_AML_OPERAND_TYPE);
399db2bae30SDana Myers     }
400db2bae30SDana Myers 
401db2bae30SDana Myers     /* If type is anything other than a reference, we are done */
402db2bae30SDana Myers 
403db2bae30SDana Myers     if (Type != ACPI_TYPE_LOCAL_REFERENCE)
404db2bae30SDana Myers     {
405db2bae30SDana Myers         goto Exit;
406db2bae30SDana Myers     }
407db2bae30SDana Myers 
408db2bae30SDana Myers     /*
409db2bae30SDana Myers      * For reference objects created via the RefOf, Index, or Load/LoadTable
410db2bae30SDana Myers      * operators, we need to get to the base object (as per the ACPI
411db2bae30SDana Myers      * specification of the ObjectType and SizeOf operators). This means
412db2bae30SDana Myers      * traversing the list of possibly many nested references.
413db2bae30SDana Myers      */
414aa2aa9a6SDana Myers     while (ObjDesc->Common.Type == ACPI_TYPE_LOCAL_REFERENCE)
415db2bae30SDana Myers     {
416db2bae30SDana Myers         switch (ObjDesc->Reference.Class)
417db2bae30SDana Myers         {
418db2bae30SDana Myers         case ACPI_REFCLASS_REFOF:
419db2bae30SDana Myers         case ACPI_REFCLASS_NAME:
420db2bae30SDana Myers 
421db2bae30SDana Myers             /* Dereference the reference pointer */
422db2bae30SDana Myers 
423db2bae30SDana Myers             if (ObjDesc->Reference.Class == ACPI_REFCLASS_REFOF)
424db2bae30SDana Myers             {
425db2bae30SDana Myers                 Node = ObjDesc->Reference.Object;
426db2bae30SDana Myers             }
427db2bae30SDana Myers             else /* AML_INT_NAMEPATH_OP */
428db2bae30SDana Myers             {
429db2bae30SDana Myers                 Node = ObjDesc->Reference.Node;
430db2bae30SDana Myers             }
431db2bae30SDana Myers 
432db2bae30SDana Myers             /* All "References" point to a NS node */
433db2bae30SDana Myers 
434db2bae30SDana Myers             if (ACPI_GET_DESCRIPTOR_TYPE (Node) != ACPI_DESC_TYPE_NAMED)
435db2bae30SDana Myers             {
436db2bae30SDana Myers                 ACPI_ERROR ((AE_INFO,
43726f3cdf0SGordon Ross                     "Not a namespace node %p [%s]",
438db2bae30SDana Myers                     Node, AcpiUtGetDescriptorName (Node)));
439db2bae30SDana Myers                 return_ACPI_STATUS (AE_AML_INTERNAL);
440db2bae30SDana Myers             }
441db2bae30SDana Myers 
442db2bae30SDana Myers             /* Get the attached object */
443db2bae30SDana Myers 
444db2bae30SDana Myers             ObjDesc = AcpiNsGetAttachedObject (Node);
445db2bae30SDana Myers             if (!ObjDesc)
446db2bae30SDana Myers             {
447db2bae30SDana Myers                 /* No object, use the NS node type */
448db2bae30SDana Myers 
449db2bae30SDana Myers                 Type = AcpiNsGetType (Node);
450db2bae30SDana Myers                 goto Exit;
451db2bae30SDana Myers             }
452db2bae30SDana Myers 
453db2bae30SDana Myers             /* Check for circular references */
454db2bae30SDana Myers 
455db2bae30SDana Myers             if (ObjDesc == Operand)
456db2bae30SDana Myers             {
457db2bae30SDana Myers                 return_ACPI_STATUS (AE_AML_CIRCULAR_REFERENCE);
458db2bae30SDana Myers             }
459db2bae30SDana Myers             break;
460db2bae30SDana Myers 
461db2bae30SDana Myers         case ACPI_REFCLASS_INDEX:
462db2bae30SDana Myers 
463db2bae30SDana Myers             /* Get the type of this reference (index into another object) */
464db2bae30SDana Myers 
465db2bae30SDana Myers             Type = ObjDesc->Reference.TargetType;
466db2bae30SDana Myers             if (Type != ACPI_TYPE_PACKAGE)
467db2bae30SDana Myers             {
468db2bae30SDana Myers                 goto Exit;
469db2bae30SDana Myers             }
470db2bae30SDana Myers 
471db2bae30SDana Myers             /*
472db2bae30SDana Myers              * The main object is a package, we want to get the type
473db2bae30SDana Myers              * of the individual package element that is referenced by
474db2bae30SDana Myers              * the index.
475db2bae30SDana Myers              *
476db2bae30SDana Myers              * This could of course in turn be another reference object.
477db2bae30SDana Myers              */
478db2bae30SDana Myers             ObjDesc = *(ObjDesc->Reference.Where);
479db2bae30SDana Myers             if (!ObjDesc)
480db2bae30SDana Myers             {
481db2bae30SDana Myers                 /* NULL package elements are allowed */
482db2bae30SDana Myers 
483db2bae30SDana Myers                 Type = 0; /* Uninitialized */
484db2bae30SDana Myers                 goto Exit;
485db2bae30SDana Myers             }
486db2bae30SDana Myers             break;
487db2bae30SDana Myers 
488db2bae30SDana Myers         case ACPI_REFCLASS_TABLE:
489db2bae30SDana Myers 
490db2bae30SDana Myers             Type = ACPI_TYPE_DDB_HANDLE;
491db2bae30SDana Myers             goto Exit;
492db2bae30SDana Myers 
493db2bae30SDana Myers         case ACPI_REFCLASS_LOCAL:
494db2bae30SDana Myers         case ACPI_REFCLASS_ARG:
495db2bae30SDana Myers 
496db2bae30SDana Myers             if (ReturnDesc)
497db2bae30SDana Myers             {
498db2bae30SDana Myers                 Status = AcpiDsMethodDataGetValue (ObjDesc->Reference.Class,
499db2bae30SDana Myers                     ObjDesc->Reference.Value, WalkState, &ObjDesc);
500db2bae30SDana Myers                 if (ACPI_FAILURE (Status))
501db2bae30SDana Myers                 {
502db2bae30SDana Myers                     return_ACPI_STATUS (Status);
503db2bae30SDana Myers                 }
504db2bae30SDana Myers                 AcpiUtRemoveReference (ObjDesc);
505db2bae30SDana Myers             }
506db2bae30SDana Myers             else
507db2bae30SDana Myers             {
508db2bae30SDana Myers                 Status = AcpiDsMethodDataGetNode (ObjDesc->Reference.Class,
509db2bae30SDana Myers                     ObjDesc->Reference.Value, WalkState, &Node);
510db2bae30SDana Myers                 if (ACPI_FAILURE (Status))
511db2bae30SDana Myers                 {
512db2bae30SDana Myers                     return_ACPI_STATUS (Status);
513db2bae30SDana Myers                 }
514db2bae30SDana Myers 
515db2bae30SDana Myers                 ObjDesc = AcpiNsGetAttachedObject (Node);
516db2bae30SDana Myers                 if (!ObjDesc)
517db2bae30SDana Myers                 {
518db2bae30SDana Myers                     Type = ACPI_TYPE_ANY;
519db2bae30SDana Myers                     goto Exit;
520db2bae30SDana Myers                 }
521db2bae30SDana Myers             }
522db2bae30SDana Myers             break;
523db2bae30SDana Myers 
524db2bae30SDana Myers         case ACPI_REFCLASS_DEBUG:
525db2bae30SDana Myers 
526db2bae30SDana Myers             /* The Debug Object is of type "DebugObject" */
527db2bae30SDana Myers 
528db2bae30SDana Myers             Type = ACPI_TYPE_DEBUG_OBJECT;
529db2bae30SDana Myers             goto Exit;
530db2bae30SDana Myers 
531db2bae30SDana Myers         default:
532db2bae30SDana Myers 
533db2bae30SDana Myers             ACPI_ERROR ((AE_INFO,
534*385cc6b4SJerry Jelinek                 "Unknown Reference Class 0x%2.2X",
535*385cc6b4SJerry Jelinek                 ObjDesc->Reference.Class));
536db2bae30SDana Myers             return_ACPI_STATUS (AE_AML_INTERNAL);
537db2bae30SDana Myers         }
538db2bae30SDana Myers     }
539db2bae30SDana Myers 
540db2bae30SDana Myers     /*
541db2bae30SDana Myers      * Now we are guaranteed to have an object that has not been created
542db2bae30SDana Myers      * via the RefOf or Index operators.
543db2bae30SDana Myers      */
544aa2aa9a6SDana Myers     Type = ObjDesc->Common.Type;
545db2bae30SDana Myers 
546db2bae30SDana Myers 
547db2bae30SDana Myers Exit:
548db2bae30SDana Myers     /* Convert internal types to external types */
549db2bae30SDana Myers 
550db2bae30SDana Myers     switch (Type)
551db2bae30SDana Myers     {
552db2bae30SDana Myers     case ACPI_TYPE_LOCAL_REGION_FIELD:
553db2bae30SDana Myers     case ACPI_TYPE_LOCAL_BANK_FIELD:
554db2bae30SDana Myers     case ACPI_TYPE_LOCAL_INDEX_FIELD:
555db2bae30SDana Myers 
556db2bae30SDana Myers         Type = ACPI_TYPE_FIELD_UNIT;
557db2bae30SDana Myers         break;
558db2bae30SDana Myers 
559db2bae30SDana Myers     case ACPI_TYPE_LOCAL_SCOPE:
560db2bae30SDana Myers 
561db2bae30SDana Myers         /* Per ACPI Specification, Scope is untyped */
562db2bae30SDana Myers 
563db2bae30SDana Myers         Type = ACPI_TYPE_ANY;
564db2bae30SDana Myers         break;
565db2bae30SDana Myers 
566db2bae30SDana Myers     default:
567*385cc6b4SJerry Jelinek 
568db2bae30SDana Myers         /* No change to Type required */
569*385cc6b4SJerry Jelinek 
570db2bae30SDana Myers         break;
571db2bae30SDana Myers     }
572db2bae30SDana Myers 
573db2bae30SDana Myers     *ReturnType = Type;
574db2bae30SDana Myers     if (ReturnDesc)
575db2bae30SDana Myers     {
576db2bae30SDana Myers         *ReturnDesc = ObjDesc;
577db2bae30SDana Myers     }
578db2bae30SDana Myers     return_ACPI_STATUS (AE_OK);
579db2bae30SDana Myers }
580