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 /* 99c48c75eSJung-uk Kim * Copyright (C) 2000 - 2013, 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 #define __NSCONVERT_C__ 469c48c75eSJung-uk Kim 479c48c75eSJung-uk Kim #include <contrib/dev/acpica/include/acpi.h> 489c48c75eSJung-uk Kim #include <contrib/dev/acpica/include/accommon.h> 499c48c75eSJung-uk Kim #include <contrib/dev/acpica/include/acnamesp.h> 509c48c75eSJung-uk Kim #include <contrib/dev/acpica/include/acinterp.h> 519c48c75eSJung-uk Kim #include <contrib/dev/acpica/include/acpredef.h> 529c48c75eSJung-uk Kim #include <contrib/dev/acpica/include/amlresrc.h> 539c48c75eSJung-uk Kim 549c48c75eSJung-uk Kim #define _COMPONENT ACPI_NAMESPACE 559c48c75eSJung-uk Kim ACPI_MODULE_NAME ("nsconvert") 569c48c75eSJung-uk Kim 579c48c75eSJung-uk Kim 589c48c75eSJung-uk Kim /******************************************************************************* 599c48c75eSJung-uk Kim * 609c48c75eSJung-uk Kim * FUNCTION: AcpiNsConvertToInteger 619c48c75eSJung-uk Kim * 629c48c75eSJung-uk Kim * PARAMETERS: OriginalObject - Object to be converted 639c48c75eSJung-uk Kim * ReturnObject - Where the new converted object is returned 649c48c75eSJung-uk Kim * 659c48c75eSJung-uk Kim * RETURN: Status. AE_OK if conversion was successful. 669c48c75eSJung-uk Kim * 679c48c75eSJung-uk Kim * DESCRIPTION: Attempt to convert a String/Buffer object to an Integer. 689c48c75eSJung-uk Kim * 699c48c75eSJung-uk Kim ******************************************************************************/ 709c48c75eSJung-uk Kim 719c48c75eSJung-uk Kim ACPI_STATUS 729c48c75eSJung-uk Kim AcpiNsConvertToInteger ( 739c48c75eSJung-uk Kim ACPI_OPERAND_OBJECT *OriginalObject, 749c48c75eSJung-uk Kim ACPI_OPERAND_OBJECT **ReturnObject) 759c48c75eSJung-uk Kim { 769c48c75eSJung-uk Kim ACPI_OPERAND_OBJECT *NewObject; 779c48c75eSJung-uk Kim ACPI_STATUS Status; 789c48c75eSJung-uk Kim UINT64 Value = 0; 799c48c75eSJung-uk Kim UINT32 i; 809c48c75eSJung-uk Kim 819c48c75eSJung-uk Kim 829c48c75eSJung-uk Kim switch (OriginalObject->Common.Type) 839c48c75eSJung-uk Kim { 849c48c75eSJung-uk Kim case ACPI_TYPE_STRING: 859c48c75eSJung-uk Kim 869c48c75eSJung-uk Kim /* String-to-Integer conversion */ 879c48c75eSJung-uk Kim 889c48c75eSJung-uk Kim Status = AcpiUtStrtoul64 (OriginalObject->String.Pointer, 899c48c75eSJung-uk Kim ACPI_ANY_BASE, &Value); 909c48c75eSJung-uk Kim if (ACPI_FAILURE (Status)) 919c48c75eSJung-uk Kim { 929c48c75eSJung-uk Kim return (Status); 939c48c75eSJung-uk Kim } 949c48c75eSJung-uk Kim break; 959c48c75eSJung-uk Kim 969c48c75eSJung-uk Kim case ACPI_TYPE_BUFFER: 979c48c75eSJung-uk Kim 989c48c75eSJung-uk Kim /* Buffer-to-Integer conversion. Max buffer size is 64 bits. */ 999c48c75eSJung-uk Kim 1009c48c75eSJung-uk Kim if (OriginalObject->Buffer.Length > 8) 1019c48c75eSJung-uk Kim { 1029c48c75eSJung-uk Kim return (AE_AML_OPERAND_TYPE); 1039c48c75eSJung-uk Kim } 1049c48c75eSJung-uk Kim 1059c48c75eSJung-uk Kim /* Extract each buffer byte to create the integer */ 1069c48c75eSJung-uk Kim 1079c48c75eSJung-uk Kim for (i = 0; i < OriginalObject->Buffer.Length; i++) 1089c48c75eSJung-uk Kim { 1099c48c75eSJung-uk Kim Value |= ((UINT64) OriginalObject->Buffer.Pointer[i] << (i * 8)); 1109c48c75eSJung-uk Kim } 1119c48c75eSJung-uk Kim break; 1129c48c75eSJung-uk Kim 1139c48c75eSJung-uk Kim default: 114*a9d8d09cSJung-uk Kim 1159c48c75eSJung-uk Kim return (AE_AML_OPERAND_TYPE); 1169c48c75eSJung-uk Kim } 1179c48c75eSJung-uk Kim 1189c48c75eSJung-uk Kim NewObject = AcpiUtCreateIntegerObject (Value); 1199c48c75eSJung-uk Kim if (!NewObject) 1209c48c75eSJung-uk Kim { 1219c48c75eSJung-uk Kim return (AE_NO_MEMORY); 1229c48c75eSJung-uk Kim } 1239c48c75eSJung-uk Kim 1249c48c75eSJung-uk Kim *ReturnObject = NewObject; 1259c48c75eSJung-uk Kim return (AE_OK); 1269c48c75eSJung-uk Kim } 1279c48c75eSJung-uk Kim 1289c48c75eSJung-uk Kim 1299c48c75eSJung-uk Kim /******************************************************************************* 1309c48c75eSJung-uk Kim * 1319c48c75eSJung-uk Kim * FUNCTION: AcpiNsConvertToString 1329c48c75eSJung-uk Kim * 1339c48c75eSJung-uk Kim * PARAMETERS: OriginalObject - Object to be converted 1349c48c75eSJung-uk Kim * ReturnObject - Where the new converted object is returned 1359c48c75eSJung-uk Kim * 1369c48c75eSJung-uk Kim * RETURN: Status. AE_OK if conversion was successful. 1379c48c75eSJung-uk Kim * 1389c48c75eSJung-uk Kim * DESCRIPTION: Attempt to convert a Integer/Buffer object to a String. 1399c48c75eSJung-uk Kim * 1409c48c75eSJung-uk Kim ******************************************************************************/ 1419c48c75eSJung-uk Kim 1429c48c75eSJung-uk Kim ACPI_STATUS 1439c48c75eSJung-uk Kim AcpiNsConvertToString ( 1449c48c75eSJung-uk Kim ACPI_OPERAND_OBJECT *OriginalObject, 1459c48c75eSJung-uk Kim ACPI_OPERAND_OBJECT **ReturnObject) 1469c48c75eSJung-uk Kim { 1479c48c75eSJung-uk Kim ACPI_OPERAND_OBJECT *NewObject; 1489c48c75eSJung-uk Kim ACPI_SIZE Length; 1499c48c75eSJung-uk Kim ACPI_STATUS Status; 1509c48c75eSJung-uk Kim 1519c48c75eSJung-uk Kim 1529c48c75eSJung-uk Kim switch (OriginalObject->Common.Type) 1539c48c75eSJung-uk Kim { 1549c48c75eSJung-uk Kim case ACPI_TYPE_INTEGER: 1559c48c75eSJung-uk Kim /* 1569c48c75eSJung-uk Kim * Integer-to-String conversion. Commonly, convert 1579c48c75eSJung-uk Kim * an integer of value 0 to a NULL string. The last element of 1589c48c75eSJung-uk Kim * _BIF and _BIX packages occasionally need this fix. 1599c48c75eSJung-uk Kim */ 1609c48c75eSJung-uk Kim if (OriginalObject->Integer.Value == 0) 1619c48c75eSJung-uk Kim { 1629c48c75eSJung-uk Kim /* Allocate a new NULL string object */ 1639c48c75eSJung-uk Kim 1649c48c75eSJung-uk Kim NewObject = AcpiUtCreateStringObject (0); 1659c48c75eSJung-uk Kim if (!NewObject) 1669c48c75eSJung-uk Kim { 1679c48c75eSJung-uk Kim return (AE_NO_MEMORY); 1689c48c75eSJung-uk Kim } 1699c48c75eSJung-uk Kim } 1709c48c75eSJung-uk Kim else 1719c48c75eSJung-uk Kim { 1729c48c75eSJung-uk Kim Status = AcpiExConvertToString (OriginalObject, &NewObject, 1739c48c75eSJung-uk Kim ACPI_IMPLICIT_CONVERT_HEX); 1749c48c75eSJung-uk Kim if (ACPI_FAILURE (Status)) 1759c48c75eSJung-uk Kim { 1769c48c75eSJung-uk Kim return (Status); 1779c48c75eSJung-uk Kim } 1789c48c75eSJung-uk Kim } 1799c48c75eSJung-uk Kim break; 1809c48c75eSJung-uk Kim 1819c48c75eSJung-uk Kim case ACPI_TYPE_BUFFER: 1829c48c75eSJung-uk Kim /* 1839c48c75eSJung-uk Kim * Buffer-to-String conversion. Use a ToString 1849c48c75eSJung-uk Kim * conversion, no transform performed on the buffer data. The best 1859c48c75eSJung-uk Kim * example of this is the _BIF method, where the string data from 1869c48c75eSJung-uk Kim * the battery is often (incorrectly) returned as buffer object(s). 1879c48c75eSJung-uk Kim */ 1889c48c75eSJung-uk Kim Length = 0; 1899c48c75eSJung-uk Kim while ((Length < OriginalObject->Buffer.Length) && 1909c48c75eSJung-uk Kim (OriginalObject->Buffer.Pointer[Length])) 1919c48c75eSJung-uk Kim { 1929c48c75eSJung-uk Kim Length++; 1939c48c75eSJung-uk Kim } 1949c48c75eSJung-uk Kim 1959c48c75eSJung-uk Kim /* Allocate a new string object */ 1969c48c75eSJung-uk Kim 1979c48c75eSJung-uk Kim NewObject = AcpiUtCreateStringObject (Length); 1989c48c75eSJung-uk Kim if (!NewObject) 1999c48c75eSJung-uk Kim { 2009c48c75eSJung-uk Kim return (AE_NO_MEMORY); 2019c48c75eSJung-uk Kim } 2029c48c75eSJung-uk Kim 2039c48c75eSJung-uk Kim /* 2049c48c75eSJung-uk Kim * Copy the raw buffer data with no transform. String is already NULL 2059c48c75eSJung-uk Kim * terminated at Length+1. 2069c48c75eSJung-uk Kim */ 2079c48c75eSJung-uk Kim ACPI_MEMCPY (NewObject->String.Pointer, 2089c48c75eSJung-uk Kim OriginalObject->Buffer.Pointer, Length); 2099c48c75eSJung-uk Kim break; 2109c48c75eSJung-uk Kim 2119c48c75eSJung-uk Kim default: 212*a9d8d09cSJung-uk Kim 2139c48c75eSJung-uk Kim return (AE_AML_OPERAND_TYPE); 2149c48c75eSJung-uk Kim } 2159c48c75eSJung-uk Kim 2169c48c75eSJung-uk Kim *ReturnObject = NewObject; 2179c48c75eSJung-uk Kim return (AE_OK); 2189c48c75eSJung-uk Kim } 2199c48c75eSJung-uk Kim 2209c48c75eSJung-uk Kim 2219c48c75eSJung-uk Kim /******************************************************************************* 2229c48c75eSJung-uk Kim * 2239c48c75eSJung-uk Kim * FUNCTION: AcpiNsConvertToBuffer 2249c48c75eSJung-uk Kim * 2259c48c75eSJung-uk Kim * PARAMETERS: OriginalObject - Object to be converted 2269c48c75eSJung-uk Kim * ReturnObject - Where the new converted object is returned 2279c48c75eSJung-uk Kim * 2289c48c75eSJung-uk Kim * RETURN: Status. AE_OK if conversion was successful. 2299c48c75eSJung-uk Kim * 2309c48c75eSJung-uk Kim * DESCRIPTION: Attempt to convert a Integer/String/Package object to a Buffer. 2319c48c75eSJung-uk Kim * 2329c48c75eSJung-uk Kim ******************************************************************************/ 2339c48c75eSJung-uk Kim 2349c48c75eSJung-uk Kim ACPI_STATUS 2359c48c75eSJung-uk Kim AcpiNsConvertToBuffer ( 2369c48c75eSJung-uk Kim ACPI_OPERAND_OBJECT *OriginalObject, 2379c48c75eSJung-uk Kim ACPI_OPERAND_OBJECT **ReturnObject) 2389c48c75eSJung-uk Kim { 2399c48c75eSJung-uk Kim ACPI_OPERAND_OBJECT *NewObject; 2409c48c75eSJung-uk Kim ACPI_STATUS Status; 2419c48c75eSJung-uk Kim ACPI_OPERAND_OBJECT **Elements; 2429c48c75eSJung-uk Kim UINT32 *DwordBuffer; 2439c48c75eSJung-uk Kim UINT32 Count; 2449c48c75eSJung-uk Kim UINT32 i; 2459c48c75eSJung-uk Kim 2469c48c75eSJung-uk Kim 2479c48c75eSJung-uk Kim switch (OriginalObject->Common.Type) 2489c48c75eSJung-uk Kim { 2499c48c75eSJung-uk Kim case ACPI_TYPE_INTEGER: 2509c48c75eSJung-uk Kim /* 2519c48c75eSJung-uk Kim * Integer-to-Buffer conversion. 2529c48c75eSJung-uk Kim * Convert the Integer to a packed-byte buffer. _MAT and other 2539c48c75eSJung-uk Kim * objects need this sometimes, if a read has been performed on a 2549c48c75eSJung-uk Kim * Field object that is less than or equal to the global integer 2559c48c75eSJung-uk Kim * size (32 or 64 bits). 2569c48c75eSJung-uk Kim */ 2579c48c75eSJung-uk Kim Status = AcpiExConvertToBuffer (OriginalObject, &NewObject); 2589c48c75eSJung-uk Kim if (ACPI_FAILURE (Status)) 2599c48c75eSJung-uk Kim { 2609c48c75eSJung-uk Kim return (Status); 2619c48c75eSJung-uk Kim } 2629c48c75eSJung-uk Kim break; 2639c48c75eSJung-uk Kim 2649c48c75eSJung-uk Kim case ACPI_TYPE_STRING: 2659c48c75eSJung-uk Kim 2669c48c75eSJung-uk Kim /* String-to-Buffer conversion. Simple data copy */ 2679c48c75eSJung-uk Kim 2689c48c75eSJung-uk Kim NewObject = AcpiUtCreateBufferObject (OriginalObject->String.Length); 2699c48c75eSJung-uk Kim if (!NewObject) 2709c48c75eSJung-uk Kim { 2719c48c75eSJung-uk Kim return (AE_NO_MEMORY); 2729c48c75eSJung-uk Kim } 2739c48c75eSJung-uk Kim 2749c48c75eSJung-uk Kim ACPI_MEMCPY (NewObject->Buffer.Pointer, 2759c48c75eSJung-uk Kim OriginalObject->String.Pointer, OriginalObject->String.Length); 2769c48c75eSJung-uk Kim break; 2779c48c75eSJung-uk Kim 2789c48c75eSJung-uk Kim case ACPI_TYPE_PACKAGE: 2799c48c75eSJung-uk Kim /* 2809c48c75eSJung-uk Kim * This case is often seen for predefined names that must return a 2819c48c75eSJung-uk Kim * Buffer object with multiple DWORD integers within. For example, 2829c48c75eSJung-uk Kim * _FDE and _GTM. The Package can be converted to a Buffer. 2839c48c75eSJung-uk Kim */ 2849c48c75eSJung-uk Kim 2859c48c75eSJung-uk Kim /* All elements of the Package must be integers */ 2869c48c75eSJung-uk Kim 2879c48c75eSJung-uk Kim Elements = OriginalObject->Package.Elements; 2889c48c75eSJung-uk Kim Count = OriginalObject->Package.Count; 2899c48c75eSJung-uk Kim 2909c48c75eSJung-uk Kim for (i = 0; i < Count; i++) 2919c48c75eSJung-uk Kim { 2929c48c75eSJung-uk Kim if ((!*Elements) || 2939c48c75eSJung-uk Kim ((*Elements)->Common.Type != ACPI_TYPE_INTEGER)) 2949c48c75eSJung-uk Kim { 2959c48c75eSJung-uk Kim return (AE_AML_OPERAND_TYPE); 2969c48c75eSJung-uk Kim } 2979c48c75eSJung-uk Kim Elements++; 2989c48c75eSJung-uk Kim } 2999c48c75eSJung-uk Kim 3009c48c75eSJung-uk Kim /* Create the new buffer object to replace the Package */ 3019c48c75eSJung-uk Kim 3029c48c75eSJung-uk Kim NewObject = AcpiUtCreateBufferObject (ACPI_MUL_4 (Count)); 3039c48c75eSJung-uk Kim if (!NewObject) 3049c48c75eSJung-uk Kim { 3059c48c75eSJung-uk Kim return (AE_NO_MEMORY); 3069c48c75eSJung-uk Kim } 3079c48c75eSJung-uk Kim 3089c48c75eSJung-uk Kim /* Copy the package elements (integers) to the buffer as DWORDs */ 3099c48c75eSJung-uk Kim 3109c48c75eSJung-uk Kim Elements = OriginalObject->Package.Elements; 3119c48c75eSJung-uk Kim DwordBuffer = ACPI_CAST_PTR (UINT32, NewObject->Buffer.Pointer); 3129c48c75eSJung-uk Kim 3139c48c75eSJung-uk Kim for (i = 0; i < Count; i++) 3149c48c75eSJung-uk Kim { 3159c48c75eSJung-uk Kim *DwordBuffer = (UINT32) (*Elements)->Integer.Value; 3169c48c75eSJung-uk Kim DwordBuffer++; 3179c48c75eSJung-uk Kim Elements++; 3189c48c75eSJung-uk Kim } 3199c48c75eSJung-uk Kim break; 3209c48c75eSJung-uk Kim 3219c48c75eSJung-uk Kim default: 322*a9d8d09cSJung-uk Kim 3239c48c75eSJung-uk Kim return (AE_AML_OPERAND_TYPE); 3249c48c75eSJung-uk Kim } 3259c48c75eSJung-uk Kim 3269c48c75eSJung-uk Kim *ReturnObject = NewObject; 3279c48c75eSJung-uk Kim return (AE_OK); 3289c48c75eSJung-uk Kim } 3299c48c75eSJung-uk Kim 3309c48c75eSJung-uk Kim 3319c48c75eSJung-uk Kim /******************************************************************************* 3329c48c75eSJung-uk Kim * 3339c48c75eSJung-uk Kim * FUNCTION: AcpiNsConvertToUnicode 3349c48c75eSJung-uk Kim * 3359c48c75eSJung-uk Kim * PARAMETERS: OriginalObject - ASCII String Object to be converted 3369c48c75eSJung-uk Kim * ReturnObject - Where the new converted object is returned 3379c48c75eSJung-uk Kim * 3389c48c75eSJung-uk Kim * RETURN: Status. AE_OK if conversion was successful. 3399c48c75eSJung-uk Kim * 3409c48c75eSJung-uk Kim * DESCRIPTION: Attempt to convert a String object to a Unicode string Buffer. 3419c48c75eSJung-uk Kim * 3429c48c75eSJung-uk Kim ******************************************************************************/ 3439c48c75eSJung-uk Kim 3449c48c75eSJung-uk Kim ACPI_STATUS 3459c48c75eSJung-uk Kim AcpiNsConvertToUnicode ( 3469c48c75eSJung-uk Kim ACPI_OPERAND_OBJECT *OriginalObject, 3479c48c75eSJung-uk Kim ACPI_OPERAND_OBJECT **ReturnObject) 3489c48c75eSJung-uk Kim { 3499c48c75eSJung-uk Kim ACPI_OPERAND_OBJECT *NewObject; 3509c48c75eSJung-uk Kim char *AsciiString; 3519c48c75eSJung-uk Kim UINT16 *UnicodeBuffer; 3529c48c75eSJung-uk Kim UINT32 UnicodeLength; 3539c48c75eSJung-uk Kim UINT32 i; 3549c48c75eSJung-uk Kim 3559c48c75eSJung-uk Kim 3569c48c75eSJung-uk Kim if (!OriginalObject) 3579c48c75eSJung-uk Kim { 3589c48c75eSJung-uk Kim return (AE_OK); 3599c48c75eSJung-uk Kim } 3609c48c75eSJung-uk Kim 3619c48c75eSJung-uk Kim /* If a Buffer was returned, it must be at least two bytes long */ 3629c48c75eSJung-uk Kim 3639c48c75eSJung-uk Kim if (OriginalObject->Common.Type == ACPI_TYPE_BUFFER) 3649c48c75eSJung-uk Kim { 3659c48c75eSJung-uk Kim if (OriginalObject->Buffer.Length < 2) 3669c48c75eSJung-uk Kim { 3679c48c75eSJung-uk Kim return (AE_AML_OPERAND_VALUE); 3689c48c75eSJung-uk Kim } 3699c48c75eSJung-uk Kim 3709c48c75eSJung-uk Kim *ReturnObject = NULL; 3719c48c75eSJung-uk Kim return (AE_OK); 3729c48c75eSJung-uk Kim } 3739c48c75eSJung-uk Kim 3749c48c75eSJung-uk Kim /* 3759c48c75eSJung-uk Kim * The original object is an ASCII string. Convert this string to 3769c48c75eSJung-uk Kim * a unicode buffer. 3779c48c75eSJung-uk Kim */ 3789c48c75eSJung-uk Kim AsciiString = OriginalObject->String.Pointer; 3799c48c75eSJung-uk Kim UnicodeLength = (OriginalObject->String.Length * 2) + 2; 3809c48c75eSJung-uk Kim 3819c48c75eSJung-uk Kim /* Create a new buffer object for the Unicode data */ 3829c48c75eSJung-uk Kim 3839c48c75eSJung-uk Kim NewObject = AcpiUtCreateBufferObject (UnicodeLength); 3849c48c75eSJung-uk Kim if (!NewObject) 3859c48c75eSJung-uk Kim { 3869c48c75eSJung-uk Kim return (AE_NO_MEMORY); 3879c48c75eSJung-uk Kim } 3889c48c75eSJung-uk Kim 3899c48c75eSJung-uk Kim UnicodeBuffer = ACPI_CAST_PTR (UINT16, NewObject->Buffer.Pointer); 3909c48c75eSJung-uk Kim 3919c48c75eSJung-uk Kim /* Convert ASCII to Unicode */ 3929c48c75eSJung-uk Kim 3939c48c75eSJung-uk Kim for (i = 0; i < OriginalObject->String.Length; i++) 3949c48c75eSJung-uk Kim { 3959c48c75eSJung-uk Kim UnicodeBuffer[i] = (UINT16) AsciiString[i]; 3969c48c75eSJung-uk Kim } 3979c48c75eSJung-uk Kim 3989c48c75eSJung-uk Kim *ReturnObject = NewObject; 3999c48c75eSJung-uk Kim return (AE_OK); 4009c48c75eSJung-uk Kim } 4019c48c75eSJung-uk Kim 4029c48c75eSJung-uk Kim 4039c48c75eSJung-uk Kim /******************************************************************************* 4049c48c75eSJung-uk Kim * 4059c48c75eSJung-uk Kim * FUNCTION: AcpiNsConvertToResource 4069c48c75eSJung-uk Kim * 4079c48c75eSJung-uk Kim * PARAMETERS: OriginalObject - Object to be converted 4089c48c75eSJung-uk Kim * ReturnObject - Where the new converted object is returned 4099c48c75eSJung-uk Kim * 4109c48c75eSJung-uk Kim * RETURN: Status. AE_OK if conversion was successful 4119c48c75eSJung-uk Kim * 4129c48c75eSJung-uk Kim * DESCRIPTION: Attempt to convert a Integer object to a ResourceTemplate 4139c48c75eSJung-uk Kim * Buffer. 4149c48c75eSJung-uk Kim * 4159c48c75eSJung-uk Kim ******************************************************************************/ 4169c48c75eSJung-uk Kim 4179c48c75eSJung-uk Kim ACPI_STATUS 4189c48c75eSJung-uk Kim AcpiNsConvertToResource ( 4199c48c75eSJung-uk Kim ACPI_OPERAND_OBJECT *OriginalObject, 4209c48c75eSJung-uk Kim ACPI_OPERAND_OBJECT **ReturnObject) 4219c48c75eSJung-uk Kim { 4229c48c75eSJung-uk Kim ACPI_OPERAND_OBJECT *NewObject; 4239c48c75eSJung-uk Kim UINT8 *Buffer; 4249c48c75eSJung-uk Kim 4259c48c75eSJung-uk Kim 4269c48c75eSJung-uk Kim /* 4279c48c75eSJung-uk Kim * We can fix the following cases for an expected resource template: 4289c48c75eSJung-uk Kim * 1. No return value (interpreter slack mode is disabled) 4299c48c75eSJung-uk Kim * 2. A "Return (Zero)" statement 4309c48c75eSJung-uk Kim * 3. A "Return empty buffer" statement 4319c48c75eSJung-uk Kim * 4329c48c75eSJung-uk Kim * We will return a buffer containing a single EndTag 4339c48c75eSJung-uk Kim * resource descriptor. 4349c48c75eSJung-uk Kim */ 4359c48c75eSJung-uk Kim if (OriginalObject) 4369c48c75eSJung-uk Kim { 4379c48c75eSJung-uk Kim switch (OriginalObject->Common.Type) 4389c48c75eSJung-uk Kim { 4399c48c75eSJung-uk Kim case ACPI_TYPE_INTEGER: 4409c48c75eSJung-uk Kim 4419c48c75eSJung-uk Kim /* We can only repair an Integer==0 */ 4429c48c75eSJung-uk Kim 4439c48c75eSJung-uk Kim if (OriginalObject->Integer.Value) 4449c48c75eSJung-uk Kim { 4459c48c75eSJung-uk Kim return (AE_AML_OPERAND_TYPE); 4469c48c75eSJung-uk Kim } 4479c48c75eSJung-uk Kim break; 4489c48c75eSJung-uk Kim 4499c48c75eSJung-uk Kim case ACPI_TYPE_BUFFER: 4509c48c75eSJung-uk Kim 4519c48c75eSJung-uk Kim if (OriginalObject->Buffer.Length) 4529c48c75eSJung-uk Kim { 4539c48c75eSJung-uk Kim /* Additional checks can be added in the future */ 4549c48c75eSJung-uk Kim 4559c48c75eSJung-uk Kim *ReturnObject = NULL; 4569c48c75eSJung-uk Kim return (AE_OK); 4579c48c75eSJung-uk Kim } 4589c48c75eSJung-uk Kim break; 4599c48c75eSJung-uk Kim 4609c48c75eSJung-uk Kim case ACPI_TYPE_STRING: 4619c48c75eSJung-uk Kim default: 4629c48c75eSJung-uk Kim 4639c48c75eSJung-uk Kim return (AE_AML_OPERAND_TYPE); 4649c48c75eSJung-uk Kim } 4659c48c75eSJung-uk Kim } 4669c48c75eSJung-uk Kim 4679c48c75eSJung-uk Kim /* Create the new buffer object for the resource descriptor */ 4689c48c75eSJung-uk Kim 4699c48c75eSJung-uk Kim NewObject = AcpiUtCreateBufferObject (2); 4709c48c75eSJung-uk Kim if (!NewObject) 4719c48c75eSJung-uk Kim { 4729c48c75eSJung-uk Kim return (AE_NO_MEMORY); 4739c48c75eSJung-uk Kim } 4749c48c75eSJung-uk Kim 4759c48c75eSJung-uk Kim Buffer = ACPI_CAST_PTR (UINT8, NewObject->Buffer.Pointer); 4769c48c75eSJung-uk Kim 4779c48c75eSJung-uk Kim /* Initialize the Buffer with a single EndTag descriptor */ 4789c48c75eSJung-uk Kim 4799c48c75eSJung-uk Kim Buffer[0] = (ACPI_RESOURCE_NAME_END_TAG | ASL_RDESC_END_TAG_SIZE); 4809c48c75eSJung-uk Kim Buffer[1] = 0x00; 4819c48c75eSJung-uk Kim 4829c48c75eSJung-uk Kim *ReturnObject = NewObject; 4839c48c75eSJung-uk Kim return (AE_OK); 4849c48c75eSJung-uk Kim } 485