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 * 119a179dd8SJung-uk Kim * Some or all of this work - Copyright (c) 1999 - 2010, 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); 2738c8be05fSJung-uk Kim if (ParentPath[1]) 2748c8be05fSJung-uk Kim { 2758c8be05fSJung-uk Kim /* 2768c8be05fSJung-uk Kim * If ParentPath is not just a simple '\', increment the length 2778c8be05fSJung-uk Kim * for the required dot separator (ParentPath.Path) 2788c8be05fSJung-uk Kim */ 2798c8be05fSJung-uk Kim Length++; 2808c8be05fSJung-uk Kim } 2818c8be05fSJung-uk Kim 282f556842eSJung-uk Kim Fullpath = ACPI_ALLOCATE_ZEROED (Length); 283f556842eSJung-uk Kim if (!Fullpath) 284f556842eSJung-uk Kim { 285f556842eSJung-uk Kim goto Cleanup; 286f556842eSJung-uk Kim } 287f556842eSJung-uk Kim 288f556842eSJung-uk Kim /* 289f556842eSJung-uk Kim * Concatenate parent fullpath and path. For example, 290f556842eSJung-uk Kim * parent fullpath "\_SB_", Path "^INIT", Fullpath "\_SB_.INIT" 291f556842eSJung-uk Kim * 292f556842eSJung-uk Kim * Copy the parent path 293f556842eSJung-uk Kim */ 294f556842eSJung-uk Kim ACPI_STRCAT (Fullpath, ParentPath); 295f556842eSJung-uk Kim 296f556842eSJung-uk Kim /* Add dot separator (don't need dot if parent fullpath is a single "\") */ 297f556842eSJung-uk Kim 298f556842eSJung-uk Kim if (ParentPath[1]) 299f556842eSJung-uk Kim { 300f556842eSJung-uk Kim ACPI_STRCAT (Fullpath, "."); 301f556842eSJung-uk Kim } 302f556842eSJung-uk Kim 303f556842eSJung-uk Kim /* Copy child path (carat parent prefix(es) were skipped above) */ 304f556842eSJung-uk Kim 305f556842eSJung-uk Kim ACPI_STRCAT (Fullpath, Path); 306f556842eSJung-uk Kim 307f556842eSJung-uk Kim Cleanup: 308f556842eSJung-uk Kim ACPI_FREE (ParentPath); 309f556842eSJung-uk Kim return (Fullpath); 310f556842eSJung-uk Kim } 311f556842eSJung-uk Kim 312f556842eSJung-uk Kim 313f556842eSJung-uk Kim /******************************************************************************* 314f556842eSJung-uk Kim * 315f556842eSJung-uk Kim * FUNCTION: AcpiDmAddToExternalList 316f556842eSJung-uk Kim * 317f556842eSJung-uk Kim * PARAMETERS: Op - Current parser Op 318f556842eSJung-uk Kim * Path - Internal (AML) path to the object 319f556842eSJung-uk Kim * Type - ACPI object type to be added 320f556842eSJung-uk Kim * Value - Arg count if adding a Method object 321f556842eSJung-uk Kim * 322f556842eSJung-uk Kim * RETURN: None 323f556842eSJung-uk Kim * 324f556842eSJung-uk Kim * DESCRIPTION: Insert a new name into the global list of Externals which 325f556842eSJung-uk Kim * will in turn be later emitted as an External() declaration 326f556842eSJung-uk Kim * in the disassembled output. 327f556842eSJung-uk Kim * 328f556842eSJung-uk Kim ******************************************************************************/ 329f556842eSJung-uk Kim 330f556842eSJung-uk Kim void 331f556842eSJung-uk Kim AcpiDmAddToExternalList ( 332f556842eSJung-uk Kim ACPI_PARSE_OBJECT *Op, 333f556842eSJung-uk Kim char *Path, 334f556842eSJung-uk Kim UINT8 Type, 335f556842eSJung-uk Kim UINT32 Value) 336f556842eSJung-uk Kim { 337f556842eSJung-uk Kim char *ExternalPath; 338f556842eSJung-uk Kim char *Fullpath = NULL; 339f556842eSJung-uk Kim ACPI_EXTERNAL_LIST *NewExternal; 340f556842eSJung-uk Kim ACPI_EXTERNAL_LIST *NextExternal; 341f556842eSJung-uk Kim ACPI_EXTERNAL_LIST *PrevExternal = NULL; 342f556842eSJung-uk Kim ACPI_STATUS Status; 343f556842eSJung-uk Kim 344f556842eSJung-uk Kim 345f556842eSJung-uk Kim if (!Path) 346f556842eSJung-uk Kim { 347f556842eSJung-uk Kim return; 348f556842eSJung-uk Kim } 349f556842eSJung-uk Kim 350f556842eSJung-uk Kim /* Externalize the ACPI path */ 351f556842eSJung-uk Kim 352f556842eSJung-uk Kim Status = AcpiNsExternalizeName (ACPI_UINT32_MAX, Path, 353f556842eSJung-uk Kim NULL, &ExternalPath); 354f556842eSJung-uk Kim if (ACPI_FAILURE (Status)) 355f556842eSJung-uk Kim { 356f556842eSJung-uk Kim return; 357f556842eSJung-uk Kim } 358f556842eSJung-uk Kim 359f556842eSJung-uk Kim /* Get the full pathname from root if "Path" has a parent prefix */ 360f556842eSJung-uk Kim 361f556842eSJung-uk Kim if (*Path == (UINT8) AML_PARENT_PREFIX) 362f556842eSJung-uk Kim { 363f556842eSJung-uk Kim Fullpath = AcpiDmNormalizeParentPrefix (Op, ExternalPath); 364f556842eSJung-uk Kim if (Fullpath) 365f556842eSJung-uk Kim { 366f556842eSJung-uk Kim /* Set new external path */ 367f556842eSJung-uk Kim 368f556842eSJung-uk Kim ACPI_FREE (ExternalPath); 369f556842eSJung-uk Kim ExternalPath = Fullpath; 370f556842eSJung-uk Kim } 371f556842eSJung-uk Kim } 372f556842eSJung-uk Kim 373f556842eSJung-uk Kim /* Check all existing externals to ensure no duplicates */ 374f556842eSJung-uk Kim 375f556842eSJung-uk Kim NextExternal = AcpiGbl_ExternalList; 376f556842eSJung-uk Kim while (NextExternal) 377f556842eSJung-uk Kim { 378f556842eSJung-uk Kim if (!ACPI_STRCMP (ExternalPath, NextExternal->Path)) 379f556842eSJung-uk Kim { 380f556842eSJung-uk Kim /* Duplicate method, check that the Value (ArgCount) is the same */ 381f556842eSJung-uk Kim 382f556842eSJung-uk Kim if ((NextExternal->Type == ACPI_TYPE_METHOD) && 383f556842eSJung-uk Kim (NextExternal->Value != Value)) 384f556842eSJung-uk Kim { 385f556842eSJung-uk Kim ACPI_ERROR ((AE_INFO, 386ca3cf4faSJung-uk Kim "Argument count mismatch for method %s %u %u", 387f556842eSJung-uk Kim NextExternal->Path, NextExternal->Value, Value)); 388f556842eSJung-uk Kim } 389f556842eSJung-uk Kim 390f556842eSJung-uk Kim /* Allow upgrade of type from ANY */ 391f556842eSJung-uk Kim 392f556842eSJung-uk Kim else if (NextExternal->Type == ACPI_TYPE_ANY) 393f556842eSJung-uk Kim { 394f556842eSJung-uk Kim NextExternal->Type = Type; 395f556842eSJung-uk Kim NextExternal->Value = Value; 396f556842eSJung-uk Kim } 397f556842eSJung-uk Kim 398f556842eSJung-uk Kim ACPI_FREE (ExternalPath); 399f556842eSJung-uk Kim return; 400f556842eSJung-uk Kim } 401f556842eSJung-uk Kim 402f556842eSJung-uk Kim NextExternal = NextExternal->Next; 403f556842eSJung-uk Kim } 404f556842eSJung-uk Kim 405f556842eSJung-uk Kim /* Allocate and init a new External() descriptor */ 406f556842eSJung-uk Kim 407f556842eSJung-uk Kim NewExternal = ACPI_ALLOCATE_ZEROED (sizeof (ACPI_EXTERNAL_LIST)); 408f556842eSJung-uk Kim if (!NewExternal) 409f556842eSJung-uk Kim { 410f556842eSJung-uk Kim ACPI_FREE (ExternalPath); 411f556842eSJung-uk Kim return; 412f556842eSJung-uk Kim } 413f556842eSJung-uk Kim 414f556842eSJung-uk Kim NewExternal->Path = ExternalPath; 415f556842eSJung-uk Kim NewExternal->Type = Type; 416f556842eSJung-uk Kim NewExternal->Value = Value; 417f556842eSJung-uk Kim NewExternal->Length = (UINT16) ACPI_STRLEN (ExternalPath); 418f556842eSJung-uk Kim 419f556842eSJung-uk Kim /* Was the external path with parent prefix normalized to a fullpath? */ 420f556842eSJung-uk Kim 421f556842eSJung-uk Kim if (Fullpath == ExternalPath) 422f556842eSJung-uk Kim { 423f556842eSJung-uk Kim /* Get new internal path */ 424f556842eSJung-uk Kim 425f556842eSJung-uk Kim Status = AcpiNsInternalizeName (ExternalPath, &Path); 426f556842eSJung-uk Kim if (ACPI_FAILURE (Status)) 427f556842eSJung-uk Kim { 428f556842eSJung-uk Kim ACPI_FREE (ExternalPath); 429f556842eSJung-uk Kim ACPI_FREE (NewExternal); 430f556842eSJung-uk Kim return; 431f556842eSJung-uk Kim } 432f556842eSJung-uk Kim 433f556842eSJung-uk Kim /* Set flag to indicate External->InternalPath need to be freed */ 434f556842eSJung-uk Kim 435f556842eSJung-uk Kim NewExternal->Flags |= ACPI_IPATH_ALLOCATED; 436f556842eSJung-uk Kim } 437f556842eSJung-uk Kim 438f556842eSJung-uk Kim NewExternal->InternalPath = Path; 439f556842eSJung-uk Kim 440f556842eSJung-uk Kim /* Link the new descriptor into the global list, ordered by string length */ 441f556842eSJung-uk Kim 442f556842eSJung-uk Kim NextExternal = AcpiGbl_ExternalList; 443f556842eSJung-uk Kim while (NextExternal) 444f556842eSJung-uk Kim { 445f556842eSJung-uk Kim if (NewExternal->Length <= NextExternal->Length) 446f556842eSJung-uk Kim { 447f556842eSJung-uk Kim if (PrevExternal) 448f556842eSJung-uk Kim { 449f556842eSJung-uk Kim PrevExternal->Next = NewExternal; 450f556842eSJung-uk Kim } 451f556842eSJung-uk Kim else 452f556842eSJung-uk Kim { 453f556842eSJung-uk Kim AcpiGbl_ExternalList = NewExternal; 454f556842eSJung-uk Kim } 455f556842eSJung-uk Kim 456f556842eSJung-uk Kim NewExternal->Next = NextExternal; 457f556842eSJung-uk Kim return; 458f556842eSJung-uk Kim } 459f556842eSJung-uk Kim 460f556842eSJung-uk Kim PrevExternal = NextExternal; 461f556842eSJung-uk Kim NextExternal = NextExternal->Next; 462f556842eSJung-uk Kim } 463f556842eSJung-uk Kim 464f556842eSJung-uk Kim if (PrevExternal) 465f556842eSJung-uk Kim { 466f556842eSJung-uk Kim PrevExternal->Next = NewExternal; 467f556842eSJung-uk Kim } 468f556842eSJung-uk Kim else 469f556842eSJung-uk Kim { 470f556842eSJung-uk Kim AcpiGbl_ExternalList = NewExternal; 471f556842eSJung-uk Kim } 472f556842eSJung-uk Kim } 473f556842eSJung-uk Kim 474f556842eSJung-uk Kim 475f556842eSJung-uk Kim /******************************************************************************* 476f556842eSJung-uk Kim * 477f556842eSJung-uk Kim * FUNCTION: AcpiDmAddExternalsToNamespace 478f556842eSJung-uk Kim * 479f556842eSJung-uk Kim * PARAMETERS: None 480f556842eSJung-uk Kim * 481f556842eSJung-uk Kim * RETURN: None 482f556842eSJung-uk Kim * 483f556842eSJung-uk Kim * DESCRIPTION: Add all externals to the namespace. Allows externals to be 484f556842eSJung-uk Kim * "resolved". 485f556842eSJung-uk Kim * 486f556842eSJung-uk Kim ******************************************************************************/ 487f556842eSJung-uk Kim 488f556842eSJung-uk Kim void 489f556842eSJung-uk Kim AcpiDmAddExternalsToNamespace ( 490f556842eSJung-uk Kim void) 491f556842eSJung-uk Kim { 492f556842eSJung-uk Kim ACPI_STATUS Status; 493f556842eSJung-uk Kim ACPI_NAMESPACE_NODE *Node; 494f556842eSJung-uk Kim ACPI_OPERAND_OBJECT *MethodDesc; 495f556842eSJung-uk Kim ACPI_EXTERNAL_LIST *External = AcpiGbl_ExternalList; 496f556842eSJung-uk Kim 497f556842eSJung-uk Kim 498f556842eSJung-uk Kim while (External) 499f556842eSJung-uk Kim { 500f556842eSJung-uk Kim /* Add the external name (object) into the namespace */ 501f556842eSJung-uk Kim 502f556842eSJung-uk Kim Status = AcpiNsLookup (NULL, External->InternalPath, External->Type, 503f556842eSJung-uk Kim ACPI_IMODE_LOAD_PASS1, 504f556842eSJung-uk Kim ACPI_NS_EXTERNAL | ACPI_NS_DONT_OPEN_SCOPE, 505f556842eSJung-uk Kim NULL, &Node); 506f556842eSJung-uk Kim 507f556842eSJung-uk Kim if (ACPI_FAILURE (Status)) 508f556842eSJung-uk Kim { 509f556842eSJung-uk Kim ACPI_EXCEPTION ((AE_INFO, Status, 510f556842eSJung-uk Kim "while adding external to namespace [%s]", 511f556842eSJung-uk Kim External->Path)); 512f556842eSJung-uk Kim } 513f556842eSJung-uk Kim else if (External->Type == ACPI_TYPE_METHOD) 514f556842eSJung-uk Kim { 515f556842eSJung-uk Kim /* For methods, we need to save the argument count */ 516f556842eSJung-uk Kim 517f556842eSJung-uk Kim MethodDesc = AcpiUtCreateInternalObject (ACPI_TYPE_METHOD); 518f556842eSJung-uk Kim MethodDesc->Method.ParamCount = (UINT8) External->Value; 519f556842eSJung-uk Kim Node->Object = MethodDesc; 520f556842eSJung-uk Kim } 521f556842eSJung-uk Kim 522f556842eSJung-uk Kim External = External->Next; 523f556842eSJung-uk Kim } 524f556842eSJung-uk Kim } 525f556842eSJung-uk Kim 526f556842eSJung-uk Kim 527f556842eSJung-uk Kim /******************************************************************************* 528f556842eSJung-uk Kim * 529f556842eSJung-uk Kim * FUNCTION: AcpiDmGetExternalMethodCount 530f556842eSJung-uk Kim * 531f556842eSJung-uk Kim * PARAMETERS: None 532f556842eSJung-uk Kim * 533f556842eSJung-uk Kim * RETURN: The number of control method externals in the external list 534f556842eSJung-uk Kim * 535f556842eSJung-uk Kim * DESCRIPTION: Return the number of method externals that have been generated. 536f556842eSJung-uk Kim * If any control method externals have been found, we must 537f556842eSJung-uk Kim * re-parse the entire definition block with the new information 538f556842eSJung-uk Kim * (number of arguments for the methods.) This is limitation of 539f556842eSJung-uk Kim * AML, we don't know the number of arguments from the control 540f556842eSJung-uk Kim * method invocation itself. 541f556842eSJung-uk Kim * 542f556842eSJung-uk Kim ******************************************************************************/ 543f556842eSJung-uk Kim 544f556842eSJung-uk Kim UINT32 545f556842eSJung-uk Kim AcpiDmGetExternalMethodCount ( 546f556842eSJung-uk Kim void) 547f556842eSJung-uk Kim { 548f556842eSJung-uk Kim ACPI_EXTERNAL_LIST *External = AcpiGbl_ExternalList; 549f556842eSJung-uk Kim UINT32 Count = 0; 550f556842eSJung-uk Kim 551f556842eSJung-uk Kim 552f556842eSJung-uk Kim while (External) 553f556842eSJung-uk Kim { 554f556842eSJung-uk Kim if (External->Type == ACPI_TYPE_METHOD) 555f556842eSJung-uk Kim { 556f556842eSJung-uk Kim Count++; 557f556842eSJung-uk Kim } 558f556842eSJung-uk Kim 559f556842eSJung-uk Kim External = External->Next; 560f556842eSJung-uk Kim } 561f556842eSJung-uk Kim 562f556842eSJung-uk Kim return (Count); 563f556842eSJung-uk Kim } 564f556842eSJung-uk Kim 565f556842eSJung-uk Kim 566f556842eSJung-uk Kim /******************************************************************************* 567f556842eSJung-uk Kim * 568f556842eSJung-uk Kim * FUNCTION: AcpiDmClearExternalList 569f556842eSJung-uk Kim * 570f556842eSJung-uk Kim * PARAMETERS: None 571f556842eSJung-uk Kim * 572f556842eSJung-uk Kim * RETURN: None 573f556842eSJung-uk Kim * 574f556842eSJung-uk Kim * DESCRIPTION: Free the entire External info list 575f556842eSJung-uk Kim * 576f556842eSJung-uk Kim ******************************************************************************/ 577f556842eSJung-uk Kim 578f556842eSJung-uk Kim void 579f556842eSJung-uk Kim AcpiDmClearExternalList ( 580f556842eSJung-uk Kim void) 581f556842eSJung-uk Kim { 582f556842eSJung-uk Kim ACPI_EXTERNAL_LIST *NextExternal; 583f556842eSJung-uk Kim 584f556842eSJung-uk Kim 585f556842eSJung-uk Kim while (AcpiGbl_ExternalList) 586f556842eSJung-uk Kim { 587f556842eSJung-uk Kim NextExternal = AcpiGbl_ExternalList->Next; 588f556842eSJung-uk Kim ACPI_FREE (AcpiGbl_ExternalList->Path); 589f556842eSJung-uk Kim ACPI_FREE (AcpiGbl_ExternalList); 590f556842eSJung-uk Kim AcpiGbl_ExternalList = NextExternal; 591f556842eSJung-uk Kim } 592f556842eSJung-uk Kim } 593f556842eSJung-uk Kim 594f556842eSJung-uk Kim 595f556842eSJung-uk Kim /******************************************************************************* 596f556842eSJung-uk Kim * 597f556842eSJung-uk Kim * FUNCTION: AcpiDmEmitExternals 598f556842eSJung-uk Kim * 599f556842eSJung-uk Kim * PARAMETERS: None 600f556842eSJung-uk Kim * 601f556842eSJung-uk Kim * RETURN: None 602f556842eSJung-uk Kim * 603f556842eSJung-uk Kim * DESCRIPTION: Emit an External() ASL statement for each of the externals in 604f556842eSJung-uk Kim * the global external info list. 605f556842eSJung-uk Kim * 606f556842eSJung-uk Kim ******************************************************************************/ 607f556842eSJung-uk Kim 608f556842eSJung-uk Kim void 609f556842eSJung-uk Kim AcpiDmEmitExternals ( 610f556842eSJung-uk Kim void) 611f556842eSJung-uk Kim { 612f556842eSJung-uk Kim ACPI_EXTERNAL_LIST *NextExternal; 613f556842eSJung-uk Kim 614f556842eSJung-uk Kim 615f556842eSJung-uk Kim if (!AcpiGbl_ExternalList) 616f556842eSJung-uk Kim { 617f556842eSJung-uk Kim return; 618f556842eSJung-uk Kim } 619f556842eSJung-uk Kim 620f556842eSJung-uk Kim /* 621f556842eSJung-uk Kim * Walk the list of externals (unresolved references) 622f556842eSJung-uk Kim * found during the AML parsing 623f556842eSJung-uk Kim */ 624f556842eSJung-uk Kim while (AcpiGbl_ExternalList) 625f556842eSJung-uk Kim { 626f556842eSJung-uk Kim AcpiOsPrintf (" External (%s%s", 627f556842eSJung-uk Kim AcpiGbl_ExternalList->Path, 628f556842eSJung-uk Kim AcpiDmGetObjectTypeName (AcpiGbl_ExternalList->Type)); 629f556842eSJung-uk Kim 630f556842eSJung-uk Kim if (AcpiGbl_ExternalList->Type == ACPI_TYPE_METHOD) 631f556842eSJung-uk Kim { 632f556842eSJung-uk Kim AcpiOsPrintf (") // %d Arguments\n", 633f556842eSJung-uk Kim AcpiGbl_ExternalList->Value); 634f556842eSJung-uk Kim } 635f556842eSJung-uk Kim else 636f556842eSJung-uk Kim { 637f556842eSJung-uk Kim AcpiOsPrintf (")\n"); 638f556842eSJung-uk Kim } 639f556842eSJung-uk Kim 640f556842eSJung-uk Kim /* Free this external info block and move on to next external */ 641f556842eSJung-uk Kim 642f556842eSJung-uk Kim NextExternal = AcpiGbl_ExternalList->Next; 643f556842eSJung-uk Kim if (AcpiGbl_ExternalList->Flags & ACPI_IPATH_ALLOCATED) 644f556842eSJung-uk Kim { 645f556842eSJung-uk Kim ACPI_FREE (AcpiGbl_ExternalList->InternalPath); 646f556842eSJung-uk Kim } 647f556842eSJung-uk Kim 648f556842eSJung-uk Kim ACPI_FREE (AcpiGbl_ExternalList->Path); 649f556842eSJung-uk Kim ACPI_FREE (AcpiGbl_ExternalList); 650f556842eSJung-uk Kim AcpiGbl_ExternalList = NextExternal; 651f556842eSJung-uk Kim } 652f556842eSJung-uk Kim 653f556842eSJung-uk Kim AcpiOsPrintf ("\n"); 654f556842eSJung-uk Kim } 655f556842eSJung-uk Kim 656