153289f6aSNate Lawson /****************************************************************************** 253289f6aSNate Lawson * 353289f6aSNate Lawson * Module Name: dswload - Dispatcher namespace load callbacks 453289f6aSNate Lawson * 553289f6aSNate Lawson *****************************************************************************/ 653289f6aSNate Lawson 7*0d84335fSJung-uk Kim /****************************************************************************** 8*0d84335fSJung-uk Kim * 9*0d84335fSJung-uk Kim * 1. Copyright Notice 10*0d84335fSJung-uk Kim * 11*0d84335fSJung-uk Kim * Some or all of this work - Copyright (c) 1999 - 2017, Intel Corp. 1253289f6aSNate Lawson * All rights reserved. 1353289f6aSNate Lawson * 14*0d84335fSJung-uk Kim * 2. License 15*0d84335fSJung-uk Kim * 16*0d84335fSJung-uk Kim * 2.1. This is your license from Intel Corp. under its intellectual property 17*0d84335fSJung-uk Kim * rights. You may have additional license terms from the party that provided 18*0d84335fSJung-uk Kim * you this software, covering your right to use that party's intellectual 19*0d84335fSJung-uk Kim * property rights. 20*0d84335fSJung-uk Kim * 21*0d84335fSJung-uk Kim * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a 22*0d84335fSJung-uk Kim * copy of the source code appearing in this file ("Covered Code") an 23*0d84335fSJung-uk Kim * irrevocable, perpetual, worldwide license under Intel's copyrights in the 24*0d84335fSJung-uk Kim * base code distributed originally by Intel ("Original Intel Code") to copy, 25*0d84335fSJung-uk Kim * make derivatives, distribute, use and display any portion of the Covered 26*0d84335fSJung-uk Kim * Code in any form, with the right to sublicense such rights; and 27*0d84335fSJung-uk Kim * 28*0d84335fSJung-uk Kim * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent 29*0d84335fSJung-uk Kim * license (with the right to sublicense), under only those claims of Intel 30*0d84335fSJung-uk Kim * patents that are infringed by the Original Intel Code, to make, use, sell, 31*0d84335fSJung-uk Kim * offer to sell, and import the Covered Code and derivative works thereof 32*0d84335fSJung-uk Kim * solely to the minimum extent necessary to exercise the above copyright 33*0d84335fSJung-uk Kim * license, and in no event shall the patent license extend to any additions 34*0d84335fSJung-uk Kim * to or modifications of the Original Intel Code. No other license or right 35*0d84335fSJung-uk Kim * is granted directly or by implication, estoppel or otherwise; 36*0d84335fSJung-uk Kim * 37*0d84335fSJung-uk Kim * The above copyright and patent license is granted only if the following 38*0d84335fSJung-uk Kim * conditions are met: 39*0d84335fSJung-uk Kim * 40*0d84335fSJung-uk Kim * 3. Conditions 41*0d84335fSJung-uk Kim * 42*0d84335fSJung-uk Kim * 3.1. Redistribution of Source with Rights to Further Distribute Source. 43*0d84335fSJung-uk Kim * Redistribution of source code of any substantial portion of the Covered 44*0d84335fSJung-uk Kim * Code or modification with rights to further distribute source must include 45*0d84335fSJung-uk Kim * the above Copyright Notice, the above License, this list of Conditions, 46*0d84335fSJung-uk Kim * and the following Disclaimer and Export Compliance provision. In addition, 47*0d84335fSJung-uk Kim * Licensee must cause all Covered Code to which Licensee contributes to 48*0d84335fSJung-uk Kim * contain a file documenting the changes Licensee made to create that Covered 49*0d84335fSJung-uk Kim * Code and the date of any change. Licensee must include in that file the 50*0d84335fSJung-uk Kim * documentation of any changes made by any predecessor Licensee. Licensee 51*0d84335fSJung-uk Kim * must include a prominent statement that the modification is derived, 52*0d84335fSJung-uk Kim * directly or indirectly, from Original Intel Code. 53*0d84335fSJung-uk Kim * 54*0d84335fSJung-uk Kim * 3.2. Redistribution of Source with no Rights to Further Distribute Source. 55*0d84335fSJung-uk Kim * Redistribution of source code of any substantial portion of the Covered 56*0d84335fSJung-uk Kim * Code or modification without rights to further distribute source must 57*0d84335fSJung-uk Kim * include the following Disclaimer and Export Compliance provision in the 58*0d84335fSJung-uk Kim * documentation and/or other materials provided with distribution. In 59*0d84335fSJung-uk Kim * addition, Licensee may not authorize further sublicense of source of any 60*0d84335fSJung-uk Kim * portion of the Covered Code, and must include terms to the effect that the 61*0d84335fSJung-uk Kim * license from Licensee to its licensee is limited to the intellectual 62*0d84335fSJung-uk Kim * property embodied in the software Licensee provides to its licensee, and 63*0d84335fSJung-uk Kim * not to intellectual property embodied in modifications its licensee may 64*0d84335fSJung-uk Kim * make. 65*0d84335fSJung-uk Kim * 66*0d84335fSJung-uk Kim * 3.3. Redistribution of Executable. Redistribution in executable form of any 67*0d84335fSJung-uk Kim * substantial portion of the Covered Code or modification must reproduce the 68*0d84335fSJung-uk Kim * above Copyright Notice, and the following Disclaimer and Export Compliance 69*0d84335fSJung-uk Kim * provision in the documentation and/or other materials provided with the 70*0d84335fSJung-uk Kim * distribution. 71*0d84335fSJung-uk Kim * 72*0d84335fSJung-uk Kim * 3.4. Intel retains all right, title, and interest in and to the Original 73*0d84335fSJung-uk Kim * Intel Code. 74*0d84335fSJung-uk Kim * 75*0d84335fSJung-uk Kim * 3.5. Neither the name Intel nor any other trademark owned or controlled by 76*0d84335fSJung-uk Kim * Intel shall be used in advertising or otherwise to promote the sale, use or 77*0d84335fSJung-uk Kim * other dealings in products derived from or relating to the Covered Code 78*0d84335fSJung-uk Kim * without prior written authorization from Intel. 79*0d84335fSJung-uk Kim * 80*0d84335fSJung-uk Kim * 4. Disclaimer and Export Compliance 81*0d84335fSJung-uk Kim * 82*0d84335fSJung-uk Kim * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED 83*0d84335fSJung-uk Kim * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE 84*0d84335fSJung-uk Kim * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE, 85*0d84335fSJung-uk Kim * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY 86*0d84335fSJung-uk Kim * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY 87*0d84335fSJung-uk Kim * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A 88*0d84335fSJung-uk Kim * PARTICULAR PURPOSE. 89*0d84335fSJung-uk Kim * 90*0d84335fSJung-uk Kim * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES 91*0d84335fSJung-uk Kim * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR 92*0d84335fSJung-uk Kim * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT, 93*0d84335fSJung-uk Kim * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY 94*0d84335fSJung-uk Kim * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL 95*0d84335fSJung-uk Kim * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS 96*0d84335fSJung-uk Kim * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY 97*0d84335fSJung-uk Kim * LIMITED REMEDY. 98*0d84335fSJung-uk Kim * 99*0d84335fSJung-uk Kim * 4.3. Licensee shall not export, either directly or indirectly, any of this 100*0d84335fSJung-uk Kim * software or system incorporating such software without first obtaining any 101*0d84335fSJung-uk Kim * required license or other approval from the U. S. Department of Commerce or 102*0d84335fSJung-uk Kim * any other agency or department of the United States Government. In the 103*0d84335fSJung-uk Kim * event Licensee exports any such software from the United States or 104*0d84335fSJung-uk Kim * re-exports any such software from a foreign destination, Licensee shall 105*0d84335fSJung-uk Kim * ensure that the distribution and export/re-export of the software is in 106*0d84335fSJung-uk Kim * compliance with all laws, regulations, orders, or other restrictions of the 107*0d84335fSJung-uk Kim * U.S. Export Administration Regulations. Licensee agrees that neither it nor 108*0d84335fSJung-uk Kim * any of its subsidiaries will export/re-export any technical data, process, 109*0d84335fSJung-uk Kim * software, or service, directly or indirectly, to any country for which the 110*0d84335fSJung-uk Kim * United States government or any agency thereof requires an export license, 111*0d84335fSJung-uk Kim * other governmental approval, or letter of assurance, without first obtaining 112*0d84335fSJung-uk Kim * such license, approval or letter. 113*0d84335fSJung-uk Kim * 114*0d84335fSJung-uk Kim ***************************************************************************** 115*0d84335fSJung-uk Kim * 116*0d84335fSJung-uk Kim * Alternatively, you may choose to be licensed under the terms of the 117*0d84335fSJung-uk Kim * following license: 118*0d84335fSJung-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 * 134*0d84335fSJung-uk Kim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 135*0d84335fSJung-uk Kim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 136*0d84335fSJung-uk Kim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 137*0d84335fSJung-uk Kim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 138*0d84335fSJung-uk Kim * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 139*0d84335fSJung-uk Kim * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 140*0d84335fSJung-uk Kim * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 141*0d84335fSJung-uk Kim * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 142*0d84335fSJung-uk Kim * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 143*0d84335fSJung-uk Kim * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 144*0d84335fSJung-uk Kim * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 145*0d84335fSJung-uk Kim * 146*0d84335fSJung-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 * 150*0d84335fSJung-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> 15653289f6aSNate Lawson 15753289f6aSNate Lawson #include "aslcompiler.y.h" 15853289f6aSNate Lawson 15953289f6aSNate Lawson #define _COMPONENT ACPI_COMPILER 16053289f6aSNate Lawson ACPI_MODULE_NAME ("aslload") 16153289f6aSNate Lawson 162fba7fc7eSJung-uk Kim /* Local prototypes */ 163fba7fc7eSJung-uk Kim 164fba7fc7eSJung-uk Kim static ACPI_STATUS 165fba7fc7eSJung-uk Kim LdLoadFieldElements ( 166fba7fc7eSJung-uk Kim ACPI_PARSE_OBJECT *Op, 167fba7fc7eSJung-uk Kim ACPI_WALK_STATE *WalkState); 168fba7fc7eSJung-uk Kim 169fba7fc7eSJung-uk Kim static ACPI_STATUS 170fba7fc7eSJung-uk Kim LdLoadResourceElements ( 171fba7fc7eSJung-uk Kim ACPI_PARSE_OBJECT *Op, 172fba7fc7eSJung-uk Kim ACPI_WALK_STATE *WalkState); 173fba7fc7eSJung-uk Kim 174fba7fc7eSJung-uk Kim static ACPI_STATUS 175fba7fc7eSJung-uk Kim LdNamespace1Begin ( 176fba7fc7eSJung-uk Kim ACPI_PARSE_OBJECT *Op, 177fba7fc7eSJung-uk Kim UINT32 Level, 178fba7fc7eSJung-uk Kim void *Context); 179fba7fc7eSJung-uk Kim 180fba7fc7eSJung-uk Kim static ACPI_STATUS 181a9f12690SJung-uk Kim LdNamespace2Begin ( 182a9f12690SJung-uk Kim ACPI_PARSE_OBJECT *Op, 183a9f12690SJung-uk Kim UINT32 Level, 184a9f12690SJung-uk Kim void *Context); 185a9f12690SJung-uk Kim 186a9f12690SJung-uk Kim static ACPI_STATUS 187a9f12690SJung-uk Kim LdCommonNamespaceEnd ( 188fba7fc7eSJung-uk Kim ACPI_PARSE_OBJECT *Op, 189fba7fc7eSJung-uk Kim UINT32 Level, 190fba7fc7eSJung-uk Kim void *Context); 191fba7fc7eSJung-uk Kim 19253289f6aSNate Lawson 19353289f6aSNate Lawson /******************************************************************************* 19453289f6aSNate Lawson * 19553289f6aSNate Lawson * FUNCTION: LdLoadNamespace 19653289f6aSNate Lawson * 197fba7fc7eSJung-uk Kim * PARAMETERS: RootOp - Root of the parse tree 19853289f6aSNate Lawson * 19953289f6aSNate Lawson * RETURN: Status 20053289f6aSNate Lawson * 20153289f6aSNate Lawson * DESCRIPTION: Perform a walk of the parse tree that in turn loads all of the 20253289f6aSNate Lawson * named ASL/AML objects into the namespace. The namespace is 20353289f6aSNate Lawson * constructed in order to resolve named references and references 20453289f6aSNate Lawson * to named fields within resource templates/descriptors. 20553289f6aSNate Lawson * 20653289f6aSNate Lawson ******************************************************************************/ 20753289f6aSNate Lawson 20853289f6aSNate Lawson ACPI_STATUS 20953289f6aSNate Lawson LdLoadNamespace ( 21053289f6aSNate Lawson ACPI_PARSE_OBJECT *RootOp) 21153289f6aSNate Lawson { 21253289f6aSNate Lawson ACPI_WALK_STATE *WalkState; 21353289f6aSNate Lawson 21453289f6aSNate Lawson 21553289f6aSNate Lawson /* Create a new walk state */ 21653289f6aSNate Lawson 21753289f6aSNate Lawson WalkState = AcpiDsCreateWalkState (0, NULL, NULL, NULL); 21853289f6aSNate Lawson if (!WalkState) 21953289f6aSNate Lawson { 2208ef1a331SJung-uk Kim return (AE_NO_MEMORY); 22153289f6aSNate Lawson } 22253289f6aSNate Lawson 223a9f12690SJung-uk Kim /* Walk the entire parse tree, first pass */ 22453289f6aSNate Lawson 22553289f6aSNate Lawson TrWalkParseTree (RootOp, ASL_WALK_VISIT_TWICE, LdNamespace1Begin, 226a9f12690SJung-uk Kim LdCommonNamespaceEnd, WalkState); 227a9f12690SJung-uk Kim 228a9f12690SJung-uk Kim /* Second pass to handle forward references */ 229a9f12690SJung-uk Kim 230a9f12690SJung-uk Kim TrWalkParseTree (RootOp, ASL_WALK_VISIT_TWICE, LdNamespace2Begin, 231a9f12690SJung-uk Kim LdCommonNamespaceEnd, WalkState); 23253289f6aSNate Lawson 23353289f6aSNate Lawson /* Dump the namespace if debug is enabled */ 23453289f6aSNate Lawson 23553289f6aSNate Lawson AcpiNsDumpTables (ACPI_NS_ALL, ACPI_UINT32_MAX); 236313a0c13SJung-uk Kim ACPI_FREE (WalkState); 2378ef1a331SJung-uk Kim return (AE_OK); 23853289f6aSNate Lawson } 23953289f6aSNate Lawson 24053289f6aSNate Lawson 24153289f6aSNate Lawson /******************************************************************************* 24253289f6aSNate Lawson * 24353289f6aSNate Lawson * FUNCTION: LdLoadFieldElements 24453289f6aSNate Lawson * 24553289f6aSNate Lawson * PARAMETERS: Op - Parent node (Field) 24653289f6aSNate Lawson * WalkState - Current walk state 24753289f6aSNate Lawson * 24853289f6aSNate Lawson * RETURN: Status 24953289f6aSNate Lawson * 25053289f6aSNate Lawson * DESCRIPTION: Enter the named elements of the field (children of the parent) 25153289f6aSNate Lawson * into the namespace. 25253289f6aSNate Lawson * 25353289f6aSNate Lawson ******************************************************************************/ 25453289f6aSNate Lawson 255fba7fc7eSJung-uk Kim static ACPI_STATUS 25653289f6aSNate Lawson LdLoadFieldElements ( 25753289f6aSNate Lawson ACPI_PARSE_OBJECT *Op, 25853289f6aSNate Lawson ACPI_WALK_STATE *WalkState) 25953289f6aSNate Lawson { 26053289f6aSNate Lawson ACPI_PARSE_OBJECT *Child = NULL; 26153289f6aSNate Lawson ACPI_NAMESPACE_NODE *Node; 26253289f6aSNate Lawson ACPI_STATUS Status; 26353289f6aSNate Lawson 26453289f6aSNate Lawson 26553289f6aSNate Lawson /* Get the first named field element */ 26653289f6aSNate Lawson 26753289f6aSNate Lawson switch (Op->Asl.AmlOpcode) 26853289f6aSNate Lawson { 26953289f6aSNate Lawson case AML_BANK_FIELD_OP: 27053289f6aSNate Lawson 27153289f6aSNate Lawson Child = UtGetArg (Op, 6); 27253289f6aSNate Lawson break; 27353289f6aSNate Lawson 27453289f6aSNate Lawson case AML_INDEX_FIELD_OP: 27553289f6aSNate Lawson 27653289f6aSNate Lawson Child = UtGetArg (Op, 5); 27753289f6aSNate Lawson break; 27853289f6aSNate Lawson 27953289f6aSNate Lawson case AML_FIELD_OP: 28053289f6aSNate Lawson 28153289f6aSNate Lawson Child = UtGetArg (Op, 4); 28253289f6aSNate Lawson break; 28353289f6aSNate Lawson 28453289f6aSNate Lawson default: 285a9d8d09cSJung-uk Kim 28653289f6aSNate Lawson /* No other opcodes should arrive here */ 287a9d8d09cSJung-uk Kim 28853289f6aSNate Lawson return (AE_BAD_PARAMETER); 28953289f6aSNate Lawson } 29053289f6aSNate Lawson 29153289f6aSNate Lawson /* Enter all elements into the namespace */ 29253289f6aSNate Lawson 29353289f6aSNate Lawson while (Child) 29453289f6aSNate Lawson { 29553289f6aSNate Lawson switch (Child->Asl.AmlOpcode) 29653289f6aSNate Lawson { 29753289f6aSNate Lawson case AML_INT_RESERVEDFIELD_OP: 29853289f6aSNate Lawson case AML_INT_ACCESSFIELD_OP: 2993f0275a0SJung-uk Kim case AML_INT_CONNECTION_OP: 30053289f6aSNate Lawson break; 30153289f6aSNate Lawson 30253289f6aSNate Lawson default: 30353289f6aSNate Lawson 304fba7fc7eSJung-uk Kim Status = AcpiNsLookup (WalkState->ScopeInfo, 305fba7fc7eSJung-uk Kim Child->Asl.Value.String, 306fba7fc7eSJung-uk Kim ACPI_TYPE_LOCAL_REGION_FIELD, 307fba7fc7eSJung-uk Kim ACPI_IMODE_LOAD_PASS1, 308fba7fc7eSJung-uk Kim ACPI_NS_NO_UPSEARCH | ACPI_NS_DONT_OPEN_SCOPE | 309f8146b88SJung-uk Kim ACPI_NS_ERROR_IF_FOUND, NULL, &Node); 31053289f6aSNate Lawson if (ACPI_FAILURE (Status)) 31153289f6aSNate Lawson { 31253289f6aSNate Lawson if (Status != AE_ALREADY_EXISTS) 31353289f6aSNate Lawson { 314fba7fc7eSJung-uk Kim AslError (ASL_ERROR, ASL_MSG_CORE_EXCEPTION, Child, 315fba7fc7eSJung-uk Kim Child->Asl.Value.String); 31653289f6aSNate Lawson return (Status); 31753289f6aSNate Lawson } 31853289f6aSNate Lawson 31953289f6aSNate Lawson /* 32053289f6aSNate Lawson * The name already exists in this scope 32153289f6aSNate Lawson * But continue processing the elements 32253289f6aSNate Lawson */ 323fba7fc7eSJung-uk Kim AslError (ASL_ERROR, ASL_MSG_NAME_EXISTS, Child, 324fba7fc7eSJung-uk Kim Child->Asl.Value.String); 32553289f6aSNate Lawson } 32653289f6aSNate Lawson else 32753289f6aSNate Lawson { 32853289f6aSNate Lawson Child->Asl.Node = Node; 329fba7fc7eSJung-uk Kim Node->Op = Child; 33053289f6aSNate Lawson } 33153289f6aSNate Lawson break; 33253289f6aSNate Lawson } 3333f0275a0SJung-uk Kim 33453289f6aSNate Lawson Child = Child->Asl.Next; 33553289f6aSNate Lawson } 3363f0275a0SJung-uk Kim 33753289f6aSNate Lawson return (AE_OK); 33853289f6aSNate Lawson } 33953289f6aSNate Lawson 34053289f6aSNate Lawson 34153289f6aSNate Lawson /******************************************************************************* 34253289f6aSNate Lawson * 34353289f6aSNate Lawson * FUNCTION: LdLoadResourceElements 34453289f6aSNate Lawson * 34553289f6aSNate Lawson * PARAMETERS: Op - Parent node (Resource Descriptor) 34653289f6aSNate Lawson * WalkState - Current walk state 34753289f6aSNate Lawson * 34853289f6aSNate Lawson * RETURN: Status 34953289f6aSNate Lawson * 35053289f6aSNate Lawson * DESCRIPTION: Enter the named elements of the resource descriptor (children 35153289f6aSNate Lawson * of the parent) into the namespace. 35253289f6aSNate Lawson * 35353289f6aSNate Lawson * NOTE: In the real AML namespace, these named elements never exist. But 35453289f6aSNate Lawson * we simply use the namespace here as a symbol table so we can look 35553289f6aSNate Lawson * them up as they are referenced. 35653289f6aSNate Lawson * 35753289f6aSNate Lawson ******************************************************************************/ 35853289f6aSNate Lawson 359fba7fc7eSJung-uk Kim static ACPI_STATUS 36053289f6aSNate Lawson LdLoadResourceElements ( 36153289f6aSNate Lawson ACPI_PARSE_OBJECT *Op, 36253289f6aSNate Lawson ACPI_WALK_STATE *WalkState) 36353289f6aSNate Lawson { 36453289f6aSNate Lawson ACPI_PARSE_OBJECT *InitializerOp = NULL; 36553289f6aSNate Lawson ACPI_NAMESPACE_NODE *Node; 36653289f6aSNate Lawson ACPI_STATUS Status; 36753289f6aSNate Lawson 36853289f6aSNate Lawson 36953289f6aSNate Lawson /* 370fba7fc7eSJung-uk Kim * Enter the resource name into the namespace. Name must not already exist. 371fba7fc7eSJung-uk Kim * This opens a scope, so later field names are guaranteed to be new/unique. 37253289f6aSNate Lawson */ 37353289f6aSNate Lawson Status = AcpiNsLookup (WalkState->ScopeInfo, Op->Asl.Namepath, 374fba7fc7eSJung-uk Kim ACPI_TYPE_LOCAL_RESOURCE, ACPI_IMODE_LOAD_PASS1, 375fba7fc7eSJung-uk Kim ACPI_NS_NO_UPSEARCH | ACPI_NS_ERROR_IF_FOUND, 37653289f6aSNate Lawson WalkState, &Node); 37753289f6aSNate Lawson if (ACPI_FAILURE (Status)) 37853289f6aSNate Lawson { 379fba7fc7eSJung-uk Kim if (Status == AE_ALREADY_EXISTS) 380fba7fc7eSJung-uk Kim { 381fba7fc7eSJung-uk Kim /* Actual node causing the error was saved in ParentMethod */ 382fba7fc7eSJung-uk Kim 383fba7fc7eSJung-uk Kim AslError (ASL_ERROR, ASL_MSG_NAME_EXISTS, 384fba7fc7eSJung-uk Kim (ACPI_PARSE_OBJECT *) Op->Asl.ParentMethod, Op->Asl.Namepath); 385fba7fc7eSJung-uk Kim return (AE_OK); 386fba7fc7eSJung-uk Kim } 38753289f6aSNate Lawson return (Status); 38853289f6aSNate Lawson } 38953289f6aSNate Lawson 3901a39cfb0SJung-uk Kim Node->Value = (UINT32) Op->Asl.Value.Integer; 3911a39cfb0SJung-uk Kim Node->Op = Op; 392d6dd1baeSJung-uk Kim Op->Asl.Node = Node; 3931a39cfb0SJung-uk Kim 39453289f6aSNate Lawson /* 39553289f6aSNate Lawson * Now enter the predefined fields, for easy lookup when referenced 39653289f6aSNate Lawson * by the source ASL 39753289f6aSNate Lawson */ 39853289f6aSNate Lawson InitializerOp = ASL_GET_CHILD_NODE (Op); 39953289f6aSNate Lawson while (InitializerOp) 40053289f6aSNate Lawson { 40153289f6aSNate Lawson if (InitializerOp->Asl.ExternalName) 40253289f6aSNate Lawson { 40353289f6aSNate Lawson Status = AcpiNsLookup (WalkState->ScopeInfo, 40453289f6aSNate Lawson InitializerOp->Asl.ExternalName, 40553289f6aSNate Lawson ACPI_TYPE_LOCAL_RESOURCE_FIELD, 406fba7fc7eSJung-uk Kim ACPI_IMODE_LOAD_PASS1, 407fba7fc7eSJung-uk Kim ACPI_NS_NO_UPSEARCH | ACPI_NS_DONT_OPEN_SCOPE, 40853289f6aSNate Lawson NULL, &Node); 40953289f6aSNate Lawson if (ACPI_FAILURE (Status)) 41053289f6aSNate Lawson { 41153289f6aSNate Lawson return (Status); 41253289f6aSNate Lawson } 41353289f6aSNate Lawson 41453289f6aSNate Lawson /* 4153f0275a0SJung-uk Kim * Store the field offset and length in the namespace node 4163f0275a0SJung-uk Kim * so it can be used when the field is referenced 41753289f6aSNate Lawson */ 4183f0275a0SJung-uk Kim Node->Value = InitializerOp->Asl.Value.Tag.BitOffset; 4193f0275a0SJung-uk Kim Node->Length = InitializerOp->Asl.Value.Tag.BitLength; 42053289f6aSNate Lawson InitializerOp->Asl.Node = Node; 421fba7fc7eSJung-uk Kim Node->Op = InitializerOp; 42253289f6aSNate Lawson } 4233f0275a0SJung-uk Kim 42453289f6aSNate Lawson InitializerOp = ASL_GET_PEER_NODE (InitializerOp); 42553289f6aSNate Lawson } 42653289f6aSNate Lawson 42753289f6aSNate Lawson return (AE_OK); 42853289f6aSNate Lawson } 42953289f6aSNate Lawson 43053289f6aSNate Lawson 43153289f6aSNate Lawson /******************************************************************************* 43253289f6aSNate Lawson * 43353289f6aSNate Lawson * FUNCTION: LdNamespace1Begin 43453289f6aSNate Lawson * 43553289f6aSNate Lawson * PARAMETERS: ASL_WALK_CALLBACK 43653289f6aSNate Lawson * 43753289f6aSNate Lawson * RETURN: Status 43853289f6aSNate Lawson * 43953289f6aSNate Lawson * DESCRIPTION: Descending callback used during the parse tree walk. If this 44053289f6aSNate Lawson * is a named AML opcode, enter into the namespace 44153289f6aSNate Lawson * 44253289f6aSNate Lawson ******************************************************************************/ 44353289f6aSNate Lawson 444fba7fc7eSJung-uk Kim static ACPI_STATUS 44553289f6aSNate Lawson LdNamespace1Begin ( 44653289f6aSNate Lawson ACPI_PARSE_OBJECT *Op, 44753289f6aSNate Lawson UINT32 Level, 44853289f6aSNate Lawson void *Context) 44953289f6aSNate Lawson { 45053289f6aSNate Lawson ACPI_WALK_STATE *WalkState = (ACPI_WALK_STATE *) Context; 45153289f6aSNate Lawson ACPI_NAMESPACE_NODE *Node; 452f8146b88SJung-uk Kim ACPI_PARSE_OBJECT *MethodOp; 45353289f6aSNate Lawson ACPI_STATUS Status; 45453289f6aSNate Lawson ACPI_OBJECT_TYPE ObjectType; 45553289f6aSNate Lawson ACPI_OBJECT_TYPE ActualObjectType = ACPI_TYPE_ANY; 45653289f6aSNate Lawson char *Path; 45753289f6aSNate Lawson UINT32 Flags = ACPI_NS_NO_UPSEARCH; 45853289f6aSNate Lawson ACPI_PARSE_OBJECT *Arg; 45953289f6aSNate Lawson UINT32 i; 4601a39cfb0SJung-uk Kim BOOLEAN ForceNewScope = FALSE; 46153289f6aSNate Lawson 46253289f6aSNate Lawson 4631a39cfb0SJung-uk Kim ACPI_FUNCTION_NAME (LdNamespace1Begin); 46453289f6aSNate Lawson ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Op %p [%s]\n", 46553289f6aSNate Lawson Op, Op->Asl.ParseOpName)); 46653289f6aSNate Lawson 46753289f6aSNate Lawson /* 46853289f6aSNate Lawson * We are only interested in opcodes that have an associated name 46953289f6aSNate Lawson * (or multiple names) 47053289f6aSNate Lawson */ 47153289f6aSNate Lawson switch (Op->Asl.AmlOpcode) 47253289f6aSNate Lawson { 47353289f6aSNate Lawson case AML_BANK_FIELD_OP: 47453289f6aSNate Lawson case AML_INDEX_FIELD_OP: 47553289f6aSNate Lawson case AML_FIELD_OP: 47653289f6aSNate Lawson 47753289f6aSNate Lawson Status = LdLoadFieldElements (Op, WalkState); 47853289f6aSNate Lawson return (Status); 47953289f6aSNate Lawson 480313a0c13SJung-uk Kim case AML_INT_CONNECTION_OP: 481313a0c13SJung-uk Kim 482313a0c13SJung-uk Kim 483313a0c13SJung-uk Kim if (Op->Asl.Child->Asl.AmlOpcode != AML_INT_NAMEPATH_OP) 484313a0c13SJung-uk Kim { 485313a0c13SJung-uk Kim break; 486313a0c13SJung-uk Kim } 487313a0c13SJung-uk Kim Arg = Op->Asl.Child; 488313a0c13SJung-uk Kim 489313a0c13SJung-uk Kim Status = AcpiNsLookup (WalkState->ScopeInfo, Arg->Asl.ExternalName, 490313a0c13SJung-uk Kim ACPI_TYPE_ANY, ACPI_IMODE_EXECUTE, ACPI_NS_SEARCH_PARENT, 491313a0c13SJung-uk Kim WalkState, &Node); 492313a0c13SJung-uk Kim if (ACPI_FAILURE (Status)) 493313a0c13SJung-uk Kim { 494313a0c13SJung-uk Kim break; 495313a0c13SJung-uk Kim } 496313a0c13SJung-uk Kim 497313a0c13SJung-uk Kim if (Node->Type == ACPI_TYPE_BUFFER) 498313a0c13SJung-uk Kim { 499313a0c13SJung-uk Kim Arg->Asl.Node = Node; 500313a0c13SJung-uk Kim 501313a0c13SJung-uk Kim Arg = Node->Op->Asl.Child; /* Get namepath */ 502313a0c13SJung-uk Kim Arg = Arg->Asl.Next; /* Get actual buffer */ 503313a0c13SJung-uk Kim Arg = Arg->Asl.Child; /* Buffer length */ 504313a0c13SJung-uk Kim Arg = Arg->Asl.Next; /* RAW_DATA buffer */ 505313a0c13SJung-uk Kim } 506313a0c13SJung-uk Kim break; 507313a0c13SJung-uk Kim 50853289f6aSNate Lawson default: 50953289f6aSNate Lawson 51053289f6aSNate Lawson /* All other opcodes go below */ 511a9d8d09cSJung-uk Kim 51253289f6aSNate Lawson break; 51353289f6aSNate Lawson } 51453289f6aSNate Lawson 51553289f6aSNate Lawson /* Check if this object has already been installed in the namespace */ 51653289f6aSNate Lawson 51753289f6aSNate Lawson if (Op->Asl.Node) 51853289f6aSNate Lawson { 51953289f6aSNate Lawson return (AE_OK); 52053289f6aSNate Lawson } 52153289f6aSNate Lawson 52253289f6aSNate Lawson Path = Op->Asl.Namepath; 52353289f6aSNate Lawson if (!Path) 52453289f6aSNate Lawson { 52553289f6aSNate Lawson return (AE_OK); 52653289f6aSNate Lawson } 52753289f6aSNate Lawson 52853289f6aSNate Lawson /* Map the raw opcode into an internal object type */ 52953289f6aSNate Lawson 53053289f6aSNate Lawson switch (Op->Asl.ParseOpcode) 53153289f6aSNate Lawson { 53253289f6aSNate Lawson case PARSEOP_NAME: 53353289f6aSNate Lawson 53453289f6aSNate Lawson Arg = Op->Asl.Child; /* Get the NameSeg/NameString node */ 53553289f6aSNate Lawson Arg = Arg->Asl.Next; /* First peer is the object to be associated with the name */ 53653289f6aSNate Lawson 5371a39cfb0SJung-uk Kim /* 5381a39cfb0SJung-uk Kim * If this name refers to a ResourceTemplate, we will need to open 5391a39cfb0SJung-uk Kim * a new scope so that the resource subfield names can be entered into 5401a39cfb0SJung-uk Kim * the namespace underneath this name 5411a39cfb0SJung-uk Kim */ 5421a39cfb0SJung-uk Kim if (Op->Asl.CompileFlags & NODE_IS_RESOURCE_DESC) 5431a39cfb0SJung-uk Kim { 5441a39cfb0SJung-uk Kim ForceNewScope = TRUE; 5451a39cfb0SJung-uk Kim } 5461a39cfb0SJung-uk Kim 54753289f6aSNate Lawson /* Get the data type associated with the named object, not the name itself */ 54853289f6aSNate Lawson 54953289f6aSNate Lawson /* Log2 loop to convert from Btype (binary) to Etype (encoded) */ 55053289f6aSNate Lawson 55153289f6aSNate Lawson ObjectType = 1; 55253289f6aSNate Lawson for (i = 1; i < Arg->Asl.AcpiBtype; i *= 2) 55353289f6aSNate Lawson { 55453289f6aSNate Lawson ObjectType++; 55553289f6aSNate Lawson } 55653289f6aSNate Lawson break; 55753289f6aSNate Lawson 55853289f6aSNate Lawson 55953289f6aSNate Lawson case PARSEOP_EXTERNAL: 56053289f6aSNate Lawson /* 56153289f6aSNate Lawson * "External" simply enters a name and type into the namespace. 56253289f6aSNate Lawson * We must be careful to not open a new scope, however, no matter 56353289f6aSNate Lawson * what type the external name refers to (e.g., a method) 56453289f6aSNate Lawson * 56553289f6aSNate Lawson * first child is name, next child is ObjectType 56653289f6aSNate Lawson */ 56753289f6aSNate Lawson ActualObjectType = (UINT8) Op->Asl.Child->Asl.Next->Asl.Value.Integer; 56853289f6aSNate Lawson ObjectType = ACPI_TYPE_ANY; 56953289f6aSNate Lawson 5701a39cfb0SJung-uk Kim /* 5711a39cfb0SJung-uk Kim * We will mark every new node along the path as "External". This 5721a39cfb0SJung-uk Kim * allows some or all of the nodes to be created later in the ASL 5731a39cfb0SJung-uk Kim * code. Handles cases like this: 5741a39cfb0SJung-uk Kim * 5751a39cfb0SJung-uk Kim * External (\_SB_.PCI0.ABCD, IntObj) 5761a39cfb0SJung-uk Kim * Scope (_SB_) 5771a39cfb0SJung-uk Kim * { 5781a39cfb0SJung-uk Kim * Device (PCI0) 5791a39cfb0SJung-uk Kim * { 5801a39cfb0SJung-uk Kim * } 5811a39cfb0SJung-uk Kim * } 5821a39cfb0SJung-uk Kim * Method (X) 5831a39cfb0SJung-uk Kim * { 5841a39cfb0SJung-uk Kim * Store (\_SB_.PCI0.ABCD, Local0) 5851a39cfb0SJung-uk Kim * } 5861a39cfb0SJung-uk Kim */ 5871a39cfb0SJung-uk Kim Flags |= ACPI_NS_EXTERNAL; 5881a39cfb0SJung-uk Kim break; 58953289f6aSNate Lawson 59053289f6aSNate Lawson case PARSEOP_DEFAULT_ARG: 59153289f6aSNate Lawson 59253289f6aSNate Lawson if (Op->Asl.CompileFlags == NODE_IS_RESOURCE_DESC) 59353289f6aSNate Lawson { 59453289f6aSNate Lawson Status = LdLoadResourceElements (Op, WalkState); 5959a179dd8SJung-uk Kim return_ACPI_STATUS (Status); 59653289f6aSNate Lawson } 59753289f6aSNate Lawson 59853289f6aSNate Lawson ObjectType = AslMapNamedOpcodeToDataType (Op->Asl.AmlOpcode); 59953289f6aSNate Lawson break; 60053289f6aSNate Lawson 60153289f6aSNate Lawson case PARSEOP_SCOPE: 60253289f6aSNate Lawson /* 60353289f6aSNate Lawson * The name referenced by Scope(Name) must already exist at this point. 60453289f6aSNate Lawson * In other words, forward references for Scope() are not supported. 60553289f6aSNate Lawson * The only real reason for this is that the MS interpreter cannot 60653289f6aSNate Lawson * handle this case. Perhaps someday this case can go away. 60753289f6aSNate Lawson */ 60853289f6aSNate Lawson Status = AcpiNsLookup (WalkState->ScopeInfo, Path, ACPI_TYPE_ANY, 609fba7fc7eSJung-uk Kim ACPI_IMODE_EXECUTE, ACPI_NS_SEARCH_PARENT, 610fba7fc7eSJung-uk Kim WalkState, &(Node)); 61153289f6aSNate Lawson if (ACPI_FAILURE (Status)) 61253289f6aSNate Lawson { 61353289f6aSNate Lawson if (Status == AE_NOT_FOUND) 61453289f6aSNate Lawson { 61553289f6aSNate Lawson /* The name was not found, go ahead and create it */ 61653289f6aSNate Lawson 617fba7fc7eSJung-uk Kim Status = AcpiNsLookup (WalkState->ScopeInfo, Path, 618fba7fc7eSJung-uk Kim ACPI_TYPE_LOCAL_SCOPE, 619fba7fc7eSJung-uk Kim ACPI_IMODE_LOAD_PASS1, Flags, 620fba7fc7eSJung-uk Kim WalkState, &(Node)); 62179c6d946SJung-uk Kim if (ACPI_FAILURE (Status)) 62279c6d946SJung-uk Kim { 62379c6d946SJung-uk Kim return_ACPI_STATUS (Status); 62479c6d946SJung-uk Kim } 62553289f6aSNate Lawson 62653289f6aSNate Lawson /* 62753289f6aSNate Lawson * However, this is an error -- primarily because the MS 62853289f6aSNate Lawson * interpreter can't handle a forward reference from the 62953289f6aSNate Lawson * Scope() operator. 63053289f6aSNate Lawson */ 631fba7fc7eSJung-uk Kim AslError (ASL_ERROR, ASL_MSG_NOT_FOUND, Op, 632fba7fc7eSJung-uk Kim Op->Asl.ExternalName); 633fba7fc7eSJung-uk Kim AslError (ASL_ERROR, ASL_MSG_SCOPE_FWD_REF, Op, 634fba7fc7eSJung-uk Kim Op->Asl.ExternalName); 63553289f6aSNate Lawson goto FinishNode; 63653289f6aSNate Lawson } 63753289f6aSNate Lawson 638f556842eSJung-uk Kim AslCoreSubsystemError (Op, Status, 639f556842eSJung-uk Kim "Failure from namespace lookup", FALSE); 640f556842eSJung-uk Kim 6419a179dd8SJung-uk Kim return_ACPI_STATUS (Status); 64253289f6aSNate Lawson } 643f8146b88SJung-uk Kim else /* Status AE_OK */ 644f8146b88SJung-uk Kim { 645f8146b88SJung-uk Kim /* 646f8146b88SJung-uk Kim * Do not allow references to external scopes from the DSDT. 647f8146b88SJung-uk Kim * This is because the DSDT is always loaded first, and the 648f8146b88SJung-uk Kim * external reference cannot be resolved -- causing a runtime 649f8146b88SJung-uk Kim * error because Scope() must be resolved immediately. 650f8146b88SJung-uk Kim * 10/2015. 651f8146b88SJung-uk Kim */ 652f8146b88SJung-uk Kim if ((Node->Flags & ANOBJ_IS_EXTERNAL) && 653f8146b88SJung-uk Kim (ACPI_COMPARE_NAME (Gbl_TableSignature, "DSDT"))) 654f8146b88SJung-uk Kim { 655f8146b88SJung-uk Kim /* However, allowed if the reference is within a method */ 656f8146b88SJung-uk Kim 657f8146b88SJung-uk Kim MethodOp = Op->Asl.Parent; 658f8146b88SJung-uk Kim while (MethodOp && 659f8146b88SJung-uk Kim (MethodOp->Asl.ParseOpcode != PARSEOP_METHOD)) 660f8146b88SJung-uk Kim { 661f8146b88SJung-uk Kim MethodOp = MethodOp->Asl.Parent; 662f8146b88SJung-uk Kim } 663f8146b88SJung-uk Kim 664f8146b88SJung-uk Kim if (!MethodOp) 665f8146b88SJung-uk Kim { 666f8146b88SJung-uk Kim /* Not in a control method, error */ 667f8146b88SJung-uk Kim 668f8146b88SJung-uk Kim AslError (ASL_ERROR, ASL_MSG_CROSS_TABLE_SCOPE, Op, NULL); 669f8146b88SJung-uk Kim } 670f8146b88SJung-uk Kim } 671f8146b88SJung-uk Kim } 67253289f6aSNate Lawson 67353289f6aSNate Lawson /* We found a node with this name, now check the type */ 67453289f6aSNate Lawson 67553289f6aSNate Lawson switch (Node->Type) 67653289f6aSNate Lawson { 67753289f6aSNate Lawson case ACPI_TYPE_LOCAL_SCOPE: 67853289f6aSNate Lawson case ACPI_TYPE_DEVICE: 67953289f6aSNate Lawson case ACPI_TYPE_POWER: 68053289f6aSNate Lawson case ACPI_TYPE_PROCESSOR: 68153289f6aSNate Lawson case ACPI_TYPE_THERMAL: 68253289f6aSNate Lawson 68353289f6aSNate Lawson /* These are acceptable types - they all open a new scope */ 68453289f6aSNate Lawson break; 68553289f6aSNate Lawson 68653289f6aSNate Lawson case ACPI_TYPE_INTEGER: 68753289f6aSNate Lawson case ACPI_TYPE_STRING: 68853289f6aSNate Lawson case ACPI_TYPE_BUFFER: 68953289f6aSNate Lawson /* 690fba7fc7eSJung-uk Kim * These types we will allow, but we will change the type. 691fba7fc7eSJung-uk Kim * This enables some existing code of the form: 69253289f6aSNate Lawson * 69353289f6aSNate Lawson * Name (DEB, 0) 69453289f6aSNate Lawson * Scope (DEB) { ... } 69553289f6aSNate Lawson * 69653289f6aSNate Lawson * Which is used to workaround the fact that the MS interpreter 69753289f6aSNate Lawson * does not allow Scope() forward references. 69853289f6aSNate Lawson */ 699e0ef747bSNate Lawson sprintf (MsgBuffer, "%s [%s], changing type to [Scope]", 70053289f6aSNate Lawson Op->Asl.ExternalName, AcpiUtGetTypeName (Node->Type)); 70153289f6aSNate Lawson AslError (ASL_REMARK, ASL_MSG_SCOPE_TYPE, Op, MsgBuffer); 70253289f6aSNate Lawson 703fba7fc7eSJung-uk Kim /* Switch the type to scope, open the new scope */ 704fba7fc7eSJung-uk Kim 705e0ef747bSNate Lawson Node->Type = ACPI_TYPE_LOCAL_SCOPE; 706fba7fc7eSJung-uk Kim Status = AcpiDsScopeStackPush (Node, ACPI_TYPE_LOCAL_SCOPE, 707fba7fc7eSJung-uk Kim WalkState); 708e0ef747bSNate Lawson if (ACPI_FAILURE (Status)) 709e0ef747bSNate Lawson { 710e0ef747bSNate Lawson return_ACPI_STATUS (Status); 711e0ef747bSNate Lawson } 71253289f6aSNate Lawson break; 71353289f6aSNate Lawson 71453289f6aSNate Lawson default: 71553289f6aSNate Lawson 716fba7fc7eSJung-uk Kim /* All other types are an error */ 717fba7fc7eSJung-uk Kim 718fba7fc7eSJung-uk Kim sprintf (MsgBuffer, "%s [%s]", Op->Asl.ExternalName, 719fba7fc7eSJung-uk Kim AcpiUtGetTypeName (Node->Type)); 72053289f6aSNate Lawson AslError (ASL_ERROR, ASL_MSG_SCOPE_TYPE, Op, MsgBuffer); 72153289f6aSNate Lawson 72253289f6aSNate Lawson /* 72353289f6aSNate Lawson * However, switch the type to be an actual scope so 72453289f6aSNate Lawson * that compilation can continue without generating a whole 725e0ef747bSNate Lawson * cascade of additional errors. Open the new scope. 72653289f6aSNate Lawson */ 727e0ef747bSNate Lawson Node->Type = ACPI_TYPE_LOCAL_SCOPE; 728fba7fc7eSJung-uk Kim Status = AcpiDsScopeStackPush (Node, ACPI_TYPE_LOCAL_SCOPE, 729fba7fc7eSJung-uk Kim WalkState); 730e0ef747bSNate Lawson if (ACPI_FAILURE (Status)) 731e0ef747bSNate Lawson { 732e0ef747bSNate Lawson return_ACPI_STATUS (Status); 733e0ef747bSNate Lawson } 73453289f6aSNate Lawson break; 73553289f6aSNate Lawson } 73653289f6aSNate Lawson 73753289f6aSNate Lawson Status = AE_OK; 73853289f6aSNate Lawson goto FinishNode; 73953289f6aSNate Lawson 74053289f6aSNate Lawson 74153289f6aSNate Lawson default: 74253289f6aSNate Lawson 74353289f6aSNate Lawson ObjectType = AslMapNamedOpcodeToDataType (Op->Asl.AmlOpcode); 74453289f6aSNate Lawson break; 74553289f6aSNate Lawson } 74653289f6aSNate Lawson 74753289f6aSNate Lawson 74853289f6aSNate Lawson ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Loading name: %s, (%s)\n", 74953289f6aSNate Lawson Op->Asl.ExternalName, AcpiUtGetTypeName (ObjectType))); 75053289f6aSNate Lawson 75153289f6aSNate Lawson /* The name must not already exist */ 75253289f6aSNate Lawson 75353289f6aSNate Lawson Flags |= ACPI_NS_ERROR_IF_FOUND; 75453289f6aSNate Lawson 75553289f6aSNate Lawson /* 75653289f6aSNate Lawson * Enter the named type into the internal namespace. We enter the name 757fba7fc7eSJung-uk Kim * as we go downward in the parse tree. Any necessary subobjects that 758fba7fc7eSJung-uk Kim * involve arguments to the opcode must be created as we go back up the 759fba7fc7eSJung-uk Kim * parse tree later. 76053289f6aSNate Lawson */ 76153289f6aSNate Lawson Status = AcpiNsLookup (WalkState->ScopeInfo, Path, ObjectType, 7621a39cfb0SJung-uk Kim ACPI_IMODE_LOAD_PASS1, Flags, WalkState, &Node); 76353289f6aSNate Lawson if (ACPI_FAILURE (Status)) 76453289f6aSNate Lawson { 76553289f6aSNate Lawson if (Status == AE_ALREADY_EXISTS) 76653289f6aSNate Lawson { 76753289f6aSNate Lawson /* The name already exists in this scope */ 76853289f6aSNate Lawson 76953289f6aSNate Lawson if (Node->Type == ACPI_TYPE_LOCAL_SCOPE) 77053289f6aSNate Lawson { 7711a39cfb0SJung-uk Kim /* Allow multiple references to the same scope */ 7721a39cfb0SJung-uk Kim 77353289f6aSNate Lawson Node->Type = (UINT8) ObjectType; 77453289f6aSNate Lawson Status = AE_OK; 77553289f6aSNate Lawson } 776a9f12690SJung-uk Kim else if ((Node->Flags & ANOBJ_IS_EXTERNAL) && 777a9f12690SJung-uk Kim (Op->Asl.ParseOpcode != PARSEOP_EXTERNAL)) 7781a39cfb0SJung-uk Kim { 7791a39cfb0SJung-uk Kim /* 7801a39cfb0SJung-uk Kim * Allow one create on an object or segment that was 7811a39cfb0SJung-uk Kim * previously declared External 7821a39cfb0SJung-uk Kim */ 7831a39cfb0SJung-uk Kim Node->Flags &= ~ANOBJ_IS_EXTERNAL; 7841a39cfb0SJung-uk Kim Node->Type = (UINT8) ObjectType; 7851a39cfb0SJung-uk Kim 7861a39cfb0SJung-uk Kim /* Just retyped a node, probably will need to open a scope */ 7871a39cfb0SJung-uk Kim 7881a39cfb0SJung-uk Kim if (AcpiNsOpensScope (ObjectType)) 7891a39cfb0SJung-uk Kim { 7901a39cfb0SJung-uk Kim Status = AcpiDsScopeStackPush (Node, ObjectType, WalkState); 7911a39cfb0SJung-uk Kim if (ACPI_FAILURE (Status)) 7921a39cfb0SJung-uk Kim { 7931a39cfb0SJung-uk Kim return_ACPI_STATUS (Status); 7941a39cfb0SJung-uk Kim } 7951a39cfb0SJung-uk Kim } 796f8146b88SJung-uk Kim 7971a39cfb0SJung-uk Kim Status = AE_OK; 7981a39cfb0SJung-uk Kim } 799f8146b88SJung-uk Kim else if (!(Node->Flags & ANOBJ_IS_EXTERNAL) && 800f8146b88SJung-uk Kim (Op->Asl.ParseOpcode == PARSEOP_EXTERNAL)) 801f8146b88SJung-uk Kim { 802f8146b88SJung-uk Kim /* 803f8146b88SJung-uk Kim * Allow externals in same scope as the definition of the 804f8146b88SJung-uk Kim * actual object. Similar to C. Allows multiple definition 805f8146b88SJung-uk Kim * blocks that refer to each other in the same file. 806f8146b88SJung-uk Kim */ 807f8146b88SJung-uk Kim Status = AE_OK; 808f8146b88SJung-uk Kim } 809f8146b88SJung-uk Kim else if ((Node->Flags & ANOBJ_IS_EXTERNAL) && 810f8146b88SJung-uk Kim (Op->Asl.ParseOpcode == PARSEOP_EXTERNAL) && 811f8146b88SJung-uk Kim (ObjectType == ACPI_TYPE_ANY)) 812f8146b88SJung-uk Kim { 813f8146b88SJung-uk Kim /* Allow update of externals of unknown type. */ 814f8146b88SJung-uk Kim 815f8146b88SJung-uk Kim if (AcpiNsOpensScope (ActualObjectType)) 816f8146b88SJung-uk Kim { 817f8146b88SJung-uk Kim Node->Type = (UINT8) ActualObjectType; 818f8146b88SJung-uk Kim Status = AE_OK; 819f8146b88SJung-uk Kim } 820f8146b88SJung-uk Kim else 821f8146b88SJung-uk Kim { 822f8146b88SJung-uk Kim sprintf (MsgBuffer, "%s [%s]", Op->Asl.ExternalName, 823f8146b88SJung-uk Kim AcpiUtGetTypeName (Node->Type)); 824f8146b88SJung-uk Kim AslError (ASL_ERROR, ASL_MSG_SCOPE_TYPE, Op, MsgBuffer); 825f8146b88SJung-uk Kim return_ACPI_STATUS (AE_OK); 826f8146b88SJung-uk Kim } 827f8146b88SJung-uk Kim } 82853289f6aSNate Lawson else 82953289f6aSNate Lawson { 8301a39cfb0SJung-uk Kim /* Valid error, object already exists */ 8311a39cfb0SJung-uk Kim 832fba7fc7eSJung-uk Kim AslError (ASL_ERROR, ASL_MSG_NAME_EXISTS, Op, 833fba7fc7eSJung-uk Kim Op->Asl.ExternalName); 8349a179dd8SJung-uk Kim return_ACPI_STATUS (AE_OK); 83553289f6aSNate Lawson } 83653289f6aSNate Lawson } 83753289f6aSNate Lawson else 83853289f6aSNate Lawson { 839fba7fc7eSJung-uk Kim AslCoreSubsystemError (Op, Status, 840f556842eSJung-uk Kim "Failure from namespace lookup", FALSE); 8419a179dd8SJung-uk Kim return_ACPI_STATUS (Status); 84253289f6aSNate Lawson } 84353289f6aSNate Lawson } 84453289f6aSNate Lawson 8451a39cfb0SJung-uk Kim if (ForceNewScope) 8461a39cfb0SJung-uk Kim { 8471a39cfb0SJung-uk Kim Status = AcpiDsScopeStackPush (Node, ObjectType, WalkState); 8481a39cfb0SJung-uk Kim if (ACPI_FAILURE (Status)) 8491a39cfb0SJung-uk Kim { 8501a39cfb0SJung-uk Kim return_ACPI_STATUS (Status); 8511a39cfb0SJung-uk Kim } 8521a39cfb0SJung-uk Kim } 85353289f6aSNate Lawson 85453289f6aSNate Lawson FinishNode: 85553289f6aSNate Lawson /* 85653289f6aSNate Lawson * Point the parse node to the new namespace node, and point 85753289f6aSNate Lawson * the Node back to the original Parse node 85853289f6aSNate Lawson */ 85953289f6aSNate Lawson Op->Asl.Node = Node; 860fba7fc7eSJung-uk Kim Node->Op = Op; 86153289f6aSNate Lawson 86253289f6aSNate Lawson /* Set the actual data type if appropriate (EXTERNAL term only) */ 86353289f6aSNate Lawson 86453289f6aSNate Lawson if (ActualObjectType != ACPI_TYPE_ANY) 86553289f6aSNate Lawson { 86653289f6aSNate Lawson Node->Type = (UINT8) ActualObjectType; 867fba7fc7eSJung-uk Kim Node->Value = ASL_EXTERNAL_METHOD; 86853289f6aSNate Lawson } 86953289f6aSNate Lawson 87053289f6aSNate Lawson if (Op->Asl.ParseOpcode == PARSEOP_METHOD) 87153289f6aSNate Lawson { 87253289f6aSNate Lawson /* 873fba7fc7eSJung-uk Kim * Get the method argument count from "Extra" and save 874fba7fc7eSJung-uk Kim * it in the namespace node 87553289f6aSNate Lawson */ 876fba7fc7eSJung-uk Kim Node->Value = (UINT32) Op->Asl.Extra; 87753289f6aSNate Lawson } 87853289f6aSNate Lawson 8799a179dd8SJung-uk Kim return_ACPI_STATUS (Status); 88053289f6aSNate Lawson } 88153289f6aSNate Lawson 88253289f6aSNate Lawson 88353289f6aSNate Lawson /******************************************************************************* 88453289f6aSNate Lawson * 885a9f12690SJung-uk Kim * FUNCTION: LdNamespace2Begin 886a9f12690SJung-uk Kim * 887a9f12690SJung-uk Kim * PARAMETERS: ASL_WALK_CALLBACK 888a9f12690SJung-uk Kim * 889a9f12690SJung-uk Kim * RETURN: Status 890a9f12690SJung-uk Kim * 891a9f12690SJung-uk Kim * DESCRIPTION: Descending callback used during the pass 2 parse tree walk. 892a9f12690SJung-uk Kim * Second pass resolves some forward references. 893a9f12690SJung-uk Kim * 894a9f12690SJung-uk Kim * Notes: 895a9f12690SJung-uk Kim * Currently only needs to handle the Alias operator. 896a9f12690SJung-uk Kim * Could be used to allow forward references from the Scope() operator, but 897a9f12690SJung-uk Kim * the MS interpreter does not allow this, so this compiler does not either. 898a9f12690SJung-uk Kim * 899a9f12690SJung-uk Kim ******************************************************************************/ 900a9f12690SJung-uk Kim 901a9f12690SJung-uk Kim static ACPI_STATUS 902a9f12690SJung-uk Kim LdNamespace2Begin ( 903a9f12690SJung-uk Kim ACPI_PARSE_OBJECT *Op, 904a9f12690SJung-uk Kim UINT32 Level, 905a9f12690SJung-uk Kim void *Context) 906a9f12690SJung-uk Kim { 907a9f12690SJung-uk Kim ACPI_WALK_STATE *WalkState = (ACPI_WALK_STATE *) Context; 908a9f12690SJung-uk Kim ACPI_STATUS Status; 909a9f12690SJung-uk Kim ACPI_NAMESPACE_NODE *Node; 910a9f12690SJung-uk Kim ACPI_OBJECT_TYPE ObjectType; 911a9f12690SJung-uk Kim BOOLEAN ForceNewScope = FALSE; 912a9f12690SJung-uk Kim ACPI_PARSE_OBJECT *Arg; 913a9f12690SJung-uk Kim char *Path; 914a9f12690SJung-uk Kim ACPI_NAMESPACE_NODE *TargetNode; 915a9f12690SJung-uk Kim 916a9f12690SJung-uk Kim 917a9f12690SJung-uk Kim ACPI_FUNCTION_NAME (LdNamespace2Begin); 918a9f12690SJung-uk Kim ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Op %p [%s]\n", 919a9f12690SJung-uk Kim Op, Op->Asl.ParseOpName)); 920a9f12690SJung-uk Kim 921a9f12690SJung-uk Kim 922a9f12690SJung-uk Kim /* Ignore Ops with no namespace node */ 923a9f12690SJung-uk Kim 924a9f12690SJung-uk Kim Node = Op->Asl.Node; 925a9f12690SJung-uk Kim if (!Node) 926a9f12690SJung-uk Kim { 927a9f12690SJung-uk Kim return (AE_OK); 928a9f12690SJung-uk Kim } 929a9f12690SJung-uk Kim 930a9f12690SJung-uk Kim /* Get the type to determine if we should push the scope */ 931a9f12690SJung-uk Kim 932a9f12690SJung-uk Kim if ((Op->Asl.ParseOpcode == PARSEOP_DEFAULT_ARG) && 933a9f12690SJung-uk Kim (Op->Asl.CompileFlags == NODE_IS_RESOURCE_DESC)) 934a9f12690SJung-uk Kim { 935a9f12690SJung-uk Kim ObjectType = ACPI_TYPE_LOCAL_RESOURCE; 936a9f12690SJung-uk Kim } 937a9f12690SJung-uk Kim else 938a9f12690SJung-uk Kim { 939a9f12690SJung-uk Kim ObjectType = AslMapNamedOpcodeToDataType (Op->Asl.AmlOpcode); 940a9f12690SJung-uk Kim } 941a9f12690SJung-uk Kim 942a9f12690SJung-uk Kim /* Push scope for Resource Templates */ 943a9f12690SJung-uk Kim 944a9f12690SJung-uk Kim if (Op->Asl.ParseOpcode == PARSEOP_NAME) 945a9f12690SJung-uk Kim { 946a9f12690SJung-uk Kim if (Op->Asl.CompileFlags & NODE_IS_RESOURCE_DESC) 947a9f12690SJung-uk Kim { 948a9f12690SJung-uk Kim ForceNewScope = TRUE; 949a9f12690SJung-uk Kim } 950a9f12690SJung-uk Kim } 951a9f12690SJung-uk Kim 952a9f12690SJung-uk Kim /* Push the scope stack */ 953a9f12690SJung-uk Kim 954a9f12690SJung-uk Kim if (ForceNewScope || AcpiNsOpensScope (ObjectType)) 955a9f12690SJung-uk Kim { 956a9f12690SJung-uk Kim Status = AcpiDsScopeStackPush (Node, ObjectType, WalkState); 957a9f12690SJung-uk Kim if (ACPI_FAILURE (Status)) 958a9f12690SJung-uk Kim { 959a9f12690SJung-uk Kim return_ACPI_STATUS (Status); 960a9f12690SJung-uk Kim } 961a9f12690SJung-uk Kim } 962a9f12690SJung-uk Kim 963a9f12690SJung-uk Kim if (Op->Asl.ParseOpcode == PARSEOP_ALIAS) 964a9f12690SJung-uk Kim { 965a9f12690SJung-uk Kim /* Complete the alias node by getting and saving the target node */ 966a9f12690SJung-uk Kim 967a9f12690SJung-uk Kim /* First child is the alias target */ 968a9f12690SJung-uk Kim 969a9f12690SJung-uk Kim Arg = Op->Asl.Child; 970a9f12690SJung-uk Kim 971a9f12690SJung-uk Kim /* Get the target pathname */ 972a9f12690SJung-uk Kim 973a9f12690SJung-uk Kim Path = Arg->Asl.Namepath; 974a9f12690SJung-uk Kim if (!Path) 975a9f12690SJung-uk Kim { 976a9f12690SJung-uk Kim Status = UtInternalizeName (Arg->Asl.ExternalName, &Path); 977a9f12690SJung-uk Kim if (ACPI_FAILURE (Status)) 978a9f12690SJung-uk Kim { 979a9f12690SJung-uk Kim return (Status); 980a9f12690SJung-uk Kim } 981a9f12690SJung-uk Kim } 982a9f12690SJung-uk Kim 983a9f12690SJung-uk Kim /* Get the NS node associated with the target. It must exist. */ 984a9f12690SJung-uk Kim 985a9f12690SJung-uk Kim Status = AcpiNsLookup (WalkState->ScopeInfo, Path, ACPI_TYPE_ANY, 986a9f12690SJung-uk Kim ACPI_IMODE_EXECUTE, ACPI_NS_SEARCH_PARENT | ACPI_NS_DONT_OPEN_SCOPE, 987a9f12690SJung-uk Kim WalkState, &TargetNode); 988a9f12690SJung-uk Kim if (ACPI_FAILURE (Status)) 989a9f12690SJung-uk Kim { 990a9f12690SJung-uk Kim if (Status == AE_NOT_FOUND) 991a9f12690SJung-uk Kim { 992a9f12690SJung-uk Kim AslError (ASL_ERROR, ASL_MSG_NOT_FOUND, Op, 993a9f12690SJung-uk Kim Op->Asl.ExternalName); 994a9f12690SJung-uk Kim 995a9f12690SJung-uk Kim /* 996a9f12690SJung-uk Kim * The name was not found, go ahead and create it. 997a9f12690SJung-uk Kim * This prevents more errors later. 998a9f12690SJung-uk Kim */ 999a9f12690SJung-uk Kim Status = AcpiNsLookup (WalkState->ScopeInfo, Path, 1000a9f12690SJung-uk Kim ACPI_TYPE_ANY, 1001a9f12690SJung-uk Kim ACPI_IMODE_LOAD_PASS1, ACPI_NS_NO_UPSEARCH, 1002a9f12690SJung-uk Kim WalkState, &(Node)); 1003a9f12690SJung-uk Kim return (AE_OK); 1004a9f12690SJung-uk Kim } 1005a9f12690SJung-uk Kim 1006f556842eSJung-uk Kim AslCoreSubsystemError (Op, Status, 1007f556842eSJung-uk Kim "Failure from namespace lookup", FALSE); 1008a9f12690SJung-uk Kim return (AE_OK); 1009a9f12690SJung-uk Kim } 1010a9f12690SJung-uk Kim 1011a9f12690SJung-uk Kim /* Save the target node within the alias node */ 1012a9f12690SJung-uk Kim 1013a9f12690SJung-uk Kim Node->Object = ACPI_CAST_PTR (ACPI_OPERAND_OBJECT, TargetNode); 1014a9f12690SJung-uk Kim } 1015a9f12690SJung-uk Kim 1016a9f12690SJung-uk Kim return (AE_OK); 1017a9f12690SJung-uk Kim } 1018a9f12690SJung-uk Kim 1019a9f12690SJung-uk Kim 1020a9f12690SJung-uk Kim /******************************************************************************* 1021a9f12690SJung-uk Kim * 1022a9f12690SJung-uk Kim * FUNCTION: LdCommonNamespaceEnd 102353289f6aSNate Lawson * 102453289f6aSNate Lawson * PARAMETERS: ASL_WALK_CALLBACK 102553289f6aSNate Lawson * 102653289f6aSNate Lawson * RETURN: Status 102753289f6aSNate Lawson * 102853289f6aSNate Lawson * DESCRIPTION: Ascending callback used during the loading of the namespace, 102953289f6aSNate Lawson * We only need to worry about managing the scope stack here. 103053289f6aSNate Lawson * 103153289f6aSNate Lawson ******************************************************************************/ 103253289f6aSNate Lawson 1033fba7fc7eSJung-uk Kim static ACPI_STATUS 1034a9f12690SJung-uk Kim LdCommonNamespaceEnd ( 103553289f6aSNate Lawson ACPI_PARSE_OBJECT *Op, 103653289f6aSNate Lawson UINT32 Level, 103753289f6aSNate Lawson void *Context) 103853289f6aSNate Lawson { 103953289f6aSNate Lawson ACPI_WALK_STATE *WalkState = (ACPI_WALK_STATE *) Context; 104053289f6aSNate Lawson ACPI_OBJECT_TYPE ObjectType; 10411a39cfb0SJung-uk Kim BOOLEAN ForceNewScope = FALSE; 104253289f6aSNate Lawson 104353289f6aSNate Lawson 1044a9f12690SJung-uk Kim ACPI_FUNCTION_NAME (LdCommonNamespaceEnd); 104553289f6aSNate Lawson 104653289f6aSNate Lawson 104753289f6aSNate Lawson /* We are only interested in opcodes that have an associated name */ 104853289f6aSNate Lawson 104953289f6aSNate Lawson if (!Op->Asl.Namepath) 105053289f6aSNate Lawson { 105153289f6aSNate Lawson return (AE_OK); 105253289f6aSNate Lawson } 105353289f6aSNate Lawson 105453289f6aSNate Lawson /* Get the type to determine if we should pop the scope */ 105553289f6aSNate Lawson 105653289f6aSNate Lawson if ((Op->Asl.ParseOpcode == PARSEOP_DEFAULT_ARG) && 105753289f6aSNate Lawson (Op->Asl.CompileFlags == NODE_IS_RESOURCE_DESC)) 105853289f6aSNate Lawson { 105953289f6aSNate Lawson /* TBD: Merge into AcpiDsMapNamedOpcodeToDataType */ 106053289f6aSNate Lawson 106153289f6aSNate Lawson ObjectType = ACPI_TYPE_LOCAL_RESOURCE; 106253289f6aSNate Lawson } 106353289f6aSNate Lawson else 106453289f6aSNate Lawson { 106553289f6aSNate Lawson ObjectType = AslMapNamedOpcodeToDataType (Op->Asl.AmlOpcode); 106653289f6aSNate Lawson } 106753289f6aSNate Lawson 10681a39cfb0SJung-uk Kim /* Pop scope that was pushed for Resource Templates */ 10691a39cfb0SJung-uk Kim 10701a39cfb0SJung-uk Kim if (Op->Asl.ParseOpcode == PARSEOP_NAME) 10711a39cfb0SJung-uk Kim { 10721a39cfb0SJung-uk Kim if (Op->Asl.CompileFlags & NODE_IS_RESOURCE_DESC) 10731a39cfb0SJung-uk Kim { 10741a39cfb0SJung-uk Kim ForceNewScope = TRUE; 10751a39cfb0SJung-uk Kim } 10761a39cfb0SJung-uk Kim } 10771a39cfb0SJung-uk Kim 107853289f6aSNate Lawson /* Pop the scope stack */ 107953289f6aSNate Lawson 10801a39cfb0SJung-uk Kim if (ForceNewScope || AcpiNsOpensScope (ObjectType)) 108153289f6aSNate Lawson { 108253289f6aSNate Lawson ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, 108353289f6aSNate Lawson "(%s): Popping scope for Op [%s] %p\n", 108453289f6aSNate Lawson AcpiUtGetTypeName (ObjectType), Op->Asl.ParseOpName, Op)); 108553289f6aSNate Lawson 1086fba7fc7eSJung-uk Kim (void) AcpiDsScopeStackPop (WalkState); 108753289f6aSNate Lawson } 108853289f6aSNate Lawson 108953289f6aSNate Lawson return (AE_OK); 109053289f6aSNate Lawson } 1091