153289f6aSNate Lawson /****************************************************************************** 253289f6aSNate Lawson * 308ddfe86SJung-uk Kim * Module Name: aslload - compiler namespace load callbacks 453289f6aSNate Lawson * 553289f6aSNate Lawson *****************************************************************************/ 653289f6aSNate Lawson 70d84335fSJung-uk Kim /****************************************************************************** 80d84335fSJung-uk Kim * 90d84335fSJung-uk Kim * 1. Copyright Notice 100d84335fSJung-uk Kim * 11*804fe266SJung-uk Kim * Some or all of this work - Copyright (c) 1999 - 2024, Intel Corp. 1253289f6aSNate Lawson * All rights reserved. 1353289f6aSNate Lawson * 140d84335fSJung-uk Kim * 2. License 150d84335fSJung-uk Kim * 160d84335fSJung-uk Kim * 2.1. This is your license from Intel Corp. under its intellectual property 170d84335fSJung-uk Kim * rights. You may have additional license terms from the party that provided 180d84335fSJung-uk Kim * you this software, covering your right to use that party's intellectual 190d84335fSJung-uk Kim * property rights. 200d84335fSJung-uk Kim * 210d84335fSJung-uk Kim * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a 220d84335fSJung-uk Kim * copy of the source code appearing in this file ("Covered Code") an 230d84335fSJung-uk Kim * irrevocable, perpetual, worldwide license under Intel's copyrights in the 240d84335fSJung-uk Kim * base code distributed originally by Intel ("Original Intel Code") to copy, 250d84335fSJung-uk Kim * make derivatives, distribute, use and display any portion of the Covered 260d84335fSJung-uk Kim * Code in any form, with the right to sublicense such rights; and 270d84335fSJung-uk Kim * 280d84335fSJung-uk Kim * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent 290d84335fSJung-uk Kim * license (with the right to sublicense), under only those claims of Intel 300d84335fSJung-uk Kim * patents that are infringed by the Original Intel Code, to make, use, sell, 310d84335fSJung-uk Kim * offer to sell, and import the Covered Code and derivative works thereof 320d84335fSJung-uk Kim * solely to the minimum extent necessary to exercise the above copyright 330d84335fSJung-uk Kim * license, and in no event shall the patent license extend to any additions 340d84335fSJung-uk Kim * to or modifications of the Original Intel Code. No other license or right 350d84335fSJung-uk Kim * is granted directly or by implication, estoppel or otherwise; 360d84335fSJung-uk Kim * 370d84335fSJung-uk Kim * The above copyright and patent license is granted only if the following 380d84335fSJung-uk Kim * conditions are met: 390d84335fSJung-uk Kim * 400d84335fSJung-uk Kim * 3. Conditions 410d84335fSJung-uk Kim * 420d84335fSJung-uk Kim * 3.1. Redistribution of Source with Rights to Further Distribute Source. 430d84335fSJung-uk Kim * Redistribution of source code of any substantial portion of the Covered 440d84335fSJung-uk Kim * Code or modification with rights to further distribute source must include 450d84335fSJung-uk Kim * the above Copyright Notice, the above License, this list of Conditions, 460d84335fSJung-uk Kim * and the following Disclaimer and Export Compliance provision. In addition, 470d84335fSJung-uk Kim * Licensee must cause all Covered Code to which Licensee contributes to 480d84335fSJung-uk Kim * contain a file documenting the changes Licensee made to create that Covered 490d84335fSJung-uk Kim * Code and the date of any change. Licensee must include in that file the 500d84335fSJung-uk Kim * documentation of any changes made by any predecessor Licensee. Licensee 510d84335fSJung-uk Kim * must include a prominent statement that the modification is derived, 520d84335fSJung-uk Kim * directly or indirectly, from Original Intel Code. 530d84335fSJung-uk Kim * 540d84335fSJung-uk Kim * 3.2. Redistribution of Source with no Rights to Further Distribute Source. 550d84335fSJung-uk Kim * Redistribution of source code of any substantial portion of the Covered 560d84335fSJung-uk Kim * Code or modification without rights to further distribute source must 570d84335fSJung-uk Kim * include the following Disclaimer and Export Compliance provision in the 580d84335fSJung-uk Kim * documentation and/or other materials provided with distribution. In 590d84335fSJung-uk Kim * addition, Licensee may not authorize further sublicense of source of any 600d84335fSJung-uk Kim * portion of the Covered Code, and must include terms to the effect that the 610d84335fSJung-uk Kim * license from Licensee to its licensee is limited to the intellectual 620d84335fSJung-uk Kim * property embodied in the software Licensee provides to its licensee, and 630d84335fSJung-uk Kim * not to intellectual property embodied in modifications its licensee may 640d84335fSJung-uk Kim * make. 650d84335fSJung-uk Kim * 660d84335fSJung-uk Kim * 3.3. Redistribution of Executable. Redistribution in executable form of any 670d84335fSJung-uk Kim * substantial portion of the Covered Code or modification must reproduce the 680d84335fSJung-uk Kim * above Copyright Notice, and the following Disclaimer and Export Compliance 690d84335fSJung-uk Kim * provision in the documentation and/or other materials provided with the 700d84335fSJung-uk Kim * distribution. 710d84335fSJung-uk Kim * 720d84335fSJung-uk Kim * 3.4. Intel retains all right, title, and interest in and to the Original 730d84335fSJung-uk Kim * Intel Code. 740d84335fSJung-uk Kim * 750d84335fSJung-uk Kim * 3.5. Neither the name Intel nor any other trademark owned or controlled by 760d84335fSJung-uk Kim * Intel shall be used in advertising or otherwise to promote the sale, use or 770d84335fSJung-uk Kim * other dealings in products derived from or relating to the Covered Code 780d84335fSJung-uk Kim * without prior written authorization from Intel. 790d84335fSJung-uk Kim * 800d84335fSJung-uk Kim * 4. Disclaimer and Export Compliance 810d84335fSJung-uk Kim * 820d84335fSJung-uk Kim * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED 830d84335fSJung-uk Kim * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE 840d84335fSJung-uk Kim * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE, 850d84335fSJung-uk Kim * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY 860d84335fSJung-uk Kim * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY 870d84335fSJung-uk Kim * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A 880d84335fSJung-uk Kim * PARTICULAR PURPOSE. 890d84335fSJung-uk Kim * 900d84335fSJung-uk Kim * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES 910d84335fSJung-uk Kim * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR 920d84335fSJung-uk Kim * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT, 930d84335fSJung-uk Kim * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY 940d84335fSJung-uk Kim * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL 950d84335fSJung-uk Kim * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS 960d84335fSJung-uk Kim * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY 970d84335fSJung-uk Kim * LIMITED REMEDY. 980d84335fSJung-uk Kim * 990d84335fSJung-uk Kim * 4.3. Licensee shall not export, either directly or indirectly, any of this 1000d84335fSJung-uk Kim * software or system incorporating such software without first obtaining any 1010d84335fSJung-uk Kim * required license or other approval from the U. S. Department of Commerce or 1020d84335fSJung-uk Kim * any other agency or department of the United States Government. In the 1030d84335fSJung-uk Kim * event Licensee exports any such software from the United States or 1040d84335fSJung-uk Kim * re-exports any such software from a foreign destination, Licensee shall 1050d84335fSJung-uk Kim * ensure that the distribution and export/re-export of the software is in 1060d84335fSJung-uk Kim * compliance with all laws, regulations, orders, or other restrictions of the 1070d84335fSJung-uk Kim * U.S. Export Administration Regulations. Licensee agrees that neither it nor 1080d84335fSJung-uk Kim * any of its subsidiaries will export/re-export any technical data, process, 1090d84335fSJung-uk Kim * software, or service, directly or indirectly, to any country for which the 1100d84335fSJung-uk Kim * United States government or any agency thereof requires an export license, 1110d84335fSJung-uk Kim * other governmental approval, or letter of assurance, without first obtaining 1120d84335fSJung-uk Kim * such license, approval or letter. 1130d84335fSJung-uk Kim * 1140d84335fSJung-uk Kim ***************************************************************************** 1150d84335fSJung-uk Kim * 1160d84335fSJung-uk Kim * Alternatively, you may choose to be licensed under the terms of the 1170d84335fSJung-uk Kim * following license: 1180d84335fSJung-uk Kim * 119d244b227SJung-uk Kim * Redistribution and use in source and binary forms, with or without 120d244b227SJung-uk Kim * modification, are permitted provided that the following conditions 121d244b227SJung-uk Kim * are met: 122d244b227SJung-uk Kim * 1. Redistributions of source code must retain the above copyright 123d244b227SJung-uk Kim * notice, this list of conditions, and the following disclaimer, 124d244b227SJung-uk Kim * without modification. 125d244b227SJung-uk Kim * 2. Redistributions in binary form must reproduce at minimum a disclaimer 126d244b227SJung-uk Kim * substantially similar to the "NO WARRANTY" disclaimer below 127d244b227SJung-uk Kim * ("Disclaimer") and any redistribution must be conditioned upon 128d244b227SJung-uk Kim * including a substantially similar Disclaimer requirement for further 129d244b227SJung-uk Kim * binary redistribution. 130d244b227SJung-uk Kim * 3. Neither the names of the above-listed copyright holders nor the names 131d244b227SJung-uk Kim * of any contributors may be used to endorse or promote products derived 132d244b227SJung-uk Kim * from this software without specific prior written permission. 13353289f6aSNate Lawson * 1340d84335fSJung-uk Kim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1350d84335fSJung-uk Kim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1360d84335fSJung-uk Kim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1370d84335fSJung-uk Kim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 1380d84335fSJung-uk Kim * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 1390d84335fSJung-uk Kim * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 1400d84335fSJung-uk Kim * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 1410d84335fSJung-uk Kim * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 1420d84335fSJung-uk Kim * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 1430d84335fSJung-uk Kim * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 1440d84335fSJung-uk Kim * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 1450d84335fSJung-uk Kim * 1460d84335fSJung-uk Kim * Alternatively, you may choose to be licensed under the terms of the 147d244b227SJung-uk Kim * GNU General Public License ("GPL") version 2 as published by the Free 148d244b227SJung-uk Kim * Software Foundation. 14953289f6aSNate Lawson * 1500d84335fSJung-uk Kim *****************************************************************************/ 15153289f6aSNate Lawson 152ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/compiler/aslcompiler.h> 153ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/amlcode.h> 154ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/acdispat.h> 155ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/acnamesp.h> 156835b56bfSJung-uk Kim #include <contrib/dev/acpica/include/acparser.h> 15753289f6aSNate Lawson #include "aslcompiler.y.h" 15853289f6aSNate Lawson 159835b56bfSJung-uk Kim 16053289f6aSNate Lawson #define _COMPONENT ACPI_COMPILER 16153289f6aSNate Lawson ACPI_MODULE_NAME ("aslload") 16253289f6aSNate Lawson 163fba7fc7eSJung-uk Kim /* Local prototypes */ 164fba7fc7eSJung-uk Kim 165fba7fc7eSJung-uk Kim static ACPI_STATUS 166fba7fc7eSJung-uk Kim LdLoadFieldElements ( 16737d7a5bcSJung-uk Kim UINT32 AmlType, 168fba7fc7eSJung-uk Kim ACPI_PARSE_OBJECT *Op, 169fba7fc7eSJung-uk Kim ACPI_WALK_STATE *WalkState); 170fba7fc7eSJung-uk Kim 171fba7fc7eSJung-uk Kim static ACPI_STATUS 172fba7fc7eSJung-uk Kim LdLoadResourceElements ( 173fba7fc7eSJung-uk Kim ACPI_PARSE_OBJECT *Op, 174fba7fc7eSJung-uk Kim ACPI_WALK_STATE *WalkState); 175fba7fc7eSJung-uk Kim 176fba7fc7eSJung-uk Kim static ACPI_STATUS 177fba7fc7eSJung-uk Kim LdNamespace1Begin ( 178fba7fc7eSJung-uk Kim ACPI_PARSE_OBJECT *Op, 179fba7fc7eSJung-uk Kim UINT32 Level, 180fba7fc7eSJung-uk Kim void *Context); 181fba7fc7eSJung-uk Kim 182fba7fc7eSJung-uk Kim static ACPI_STATUS 183a9f12690SJung-uk Kim LdNamespace2Begin ( 184a9f12690SJung-uk Kim ACPI_PARSE_OBJECT *Op, 185a9f12690SJung-uk Kim UINT32 Level, 186a9f12690SJung-uk Kim void *Context); 187a9f12690SJung-uk Kim 188a9f12690SJung-uk Kim static ACPI_STATUS 189a9f12690SJung-uk Kim LdCommonNamespaceEnd ( 190fba7fc7eSJung-uk Kim ACPI_PARSE_OBJECT *Op, 191fba7fc7eSJung-uk Kim UINT32 Level, 192fba7fc7eSJung-uk Kim void *Context); 193fba7fc7eSJung-uk Kim 19437d7a5bcSJung-uk Kim static void 19537d7a5bcSJung-uk Kim LdCheckSpecialNames ( 19637d7a5bcSJung-uk Kim ACPI_NAMESPACE_NODE *Node, 19737d7a5bcSJung-uk Kim ACPI_PARSE_OBJECT *Op); 19853289f6aSNate Lawson 199ec0234b4SJung-uk Kim static ACPI_STATUS 200ec0234b4SJung-uk Kim LdAnalyzeExternals ( 201ec0234b4SJung-uk Kim ACPI_NAMESPACE_NODE *Node, 202ec0234b4SJung-uk Kim ACPI_PARSE_OBJECT *Op, 203ec0234b4SJung-uk Kim ACPI_OBJECT_TYPE ExternalOpType, 204ec0234b4SJung-uk Kim ACPI_WALK_STATE *WalkState); 205ec0234b4SJung-uk Kim 206ec0234b4SJung-uk Kim 20753289f6aSNate Lawson /******************************************************************************* 20853289f6aSNate Lawson * 20953289f6aSNate Lawson * FUNCTION: LdLoadNamespace 21053289f6aSNate Lawson * 211fba7fc7eSJung-uk Kim * PARAMETERS: RootOp - Root of the parse tree 21253289f6aSNate Lawson * 21353289f6aSNate Lawson * RETURN: Status 21453289f6aSNate Lawson * 21553289f6aSNate Lawson * DESCRIPTION: Perform a walk of the parse tree that in turn loads all of the 21653289f6aSNate Lawson * named ASL/AML objects into the namespace. The namespace is 21753289f6aSNate Lawson * constructed in order to resolve named references and references 21853289f6aSNate Lawson * to named fields within resource templates/descriptors. 21953289f6aSNate Lawson * 22053289f6aSNate Lawson ******************************************************************************/ 22153289f6aSNate Lawson 22253289f6aSNate Lawson ACPI_STATUS 22353289f6aSNate Lawson LdLoadNamespace ( 22453289f6aSNate Lawson ACPI_PARSE_OBJECT *RootOp) 22553289f6aSNate Lawson { 22653289f6aSNate Lawson ACPI_WALK_STATE *WalkState; 22753289f6aSNate Lawson 22853289f6aSNate Lawson 22953289f6aSNate Lawson /* Create a new walk state */ 23053289f6aSNate Lawson 23153289f6aSNate Lawson WalkState = AcpiDsCreateWalkState (0, NULL, NULL, NULL); 23253289f6aSNate Lawson if (!WalkState) 23353289f6aSNate Lawson { 2348ef1a331SJung-uk Kim return (AE_NO_MEMORY); 23553289f6aSNate Lawson } 23653289f6aSNate Lawson 237a9f12690SJung-uk Kim /* Walk the entire parse tree, first pass */ 23853289f6aSNate Lawson 23953289f6aSNate Lawson TrWalkParseTree (RootOp, ASL_WALK_VISIT_TWICE, LdNamespace1Begin, 240a9f12690SJung-uk Kim LdCommonNamespaceEnd, WalkState); 241a9f12690SJung-uk Kim 242a9f12690SJung-uk Kim /* Second pass to handle forward references */ 243a9f12690SJung-uk Kim 244a9f12690SJung-uk Kim TrWalkParseTree (RootOp, ASL_WALK_VISIT_TWICE, LdNamespace2Begin, 245a9f12690SJung-uk Kim LdCommonNamespaceEnd, WalkState); 24653289f6aSNate Lawson 24753289f6aSNate Lawson /* Dump the namespace if debug is enabled */ 24853289f6aSNate Lawson 2493d90091dSJung-uk Kim if (AcpiDbgLevel & ACPI_LV_TABLES) 2503d90091dSJung-uk Kim { 25153289f6aSNate Lawson AcpiNsDumpTables (ACPI_NS_ALL, ACPI_UINT32_MAX); 2523d90091dSJung-uk Kim } 2533d90091dSJung-uk Kim 254313a0c13SJung-uk Kim ACPI_FREE (WalkState); 2558ef1a331SJung-uk Kim return (AE_OK); 25653289f6aSNate Lawson } 25753289f6aSNate Lawson 25853289f6aSNate Lawson 25953289f6aSNate Lawson /******************************************************************************* 26053289f6aSNate Lawson * 26153289f6aSNate Lawson * FUNCTION: LdLoadFieldElements 26253289f6aSNate Lawson * 26337d7a5bcSJung-uk Kim * PARAMETERS: AmlType - Type to search 26437d7a5bcSJung-uk Kim * Op - Parent node (Field) 26553289f6aSNate Lawson * WalkState - Current walk state 26653289f6aSNate Lawson * 26753289f6aSNate Lawson * RETURN: Status 26853289f6aSNate Lawson * 26953289f6aSNate Lawson * DESCRIPTION: Enter the named elements of the field (children of the parent) 27053289f6aSNate Lawson * into the namespace. 27153289f6aSNate Lawson * 27253289f6aSNate Lawson ******************************************************************************/ 27353289f6aSNate Lawson 274fba7fc7eSJung-uk Kim static ACPI_STATUS 27553289f6aSNate Lawson LdLoadFieldElements ( 27637d7a5bcSJung-uk Kim UINT32 AmlType, 27753289f6aSNate Lawson ACPI_PARSE_OBJECT *Op, 27853289f6aSNate Lawson ACPI_WALK_STATE *WalkState) 27953289f6aSNate Lawson { 28053289f6aSNate Lawson ACPI_PARSE_OBJECT *Child = NULL; 2819ad8b64eSJung-uk Kim ACPI_PARSE_OBJECT *SourceRegion; 28253289f6aSNate Lawson ACPI_NAMESPACE_NODE *Node; 28353289f6aSNate Lawson ACPI_STATUS Status; 284f425b8beSJung-uk Kim char *ExternalPath; 28553289f6aSNate Lawson 28653289f6aSNate Lawson 2879ad8b64eSJung-uk Kim SourceRegion = UtGetArg (Op, 0); 2889ad8b64eSJung-uk Kim if (SourceRegion) 2899ad8b64eSJung-uk Kim { 2909ad8b64eSJung-uk Kim Status = AcpiNsLookup (WalkState->ScopeInfo, 291f425b8beSJung-uk Kim SourceRegion->Asl.Value.String, AmlType, ACPI_IMODE_EXECUTE, 292f425b8beSJung-uk Kim ACPI_NS_SEARCH_PARENT | ACPI_NS_DONT_OPEN_SCOPE, NULL, &Node); 2939ad8b64eSJung-uk Kim if (Status == AE_NOT_FOUND) 2949ad8b64eSJung-uk Kim { 2959ad8b64eSJung-uk Kim /* 2969ad8b64eSJung-uk Kim * If the named object is not found, it means that it is either a 2979ad8b64eSJung-uk Kim * forward reference or the named object does not exist. 2989ad8b64eSJung-uk Kim */ 2999ad8b64eSJung-uk Kim SourceRegion->Asl.CompileFlags |= OP_NOT_FOUND_DURING_LOAD; 3009ad8b64eSJung-uk Kim } 3019ad8b64eSJung-uk Kim } 3029ad8b64eSJung-uk Kim 30353289f6aSNate Lawson /* Get the first named field element */ 30453289f6aSNate Lawson 30553289f6aSNate Lawson switch (Op->Asl.AmlOpcode) 30653289f6aSNate Lawson { 30753289f6aSNate Lawson case AML_BANK_FIELD_OP: 30853289f6aSNate Lawson 30953289f6aSNate Lawson Child = UtGetArg (Op, 6); 31053289f6aSNate Lawson break; 31153289f6aSNate Lawson 31253289f6aSNate Lawson case AML_INDEX_FIELD_OP: 31353289f6aSNate Lawson 31453289f6aSNate Lawson Child = UtGetArg (Op, 5); 31553289f6aSNate Lawson break; 31653289f6aSNate Lawson 31753289f6aSNate Lawson case AML_FIELD_OP: 31853289f6aSNate Lawson 31953289f6aSNate Lawson Child = UtGetArg (Op, 4); 32053289f6aSNate Lawson break; 32153289f6aSNate Lawson 32253289f6aSNate Lawson default: 323a9d8d09cSJung-uk Kim 32453289f6aSNate Lawson /* No other opcodes should arrive here */ 325a9d8d09cSJung-uk Kim 32653289f6aSNate Lawson return (AE_BAD_PARAMETER); 32753289f6aSNate Lawson } 32853289f6aSNate Lawson 32953289f6aSNate Lawson /* Enter all elements into the namespace */ 33053289f6aSNate Lawson 33153289f6aSNate Lawson while (Child) 33253289f6aSNate Lawson { 33353289f6aSNate Lawson switch (Child->Asl.AmlOpcode) 33453289f6aSNate Lawson { 33553289f6aSNate Lawson case AML_INT_RESERVEDFIELD_OP: 33653289f6aSNate Lawson case AML_INT_ACCESSFIELD_OP: 3373f0275a0SJung-uk Kim case AML_INT_CONNECTION_OP: 33853289f6aSNate Lawson break; 33953289f6aSNate Lawson 34053289f6aSNate Lawson default: 34153289f6aSNate Lawson 342fba7fc7eSJung-uk Kim Status = AcpiNsLookup (WalkState->ScopeInfo, 343fba7fc7eSJung-uk Kim Child->Asl.Value.String, 344fba7fc7eSJung-uk Kim ACPI_TYPE_LOCAL_REGION_FIELD, 345fba7fc7eSJung-uk Kim ACPI_IMODE_LOAD_PASS1, 346fba7fc7eSJung-uk Kim ACPI_NS_NO_UPSEARCH | ACPI_NS_DONT_OPEN_SCOPE | 347f8146b88SJung-uk Kim ACPI_NS_ERROR_IF_FOUND, NULL, &Node); 34853289f6aSNate Lawson if (ACPI_FAILURE (Status)) 34953289f6aSNate Lawson { 35053289f6aSNate Lawson if (Status != AE_ALREADY_EXISTS) 35153289f6aSNate Lawson { 352fba7fc7eSJung-uk Kim AslError (ASL_ERROR, ASL_MSG_CORE_EXCEPTION, Child, 353fba7fc7eSJung-uk Kim Child->Asl.Value.String); 35453289f6aSNate Lawson return (Status); 35553289f6aSNate Lawson } 356af051161SJung-uk Kim else if (Status == AE_ALREADY_EXISTS && 357da9b0901SJung-uk Kim (Node->Flags & ANOBJ_IS_EXTERNAL)) 358af051161SJung-uk Kim { 359af051161SJung-uk Kim Node->Type = (UINT8) ACPI_TYPE_LOCAL_REGION_FIELD; 36044b0f624SJung-uk Kim Node->Flags &= ~ANOBJ_IS_EXTERNAL; 361af051161SJung-uk Kim } 362af051161SJung-uk Kim else 363af051161SJung-uk Kim { 36453289f6aSNate Lawson /* 36553289f6aSNate Lawson * The name already exists in this scope 36653289f6aSNate Lawson * But continue processing the elements 36753289f6aSNate Lawson */ 368f425b8beSJung-uk Kim ExternalPath = AcpiNsGetNormalizedPathname (Node, TRUE); 369f425b8beSJung-uk Kim 370f9a6772eSJung-uk Kim AslDualParseOpError (ASL_ERROR, ASL_MSG_NAME_EXISTS, Child, 371f425b8beSJung-uk Kim ExternalPath, ASL_MSG_FOUND_HERE, Node->Op, 372f425b8beSJung-uk Kim ExternalPath); 373f425b8beSJung-uk Kim 374f425b8beSJung-uk Kim if (ExternalPath) 375f425b8beSJung-uk Kim { 376f425b8beSJung-uk Kim ACPI_FREE (ExternalPath); 377f425b8beSJung-uk Kim } 37853289f6aSNate Lawson } 379af051161SJung-uk Kim } 38053289f6aSNate Lawson else 38153289f6aSNate Lawson { 38253289f6aSNate Lawson Child->Asl.Node = Node; 383fba7fc7eSJung-uk Kim Node->Op = Child; 38453289f6aSNate Lawson } 38553289f6aSNate Lawson break; 38653289f6aSNate Lawson } 3873f0275a0SJung-uk Kim 38853289f6aSNate Lawson Child = Child->Asl.Next; 38953289f6aSNate Lawson } 3903f0275a0SJung-uk Kim 39153289f6aSNate Lawson return (AE_OK); 39253289f6aSNate Lawson } 39353289f6aSNate Lawson 39453289f6aSNate Lawson 39553289f6aSNate Lawson /******************************************************************************* 39653289f6aSNate Lawson * 39753289f6aSNate Lawson * FUNCTION: LdLoadResourceElements 39853289f6aSNate Lawson * 39953289f6aSNate Lawson * PARAMETERS: Op - Parent node (Resource Descriptor) 40053289f6aSNate Lawson * WalkState - Current walk state 40153289f6aSNate Lawson * 40253289f6aSNate Lawson * RETURN: Status 40353289f6aSNate Lawson * 40453289f6aSNate Lawson * DESCRIPTION: Enter the named elements of the resource descriptor (children 40553289f6aSNate Lawson * of the parent) into the namespace. 40653289f6aSNate Lawson * 40753289f6aSNate Lawson * NOTE: In the real AML namespace, these named elements never exist. But 40853289f6aSNate Lawson * we simply use the namespace here as a symbol table so we can look 40953289f6aSNate Lawson * them up as they are referenced. 41053289f6aSNate Lawson * 41153289f6aSNate Lawson ******************************************************************************/ 41253289f6aSNate Lawson 413fba7fc7eSJung-uk Kim static ACPI_STATUS 41453289f6aSNate Lawson LdLoadResourceElements ( 41553289f6aSNate Lawson ACPI_PARSE_OBJECT *Op, 41653289f6aSNate Lawson ACPI_WALK_STATE *WalkState) 41753289f6aSNate Lawson { 41853289f6aSNate Lawson ACPI_PARSE_OBJECT *InitializerOp = NULL; 41953289f6aSNate Lawson ACPI_NAMESPACE_NODE *Node; 42053289f6aSNate Lawson ACPI_STATUS Status; 421f425b8beSJung-uk Kim char *ExternalPath; 42253289f6aSNate Lawson 42353289f6aSNate Lawson 42453289f6aSNate Lawson /* 425fba7fc7eSJung-uk Kim * Enter the resource name into the namespace. Name must not already exist. 426fba7fc7eSJung-uk Kim * This opens a scope, so later field names are guaranteed to be new/unique. 42753289f6aSNate Lawson */ 42853289f6aSNate Lawson Status = AcpiNsLookup (WalkState->ScopeInfo, Op->Asl.Namepath, 429fba7fc7eSJung-uk Kim ACPI_TYPE_LOCAL_RESOURCE, ACPI_IMODE_LOAD_PASS1, 430fba7fc7eSJung-uk Kim ACPI_NS_NO_UPSEARCH | ACPI_NS_ERROR_IF_FOUND, 43153289f6aSNate Lawson WalkState, &Node); 43253289f6aSNate Lawson if (ACPI_FAILURE (Status)) 43353289f6aSNate Lawson { 434fba7fc7eSJung-uk Kim if (Status == AE_ALREADY_EXISTS) 435fba7fc7eSJung-uk Kim { 436fba7fc7eSJung-uk Kim /* Actual node causing the error was saved in ParentMethod */ 437fba7fc7eSJung-uk Kim 438f425b8beSJung-uk Kim ExternalPath = AcpiNsGetNormalizedPathname (Node, TRUE); 439f425b8beSJung-uk Kim 44067d9aa44SJung-uk Kim AslDualParseOpError (ASL_ERROR, ASL_MSG_NAME_EXISTS, 44167d9aa44SJung-uk Kim (ACPI_PARSE_OBJECT *) Op->Asl.ParentMethod, 442f425b8beSJung-uk Kim ExternalPath, ASL_MSG_FOUND_HERE, Node->Op, 443f425b8beSJung-uk Kim ExternalPath); 444f425b8beSJung-uk Kim 445f425b8beSJung-uk Kim if (ExternalPath) 446f425b8beSJung-uk Kim { 447f425b8beSJung-uk Kim ACPI_FREE (ExternalPath); 448f425b8beSJung-uk Kim } 449fba7fc7eSJung-uk Kim return (AE_OK); 450fba7fc7eSJung-uk Kim } 45153289f6aSNate Lawson return (Status); 45253289f6aSNate Lawson } 45353289f6aSNate Lawson 4541a39cfb0SJung-uk Kim Node->Value = (UINT32) Op->Asl.Value.Integer; 4551a39cfb0SJung-uk Kim Node->Op = Op; 456d6dd1baeSJung-uk Kim Op->Asl.Node = Node; 4571a39cfb0SJung-uk Kim 45853289f6aSNate Lawson /* 45953289f6aSNate Lawson * Now enter the predefined fields, for easy lookup when referenced 46053289f6aSNate Lawson * by the source ASL 46153289f6aSNate Lawson */ 46253289f6aSNate Lawson InitializerOp = ASL_GET_CHILD_NODE (Op); 46353289f6aSNate Lawson while (InitializerOp) 46453289f6aSNate Lawson { 46553289f6aSNate Lawson if (InitializerOp->Asl.ExternalName) 46653289f6aSNate Lawson { 46753289f6aSNate Lawson Status = AcpiNsLookup (WalkState->ScopeInfo, 46853289f6aSNate Lawson InitializerOp->Asl.ExternalName, 4694a38ee6dSJung-uk Kim ACPI_TYPE_LOCAL_RESOURCE_FIELD, ACPI_IMODE_LOAD_PASS1, 4704a38ee6dSJung-uk Kim ACPI_NS_NO_UPSEARCH | ACPI_NS_DONT_OPEN_SCOPE, NULL, &Node); 47153289f6aSNate Lawson if (ACPI_FAILURE (Status)) 47253289f6aSNate Lawson { 47353289f6aSNate Lawson return (Status); 47453289f6aSNate Lawson } 47553289f6aSNate Lawson 47653289f6aSNate Lawson /* 4773f0275a0SJung-uk Kim * Store the field offset and length in the namespace node 4783f0275a0SJung-uk Kim * so it can be used when the field is referenced 47953289f6aSNate Lawson */ 4803f0275a0SJung-uk Kim Node->Value = InitializerOp->Asl.Value.Tag.BitOffset; 4813f0275a0SJung-uk Kim Node->Length = InitializerOp->Asl.Value.Tag.BitLength; 48253289f6aSNate Lawson InitializerOp->Asl.Node = Node; 483fba7fc7eSJung-uk Kim Node->Op = InitializerOp; 48453289f6aSNate Lawson } 4853f0275a0SJung-uk Kim 48653289f6aSNate Lawson InitializerOp = ASL_GET_PEER_NODE (InitializerOp); 48753289f6aSNate Lawson } 48853289f6aSNate Lawson 48953289f6aSNate Lawson return (AE_OK); 49053289f6aSNate Lawson } 49153289f6aSNate Lawson 49253289f6aSNate Lawson 49353289f6aSNate Lawson /******************************************************************************* 49453289f6aSNate Lawson * 49553289f6aSNate Lawson * FUNCTION: LdNamespace1Begin 49653289f6aSNate Lawson * 49753289f6aSNate Lawson * PARAMETERS: ASL_WALK_CALLBACK 49853289f6aSNate Lawson * 49953289f6aSNate Lawson * RETURN: Status 50053289f6aSNate Lawson * 50153289f6aSNate Lawson * DESCRIPTION: Descending callback used during the parse tree walk. If this 50253289f6aSNate Lawson * is a named AML opcode, enter into the namespace 50353289f6aSNate Lawson * 50453289f6aSNate Lawson ******************************************************************************/ 50553289f6aSNate Lawson 506fba7fc7eSJung-uk Kim static ACPI_STATUS 50753289f6aSNate Lawson LdNamespace1Begin ( 50853289f6aSNate Lawson ACPI_PARSE_OBJECT *Op, 50953289f6aSNate Lawson UINT32 Level, 51053289f6aSNate Lawson void *Context) 51153289f6aSNate Lawson { 51253289f6aSNate Lawson ACPI_WALK_STATE *WalkState = (ACPI_WALK_STATE *) Context; 51353289f6aSNate Lawson ACPI_NAMESPACE_NODE *Node; 514f8146b88SJung-uk Kim ACPI_PARSE_OBJECT *MethodOp; 51553289f6aSNate Lawson ACPI_STATUS Status; 51653289f6aSNate Lawson ACPI_OBJECT_TYPE ObjectType; 51753289f6aSNate Lawson char *Path; 51853289f6aSNate Lawson UINT32 Flags = ACPI_NS_NO_UPSEARCH; 51953289f6aSNate Lawson ACPI_PARSE_OBJECT *Arg; 52053289f6aSNate Lawson UINT32 i; 5211a39cfb0SJung-uk Kim BOOLEAN ForceNewScope = FALSE; 522835b56bfSJung-uk Kim const ACPI_OPCODE_INFO *OpInfo; 523835b56bfSJung-uk Kim ACPI_PARSE_OBJECT *ParentOp; 524f425b8beSJung-uk Kim char *ExternalPath; 52553289f6aSNate Lawson 52653289f6aSNate Lawson 5271a39cfb0SJung-uk Kim ACPI_FUNCTION_NAME (LdNamespace1Begin); 528835b56bfSJung-uk Kim 529835b56bfSJung-uk Kim 53053289f6aSNate Lawson ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Op %p [%s]\n", 53153289f6aSNate Lawson Op, Op->Asl.ParseOpName)); 53253289f6aSNate Lawson 53353289f6aSNate Lawson /* 53453289f6aSNate Lawson * We are only interested in opcodes that have an associated name 53553289f6aSNate Lawson * (or multiple names) 53653289f6aSNate Lawson */ 53753289f6aSNate Lawson switch (Op->Asl.AmlOpcode) 53853289f6aSNate Lawson { 5392e578044SJung-uk Kim case AML_INDEX_FIELD_OP: 54037d7a5bcSJung-uk Kim 54137d7a5bcSJung-uk Kim Status = LdLoadFieldElements (ACPI_TYPE_LOCAL_REGION_FIELD, Op, WalkState); 54237d7a5bcSJung-uk Kim return (Status); 54337d7a5bcSJung-uk Kim 54437d7a5bcSJung-uk Kim case AML_BANK_FIELD_OP: 54553289f6aSNate Lawson case AML_FIELD_OP: 54653289f6aSNate Lawson 54737d7a5bcSJung-uk Kim Status = LdLoadFieldElements (ACPI_TYPE_REGION, Op, WalkState); 5489ad8b64eSJung-uk Kim return (Status); 54953289f6aSNate Lawson 550313a0c13SJung-uk Kim case AML_INT_CONNECTION_OP: 551313a0c13SJung-uk Kim 552313a0c13SJung-uk Kim if (Op->Asl.Child->Asl.AmlOpcode != AML_INT_NAMEPATH_OP) 553313a0c13SJung-uk Kim { 554313a0c13SJung-uk Kim break; 555313a0c13SJung-uk Kim } 556313a0c13SJung-uk Kim 557a009b7dcSJung-uk Kim Arg = Op->Asl.Child; 558313a0c13SJung-uk Kim Status = AcpiNsLookup (WalkState->ScopeInfo, Arg->Asl.ExternalName, 559313a0c13SJung-uk Kim ACPI_TYPE_ANY, ACPI_IMODE_EXECUTE, ACPI_NS_SEARCH_PARENT, 560313a0c13SJung-uk Kim WalkState, &Node); 561313a0c13SJung-uk Kim if (ACPI_FAILURE (Status)) 562313a0c13SJung-uk Kim { 563313a0c13SJung-uk Kim break; 564313a0c13SJung-uk Kim } 565313a0c13SJung-uk Kim 566313a0c13SJung-uk Kim break; 567313a0c13SJung-uk Kim 56853289f6aSNate Lawson default: 56953289f6aSNate Lawson 57053289f6aSNate Lawson /* All other opcodes go below */ 571a9d8d09cSJung-uk Kim 57253289f6aSNate Lawson break; 57353289f6aSNate Lawson } 57453289f6aSNate Lawson 57553289f6aSNate Lawson /* Check if this object has already been installed in the namespace */ 57653289f6aSNate Lawson 57753289f6aSNate Lawson if (Op->Asl.Node) 57853289f6aSNate Lawson { 57953289f6aSNate Lawson return (AE_OK); 58053289f6aSNate Lawson } 58153289f6aSNate Lawson 582835b56bfSJung-uk Kim /* Check for a possible illegal forward reference */ 583835b56bfSJung-uk Kim 584835b56bfSJung-uk Kim if ((Op->Asl.ParseOpcode == PARSEOP_NAMESEG) || 585ec0234b4SJung-uk Kim (Op->Asl.ParseOpcode == PARSEOP_NAMESTRING) || 586ec0234b4SJung-uk Kim (Op->Asl.ParseOpcode == PARSEOP_METHODCALL)) 587835b56bfSJung-uk Kim { 588835b56bfSJung-uk Kim /* 589835b56bfSJung-uk Kim * Op->Asl.Namepath will be NULL for these opcodes. 590835b56bfSJung-uk Kim * These opcodes are guaranteed to have a parent. 591835b56bfSJung-uk Kim * Examine the parent opcode. 592835b56bfSJung-uk Kim */ 593835b56bfSJung-uk Kim ParentOp = Op->Asl.Parent; 594835b56bfSJung-uk Kim OpInfo = AcpiPsGetOpcodeInfo (ParentOp->Asl.AmlOpcode); 595835b56bfSJung-uk Kim 596835b56bfSJung-uk Kim /* 597835b56bfSJung-uk Kim * Exclude all operators that actually declare a new name: 598835b56bfSJung-uk Kim * Name (ABCD, 1) -> Ignore (AML_CLASS_NAMED_OBJECT) 599835b56bfSJung-uk Kim * We only want references to named objects: 600835b56bfSJung-uk Kim * Store (2, WXYZ) -> Attempt to resolve the name 601835b56bfSJung-uk Kim */ 602ec0234b4SJung-uk Kim if ((Op->Asl.ParseOpcode != PARSEOP_METHODCALL) && 603ec0234b4SJung-uk Kim (OpInfo->Class == AML_CLASS_NAMED_OBJECT)) 604835b56bfSJung-uk Kim { 605835b56bfSJung-uk Kim return (AE_OK); 606835b56bfSJung-uk Kim } 607835b56bfSJung-uk Kim 608835b56bfSJung-uk Kim /* 609835b56bfSJung-uk Kim * Check if the referenced object exists at this point during 610835b56bfSJung-uk Kim * the load: 611835b56bfSJung-uk Kim * 1) If it exists, then this cannot be a forward reference. 612835b56bfSJung-uk Kim * 2) If it does not exist, it could be a forward reference or 613835b56bfSJung-uk Kim * it truly does not exist (and no external declaration). 614835b56bfSJung-uk Kim */ 615835b56bfSJung-uk Kim Status = AcpiNsLookup (WalkState->ScopeInfo, 616835b56bfSJung-uk Kim Op->Asl.Value.Name, ACPI_TYPE_ANY, ACPI_IMODE_EXECUTE, 617835b56bfSJung-uk Kim ACPI_NS_SEARCH_PARENT | ACPI_NS_DONT_OPEN_SCOPE, 618835b56bfSJung-uk Kim WalkState, &Node); 619835b56bfSJung-uk Kim if (Status == AE_NOT_FOUND) 620835b56bfSJung-uk Kim { 621835b56bfSJung-uk Kim /* 622cd6518c7SJung-uk Kim * This is either a forward reference or the object truly 623835b56bfSJung-uk Kim * does not exist. The two cases can only be differentiated 624835b56bfSJung-uk Kim * during the cross-reference stage later. Mark the Op/Name 625835b56bfSJung-uk Kim * as not-found for now to indicate the need for further 626835b56bfSJung-uk Kim * processing. 627835b56bfSJung-uk Kim * 628835b56bfSJung-uk Kim * Special case: Allow forward references from elements of 629835b56bfSJung-uk Kim * Package objects. This provides compatibility with other 630835b56bfSJung-uk Kim * ACPI implementations. To correctly implement this, the 631835b56bfSJung-uk Kim * ACPICA table load defers package resolution until the entire 632835b56bfSJung-uk Kim * namespace has been loaded. 633835b56bfSJung-uk Kim */ 634835b56bfSJung-uk Kim if ((ParentOp->Asl.ParseOpcode != PARSEOP_PACKAGE) && 635835b56bfSJung-uk Kim (ParentOp->Asl.ParseOpcode != PARSEOP_VAR_PACKAGE)) 636835b56bfSJung-uk Kim { 637835b56bfSJung-uk Kim Op->Asl.CompileFlags |= OP_NOT_FOUND_DURING_LOAD; 638835b56bfSJung-uk Kim } 639835b56bfSJung-uk Kim 640835b56bfSJung-uk Kim return (AE_OK); 641835b56bfSJung-uk Kim } 642835b56bfSJung-uk Kim 643835b56bfSJung-uk Kim return (Status); 644835b56bfSJung-uk Kim } 645835b56bfSJung-uk Kim 64653289f6aSNate Lawson Path = Op->Asl.Namepath; 64753289f6aSNate Lawson if (!Path) 64853289f6aSNate Lawson { 64953289f6aSNate Lawson return (AE_OK); 65053289f6aSNate Lawson } 65153289f6aSNate Lawson 65253289f6aSNate Lawson /* Map the raw opcode into an internal object type */ 65353289f6aSNate Lawson 65453289f6aSNate Lawson switch (Op->Asl.ParseOpcode) 65553289f6aSNate Lawson { 65653289f6aSNate Lawson case PARSEOP_NAME: 65753289f6aSNate Lawson 65853289f6aSNate Lawson Arg = Op->Asl.Child; /* Get the NameSeg/NameString node */ 65953289f6aSNate Lawson Arg = Arg->Asl.Next; /* First peer is the object to be associated with the name */ 66053289f6aSNate Lawson 6611a39cfb0SJung-uk Kim /* 6621a39cfb0SJung-uk Kim * If this name refers to a ResourceTemplate, we will need to open 6631a39cfb0SJung-uk Kim * a new scope so that the resource subfield names can be entered into 6641a39cfb0SJung-uk Kim * the namespace underneath this name 6651a39cfb0SJung-uk Kim */ 6665f9b24faSJung-uk Kim if (Op->Asl.CompileFlags & OP_IS_RESOURCE_DESC) 6671a39cfb0SJung-uk Kim { 6681a39cfb0SJung-uk Kim ForceNewScope = TRUE; 6691a39cfb0SJung-uk Kim } 6701a39cfb0SJung-uk Kim 67153289f6aSNate Lawson /* Get the data type associated with the named object, not the name itself */ 67253289f6aSNate Lawson 67353289f6aSNate Lawson /* Log2 loop to convert from Btype (binary) to Etype (encoded) */ 67453289f6aSNate Lawson 67553289f6aSNate Lawson ObjectType = 1; 67653289f6aSNate Lawson for (i = 1; i < Arg->Asl.AcpiBtype; i *= 2) 67753289f6aSNate Lawson { 67853289f6aSNate Lawson ObjectType++; 67953289f6aSNate Lawson } 68053289f6aSNate Lawson break; 68153289f6aSNate Lawson 68253289f6aSNate Lawson case PARSEOP_EXTERNAL: 68353289f6aSNate Lawson /* 68453289f6aSNate Lawson * "External" simply enters a name and type into the namespace. 68553289f6aSNate Lawson * We must be careful to not open a new scope, however, no matter 68653289f6aSNate Lawson * what type the external name refers to (e.g., a method) 68753289f6aSNate Lawson * 68853289f6aSNate Lawson * first child is name, next child is ObjectType 68953289f6aSNate Lawson */ 69008ddfe86SJung-uk Kim ObjectType = (UINT8) Op->Asl.Child->Asl.Next->Asl.Value.Integer; 69153289f6aSNate Lawson 6921a39cfb0SJung-uk Kim /* 6931a39cfb0SJung-uk Kim * We will mark every new node along the path as "External". This 6941a39cfb0SJung-uk Kim * allows some or all of the nodes to be created later in the ASL 6951a39cfb0SJung-uk Kim * code. Handles cases like this: 6961a39cfb0SJung-uk Kim * 6971a39cfb0SJung-uk Kim * External (\_SB_.PCI0.ABCD, IntObj) 6981a39cfb0SJung-uk Kim * Scope (_SB_) 6991a39cfb0SJung-uk Kim * { 7001a39cfb0SJung-uk Kim * Device (PCI0) 7011a39cfb0SJung-uk Kim * { 7021a39cfb0SJung-uk Kim * } 7031a39cfb0SJung-uk Kim * } 7041a39cfb0SJung-uk Kim * Method (X) 7051a39cfb0SJung-uk Kim * { 7061a39cfb0SJung-uk Kim * Store (\_SB_.PCI0.ABCD, Local0) 7071a39cfb0SJung-uk Kim * } 7081a39cfb0SJung-uk Kim */ 70908ddfe86SJung-uk Kim Flags |= ACPI_NS_EXTERNAL | ACPI_NS_DONT_OPEN_SCOPE; 7101a39cfb0SJung-uk Kim break; 71153289f6aSNate Lawson 71253289f6aSNate Lawson case PARSEOP_DEFAULT_ARG: 71353289f6aSNate Lawson 7145f9b24faSJung-uk Kim if (Op->Asl.CompileFlags == OP_IS_RESOURCE_DESC) 71553289f6aSNate Lawson { 71653289f6aSNate Lawson Status = LdLoadResourceElements (Op, WalkState); 7179a179dd8SJung-uk Kim return_ACPI_STATUS (Status); 71853289f6aSNate Lawson } 71953289f6aSNate Lawson 72053289f6aSNate Lawson ObjectType = AslMapNamedOpcodeToDataType (Op->Asl.AmlOpcode); 72153289f6aSNate Lawson break; 72253289f6aSNate Lawson 72353289f6aSNate Lawson case PARSEOP_SCOPE: 72453289f6aSNate Lawson /* 72553289f6aSNate Lawson * The name referenced by Scope(Name) must already exist at this point. 72653289f6aSNate Lawson * In other words, forward references for Scope() are not supported. 72753289f6aSNate Lawson * The only real reason for this is that the MS interpreter cannot 72853289f6aSNate Lawson * handle this case. Perhaps someday this case can go away. 72953289f6aSNate Lawson */ 73053289f6aSNate Lawson Status = AcpiNsLookup (WalkState->ScopeInfo, Path, ACPI_TYPE_ANY, 7314a38ee6dSJung-uk Kim ACPI_IMODE_EXECUTE, ACPI_NS_SEARCH_PARENT, WalkState, &Node); 73253289f6aSNate Lawson if (ACPI_FAILURE (Status)) 73353289f6aSNate Lawson { 73453289f6aSNate Lawson if (Status == AE_NOT_FOUND) 73553289f6aSNate Lawson { 73653289f6aSNate Lawson /* The name was not found, go ahead and create it */ 73753289f6aSNate Lawson 738fba7fc7eSJung-uk Kim Status = AcpiNsLookup (WalkState->ScopeInfo, Path, 7394a38ee6dSJung-uk Kim ACPI_TYPE_LOCAL_SCOPE, ACPI_IMODE_LOAD_PASS1, 7404a38ee6dSJung-uk Kim Flags, WalkState, &Node); 74179c6d946SJung-uk Kim if (ACPI_FAILURE (Status)) 74279c6d946SJung-uk Kim { 74379c6d946SJung-uk Kim return_ACPI_STATUS (Status); 74479c6d946SJung-uk Kim } 74553289f6aSNate Lawson 7464a38ee6dSJung-uk Kim /* However, this is an error -- operand to Scope must exist */ 7474a38ee6dSJung-uk Kim 748278f0de6SJung-uk Kim if (strlen (Op->Asl.ExternalName) == ACPI_NAMESEG_SIZE) 7494a38ee6dSJung-uk Kim { 750fba7fc7eSJung-uk Kim AslError (ASL_ERROR, ASL_MSG_NOT_FOUND, Op, 751fba7fc7eSJung-uk Kim Op->Asl.ExternalName); 7524a38ee6dSJung-uk Kim } 7534a38ee6dSJung-uk Kim else 7544a38ee6dSJung-uk Kim { 7554a38ee6dSJung-uk Kim AslError (ASL_ERROR, ASL_MSG_NAMEPATH_NOT_EXIST, Op, 756fba7fc7eSJung-uk Kim Op->Asl.ExternalName); 7574a38ee6dSJung-uk Kim } 7584a38ee6dSJung-uk Kim 75953289f6aSNate Lawson goto FinishNode; 76053289f6aSNate Lawson } 76153289f6aSNate Lawson 762f556842eSJung-uk Kim AslCoreSubsystemError (Op, Status, 763f556842eSJung-uk Kim "Failure from namespace lookup", FALSE); 764f556842eSJung-uk Kim 7659a179dd8SJung-uk Kim return_ACPI_STATUS (Status); 76653289f6aSNate Lawson } 767f8146b88SJung-uk Kim else /* Status AE_OK */ 768f8146b88SJung-uk Kim { 769f8146b88SJung-uk Kim /* 770f8146b88SJung-uk Kim * Do not allow references to external scopes from the DSDT. 771f8146b88SJung-uk Kim * This is because the DSDT is always loaded first, and the 772f8146b88SJung-uk Kim * external reference cannot be resolved -- causing a runtime 773f8146b88SJung-uk Kim * error because Scope() must be resolved immediately. 774f8146b88SJung-uk Kim * 10/2015. 775f8146b88SJung-uk Kim */ 776f8146b88SJung-uk Kim if ((Node->Flags & ANOBJ_IS_EXTERNAL) && 777278f0de6SJung-uk Kim (ACPI_COMPARE_NAMESEG (AslGbl_TableSignature, "DSDT"))) 778f8146b88SJung-uk Kim { 779f8146b88SJung-uk Kim /* However, allowed if the reference is within a method */ 780f8146b88SJung-uk Kim 781f8146b88SJung-uk Kim MethodOp = Op->Asl.Parent; 782f8146b88SJung-uk Kim while (MethodOp && 783f8146b88SJung-uk Kim (MethodOp->Asl.ParseOpcode != PARSEOP_METHOD)) 784f8146b88SJung-uk Kim { 785f8146b88SJung-uk Kim MethodOp = MethodOp->Asl.Parent; 786f8146b88SJung-uk Kim } 787f8146b88SJung-uk Kim 788f8146b88SJung-uk Kim if (!MethodOp) 789f8146b88SJung-uk Kim { 790f8146b88SJung-uk Kim /* Not in a control method, error */ 791f8146b88SJung-uk Kim 792f8146b88SJung-uk Kim AslError (ASL_ERROR, ASL_MSG_CROSS_TABLE_SCOPE, Op, NULL); 793f8146b88SJung-uk Kim } 794f8146b88SJung-uk Kim } 795f8146b88SJung-uk Kim } 79653289f6aSNate Lawson 79753289f6aSNate Lawson /* We found a node with this name, now check the type */ 79853289f6aSNate Lawson 79953289f6aSNate Lawson switch (Node->Type) 80053289f6aSNate Lawson { 80153289f6aSNate Lawson case ACPI_TYPE_LOCAL_SCOPE: 80253289f6aSNate Lawson case ACPI_TYPE_DEVICE: 80353289f6aSNate Lawson case ACPI_TYPE_POWER: 80453289f6aSNate Lawson case ACPI_TYPE_PROCESSOR: 80553289f6aSNate Lawson case ACPI_TYPE_THERMAL: 80653289f6aSNate Lawson 80753289f6aSNate Lawson /* These are acceptable types - they all open a new scope */ 80853289f6aSNate Lawson break; 80953289f6aSNate Lawson 81053289f6aSNate Lawson case ACPI_TYPE_INTEGER: 81153289f6aSNate Lawson case ACPI_TYPE_STRING: 81253289f6aSNate Lawson case ACPI_TYPE_BUFFER: 81353289f6aSNate Lawson /* 814fba7fc7eSJung-uk Kim * These types we will allow, but we will change the type. 815fba7fc7eSJung-uk Kim * This enables some existing code of the form: 81653289f6aSNate Lawson * 81753289f6aSNate Lawson * Name (DEB, 0) 81853289f6aSNate Lawson * Scope (DEB) { ... } 81953289f6aSNate Lawson * 82053289f6aSNate Lawson * Which is used to workaround the fact that the MS interpreter 82153289f6aSNate Lawson * does not allow Scope() forward references. 82253289f6aSNate Lawson */ 8236f1f1a63SJung-uk Kim sprintf (AslGbl_MsgBuffer, "%s [%s], changing type to [Scope]", 82453289f6aSNate Lawson Op->Asl.ExternalName, AcpiUtGetTypeName (Node->Type)); 8256f1f1a63SJung-uk Kim AslError (ASL_REMARK, ASL_MSG_SCOPE_TYPE, Op, AslGbl_MsgBuffer); 82653289f6aSNate Lawson 827fba7fc7eSJung-uk Kim /* Switch the type to scope, open the new scope */ 828fba7fc7eSJung-uk Kim 829e0ef747bSNate Lawson Node->Type = ACPI_TYPE_LOCAL_SCOPE; 830fba7fc7eSJung-uk Kim Status = AcpiDsScopeStackPush (Node, ACPI_TYPE_LOCAL_SCOPE, 831fba7fc7eSJung-uk Kim WalkState); 832e0ef747bSNate Lawson if (ACPI_FAILURE (Status)) 833e0ef747bSNate Lawson { 834e0ef747bSNate Lawson return_ACPI_STATUS (Status); 835e0ef747bSNate Lawson } 83653289f6aSNate Lawson break; 83753289f6aSNate Lawson 83853289f6aSNate Lawson default: 83953289f6aSNate Lawson 840fba7fc7eSJung-uk Kim /* All other types are an error */ 841fba7fc7eSJung-uk Kim 8426f1f1a63SJung-uk Kim sprintf (AslGbl_MsgBuffer, "%s [%s]", Op->Asl.ExternalName, 843fba7fc7eSJung-uk Kim AcpiUtGetTypeName (Node->Type)); 8446f1f1a63SJung-uk Kim AslError (ASL_ERROR, ASL_MSG_SCOPE_TYPE, Op, AslGbl_MsgBuffer); 84553289f6aSNate Lawson 84653289f6aSNate Lawson /* 84753289f6aSNate Lawson * However, switch the type to be an actual scope so 84853289f6aSNate Lawson * that compilation can continue without generating a whole 849e0ef747bSNate Lawson * cascade of additional errors. Open the new scope. 85053289f6aSNate Lawson */ 851e0ef747bSNate Lawson Node->Type = ACPI_TYPE_LOCAL_SCOPE; 852fba7fc7eSJung-uk Kim Status = AcpiDsScopeStackPush (Node, ACPI_TYPE_LOCAL_SCOPE, 853fba7fc7eSJung-uk Kim WalkState); 854e0ef747bSNate Lawson if (ACPI_FAILURE (Status)) 855e0ef747bSNate Lawson { 856e0ef747bSNate Lawson return_ACPI_STATUS (Status); 857e0ef747bSNate Lawson } 85853289f6aSNate Lawson break; 85953289f6aSNate Lawson } 86053289f6aSNate Lawson 86153289f6aSNate Lawson Status = AE_OK; 86253289f6aSNate Lawson goto FinishNode; 86353289f6aSNate Lawson 86453289f6aSNate Lawson default: 86553289f6aSNate Lawson 86653289f6aSNate Lawson ObjectType = AslMapNamedOpcodeToDataType (Op->Asl.AmlOpcode); 86753289f6aSNate Lawson break; 86853289f6aSNate Lawson } 86953289f6aSNate Lawson 87053289f6aSNate Lawson ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Loading name: %s, (%s)\n", 87153289f6aSNate Lawson Op->Asl.ExternalName, AcpiUtGetTypeName (ObjectType))); 87253289f6aSNate Lawson 87353289f6aSNate Lawson /* The name must not already exist */ 87453289f6aSNate Lawson 87553289f6aSNate Lawson Flags |= ACPI_NS_ERROR_IF_FOUND; 87653289f6aSNate Lawson 87753289f6aSNate Lawson /* 8784a38ee6dSJung-uk Kim * For opcodes that enter new names into the namespace, 8794a38ee6dSJung-uk Kim * all prefix NameSegs must exist. 8804a38ee6dSJung-uk Kim */ 8814a38ee6dSJung-uk Kim WalkState->OpInfo = AcpiPsGetOpcodeInfo (Op->Asl.AmlOpcode); 8824a38ee6dSJung-uk Kim if (((WalkState->OpInfo->Flags & AML_NAMED) || 8834a38ee6dSJung-uk Kim (WalkState->OpInfo->Flags & AML_CREATE)) && 8844a38ee6dSJung-uk Kim (Op->Asl.AmlOpcode != AML_EXTERNAL_OP)) 8854a38ee6dSJung-uk Kim { 8864a38ee6dSJung-uk Kim Flags |= ACPI_NS_PREFIX_MUST_EXIST; 8874a38ee6dSJung-uk Kim } 8884a38ee6dSJung-uk Kim 8894a38ee6dSJung-uk Kim /* 89053289f6aSNate Lawson * Enter the named type into the internal namespace. We enter the name 891fba7fc7eSJung-uk Kim * as we go downward in the parse tree. Any necessary subobjects that 892fba7fc7eSJung-uk Kim * involve arguments to the opcode must be created as we go back up the 893fba7fc7eSJung-uk Kim * parse tree later. 89453289f6aSNate Lawson */ 89553289f6aSNate Lawson Status = AcpiNsLookup (WalkState->ScopeInfo, Path, ObjectType, 8961a39cfb0SJung-uk Kim ACPI_IMODE_LOAD_PASS1, Flags, WalkState, &Node); 89753289f6aSNate Lawson if (ACPI_FAILURE (Status)) 89853289f6aSNate Lawson { 89953289f6aSNate Lawson if (Status == AE_ALREADY_EXISTS) 90053289f6aSNate Lawson { 90153289f6aSNate Lawson /* The name already exists in this scope */ 90253289f6aSNate Lawson 90353289f6aSNate Lawson if (Node->Type == ACPI_TYPE_LOCAL_SCOPE) 90453289f6aSNate Lawson { 9051a39cfb0SJung-uk Kim /* Allow multiple references to the same scope */ 9061a39cfb0SJung-uk Kim 90753289f6aSNate Lawson Node->Type = (UINT8) ObjectType; 90853289f6aSNate Lawson Status = AE_OK; 90953289f6aSNate Lawson } 910ec0234b4SJung-uk Kim else if ((Node->Flags & ANOBJ_IS_EXTERNAL) || 911f8146b88SJung-uk Kim (Op->Asl.ParseOpcode == PARSEOP_EXTERNAL)) 912f8146b88SJung-uk Kim { 91308ddfe86SJung-uk Kim Status = LdAnalyzeExternals (Node, Op, ObjectType, WalkState); 914ec0234b4SJung-uk Kim if (ACPI_FAILURE (Status)) 915ec0234b4SJung-uk Kim { 916ec0234b4SJung-uk Kim if (Status == AE_ERROR) 917ec0234b4SJung-uk Kim { 918f8146b88SJung-uk Kim /* 919ec0234b4SJung-uk Kim * The use of AE_ERROR here indicates that there was a 920ec0234b4SJung-uk Kim * compiler error emitted in LdAnalyzeExternals which 921ec0234b4SJung-uk Kim * means that the caller should proceed to the next Op 922ec0234b4SJung-uk Kim * for analysis of subsequent parse objects. 923f8146b88SJung-uk Kim */ 924f8146b88SJung-uk Kim Status = AE_OK; 925f8146b88SJung-uk Kim } 926ec0234b4SJung-uk Kim return_ACPI_STATUS (Status); 927f8146b88SJung-uk Kim } 92808ddfe86SJung-uk Kim 92908ddfe86SJung-uk Kim if (!(Node->Flags & ANOBJ_IS_EXTERNAL) && 93008ddfe86SJung-uk Kim (Op->Asl.ParseOpcode == PARSEOP_EXTERNAL)) 93108ddfe86SJung-uk Kim { 93208ddfe86SJung-uk Kim /* 93308ddfe86SJung-uk Kim * If we get to here, it means that an actual definition of 93408ddfe86SJung-uk Kim * the object declared external exists. Meaning that Op 93508ddfe86SJung-uk Kim * loading this this Op should have no change to the ACPI 93608ddfe86SJung-uk Kim * namespace. By going to FinishNode, we skip the 93708ddfe86SJung-uk Kim * assignment of Node->Op = Op. 93808ddfe86SJung-uk Kim */ 93908ddfe86SJung-uk Kim goto FinishNode; 94008ddfe86SJung-uk Kim } 941f8146b88SJung-uk Kim } 94253289f6aSNate Lawson else 94353289f6aSNate Lawson { 9441a39cfb0SJung-uk Kim /* Valid error, object already exists */ 9451a39cfb0SJung-uk Kim 946f425b8beSJung-uk Kim ExternalPath = AcpiNsGetNormalizedPathname (Node, TRUE); 947f425b8beSJung-uk Kim 94867d9aa44SJung-uk Kim AslDualParseOpError (ASL_ERROR, ASL_MSG_NAME_EXISTS, Op, 949f425b8beSJung-uk Kim ExternalPath, ASL_MSG_FOUND_HERE, Node->Op, 950f425b8beSJung-uk Kim ExternalPath); 951f425b8beSJung-uk Kim 952f425b8beSJung-uk Kim if (ExternalPath) 953f425b8beSJung-uk Kim { 954f425b8beSJung-uk Kim ACPI_FREE (ExternalPath); 955f425b8beSJung-uk Kim } 9569a179dd8SJung-uk Kim return_ACPI_STATUS (AE_OK); 95753289f6aSNate Lawson } 95853289f6aSNate Lawson } 9594a38ee6dSJung-uk Kim else if (AE_NOT_FOUND) 9604a38ee6dSJung-uk Kim { 9614a38ee6dSJung-uk Kim /* 9624a38ee6dSJung-uk Kim * One or more prefix NameSegs of the NamePath do not exist 9634a38ee6dSJung-uk Kim * (all of them must exist). Attempt to continue compilation 9644a38ee6dSJung-uk Kim * by setting the current scope to the root. 9654a38ee6dSJung-uk Kim */ 9664a38ee6dSJung-uk Kim Node = AcpiGbl_RootNode; 9674a38ee6dSJung-uk Kim Status = AE_OK; 9684a38ee6dSJung-uk Kim } 96953289f6aSNate Lawson else 97053289f6aSNate Lawson { 9714a38ee6dSJung-uk Kim /* Flag all other errors as coming from the ACPICA core */ 9724a38ee6dSJung-uk Kim 973fba7fc7eSJung-uk Kim AslCoreSubsystemError (Op, Status, 974f556842eSJung-uk Kim "Failure from namespace lookup", FALSE); 9759a179dd8SJung-uk Kim return_ACPI_STATUS (Status); 97653289f6aSNate Lawson } 97753289f6aSNate Lawson } 97853289f6aSNate Lawson 97937d7a5bcSJung-uk Kim /* Check special names like _WAK and _PTS */ 98037d7a5bcSJung-uk Kim 98137d7a5bcSJung-uk Kim LdCheckSpecialNames (Node, Op); 98237d7a5bcSJung-uk Kim 9831a39cfb0SJung-uk Kim if (ForceNewScope) 9841a39cfb0SJung-uk Kim { 9851a39cfb0SJung-uk Kim Status = AcpiDsScopeStackPush (Node, ObjectType, WalkState); 9861a39cfb0SJung-uk Kim if (ACPI_FAILURE (Status)) 9871a39cfb0SJung-uk Kim { 9881a39cfb0SJung-uk Kim return_ACPI_STATUS (Status); 9891a39cfb0SJung-uk Kim } 9901a39cfb0SJung-uk Kim } 99153289f6aSNate Lawson 99208ddfe86SJung-uk Kim /* Point the Node back to the original Parse node */ 99308ddfe86SJung-uk Kim 994fba7fc7eSJung-uk Kim Node->Op = Op; 99553289f6aSNate Lawson 99608ddfe86SJung-uk Kim FinishNode: 99708ddfe86SJung-uk Kim 99808ddfe86SJung-uk Kim /* Point the parse node to the new namespace node */ 99908ddfe86SJung-uk Kim 100008ddfe86SJung-uk Kim Op->Asl.Node = Node; 100153289f6aSNate Lawson 100253289f6aSNate Lawson if (Op->Asl.ParseOpcode == PARSEOP_METHOD) 100353289f6aSNate Lawson { 100453289f6aSNate Lawson /* 1005fba7fc7eSJung-uk Kim * Get the method argument count from "Extra" and save 1006fba7fc7eSJung-uk Kim * it in the namespace node 100753289f6aSNate Lawson */ 1008fba7fc7eSJung-uk Kim Node->Value = (UINT32) Op->Asl.Extra; 100953289f6aSNate Lawson } 101008ddfe86SJung-uk Kim else if (Op->Asl.ParseOpcode == PARSEOP_EXTERNAL && 101108ddfe86SJung-uk Kim Node->Type == ACPI_TYPE_METHOD && 101208ddfe86SJung-uk Kim (Node->Flags & ANOBJ_IS_EXTERNAL)) 101308ddfe86SJung-uk Kim { 101408ddfe86SJung-uk Kim Node->Value = 101508ddfe86SJung-uk Kim (UINT32) Op->Asl.Child->Asl.Next->Asl.Next->Asl.Value.Integer; 101608ddfe86SJung-uk Kim } 101753289f6aSNate Lawson 10189a179dd8SJung-uk Kim return_ACPI_STATUS (Status); 101953289f6aSNate Lawson } 102053289f6aSNate Lawson 102153289f6aSNate Lawson 102253289f6aSNate Lawson /******************************************************************************* 102353289f6aSNate Lawson * 102408ddfe86SJung-uk Kim * FUNCTION: LdMatchExternType 1025ec0234b4SJung-uk Kim * 10263ee58df5SJung-uk Kim * PARAMETERS: Type1 10273ee58df5SJung-uk Kim * Type2 10283ee58df5SJung-uk Kim * 10293ee58df5SJung-uk Kim * RETURN: BOOLEAN 10303ee58df5SJung-uk Kim * 10313ee58df5SJung-uk Kim * DESCRIPTION: Match Type1 and Type2 with the assumption that one might be 10323ee58df5SJung-uk Kim * using external types and another might be using local types. 10333ee58df5SJung-uk Kim * This should be used to compare the types found in external 10343ee58df5SJung-uk Kim * declarations with types found in other external declarations or 10353ee58df5SJung-uk Kim * named object declaration. This should not be used to match two 10363ee58df5SJung-uk Kim * object type declarations. 10373ee58df5SJung-uk Kim * 10383ee58df5SJung-uk Kim ******************************************************************************/ 10393ee58df5SJung-uk Kim 10403ee58df5SJung-uk Kim static BOOLEAN 104108ddfe86SJung-uk Kim LdMatchExternType ( 10423ee58df5SJung-uk Kim ACPI_OBJECT_TYPE Type1, 10433ee58df5SJung-uk Kim ACPI_OBJECT_TYPE Type2) 10443ee58df5SJung-uk Kim { 10453ee58df5SJung-uk Kim BOOLEAN Type1IsLocal = Type1 > ACPI_TYPE_EXTERNAL_MAX; 10463ee58df5SJung-uk Kim BOOLEAN Type2IsLocal = Type2 > ACPI_TYPE_EXTERNAL_MAX; 10473ee58df5SJung-uk Kim ACPI_OBJECT_TYPE ExternalType; 10483ee58df5SJung-uk Kim ACPI_OBJECT_TYPE LocalType; 10493ee58df5SJung-uk Kim 10503ee58df5SJung-uk Kim 10513ee58df5SJung-uk Kim /* 10523ee58df5SJung-uk Kim * The inputs could represent types that are local to ACPICA or types that 10533ee58df5SJung-uk Kim * are known externally. Some local types, such as the OperationRegion 10543ee58df5SJung-uk Kim * field units, are defined with more granularity than ACPICA local types. 10553ee58df5SJung-uk Kim * 10563ee58df5SJung-uk Kim * Therefore, map the local types to the external types before matching. 10573ee58df5SJung-uk Kim */ 10583ee58df5SJung-uk Kim if (Type1IsLocal && !Type2IsLocal) 10593ee58df5SJung-uk Kim { 10603ee58df5SJung-uk Kim LocalType = Type1; 10613ee58df5SJung-uk Kim ExternalType = Type2; 10623ee58df5SJung-uk Kim } 10633ee58df5SJung-uk Kim else if (!Type1IsLocal && Type2IsLocal) 10643ee58df5SJung-uk Kim { 10653ee58df5SJung-uk Kim LocalType = Type2; 10663ee58df5SJung-uk Kim ExternalType = Type1; 10673ee58df5SJung-uk Kim } 10683ee58df5SJung-uk Kim else 10693ee58df5SJung-uk Kim { 10703ee58df5SJung-uk Kim return (Type1 == Type2); 10713ee58df5SJung-uk Kim } 10723ee58df5SJung-uk Kim 10733ee58df5SJung-uk Kim switch (LocalType) 10743ee58df5SJung-uk Kim { 10753ee58df5SJung-uk Kim case ACPI_TYPE_LOCAL_REGION_FIELD: 10763ee58df5SJung-uk Kim case ACPI_TYPE_LOCAL_BANK_FIELD: 10773ee58df5SJung-uk Kim case ACPI_TYPE_LOCAL_INDEX_FIELD: 10783ee58df5SJung-uk Kim 10793ee58df5SJung-uk Kim LocalType = ACPI_TYPE_FIELD_UNIT; 10803ee58df5SJung-uk Kim break; 10813ee58df5SJung-uk Kim 10823ee58df5SJung-uk Kim default: 10833ee58df5SJung-uk Kim break; 10843ee58df5SJung-uk Kim } 10853ee58df5SJung-uk Kim 10863ee58df5SJung-uk Kim return (LocalType == ExternalType); 10873ee58df5SJung-uk Kim } 10883ee58df5SJung-uk Kim 10893ee58df5SJung-uk Kim 10903ee58df5SJung-uk Kim /******************************************************************************* 10913ee58df5SJung-uk Kim * 10923ee58df5SJung-uk Kim * FUNCTION: LdAnalyzeExternals 10933ee58df5SJung-uk Kim * 1094ec0234b4SJung-uk Kim * PARAMETERS: Node - Node that represents the named object 1095ec0234b4SJung-uk Kim * Op - Named object declaring this named object 1096ec0234b4SJung-uk Kim * ExternalOpType - Type of ExternalOp 1097ec0234b4SJung-uk Kim * WalkState - Current WalkState 1098ec0234b4SJung-uk Kim * 1099ec0234b4SJung-uk Kim * RETURN: Status 1100ec0234b4SJung-uk Kim * 1101ec0234b4SJung-uk Kim * DESCRIPTION: Node and Op represents an identically named object declaration 1102ec0234b4SJung-uk Kim * that is either declared by the ASL external keyword or declared 1103ec0234b4SJung-uk Kim * by operators that declare named objects (i.e. Name, Device, 1104ec0234b4SJung-uk Kim * OperationRegion, and etc.). This function ensures that the 1105ec0234b4SJung-uk Kim * declarations do not contradict each other. 1106ec0234b4SJung-uk Kim * 1107ec0234b4SJung-uk Kim ******************************************************************************/ 1108ec0234b4SJung-uk Kim 1109ec0234b4SJung-uk Kim static ACPI_STATUS 1110ec0234b4SJung-uk Kim LdAnalyzeExternals ( 1111ec0234b4SJung-uk Kim ACPI_NAMESPACE_NODE *Node, 1112ec0234b4SJung-uk Kim ACPI_PARSE_OBJECT *Op, 1113ec0234b4SJung-uk Kim ACPI_OBJECT_TYPE ExternalOpType, 1114ec0234b4SJung-uk Kim ACPI_WALK_STATE *WalkState) 1115ec0234b4SJung-uk Kim { 1116ec0234b4SJung-uk Kim ACPI_STATUS Status = AE_OK; 1117ec0234b4SJung-uk Kim ACPI_OBJECT_TYPE ActualExternalOpType; 1118ec0234b4SJung-uk Kim ACPI_OBJECT_TYPE ActualOpType; 1119ec0234b4SJung-uk Kim ACPI_PARSE_OBJECT *ExternalOp; 1120ec0234b4SJung-uk Kim ACPI_PARSE_OBJECT *ActualOp; 1121ec0234b4SJung-uk Kim 1122ec0234b4SJung-uk Kim 1123ec0234b4SJung-uk Kim /* 1124ec0234b4SJung-uk Kim * The declaration represented by Node and Op must have the same type. 1125ec0234b4SJung-uk Kim * The type of the external Op is represented by ExternalOpType. However, 1126ec0234b4SJung-uk Kim * the type of the pre-existing declaration depends on whether if Op 1127ec0234b4SJung-uk Kim * is an external declaration or an actual declaration. 1128ec0234b4SJung-uk Kim */ 1129ec0234b4SJung-uk Kim if (Op->Asl.ParseOpcode == PARSEOP_EXTERNAL) 1130ec0234b4SJung-uk Kim { 1131ec0234b4SJung-uk Kim ActualExternalOpType = ExternalOpType; 1132ec0234b4SJung-uk Kim ActualOpType = Node->Type; 1133ec0234b4SJung-uk Kim } 1134ec0234b4SJung-uk Kim else 1135ec0234b4SJung-uk Kim { 1136ec0234b4SJung-uk Kim ActualExternalOpType = Node->Type; 113708ddfe86SJung-uk Kim ActualOpType = ExternalOpType; 1138ec0234b4SJung-uk Kim } 1139ec0234b4SJung-uk Kim 1140ec0234b4SJung-uk Kim if ((ActualOpType != ACPI_TYPE_ANY) && 1141ec0234b4SJung-uk Kim (ActualExternalOpType != ACPI_TYPE_ANY) && 114208ddfe86SJung-uk Kim !LdMatchExternType (ActualExternalOpType, ActualOpType)) 1143ec0234b4SJung-uk Kim { 1144ec0234b4SJung-uk Kim if (Op->Asl.ParseOpcode == PARSEOP_EXTERNAL && 1145ec0234b4SJung-uk Kim Node->Op->Asl.ParseOpcode == PARSEOP_EXTERNAL) 1146ec0234b4SJung-uk Kim { 11473ee58df5SJung-uk Kim AslDualParseOpError (ASL_WARNING, 1148ec0234b4SJung-uk Kim ASL_MSG_DUPLICATE_EXTERN_MISMATCH, Op, NULL, 1149ec0234b4SJung-uk Kim ASL_MSG_DUPLICATE_EXTERN_FOUND_HERE, Node->Op, NULL); 1150ec0234b4SJung-uk Kim } 1151ec0234b4SJung-uk Kim else 1152ec0234b4SJung-uk Kim { 1153ec0234b4SJung-uk Kim if (Op->Asl.ParseOpcode == PARSEOP_EXTERNAL && 1154ec0234b4SJung-uk Kim Node->Op->Asl.ParseOpcode != PARSEOP_EXTERNAL) 1155ec0234b4SJung-uk Kim { 1156ec0234b4SJung-uk Kim ExternalOp = Op; 1157ec0234b4SJung-uk Kim ActualOp = Node->Op; 1158ec0234b4SJung-uk Kim } 1159ec0234b4SJung-uk Kim else 1160ec0234b4SJung-uk Kim { 1161ec0234b4SJung-uk Kim ExternalOp = Node->Op; 1162ec0234b4SJung-uk Kim ActualOp = Op; 1163ec0234b4SJung-uk Kim } 11643ee58df5SJung-uk Kim AslDualParseOpError (ASL_WARNING, 1165ec0234b4SJung-uk Kim ASL_MSG_DECLARATION_TYPE_MISMATCH, ExternalOp, NULL, 1166ec0234b4SJung-uk Kim ASL_MSG_TYPE_MISMATCH_FOUND_HERE, ActualOp, NULL); 1167ec0234b4SJung-uk Kim } 1168ec0234b4SJung-uk Kim } 1169ec0234b4SJung-uk Kim 117008ddfe86SJung-uk Kim /* Set the object type of the external */ 117108ddfe86SJung-uk Kim 1172ec0234b4SJung-uk Kim if ((Node->Flags & ANOBJ_IS_EXTERNAL) && 1173ec0234b4SJung-uk Kim (Op->Asl.ParseOpcode != PARSEOP_EXTERNAL)) 1174ec0234b4SJung-uk Kim { 1175ec0234b4SJung-uk Kim /* 1176ec0234b4SJung-uk Kim * Allow one create on an object or segment that was 1177ec0234b4SJung-uk Kim * previously declared External 1178ec0234b4SJung-uk Kim */ 1179ec0234b4SJung-uk Kim Node->Flags &= ~ANOBJ_IS_EXTERNAL; 118061b18036SJung-uk Kim Node->Type = (UINT8) ActualOpType; 1181ec0234b4SJung-uk Kim 1182ec0234b4SJung-uk Kim /* Just retyped a node, probably will need to open a scope */ 1183ec0234b4SJung-uk Kim 118461b18036SJung-uk Kim if (AcpiNsOpensScope (ActualOpType)) 1185ec0234b4SJung-uk Kim { 118661b18036SJung-uk Kim Status = AcpiDsScopeStackPush (Node, ActualOpType, WalkState); 1187ec0234b4SJung-uk Kim if (ACPI_FAILURE (Status)) 1188ec0234b4SJung-uk Kim { 1189ec0234b4SJung-uk Kim return (Status); 1190ec0234b4SJung-uk Kim } 1191ec0234b4SJung-uk Kim } 1192ec0234b4SJung-uk Kim 1193ec0234b4SJung-uk Kim Status = AE_OK; 1194ec0234b4SJung-uk Kim } 1195ec0234b4SJung-uk Kim else if (!(Node->Flags & ANOBJ_IS_EXTERNAL) && 1196ec0234b4SJung-uk Kim (Op->Asl.ParseOpcode == PARSEOP_EXTERNAL)) 1197ec0234b4SJung-uk Kim { 1198ec0234b4SJung-uk Kim /* 1199ec0234b4SJung-uk Kim * Allow externals in same scope as the definition of the 1200ec0234b4SJung-uk Kim * actual object. Similar to C. Allows multiple definition 1201ec0234b4SJung-uk Kim * blocks that refer to each other in the same file. 1202ec0234b4SJung-uk Kim */ 1203ec0234b4SJung-uk Kim Status = AE_OK; 1204ec0234b4SJung-uk Kim } 1205ec0234b4SJung-uk Kim else if ((Node->Flags & ANOBJ_IS_EXTERNAL) && 1206ec0234b4SJung-uk Kim (Op->Asl.ParseOpcode == PARSEOP_EXTERNAL) && 120761b18036SJung-uk Kim (ActualOpType == ACPI_TYPE_ANY)) 1208ec0234b4SJung-uk Kim { 1209ec0234b4SJung-uk Kim /* Allow update of externals of unknown type. */ 1210ec0234b4SJung-uk Kim 121161b18036SJung-uk Kim Node->Type = (UINT8) ActualExternalOpType; 1212ec0234b4SJung-uk Kim Status = AE_OK; 1213ec0234b4SJung-uk Kim } 1214ec0234b4SJung-uk Kim 1215ec0234b4SJung-uk Kim return (Status); 1216ec0234b4SJung-uk Kim } 1217ec0234b4SJung-uk Kim 1218ec0234b4SJung-uk Kim 1219ec0234b4SJung-uk Kim /******************************************************************************* 1220ec0234b4SJung-uk Kim * 122137d7a5bcSJung-uk Kim * FUNCTION: LdCheckSpecialNames 122237d7a5bcSJung-uk Kim * 122337d7a5bcSJung-uk Kim * PARAMETERS: Node - Node that represents the named object 122437d7a5bcSJung-uk Kim * Op - Named object declaring this named object 122537d7a5bcSJung-uk Kim * 122637d7a5bcSJung-uk Kim * RETURN: None 122737d7a5bcSJung-uk Kim * 122837d7a5bcSJung-uk Kim * DESCRIPTION: Check if certain named objects are declared in the incorrect 122937d7a5bcSJung-uk Kim * scope. Special named objects are listed in 123037d7a5bcSJung-uk Kim * AslGbl_SpecialNamedObjects and can only be declared at the root 1231a009b7dcSJung-uk Kim * scope. _UID inside of a processor declaration must not be a 1232a009b7dcSJung-uk Kim * string. 123337d7a5bcSJung-uk Kim * 123437d7a5bcSJung-uk Kim ******************************************************************************/ 123537d7a5bcSJung-uk Kim 123637d7a5bcSJung-uk Kim static void 123737d7a5bcSJung-uk Kim LdCheckSpecialNames ( 123837d7a5bcSJung-uk Kim ACPI_NAMESPACE_NODE *Node, 123937d7a5bcSJung-uk Kim ACPI_PARSE_OBJECT *Op) 124037d7a5bcSJung-uk Kim { 124137d7a5bcSJung-uk Kim UINT32 i; 124237d7a5bcSJung-uk Kim 124337d7a5bcSJung-uk Kim 124437d7a5bcSJung-uk Kim for (i = 0; i < MAX_SPECIAL_NAMES; i++) 124537d7a5bcSJung-uk Kim { 124637d7a5bcSJung-uk Kim if (ACPI_COMPARE_NAMESEG(Node->Name.Ascii, AslGbl_SpecialNamedObjects[i]) && 124737d7a5bcSJung-uk Kim Node->Parent != AcpiGbl_RootNode) 124837d7a5bcSJung-uk Kim { 124937d7a5bcSJung-uk Kim AslError (ASL_ERROR, ASL_MSG_INVALID_SPECIAL_NAME, Op, Op->Asl.ExternalName); 125037d7a5bcSJung-uk Kim return; 125137d7a5bcSJung-uk Kim } 125237d7a5bcSJung-uk Kim } 1253a009b7dcSJung-uk Kim 1254a009b7dcSJung-uk Kim if (ACPI_COMPARE_NAMESEG (Node->Name.Ascii, "_UID") && 1255a009b7dcSJung-uk Kim Node->Parent->Type == ACPI_TYPE_PROCESSOR && 1256a009b7dcSJung-uk Kim Node->Type == ACPI_TYPE_STRING) 1257a009b7dcSJung-uk Kim { 1258a009b7dcSJung-uk Kim AslError (ASL_ERROR, ASL_MSG_INVALID_PROCESSOR_UID , Op, "found a string"); 1259a009b7dcSJung-uk Kim } 126037d7a5bcSJung-uk Kim } 126137d7a5bcSJung-uk Kim 126237d7a5bcSJung-uk Kim 126337d7a5bcSJung-uk Kim /******************************************************************************* 126437d7a5bcSJung-uk Kim * 1265a9f12690SJung-uk Kim * FUNCTION: LdNamespace2Begin 1266a9f12690SJung-uk Kim * 1267a9f12690SJung-uk Kim * PARAMETERS: ASL_WALK_CALLBACK 1268a9f12690SJung-uk Kim * 1269a9f12690SJung-uk Kim * RETURN: Status 1270a9f12690SJung-uk Kim * 1271a9f12690SJung-uk Kim * DESCRIPTION: Descending callback used during the pass 2 parse tree walk. 1272a9f12690SJung-uk Kim * Second pass resolves some forward references. 1273a9f12690SJung-uk Kim * 1274a9f12690SJung-uk Kim * Notes: 1275a9f12690SJung-uk Kim * Currently only needs to handle the Alias operator. 1276a9f12690SJung-uk Kim * Could be used to allow forward references from the Scope() operator, but 1277a9f12690SJung-uk Kim * the MS interpreter does not allow this, so this compiler does not either. 1278a9f12690SJung-uk Kim * 1279a9f12690SJung-uk Kim ******************************************************************************/ 1280a9f12690SJung-uk Kim 1281a9f12690SJung-uk Kim static ACPI_STATUS 1282a9f12690SJung-uk Kim LdNamespace2Begin ( 1283a9f12690SJung-uk Kim ACPI_PARSE_OBJECT *Op, 1284a9f12690SJung-uk Kim UINT32 Level, 1285a9f12690SJung-uk Kim void *Context) 1286a9f12690SJung-uk Kim { 1287a9f12690SJung-uk Kim ACPI_WALK_STATE *WalkState = (ACPI_WALK_STATE *) Context; 1288a9f12690SJung-uk Kim ACPI_STATUS Status; 1289a9f12690SJung-uk Kim ACPI_NAMESPACE_NODE *Node; 1290a9f12690SJung-uk Kim ACPI_OBJECT_TYPE ObjectType; 1291a9f12690SJung-uk Kim BOOLEAN ForceNewScope = FALSE; 1292a9f12690SJung-uk Kim ACPI_PARSE_OBJECT *Arg; 1293a9f12690SJung-uk Kim char *Path; 1294a9f12690SJung-uk Kim ACPI_NAMESPACE_NODE *TargetNode; 1295a9f12690SJung-uk Kim 1296a9f12690SJung-uk Kim 1297a9f12690SJung-uk Kim ACPI_FUNCTION_NAME (LdNamespace2Begin); 1298a9f12690SJung-uk Kim ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Op %p [%s]\n", 1299a9f12690SJung-uk Kim Op, Op->Asl.ParseOpName)); 1300a9f12690SJung-uk Kim 1301a9f12690SJung-uk Kim 1302a9f12690SJung-uk Kim /* Ignore Ops with no namespace node */ 1303a9f12690SJung-uk Kim 1304a9f12690SJung-uk Kim Node = Op->Asl.Node; 1305a9f12690SJung-uk Kim if (!Node) 1306a9f12690SJung-uk Kim { 1307a9f12690SJung-uk Kim return (AE_OK); 1308a9f12690SJung-uk Kim } 1309a9f12690SJung-uk Kim 1310a9f12690SJung-uk Kim /* Get the type to determine if we should push the scope */ 1311a9f12690SJung-uk Kim 1312a9f12690SJung-uk Kim if ((Op->Asl.ParseOpcode == PARSEOP_DEFAULT_ARG) && 13135f9b24faSJung-uk Kim (Op->Asl.CompileFlags == OP_IS_RESOURCE_DESC)) 1314a9f12690SJung-uk Kim { 1315a9f12690SJung-uk Kim ObjectType = ACPI_TYPE_LOCAL_RESOURCE; 1316a9f12690SJung-uk Kim } 1317a9f12690SJung-uk Kim else 1318a9f12690SJung-uk Kim { 1319a9f12690SJung-uk Kim ObjectType = AslMapNamedOpcodeToDataType (Op->Asl.AmlOpcode); 1320a9f12690SJung-uk Kim } 1321a9f12690SJung-uk Kim 1322a9f12690SJung-uk Kim /* Push scope for Resource Templates */ 1323a9f12690SJung-uk Kim 1324a9f12690SJung-uk Kim if (Op->Asl.ParseOpcode == PARSEOP_NAME) 1325a9f12690SJung-uk Kim { 13265f9b24faSJung-uk Kim if (Op->Asl.CompileFlags & OP_IS_RESOURCE_DESC) 1327a9f12690SJung-uk Kim { 1328a9f12690SJung-uk Kim ForceNewScope = TRUE; 1329a9f12690SJung-uk Kim } 1330a9f12690SJung-uk Kim } 1331a9f12690SJung-uk Kim 1332a9f12690SJung-uk Kim /* Push the scope stack */ 1333a9f12690SJung-uk Kim 1334a9f12690SJung-uk Kim if (ForceNewScope || AcpiNsOpensScope (ObjectType)) 1335a9f12690SJung-uk Kim { 1336a9f12690SJung-uk Kim Status = AcpiDsScopeStackPush (Node, ObjectType, WalkState); 1337a9f12690SJung-uk Kim if (ACPI_FAILURE (Status)) 1338a9f12690SJung-uk Kim { 1339a9f12690SJung-uk Kim return_ACPI_STATUS (Status); 1340a9f12690SJung-uk Kim } 1341a9f12690SJung-uk Kim } 1342a9f12690SJung-uk Kim 1343a9f12690SJung-uk Kim if (Op->Asl.ParseOpcode == PARSEOP_ALIAS) 1344a9f12690SJung-uk Kim { 13454a38ee6dSJung-uk Kim /* 13464a38ee6dSJung-uk Kim * Complete the alias node by getting and saving the target node. 13474a38ee6dSJung-uk Kim * First child is the alias target 13484a38ee6dSJung-uk Kim */ 1349a9f12690SJung-uk Kim Arg = Op->Asl.Child; 1350a9f12690SJung-uk Kim 1351a9f12690SJung-uk Kim /* Get the target pathname */ 1352a9f12690SJung-uk Kim 1353a9f12690SJung-uk Kim Path = Arg->Asl.Namepath; 1354a9f12690SJung-uk Kim if (!Path) 1355a9f12690SJung-uk Kim { 1356a9f12690SJung-uk Kim Status = UtInternalizeName (Arg->Asl.ExternalName, &Path); 1357a9f12690SJung-uk Kim if (ACPI_FAILURE (Status)) 1358a9f12690SJung-uk Kim { 1359a9f12690SJung-uk Kim return (Status); 1360a9f12690SJung-uk Kim } 1361a9f12690SJung-uk Kim } 1362a9f12690SJung-uk Kim 1363a9f12690SJung-uk Kim /* Get the NS node associated with the target. It must exist. */ 1364a9f12690SJung-uk Kim 1365a9f12690SJung-uk Kim Status = AcpiNsLookup (WalkState->ScopeInfo, Path, ACPI_TYPE_ANY, 1366a9f12690SJung-uk Kim ACPI_IMODE_EXECUTE, ACPI_NS_SEARCH_PARENT | ACPI_NS_DONT_OPEN_SCOPE, 1367a9f12690SJung-uk Kim WalkState, &TargetNode); 1368a9f12690SJung-uk Kim if (ACPI_FAILURE (Status)) 1369a9f12690SJung-uk Kim { 1370a9f12690SJung-uk Kim if (Status == AE_NOT_FOUND) 1371a9f12690SJung-uk Kim { 13724a38ee6dSJung-uk Kim /* Standalone NameSeg vs. NamePath */ 1373a9f12690SJung-uk Kim 1374278f0de6SJung-uk Kim if (strlen (Arg->Asl.ExternalName) == ACPI_NAMESEG_SIZE) 13754a38ee6dSJung-uk Kim { 13764a38ee6dSJung-uk Kim AslError (ASL_ERROR, ASL_MSG_NOT_FOUND, Op, 13774a38ee6dSJung-uk Kim Arg->Asl.ExternalName); 13784a38ee6dSJung-uk Kim } 13794a38ee6dSJung-uk Kim else 13804a38ee6dSJung-uk Kim { 13814a38ee6dSJung-uk Kim AslError (ASL_ERROR, ASL_MSG_NAMEPATH_NOT_EXIST, Op, 13824a38ee6dSJung-uk Kim Arg->Asl.ExternalName); 13834a38ee6dSJung-uk Kim } 13844a38ee6dSJung-uk Kim 13854a38ee6dSJung-uk Kim #if 0 13864a38ee6dSJung-uk Kim /* 13874a38ee6dSJung-uk Kim * NOTE: Removed 10/2018 to enhance compiler error reporting. No 13884a38ee6dSJung-uk Kim * regressions seen. 13894a38ee6dSJung-uk Kim */ 1390a9f12690SJung-uk Kim /* 1391a9f12690SJung-uk Kim * The name was not found, go ahead and create it. 1392a9f12690SJung-uk Kim * This prevents more errors later. 1393a9f12690SJung-uk Kim */ 1394a9f12690SJung-uk Kim Status = AcpiNsLookup (WalkState->ScopeInfo, Path, 13954a38ee6dSJung-uk Kim ACPI_TYPE_ANY, ACPI_IMODE_LOAD_PASS1, 13964a38ee6dSJung-uk Kim ACPI_NS_NO_UPSEARCH, WalkState, &Node); 13974a38ee6dSJung-uk Kim #endif 13984a38ee6dSJung-uk Kim return (Status); 13994a38ee6dSJung-uk Kim /* Removed: return (AE_OK)*/ 1400a9f12690SJung-uk Kim } 1401a9f12690SJung-uk Kim 1402f556842eSJung-uk Kim AslCoreSubsystemError (Op, Status, 1403f556842eSJung-uk Kim "Failure from namespace lookup", FALSE); 1404a9f12690SJung-uk Kim return (AE_OK); 1405a9f12690SJung-uk Kim } 1406a9f12690SJung-uk Kim 1407f15e9afbSJung-uk Kim /* Save the target node within the alias node as well as type information */ 1408a9f12690SJung-uk Kim 1409a9f12690SJung-uk Kim Node->Object = ACPI_CAST_PTR (ACPI_OPERAND_OBJECT, TargetNode); 1410f15e9afbSJung-uk Kim Node->Type = TargetNode->Type; 1411f15e9afbSJung-uk Kim if (Node->Type == ACPI_TYPE_METHOD) 1412f15e9afbSJung-uk Kim { 1413f15e9afbSJung-uk Kim /* Save the parameter count for methods */ 1414f15e9afbSJung-uk Kim 1415f15e9afbSJung-uk Kim Node->Value = TargetNode->Value; 1416f15e9afbSJung-uk Kim } 1417a9f12690SJung-uk Kim } 1418a9f12690SJung-uk Kim 1419a9f12690SJung-uk Kim return (AE_OK); 1420a9f12690SJung-uk Kim } 1421a9f12690SJung-uk Kim 1422a9f12690SJung-uk Kim 1423a9f12690SJung-uk Kim /******************************************************************************* 1424a9f12690SJung-uk Kim * 1425a9f12690SJung-uk Kim * FUNCTION: LdCommonNamespaceEnd 142653289f6aSNate Lawson * 142753289f6aSNate Lawson * PARAMETERS: ASL_WALK_CALLBACK 142853289f6aSNate Lawson * 142953289f6aSNate Lawson * RETURN: Status 143053289f6aSNate Lawson * 143153289f6aSNate Lawson * DESCRIPTION: Ascending callback used during the loading of the namespace, 143253289f6aSNate Lawson * We only need to worry about managing the scope stack here. 143353289f6aSNate Lawson * 143453289f6aSNate Lawson ******************************************************************************/ 143553289f6aSNate Lawson 1436fba7fc7eSJung-uk Kim static ACPI_STATUS 1437a9f12690SJung-uk Kim LdCommonNamespaceEnd ( 143853289f6aSNate Lawson ACPI_PARSE_OBJECT *Op, 143953289f6aSNate Lawson UINT32 Level, 144053289f6aSNate Lawson void *Context) 144153289f6aSNate Lawson { 144253289f6aSNate Lawson ACPI_WALK_STATE *WalkState = (ACPI_WALK_STATE *) Context; 144353289f6aSNate Lawson ACPI_OBJECT_TYPE ObjectType; 14441a39cfb0SJung-uk Kim BOOLEAN ForceNewScope = FALSE; 144553289f6aSNate Lawson 144653289f6aSNate Lawson 1447a9f12690SJung-uk Kim ACPI_FUNCTION_NAME (LdCommonNamespaceEnd); 144853289f6aSNate Lawson 144953289f6aSNate Lawson 145053289f6aSNate Lawson /* We are only interested in opcodes that have an associated name */ 145153289f6aSNate Lawson 145253289f6aSNate Lawson if (!Op->Asl.Namepath) 145353289f6aSNate Lawson { 145453289f6aSNate Lawson return (AE_OK); 145553289f6aSNate Lawson } 145653289f6aSNate Lawson 145753289f6aSNate Lawson /* Get the type to determine if we should pop the scope */ 145853289f6aSNate Lawson 145953289f6aSNate Lawson if ((Op->Asl.ParseOpcode == PARSEOP_DEFAULT_ARG) && 14605f9b24faSJung-uk Kim (Op->Asl.CompileFlags == OP_IS_RESOURCE_DESC)) 146153289f6aSNate Lawson { 146253289f6aSNate Lawson /* TBD: Merge into AcpiDsMapNamedOpcodeToDataType */ 146353289f6aSNate Lawson 146453289f6aSNate Lawson ObjectType = ACPI_TYPE_LOCAL_RESOURCE; 146553289f6aSNate Lawson } 146653289f6aSNate Lawson else 146753289f6aSNate Lawson { 146853289f6aSNate Lawson ObjectType = AslMapNamedOpcodeToDataType (Op->Asl.AmlOpcode); 146953289f6aSNate Lawson } 147053289f6aSNate Lawson 14711a39cfb0SJung-uk Kim /* Pop scope that was pushed for Resource Templates */ 14721a39cfb0SJung-uk Kim 14731a39cfb0SJung-uk Kim if (Op->Asl.ParseOpcode == PARSEOP_NAME) 14741a39cfb0SJung-uk Kim { 14755f9b24faSJung-uk Kim if (Op->Asl.CompileFlags & OP_IS_RESOURCE_DESC) 14761a39cfb0SJung-uk Kim { 14771a39cfb0SJung-uk Kim ForceNewScope = TRUE; 14781a39cfb0SJung-uk Kim } 14791a39cfb0SJung-uk Kim } 14801a39cfb0SJung-uk Kim 148153289f6aSNate Lawson /* Pop the scope stack */ 148253289f6aSNate Lawson 14831a39cfb0SJung-uk Kim if (ForceNewScope || AcpiNsOpensScope (ObjectType)) 148453289f6aSNate Lawson { 148553289f6aSNate Lawson ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, 148653289f6aSNate Lawson "(%s): Popping scope for Op [%s] %p\n", 148753289f6aSNate Lawson AcpiUtGetTypeName (ObjectType), Op->Asl.ParseOpName, Op)); 148853289f6aSNate Lawson 1489fba7fc7eSJung-uk Kim (void) AcpiDsScopeStackPop (WalkState); 149053289f6aSNate Lawson } 149153289f6aSNate Lawson 149253289f6aSNate Lawson return (AE_OK); 149353289f6aSNate Lawson } 1494