xref: /freebsd/sys/contrib/dev/acpica/components/namespace/nsconvert.c (revision 9c48c75ed62587d422471fade1b0ceba2077bd20)
1*9c48c75eSJung-uk Kim /******************************************************************************
2*9c48c75eSJung-uk Kim  *
3*9c48c75eSJung-uk Kim  * Module Name: nsconvert - Object conversions for objects returned by
4*9c48c75eSJung-uk Kim  *                          predefined methods
5*9c48c75eSJung-uk Kim  *
6*9c48c75eSJung-uk Kim  *****************************************************************************/
7*9c48c75eSJung-uk Kim 
8*9c48c75eSJung-uk Kim /*
9*9c48c75eSJung-uk Kim  * Copyright (C) 2000 - 2013, Intel Corp.
10*9c48c75eSJung-uk Kim  * All rights reserved.
11*9c48c75eSJung-uk Kim  *
12*9c48c75eSJung-uk Kim  * Redistribution and use in source and binary forms, with or without
13*9c48c75eSJung-uk Kim  * modification, are permitted provided that the following conditions
14*9c48c75eSJung-uk Kim  * are met:
15*9c48c75eSJung-uk Kim  * 1. Redistributions of source code must retain the above copyright
16*9c48c75eSJung-uk Kim  *    notice, this list of conditions, and the following disclaimer,
17*9c48c75eSJung-uk Kim  *    without modification.
18*9c48c75eSJung-uk Kim  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
19*9c48c75eSJung-uk Kim  *    substantially similar to the "NO WARRANTY" disclaimer below
20*9c48c75eSJung-uk Kim  *    ("Disclaimer") and any redistribution must be conditioned upon
21*9c48c75eSJung-uk Kim  *    including a substantially similar Disclaimer requirement for further
22*9c48c75eSJung-uk Kim  *    binary redistribution.
23*9c48c75eSJung-uk Kim  * 3. Neither the names of the above-listed copyright holders nor the names
24*9c48c75eSJung-uk Kim  *    of any contributors may be used to endorse or promote products derived
25*9c48c75eSJung-uk Kim  *    from this software without specific prior written permission.
26*9c48c75eSJung-uk Kim  *
27*9c48c75eSJung-uk Kim  * Alternatively, this software may be distributed under the terms of the
28*9c48c75eSJung-uk Kim  * GNU General Public License ("GPL") version 2 as published by the Free
29*9c48c75eSJung-uk Kim  * Software Foundation.
30*9c48c75eSJung-uk Kim  *
31*9c48c75eSJung-uk Kim  * NO WARRANTY
32*9c48c75eSJung-uk Kim  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
33*9c48c75eSJung-uk Kim  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
34*9c48c75eSJung-uk Kim  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
35*9c48c75eSJung-uk Kim  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
36*9c48c75eSJung-uk Kim  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
37*9c48c75eSJung-uk Kim  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
38*9c48c75eSJung-uk Kim  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
39*9c48c75eSJung-uk Kim  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
40*9c48c75eSJung-uk Kim  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
41*9c48c75eSJung-uk Kim  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
42*9c48c75eSJung-uk Kim  * POSSIBILITY OF SUCH DAMAGES.
43*9c48c75eSJung-uk Kim  */
44*9c48c75eSJung-uk Kim 
45*9c48c75eSJung-uk Kim #define __NSCONVERT_C__
46*9c48c75eSJung-uk Kim 
47*9c48c75eSJung-uk Kim #include <contrib/dev/acpica/include/acpi.h>
48*9c48c75eSJung-uk Kim #include <contrib/dev/acpica/include/accommon.h>
49*9c48c75eSJung-uk Kim #include <contrib/dev/acpica/include/acnamesp.h>
50*9c48c75eSJung-uk Kim #include <contrib/dev/acpica/include/acinterp.h>
51*9c48c75eSJung-uk Kim #include <contrib/dev/acpica/include/acpredef.h>
52*9c48c75eSJung-uk Kim #include <contrib/dev/acpica/include/amlresrc.h>
53*9c48c75eSJung-uk Kim 
54*9c48c75eSJung-uk Kim #define _COMPONENT          ACPI_NAMESPACE
55*9c48c75eSJung-uk Kim         ACPI_MODULE_NAME    ("nsconvert")
56*9c48c75eSJung-uk Kim 
57*9c48c75eSJung-uk Kim 
58*9c48c75eSJung-uk Kim /*******************************************************************************
59*9c48c75eSJung-uk Kim  *
60*9c48c75eSJung-uk Kim  * FUNCTION:    AcpiNsConvertToInteger
61*9c48c75eSJung-uk Kim  *
62*9c48c75eSJung-uk Kim  * PARAMETERS:  OriginalObject      - Object to be converted
63*9c48c75eSJung-uk Kim  *              ReturnObject        - Where the new converted object is returned
64*9c48c75eSJung-uk Kim  *
65*9c48c75eSJung-uk Kim  * RETURN:      Status. AE_OK if conversion was successful.
66*9c48c75eSJung-uk Kim  *
67*9c48c75eSJung-uk Kim  * DESCRIPTION: Attempt to convert a String/Buffer object to an Integer.
68*9c48c75eSJung-uk Kim  *
69*9c48c75eSJung-uk Kim  ******************************************************************************/
70*9c48c75eSJung-uk Kim 
71*9c48c75eSJung-uk Kim ACPI_STATUS
72*9c48c75eSJung-uk Kim AcpiNsConvertToInteger (
73*9c48c75eSJung-uk Kim     ACPI_OPERAND_OBJECT     *OriginalObject,
74*9c48c75eSJung-uk Kim     ACPI_OPERAND_OBJECT     **ReturnObject)
75*9c48c75eSJung-uk Kim {
76*9c48c75eSJung-uk Kim     ACPI_OPERAND_OBJECT     *NewObject;
77*9c48c75eSJung-uk Kim     ACPI_STATUS             Status;
78*9c48c75eSJung-uk Kim     UINT64                  Value = 0;
79*9c48c75eSJung-uk Kim     UINT32                  i;
80*9c48c75eSJung-uk Kim 
81*9c48c75eSJung-uk Kim 
82*9c48c75eSJung-uk Kim     switch (OriginalObject->Common.Type)
83*9c48c75eSJung-uk Kim     {
84*9c48c75eSJung-uk Kim     case ACPI_TYPE_STRING:
85*9c48c75eSJung-uk Kim 
86*9c48c75eSJung-uk Kim         /* String-to-Integer conversion */
87*9c48c75eSJung-uk Kim 
88*9c48c75eSJung-uk Kim         Status = AcpiUtStrtoul64 (OriginalObject->String.Pointer,
89*9c48c75eSJung-uk Kim                     ACPI_ANY_BASE, &Value);
90*9c48c75eSJung-uk Kim         if (ACPI_FAILURE (Status))
91*9c48c75eSJung-uk Kim         {
92*9c48c75eSJung-uk Kim             return (Status);
93*9c48c75eSJung-uk Kim         }
94*9c48c75eSJung-uk Kim         break;
95*9c48c75eSJung-uk Kim 
96*9c48c75eSJung-uk Kim     case ACPI_TYPE_BUFFER:
97*9c48c75eSJung-uk Kim 
98*9c48c75eSJung-uk Kim         /* Buffer-to-Integer conversion. Max buffer size is 64 bits. */
99*9c48c75eSJung-uk Kim 
100*9c48c75eSJung-uk Kim         if (OriginalObject->Buffer.Length > 8)
101*9c48c75eSJung-uk Kim         {
102*9c48c75eSJung-uk Kim             return (AE_AML_OPERAND_TYPE);
103*9c48c75eSJung-uk Kim         }
104*9c48c75eSJung-uk Kim 
105*9c48c75eSJung-uk Kim         /* Extract each buffer byte to create the integer */
106*9c48c75eSJung-uk Kim 
107*9c48c75eSJung-uk Kim         for (i = 0; i < OriginalObject->Buffer.Length; i++)
108*9c48c75eSJung-uk Kim         {
109*9c48c75eSJung-uk Kim             Value |= ((UINT64) OriginalObject->Buffer.Pointer[i] << (i * 8));
110*9c48c75eSJung-uk Kim         }
111*9c48c75eSJung-uk Kim         break;
112*9c48c75eSJung-uk Kim 
113*9c48c75eSJung-uk Kim     default:
114*9c48c75eSJung-uk Kim         return (AE_AML_OPERAND_TYPE);
115*9c48c75eSJung-uk Kim     }
116*9c48c75eSJung-uk Kim 
117*9c48c75eSJung-uk Kim     NewObject = AcpiUtCreateIntegerObject (Value);
118*9c48c75eSJung-uk Kim     if (!NewObject)
119*9c48c75eSJung-uk Kim     {
120*9c48c75eSJung-uk Kim         return (AE_NO_MEMORY);
121*9c48c75eSJung-uk Kim     }
122*9c48c75eSJung-uk Kim 
123*9c48c75eSJung-uk Kim     *ReturnObject = NewObject;
124*9c48c75eSJung-uk Kim     return (AE_OK);
125*9c48c75eSJung-uk Kim }
126*9c48c75eSJung-uk Kim 
127*9c48c75eSJung-uk Kim 
128*9c48c75eSJung-uk Kim /*******************************************************************************
129*9c48c75eSJung-uk Kim  *
130*9c48c75eSJung-uk Kim  * FUNCTION:    AcpiNsConvertToString
131*9c48c75eSJung-uk Kim  *
132*9c48c75eSJung-uk Kim  * PARAMETERS:  OriginalObject      - Object to be converted
133*9c48c75eSJung-uk Kim  *              ReturnObject        - Where the new converted object is returned
134*9c48c75eSJung-uk Kim  *
135*9c48c75eSJung-uk Kim  * RETURN:      Status. AE_OK if conversion was successful.
136*9c48c75eSJung-uk Kim  *
137*9c48c75eSJung-uk Kim  * DESCRIPTION: Attempt to convert a Integer/Buffer object to a String.
138*9c48c75eSJung-uk Kim  *
139*9c48c75eSJung-uk Kim  ******************************************************************************/
140*9c48c75eSJung-uk Kim 
141*9c48c75eSJung-uk Kim ACPI_STATUS
142*9c48c75eSJung-uk Kim AcpiNsConvertToString (
143*9c48c75eSJung-uk Kim     ACPI_OPERAND_OBJECT     *OriginalObject,
144*9c48c75eSJung-uk Kim     ACPI_OPERAND_OBJECT     **ReturnObject)
145*9c48c75eSJung-uk Kim {
146*9c48c75eSJung-uk Kim     ACPI_OPERAND_OBJECT     *NewObject;
147*9c48c75eSJung-uk Kim     ACPI_SIZE               Length;
148*9c48c75eSJung-uk Kim     ACPI_STATUS             Status;
149*9c48c75eSJung-uk Kim 
150*9c48c75eSJung-uk Kim 
151*9c48c75eSJung-uk Kim     switch (OriginalObject->Common.Type)
152*9c48c75eSJung-uk Kim     {
153*9c48c75eSJung-uk Kim     case ACPI_TYPE_INTEGER:
154*9c48c75eSJung-uk Kim         /*
155*9c48c75eSJung-uk Kim          * Integer-to-String conversion. Commonly, convert
156*9c48c75eSJung-uk Kim          * an integer of value 0 to a NULL string. The last element of
157*9c48c75eSJung-uk Kim          * _BIF and _BIX packages occasionally need this fix.
158*9c48c75eSJung-uk Kim          */
159*9c48c75eSJung-uk Kim         if (OriginalObject->Integer.Value == 0)
160*9c48c75eSJung-uk Kim         {
161*9c48c75eSJung-uk Kim             /* Allocate a new NULL string object */
162*9c48c75eSJung-uk Kim 
163*9c48c75eSJung-uk Kim             NewObject = AcpiUtCreateStringObject (0);
164*9c48c75eSJung-uk Kim             if (!NewObject)
165*9c48c75eSJung-uk Kim             {
166*9c48c75eSJung-uk Kim                 return (AE_NO_MEMORY);
167*9c48c75eSJung-uk Kim             }
168*9c48c75eSJung-uk Kim         }
169*9c48c75eSJung-uk Kim         else
170*9c48c75eSJung-uk Kim         {
171*9c48c75eSJung-uk Kim             Status = AcpiExConvertToString (OriginalObject, &NewObject,
172*9c48c75eSJung-uk Kim                         ACPI_IMPLICIT_CONVERT_HEX);
173*9c48c75eSJung-uk Kim             if (ACPI_FAILURE (Status))
174*9c48c75eSJung-uk Kim             {
175*9c48c75eSJung-uk Kim                 return (Status);
176*9c48c75eSJung-uk Kim             }
177*9c48c75eSJung-uk Kim         }
178*9c48c75eSJung-uk Kim         break;
179*9c48c75eSJung-uk Kim 
180*9c48c75eSJung-uk Kim     case ACPI_TYPE_BUFFER:
181*9c48c75eSJung-uk Kim         /*
182*9c48c75eSJung-uk Kim          * Buffer-to-String conversion. Use a ToString
183*9c48c75eSJung-uk Kim          * conversion, no transform performed on the buffer data. The best
184*9c48c75eSJung-uk Kim          * example of this is the _BIF method, where the string data from
185*9c48c75eSJung-uk Kim          * the battery is often (incorrectly) returned as buffer object(s).
186*9c48c75eSJung-uk Kim          */
187*9c48c75eSJung-uk Kim         Length = 0;
188*9c48c75eSJung-uk Kim         while ((Length < OriginalObject->Buffer.Length) &&
189*9c48c75eSJung-uk Kim                 (OriginalObject->Buffer.Pointer[Length]))
190*9c48c75eSJung-uk Kim         {
191*9c48c75eSJung-uk Kim             Length++;
192*9c48c75eSJung-uk Kim         }
193*9c48c75eSJung-uk Kim 
194*9c48c75eSJung-uk Kim         /* Allocate a new string object */
195*9c48c75eSJung-uk Kim 
196*9c48c75eSJung-uk Kim         NewObject = AcpiUtCreateStringObject (Length);
197*9c48c75eSJung-uk Kim         if (!NewObject)
198*9c48c75eSJung-uk Kim         {
199*9c48c75eSJung-uk Kim             return (AE_NO_MEMORY);
200*9c48c75eSJung-uk Kim         }
201*9c48c75eSJung-uk Kim 
202*9c48c75eSJung-uk Kim         /*
203*9c48c75eSJung-uk Kim          * Copy the raw buffer data with no transform. String is already NULL
204*9c48c75eSJung-uk Kim          * terminated at Length+1.
205*9c48c75eSJung-uk Kim          */
206*9c48c75eSJung-uk Kim         ACPI_MEMCPY (NewObject->String.Pointer,
207*9c48c75eSJung-uk Kim             OriginalObject->Buffer.Pointer, Length);
208*9c48c75eSJung-uk Kim         break;
209*9c48c75eSJung-uk Kim 
210*9c48c75eSJung-uk Kim     default:
211*9c48c75eSJung-uk Kim         return (AE_AML_OPERAND_TYPE);
212*9c48c75eSJung-uk Kim     }
213*9c48c75eSJung-uk Kim 
214*9c48c75eSJung-uk Kim     *ReturnObject = NewObject;
215*9c48c75eSJung-uk Kim     return (AE_OK);
216*9c48c75eSJung-uk Kim }
217*9c48c75eSJung-uk Kim 
218*9c48c75eSJung-uk Kim 
219*9c48c75eSJung-uk Kim /*******************************************************************************
220*9c48c75eSJung-uk Kim  *
221*9c48c75eSJung-uk Kim  * FUNCTION:    AcpiNsConvertToBuffer
222*9c48c75eSJung-uk Kim  *
223*9c48c75eSJung-uk Kim  * PARAMETERS:  OriginalObject      - Object to be converted
224*9c48c75eSJung-uk Kim  *              ReturnObject        - Where the new converted object is returned
225*9c48c75eSJung-uk Kim  *
226*9c48c75eSJung-uk Kim  * RETURN:      Status. AE_OK if conversion was successful.
227*9c48c75eSJung-uk Kim  *
228*9c48c75eSJung-uk Kim  * DESCRIPTION: Attempt to convert a Integer/String/Package object to a Buffer.
229*9c48c75eSJung-uk Kim  *
230*9c48c75eSJung-uk Kim  ******************************************************************************/
231*9c48c75eSJung-uk Kim 
232*9c48c75eSJung-uk Kim ACPI_STATUS
233*9c48c75eSJung-uk Kim AcpiNsConvertToBuffer (
234*9c48c75eSJung-uk Kim     ACPI_OPERAND_OBJECT     *OriginalObject,
235*9c48c75eSJung-uk Kim     ACPI_OPERAND_OBJECT     **ReturnObject)
236*9c48c75eSJung-uk Kim {
237*9c48c75eSJung-uk Kim     ACPI_OPERAND_OBJECT     *NewObject;
238*9c48c75eSJung-uk Kim     ACPI_STATUS             Status;
239*9c48c75eSJung-uk Kim     ACPI_OPERAND_OBJECT     **Elements;
240*9c48c75eSJung-uk Kim     UINT32                  *DwordBuffer;
241*9c48c75eSJung-uk Kim     UINT32                  Count;
242*9c48c75eSJung-uk Kim     UINT32                  i;
243*9c48c75eSJung-uk Kim 
244*9c48c75eSJung-uk Kim 
245*9c48c75eSJung-uk Kim     switch (OriginalObject->Common.Type)
246*9c48c75eSJung-uk Kim     {
247*9c48c75eSJung-uk Kim     case ACPI_TYPE_INTEGER:
248*9c48c75eSJung-uk Kim         /*
249*9c48c75eSJung-uk Kim          * Integer-to-Buffer conversion.
250*9c48c75eSJung-uk Kim          * Convert the Integer to a packed-byte buffer. _MAT and other
251*9c48c75eSJung-uk Kim          * objects need this sometimes, if a read has been performed on a
252*9c48c75eSJung-uk Kim          * Field object that is less than or equal to the global integer
253*9c48c75eSJung-uk Kim          * size (32 or 64 bits).
254*9c48c75eSJung-uk Kim          */
255*9c48c75eSJung-uk Kim         Status = AcpiExConvertToBuffer (OriginalObject, &NewObject);
256*9c48c75eSJung-uk Kim         if (ACPI_FAILURE (Status))
257*9c48c75eSJung-uk Kim         {
258*9c48c75eSJung-uk Kim             return (Status);
259*9c48c75eSJung-uk Kim         }
260*9c48c75eSJung-uk Kim         break;
261*9c48c75eSJung-uk Kim 
262*9c48c75eSJung-uk Kim     case ACPI_TYPE_STRING:
263*9c48c75eSJung-uk Kim 
264*9c48c75eSJung-uk Kim         /* String-to-Buffer conversion. Simple data copy */
265*9c48c75eSJung-uk Kim 
266*9c48c75eSJung-uk Kim         NewObject = AcpiUtCreateBufferObject (OriginalObject->String.Length);
267*9c48c75eSJung-uk Kim         if (!NewObject)
268*9c48c75eSJung-uk Kim         {
269*9c48c75eSJung-uk Kim             return (AE_NO_MEMORY);
270*9c48c75eSJung-uk Kim         }
271*9c48c75eSJung-uk Kim 
272*9c48c75eSJung-uk Kim         ACPI_MEMCPY (NewObject->Buffer.Pointer,
273*9c48c75eSJung-uk Kim             OriginalObject->String.Pointer, OriginalObject->String.Length);
274*9c48c75eSJung-uk Kim         break;
275*9c48c75eSJung-uk Kim 
276*9c48c75eSJung-uk Kim     case ACPI_TYPE_PACKAGE:
277*9c48c75eSJung-uk Kim         /*
278*9c48c75eSJung-uk Kim          * This case is often seen for predefined names that must return a
279*9c48c75eSJung-uk Kim          * Buffer object with multiple DWORD integers within. For example,
280*9c48c75eSJung-uk Kim          * _FDE and _GTM. The Package can be converted to a Buffer.
281*9c48c75eSJung-uk Kim          */
282*9c48c75eSJung-uk Kim 
283*9c48c75eSJung-uk Kim         /* All elements of the Package must be integers */
284*9c48c75eSJung-uk Kim 
285*9c48c75eSJung-uk Kim         Elements = OriginalObject->Package.Elements;
286*9c48c75eSJung-uk Kim         Count = OriginalObject->Package.Count;
287*9c48c75eSJung-uk Kim 
288*9c48c75eSJung-uk Kim         for (i = 0; i < Count; i++)
289*9c48c75eSJung-uk Kim         {
290*9c48c75eSJung-uk Kim             if ((!*Elements) ||
291*9c48c75eSJung-uk Kim                 ((*Elements)->Common.Type != ACPI_TYPE_INTEGER))
292*9c48c75eSJung-uk Kim             {
293*9c48c75eSJung-uk Kim                 return (AE_AML_OPERAND_TYPE);
294*9c48c75eSJung-uk Kim             }
295*9c48c75eSJung-uk Kim             Elements++;
296*9c48c75eSJung-uk Kim         }
297*9c48c75eSJung-uk Kim 
298*9c48c75eSJung-uk Kim         /* Create the new buffer object to replace the Package */
299*9c48c75eSJung-uk Kim 
300*9c48c75eSJung-uk Kim         NewObject = AcpiUtCreateBufferObject (ACPI_MUL_4 (Count));
301*9c48c75eSJung-uk Kim         if (!NewObject)
302*9c48c75eSJung-uk Kim         {
303*9c48c75eSJung-uk Kim             return (AE_NO_MEMORY);
304*9c48c75eSJung-uk Kim         }
305*9c48c75eSJung-uk Kim 
306*9c48c75eSJung-uk Kim         /* Copy the package elements (integers) to the buffer as DWORDs */
307*9c48c75eSJung-uk Kim 
308*9c48c75eSJung-uk Kim         Elements = OriginalObject->Package.Elements;
309*9c48c75eSJung-uk Kim         DwordBuffer = ACPI_CAST_PTR (UINT32, NewObject->Buffer.Pointer);
310*9c48c75eSJung-uk Kim 
311*9c48c75eSJung-uk Kim         for (i = 0; i < Count; i++)
312*9c48c75eSJung-uk Kim         {
313*9c48c75eSJung-uk Kim             *DwordBuffer = (UINT32) (*Elements)->Integer.Value;
314*9c48c75eSJung-uk Kim             DwordBuffer++;
315*9c48c75eSJung-uk Kim             Elements++;
316*9c48c75eSJung-uk Kim         }
317*9c48c75eSJung-uk Kim         break;
318*9c48c75eSJung-uk Kim 
319*9c48c75eSJung-uk Kim     default:
320*9c48c75eSJung-uk Kim         return (AE_AML_OPERAND_TYPE);
321*9c48c75eSJung-uk Kim     }
322*9c48c75eSJung-uk Kim 
323*9c48c75eSJung-uk Kim     *ReturnObject = NewObject;
324*9c48c75eSJung-uk Kim     return (AE_OK);
325*9c48c75eSJung-uk Kim }
326*9c48c75eSJung-uk Kim 
327*9c48c75eSJung-uk Kim 
328*9c48c75eSJung-uk Kim /*******************************************************************************
329*9c48c75eSJung-uk Kim  *
330*9c48c75eSJung-uk Kim  * FUNCTION:    AcpiNsConvertToUnicode
331*9c48c75eSJung-uk Kim  *
332*9c48c75eSJung-uk Kim  * PARAMETERS:  OriginalObject      - ASCII String Object to be converted
333*9c48c75eSJung-uk Kim  *              ReturnObject        - Where the new converted object is returned
334*9c48c75eSJung-uk Kim  *
335*9c48c75eSJung-uk Kim  * RETURN:      Status. AE_OK if conversion was successful.
336*9c48c75eSJung-uk Kim  *
337*9c48c75eSJung-uk Kim  * DESCRIPTION: Attempt to convert a String object to a Unicode string Buffer.
338*9c48c75eSJung-uk Kim  *
339*9c48c75eSJung-uk Kim  ******************************************************************************/
340*9c48c75eSJung-uk Kim 
341*9c48c75eSJung-uk Kim ACPI_STATUS
342*9c48c75eSJung-uk Kim AcpiNsConvertToUnicode (
343*9c48c75eSJung-uk Kim     ACPI_OPERAND_OBJECT     *OriginalObject,
344*9c48c75eSJung-uk Kim     ACPI_OPERAND_OBJECT     **ReturnObject)
345*9c48c75eSJung-uk Kim {
346*9c48c75eSJung-uk Kim     ACPI_OPERAND_OBJECT     *NewObject;
347*9c48c75eSJung-uk Kim     char                    *AsciiString;
348*9c48c75eSJung-uk Kim     UINT16                  *UnicodeBuffer;
349*9c48c75eSJung-uk Kim     UINT32                  UnicodeLength;
350*9c48c75eSJung-uk Kim     UINT32                  i;
351*9c48c75eSJung-uk Kim 
352*9c48c75eSJung-uk Kim 
353*9c48c75eSJung-uk Kim     if (!OriginalObject)
354*9c48c75eSJung-uk Kim     {
355*9c48c75eSJung-uk Kim         return (AE_OK);
356*9c48c75eSJung-uk Kim     }
357*9c48c75eSJung-uk Kim 
358*9c48c75eSJung-uk Kim     /* If a Buffer was returned, it must be at least two bytes long */
359*9c48c75eSJung-uk Kim 
360*9c48c75eSJung-uk Kim     if (OriginalObject->Common.Type == ACPI_TYPE_BUFFER)
361*9c48c75eSJung-uk Kim     {
362*9c48c75eSJung-uk Kim         if (OriginalObject->Buffer.Length < 2)
363*9c48c75eSJung-uk Kim         {
364*9c48c75eSJung-uk Kim             return (AE_AML_OPERAND_VALUE);
365*9c48c75eSJung-uk Kim         }
366*9c48c75eSJung-uk Kim 
367*9c48c75eSJung-uk Kim         *ReturnObject = NULL;
368*9c48c75eSJung-uk Kim         return (AE_OK);
369*9c48c75eSJung-uk Kim     }
370*9c48c75eSJung-uk Kim 
371*9c48c75eSJung-uk Kim     /*
372*9c48c75eSJung-uk Kim      * The original object is an ASCII string. Convert this string to
373*9c48c75eSJung-uk Kim      * a unicode buffer.
374*9c48c75eSJung-uk Kim      */
375*9c48c75eSJung-uk Kim     AsciiString = OriginalObject->String.Pointer;
376*9c48c75eSJung-uk Kim     UnicodeLength = (OriginalObject->String.Length * 2) + 2;
377*9c48c75eSJung-uk Kim 
378*9c48c75eSJung-uk Kim     /* Create a new buffer object for the Unicode data */
379*9c48c75eSJung-uk Kim 
380*9c48c75eSJung-uk Kim     NewObject = AcpiUtCreateBufferObject (UnicodeLength);
381*9c48c75eSJung-uk Kim     if (!NewObject)
382*9c48c75eSJung-uk Kim     {
383*9c48c75eSJung-uk Kim         return (AE_NO_MEMORY);
384*9c48c75eSJung-uk Kim     }
385*9c48c75eSJung-uk Kim 
386*9c48c75eSJung-uk Kim     UnicodeBuffer = ACPI_CAST_PTR (UINT16, NewObject->Buffer.Pointer);
387*9c48c75eSJung-uk Kim 
388*9c48c75eSJung-uk Kim     /* Convert ASCII to Unicode */
389*9c48c75eSJung-uk Kim 
390*9c48c75eSJung-uk Kim     for (i = 0; i < OriginalObject->String.Length; i++)
391*9c48c75eSJung-uk Kim     {
392*9c48c75eSJung-uk Kim         UnicodeBuffer[i] = (UINT16) AsciiString[i];
393*9c48c75eSJung-uk Kim     }
394*9c48c75eSJung-uk Kim 
395*9c48c75eSJung-uk Kim     *ReturnObject = NewObject;
396*9c48c75eSJung-uk Kim     return (AE_OK);
397*9c48c75eSJung-uk Kim }
398*9c48c75eSJung-uk Kim 
399*9c48c75eSJung-uk Kim 
400*9c48c75eSJung-uk Kim /*******************************************************************************
401*9c48c75eSJung-uk Kim  *
402*9c48c75eSJung-uk Kim  * FUNCTION:    AcpiNsConvertToResource
403*9c48c75eSJung-uk Kim  *
404*9c48c75eSJung-uk Kim  * PARAMETERS:  OriginalObject      - Object to be converted
405*9c48c75eSJung-uk Kim  *              ReturnObject        - Where the new converted object is returned
406*9c48c75eSJung-uk Kim  *
407*9c48c75eSJung-uk Kim  * RETURN:      Status. AE_OK if conversion was successful
408*9c48c75eSJung-uk Kim  *
409*9c48c75eSJung-uk Kim  * DESCRIPTION: Attempt to convert a Integer object to a ResourceTemplate
410*9c48c75eSJung-uk Kim  *              Buffer.
411*9c48c75eSJung-uk Kim  *
412*9c48c75eSJung-uk Kim  ******************************************************************************/
413*9c48c75eSJung-uk Kim 
414*9c48c75eSJung-uk Kim ACPI_STATUS
415*9c48c75eSJung-uk Kim AcpiNsConvertToResource (
416*9c48c75eSJung-uk Kim     ACPI_OPERAND_OBJECT     *OriginalObject,
417*9c48c75eSJung-uk Kim     ACPI_OPERAND_OBJECT     **ReturnObject)
418*9c48c75eSJung-uk Kim {
419*9c48c75eSJung-uk Kim     ACPI_OPERAND_OBJECT     *NewObject;
420*9c48c75eSJung-uk Kim     UINT8                   *Buffer;
421*9c48c75eSJung-uk Kim 
422*9c48c75eSJung-uk Kim 
423*9c48c75eSJung-uk Kim     /*
424*9c48c75eSJung-uk Kim      * We can fix the following cases for an expected resource template:
425*9c48c75eSJung-uk Kim      * 1. No return value (interpreter slack mode is disabled)
426*9c48c75eSJung-uk Kim      * 2. A "Return (Zero)" statement
427*9c48c75eSJung-uk Kim      * 3. A "Return empty buffer" statement
428*9c48c75eSJung-uk Kim      *
429*9c48c75eSJung-uk Kim      * We will return a buffer containing a single EndTag
430*9c48c75eSJung-uk Kim      * resource descriptor.
431*9c48c75eSJung-uk Kim      */
432*9c48c75eSJung-uk Kim     if (OriginalObject)
433*9c48c75eSJung-uk Kim     {
434*9c48c75eSJung-uk Kim         switch (OriginalObject->Common.Type)
435*9c48c75eSJung-uk Kim         {
436*9c48c75eSJung-uk Kim         case ACPI_TYPE_INTEGER:
437*9c48c75eSJung-uk Kim 
438*9c48c75eSJung-uk Kim             /* We can only repair an Integer==0 */
439*9c48c75eSJung-uk Kim 
440*9c48c75eSJung-uk Kim             if (OriginalObject->Integer.Value)
441*9c48c75eSJung-uk Kim             {
442*9c48c75eSJung-uk Kim                 return (AE_AML_OPERAND_TYPE);
443*9c48c75eSJung-uk Kim             }
444*9c48c75eSJung-uk Kim             break;
445*9c48c75eSJung-uk Kim 
446*9c48c75eSJung-uk Kim         case ACPI_TYPE_BUFFER:
447*9c48c75eSJung-uk Kim 
448*9c48c75eSJung-uk Kim             if (OriginalObject->Buffer.Length)
449*9c48c75eSJung-uk Kim             {
450*9c48c75eSJung-uk Kim                 /* Additional checks can be added in the future */
451*9c48c75eSJung-uk Kim 
452*9c48c75eSJung-uk Kim                 *ReturnObject = NULL;
453*9c48c75eSJung-uk Kim                 return (AE_OK);
454*9c48c75eSJung-uk Kim             }
455*9c48c75eSJung-uk Kim             break;
456*9c48c75eSJung-uk Kim 
457*9c48c75eSJung-uk Kim         case ACPI_TYPE_STRING:
458*9c48c75eSJung-uk Kim         default:
459*9c48c75eSJung-uk Kim 
460*9c48c75eSJung-uk Kim             return (AE_AML_OPERAND_TYPE);
461*9c48c75eSJung-uk Kim         }
462*9c48c75eSJung-uk Kim     }
463*9c48c75eSJung-uk Kim 
464*9c48c75eSJung-uk Kim     /* Create the new buffer object for the resource descriptor */
465*9c48c75eSJung-uk Kim 
466*9c48c75eSJung-uk Kim     NewObject = AcpiUtCreateBufferObject (2);
467*9c48c75eSJung-uk Kim     if (!NewObject)
468*9c48c75eSJung-uk Kim     {
469*9c48c75eSJung-uk Kim         return (AE_NO_MEMORY);
470*9c48c75eSJung-uk Kim     }
471*9c48c75eSJung-uk Kim 
472*9c48c75eSJung-uk Kim     Buffer = ACPI_CAST_PTR (UINT8, NewObject->Buffer.Pointer);
473*9c48c75eSJung-uk Kim 
474*9c48c75eSJung-uk Kim     /* Initialize the Buffer with a single EndTag descriptor */
475*9c48c75eSJung-uk Kim 
476*9c48c75eSJung-uk Kim     Buffer[0] = (ACPI_RESOURCE_NAME_END_TAG | ASL_RDESC_END_TAG_SIZE);
477*9c48c75eSJung-uk Kim     Buffer[1] = 0x00;
478*9c48c75eSJung-uk Kim 
479*9c48c75eSJung-uk Kim     *ReturnObject = NewObject;
480*9c48c75eSJung-uk Kim     return (AE_OK);
481*9c48c75eSJung-uk Kim }
482