19c48c75eSJung-uk Kim /****************************************************************************** 29c48c75eSJung-uk Kim * 39c48c75eSJung-uk Kim * Module Name: nsconvert - Object conversions for objects returned by 49c48c75eSJung-uk Kim * predefined methods 59c48c75eSJung-uk Kim * 69c48c75eSJung-uk Kim *****************************************************************************/ 79c48c75eSJung-uk Kim 89c48c75eSJung-uk Kim /* 91c0e1b6dSJung-uk Kim * Copyright (C) 2000 - 2015, Intel Corp. 109c48c75eSJung-uk Kim * All rights reserved. 119c48c75eSJung-uk Kim * 129c48c75eSJung-uk Kim * Redistribution and use in source and binary forms, with or without 139c48c75eSJung-uk Kim * modification, are permitted provided that the following conditions 149c48c75eSJung-uk Kim * are met: 159c48c75eSJung-uk Kim * 1. Redistributions of source code must retain the above copyright 169c48c75eSJung-uk Kim * notice, this list of conditions, and the following disclaimer, 179c48c75eSJung-uk Kim * without modification. 189c48c75eSJung-uk Kim * 2. Redistributions in binary form must reproduce at minimum a disclaimer 199c48c75eSJung-uk Kim * substantially similar to the "NO WARRANTY" disclaimer below 209c48c75eSJung-uk Kim * ("Disclaimer") and any redistribution must be conditioned upon 219c48c75eSJung-uk Kim * including a substantially similar Disclaimer requirement for further 229c48c75eSJung-uk Kim * binary redistribution. 239c48c75eSJung-uk Kim * 3. Neither the names of the above-listed copyright holders nor the names 249c48c75eSJung-uk Kim * of any contributors may be used to endorse or promote products derived 259c48c75eSJung-uk Kim * from this software without specific prior written permission. 269c48c75eSJung-uk Kim * 279c48c75eSJung-uk Kim * Alternatively, this software may be distributed under the terms of the 289c48c75eSJung-uk Kim * GNU General Public License ("GPL") version 2 as published by the Free 299c48c75eSJung-uk Kim * Software Foundation. 309c48c75eSJung-uk Kim * 319c48c75eSJung-uk Kim * NO WARRANTY 329c48c75eSJung-uk Kim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 339c48c75eSJung-uk Kim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 349c48c75eSJung-uk Kim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 359c48c75eSJung-uk Kim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 369c48c75eSJung-uk Kim * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 379c48c75eSJung-uk Kim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 389c48c75eSJung-uk Kim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 399c48c75eSJung-uk Kim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 409c48c75eSJung-uk Kim * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 419c48c75eSJung-uk Kim * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 429c48c75eSJung-uk Kim * POSSIBILITY OF SUCH DAMAGES. 439c48c75eSJung-uk Kim */ 449c48c75eSJung-uk Kim 459c48c75eSJung-uk Kim #include <contrib/dev/acpica/include/acpi.h> 469c48c75eSJung-uk Kim #include <contrib/dev/acpica/include/accommon.h> 479c48c75eSJung-uk Kim #include <contrib/dev/acpica/include/acnamesp.h> 489c48c75eSJung-uk Kim #include <contrib/dev/acpica/include/acinterp.h> 499c48c75eSJung-uk Kim #include <contrib/dev/acpica/include/acpredef.h> 509c48c75eSJung-uk Kim #include <contrib/dev/acpica/include/amlresrc.h> 519c48c75eSJung-uk Kim 529c48c75eSJung-uk Kim #define _COMPONENT ACPI_NAMESPACE 539c48c75eSJung-uk Kim ACPI_MODULE_NAME ("nsconvert") 549c48c75eSJung-uk Kim 559c48c75eSJung-uk Kim 569c48c75eSJung-uk Kim /******************************************************************************* 579c48c75eSJung-uk Kim * 589c48c75eSJung-uk Kim * FUNCTION: AcpiNsConvertToInteger 599c48c75eSJung-uk Kim * 609c48c75eSJung-uk Kim * PARAMETERS: OriginalObject - Object to be converted 619c48c75eSJung-uk Kim * ReturnObject - Where the new converted object is returned 629c48c75eSJung-uk Kim * 639c48c75eSJung-uk Kim * RETURN: Status. AE_OK if conversion was successful. 649c48c75eSJung-uk Kim * 659c48c75eSJung-uk Kim * DESCRIPTION: Attempt to convert a String/Buffer object to an Integer. 669c48c75eSJung-uk Kim * 679c48c75eSJung-uk Kim ******************************************************************************/ 689c48c75eSJung-uk Kim 699c48c75eSJung-uk Kim ACPI_STATUS 709c48c75eSJung-uk Kim AcpiNsConvertToInteger ( 719c48c75eSJung-uk Kim ACPI_OPERAND_OBJECT *OriginalObject, 729c48c75eSJung-uk Kim ACPI_OPERAND_OBJECT **ReturnObject) 739c48c75eSJung-uk Kim { 749c48c75eSJung-uk Kim ACPI_OPERAND_OBJECT *NewObject; 759c48c75eSJung-uk Kim ACPI_STATUS Status; 769c48c75eSJung-uk Kim UINT64 Value = 0; 779c48c75eSJung-uk Kim UINT32 i; 789c48c75eSJung-uk Kim 799c48c75eSJung-uk Kim 809c48c75eSJung-uk Kim switch (OriginalObject->Common.Type) 819c48c75eSJung-uk Kim { 829c48c75eSJung-uk Kim case ACPI_TYPE_STRING: 839c48c75eSJung-uk Kim 849c48c75eSJung-uk Kim /* String-to-Integer conversion */ 859c48c75eSJung-uk Kim 869c48c75eSJung-uk Kim Status = AcpiUtStrtoul64 (OriginalObject->String.Pointer, 879c48c75eSJung-uk Kim ACPI_ANY_BASE, &Value); 889c48c75eSJung-uk Kim if (ACPI_FAILURE (Status)) 899c48c75eSJung-uk Kim { 909c48c75eSJung-uk Kim return (Status); 919c48c75eSJung-uk Kim } 929c48c75eSJung-uk Kim break; 939c48c75eSJung-uk Kim 949c48c75eSJung-uk Kim case ACPI_TYPE_BUFFER: 959c48c75eSJung-uk Kim 969c48c75eSJung-uk Kim /* Buffer-to-Integer conversion. Max buffer size is 64 bits. */ 979c48c75eSJung-uk Kim 989c48c75eSJung-uk Kim if (OriginalObject->Buffer.Length > 8) 999c48c75eSJung-uk Kim { 1009c48c75eSJung-uk Kim return (AE_AML_OPERAND_TYPE); 1019c48c75eSJung-uk Kim } 1029c48c75eSJung-uk Kim 1039c48c75eSJung-uk Kim /* Extract each buffer byte to create the integer */ 1049c48c75eSJung-uk Kim 1059c48c75eSJung-uk Kim for (i = 0; i < OriginalObject->Buffer.Length; i++) 1069c48c75eSJung-uk Kim { 1079c48c75eSJung-uk Kim Value |= ((UINT64) OriginalObject->Buffer.Pointer[i] << (i * 8)); 1089c48c75eSJung-uk Kim } 1099c48c75eSJung-uk Kim break; 1109c48c75eSJung-uk Kim 1119c48c75eSJung-uk Kim default: 112a9d8d09cSJung-uk Kim 1139c48c75eSJung-uk Kim return (AE_AML_OPERAND_TYPE); 1149c48c75eSJung-uk Kim } 1159c48c75eSJung-uk Kim 1169c48c75eSJung-uk Kim NewObject = AcpiUtCreateIntegerObject (Value); 1179c48c75eSJung-uk Kim if (!NewObject) 1189c48c75eSJung-uk Kim { 1199c48c75eSJung-uk Kim return (AE_NO_MEMORY); 1209c48c75eSJung-uk Kim } 1219c48c75eSJung-uk Kim 1229c48c75eSJung-uk Kim *ReturnObject = NewObject; 1239c48c75eSJung-uk Kim return (AE_OK); 1249c48c75eSJung-uk Kim } 1259c48c75eSJung-uk Kim 1269c48c75eSJung-uk Kim 1279c48c75eSJung-uk Kim /******************************************************************************* 1289c48c75eSJung-uk Kim * 1299c48c75eSJung-uk Kim * FUNCTION: AcpiNsConvertToString 1309c48c75eSJung-uk Kim * 1319c48c75eSJung-uk Kim * PARAMETERS: OriginalObject - Object to be converted 1329c48c75eSJung-uk Kim * ReturnObject - Where the new converted object is returned 1339c48c75eSJung-uk Kim * 1349c48c75eSJung-uk Kim * RETURN: Status. AE_OK if conversion was successful. 1359c48c75eSJung-uk Kim * 1369c48c75eSJung-uk Kim * DESCRIPTION: Attempt to convert a Integer/Buffer object to a String. 1379c48c75eSJung-uk Kim * 1389c48c75eSJung-uk Kim ******************************************************************************/ 1399c48c75eSJung-uk Kim 1409c48c75eSJung-uk Kim ACPI_STATUS 1419c48c75eSJung-uk Kim AcpiNsConvertToString ( 1429c48c75eSJung-uk Kim ACPI_OPERAND_OBJECT *OriginalObject, 1439c48c75eSJung-uk Kim ACPI_OPERAND_OBJECT **ReturnObject) 1449c48c75eSJung-uk Kim { 1459c48c75eSJung-uk Kim ACPI_OPERAND_OBJECT *NewObject; 1469c48c75eSJung-uk Kim ACPI_SIZE Length; 1479c48c75eSJung-uk Kim ACPI_STATUS Status; 1489c48c75eSJung-uk Kim 1499c48c75eSJung-uk Kim 1509c48c75eSJung-uk Kim switch (OriginalObject->Common.Type) 1519c48c75eSJung-uk Kim { 1529c48c75eSJung-uk Kim case ACPI_TYPE_INTEGER: 1539c48c75eSJung-uk Kim /* 1549c48c75eSJung-uk Kim * Integer-to-String conversion. Commonly, convert 1559c48c75eSJung-uk Kim * an integer of value 0 to a NULL string. The last element of 1569c48c75eSJung-uk Kim * _BIF and _BIX packages occasionally need this fix. 1579c48c75eSJung-uk Kim */ 1589c48c75eSJung-uk Kim if (OriginalObject->Integer.Value == 0) 1599c48c75eSJung-uk Kim { 1609c48c75eSJung-uk Kim /* Allocate a new NULL string object */ 1619c48c75eSJung-uk Kim 1629c48c75eSJung-uk Kim NewObject = AcpiUtCreateStringObject (0); 1639c48c75eSJung-uk Kim if (!NewObject) 1649c48c75eSJung-uk Kim { 1659c48c75eSJung-uk Kim return (AE_NO_MEMORY); 1669c48c75eSJung-uk Kim } 1679c48c75eSJung-uk Kim } 1689c48c75eSJung-uk Kim else 1699c48c75eSJung-uk Kim { 1709c48c75eSJung-uk Kim Status = AcpiExConvertToString (OriginalObject, &NewObject, 1719c48c75eSJung-uk Kim ACPI_IMPLICIT_CONVERT_HEX); 1729c48c75eSJung-uk Kim if (ACPI_FAILURE (Status)) 1739c48c75eSJung-uk Kim { 1749c48c75eSJung-uk Kim return (Status); 1759c48c75eSJung-uk Kim } 1769c48c75eSJung-uk Kim } 1779c48c75eSJung-uk Kim break; 1789c48c75eSJung-uk Kim 1799c48c75eSJung-uk Kim case ACPI_TYPE_BUFFER: 1809c48c75eSJung-uk Kim /* 1819c48c75eSJung-uk Kim * Buffer-to-String conversion. Use a ToString 1829c48c75eSJung-uk Kim * conversion, no transform performed on the buffer data. The best 1839c48c75eSJung-uk Kim * example of this is the _BIF method, where the string data from 1849c48c75eSJung-uk Kim * the battery is often (incorrectly) returned as buffer object(s). 1859c48c75eSJung-uk Kim */ 1869c48c75eSJung-uk Kim Length = 0; 1879c48c75eSJung-uk Kim while ((Length < OriginalObject->Buffer.Length) && 1889c48c75eSJung-uk Kim (OriginalObject->Buffer.Pointer[Length])) 1899c48c75eSJung-uk Kim { 1909c48c75eSJung-uk Kim Length++; 1919c48c75eSJung-uk Kim } 1929c48c75eSJung-uk Kim 1939c48c75eSJung-uk Kim /* Allocate a new string object */ 1949c48c75eSJung-uk Kim 1959c48c75eSJung-uk Kim NewObject = AcpiUtCreateStringObject (Length); 1969c48c75eSJung-uk Kim if (!NewObject) 1979c48c75eSJung-uk Kim { 1989c48c75eSJung-uk Kim return (AE_NO_MEMORY); 1999c48c75eSJung-uk Kim } 2009c48c75eSJung-uk Kim 2019c48c75eSJung-uk Kim /* 2029c48c75eSJung-uk Kim * Copy the raw buffer data with no transform. String is already NULL 2039c48c75eSJung-uk Kim * terminated at Length+1. 2049c48c75eSJung-uk Kim */ 205*5ef50723SJung-uk Kim memcpy (NewObject->String.Pointer, 2069c48c75eSJung-uk Kim OriginalObject->Buffer.Pointer, Length); 2079c48c75eSJung-uk Kim break; 2089c48c75eSJung-uk Kim 2099c48c75eSJung-uk Kim default: 210a9d8d09cSJung-uk Kim 2119c48c75eSJung-uk Kim return (AE_AML_OPERAND_TYPE); 2129c48c75eSJung-uk Kim } 2139c48c75eSJung-uk Kim 2149c48c75eSJung-uk Kim *ReturnObject = NewObject; 2159c48c75eSJung-uk Kim return (AE_OK); 2169c48c75eSJung-uk Kim } 2179c48c75eSJung-uk Kim 2189c48c75eSJung-uk Kim 2199c48c75eSJung-uk Kim /******************************************************************************* 2209c48c75eSJung-uk Kim * 2219c48c75eSJung-uk Kim * FUNCTION: AcpiNsConvertToBuffer 2229c48c75eSJung-uk Kim * 2239c48c75eSJung-uk Kim * PARAMETERS: OriginalObject - Object to be converted 2249c48c75eSJung-uk Kim * ReturnObject - Where the new converted object is returned 2259c48c75eSJung-uk Kim * 2269c48c75eSJung-uk Kim * RETURN: Status. AE_OK if conversion was successful. 2279c48c75eSJung-uk Kim * 2289c48c75eSJung-uk Kim * DESCRIPTION: Attempt to convert a Integer/String/Package object to a Buffer. 2299c48c75eSJung-uk Kim * 2309c48c75eSJung-uk Kim ******************************************************************************/ 2319c48c75eSJung-uk Kim 2329c48c75eSJung-uk Kim ACPI_STATUS 2339c48c75eSJung-uk Kim AcpiNsConvertToBuffer ( 2349c48c75eSJung-uk Kim ACPI_OPERAND_OBJECT *OriginalObject, 2359c48c75eSJung-uk Kim ACPI_OPERAND_OBJECT **ReturnObject) 2369c48c75eSJung-uk Kim { 2379c48c75eSJung-uk Kim ACPI_OPERAND_OBJECT *NewObject; 2389c48c75eSJung-uk Kim ACPI_STATUS Status; 2399c48c75eSJung-uk Kim ACPI_OPERAND_OBJECT **Elements; 2409c48c75eSJung-uk Kim UINT32 *DwordBuffer; 2419c48c75eSJung-uk Kim UINT32 Count; 2429c48c75eSJung-uk Kim UINT32 i; 2439c48c75eSJung-uk Kim 2449c48c75eSJung-uk Kim 2459c48c75eSJung-uk Kim switch (OriginalObject->Common.Type) 2469c48c75eSJung-uk Kim { 2479c48c75eSJung-uk Kim case ACPI_TYPE_INTEGER: 2489c48c75eSJung-uk Kim /* 2499c48c75eSJung-uk Kim * Integer-to-Buffer conversion. 2509c48c75eSJung-uk Kim * Convert the Integer to a packed-byte buffer. _MAT and other 2519c48c75eSJung-uk Kim * objects need this sometimes, if a read has been performed on a 2529c48c75eSJung-uk Kim * Field object that is less than or equal to the global integer 2539c48c75eSJung-uk Kim * size (32 or 64 bits). 2549c48c75eSJung-uk Kim */ 2559c48c75eSJung-uk Kim Status = AcpiExConvertToBuffer (OriginalObject, &NewObject); 2569c48c75eSJung-uk Kim if (ACPI_FAILURE (Status)) 2579c48c75eSJung-uk Kim { 2589c48c75eSJung-uk Kim return (Status); 2599c48c75eSJung-uk Kim } 2609c48c75eSJung-uk Kim break; 2619c48c75eSJung-uk Kim 2629c48c75eSJung-uk Kim case ACPI_TYPE_STRING: 2639c48c75eSJung-uk Kim 2649c48c75eSJung-uk Kim /* String-to-Buffer conversion. Simple data copy */ 2659c48c75eSJung-uk Kim 2669c48c75eSJung-uk Kim NewObject = AcpiUtCreateBufferObject (OriginalObject->String.Length); 2679c48c75eSJung-uk Kim if (!NewObject) 2689c48c75eSJung-uk Kim { 2699c48c75eSJung-uk Kim return (AE_NO_MEMORY); 2709c48c75eSJung-uk Kim } 2719c48c75eSJung-uk Kim 272*5ef50723SJung-uk Kim memcpy (NewObject->Buffer.Pointer, 2739c48c75eSJung-uk Kim OriginalObject->String.Pointer, OriginalObject->String.Length); 2749c48c75eSJung-uk Kim break; 2759c48c75eSJung-uk Kim 2769c48c75eSJung-uk Kim case ACPI_TYPE_PACKAGE: 2779c48c75eSJung-uk Kim /* 2789c48c75eSJung-uk Kim * This case is often seen for predefined names that must return a 2799c48c75eSJung-uk Kim * Buffer object with multiple DWORD integers within. For example, 2809c48c75eSJung-uk Kim * _FDE and _GTM. The Package can be converted to a Buffer. 2819c48c75eSJung-uk Kim */ 2829c48c75eSJung-uk Kim 2839c48c75eSJung-uk Kim /* All elements of the Package must be integers */ 2849c48c75eSJung-uk Kim 2859c48c75eSJung-uk Kim Elements = OriginalObject->Package.Elements; 2869c48c75eSJung-uk Kim Count = OriginalObject->Package.Count; 2879c48c75eSJung-uk Kim 2889c48c75eSJung-uk Kim for (i = 0; i < Count; i++) 2899c48c75eSJung-uk Kim { 2909c48c75eSJung-uk Kim if ((!*Elements) || 2919c48c75eSJung-uk Kim ((*Elements)->Common.Type != ACPI_TYPE_INTEGER)) 2929c48c75eSJung-uk Kim { 2939c48c75eSJung-uk Kim return (AE_AML_OPERAND_TYPE); 2949c48c75eSJung-uk Kim } 2959c48c75eSJung-uk Kim Elements++; 2969c48c75eSJung-uk Kim } 2979c48c75eSJung-uk Kim 2989c48c75eSJung-uk Kim /* Create the new buffer object to replace the Package */ 2999c48c75eSJung-uk Kim 3009c48c75eSJung-uk Kim NewObject = AcpiUtCreateBufferObject (ACPI_MUL_4 (Count)); 3019c48c75eSJung-uk Kim if (!NewObject) 3029c48c75eSJung-uk Kim { 3039c48c75eSJung-uk Kim return (AE_NO_MEMORY); 3049c48c75eSJung-uk Kim } 3059c48c75eSJung-uk Kim 3069c48c75eSJung-uk Kim /* Copy the package elements (integers) to the buffer as DWORDs */ 3079c48c75eSJung-uk Kim 3089c48c75eSJung-uk Kim Elements = OriginalObject->Package.Elements; 3099c48c75eSJung-uk Kim DwordBuffer = ACPI_CAST_PTR (UINT32, NewObject->Buffer.Pointer); 3109c48c75eSJung-uk Kim 3119c48c75eSJung-uk Kim for (i = 0; i < Count; i++) 3129c48c75eSJung-uk Kim { 3139c48c75eSJung-uk Kim *DwordBuffer = (UINT32) (*Elements)->Integer.Value; 3149c48c75eSJung-uk Kim DwordBuffer++; 3159c48c75eSJung-uk Kim Elements++; 3169c48c75eSJung-uk Kim } 3179c48c75eSJung-uk Kim break; 3189c48c75eSJung-uk Kim 3199c48c75eSJung-uk Kim default: 320a9d8d09cSJung-uk Kim 3219c48c75eSJung-uk Kim return (AE_AML_OPERAND_TYPE); 3229c48c75eSJung-uk Kim } 3239c48c75eSJung-uk Kim 3249c48c75eSJung-uk Kim *ReturnObject = NewObject; 3259c48c75eSJung-uk Kim return (AE_OK); 3269c48c75eSJung-uk Kim } 3279c48c75eSJung-uk Kim 3289c48c75eSJung-uk Kim 3299c48c75eSJung-uk Kim /******************************************************************************* 3309c48c75eSJung-uk Kim * 3319c48c75eSJung-uk Kim * FUNCTION: AcpiNsConvertToUnicode 3329c48c75eSJung-uk Kim * 3339c48c75eSJung-uk Kim * PARAMETERS: OriginalObject - ASCII String Object to be converted 3349c48c75eSJung-uk Kim * ReturnObject - Where the new converted object is returned 3359c48c75eSJung-uk Kim * 3369c48c75eSJung-uk Kim * RETURN: Status. AE_OK if conversion was successful. 3379c48c75eSJung-uk Kim * 3389c48c75eSJung-uk Kim * DESCRIPTION: Attempt to convert a String object to a Unicode string Buffer. 3399c48c75eSJung-uk Kim * 3409c48c75eSJung-uk Kim ******************************************************************************/ 3419c48c75eSJung-uk Kim 3429c48c75eSJung-uk Kim ACPI_STATUS 3439c48c75eSJung-uk Kim AcpiNsConvertToUnicode ( 3449c48c75eSJung-uk Kim ACPI_OPERAND_OBJECT *OriginalObject, 3459c48c75eSJung-uk Kim ACPI_OPERAND_OBJECT **ReturnObject) 3469c48c75eSJung-uk Kim { 3479c48c75eSJung-uk Kim ACPI_OPERAND_OBJECT *NewObject; 3489c48c75eSJung-uk Kim char *AsciiString; 3499c48c75eSJung-uk Kim UINT16 *UnicodeBuffer; 3509c48c75eSJung-uk Kim UINT32 UnicodeLength; 3519c48c75eSJung-uk Kim UINT32 i; 3529c48c75eSJung-uk Kim 3539c48c75eSJung-uk Kim 3549c48c75eSJung-uk Kim if (!OriginalObject) 3559c48c75eSJung-uk Kim { 3569c48c75eSJung-uk Kim return (AE_OK); 3579c48c75eSJung-uk Kim } 3589c48c75eSJung-uk Kim 3599c48c75eSJung-uk Kim /* If a Buffer was returned, it must be at least two bytes long */ 3609c48c75eSJung-uk Kim 3619c48c75eSJung-uk Kim if (OriginalObject->Common.Type == ACPI_TYPE_BUFFER) 3629c48c75eSJung-uk Kim { 3639c48c75eSJung-uk Kim if (OriginalObject->Buffer.Length < 2) 3649c48c75eSJung-uk Kim { 3659c48c75eSJung-uk Kim return (AE_AML_OPERAND_VALUE); 3669c48c75eSJung-uk Kim } 3679c48c75eSJung-uk Kim 3689c48c75eSJung-uk Kim *ReturnObject = NULL; 3699c48c75eSJung-uk Kim return (AE_OK); 3709c48c75eSJung-uk Kim } 3719c48c75eSJung-uk Kim 3729c48c75eSJung-uk Kim /* 3739c48c75eSJung-uk Kim * The original object is an ASCII string. Convert this string to 3749c48c75eSJung-uk Kim * a unicode buffer. 3759c48c75eSJung-uk Kim */ 3769c48c75eSJung-uk Kim AsciiString = OriginalObject->String.Pointer; 3779c48c75eSJung-uk Kim UnicodeLength = (OriginalObject->String.Length * 2) + 2; 3789c48c75eSJung-uk Kim 3799c48c75eSJung-uk Kim /* Create a new buffer object for the Unicode data */ 3809c48c75eSJung-uk Kim 3819c48c75eSJung-uk Kim NewObject = AcpiUtCreateBufferObject (UnicodeLength); 3829c48c75eSJung-uk Kim if (!NewObject) 3839c48c75eSJung-uk Kim { 3849c48c75eSJung-uk Kim return (AE_NO_MEMORY); 3859c48c75eSJung-uk Kim } 3869c48c75eSJung-uk Kim 3879c48c75eSJung-uk Kim UnicodeBuffer = ACPI_CAST_PTR (UINT16, NewObject->Buffer.Pointer); 3889c48c75eSJung-uk Kim 3899c48c75eSJung-uk Kim /* Convert ASCII to Unicode */ 3909c48c75eSJung-uk Kim 3919c48c75eSJung-uk Kim for (i = 0; i < OriginalObject->String.Length; i++) 3929c48c75eSJung-uk Kim { 3939c48c75eSJung-uk Kim UnicodeBuffer[i] = (UINT16) AsciiString[i]; 3949c48c75eSJung-uk Kim } 3959c48c75eSJung-uk Kim 3969c48c75eSJung-uk Kim *ReturnObject = NewObject; 3979c48c75eSJung-uk Kim return (AE_OK); 3989c48c75eSJung-uk Kim } 3999c48c75eSJung-uk Kim 4009c48c75eSJung-uk Kim 4019c48c75eSJung-uk Kim /******************************************************************************* 4029c48c75eSJung-uk Kim * 4039c48c75eSJung-uk Kim * FUNCTION: AcpiNsConvertToResource 4049c48c75eSJung-uk Kim * 4059c48c75eSJung-uk Kim * PARAMETERS: OriginalObject - Object to be converted 4069c48c75eSJung-uk Kim * ReturnObject - Where the new converted object is returned 4079c48c75eSJung-uk Kim * 4089c48c75eSJung-uk Kim * RETURN: Status. AE_OK if conversion was successful 4099c48c75eSJung-uk Kim * 4109c48c75eSJung-uk Kim * DESCRIPTION: Attempt to convert a Integer object to a ResourceTemplate 4119c48c75eSJung-uk Kim * Buffer. 4129c48c75eSJung-uk Kim * 4139c48c75eSJung-uk Kim ******************************************************************************/ 4149c48c75eSJung-uk Kim 4159c48c75eSJung-uk Kim ACPI_STATUS 4169c48c75eSJung-uk Kim AcpiNsConvertToResource ( 4179c48c75eSJung-uk Kim ACPI_OPERAND_OBJECT *OriginalObject, 4189c48c75eSJung-uk Kim ACPI_OPERAND_OBJECT **ReturnObject) 4199c48c75eSJung-uk Kim { 4209c48c75eSJung-uk Kim ACPI_OPERAND_OBJECT *NewObject; 4219c48c75eSJung-uk Kim UINT8 *Buffer; 4229c48c75eSJung-uk Kim 4239c48c75eSJung-uk Kim 4249c48c75eSJung-uk Kim /* 4259c48c75eSJung-uk Kim * We can fix the following cases for an expected resource template: 4269c48c75eSJung-uk Kim * 1. No return value (interpreter slack mode is disabled) 4279c48c75eSJung-uk Kim * 2. A "Return (Zero)" statement 4289c48c75eSJung-uk Kim * 3. A "Return empty buffer" statement 4299c48c75eSJung-uk Kim * 4309c48c75eSJung-uk Kim * We will return a buffer containing a single EndTag 4319c48c75eSJung-uk Kim * resource descriptor. 4329c48c75eSJung-uk Kim */ 4339c48c75eSJung-uk Kim if (OriginalObject) 4349c48c75eSJung-uk Kim { 4359c48c75eSJung-uk Kim switch (OriginalObject->Common.Type) 4369c48c75eSJung-uk Kim { 4379c48c75eSJung-uk Kim case ACPI_TYPE_INTEGER: 4389c48c75eSJung-uk Kim 4399c48c75eSJung-uk Kim /* We can only repair an Integer==0 */ 4409c48c75eSJung-uk Kim 4419c48c75eSJung-uk Kim if (OriginalObject->Integer.Value) 4429c48c75eSJung-uk Kim { 4439c48c75eSJung-uk Kim return (AE_AML_OPERAND_TYPE); 4449c48c75eSJung-uk Kim } 4459c48c75eSJung-uk Kim break; 4469c48c75eSJung-uk Kim 4479c48c75eSJung-uk Kim case ACPI_TYPE_BUFFER: 4489c48c75eSJung-uk Kim 4499c48c75eSJung-uk Kim if (OriginalObject->Buffer.Length) 4509c48c75eSJung-uk Kim { 4519c48c75eSJung-uk Kim /* Additional checks can be added in the future */ 4529c48c75eSJung-uk Kim 4539c48c75eSJung-uk Kim *ReturnObject = NULL; 4549c48c75eSJung-uk Kim return (AE_OK); 4559c48c75eSJung-uk Kim } 4569c48c75eSJung-uk Kim break; 4579c48c75eSJung-uk Kim 4589c48c75eSJung-uk Kim case ACPI_TYPE_STRING: 4599c48c75eSJung-uk Kim default: 4609c48c75eSJung-uk Kim 4619c48c75eSJung-uk Kim return (AE_AML_OPERAND_TYPE); 4629c48c75eSJung-uk Kim } 4639c48c75eSJung-uk Kim } 4649c48c75eSJung-uk Kim 4659c48c75eSJung-uk Kim /* Create the new buffer object for the resource descriptor */ 4669c48c75eSJung-uk Kim 4679c48c75eSJung-uk Kim NewObject = AcpiUtCreateBufferObject (2); 4689c48c75eSJung-uk Kim if (!NewObject) 4699c48c75eSJung-uk Kim { 4709c48c75eSJung-uk Kim return (AE_NO_MEMORY); 4719c48c75eSJung-uk Kim } 4729c48c75eSJung-uk Kim 4739c48c75eSJung-uk Kim Buffer = ACPI_CAST_PTR (UINT8, NewObject->Buffer.Pointer); 4749c48c75eSJung-uk Kim 4759c48c75eSJung-uk Kim /* Initialize the Buffer with a single EndTag descriptor */ 4769c48c75eSJung-uk Kim 4779c48c75eSJung-uk Kim Buffer[0] = (ACPI_RESOURCE_NAME_END_TAG | ASL_RDESC_END_TAG_SIZE); 4789c48c75eSJung-uk Kim Buffer[1] = 0x00; 4799c48c75eSJung-uk Kim 4809c48c75eSJung-uk Kim *ReturnObject = NewObject; 4819c48c75eSJung-uk Kim return (AE_OK); 4829c48c75eSJung-uk Kim } 483