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