167754Smsmith/******************************************************************************
267754Smsmith *
377424Smsmith * Module Name: exresolv - AML Interpreter object resolution
467754Smsmith *
567754Smsmith *****************************************************************************/
667754Smsmith
7217365Sjkim/*
8245582Sjkim * Copyright (C) 2000 - 2013, Intel Corp.
970243Smsmith * All rights reserved.
1067754Smsmith *
11217365Sjkim * Redistribution and use in source and binary forms, with or without
12217365Sjkim * modification, are permitted provided that the following conditions
13217365Sjkim * are met:
14217365Sjkim * 1. Redistributions of source code must retain the above copyright
15217365Sjkim *    notice, this list of conditions, and the following disclaimer,
16217365Sjkim *    without modification.
17217365Sjkim * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18217365Sjkim *    substantially similar to the "NO WARRANTY" disclaimer below
19217365Sjkim *    ("Disclaimer") and any redistribution must be conditioned upon
20217365Sjkim *    including a substantially similar Disclaimer requirement for further
21217365Sjkim *    binary redistribution.
22217365Sjkim * 3. Neither the names of the above-listed copyright holders nor the names
23217365Sjkim *    of any contributors may be used to endorse or promote products derived
24217365Sjkim *    from this software without specific prior written permission.
2567754Smsmith *
26217365Sjkim * Alternatively, this software may be distributed under the terms of the
27217365Sjkim * GNU General Public License ("GPL") version 2 as published by the Free
28217365Sjkim * Software Foundation.
2967754Smsmith *
30217365Sjkim * NO WARRANTY
31217365Sjkim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32217365Sjkim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33217365Sjkim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34217365Sjkim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35217365Sjkim * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36217365Sjkim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37217365Sjkim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38217365Sjkim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39217365Sjkim * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40217365Sjkim * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41217365Sjkim * POSSIBILITY OF SUCH DAMAGES.
42217365Sjkim */
4367754Smsmith
4477424Smsmith#define __EXRESOLV_C__
4567754Smsmith
46193341Sjkim#include <contrib/dev/acpica/include/acpi.h>
47193341Sjkim#include <contrib/dev/acpica/include/accommon.h>
48193341Sjkim#include <contrib/dev/acpica/include/amlcode.h>
49193341Sjkim#include <contrib/dev/acpica/include/acdispat.h>
50193341Sjkim#include <contrib/dev/acpica/include/acinterp.h>
51193341Sjkim#include <contrib/dev/acpica/include/acnamesp.h>
5267754Smsmith
5367754Smsmith
5477424Smsmith#define _COMPONENT          ACPI_EXECUTER
5591116Smsmith        ACPI_MODULE_NAME    ("exresolv")
5667754Smsmith
57151937Sjkim/* Local prototypes */
5867754Smsmith
59151937Sjkimstatic ACPI_STATUS
60151937SjkimAcpiExResolveObjectToValue (
61151937Sjkim    ACPI_OPERAND_OBJECT     **StackPtr,
62151937Sjkim    ACPI_WALK_STATE         *WalkState);
63151937Sjkim
64151937Sjkim
6567754Smsmith/*******************************************************************************
6667754Smsmith *
6777424Smsmith * FUNCTION:    AcpiExResolveToValue
6867754Smsmith *
6967754Smsmith * PARAMETERS:  **StackPtr          - Points to entry on ObjStack, which can
7077424Smsmith *                                    be either an (ACPI_OPERAND_OBJECT *)
7167754Smsmith *                                    or an ACPI_HANDLE.
7277424Smsmith *              WalkState           - Current method state
7367754Smsmith *
7467754Smsmith * RETURN:      Status
7567754Smsmith *
7671867Smsmith * DESCRIPTION: Convert Reference objects to values
7767754Smsmith *
7867754Smsmith ******************************************************************************/
7967754Smsmith
8067754SmsmithACPI_STATUS
8177424SmsmithAcpiExResolveToValue (
8267754Smsmith    ACPI_OPERAND_OBJECT     **StackPtr,
8367754Smsmith    ACPI_WALK_STATE         *WalkState)
8467754Smsmith{
8577424Smsmith    ACPI_STATUS             Status;
8667754Smsmith
8767754Smsmith
88167802Sjkim    ACPI_FUNCTION_TRACE_PTR (ExResolveToValue, StackPtr);
8967754Smsmith
9067754Smsmith
9167754Smsmith    if (!StackPtr || !*StackPtr)
9267754Smsmith    {
93167802Sjkim        ACPI_ERROR ((AE_INFO, "Internal - null pointer"));
9467754Smsmith        return_ACPI_STATUS (AE_AML_NO_OPERAND);
9567754Smsmith    }
9667754Smsmith
9767754Smsmith    /*
9867754Smsmith     * The entity pointed to by the StackPtr can be either
9967754Smsmith     * 1) A valid ACPI_OPERAND_OBJECT, or
10067754Smsmith     * 2) A ACPI_NAMESPACE_NODE (NamedObj)
10167754Smsmith     */
10299679Siwasaki    if (ACPI_GET_DESCRIPTOR_TYPE (*StackPtr) == ACPI_DESC_TYPE_OPERAND)
10367754Smsmith    {
10477424Smsmith        Status = AcpiExResolveObjectToValue (StackPtr, WalkState);
10567754Smsmith        if (ACPI_FAILURE (Status))
10667754Smsmith        {
10767754Smsmith            return_ACPI_STATUS (Status);
10867754Smsmith        }
109151937Sjkim
110151937Sjkim        if (!*StackPtr)
111151937Sjkim        {
112167802Sjkim            ACPI_ERROR ((AE_INFO, "Internal - null pointer"));
113151937Sjkim            return_ACPI_STATUS (AE_AML_NO_OPERAND);
114151937Sjkim        }
11567754Smsmith    }
11667754Smsmith
11767754Smsmith    /*
11877424Smsmith     * Object on the stack may have changed if AcpiExResolveObjectToValue()
11967754Smsmith     * was called (i.e., we can't use an _else_ here.)
12067754Smsmith     */
12191116Smsmith    if (ACPI_GET_DESCRIPTOR_TYPE (*StackPtr) == ACPI_DESC_TYPE_NAMED)
12267754Smsmith    {
12399679Siwasaki        Status = AcpiExResolveNodeToValue (
12499679Siwasaki                        ACPI_CAST_INDIRECT_PTR (ACPI_NAMESPACE_NODE, StackPtr),
12577424Smsmith                        WalkState);
12677424Smsmith        if (ACPI_FAILURE (Status))
12777424Smsmith        {
12877424Smsmith            return_ACPI_STATUS (Status);
12977424Smsmith        }
13067754Smsmith    }
13167754Smsmith
13299146Siwasaki    ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Resolved object %p\n", *StackPtr));
13377424Smsmith    return_ACPI_STATUS (AE_OK);
13467754Smsmith}
13567754Smsmith
13667754Smsmith
13767754Smsmith/*******************************************************************************
13867754Smsmith *
13977424Smsmith * FUNCTION:    AcpiExResolveObjectToValue
14067754Smsmith *
141151937Sjkim * PARAMETERS:  StackPtr        - Pointer to an internal object
14277424Smsmith *              WalkState       - Current method state
14367754Smsmith *
14467754Smsmith * RETURN:      Status
14567754Smsmith *
146151937Sjkim * DESCRIPTION: Retrieve the value from an internal object. The Reference type
14767754Smsmith *              uses the associated AML opcode to determine the value.
14867754Smsmith *
14967754Smsmith ******************************************************************************/
15067754Smsmith
151151937Sjkimstatic ACPI_STATUS
15277424SmsmithAcpiExResolveObjectToValue (
15367754Smsmith    ACPI_OPERAND_OBJECT     **StackPtr,
15467754Smsmith    ACPI_WALK_STATE         *WalkState)
15567754Smsmith{
15677424Smsmith    ACPI_STATUS             Status = AE_OK;
15767754Smsmith    ACPI_OPERAND_OBJECT     *StackDesc;
158167802Sjkim    ACPI_OPERAND_OBJECT     *ObjDesc = NULL;
159193267Sjkim    UINT8                   RefType;
16067754Smsmith
16167754Smsmith
162167802Sjkim    ACPI_FUNCTION_TRACE (ExResolveObjectToValue);
16367754Smsmith
16467754Smsmith
16567754Smsmith    StackDesc = *StackPtr;
16667754Smsmith
167238381Sjkim    /* This is an object of type ACPI_OPERAND_OBJECT */
16867754Smsmith
169193267Sjkim    switch (StackDesc->Common.Type)
17067754Smsmith    {
171107325Siwasaki    case ACPI_TYPE_LOCAL_REFERENCE:
17267754Smsmith
173193267Sjkim        RefType = StackDesc->Reference.Class;
17467754Smsmith
175193267Sjkim        switch (RefType)
17667754Smsmith        {
177193267Sjkim        case ACPI_REFCLASS_LOCAL:
178193267Sjkim        case ACPI_REFCLASS_ARG:
17967754Smsmith            /*
18067754Smsmith             * Get the local from the method's state info
18167754Smsmith             * Note: this increments the local's object reference count
18267754Smsmith             */
183193267Sjkim            Status = AcpiDsMethodDataGetValue (RefType,
184193267Sjkim                            StackDesc->Reference.Value, WalkState, &ObjDesc);
18567754Smsmith            if (ACPI_FAILURE (Status))
18667754Smsmith            {
18767754Smsmith                return_ACPI_STATUS (Status);
18867754Smsmith            }
18967754Smsmith
190129684Snjl            ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "[Arg/Local %X] ValueObj is %p\n",
191193267Sjkim                StackDesc->Reference.Value, ObjDesc));
192129684Snjl
19367754Smsmith            /*
19467754Smsmith             * Now we can delete the original Reference Object and
195129684Snjl             * replace it with the resolved value
19667754Smsmith             */
19777424Smsmith            AcpiUtRemoveReference (StackDesc);
19867754Smsmith            *StackPtr = ObjDesc;
19967754Smsmith            break;
20067754Smsmith
201193267Sjkim        case ACPI_REFCLASS_INDEX:
20267754Smsmith
20367754Smsmith            switch (StackDesc->Reference.TargetType)
20467754Smsmith            {
20567754Smsmith            case ACPI_TYPE_BUFFER_FIELD:
20667754Smsmith
207193267Sjkim                /* Just return - do not dereference */
20867754Smsmith                break;
20967754Smsmith
21067754Smsmith            case ACPI_TYPE_PACKAGE:
21199679Siwasaki
212193267Sjkim                /* If method call or CopyObject - do not dereference */
213193267Sjkim
214193267Sjkim                if ((WalkState->Opcode == AML_INT_METHODCALL_OP) ||
215193267Sjkim                    (WalkState->Opcode == AML_COPY_OP))
216193267Sjkim                {
217193267Sjkim                    break;
218193267Sjkim                }
219193267Sjkim
220193267Sjkim                /* Otherwise, dereference the PackageIndex to a package element */
221193267Sjkim
22267754Smsmith                ObjDesc = *StackDesc->Reference.Where;
22367754Smsmith                if (ObjDesc)
22467754Smsmith                {
22567754Smsmith                    /*
226193267Sjkim                     * Valid object descriptor, copy pointer to return value
22767754Smsmith                     * (i.e., dereference the package index)
22867754Smsmith                     * Delete the ref object, increment the returned object
22967754Smsmith                     */
23077424Smsmith                    AcpiUtRemoveReference (StackDesc);
23177424Smsmith                    AcpiUtAddReference (ObjDesc);
23267754Smsmith                    *StackPtr = ObjDesc;
23367754Smsmith                }
23467754Smsmith                else
23567754Smsmith                {
23667754Smsmith                    /*
237193267Sjkim                     * A NULL object descriptor means an uninitialized element of
23877424Smsmith                     * the package, can't dereference it
23967754Smsmith                     */
240167802Sjkim                    ACPI_ERROR ((AE_INFO,
241193267Sjkim                        "Attempt to dereference an Index to NULL package element Idx=%p",
24277424Smsmith                        StackDesc));
24367754Smsmith                    Status = AE_AML_UNINITIALIZED_ELEMENT;
24467754Smsmith                }
24567754Smsmith                break;
24667754Smsmith
24767754Smsmith            default:
24899679Siwasaki
24977424Smsmith                /* Invalid reference object */
25067754Smsmith
251167802Sjkim                ACPI_ERROR ((AE_INFO,
252204773Sjkim                    "Unknown TargetType 0x%X in Index/Reference object %p",
25367754Smsmith                    StackDesc->Reference.TargetType, StackDesc));
25467754Smsmith                Status = AE_AML_INTERNAL;
25567754Smsmith                break;
25667754Smsmith            }
25767754Smsmith            break;
25867754Smsmith
259193267Sjkim        case ACPI_REFCLASS_REFOF:
260193267Sjkim        case ACPI_REFCLASS_DEBUG:
261193267Sjkim        case ACPI_REFCLASS_TABLE:
26267754Smsmith
263193267Sjkim            /* Just leave the object as-is, do not dereference */
264100966Siwasaki
26567754Smsmith            break;
26667754Smsmith
267193267Sjkim        case ACPI_REFCLASS_NAME:   /* Reference to a named object */
26867754Smsmith
269167802Sjkim            /* Dereference the name */
270151937Sjkim
271167802Sjkim            if ((StackDesc->Reference.Node->Type == ACPI_TYPE_DEVICE) ||
272167802Sjkim                (StackDesc->Reference.Node->Type == ACPI_TYPE_THERMAL))
273167802Sjkim            {
274167802Sjkim                /* These node types do not have 'real' subobjects */
275167802Sjkim
276167802Sjkim                *StackPtr = (void *) StackDesc->Reference.Node;
277167802Sjkim            }
278167802Sjkim            else
279167802Sjkim            {
280167802Sjkim                /* Get the object pointed to by the namespace node */
281167802Sjkim
282167802Sjkim                *StackPtr = (StackDesc->Reference.Node)->Object;
283167802Sjkim                AcpiUtAddReference (*StackPtr);
284167802Sjkim            }
285167802Sjkim
286151937Sjkim            AcpiUtRemoveReference (StackDesc);
287151937Sjkim            break;
288151937Sjkim
28967754Smsmith        default:
29067754Smsmith
291167802Sjkim            ACPI_ERROR ((AE_INFO,
292204773Sjkim                "Unknown Reference type 0x%X in %p", RefType, StackDesc));
29367754Smsmith            Status = AE_AML_INTERNAL;
29477424Smsmith            break;
29599679Siwasaki        }
29699679Siwasaki        break;
29767754Smsmith
29899146Siwasaki    case ACPI_TYPE_BUFFER:
29999146Siwasaki
30099146Siwasaki        Status = AcpiDsGetBufferArguments (StackDesc);
30199146Siwasaki        break;
30299146Siwasaki
30399146Siwasaki    case ACPI_TYPE_PACKAGE:
30499146Siwasaki
30599146Siwasaki        Status = AcpiDsGetPackageArguments (StackDesc);
30699146Siwasaki        break;
30799146Siwasaki
30877424Smsmith    case ACPI_TYPE_BUFFER_FIELD:
309107325Siwasaki    case ACPI_TYPE_LOCAL_REGION_FIELD:
310107325Siwasaki    case ACPI_TYPE_LOCAL_BANK_FIELD:
311107325Siwasaki    case ACPI_TYPE_LOCAL_INDEX_FIELD:
31267754Smsmith
31387031Smsmith        ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "FieldRead SourceDesc=%p Type=%X\n",
314193267Sjkim            StackDesc, StackDesc->Common.Type));
31567754Smsmith
31699146Siwasaki        Status = AcpiExReadDataFromField (WalkState, StackDesc, &ObjDesc);
317167802Sjkim
318167802Sjkim        /* Remove a reference to the original operand, then override */
319167802Sjkim
320167802Sjkim        AcpiUtRemoveReference (*StackPtr);
32167754Smsmith        *StackPtr = (void *) ObjDesc;
32267754Smsmith        break;
32367754Smsmith
32467754Smsmith    default:
325250838Sjkim
32667754Smsmith        break;
32787031Smsmith    }
32867754Smsmith
32967754Smsmith    return_ACPI_STATUS (Status);
33067754Smsmith}
33167754Smsmith
33267754Smsmith
333104470Siwasaki/*******************************************************************************
334104470Siwasaki *
335104470Siwasaki * FUNCTION:    AcpiExResolveMultiple
336104470Siwasaki *
337104470Siwasaki * PARAMETERS:  WalkState           - Current state (contains AML opcode)
338104470Siwasaki *              Operand             - Starting point for resolution
339104470Siwasaki *              ReturnType          - Where the object type is returned
340104470Siwasaki *              ReturnDesc          - Where the resolved object is returned
341104470Siwasaki *
342104470Siwasaki * RETURN:      Status
343104470Siwasaki *
344241973Sjkim * DESCRIPTION: Return the base object and type. Traverse a reference list if
345104470Siwasaki *              necessary to get to the base object.
346104470Siwasaki *
347104470Siwasaki ******************************************************************************/
348104470Siwasaki
349104470SiwasakiACPI_STATUS
350104470SiwasakiAcpiExResolveMultiple (
351104470Siwasaki    ACPI_WALK_STATE         *WalkState,
352104470Siwasaki    ACPI_OPERAND_OBJECT     *Operand,
353104470Siwasaki    ACPI_OBJECT_TYPE        *ReturnType,
354104470Siwasaki    ACPI_OPERAND_OBJECT     **ReturnDesc)
355104470Siwasaki{
356104470Siwasaki    ACPI_OPERAND_OBJECT     *ObjDesc = (void *) Operand;
357104470Siwasaki    ACPI_NAMESPACE_NODE     *Node;
358104470Siwasaki    ACPI_OBJECT_TYPE        Type;
359138287Smarks    ACPI_STATUS             Status;
360104470Siwasaki
361104470Siwasaki
362167802Sjkim    ACPI_FUNCTION_TRACE (AcpiExResolveMultiple);
363104470Siwasaki
364104470Siwasaki
365151937Sjkim    /* Operand can be either a namespace node or an operand descriptor */
366138287Smarks
367138287Smarks    switch (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc))
368138287Smarks    {
369138287Smarks    case ACPI_DESC_TYPE_OPERAND:
370250838Sjkim
371138287Smarks        Type = ObjDesc->Common.Type;
372138287Smarks        break;
373138287Smarks
374138287Smarks    case ACPI_DESC_TYPE_NAMED:
375250838Sjkim
376138287Smarks        Type = ((ACPI_NAMESPACE_NODE *) ObjDesc)->Type;
377138287Smarks        ObjDesc = AcpiNsGetAttachedObject ((ACPI_NAMESPACE_NODE *) ObjDesc);
378138287Smarks
379138287Smarks        /* If we had an Alias node, use the attached object for type info */
380138287Smarks
381138287Smarks        if (Type == ACPI_TYPE_LOCAL_ALIAS)
382138287Smarks        {
383138287Smarks            Type = ((ACPI_NAMESPACE_NODE *) ObjDesc)->Type;
384138287Smarks            ObjDesc = AcpiNsGetAttachedObject ((ACPI_NAMESPACE_NODE *) ObjDesc);
385138287Smarks        }
386138287Smarks        break;
387138287Smarks
388138287Smarks    default:
389138287Smarks        return_ACPI_STATUS (AE_AML_OPERAND_TYPE);
390138287Smarks    }
391138287Smarks
392151937Sjkim    /* If type is anything other than a reference, we are done */
393138287Smarks
394138287Smarks    if (Type != ACPI_TYPE_LOCAL_REFERENCE)
395138287Smarks    {
396138287Smarks        goto Exit;
397138287Smarks    }
398138287Smarks
399138287Smarks    /*
400193267Sjkim     * For reference objects created via the RefOf, Index, or Load/LoadTable
401193267Sjkim     * operators, we need to get to the base object (as per the ACPI
402193267Sjkim     * specification of the ObjectType and SizeOf operators). This means
403193267Sjkim     * traversing the list of possibly many nested references.
404104470Siwasaki     */
405193267Sjkim    while (ObjDesc->Common.Type == ACPI_TYPE_LOCAL_REFERENCE)
406104470Siwasaki    {
407193267Sjkim        switch (ObjDesc->Reference.Class)
408104470Siwasaki        {
409193267Sjkim        case ACPI_REFCLASS_REFOF:
410193267Sjkim        case ACPI_REFCLASS_NAME:
411104470Siwasaki
412104470Siwasaki            /* Dereference the reference pointer */
413104470Siwasaki
414193267Sjkim            if (ObjDesc->Reference.Class == ACPI_REFCLASS_REFOF)
415167802Sjkim            {
416167802Sjkim                Node = ObjDesc->Reference.Object;
417167802Sjkim            }
418167802Sjkim            else /* AML_INT_NAMEPATH_OP */
419167802Sjkim            {
420167802Sjkim                Node = ObjDesc->Reference.Node;
421167802Sjkim            }
422104470Siwasaki
423104470Siwasaki            /* All "References" point to a NS node */
424104470Siwasaki
425104470Siwasaki            if (ACPI_GET_DESCRIPTOR_TYPE (Node) != ACPI_DESC_TYPE_NAMED)
426104470Siwasaki            {
427167802Sjkim                ACPI_ERROR ((AE_INFO,
428204773Sjkim                    "Not a namespace node %p [%s]",
429151937Sjkim                    Node, AcpiUtGetDescriptorName (Node)));
430104470Siwasaki                return_ACPI_STATUS (AE_AML_INTERNAL);
431104470Siwasaki            }
432104470Siwasaki
433104470Siwasaki            /* Get the attached object */
434104470Siwasaki
435104470Siwasaki            ObjDesc = AcpiNsGetAttachedObject (Node);
436104470Siwasaki            if (!ObjDesc)
437104470Siwasaki            {
438104470Siwasaki                /* No object, use the NS node type */
439104470Siwasaki
440104470Siwasaki                Type = AcpiNsGetType (Node);
441104470Siwasaki                goto Exit;
442104470Siwasaki            }
443104470Siwasaki
444104470Siwasaki            /* Check for circular references */
445104470Siwasaki
446104470Siwasaki            if (ObjDesc == Operand)
447104470Siwasaki            {
448104470Siwasaki                return_ACPI_STATUS (AE_AML_CIRCULAR_REFERENCE);
449104470Siwasaki            }
450104470Siwasaki            break;
451104470Siwasaki
452193267Sjkim        case ACPI_REFCLASS_INDEX:
453104470Siwasaki
454104470Siwasaki            /* Get the type of this reference (index into another object) */
455104470Siwasaki
456104470Siwasaki            Type = ObjDesc->Reference.TargetType;
457104470Siwasaki            if (Type != ACPI_TYPE_PACKAGE)
458104470Siwasaki            {
459104470Siwasaki                goto Exit;
460104470Siwasaki            }
461104470Siwasaki
462104470Siwasaki            /*
463104470Siwasaki             * The main object is a package, we want to get the type
464104470Siwasaki             * of the individual package element that is referenced by
465104470Siwasaki             * the index.
466104470Siwasaki             *
467104470Siwasaki             * This could of course in turn be another reference object.
468104470Siwasaki             */
469104470Siwasaki            ObjDesc = *(ObjDesc->Reference.Where);
470151937Sjkim            if (!ObjDesc)
471151937Sjkim            {
472151937Sjkim                /* NULL package elements are allowed */
473151937Sjkim
474151937Sjkim                Type = 0; /* Uninitialized */
475151937Sjkim                goto Exit;
476151937Sjkim            }
477104470Siwasaki            break;
478104470Siwasaki
479193267Sjkim        case ACPI_REFCLASS_TABLE:
480138287Smarks
481193267Sjkim            Type = ACPI_TYPE_DDB_HANDLE;
482193267Sjkim            goto Exit;
483193267Sjkim
484193267Sjkim        case ACPI_REFCLASS_LOCAL:
485193267Sjkim        case ACPI_REFCLASS_ARG:
486193267Sjkim
487138287Smarks            if (ReturnDesc)
488138287Smarks            {
489193267Sjkim                Status = AcpiDsMethodDataGetValue (ObjDesc->Reference.Class,
490193267Sjkim                            ObjDesc->Reference.Value, WalkState, &ObjDesc);
491138287Smarks                if (ACPI_FAILURE (Status))
492138287Smarks                {
493138287Smarks                    return_ACPI_STATUS (Status);
494138287Smarks                }
495138287Smarks                AcpiUtRemoveReference (ObjDesc);
496138287Smarks            }
497138287Smarks            else
498138287Smarks            {
499193267Sjkim                Status = AcpiDsMethodDataGetNode (ObjDesc->Reference.Class,
500193267Sjkim                            ObjDesc->Reference.Value, WalkState, &Node);
501138287Smarks                if (ACPI_FAILURE (Status))
502138287Smarks                {
503138287Smarks                    return_ACPI_STATUS (Status);
504138287Smarks                }
505138287Smarks
506138287Smarks                ObjDesc = AcpiNsGetAttachedObject (Node);
507138287Smarks                if (!ObjDesc)
508138287Smarks                {
509138287Smarks                    Type = ACPI_TYPE_ANY;
510138287Smarks                    goto Exit;
511138287Smarks                }
512138287Smarks            }
513138287Smarks            break;
514138287Smarks
515193267Sjkim        case ACPI_REFCLASS_DEBUG:
516104470Siwasaki
517104470Siwasaki            /* The Debug Object is of type "DebugObject" */
518104470Siwasaki
519104470Siwasaki            Type = ACPI_TYPE_DEBUG_OBJECT;
520104470Siwasaki            goto Exit;
521104470Siwasaki
522104470Siwasaki        default:
523104470Siwasaki
524167802Sjkim            ACPI_ERROR ((AE_INFO,
525204773Sjkim                "Unknown Reference Class 0x%2.2X", ObjDesc->Reference.Class));
526104470Siwasaki            return_ACPI_STATUS (AE_AML_INTERNAL);
527104470Siwasaki        }
528104470Siwasaki    }
529104470Siwasaki
530104470Siwasaki    /*
531104470Siwasaki     * Now we are guaranteed to have an object that has not been created
532104470Siwasaki     * via the RefOf or Index operators.
533104470Siwasaki     */
534193267Sjkim    Type = ObjDesc->Common.Type;
535104470Siwasaki
536104470Siwasaki
537104470SiwasakiExit:
538104470Siwasaki    /* Convert internal types to external types */
539104470Siwasaki
540104470Siwasaki    switch (Type)
541104470Siwasaki    {
542107325Siwasaki    case ACPI_TYPE_LOCAL_REGION_FIELD:
543107325Siwasaki    case ACPI_TYPE_LOCAL_BANK_FIELD:
544107325Siwasaki    case ACPI_TYPE_LOCAL_INDEX_FIELD:
545104470Siwasaki
546104470Siwasaki        Type = ACPI_TYPE_FIELD_UNIT;
547104470Siwasaki        break;
548104470Siwasaki
549107325Siwasaki    case ACPI_TYPE_LOCAL_SCOPE:
550107325Siwasaki
551107325Siwasaki        /* Per ACPI Specification, Scope is untyped */
552107325Siwasaki
553107325Siwasaki        Type = ACPI_TYPE_ANY;
554107325Siwasaki        break;
555107325Siwasaki
556104470Siwasaki    default:
557250838Sjkim
558104470Siwasaki        /* No change to Type required */
559250838Sjkim
560104470Siwasaki        break;
561104470Siwasaki    }
562104470Siwasaki
563104470Siwasaki    *ReturnType = Type;
564104470Siwasaki    if (ReturnDesc)
565104470Siwasaki    {
566104470Siwasaki        *ReturnDesc = ObjDesc;
567104470Siwasaki    }
568104470Siwasaki    return_ACPI_STATUS (AE_OK);
569104470Siwasaki}
570