1246847Sjkim/******************************************************************************
2246847Sjkim *
3246847Sjkim * Module Name: nsconvert - Object conversions for objects returned by
4246847Sjkim *                          predefined methods
5246847Sjkim *
6246847Sjkim *****************************************************************************/
7246847Sjkim
8246847Sjkim/*
9306536Sjkim * Copyright (C) 2000 - 2016, Intel Corp.
10246847Sjkim * All rights reserved.
11246847Sjkim *
12246847Sjkim * Redistribution and use in source and binary forms, with or without
13246847Sjkim * modification, are permitted provided that the following conditions
14246847Sjkim * are met:
15246847Sjkim * 1. Redistributions of source code must retain the above copyright
16246847Sjkim *    notice, this list of conditions, and the following disclaimer,
17246847Sjkim *    without modification.
18246847Sjkim * 2. Redistributions in binary form must reproduce at minimum a disclaimer
19246847Sjkim *    substantially similar to the "NO WARRANTY" disclaimer below
20246847Sjkim *    ("Disclaimer") and any redistribution must be conditioned upon
21246847Sjkim *    including a substantially similar Disclaimer requirement for further
22246847Sjkim *    binary redistribution.
23246847Sjkim * 3. Neither the names of the above-listed copyright holders nor the names
24246847Sjkim *    of any contributors may be used to endorse or promote products derived
25246847Sjkim *    from this software without specific prior written permission.
26246847Sjkim *
27246847Sjkim * Alternatively, this software may be distributed under the terms of the
28246847Sjkim * GNU General Public License ("GPL") version 2 as published by the Free
29246847Sjkim * Software Foundation.
30246847Sjkim *
31246847Sjkim * NO WARRANTY
32246847Sjkim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
33246847Sjkim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
34246847Sjkim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
35246847Sjkim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
36246847Sjkim * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
37246847Sjkim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
38246847Sjkim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
39246847Sjkim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
40246847Sjkim * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
41246847Sjkim * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
42246847Sjkim * POSSIBILITY OF SUCH DAMAGES.
43246847Sjkim */
44246847Sjkim
45246849Sjkim#include <contrib/dev/acpica/include/acpi.h>
46246849Sjkim#include <contrib/dev/acpica/include/accommon.h>
47246849Sjkim#include <contrib/dev/acpica/include/acnamesp.h>
48246849Sjkim#include <contrib/dev/acpica/include/acinterp.h>
49246849Sjkim#include <contrib/dev/acpica/include/acpredef.h>
50246849Sjkim#include <contrib/dev/acpica/include/amlresrc.h>
51246847Sjkim
52246847Sjkim#define _COMPONENT          ACPI_NAMESPACE
53246847Sjkim        ACPI_MODULE_NAME    ("nsconvert")
54246847Sjkim
55246847Sjkim
56246847Sjkim/*******************************************************************************
57246847Sjkim *
58246847Sjkim * FUNCTION:    AcpiNsConvertToInteger
59246847Sjkim *
60246847Sjkim * PARAMETERS:  OriginalObject      - Object to be converted
61246847Sjkim *              ReturnObject        - Where the new converted object is returned
62246847Sjkim *
63246847Sjkim * RETURN:      Status. AE_OK if conversion was successful.
64246847Sjkim *
65246847Sjkim * DESCRIPTION: Attempt to convert a String/Buffer object to an Integer.
66246847Sjkim *
67246847Sjkim ******************************************************************************/
68246847Sjkim
69246847SjkimACPI_STATUS
70246847SjkimAcpiNsConvertToInteger (
71246847Sjkim    ACPI_OPERAND_OBJECT     *OriginalObject,
72246847Sjkim    ACPI_OPERAND_OBJECT     **ReturnObject)
73246847Sjkim{
74246847Sjkim    ACPI_OPERAND_OBJECT     *NewObject;
75246847Sjkim    ACPI_STATUS             Status;
76246847Sjkim    UINT64                  Value = 0;
77246847Sjkim    UINT32                  i;
78246847Sjkim
79246847Sjkim
80246847Sjkim    switch (OriginalObject->Common.Type)
81246847Sjkim    {
82246847Sjkim    case ACPI_TYPE_STRING:
83246847Sjkim
84246847Sjkim        /* String-to-Integer conversion */
85246847Sjkim
86246847Sjkim        Status = AcpiUtStrtoul64 (OriginalObject->String.Pointer,
87306536Sjkim            ACPI_ANY_BASE, AcpiGbl_IntegerByteWidth, &Value);
88246847Sjkim        if (ACPI_FAILURE (Status))
89246847Sjkim        {
90246847Sjkim            return (Status);
91246847Sjkim        }
92246847Sjkim        break;
93246847Sjkim
94246847Sjkim    case ACPI_TYPE_BUFFER:
95246847Sjkim
96246847Sjkim        /* Buffer-to-Integer conversion. Max buffer size is 64 bits. */
97246847Sjkim
98246847Sjkim        if (OriginalObject->Buffer.Length > 8)
99246847Sjkim        {
100246847Sjkim            return (AE_AML_OPERAND_TYPE);
101246847Sjkim        }
102246847Sjkim
103246847Sjkim        /* Extract each buffer byte to create the integer */
104246847Sjkim
105246847Sjkim        for (i = 0; i < OriginalObject->Buffer.Length; i++)
106246847Sjkim        {
107306536Sjkim            Value |= ((UINT64)
108306536Sjkim                OriginalObject->Buffer.Pointer[i] << (i * 8));
109246847Sjkim        }
110246847Sjkim        break;
111246847Sjkim
112246847Sjkim    default:
113250838Sjkim
114246847Sjkim        return (AE_AML_OPERAND_TYPE);
115246847Sjkim    }
116246847Sjkim
117246847Sjkim    NewObject = AcpiUtCreateIntegerObject (Value);
118246847Sjkim    if (!NewObject)
119246847Sjkim    {
120246847Sjkim        return (AE_NO_MEMORY);
121246847Sjkim    }
122246847Sjkim
123246847Sjkim    *ReturnObject = NewObject;
124246847Sjkim    return (AE_OK);
125246847Sjkim}
126246847Sjkim
127246847Sjkim
128246847Sjkim/*******************************************************************************
129246847Sjkim *
130246847Sjkim * FUNCTION:    AcpiNsConvertToString
131246847Sjkim *
132246847Sjkim * PARAMETERS:  OriginalObject      - Object to be converted
133246847Sjkim *              ReturnObject        - Where the new converted object is returned
134246847Sjkim *
135246847Sjkim * RETURN:      Status. AE_OK if conversion was successful.
136246847Sjkim *
137246847Sjkim * DESCRIPTION: Attempt to convert a Integer/Buffer object to a String.
138246847Sjkim *
139246847Sjkim ******************************************************************************/
140246847Sjkim
141246847SjkimACPI_STATUS
142246847SjkimAcpiNsConvertToString (
143246847Sjkim    ACPI_OPERAND_OBJECT     *OriginalObject,
144246847Sjkim    ACPI_OPERAND_OBJECT     **ReturnObject)
145246847Sjkim{
146246847Sjkim    ACPI_OPERAND_OBJECT     *NewObject;
147246847Sjkim    ACPI_SIZE               Length;
148246847Sjkim    ACPI_STATUS             Status;
149246847Sjkim
150246847Sjkim
151246847Sjkim    switch (OriginalObject->Common.Type)
152246847Sjkim    {
153246847Sjkim    case ACPI_TYPE_INTEGER:
154246847Sjkim        /*
155246847Sjkim         * Integer-to-String conversion. Commonly, convert
156246847Sjkim         * an integer of value 0 to a NULL string. The last element of
157246847Sjkim         * _BIF and _BIX packages occasionally need this fix.
158246847Sjkim         */
159246847Sjkim        if (OriginalObject->Integer.Value == 0)
160246847Sjkim        {
161246847Sjkim            /* Allocate a new NULL string object */
162246847Sjkim
163246847Sjkim            NewObject = AcpiUtCreateStringObject (0);
164246847Sjkim            if (!NewObject)
165246847Sjkim            {
166246847Sjkim                return (AE_NO_MEMORY);
167246847Sjkim            }
168246847Sjkim        }
169246847Sjkim        else
170246847Sjkim        {
171306536Sjkim            Status = AcpiExConvertToString (OriginalObject,
172306536Sjkim                &NewObject, ACPI_IMPLICIT_CONVERT_HEX);
173246847Sjkim            if (ACPI_FAILURE (Status))
174246847Sjkim            {
175246847Sjkim                return (Status);
176246847Sjkim            }
177246847Sjkim        }
178246847Sjkim        break;
179246847Sjkim
180246847Sjkim    case ACPI_TYPE_BUFFER:
181246847Sjkim        /*
182246847Sjkim         * Buffer-to-String conversion. Use a ToString
183246847Sjkim         * conversion, no transform performed on the buffer data. The best
184246847Sjkim         * example of this is the _BIF method, where the string data from
185246847Sjkim         * the battery is often (incorrectly) returned as buffer object(s).
186246847Sjkim         */
187246847Sjkim        Length = 0;
188246847Sjkim        while ((Length < OriginalObject->Buffer.Length) &&
189246847Sjkim                (OriginalObject->Buffer.Pointer[Length]))
190246847Sjkim        {
191246847Sjkim            Length++;
192246847Sjkim        }
193246847Sjkim
194246847Sjkim        /* Allocate a new string object */
195246847Sjkim
196246847Sjkim        NewObject = AcpiUtCreateStringObject (Length);
197246847Sjkim        if (!NewObject)
198246847Sjkim        {
199246847Sjkim            return (AE_NO_MEMORY);
200246847Sjkim        }
201246847Sjkim
202246847Sjkim        /*
203246847Sjkim         * Copy the raw buffer data with no transform. String is already NULL
204246847Sjkim         * terminated at Length+1.
205246847Sjkim         */
206306536Sjkim        memcpy (NewObject->String.Pointer,
207246847Sjkim            OriginalObject->Buffer.Pointer, Length);
208246847Sjkim        break;
209246847Sjkim
210246847Sjkim    default:
211250838Sjkim
212246847Sjkim        return (AE_AML_OPERAND_TYPE);
213246847Sjkim    }
214246847Sjkim
215246847Sjkim    *ReturnObject = NewObject;
216246847Sjkim    return (AE_OK);
217246847Sjkim}
218246847Sjkim
219246847Sjkim
220246847Sjkim/*******************************************************************************
221246847Sjkim *
222246847Sjkim * FUNCTION:    AcpiNsConvertToBuffer
223246847Sjkim *
224246847Sjkim * PARAMETERS:  OriginalObject      - Object to be converted
225246847Sjkim *              ReturnObject        - Where the new converted object is returned
226246847Sjkim *
227246847Sjkim * RETURN:      Status. AE_OK if conversion was successful.
228246847Sjkim *
229246847Sjkim * DESCRIPTION: Attempt to convert a Integer/String/Package object to a Buffer.
230246847Sjkim *
231246847Sjkim ******************************************************************************/
232246847Sjkim
233246847SjkimACPI_STATUS
234246847SjkimAcpiNsConvertToBuffer (
235246847Sjkim    ACPI_OPERAND_OBJECT     *OriginalObject,
236246847Sjkim    ACPI_OPERAND_OBJECT     **ReturnObject)
237246847Sjkim{
238246847Sjkim    ACPI_OPERAND_OBJECT     *NewObject;
239246847Sjkim    ACPI_STATUS             Status;
240246847Sjkim    ACPI_OPERAND_OBJECT     **Elements;
241246847Sjkim    UINT32                  *DwordBuffer;
242246847Sjkim    UINT32                  Count;
243246847Sjkim    UINT32                  i;
244246847Sjkim
245246847Sjkim
246246847Sjkim    switch (OriginalObject->Common.Type)
247246847Sjkim    {
248246847Sjkim    case ACPI_TYPE_INTEGER:
249246847Sjkim        /*
250246847Sjkim         * Integer-to-Buffer conversion.
251246847Sjkim         * Convert the Integer to a packed-byte buffer. _MAT and other
252246847Sjkim         * objects need this sometimes, if a read has been performed on a
253246847Sjkim         * Field object that is less than or equal to the global integer
254246847Sjkim         * size (32 or 64 bits).
255246847Sjkim         */
256246847Sjkim        Status = AcpiExConvertToBuffer (OriginalObject, &NewObject);
257246847Sjkim        if (ACPI_FAILURE (Status))
258246847Sjkim        {
259246847Sjkim            return (Status);
260246847Sjkim        }
261246847Sjkim        break;
262246847Sjkim
263246847Sjkim    case ACPI_TYPE_STRING:
264246847Sjkim
265246847Sjkim        /* String-to-Buffer conversion. Simple data copy */
266246847Sjkim
267306536Sjkim        NewObject = AcpiUtCreateBufferObject
268306536Sjkim            (OriginalObject->String.Length);
269246847Sjkim        if (!NewObject)
270246847Sjkim        {
271246847Sjkim            return (AE_NO_MEMORY);
272246847Sjkim        }
273246847Sjkim
274306536Sjkim        memcpy (NewObject->Buffer.Pointer,
275246847Sjkim            OriginalObject->String.Pointer, OriginalObject->String.Length);
276246847Sjkim        break;
277246847Sjkim
278246847Sjkim    case ACPI_TYPE_PACKAGE:
279246847Sjkim        /*
280246847Sjkim         * This case is often seen for predefined names that must return a
281246847Sjkim         * Buffer object with multiple DWORD integers within. For example,
282246847Sjkim         * _FDE and _GTM. The Package can be converted to a Buffer.
283246847Sjkim         */
284246847Sjkim
285246847Sjkim        /* All elements of the Package must be integers */
286246847Sjkim
287246847Sjkim        Elements = OriginalObject->Package.Elements;
288246847Sjkim        Count = OriginalObject->Package.Count;
289246847Sjkim
290246847Sjkim        for (i = 0; i < Count; i++)
291246847Sjkim        {
292246847Sjkim            if ((!*Elements) ||
293246847Sjkim                ((*Elements)->Common.Type != ACPI_TYPE_INTEGER))
294246847Sjkim            {
295246847Sjkim                return (AE_AML_OPERAND_TYPE);
296246847Sjkim            }
297246847Sjkim            Elements++;
298246847Sjkim        }
299246847Sjkim
300246847Sjkim        /* Create the new buffer object to replace the Package */
301246847Sjkim
302246847Sjkim        NewObject = AcpiUtCreateBufferObject (ACPI_MUL_4 (Count));
303246847Sjkim        if (!NewObject)
304246847Sjkim        {
305246847Sjkim            return (AE_NO_MEMORY);
306246847Sjkim        }
307246847Sjkim
308246847Sjkim        /* Copy the package elements (integers) to the buffer as DWORDs */
309246847Sjkim
310246847Sjkim        Elements = OriginalObject->Package.Elements;
311246847Sjkim        DwordBuffer = ACPI_CAST_PTR (UINT32, NewObject->Buffer.Pointer);
312246847Sjkim
313246847Sjkim        for (i = 0; i < Count; i++)
314246847Sjkim        {
315246847Sjkim            *DwordBuffer = (UINT32) (*Elements)->Integer.Value;
316246847Sjkim            DwordBuffer++;
317246847Sjkim            Elements++;
318246847Sjkim        }
319246847Sjkim        break;
320246847Sjkim
321246847Sjkim    default:
322250838Sjkim
323246847Sjkim        return (AE_AML_OPERAND_TYPE);
324246847Sjkim    }
325246847Sjkim
326246847Sjkim    *ReturnObject = NewObject;
327246847Sjkim    return (AE_OK);
328246847Sjkim}
329246847Sjkim
330246847Sjkim
331246847Sjkim/*******************************************************************************
332246847Sjkim *
333246847Sjkim * FUNCTION:    AcpiNsConvertToUnicode
334246847Sjkim *
335306536Sjkim * PARAMETERS:  Scope               - Namespace node for the method/object
336306536Sjkim *              OriginalObject      - ASCII String Object to be converted
337246847Sjkim *              ReturnObject        - Where the new converted object is returned
338246847Sjkim *
339246847Sjkim * RETURN:      Status. AE_OK if conversion was successful.
340246847Sjkim *
341246847Sjkim * DESCRIPTION: Attempt to convert a String object to a Unicode string Buffer.
342246847Sjkim *
343246847Sjkim ******************************************************************************/
344246847Sjkim
345246847SjkimACPI_STATUS
346246847SjkimAcpiNsConvertToUnicode (
347306536Sjkim    ACPI_NAMESPACE_NODE     *Scope,
348246847Sjkim    ACPI_OPERAND_OBJECT     *OriginalObject,
349246847Sjkim    ACPI_OPERAND_OBJECT     **ReturnObject)
350246847Sjkim{
351246847Sjkim    ACPI_OPERAND_OBJECT     *NewObject;
352246847Sjkim    char                    *AsciiString;
353246847Sjkim    UINT16                  *UnicodeBuffer;
354246847Sjkim    UINT32                  UnicodeLength;
355246847Sjkim    UINT32                  i;
356246847Sjkim
357246847Sjkim
358246847Sjkim    if (!OriginalObject)
359246847Sjkim    {
360246847Sjkim        return (AE_OK);
361246847Sjkim    }
362246847Sjkim
363246847Sjkim    /* If a Buffer was returned, it must be at least two bytes long */
364246847Sjkim
365246847Sjkim    if (OriginalObject->Common.Type == ACPI_TYPE_BUFFER)
366246847Sjkim    {
367246847Sjkim        if (OriginalObject->Buffer.Length < 2)
368246847Sjkim        {
369246847Sjkim            return (AE_AML_OPERAND_VALUE);
370246847Sjkim        }
371246847Sjkim
372246847Sjkim        *ReturnObject = NULL;
373246847Sjkim        return (AE_OK);
374246847Sjkim    }
375246847Sjkim
376246847Sjkim    /*
377246847Sjkim     * The original object is an ASCII string. Convert this string to
378246847Sjkim     * a unicode buffer.
379246847Sjkim     */
380246847Sjkim    AsciiString = OriginalObject->String.Pointer;
381246847Sjkim    UnicodeLength = (OriginalObject->String.Length * 2) + 2;
382246847Sjkim
383246847Sjkim    /* Create a new buffer object for the Unicode data */
384246847Sjkim
385246847Sjkim    NewObject = AcpiUtCreateBufferObject (UnicodeLength);
386246847Sjkim    if (!NewObject)
387246847Sjkim    {
388246847Sjkim        return (AE_NO_MEMORY);
389246847Sjkim    }
390246847Sjkim
391246847Sjkim    UnicodeBuffer = ACPI_CAST_PTR (UINT16, NewObject->Buffer.Pointer);
392246847Sjkim
393246847Sjkim    /* Convert ASCII to Unicode */
394246847Sjkim
395246847Sjkim    for (i = 0; i < OriginalObject->String.Length; i++)
396246847Sjkim    {
397246847Sjkim        UnicodeBuffer[i] = (UINT16) AsciiString[i];
398246847Sjkim    }
399246847Sjkim
400246847Sjkim    *ReturnObject = NewObject;
401246847Sjkim    return (AE_OK);
402246847Sjkim}
403246847Sjkim
404246847Sjkim
405246847Sjkim/*******************************************************************************
406246847Sjkim *
407246847Sjkim * FUNCTION:    AcpiNsConvertToResource
408246847Sjkim *
409306536Sjkim * PARAMETERS:  Scope               - Namespace node for the method/object
410306536Sjkim *              OriginalObject      - Object to be converted
411246847Sjkim *              ReturnObject        - Where the new converted object is returned
412246847Sjkim *
413246847Sjkim * RETURN:      Status. AE_OK if conversion was successful
414246847Sjkim *
415246847Sjkim * DESCRIPTION: Attempt to convert a Integer object to a ResourceTemplate
416246847Sjkim *              Buffer.
417246847Sjkim *
418246847Sjkim ******************************************************************************/
419246847Sjkim
420246847SjkimACPI_STATUS
421246847SjkimAcpiNsConvertToResource (
422306536Sjkim    ACPI_NAMESPACE_NODE     *Scope,
423246847Sjkim    ACPI_OPERAND_OBJECT     *OriginalObject,
424246847Sjkim    ACPI_OPERAND_OBJECT     **ReturnObject)
425246847Sjkim{
426246847Sjkim    ACPI_OPERAND_OBJECT     *NewObject;
427246847Sjkim    UINT8                   *Buffer;
428246847Sjkim
429246847Sjkim
430246847Sjkim    /*
431246847Sjkim     * We can fix the following cases for an expected resource template:
432246847Sjkim     * 1. No return value (interpreter slack mode is disabled)
433246847Sjkim     * 2. A "Return (Zero)" statement
434246847Sjkim     * 3. A "Return empty buffer" statement
435246847Sjkim     *
436246847Sjkim     * We will return a buffer containing a single EndTag
437246847Sjkim     * resource descriptor.
438246847Sjkim     */
439246847Sjkim    if (OriginalObject)
440246847Sjkim    {
441246847Sjkim        switch (OriginalObject->Common.Type)
442246847Sjkim        {
443246847Sjkim        case ACPI_TYPE_INTEGER:
444246847Sjkim
445246847Sjkim            /* We can only repair an Integer==0 */
446246847Sjkim
447246847Sjkim            if (OriginalObject->Integer.Value)
448246847Sjkim            {
449246847Sjkim                return (AE_AML_OPERAND_TYPE);
450246847Sjkim            }
451246847Sjkim            break;
452246847Sjkim
453246847Sjkim        case ACPI_TYPE_BUFFER:
454246847Sjkim
455246847Sjkim            if (OriginalObject->Buffer.Length)
456246847Sjkim            {
457246847Sjkim                /* Additional checks can be added in the future */
458246847Sjkim
459246847Sjkim                *ReturnObject = NULL;
460246847Sjkim                return (AE_OK);
461246847Sjkim            }
462246847Sjkim            break;
463246847Sjkim
464246847Sjkim        case ACPI_TYPE_STRING:
465246847Sjkim        default:
466246847Sjkim
467246847Sjkim            return (AE_AML_OPERAND_TYPE);
468246847Sjkim        }
469246847Sjkim    }
470246847Sjkim
471246847Sjkim    /* Create the new buffer object for the resource descriptor */
472246847Sjkim
473246847Sjkim    NewObject = AcpiUtCreateBufferObject (2);
474246847Sjkim    if (!NewObject)
475246847Sjkim    {
476246847Sjkim        return (AE_NO_MEMORY);
477246847Sjkim    }
478246847Sjkim
479246847Sjkim    Buffer = ACPI_CAST_PTR (UINT8, NewObject->Buffer.Pointer);
480246847Sjkim
481246847Sjkim    /* Initialize the Buffer with a single EndTag descriptor */
482246847Sjkim
483246847Sjkim    Buffer[0] = (ACPI_RESOURCE_NAME_END_TAG | ASL_RDESC_END_TAG_SIZE);
484246847Sjkim    Buffer[1] = 0x00;
485246847Sjkim
486246847Sjkim    *ReturnObject = NewObject;
487246847Sjkim    return (AE_OK);
488246847Sjkim}
489306536Sjkim
490306536Sjkim
491306536Sjkim/*******************************************************************************
492306536Sjkim *
493306536Sjkim * FUNCTION:    AcpiNsConvertToReference
494306536Sjkim *
495306536Sjkim * PARAMETERS:  Scope               - Namespace node for the method/object
496306536Sjkim *              OriginalObject      - Object to be converted
497306536Sjkim *              ReturnObject        - Where the new converted object is returned
498306536Sjkim *
499306536Sjkim * RETURN:      Status. AE_OK if conversion was successful
500306536Sjkim *
501306536Sjkim * DESCRIPTION: Attempt to convert a Integer object to a ObjectReference.
502306536Sjkim *              Buffer.
503306536Sjkim *
504306536Sjkim ******************************************************************************/
505306536Sjkim
506306536SjkimACPI_STATUS
507306536SjkimAcpiNsConvertToReference (
508306536Sjkim    ACPI_NAMESPACE_NODE     *Scope,
509306536Sjkim    ACPI_OPERAND_OBJECT     *OriginalObject,
510306536Sjkim    ACPI_OPERAND_OBJECT     **ReturnObject)
511306536Sjkim{
512306536Sjkim    ACPI_OPERAND_OBJECT     *NewObject = NULL;
513306536Sjkim    ACPI_STATUS             Status;
514306536Sjkim    ACPI_NAMESPACE_NODE     *Node;
515306536Sjkim    ACPI_GENERIC_STATE      ScopeInfo;
516306536Sjkim    char                    *Name;
517306536Sjkim
518306536Sjkim
519306536Sjkim    ACPI_FUNCTION_NAME (NsConvertToReference);
520306536Sjkim
521306536Sjkim
522306536Sjkim    /* Convert path into internal presentation */
523306536Sjkim
524306536Sjkim    Status = AcpiNsInternalizeName (OriginalObject->String.Pointer, &Name);
525306536Sjkim    if (ACPI_FAILURE (Status))
526306536Sjkim    {
527306536Sjkim        return_ACPI_STATUS (Status);
528306536Sjkim    }
529306536Sjkim
530306536Sjkim    /* Find the namespace node */
531306536Sjkim
532306536Sjkim    ScopeInfo.Scope.Node = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, Scope);
533306536Sjkim    Status = AcpiNsLookup (&ScopeInfo, Name,
534306536Sjkim        ACPI_TYPE_ANY, ACPI_IMODE_EXECUTE,
535306536Sjkim        ACPI_NS_SEARCH_PARENT | ACPI_NS_DONT_OPEN_SCOPE, NULL, &Node);
536306536Sjkim    if (ACPI_FAILURE (Status))
537306536Sjkim    {
538306536Sjkim        /* Check if we are resolving a named reference within a package */
539306536Sjkim
540306536Sjkim        ACPI_ERROR_NAMESPACE (OriginalObject->String.Pointer, Status);
541306536Sjkim        goto ErrorExit;
542306536Sjkim    }
543306536Sjkim
544306536Sjkim    /* Create and init a new internal ACPI object */
545306536Sjkim
546306536Sjkim    NewObject = AcpiUtCreateInternalObject (ACPI_TYPE_LOCAL_REFERENCE);
547306536Sjkim    if (!NewObject)
548306536Sjkim    {
549306536Sjkim        Status = AE_NO_MEMORY;
550306536Sjkim        goto ErrorExit;
551306536Sjkim    }
552306536Sjkim    NewObject->Reference.Node = Node;
553306536Sjkim    NewObject->Reference.Object = Node->Object;
554306536Sjkim    NewObject->Reference.Class = ACPI_REFCLASS_NAME;
555306536Sjkim
556306536Sjkim    /*
557306536Sjkim     * Increase reference of the object if needed (the object is likely a
558306536Sjkim     * null for device nodes).
559306536Sjkim     */
560306536Sjkim    AcpiUtAddReference (Node->Object);
561306536Sjkim
562306536SjkimErrorExit:
563306536Sjkim    ACPI_FREE (Name);
564306536Sjkim    *ReturnObject = NewObject;
565306536Sjkim    return (AE_OK);
566306536Sjkim}
567