1f556842eSJung-uk Kim /****************************************************************************** 2f556842eSJung-uk Kim * 3f556842eSJung-uk Kim * Module Name: dmextern - Support for External() ASL statements 4f556842eSJung-uk Kim * 5f556842eSJung-uk Kim *****************************************************************************/ 6f556842eSJung-uk Kim 7f556842eSJung-uk Kim /****************************************************************************** 8f556842eSJung-uk Kim * 9f556842eSJung-uk Kim * 1. Copyright Notice 10f556842eSJung-uk Kim * 11f556842eSJung-uk Kim * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. 12f556842eSJung-uk Kim * All rights reserved. 13f556842eSJung-uk Kim * 14f556842eSJung-uk Kim * 2. License 15f556842eSJung-uk Kim * 16f556842eSJung-uk Kim * 2.1. This is your license from Intel Corp. under its intellectual property 17f556842eSJung-uk Kim * rights. You may have additional license terms from the party that provided 18f556842eSJung-uk Kim * you this software, covering your right to use that party's intellectual 19f556842eSJung-uk Kim * property rights. 20f556842eSJung-uk Kim * 21f556842eSJung-uk Kim * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a 22f556842eSJung-uk Kim * copy of the source code appearing in this file ("Covered Code") an 23f556842eSJung-uk Kim * irrevocable, perpetual, worldwide license under Intel's copyrights in the 24f556842eSJung-uk Kim * base code distributed originally by Intel ("Original Intel Code") to copy, 25f556842eSJung-uk Kim * make derivatives, distribute, use and display any portion of the Covered 26f556842eSJung-uk Kim * Code in any form, with the right to sublicense such rights; and 27f556842eSJung-uk Kim * 28f556842eSJung-uk Kim * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent 29f556842eSJung-uk Kim * license (with the right to sublicense), under only those claims of Intel 30f556842eSJung-uk Kim * patents that are infringed by the Original Intel Code, to make, use, sell, 31f556842eSJung-uk Kim * offer to sell, and import the Covered Code and derivative works thereof 32f556842eSJung-uk Kim * solely to the minimum extent necessary to exercise the above copyright 33f556842eSJung-uk Kim * license, and in no event shall the patent license extend to any additions 34f556842eSJung-uk Kim * to or modifications of the Original Intel Code. No other license or right 35f556842eSJung-uk Kim * is granted directly or by implication, estoppel or otherwise; 36f556842eSJung-uk Kim * 37f556842eSJung-uk Kim * The above copyright and patent license is granted only if the following 38f556842eSJung-uk Kim * conditions are met: 39f556842eSJung-uk Kim * 40f556842eSJung-uk Kim * 3. Conditions 41f556842eSJung-uk Kim * 42f556842eSJung-uk Kim * 3.1. Redistribution of Source with Rights to Further Distribute Source. 43f556842eSJung-uk Kim * Redistribution of source code of any substantial portion of the Covered 44f556842eSJung-uk Kim * Code or modification with rights to further distribute source must include 45f556842eSJung-uk Kim * the above Copyright Notice, the above License, this list of Conditions, 46f556842eSJung-uk Kim * and the following Disclaimer and Export Compliance provision. In addition, 47f556842eSJung-uk Kim * Licensee must cause all Covered Code to which Licensee contributes to 48f556842eSJung-uk Kim * contain a file documenting the changes Licensee made to create that Covered 49f556842eSJung-uk Kim * Code and the date of any change. Licensee must include in that file the 50f556842eSJung-uk Kim * documentation of any changes made by any predecessor Licensee. Licensee 51f556842eSJung-uk Kim * must include a prominent statement that the modification is derived, 52f556842eSJung-uk Kim * directly or indirectly, from Original Intel Code. 53f556842eSJung-uk Kim * 54f556842eSJung-uk Kim * 3.2. Redistribution of Source with no Rights to Further Distribute Source. 55f556842eSJung-uk Kim * Redistribution of source code of any substantial portion of the Covered 56f556842eSJung-uk Kim * Code or modification without rights to further distribute source must 57f556842eSJung-uk Kim * include the following Disclaimer and Export Compliance provision in the 58f556842eSJung-uk Kim * documentation and/or other materials provided with distribution. In 59f556842eSJung-uk Kim * addition, Licensee may not authorize further sublicense of source of any 60f556842eSJung-uk Kim * portion of the Covered Code, and must include terms to the effect that the 61f556842eSJung-uk Kim * license from Licensee to its licensee is limited to the intellectual 62f556842eSJung-uk Kim * property embodied in the software Licensee provides to its licensee, and 63f556842eSJung-uk Kim * not to intellectual property embodied in modifications its licensee may 64f556842eSJung-uk Kim * make. 65f556842eSJung-uk Kim * 66f556842eSJung-uk Kim * 3.3. Redistribution of Executable. Redistribution in executable form of any 67f556842eSJung-uk Kim * substantial portion of the Covered Code or modification must reproduce the 68f556842eSJung-uk Kim * above Copyright Notice, and the following Disclaimer and Export Compliance 69f556842eSJung-uk Kim * provision in the documentation and/or other materials provided with the 70f556842eSJung-uk Kim * distribution. 71f556842eSJung-uk Kim * 72f556842eSJung-uk Kim * 3.4. Intel retains all right, title, and interest in and to the Original 73f556842eSJung-uk Kim * Intel Code. 74f556842eSJung-uk Kim * 75f556842eSJung-uk Kim * 3.5. Neither the name Intel nor any other trademark owned or controlled by 76f556842eSJung-uk Kim * Intel shall be used in advertising or otherwise to promote the sale, use or 77f556842eSJung-uk Kim * other dealings in products derived from or relating to the Covered Code 78f556842eSJung-uk Kim * without prior written authorization from Intel. 79f556842eSJung-uk Kim * 80f556842eSJung-uk Kim * 4. Disclaimer and Export Compliance 81f556842eSJung-uk Kim * 82f556842eSJung-uk Kim * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED 83f556842eSJung-uk Kim * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE 84f556842eSJung-uk Kim * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE, 85f556842eSJung-uk Kim * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY 86f556842eSJung-uk Kim * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY 87f556842eSJung-uk Kim * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A 88f556842eSJung-uk Kim * PARTICULAR PURPOSE. 89f556842eSJung-uk Kim * 90f556842eSJung-uk Kim * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES 91f556842eSJung-uk Kim * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR 92f556842eSJung-uk Kim * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT, 93f556842eSJung-uk Kim * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY 94f556842eSJung-uk Kim * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL 95f556842eSJung-uk Kim * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS 96f556842eSJung-uk Kim * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY 97f556842eSJung-uk Kim * LIMITED REMEDY. 98f556842eSJung-uk Kim * 99f556842eSJung-uk Kim * 4.3. Licensee shall not export, either directly or indirectly, any of this 100f556842eSJung-uk Kim * software or system incorporating such software without first obtaining any 101f556842eSJung-uk Kim * required license or other approval from the U. S. Department of Commerce or 102f556842eSJung-uk Kim * any other agency or department of the United States Government. In the 103f556842eSJung-uk Kim * event Licensee exports any such software from the United States or 104f556842eSJung-uk Kim * re-exports any such software from a foreign destination, Licensee shall 105f556842eSJung-uk Kim * ensure that the distribution and export/re-export of the software is in 106f556842eSJung-uk Kim * compliance with all laws, regulations, orders, or other restrictions of the 107f556842eSJung-uk Kim * U.S. Export Administration Regulations. Licensee agrees that neither it nor 108f556842eSJung-uk Kim * any of its subsidiaries will export/re-export any technical data, process, 109f556842eSJung-uk Kim * software, or service, directly or indirectly, to any country for which the 110f556842eSJung-uk Kim * United States government or any agency thereof requires an export license, 111f556842eSJung-uk Kim * other governmental approval, or letter of assurance, without first obtaining 112f556842eSJung-uk Kim * such license, approval or letter. 113f556842eSJung-uk Kim * 114f556842eSJung-uk Kim *****************************************************************************/ 115f556842eSJung-uk Kim 116f556842eSJung-uk Kim #include <contrib/dev/acpica/include/acpi.h> 117f556842eSJung-uk Kim #include <contrib/dev/acpica/include/accommon.h> 118f556842eSJung-uk Kim #include <contrib/dev/acpica/include/amlcode.h> 119f556842eSJung-uk Kim #include <contrib/dev/acpica/include/acnamesp.h> 120f556842eSJung-uk Kim #include <contrib/dev/acpica/include/acdisasm.h> 121f556842eSJung-uk Kim 122f556842eSJung-uk Kim 123f556842eSJung-uk Kim /* 124f556842eSJung-uk Kim * This module is used for application-level code (iASL disassembler) only. 125f556842eSJung-uk Kim * 126f556842eSJung-uk Kim * It contains the code to create and emit any necessary External() ASL 127f556842eSJung-uk Kim * statements for the module being disassembled. 128f556842eSJung-uk Kim */ 129f556842eSJung-uk Kim #define _COMPONENT ACPI_CA_DISASSEMBLER 130f556842eSJung-uk Kim ACPI_MODULE_NAME ("dmextern") 131f556842eSJung-uk Kim 132f556842eSJung-uk Kim 133f556842eSJung-uk Kim /* 134f556842eSJung-uk Kim * This table maps ACPI_OBJECT_TYPEs to the corresponding ASL 135f556842eSJung-uk Kim * ObjectTypeKeyword. Used to generate typed external declarations 136f556842eSJung-uk Kim */ 137f556842eSJung-uk Kim static const char *AcpiGbl_DmTypeNames[] = 138f556842eSJung-uk Kim { 139f556842eSJung-uk Kim /* 00 */ "", /* Type ANY */ 140f556842eSJung-uk Kim /* 01 */ ", IntObj", 141f556842eSJung-uk Kim /* 02 */ ", StrObj", 142f556842eSJung-uk Kim /* 03 */ ", BuffObj", 143f556842eSJung-uk Kim /* 04 */ ", PkgObj", 144f556842eSJung-uk Kim /* 05 */ ", FieldUnitObj", 145f556842eSJung-uk Kim /* 06 */ ", DeviceObj", 146f556842eSJung-uk Kim /* 07 */ ", EventObj", 147f556842eSJung-uk Kim /* 08 */ ", MethodObj", 148f556842eSJung-uk Kim /* 09 */ ", MutexObj", 149f556842eSJung-uk Kim /* 10 */ ", OpRegionObj", 150f556842eSJung-uk Kim /* 11 */ ", PowerResObj", 151f556842eSJung-uk Kim /* 12 */ ", ProcessorObj", 152f556842eSJung-uk Kim /* 13 */ ", ThermalZoneObj", 153f556842eSJung-uk Kim /* 14 */ ", BuffFieldObj", 154f556842eSJung-uk Kim /* 15 */ ", DDBHandleObj", 155f556842eSJung-uk Kim /* 16 */ "", /* Debug object */ 156f556842eSJung-uk Kim /* 17 */ ", FieldUnitObj", 157f556842eSJung-uk Kim /* 18 */ ", FieldUnitObj", 158f556842eSJung-uk Kim /* 19 */ ", FieldUnitObj" 159f556842eSJung-uk Kim }; 160f556842eSJung-uk Kim 161f556842eSJung-uk Kim 162f556842eSJung-uk Kim /* Local prototypes */ 163f556842eSJung-uk Kim 164f556842eSJung-uk Kim static const char * 165f556842eSJung-uk Kim AcpiDmGetObjectTypeName ( 166f556842eSJung-uk Kim ACPI_OBJECT_TYPE Type); 167f556842eSJung-uk Kim 168f556842eSJung-uk Kim static char * 169f556842eSJung-uk Kim AcpiDmNormalizeParentPrefix ( 170f556842eSJung-uk Kim ACPI_PARSE_OBJECT *Op, 171f556842eSJung-uk Kim char *Path); 172f556842eSJung-uk Kim 173f556842eSJung-uk Kim 174f556842eSJung-uk Kim /******************************************************************************* 175f556842eSJung-uk Kim * 176f556842eSJung-uk Kim * FUNCTION: AcpiDmGetObjectTypeName 177f556842eSJung-uk Kim * 178f556842eSJung-uk Kim * PARAMETERS: Type - An ACPI_OBJECT_TYPE 179f556842eSJung-uk Kim * 180f556842eSJung-uk Kim * RETURN: Pointer to a string 181f556842eSJung-uk Kim * 182f556842eSJung-uk Kim * DESCRIPTION: Map an object type to the ASL object type string. 183f556842eSJung-uk Kim * 184f556842eSJung-uk Kim ******************************************************************************/ 185f556842eSJung-uk Kim 186f556842eSJung-uk Kim static const char * 187f556842eSJung-uk Kim AcpiDmGetObjectTypeName ( 188f556842eSJung-uk Kim ACPI_OBJECT_TYPE Type) 189f556842eSJung-uk Kim { 190f556842eSJung-uk Kim 191f556842eSJung-uk Kim if (Type == ACPI_TYPE_LOCAL_SCOPE) 192f556842eSJung-uk Kim { 193f556842eSJung-uk Kim Type = ACPI_TYPE_DEVICE; 194f556842eSJung-uk Kim } 195f556842eSJung-uk Kim 196f556842eSJung-uk Kim else if (Type > ACPI_TYPE_LOCAL_INDEX_FIELD) 197f556842eSJung-uk Kim { 198f556842eSJung-uk Kim return (""); 199f556842eSJung-uk Kim } 200f556842eSJung-uk Kim 201f556842eSJung-uk Kim return (AcpiGbl_DmTypeNames[Type]); 202f556842eSJung-uk Kim } 203f556842eSJung-uk Kim 204f556842eSJung-uk Kim 205f556842eSJung-uk Kim /******************************************************************************* 206f556842eSJung-uk Kim * 207f556842eSJung-uk Kim * FUNCTION: AcpiDmNormalizeParentPrefix 208f556842eSJung-uk Kim * 209f556842eSJung-uk Kim * PARAMETERS: Op - Parse op 210f556842eSJung-uk Kim * Path - Path with parent prefix 211f556842eSJung-uk Kim * 212f556842eSJung-uk Kim * RETURN: The full pathname to the object (from the namespace root) 213f556842eSJung-uk Kim * 214f556842eSJung-uk Kim * DESCRIPTION: Returns the full pathname of a path with parent prefix 215f556842eSJung-uk Kim * The caller must free the fullpath returned. 216f556842eSJung-uk Kim * 217f556842eSJung-uk Kim ******************************************************************************/ 218f556842eSJung-uk Kim 219f556842eSJung-uk Kim static char * 220f556842eSJung-uk Kim AcpiDmNormalizeParentPrefix ( 221f556842eSJung-uk Kim ACPI_PARSE_OBJECT *Op, 222f556842eSJung-uk Kim char *Path) 223f556842eSJung-uk Kim { 224f556842eSJung-uk Kim ACPI_NAMESPACE_NODE *Node; 225f556842eSJung-uk Kim char *Fullpath; 226f556842eSJung-uk Kim char *ParentPath; 227f556842eSJung-uk Kim ACPI_SIZE Length; 228f556842eSJung-uk Kim 229f556842eSJung-uk Kim 230f556842eSJung-uk Kim /* Search upwards in the parse tree until we reach a namespace node */ 231f556842eSJung-uk Kim 232f556842eSJung-uk Kim while (Op) 233f556842eSJung-uk Kim { 234f556842eSJung-uk Kim if (Op->Common.Node) 235f556842eSJung-uk Kim { 236f556842eSJung-uk Kim break; 237f556842eSJung-uk Kim } 238f556842eSJung-uk Kim 239f556842eSJung-uk Kim Op = Op->Common.Parent; 240f556842eSJung-uk Kim } 241f556842eSJung-uk Kim 242f556842eSJung-uk Kim if (!Op) 243f556842eSJung-uk Kim { 244f556842eSJung-uk Kim return (NULL); 245f556842eSJung-uk Kim } 246f556842eSJung-uk Kim 247f556842eSJung-uk Kim /* 248f556842eSJung-uk Kim * Find the actual parent node for the reference: 249f556842eSJung-uk Kim * Remove all carat prefixes from the input path. 250f556842eSJung-uk Kim * There may be multiple parent prefixes (For example, ^^^M000) 251f556842eSJung-uk Kim */ 252f556842eSJung-uk Kim Node = Op->Common.Node; 253f556842eSJung-uk Kim while (Node && (*Path == (UINT8) AML_PARENT_PREFIX)) 254f556842eSJung-uk Kim { 255f556842eSJung-uk Kim Node = AcpiNsGetParentNode (Node); 256f556842eSJung-uk Kim Path++; 257f556842eSJung-uk Kim } 258f556842eSJung-uk Kim 259f556842eSJung-uk Kim if (!Node) 260f556842eSJung-uk Kim { 261f556842eSJung-uk Kim return (NULL); 262f556842eSJung-uk Kim } 263f556842eSJung-uk Kim 264f556842eSJung-uk Kim /* Get the full pathname for the parent node */ 265f556842eSJung-uk Kim 266f556842eSJung-uk Kim ParentPath = AcpiNsGetExternalPathname (Node); 267f556842eSJung-uk Kim if (!ParentPath) 268f556842eSJung-uk Kim { 269f556842eSJung-uk Kim return (NULL); 270f556842eSJung-uk Kim } 271f556842eSJung-uk Kim 272f556842eSJung-uk Kim Length = (ACPI_STRLEN (ParentPath) + ACPI_STRLEN (Path) + 1); 273f556842eSJung-uk Kim Fullpath = ACPI_ALLOCATE_ZEROED (Length); 274f556842eSJung-uk Kim if (!Fullpath) 275f556842eSJung-uk Kim { 276f556842eSJung-uk Kim goto Cleanup; 277f556842eSJung-uk Kim } 278f556842eSJung-uk Kim 279f556842eSJung-uk Kim /* 280f556842eSJung-uk Kim * Concatenate parent fullpath and path. For example, 281f556842eSJung-uk Kim * parent fullpath "\_SB_", Path "^INIT", Fullpath "\_SB_.INIT" 282f556842eSJung-uk Kim * 283f556842eSJung-uk Kim * Copy the parent path 284f556842eSJung-uk Kim */ 285f556842eSJung-uk Kim ACPI_STRCAT (Fullpath, ParentPath); 286f556842eSJung-uk Kim 287f556842eSJung-uk Kim /* Add dot separator (don't need dot if parent fullpath is a single "\") */ 288f556842eSJung-uk Kim 289f556842eSJung-uk Kim if (ParentPath[1]) 290f556842eSJung-uk Kim { 291f556842eSJung-uk Kim ACPI_STRCAT (Fullpath, "."); 292f556842eSJung-uk Kim } 293f556842eSJung-uk Kim 294f556842eSJung-uk Kim /* Copy child path (carat parent prefix(es) were skipped above) */ 295f556842eSJung-uk Kim 296f556842eSJung-uk Kim ACPI_STRCAT (Fullpath, Path); 297f556842eSJung-uk Kim 298f556842eSJung-uk Kim Cleanup: 299f556842eSJung-uk Kim ACPI_FREE (ParentPath); 300f556842eSJung-uk Kim return (Fullpath); 301f556842eSJung-uk Kim } 302f556842eSJung-uk Kim 303f556842eSJung-uk Kim 304f556842eSJung-uk Kim /******************************************************************************* 305f556842eSJung-uk Kim * 306f556842eSJung-uk Kim * FUNCTION: AcpiDmAddToExternalList 307f556842eSJung-uk Kim * 308f556842eSJung-uk Kim * PARAMETERS: Op - Current parser Op 309f556842eSJung-uk Kim * Path - Internal (AML) path to the object 310f556842eSJung-uk Kim * Type - ACPI object type to be added 311f556842eSJung-uk Kim * Value - Arg count if adding a Method object 312f556842eSJung-uk Kim * 313f556842eSJung-uk Kim * RETURN: None 314f556842eSJung-uk Kim * 315f556842eSJung-uk Kim * DESCRIPTION: Insert a new name into the global list of Externals which 316f556842eSJung-uk Kim * will in turn be later emitted as an External() declaration 317f556842eSJung-uk Kim * in the disassembled output. 318f556842eSJung-uk Kim * 319f556842eSJung-uk Kim ******************************************************************************/ 320f556842eSJung-uk Kim 321f556842eSJung-uk Kim void 322f556842eSJung-uk Kim AcpiDmAddToExternalList ( 323f556842eSJung-uk Kim ACPI_PARSE_OBJECT *Op, 324f556842eSJung-uk Kim char *Path, 325f556842eSJung-uk Kim UINT8 Type, 326f556842eSJung-uk Kim UINT32 Value) 327f556842eSJung-uk Kim { 328f556842eSJung-uk Kim char *ExternalPath; 329f556842eSJung-uk Kim char *Fullpath = NULL; 330f556842eSJung-uk Kim ACPI_EXTERNAL_LIST *NewExternal; 331f556842eSJung-uk Kim ACPI_EXTERNAL_LIST *NextExternal; 332f556842eSJung-uk Kim ACPI_EXTERNAL_LIST *PrevExternal = NULL; 333f556842eSJung-uk Kim ACPI_STATUS Status; 334f556842eSJung-uk Kim 335f556842eSJung-uk Kim 336f556842eSJung-uk Kim if (!Path) 337f556842eSJung-uk Kim { 338f556842eSJung-uk Kim return; 339f556842eSJung-uk Kim } 340f556842eSJung-uk Kim 341f556842eSJung-uk Kim /* Externalize the ACPI path */ 342f556842eSJung-uk Kim 343f556842eSJung-uk Kim Status = AcpiNsExternalizeName (ACPI_UINT32_MAX, Path, 344f556842eSJung-uk Kim NULL, &ExternalPath); 345f556842eSJung-uk Kim if (ACPI_FAILURE (Status)) 346f556842eSJung-uk Kim { 347f556842eSJung-uk Kim return; 348f556842eSJung-uk Kim } 349f556842eSJung-uk Kim 350f556842eSJung-uk Kim /* Get the full pathname from root if "Path" has a parent prefix */ 351f556842eSJung-uk Kim 352f556842eSJung-uk Kim if (*Path == (UINT8) AML_PARENT_PREFIX) 353f556842eSJung-uk Kim { 354f556842eSJung-uk Kim Fullpath = AcpiDmNormalizeParentPrefix (Op, ExternalPath); 355f556842eSJung-uk Kim if (Fullpath) 356f556842eSJung-uk Kim { 357f556842eSJung-uk Kim /* Set new external path */ 358f556842eSJung-uk Kim 359f556842eSJung-uk Kim ACPI_FREE (ExternalPath); 360f556842eSJung-uk Kim ExternalPath = Fullpath; 361f556842eSJung-uk Kim } 362f556842eSJung-uk Kim } 363f556842eSJung-uk Kim 364f556842eSJung-uk Kim /* Check all existing externals to ensure no duplicates */ 365f556842eSJung-uk Kim 366f556842eSJung-uk Kim NextExternal = AcpiGbl_ExternalList; 367f556842eSJung-uk Kim while (NextExternal) 368f556842eSJung-uk Kim { 369f556842eSJung-uk Kim if (!ACPI_STRCMP (ExternalPath, NextExternal->Path)) 370f556842eSJung-uk Kim { 371f556842eSJung-uk Kim /* Duplicate method, check that the Value (ArgCount) is the same */ 372f556842eSJung-uk Kim 373f556842eSJung-uk Kim if ((NextExternal->Type == ACPI_TYPE_METHOD) && 374f556842eSJung-uk Kim (NextExternal->Value != Value)) 375f556842eSJung-uk Kim { 376f556842eSJung-uk Kim ACPI_ERROR ((AE_INFO, 377f556842eSJung-uk Kim "Argument count mismatch for method %s %d %d", 378f556842eSJung-uk Kim NextExternal->Path, NextExternal->Value, Value)); 379f556842eSJung-uk Kim } 380f556842eSJung-uk Kim 381f556842eSJung-uk Kim /* Allow upgrade of type from ANY */ 382f556842eSJung-uk Kim 383f556842eSJung-uk Kim else if (NextExternal->Type == ACPI_TYPE_ANY) 384f556842eSJung-uk Kim { 385f556842eSJung-uk Kim NextExternal->Type = Type; 386f556842eSJung-uk Kim NextExternal->Value = Value; 387f556842eSJung-uk Kim } 388f556842eSJung-uk Kim 389f556842eSJung-uk Kim ACPI_FREE (ExternalPath); 390f556842eSJung-uk Kim return; 391f556842eSJung-uk Kim } 392f556842eSJung-uk Kim 393f556842eSJung-uk Kim NextExternal = NextExternal->Next; 394f556842eSJung-uk Kim } 395f556842eSJung-uk Kim 396f556842eSJung-uk Kim /* Allocate and init a new External() descriptor */ 397f556842eSJung-uk Kim 398f556842eSJung-uk Kim NewExternal = ACPI_ALLOCATE_ZEROED (sizeof (ACPI_EXTERNAL_LIST)); 399f556842eSJung-uk Kim if (!NewExternal) 400f556842eSJung-uk Kim { 401f556842eSJung-uk Kim ACPI_FREE (ExternalPath); 402f556842eSJung-uk Kim return; 403f556842eSJung-uk Kim } 404f556842eSJung-uk Kim 405f556842eSJung-uk Kim NewExternal->Path = ExternalPath; 406f556842eSJung-uk Kim NewExternal->Type = Type; 407f556842eSJung-uk Kim NewExternal->Value = Value; 408f556842eSJung-uk Kim NewExternal->Length = (UINT16) ACPI_STRLEN (ExternalPath); 409f556842eSJung-uk Kim 410f556842eSJung-uk Kim /* Was the external path with parent prefix normalized to a fullpath? */ 411f556842eSJung-uk Kim 412f556842eSJung-uk Kim if (Fullpath == ExternalPath) 413f556842eSJung-uk Kim { 414f556842eSJung-uk Kim /* Get new internal path */ 415f556842eSJung-uk Kim 416f556842eSJung-uk Kim Status = AcpiNsInternalizeName (ExternalPath, &Path); 417f556842eSJung-uk Kim if (ACPI_FAILURE (Status)) 418f556842eSJung-uk Kim { 419f556842eSJung-uk Kim ACPI_FREE (ExternalPath); 420f556842eSJung-uk Kim ACPI_FREE (NewExternal); 421f556842eSJung-uk Kim return; 422f556842eSJung-uk Kim } 423f556842eSJung-uk Kim 424f556842eSJung-uk Kim /* Set flag to indicate External->InternalPath need to be freed */ 425f556842eSJung-uk Kim 426f556842eSJung-uk Kim NewExternal->Flags |= ACPI_IPATH_ALLOCATED; 427f556842eSJung-uk Kim } 428f556842eSJung-uk Kim 429f556842eSJung-uk Kim NewExternal->InternalPath = Path; 430f556842eSJung-uk Kim 431f556842eSJung-uk Kim /* Link the new descriptor into the global list, ordered by string length */ 432f556842eSJung-uk Kim 433f556842eSJung-uk Kim NextExternal = AcpiGbl_ExternalList; 434f556842eSJung-uk Kim while (NextExternal) 435f556842eSJung-uk Kim { 436f556842eSJung-uk Kim if (NewExternal->Length <= NextExternal->Length) 437f556842eSJung-uk Kim { 438f556842eSJung-uk Kim if (PrevExternal) 439f556842eSJung-uk Kim { 440f556842eSJung-uk Kim PrevExternal->Next = NewExternal; 441f556842eSJung-uk Kim } 442f556842eSJung-uk Kim else 443f556842eSJung-uk Kim { 444f556842eSJung-uk Kim AcpiGbl_ExternalList = NewExternal; 445f556842eSJung-uk Kim } 446f556842eSJung-uk Kim 447f556842eSJung-uk Kim NewExternal->Next = NextExternal; 448f556842eSJung-uk Kim return; 449f556842eSJung-uk Kim } 450f556842eSJung-uk Kim 451f556842eSJung-uk Kim PrevExternal = NextExternal; 452f556842eSJung-uk Kim NextExternal = NextExternal->Next; 453f556842eSJung-uk Kim } 454f556842eSJung-uk Kim 455f556842eSJung-uk Kim if (PrevExternal) 456f556842eSJung-uk Kim { 457f556842eSJung-uk Kim PrevExternal->Next = NewExternal; 458f556842eSJung-uk Kim } 459f556842eSJung-uk Kim else 460f556842eSJung-uk Kim { 461f556842eSJung-uk Kim AcpiGbl_ExternalList = NewExternal; 462f556842eSJung-uk Kim } 463f556842eSJung-uk Kim } 464f556842eSJung-uk Kim 465f556842eSJung-uk Kim 466f556842eSJung-uk Kim /******************************************************************************* 467f556842eSJung-uk Kim * 468f556842eSJung-uk Kim * FUNCTION: AcpiDmAddExternalsToNamespace 469f556842eSJung-uk Kim * 470f556842eSJung-uk Kim * PARAMETERS: None 471f556842eSJung-uk Kim * 472f556842eSJung-uk Kim * RETURN: None 473f556842eSJung-uk Kim * 474f556842eSJung-uk Kim * DESCRIPTION: Add all externals to the namespace. Allows externals to be 475f556842eSJung-uk Kim * "resolved". 476f556842eSJung-uk Kim * 477f556842eSJung-uk Kim ******************************************************************************/ 478f556842eSJung-uk Kim 479f556842eSJung-uk Kim void 480f556842eSJung-uk Kim AcpiDmAddExternalsToNamespace ( 481f556842eSJung-uk Kim void) 482f556842eSJung-uk Kim { 483f556842eSJung-uk Kim ACPI_STATUS Status; 484f556842eSJung-uk Kim ACPI_NAMESPACE_NODE *Node; 485f556842eSJung-uk Kim ACPI_OPERAND_OBJECT *MethodDesc; 486f556842eSJung-uk Kim ACPI_EXTERNAL_LIST *External = AcpiGbl_ExternalList; 487f556842eSJung-uk Kim 488f556842eSJung-uk Kim 489f556842eSJung-uk Kim while (External) 490f556842eSJung-uk Kim { 491f556842eSJung-uk Kim /* Add the external name (object) into the namespace */ 492f556842eSJung-uk Kim 493f556842eSJung-uk Kim Status = AcpiNsLookup (NULL, External->InternalPath, External->Type, 494f556842eSJung-uk Kim ACPI_IMODE_LOAD_PASS1, 495f556842eSJung-uk Kim ACPI_NS_EXTERNAL | ACPI_NS_DONT_OPEN_SCOPE, 496f556842eSJung-uk Kim NULL, &Node); 497f556842eSJung-uk Kim 498f556842eSJung-uk Kim if (ACPI_FAILURE (Status)) 499f556842eSJung-uk Kim { 500f556842eSJung-uk Kim ACPI_EXCEPTION ((AE_INFO, Status, 501f556842eSJung-uk Kim "while adding external to namespace [%s]", 502f556842eSJung-uk Kim External->Path)); 503f556842eSJung-uk Kim } 504f556842eSJung-uk Kim else if (External->Type == ACPI_TYPE_METHOD) 505f556842eSJung-uk Kim { 506f556842eSJung-uk Kim /* For methods, we need to save the argument count */ 507f556842eSJung-uk Kim 508f556842eSJung-uk Kim MethodDesc = AcpiUtCreateInternalObject (ACPI_TYPE_METHOD); 509f556842eSJung-uk Kim MethodDesc->Method.ParamCount = (UINT8) External->Value; 510f556842eSJung-uk Kim Node->Object = MethodDesc; 511f556842eSJung-uk Kim } 512f556842eSJung-uk Kim 513f556842eSJung-uk Kim External = External->Next; 514f556842eSJung-uk Kim } 515f556842eSJung-uk Kim } 516f556842eSJung-uk Kim 517f556842eSJung-uk Kim 518f556842eSJung-uk Kim /******************************************************************************* 519f556842eSJung-uk Kim * 520f556842eSJung-uk Kim * FUNCTION: AcpiDmGetExternalMethodCount 521f556842eSJung-uk Kim * 522f556842eSJung-uk Kim * PARAMETERS: None 523f556842eSJung-uk Kim * 524f556842eSJung-uk Kim * RETURN: The number of control method externals in the external list 525f556842eSJung-uk Kim * 526f556842eSJung-uk Kim * DESCRIPTION: Return the number of method externals that have been generated. 527f556842eSJung-uk Kim * If any control method externals have been found, we must 528f556842eSJung-uk Kim * re-parse the entire definition block with the new information 529f556842eSJung-uk Kim * (number of arguments for the methods.) This is limitation of 530f556842eSJung-uk Kim * AML, we don't know the number of arguments from the control 531f556842eSJung-uk Kim * method invocation itself. 532f556842eSJung-uk Kim * 533f556842eSJung-uk Kim ******************************************************************************/ 534f556842eSJung-uk Kim 535f556842eSJung-uk Kim UINT32 536f556842eSJung-uk Kim AcpiDmGetExternalMethodCount ( 537f556842eSJung-uk Kim void) 538f556842eSJung-uk Kim { 539f556842eSJung-uk Kim ACPI_EXTERNAL_LIST *External = AcpiGbl_ExternalList; 540f556842eSJung-uk Kim UINT32 Count = 0; 541f556842eSJung-uk Kim 542f556842eSJung-uk Kim 543f556842eSJung-uk Kim while (External) 544f556842eSJung-uk Kim { 545f556842eSJung-uk Kim if (External->Type == ACPI_TYPE_METHOD) 546f556842eSJung-uk Kim { 547f556842eSJung-uk Kim Count++; 548f556842eSJung-uk Kim } 549f556842eSJung-uk Kim 550f556842eSJung-uk Kim External = External->Next; 551f556842eSJung-uk Kim } 552f556842eSJung-uk Kim 553f556842eSJung-uk Kim return (Count); 554f556842eSJung-uk Kim } 555f556842eSJung-uk Kim 556f556842eSJung-uk Kim 557f556842eSJung-uk Kim /******************************************************************************* 558f556842eSJung-uk Kim * 559f556842eSJung-uk Kim * FUNCTION: AcpiDmClearExternalList 560f556842eSJung-uk Kim * 561f556842eSJung-uk Kim * PARAMETERS: None 562f556842eSJung-uk Kim * 563f556842eSJung-uk Kim * RETURN: None 564f556842eSJung-uk Kim * 565f556842eSJung-uk Kim * DESCRIPTION: Free the entire External info list 566f556842eSJung-uk Kim * 567f556842eSJung-uk Kim ******************************************************************************/ 568f556842eSJung-uk Kim 569f556842eSJung-uk Kim void 570f556842eSJung-uk Kim AcpiDmClearExternalList ( 571f556842eSJung-uk Kim void) 572f556842eSJung-uk Kim { 573f556842eSJung-uk Kim ACPI_EXTERNAL_LIST *NextExternal; 574f556842eSJung-uk Kim 575f556842eSJung-uk Kim 576f556842eSJung-uk Kim while (AcpiGbl_ExternalList) 577f556842eSJung-uk Kim { 578f556842eSJung-uk Kim NextExternal = AcpiGbl_ExternalList->Next; 579f556842eSJung-uk Kim ACPI_FREE (AcpiGbl_ExternalList->Path); 580f556842eSJung-uk Kim ACPI_FREE (AcpiGbl_ExternalList); 581f556842eSJung-uk Kim AcpiGbl_ExternalList = NextExternal; 582f556842eSJung-uk Kim } 583f556842eSJung-uk Kim } 584f556842eSJung-uk Kim 585f556842eSJung-uk Kim 586f556842eSJung-uk Kim /******************************************************************************* 587f556842eSJung-uk Kim * 588f556842eSJung-uk Kim * FUNCTION: AcpiDmEmitExternals 589f556842eSJung-uk Kim * 590f556842eSJung-uk Kim * PARAMETERS: None 591f556842eSJung-uk Kim * 592f556842eSJung-uk Kim * RETURN: None 593f556842eSJung-uk Kim * 594f556842eSJung-uk Kim * DESCRIPTION: Emit an External() ASL statement for each of the externals in 595f556842eSJung-uk Kim * the global external info list. 596f556842eSJung-uk Kim * 597f556842eSJung-uk Kim ******************************************************************************/ 598f556842eSJung-uk Kim 599f556842eSJung-uk Kim void 600f556842eSJung-uk Kim AcpiDmEmitExternals ( 601f556842eSJung-uk Kim void) 602f556842eSJung-uk Kim { 603f556842eSJung-uk Kim ACPI_EXTERNAL_LIST *NextExternal; 604f556842eSJung-uk Kim 605f556842eSJung-uk Kim 606f556842eSJung-uk Kim if (!AcpiGbl_ExternalList) 607f556842eSJung-uk Kim { 608f556842eSJung-uk Kim return; 609f556842eSJung-uk Kim } 610f556842eSJung-uk Kim 611f556842eSJung-uk Kim /* 612f556842eSJung-uk Kim * Walk the list of externals (unresolved references) 613f556842eSJung-uk Kim * found during the AML parsing 614f556842eSJung-uk Kim */ 615f556842eSJung-uk Kim while (AcpiGbl_ExternalList) 616f556842eSJung-uk Kim { 617f556842eSJung-uk Kim AcpiOsPrintf (" External (%s%s", 618f556842eSJung-uk Kim AcpiGbl_ExternalList->Path, 619f556842eSJung-uk Kim AcpiDmGetObjectTypeName (AcpiGbl_ExternalList->Type)); 620f556842eSJung-uk Kim 621f556842eSJung-uk Kim if (AcpiGbl_ExternalList->Type == ACPI_TYPE_METHOD) 622f556842eSJung-uk Kim { 623f556842eSJung-uk Kim AcpiOsPrintf (") // %d Arguments\n", 624f556842eSJung-uk Kim AcpiGbl_ExternalList->Value); 625f556842eSJung-uk Kim } 626f556842eSJung-uk Kim else 627f556842eSJung-uk Kim { 628f556842eSJung-uk Kim AcpiOsPrintf (")\n"); 629f556842eSJung-uk Kim } 630f556842eSJung-uk Kim 631f556842eSJung-uk Kim /* Free this external info block and move on to next external */ 632f556842eSJung-uk Kim 633f556842eSJung-uk Kim NextExternal = AcpiGbl_ExternalList->Next; 634f556842eSJung-uk Kim if (AcpiGbl_ExternalList->Flags & ACPI_IPATH_ALLOCATED) 635f556842eSJung-uk Kim { 636f556842eSJung-uk Kim ACPI_FREE (AcpiGbl_ExternalList->InternalPath); 637f556842eSJung-uk Kim } 638f556842eSJung-uk Kim 639f556842eSJung-uk Kim ACPI_FREE (AcpiGbl_ExternalList->Path); 640f556842eSJung-uk Kim ACPI_FREE (AcpiGbl_ExternalList); 641f556842eSJung-uk Kim AcpiGbl_ExternalList = NextExternal; 642f556842eSJung-uk Kim } 643f556842eSJung-uk Kim 644f556842eSJung-uk Kim AcpiOsPrintf ("\n"); 645f556842eSJung-uk Kim } 646f556842eSJung-uk Kim 647