1246847Sjkim/****************************************************************************** 2246847Sjkim * 3246847Sjkim * Module Name: nsconvert - Object conversions for objects returned by 4246847Sjkim * predefined methods 5246847Sjkim * 6246847Sjkim *****************************************************************************/ 7246847Sjkim 8246847Sjkim/* 9306536Sjkim * Copyright (C) 2000 - 2016, Intel Corp. 10246847Sjkim * All rights reserved. 11246847Sjkim * 12246847Sjkim * Redistribution and use in source and binary forms, with or without 13246847Sjkim * modification, are permitted provided that the following conditions 14246847Sjkim * are met: 15246847Sjkim * 1. Redistributions of source code must retain the above copyright 16246847Sjkim * notice, this list of conditions, and the following disclaimer, 17246847Sjkim * without modification. 18246847Sjkim * 2. Redistributions in binary form must reproduce at minimum a disclaimer 19246847Sjkim * substantially similar to the "NO WARRANTY" disclaimer below 20246847Sjkim * ("Disclaimer") and any redistribution must be conditioned upon 21246847Sjkim * including a substantially similar Disclaimer requirement for further 22246847Sjkim * binary redistribution. 23246847Sjkim * 3. Neither the names of the above-listed copyright holders nor the names 24246847Sjkim * of any contributors may be used to endorse or promote products derived 25246847Sjkim * from this software without specific prior written permission. 26246847Sjkim * 27246847Sjkim * Alternatively, this software may be distributed under the terms of the 28246847Sjkim * GNU General Public License ("GPL") version 2 as published by the Free 29246847Sjkim * Software Foundation. 30246847Sjkim * 31246847Sjkim * NO WARRANTY 32246847Sjkim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 33246847Sjkim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 34246847Sjkim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 35246847Sjkim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 36246847Sjkim * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 37246847Sjkim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 38246847Sjkim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 39246847Sjkim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 40246847Sjkim * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 41246847Sjkim * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 42246847Sjkim * POSSIBILITY OF SUCH DAMAGES. 43246847Sjkim */ 44246847Sjkim 45246849Sjkim#include <contrib/dev/acpica/include/acpi.h> 46246849Sjkim#include <contrib/dev/acpica/include/accommon.h> 47246849Sjkim#include <contrib/dev/acpica/include/acnamesp.h> 48246849Sjkim#include <contrib/dev/acpica/include/acinterp.h> 49246849Sjkim#include <contrib/dev/acpica/include/acpredef.h> 50246849Sjkim#include <contrib/dev/acpica/include/amlresrc.h> 51246847Sjkim 52246847Sjkim#define _COMPONENT ACPI_NAMESPACE 53246847Sjkim ACPI_MODULE_NAME ("nsconvert") 54246847Sjkim 55246847Sjkim 56246847Sjkim/******************************************************************************* 57246847Sjkim * 58246847Sjkim * FUNCTION: AcpiNsConvertToInteger 59246847Sjkim * 60246847Sjkim * PARAMETERS: OriginalObject - Object to be converted 61246847Sjkim * ReturnObject - Where the new converted object is returned 62246847Sjkim * 63246847Sjkim * RETURN: Status. AE_OK if conversion was successful. 64246847Sjkim * 65246847Sjkim * DESCRIPTION: Attempt to convert a String/Buffer object to an Integer. 66246847Sjkim * 67246847Sjkim ******************************************************************************/ 68246847Sjkim 69246847SjkimACPI_STATUS 70246847SjkimAcpiNsConvertToInteger ( 71246847Sjkim ACPI_OPERAND_OBJECT *OriginalObject, 72246847Sjkim ACPI_OPERAND_OBJECT **ReturnObject) 73246847Sjkim{ 74246847Sjkim ACPI_OPERAND_OBJECT *NewObject; 75246847Sjkim ACPI_STATUS Status; 76246847Sjkim UINT64 Value = 0; 77246847Sjkim UINT32 i; 78246847Sjkim 79246847Sjkim 80246847Sjkim switch (OriginalObject->Common.Type) 81246847Sjkim { 82246847Sjkim case ACPI_TYPE_STRING: 83246847Sjkim 84246847Sjkim /* String-to-Integer conversion */ 85246847Sjkim 86246847Sjkim Status = AcpiUtStrtoul64 (OriginalObject->String.Pointer, 87306536Sjkim ACPI_ANY_BASE, AcpiGbl_IntegerByteWidth, &Value); 88246847Sjkim if (ACPI_FAILURE (Status)) 89246847Sjkim { 90246847Sjkim return (Status); 91246847Sjkim } 92246847Sjkim break; 93246847Sjkim 94246847Sjkim case ACPI_TYPE_BUFFER: 95246847Sjkim 96246847Sjkim /* Buffer-to-Integer conversion. Max buffer size is 64 bits. */ 97246847Sjkim 98246847Sjkim if (OriginalObject->Buffer.Length > 8) 99246847Sjkim { 100246847Sjkim return (AE_AML_OPERAND_TYPE); 101246847Sjkim } 102246847Sjkim 103246847Sjkim /* Extract each buffer byte to create the integer */ 104246847Sjkim 105246847Sjkim for (i = 0; i < OriginalObject->Buffer.Length; i++) 106246847Sjkim { 107306536Sjkim Value |= ((UINT64) 108306536Sjkim OriginalObject->Buffer.Pointer[i] << (i * 8)); 109246847Sjkim } 110246847Sjkim break; 111246847Sjkim 112246847Sjkim default: 113250838Sjkim 114246847Sjkim return (AE_AML_OPERAND_TYPE); 115246847Sjkim } 116246847Sjkim 117246847Sjkim NewObject = AcpiUtCreateIntegerObject (Value); 118246847Sjkim if (!NewObject) 119246847Sjkim { 120246847Sjkim return (AE_NO_MEMORY); 121246847Sjkim } 122246847Sjkim 123246847Sjkim *ReturnObject = NewObject; 124246847Sjkim return (AE_OK); 125246847Sjkim} 126246847Sjkim 127246847Sjkim 128246847Sjkim/******************************************************************************* 129246847Sjkim * 130246847Sjkim * FUNCTION: AcpiNsConvertToString 131246847Sjkim * 132246847Sjkim * PARAMETERS: OriginalObject - Object to be converted 133246847Sjkim * ReturnObject - Where the new converted object is returned 134246847Sjkim * 135246847Sjkim * RETURN: Status. AE_OK if conversion was successful. 136246847Sjkim * 137246847Sjkim * DESCRIPTION: Attempt to convert a Integer/Buffer object to a String. 138246847Sjkim * 139246847Sjkim ******************************************************************************/ 140246847Sjkim 141246847SjkimACPI_STATUS 142246847SjkimAcpiNsConvertToString ( 143246847Sjkim ACPI_OPERAND_OBJECT *OriginalObject, 144246847Sjkim ACPI_OPERAND_OBJECT **ReturnObject) 145246847Sjkim{ 146246847Sjkim ACPI_OPERAND_OBJECT *NewObject; 147246847Sjkim ACPI_SIZE Length; 148246847Sjkim ACPI_STATUS Status; 149246847Sjkim 150246847Sjkim 151246847Sjkim switch (OriginalObject->Common.Type) 152246847Sjkim { 153246847Sjkim case ACPI_TYPE_INTEGER: 154246847Sjkim /* 155246847Sjkim * Integer-to-String conversion. Commonly, convert 156246847Sjkim * an integer of value 0 to a NULL string. The last element of 157246847Sjkim * _BIF and _BIX packages occasionally need this fix. 158246847Sjkim */ 159246847Sjkim if (OriginalObject->Integer.Value == 0) 160246847Sjkim { 161246847Sjkim /* Allocate a new NULL string object */ 162246847Sjkim 163246847Sjkim NewObject = AcpiUtCreateStringObject (0); 164246847Sjkim if (!NewObject) 165246847Sjkim { 166246847Sjkim return (AE_NO_MEMORY); 167246847Sjkim } 168246847Sjkim } 169246847Sjkim else 170246847Sjkim { 171306536Sjkim Status = AcpiExConvertToString (OriginalObject, 172306536Sjkim &NewObject, ACPI_IMPLICIT_CONVERT_HEX); 173246847Sjkim if (ACPI_FAILURE (Status)) 174246847Sjkim { 175246847Sjkim return (Status); 176246847Sjkim } 177246847Sjkim } 178246847Sjkim break; 179246847Sjkim 180246847Sjkim case ACPI_TYPE_BUFFER: 181246847Sjkim /* 182246847Sjkim * Buffer-to-String conversion. Use a ToString 183246847Sjkim * conversion, no transform performed on the buffer data. The best 184246847Sjkim * example of this is the _BIF method, where the string data from 185246847Sjkim * the battery is often (incorrectly) returned as buffer object(s). 186246847Sjkim */ 187246847Sjkim Length = 0; 188246847Sjkim while ((Length < OriginalObject->Buffer.Length) && 189246847Sjkim (OriginalObject->Buffer.Pointer[Length])) 190246847Sjkim { 191246847Sjkim Length++; 192246847Sjkim } 193246847Sjkim 194246847Sjkim /* Allocate a new string object */ 195246847Sjkim 196246847Sjkim NewObject = AcpiUtCreateStringObject (Length); 197246847Sjkim if (!NewObject) 198246847Sjkim { 199246847Sjkim return (AE_NO_MEMORY); 200246847Sjkim } 201246847Sjkim 202246847Sjkim /* 203246847Sjkim * Copy the raw buffer data with no transform. String is already NULL 204246847Sjkim * terminated at Length+1. 205246847Sjkim */ 206306536Sjkim memcpy (NewObject->String.Pointer, 207246847Sjkim OriginalObject->Buffer.Pointer, Length); 208246847Sjkim break; 209246847Sjkim 210246847Sjkim default: 211250838Sjkim 212246847Sjkim return (AE_AML_OPERAND_TYPE); 213246847Sjkim } 214246847Sjkim 215246847Sjkim *ReturnObject = NewObject; 216246847Sjkim return (AE_OK); 217246847Sjkim} 218246847Sjkim 219246847Sjkim 220246847Sjkim/******************************************************************************* 221246847Sjkim * 222246847Sjkim * FUNCTION: AcpiNsConvertToBuffer 223246847Sjkim * 224246847Sjkim * PARAMETERS: OriginalObject - Object to be converted 225246847Sjkim * ReturnObject - Where the new converted object is returned 226246847Sjkim * 227246847Sjkim * RETURN: Status. AE_OK if conversion was successful. 228246847Sjkim * 229246847Sjkim * DESCRIPTION: Attempt to convert a Integer/String/Package object to a Buffer. 230246847Sjkim * 231246847Sjkim ******************************************************************************/ 232246847Sjkim 233246847SjkimACPI_STATUS 234246847SjkimAcpiNsConvertToBuffer ( 235246847Sjkim ACPI_OPERAND_OBJECT *OriginalObject, 236246847Sjkim ACPI_OPERAND_OBJECT **ReturnObject) 237246847Sjkim{ 238246847Sjkim ACPI_OPERAND_OBJECT *NewObject; 239246847Sjkim ACPI_STATUS Status; 240246847Sjkim ACPI_OPERAND_OBJECT **Elements; 241246847Sjkim UINT32 *DwordBuffer; 242246847Sjkim UINT32 Count; 243246847Sjkim UINT32 i; 244246847Sjkim 245246847Sjkim 246246847Sjkim switch (OriginalObject->Common.Type) 247246847Sjkim { 248246847Sjkim case ACPI_TYPE_INTEGER: 249246847Sjkim /* 250246847Sjkim * Integer-to-Buffer conversion. 251246847Sjkim * Convert the Integer to a packed-byte buffer. _MAT and other 252246847Sjkim * objects need this sometimes, if a read has been performed on a 253246847Sjkim * Field object that is less than or equal to the global integer 254246847Sjkim * size (32 or 64 bits). 255246847Sjkim */ 256246847Sjkim Status = AcpiExConvertToBuffer (OriginalObject, &NewObject); 257246847Sjkim if (ACPI_FAILURE (Status)) 258246847Sjkim { 259246847Sjkim return (Status); 260246847Sjkim } 261246847Sjkim break; 262246847Sjkim 263246847Sjkim case ACPI_TYPE_STRING: 264246847Sjkim 265246847Sjkim /* String-to-Buffer conversion. Simple data copy */ 266246847Sjkim 267306536Sjkim NewObject = AcpiUtCreateBufferObject 268306536Sjkim (OriginalObject->String.Length); 269246847Sjkim if (!NewObject) 270246847Sjkim { 271246847Sjkim return (AE_NO_MEMORY); 272246847Sjkim } 273246847Sjkim 274306536Sjkim memcpy (NewObject->Buffer.Pointer, 275246847Sjkim OriginalObject->String.Pointer, OriginalObject->String.Length); 276246847Sjkim break; 277246847Sjkim 278246847Sjkim case ACPI_TYPE_PACKAGE: 279246847Sjkim /* 280246847Sjkim * This case is often seen for predefined names that must return a 281246847Sjkim * Buffer object with multiple DWORD integers within. For example, 282246847Sjkim * _FDE and _GTM. The Package can be converted to a Buffer. 283246847Sjkim */ 284246847Sjkim 285246847Sjkim /* All elements of the Package must be integers */ 286246847Sjkim 287246847Sjkim Elements = OriginalObject->Package.Elements; 288246847Sjkim Count = OriginalObject->Package.Count; 289246847Sjkim 290246847Sjkim for (i = 0; i < Count; i++) 291246847Sjkim { 292246847Sjkim if ((!*Elements) || 293246847Sjkim ((*Elements)->Common.Type != ACPI_TYPE_INTEGER)) 294246847Sjkim { 295246847Sjkim return (AE_AML_OPERAND_TYPE); 296246847Sjkim } 297246847Sjkim Elements++; 298246847Sjkim } 299246847Sjkim 300246847Sjkim /* Create the new buffer object to replace the Package */ 301246847Sjkim 302246847Sjkim NewObject = AcpiUtCreateBufferObject (ACPI_MUL_4 (Count)); 303246847Sjkim if (!NewObject) 304246847Sjkim { 305246847Sjkim return (AE_NO_MEMORY); 306246847Sjkim } 307246847Sjkim 308246847Sjkim /* Copy the package elements (integers) to the buffer as DWORDs */ 309246847Sjkim 310246847Sjkim Elements = OriginalObject->Package.Elements; 311246847Sjkim DwordBuffer = ACPI_CAST_PTR (UINT32, NewObject->Buffer.Pointer); 312246847Sjkim 313246847Sjkim for (i = 0; i < Count; i++) 314246847Sjkim { 315246847Sjkim *DwordBuffer = (UINT32) (*Elements)->Integer.Value; 316246847Sjkim DwordBuffer++; 317246847Sjkim Elements++; 318246847Sjkim } 319246847Sjkim break; 320246847Sjkim 321246847Sjkim default: 322250838Sjkim 323246847Sjkim return (AE_AML_OPERAND_TYPE); 324246847Sjkim } 325246847Sjkim 326246847Sjkim *ReturnObject = NewObject; 327246847Sjkim return (AE_OK); 328246847Sjkim} 329246847Sjkim 330246847Sjkim 331246847Sjkim/******************************************************************************* 332246847Sjkim * 333246847Sjkim * FUNCTION: AcpiNsConvertToUnicode 334246847Sjkim * 335306536Sjkim * PARAMETERS: Scope - Namespace node for the method/object 336306536Sjkim * OriginalObject - ASCII String Object to be converted 337246847Sjkim * ReturnObject - Where the new converted object is returned 338246847Sjkim * 339246847Sjkim * RETURN: Status. AE_OK if conversion was successful. 340246847Sjkim * 341246847Sjkim * DESCRIPTION: Attempt to convert a String object to a Unicode string Buffer. 342246847Sjkim * 343246847Sjkim ******************************************************************************/ 344246847Sjkim 345246847SjkimACPI_STATUS 346246847SjkimAcpiNsConvertToUnicode ( 347306536Sjkim ACPI_NAMESPACE_NODE *Scope, 348246847Sjkim ACPI_OPERAND_OBJECT *OriginalObject, 349246847Sjkim ACPI_OPERAND_OBJECT **ReturnObject) 350246847Sjkim{ 351246847Sjkim ACPI_OPERAND_OBJECT *NewObject; 352246847Sjkim char *AsciiString; 353246847Sjkim UINT16 *UnicodeBuffer; 354246847Sjkim UINT32 UnicodeLength; 355246847Sjkim UINT32 i; 356246847Sjkim 357246847Sjkim 358246847Sjkim if (!OriginalObject) 359246847Sjkim { 360246847Sjkim return (AE_OK); 361246847Sjkim } 362246847Sjkim 363246847Sjkim /* If a Buffer was returned, it must be at least two bytes long */ 364246847Sjkim 365246847Sjkim if (OriginalObject->Common.Type == ACPI_TYPE_BUFFER) 366246847Sjkim { 367246847Sjkim if (OriginalObject->Buffer.Length < 2) 368246847Sjkim { 369246847Sjkim return (AE_AML_OPERAND_VALUE); 370246847Sjkim } 371246847Sjkim 372246847Sjkim *ReturnObject = NULL; 373246847Sjkim return (AE_OK); 374246847Sjkim } 375246847Sjkim 376246847Sjkim /* 377246847Sjkim * The original object is an ASCII string. Convert this string to 378246847Sjkim * a unicode buffer. 379246847Sjkim */ 380246847Sjkim AsciiString = OriginalObject->String.Pointer; 381246847Sjkim UnicodeLength = (OriginalObject->String.Length * 2) + 2; 382246847Sjkim 383246847Sjkim /* Create a new buffer object for the Unicode data */ 384246847Sjkim 385246847Sjkim NewObject = AcpiUtCreateBufferObject (UnicodeLength); 386246847Sjkim if (!NewObject) 387246847Sjkim { 388246847Sjkim return (AE_NO_MEMORY); 389246847Sjkim } 390246847Sjkim 391246847Sjkim UnicodeBuffer = ACPI_CAST_PTR (UINT16, NewObject->Buffer.Pointer); 392246847Sjkim 393246847Sjkim /* Convert ASCII to Unicode */ 394246847Sjkim 395246847Sjkim for (i = 0; i < OriginalObject->String.Length; i++) 396246847Sjkim { 397246847Sjkim UnicodeBuffer[i] = (UINT16) AsciiString[i]; 398246847Sjkim } 399246847Sjkim 400246847Sjkim *ReturnObject = NewObject; 401246847Sjkim return (AE_OK); 402246847Sjkim} 403246847Sjkim 404246847Sjkim 405246847Sjkim/******************************************************************************* 406246847Sjkim * 407246847Sjkim * FUNCTION: AcpiNsConvertToResource 408246847Sjkim * 409306536Sjkim * PARAMETERS: Scope - Namespace node for the method/object 410306536Sjkim * OriginalObject - Object to be converted 411246847Sjkim * ReturnObject - Where the new converted object is returned 412246847Sjkim * 413246847Sjkim * RETURN: Status. AE_OK if conversion was successful 414246847Sjkim * 415246847Sjkim * DESCRIPTION: Attempt to convert a Integer object to a ResourceTemplate 416246847Sjkim * Buffer. 417246847Sjkim * 418246847Sjkim ******************************************************************************/ 419246847Sjkim 420246847SjkimACPI_STATUS 421246847SjkimAcpiNsConvertToResource ( 422306536Sjkim ACPI_NAMESPACE_NODE *Scope, 423246847Sjkim ACPI_OPERAND_OBJECT *OriginalObject, 424246847Sjkim ACPI_OPERAND_OBJECT **ReturnObject) 425246847Sjkim{ 426246847Sjkim ACPI_OPERAND_OBJECT *NewObject; 427246847Sjkim UINT8 *Buffer; 428246847Sjkim 429246847Sjkim 430246847Sjkim /* 431246847Sjkim * We can fix the following cases for an expected resource template: 432246847Sjkim * 1. No return value (interpreter slack mode is disabled) 433246847Sjkim * 2. A "Return (Zero)" statement 434246847Sjkim * 3. A "Return empty buffer" statement 435246847Sjkim * 436246847Sjkim * We will return a buffer containing a single EndTag 437246847Sjkim * resource descriptor. 438246847Sjkim */ 439246847Sjkim if (OriginalObject) 440246847Sjkim { 441246847Sjkim switch (OriginalObject->Common.Type) 442246847Sjkim { 443246847Sjkim case ACPI_TYPE_INTEGER: 444246847Sjkim 445246847Sjkim /* We can only repair an Integer==0 */ 446246847Sjkim 447246847Sjkim if (OriginalObject->Integer.Value) 448246847Sjkim { 449246847Sjkim return (AE_AML_OPERAND_TYPE); 450246847Sjkim } 451246847Sjkim break; 452246847Sjkim 453246847Sjkim case ACPI_TYPE_BUFFER: 454246847Sjkim 455246847Sjkim if (OriginalObject->Buffer.Length) 456246847Sjkim { 457246847Sjkim /* Additional checks can be added in the future */ 458246847Sjkim 459246847Sjkim *ReturnObject = NULL; 460246847Sjkim return (AE_OK); 461246847Sjkim } 462246847Sjkim break; 463246847Sjkim 464246847Sjkim case ACPI_TYPE_STRING: 465246847Sjkim default: 466246847Sjkim 467246847Sjkim return (AE_AML_OPERAND_TYPE); 468246847Sjkim } 469246847Sjkim } 470246847Sjkim 471246847Sjkim /* Create the new buffer object for the resource descriptor */ 472246847Sjkim 473246847Sjkim NewObject = AcpiUtCreateBufferObject (2); 474246847Sjkim if (!NewObject) 475246847Sjkim { 476246847Sjkim return (AE_NO_MEMORY); 477246847Sjkim } 478246847Sjkim 479246847Sjkim Buffer = ACPI_CAST_PTR (UINT8, NewObject->Buffer.Pointer); 480246847Sjkim 481246847Sjkim /* Initialize the Buffer with a single EndTag descriptor */ 482246847Sjkim 483246847Sjkim Buffer[0] = (ACPI_RESOURCE_NAME_END_TAG | ASL_RDESC_END_TAG_SIZE); 484246847Sjkim Buffer[1] = 0x00; 485246847Sjkim 486246847Sjkim *ReturnObject = NewObject; 487246847Sjkim return (AE_OK); 488246847Sjkim} 489306536Sjkim 490306536Sjkim 491306536Sjkim/******************************************************************************* 492306536Sjkim * 493306536Sjkim * FUNCTION: AcpiNsConvertToReference 494306536Sjkim * 495306536Sjkim * PARAMETERS: Scope - Namespace node for the method/object 496306536Sjkim * OriginalObject - Object to be converted 497306536Sjkim * ReturnObject - Where the new converted object is returned 498306536Sjkim * 499306536Sjkim * RETURN: Status. AE_OK if conversion was successful 500306536Sjkim * 501306536Sjkim * DESCRIPTION: Attempt to convert a Integer object to a ObjectReference. 502306536Sjkim * Buffer. 503306536Sjkim * 504306536Sjkim ******************************************************************************/ 505306536Sjkim 506306536SjkimACPI_STATUS 507306536SjkimAcpiNsConvertToReference ( 508306536Sjkim ACPI_NAMESPACE_NODE *Scope, 509306536Sjkim ACPI_OPERAND_OBJECT *OriginalObject, 510306536Sjkim ACPI_OPERAND_OBJECT **ReturnObject) 511306536Sjkim{ 512306536Sjkim ACPI_OPERAND_OBJECT *NewObject = NULL; 513306536Sjkim ACPI_STATUS Status; 514306536Sjkim ACPI_NAMESPACE_NODE *Node; 515306536Sjkim ACPI_GENERIC_STATE ScopeInfo; 516306536Sjkim char *Name; 517306536Sjkim 518306536Sjkim 519306536Sjkim ACPI_FUNCTION_NAME (NsConvertToReference); 520306536Sjkim 521306536Sjkim 522306536Sjkim /* Convert path into internal presentation */ 523306536Sjkim 524306536Sjkim Status = AcpiNsInternalizeName (OriginalObject->String.Pointer, &Name); 525306536Sjkim if (ACPI_FAILURE (Status)) 526306536Sjkim { 527306536Sjkim return_ACPI_STATUS (Status); 528306536Sjkim } 529306536Sjkim 530306536Sjkim /* Find the namespace node */ 531306536Sjkim 532306536Sjkim ScopeInfo.Scope.Node = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, Scope); 533306536Sjkim Status = AcpiNsLookup (&ScopeInfo, Name, 534306536Sjkim ACPI_TYPE_ANY, ACPI_IMODE_EXECUTE, 535306536Sjkim ACPI_NS_SEARCH_PARENT | ACPI_NS_DONT_OPEN_SCOPE, NULL, &Node); 536306536Sjkim if (ACPI_FAILURE (Status)) 537306536Sjkim { 538306536Sjkim /* Check if we are resolving a named reference within a package */ 539306536Sjkim 540306536Sjkim ACPI_ERROR_NAMESPACE (OriginalObject->String.Pointer, Status); 541306536Sjkim goto ErrorExit; 542306536Sjkim } 543306536Sjkim 544306536Sjkim /* Create and init a new internal ACPI object */ 545306536Sjkim 546306536Sjkim NewObject = AcpiUtCreateInternalObject (ACPI_TYPE_LOCAL_REFERENCE); 547306536Sjkim if (!NewObject) 548306536Sjkim { 549306536Sjkim Status = AE_NO_MEMORY; 550306536Sjkim goto ErrorExit; 551306536Sjkim } 552306536Sjkim NewObject->Reference.Node = Node; 553306536Sjkim NewObject->Reference.Object = Node->Object; 554306536Sjkim NewObject->Reference.Class = ACPI_REFCLASS_NAME; 555306536Sjkim 556306536Sjkim /* 557306536Sjkim * Increase reference of the object if needed (the object is likely a 558306536Sjkim * null for device nodes). 559306536Sjkim */ 560306536Sjkim AcpiUtAddReference (Node->Object); 561306536Sjkim 562306536SjkimErrorExit: 563306536Sjkim ACPI_FREE (Name); 564306536Sjkim *ReturnObject = NewObject; 565306536Sjkim return (AE_OK); 566306536Sjkim} 567