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 /* 9f8146b88SJung-uk Kim * Copyright (C) 2000 - 2016, 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, 87*493deb39SJung-uk Kim AcpiGbl_IntegerByteWidth, &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 { 107f8146b88SJung-uk Kim Value |= ((UINT64) 108f8146b88SJung-uk Kim OriginalObject->Buffer.Pointer[i] << (i * 8)); 1099c48c75eSJung-uk Kim } 1109c48c75eSJung-uk Kim break; 1119c48c75eSJung-uk Kim 1129c48c75eSJung-uk Kim default: 113a9d8d09cSJung-uk Kim 1149c48c75eSJung-uk Kim return (AE_AML_OPERAND_TYPE); 1159c48c75eSJung-uk Kim } 1169c48c75eSJung-uk Kim 1179c48c75eSJung-uk Kim NewObject = AcpiUtCreateIntegerObject (Value); 1189c48c75eSJung-uk Kim if (!NewObject) 1199c48c75eSJung-uk Kim { 1209c48c75eSJung-uk Kim return (AE_NO_MEMORY); 1219c48c75eSJung-uk Kim } 1229c48c75eSJung-uk Kim 1239c48c75eSJung-uk Kim *ReturnObject = NewObject; 1249c48c75eSJung-uk Kim return (AE_OK); 1259c48c75eSJung-uk Kim } 1269c48c75eSJung-uk Kim 1279c48c75eSJung-uk Kim 1289c48c75eSJung-uk Kim /******************************************************************************* 1299c48c75eSJung-uk Kim * 1309c48c75eSJung-uk Kim * FUNCTION: AcpiNsConvertToString 1319c48c75eSJung-uk Kim * 1329c48c75eSJung-uk Kim * PARAMETERS: OriginalObject - Object to be converted 1339c48c75eSJung-uk Kim * ReturnObject - Where the new converted object is returned 1349c48c75eSJung-uk Kim * 1359c48c75eSJung-uk Kim * RETURN: Status. AE_OK if conversion was successful. 1369c48c75eSJung-uk Kim * 1379c48c75eSJung-uk Kim * DESCRIPTION: Attempt to convert a Integer/Buffer object to a String. 1389c48c75eSJung-uk Kim * 1399c48c75eSJung-uk Kim ******************************************************************************/ 1409c48c75eSJung-uk Kim 1419c48c75eSJung-uk Kim ACPI_STATUS 1429c48c75eSJung-uk Kim AcpiNsConvertToString ( 1439c48c75eSJung-uk Kim ACPI_OPERAND_OBJECT *OriginalObject, 1449c48c75eSJung-uk Kim ACPI_OPERAND_OBJECT **ReturnObject) 1459c48c75eSJung-uk Kim { 1469c48c75eSJung-uk Kim ACPI_OPERAND_OBJECT *NewObject; 1479c48c75eSJung-uk Kim ACPI_SIZE Length; 1489c48c75eSJung-uk Kim ACPI_STATUS Status; 1499c48c75eSJung-uk Kim 1509c48c75eSJung-uk Kim 1519c48c75eSJung-uk Kim switch (OriginalObject->Common.Type) 1529c48c75eSJung-uk Kim { 1539c48c75eSJung-uk Kim case ACPI_TYPE_INTEGER: 1549c48c75eSJung-uk Kim /* 1559c48c75eSJung-uk Kim * Integer-to-String conversion. Commonly, convert 1569c48c75eSJung-uk Kim * an integer of value 0 to a NULL string. The last element of 1579c48c75eSJung-uk Kim * _BIF and _BIX packages occasionally need this fix. 1589c48c75eSJung-uk Kim */ 1599c48c75eSJung-uk Kim if (OriginalObject->Integer.Value == 0) 1609c48c75eSJung-uk Kim { 1619c48c75eSJung-uk Kim /* Allocate a new NULL string object */ 1629c48c75eSJung-uk Kim 1639c48c75eSJung-uk Kim NewObject = AcpiUtCreateStringObject (0); 1649c48c75eSJung-uk Kim if (!NewObject) 1659c48c75eSJung-uk Kim { 1669c48c75eSJung-uk Kim return (AE_NO_MEMORY); 1679c48c75eSJung-uk Kim } 1689c48c75eSJung-uk Kim } 1699c48c75eSJung-uk Kim else 1709c48c75eSJung-uk Kim { 171f8146b88SJung-uk Kim Status = AcpiExConvertToString (OriginalObject, 172f8146b88SJung-uk Kim &NewObject, ACPI_IMPLICIT_CONVERT_HEX); 1739c48c75eSJung-uk Kim if (ACPI_FAILURE (Status)) 1749c48c75eSJung-uk Kim { 1759c48c75eSJung-uk Kim return (Status); 1769c48c75eSJung-uk Kim } 1779c48c75eSJung-uk Kim } 1789c48c75eSJung-uk Kim break; 1799c48c75eSJung-uk Kim 1809c48c75eSJung-uk Kim case ACPI_TYPE_BUFFER: 1819c48c75eSJung-uk Kim /* 1829c48c75eSJung-uk Kim * Buffer-to-String conversion. Use a ToString 1839c48c75eSJung-uk Kim * conversion, no transform performed on the buffer data. The best 1849c48c75eSJung-uk Kim * example of this is the _BIF method, where the string data from 1859c48c75eSJung-uk Kim * the battery is often (incorrectly) returned as buffer object(s). 1869c48c75eSJung-uk Kim */ 1879c48c75eSJung-uk Kim Length = 0; 1889c48c75eSJung-uk Kim while ((Length < OriginalObject->Buffer.Length) && 1899c48c75eSJung-uk Kim (OriginalObject->Buffer.Pointer[Length])) 1909c48c75eSJung-uk Kim { 1919c48c75eSJung-uk Kim Length++; 1929c48c75eSJung-uk Kim } 1939c48c75eSJung-uk Kim 1949c48c75eSJung-uk Kim /* Allocate a new string object */ 1959c48c75eSJung-uk Kim 1969c48c75eSJung-uk Kim NewObject = AcpiUtCreateStringObject (Length); 1979c48c75eSJung-uk Kim if (!NewObject) 1989c48c75eSJung-uk Kim { 1999c48c75eSJung-uk Kim return (AE_NO_MEMORY); 2009c48c75eSJung-uk Kim } 2019c48c75eSJung-uk Kim 2029c48c75eSJung-uk Kim /* 2039c48c75eSJung-uk Kim * Copy the raw buffer data with no transform. String is already NULL 2049c48c75eSJung-uk Kim * terminated at Length+1. 2059c48c75eSJung-uk Kim */ 2065ef50723SJung-uk Kim memcpy (NewObject->String.Pointer, 2079c48c75eSJung-uk Kim OriginalObject->Buffer.Pointer, Length); 2089c48c75eSJung-uk Kim break; 2099c48c75eSJung-uk Kim 2109c48c75eSJung-uk Kim default: 211a9d8d09cSJung-uk Kim 2129c48c75eSJung-uk Kim return (AE_AML_OPERAND_TYPE); 2139c48c75eSJung-uk Kim } 2149c48c75eSJung-uk Kim 2159c48c75eSJung-uk Kim *ReturnObject = NewObject; 2169c48c75eSJung-uk Kim return (AE_OK); 2179c48c75eSJung-uk Kim } 2189c48c75eSJung-uk Kim 2199c48c75eSJung-uk Kim 2209c48c75eSJung-uk Kim /******************************************************************************* 2219c48c75eSJung-uk Kim * 2229c48c75eSJung-uk Kim * FUNCTION: AcpiNsConvertToBuffer 2239c48c75eSJung-uk Kim * 2249c48c75eSJung-uk Kim * PARAMETERS: OriginalObject - Object to be converted 2259c48c75eSJung-uk Kim * ReturnObject - Where the new converted object is returned 2269c48c75eSJung-uk Kim * 2279c48c75eSJung-uk Kim * RETURN: Status. AE_OK if conversion was successful. 2289c48c75eSJung-uk Kim * 2299c48c75eSJung-uk Kim * DESCRIPTION: Attempt to convert a Integer/String/Package object to a Buffer. 2309c48c75eSJung-uk Kim * 2319c48c75eSJung-uk Kim ******************************************************************************/ 2329c48c75eSJung-uk Kim 2339c48c75eSJung-uk Kim ACPI_STATUS 2349c48c75eSJung-uk Kim AcpiNsConvertToBuffer ( 2359c48c75eSJung-uk Kim ACPI_OPERAND_OBJECT *OriginalObject, 2369c48c75eSJung-uk Kim ACPI_OPERAND_OBJECT **ReturnObject) 2379c48c75eSJung-uk Kim { 2389c48c75eSJung-uk Kim ACPI_OPERAND_OBJECT *NewObject; 2399c48c75eSJung-uk Kim ACPI_STATUS Status; 2409c48c75eSJung-uk Kim ACPI_OPERAND_OBJECT **Elements; 2419c48c75eSJung-uk Kim UINT32 *DwordBuffer; 2429c48c75eSJung-uk Kim UINT32 Count; 2439c48c75eSJung-uk Kim UINT32 i; 2449c48c75eSJung-uk Kim 2459c48c75eSJung-uk Kim 2469c48c75eSJung-uk Kim switch (OriginalObject->Common.Type) 2479c48c75eSJung-uk Kim { 2489c48c75eSJung-uk Kim case ACPI_TYPE_INTEGER: 2499c48c75eSJung-uk Kim /* 2509c48c75eSJung-uk Kim * Integer-to-Buffer conversion. 2519c48c75eSJung-uk Kim * Convert the Integer to a packed-byte buffer. _MAT and other 2529c48c75eSJung-uk Kim * objects need this sometimes, if a read has been performed on a 2539c48c75eSJung-uk Kim * Field object that is less than or equal to the global integer 2549c48c75eSJung-uk Kim * size (32 or 64 bits). 2559c48c75eSJung-uk Kim */ 2569c48c75eSJung-uk Kim Status = AcpiExConvertToBuffer (OriginalObject, &NewObject); 2579c48c75eSJung-uk Kim if (ACPI_FAILURE (Status)) 2589c48c75eSJung-uk Kim { 2599c48c75eSJung-uk Kim return (Status); 2609c48c75eSJung-uk Kim } 2619c48c75eSJung-uk Kim break; 2629c48c75eSJung-uk Kim 2639c48c75eSJung-uk Kim case ACPI_TYPE_STRING: 2649c48c75eSJung-uk Kim 2659c48c75eSJung-uk Kim /* String-to-Buffer conversion. Simple data copy */ 2669c48c75eSJung-uk Kim 267f8146b88SJung-uk Kim NewObject = AcpiUtCreateBufferObject 268f8146b88SJung-uk Kim (OriginalObject->String.Length); 2699c48c75eSJung-uk Kim if (!NewObject) 2709c48c75eSJung-uk Kim { 2719c48c75eSJung-uk Kim return (AE_NO_MEMORY); 2729c48c75eSJung-uk Kim } 2739c48c75eSJung-uk Kim 2745ef50723SJung-uk Kim 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: 322a9d8d09cSJung-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 * 335f8146b88SJung-uk Kim * PARAMETERS: Scope - Namespace node for the method/object 336f8146b88SJung-uk Kim * OriginalObject - ASCII String Object to be converted 3379c48c75eSJung-uk Kim * ReturnObject - Where the new converted object is returned 3389c48c75eSJung-uk Kim * 3399c48c75eSJung-uk Kim * RETURN: Status. AE_OK if conversion was successful. 3409c48c75eSJung-uk Kim * 3419c48c75eSJung-uk Kim * DESCRIPTION: Attempt to convert a String object to a Unicode string Buffer. 3429c48c75eSJung-uk Kim * 3439c48c75eSJung-uk Kim ******************************************************************************/ 3449c48c75eSJung-uk Kim 3459c48c75eSJung-uk Kim ACPI_STATUS 3469c48c75eSJung-uk Kim AcpiNsConvertToUnicode ( 347f8146b88SJung-uk Kim ACPI_NAMESPACE_NODE *Scope, 3489c48c75eSJung-uk Kim ACPI_OPERAND_OBJECT *OriginalObject, 3499c48c75eSJung-uk Kim ACPI_OPERAND_OBJECT **ReturnObject) 3509c48c75eSJung-uk Kim { 3519c48c75eSJung-uk Kim ACPI_OPERAND_OBJECT *NewObject; 3529c48c75eSJung-uk Kim char *AsciiString; 3539c48c75eSJung-uk Kim UINT16 *UnicodeBuffer; 3549c48c75eSJung-uk Kim UINT32 UnicodeLength; 3559c48c75eSJung-uk Kim UINT32 i; 3569c48c75eSJung-uk Kim 3579c48c75eSJung-uk Kim 3589c48c75eSJung-uk Kim if (!OriginalObject) 3599c48c75eSJung-uk Kim { 3609c48c75eSJung-uk Kim return (AE_OK); 3619c48c75eSJung-uk Kim } 3629c48c75eSJung-uk Kim 3639c48c75eSJung-uk Kim /* If a Buffer was returned, it must be at least two bytes long */ 3649c48c75eSJung-uk Kim 3659c48c75eSJung-uk Kim if (OriginalObject->Common.Type == ACPI_TYPE_BUFFER) 3669c48c75eSJung-uk Kim { 3679c48c75eSJung-uk Kim if (OriginalObject->Buffer.Length < 2) 3689c48c75eSJung-uk Kim { 3699c48c75eSJung-uk Kim return (AE_AML_OPERAND_VALUE); 3709c48c75eSJung-uk Kim } 3719c48c75eSJung-uk Kim 3729c48c75eSJung-uk Kim *ReturnObject = NULL; 3739c48c75eSJung-uk Kim return (AE_OK); 3749c48c75eSJung-uk Kim } 3759c48c75eSJung-uk Kim 3769c48c75eSJung-uk Kim /* 3779c48c75eSJung-uk Kim * The original object is an ASCII string. Convert this string to 3789c48c75eSJung-uk Kim * a unicode buffer. 3799c48c75eSJung-uk Kim */ 3809c48c75eSJung-uk Kim AsciiString = OriginalObject->String.Pointer; 3819c48c75eSJung-uk Kim UnicodeLength = (OriginalObject->String.Length * 2) + 2; 3829c48c75eSJung-uk Kim 3839c48c75eSJung-uk Kim /* Create a new buffer object for the Unicode data */ 3849c48c75eSJung-uk Kim 3859c48c75eSJung-uk Kim NewObject = AcpiUtCreateBufferObject (UnicodeLength); 3869c48c75eSJung-uk Kim if (!NewObject) 3879c48c75eSJung-uk Kim { 3889c48c75eSJung-uk Kim return (AE_NO_MEMORY); 3899c48c75eSJung-uk Kim } 3909c48c75eSJung-uk Kim 3919c48c75eSJung-uk Kim UnicodeBuffer = ACPI_CAST_PTR (UINT16, NewObject->Buffer.Pointer); 3929c48c75eSJung-uk Kim 3939c48c75eSJung-uk Kim /* Convert ASCII to Unicode */ 3949c48c75eSJung-uk Kim 3959c48c75eSJung-uk Kim for (i = 0; i < OriginalObject->String.Length; i++) 3969c48c75eSJung-uk Kim { 3979c48c75eSJung-uk Kim UnicodeBuffer[i] = (UINT16) AsciiString[i]; 3989c48c75eSJung-uk Kim } 3999c48c75eSJung-uk Kim 4009c48c75eSJung-uk Kim *ReturnObject = NewObject; 4019c48c75eSJung-uk Kim return (AE_OK); 4029c48c75eSJung-uk Kim } 4039c48c75eSJung-uk Kim 4049c48c75eSJung-uk Kim 4059c48c75eSJung-uk Kim /******************************************************************************* 4069c48c75eSJung-uk Kim * 4079c48c75eSJung-uk Kim * FUNCTION: AcpiNsConvertToResource 4089c48c75eSJung-uk Kim * 409f8146b88SJung-uk Kim * PARAMETERS: Scope - Namespace node for the method/object 410f8146b88SJung-uk Kim * OriginalObject - Object to be converted 4119c48c75eSJung-uk Kim * ReturnObject - Where the new converted object is returned 4129c48c75eSJung-uk Kim * 4139c48c75eSJung-uk Kim * RETURN: Status. AE_OK if conversion was successful 4149c48c75eSJung-uk Kim * 4159c48c75eSJung-uk Kim * DESCRIPTION: Attempt to convert a Integer object to a ResourceTemplate 4169c48c75eSJung-uk Kim * Buffer. 4179c48c75eSJung-uk Kim * 4189c48c75eSJung-uk Kim ******************************************************************************/ 4199c48c75eSJung-uk Kim 4209c48c75eSJung-uk Kim ACPI_STATUS 4219c48c75eSJung-uk Kim AcpiNsConvertToResource ( 422f8146b88SJung-uk Kim ACPI_NAMESPACE_NODE *Scope, 4239c48c75eSJung-uk Kim ACPI_OPERAND_OBJECT *OriginalObject, 4249c48c75eSJung-uk Kim ACPI_OPERAND_OBJECT **ReturnObject) 4259c48c75eSJung-uk Kim { 4269c48c75eSJung-uk Kim ACPI_OPERAND_OBJECT *NewObject; 4279c48c75eSJung-uk Kim UINT8 *Buffer; 4289c48c75eSJung-uk Kim 4299c48c75eSJung-uk Kim 4309c48c75eSJung-uk Kim /* 4319c48c75eSJung-uk Kim * We can fix the following cases for an expected resource template: 4329c48c75eSJung-uk Kim * 1. No return value (interpreter slack mode is disabled) 4339c48c75eSJung-uk Kim * 2. A "Return (Zero)" statement 4349c48c75eSJung-uk Kim * 3. A "Return empty buffer" statement 4359c48c75eSJung-uk Kim * 4369c48c75eSJung-uk Kim * We will return a buffer containing a single EndTag 4379c48c75eSJung-uk Kim * resource descriptor. 4389c48c75eSJung-uk Kim */ 4399c48c75eSJung-uk Kim if (OriginalObject) 4409c48c75eSJung-uk Kim { 4419c48c75eSJung-uk Kim switch (OriginalObject->Common.Type) 4429c48c75eSJung-uk Kim { 4439c48c75eSJung-uk Kim case ACPI_TYPE_INTEGER: 4449c48c75eSJung-uk Kim 4459c48c75eSJung-uk Kim /* We can only repair an Integer==0 */ 4469c48c75eSJung-uk Kim 4479c48c75eSJung-uk Kim if (OriginalObject->Integer.Value) 4489c48c75eSJung-uk Kim { 4499c48c75eSJung-uk Kim return (AE_AML_OPERAND_TYPE); 4509c48c75eSJung-uk Kim } 4519c48c75eSJung-uk Kim break; 4529c48c75eSJung-uk Kim 4539c48c75eSJung-uk Kim case ACPI_TYPE_BUFFER: 4549c48c75eSJung-uk Kim 4559c48c75eSJung-uk Kim if (OriginalObject->Buffer.Length) 4569c48c75eSJung-uk Kim { 4579c48c75eSJung-uk Kim /* Additional checks can be added in the future */ 4589c48c75eSJung-uk Kim 4599c48c75eSJung-uk Kim *ReturnObject = NULL; 4609c48c75eSJung-uk Kim return (AE_OK); 4619c48c75eSJung-uk Kim } 4629c48c75eSJung-uk Kim break; 4639c48c75eSJung-uk Kim 4649c48c75eSJung-uk Kim case ACPI_TYPE_STRING: 4659c48c75eSJung-uk Kim default: 4669c48c75eSJung-uk Kim 4679c48c75eSJung-uk Kim return (AE_AML_OPERAND_TYPE); 4689c48c75eSJung-uk Kim } 4699c48c75eSJung-uk Kim } 4709c48c75eSJung-uk Kim 4719c48c75eSJung-uk Kim /* Create the new buffer object for the resource descriptor */ 4729c48c75eSJung-uk Kim 4739c48c75eSJung-uk Kim NewObject = AcpiUtCreateBufferObject (2); 4749c48c75eSJung-uk Kim if (!NewObject) 4759c48c75eSJung-uk Kim { 4769c48c75eSJung-uk Kim return (AE_NO_MEMORY); 4779c48c75eSJung-uk Kim } 4789c48c75eSJung-uk Kim 4799c48c75eSJung-uk Kim Buffer = ACPI_CAST_PTR (UINT8, NewObject->Buffer.Pointer); 4809c48c75eSJung-uk Kim 4819c48c75eSJung-uk Kim /* Initialize the Buffer with a single EndTag descriptor */ 4829c48c75eSJung-uk Kim 4839c48c75eSJung-uk Kim Buffer[0] = (ACPI_RESOURCE_NAME_END_TAG | ASL_RDESC_END_TAG_SIZE); 4849c48c75eSJung-uk Kim Buffer[1] = 0x00; 4859c48c75eSJung-uk Kim 4869c48c75eSJung-uk Kim *ReturnObject = NewObject; 4879c48c75eSJung-uk Kim return (AE_OK); 4889c48c75eSJung-uk Kim } 489f8146b88SJung-uk Kim 490f8146b88SJung-uk Kim 491f8146b88SJung-uk Kim /******************************************************************************* 492f8146b88SJung-uk Kim * 493f8146b88SJung-uk Kim * FUNCTION: AcpiNsConvertToReference 494f8146b88SJung-uk Kim * 495f8146b88SJung-uk Kim * PARAMETERS: Scope - Namespace node for the method/object 496f8146b88SJung-uk Kim * OriginalObject - Object to be converted 497f8146b88SJung-uk Kim * ReturnObject - Where the new converted object is returned 498f8146b88SJung-uk Kim * 499f8146b88SJung-uk Kim * RETURN: Status. AE_OK if conversion was successful 500f8146b88SJung-uk Kim * 501f8146b88SJung-uk Kim * DESCRIPTION: Attempt to convert a Integer object to a ObjectReference. 502f8146b88SJung-uk Kim * Buffer. 503f8146b88SJung-uk Kim * 504f8146b88SJung-uk Kim ******************************************************************************/ 505f8146b88SJung-uk Kim 506f8146b88SJung-uk Kim ACPI_STATUS 507f8146b88SJung-uk Kim AcpiNsConvertToReference ( 508f8146b88SJung-uk Kim ACPI_NAMESPACE_NODE *Scope, 509f8146b88SJung-uk Kim ACPI_OPERAND_OBJECT *OriginalObject, 510f8146b88SJung-uk Kim ACPI_OPERAND_OBJECT **ReturnObject) 511f8146b88SJung-uk Kim { 512f8146b88SJung-uk Kim ACPI_OPERAND_OBJECT *NewObject = NULL; 513f8146b88SJung-uk Kim ACPI_STATUS Status; 514f8146b88SJung-uk Kim ACPI_NAMESPACE_NODE *Node; 515f8146b88SJung-uk Kim ACPI_GENERIC_STATE ScopeInfo; 516f8146b88SJung-uk Kim char *Name; 517f8146b88SJung-uk Kim 518f8146b88SJung-uk Kim 519f8146b88SJung-uk Kim ACPI_FUNCTION_NAME (NsConvertToReference); 520f8146b88SJung-uk Kim 521f8146b88SJung-uk Kim 522f8146b88SJung-uk Kim /* Convert path into internal presentation */ 523f8146b88SJung-uk Kim 524f8146b88SJung-uk Kim Status = AcpiNsInternalizeName (OriginalObject->String.Pointer, &Name); 525f8146b88SJung-uk Kim if (ACPI_FAILURE (Status)) 526f8146b88SJung-uk Kim { 527f8146b88SJung-uk Kim return_ACPI_STATUS (Status); 528f8146b88SJung-uk Kim } 529f8146b88SJung-uk Kim 530f8146b88SJung-uk Kim /* Find the namespace node */ 531f8146b88SJung-uk Kim 532f8146b88SJung-uk Kim ScopeInfo.Scope.Node = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, Scope); 533f8146b88SJung-uk Kim Status = AcpiNsLookup (&ScopeInfo, Name, 534f8146b88SJung-uk Kim ACPI_TYPE_ANY, ACPI_IMODE_EXECUTE, 535f8146b88SJung-uk Kim ACPI_NS_SEARCH_PARENT | ACPI_NS_DONT_OPEN_SCOPE, NULL, &Node); 536f8146b88SJung-uk Kim if (ACPI_FAILURE (Status)) 537f8146b88SJung-uk Kim { 538f8146b88SJung-uk Kim /* Check if we are resolving a named reference within a package */ 539f8146b88SJung-uk Kim 540f8146b88SJung-uk Kim ACPI_ERROR_NAMESPACE (OriginalObject->String.Pointer, Status); 541f8146b88SJung-uk Kim goto ErrorExit; 542f8146b88SJung-uk Kim } 543f8146b88SJung-uk Kim 544f8146b88SJung-uk Kim /* Create and init a new internal ACPI object */ 545f8146b88SJung-uk Kim 546f8146b88SJung-uk Kim NewObject = AcpiUtCreateInternalObject (ACPI_TYPE_LOCAL_REFERENCE); 547f8146b88SJung-uk Kim if (!NewObject) 548f8146b88SJung-uk Kim { 549f8146b88SJung-uk Kim Status = AE_NO_MEMORY; 550f8146b88SJung-uk Kim goto ErrorExit; 551f8146b88SJung-uk Kim } 552f8146b88SJung-uk Kim NewObject->Reference.Node = Node; 553f8146b88SJung-uk Kim NewObject->Reference.Object = Node->Object; 554f8146b88SJung-uk Kim NewObject->Reference.Class = ACPI_REFCLASS_NAME; 555f8146b88SJung-uk Kim 556f8146b88SJung-uk Kim /* 557f8146b88SJung-uk Kim * Increase reference of the object if needed (the object is likely a 558f8146b88SJung-uk Kim * null for device nodes). 559f8146b88SJung-uk Kim */ 560f8146b88SJung-uk Kim AcpiUtAddReference (Node->Object); 561f8146b88SJung-uk Kim 562f8146b88SJung-uk Kim ErrorExit: 563f8146b88SJung-uk Kim ACPI_FREE (Name); 564f8146b88SJung-uk Kim *ReturnObject = NewObject; 565f8146b88SJung-uk Kim return (AE_OK); 566f8146b88SJung-uk Kim } 567