13446Smrj /****************************************************************************** 23446Smrj * 33446Smrj * Module Name: nsload - namespace loading/expanding/contracting procedures 4*7851SDana.Myers@Sun.COM * $Revision: 1.83 $ 53446Smrj * 63446Smrj *****************************************************************************/ 73446Smrj 83446Smrj /****************************************************************************** 93446Smrj * 103446Smrj * 1. Copyright Notice 113446Smrj * 12*7851SDana.Myers@Sun.COM * Some or all of this work - Copyright (c) 1999 - 2008, Intel Corp. 133446Smrj * All rights reserved. 143446Smrj * 153446Smrj * 2. License 163446Smrj * 173446Smrj * 2.1. This is your license from Intel Corp. under its intellectual property 183446Smrj * rights. You may have additional license terms from the party that provided 193446Smrj * you this software, covering your right to use that party's intellectual 203446Smrj * property rights. 213446Smrj * 223446Smrj * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a 233446Smrj * copy of the source code appearing in this file ("Covered Code") an 243446Smrj * irrevocable, perpetual, worldwide license under Intel's copyrights in the 253446Smrj * base code distributed originally by Intel ("Original Intel Code") to copy, 263446Smrj * make derivatives, distribute, use and display any portion of the Covered 273446Smrj * Code in any form, with the right to sublicense such rights; and 283446Smrj * 293446Smrj * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent 303446Smrj * license (with the right to sublicense), under only those claims of Intel 313446Smrj * patents that are infringed by the Original Intel Code, to make, use, sell, 323446Smrj * offer to sell, and import the Covered Code and derivative works thereof 333446Smrj * solely to the minimum extent necessary to exercise the above copyright 343446Smrj * license, and in no event shall the patent license extend to any additions 353446Smrj * to or modifications of the Original Intel Code. No other license or right 363446Smrj * is granted directly or by implication, estoppel or otherwise; 373446Smrj * 383446Smrj * The above copyright and patent license is granted only if the following 393446Smrj * conditions are met: 403446Smrj * 413446Smrj * 3. Conditions 423446Smrj * 433446Smrj * 3.1. Redistribution of Source with Rights to Further Distribute Source. 443446Smrj * Redistribution of source code of any substantial portion of the Covered 453446Smrj * Code or modification with rights to further distribute source must include 463446Smrj * the above Copyright Notice, the above License, this list of Conditions, 473446Smrj * and the following Disclaimer and Export Compliance provision. In addition, 483446Smrj * Licensee must cause all Covered Code to which Licensee contributes to 493446Smrj * contain a file documenting the changes Licensee made to create that Covered 503446Smrj * Code and the date of any change. Licensee must include in that file the 513446Smrj * documentation of any changes made by any predecessor Licensee. Licensee 523446Smrj * must include a prominent statement that the modification is derived, 533446Smrj * directly or indirectly, from Original Intel Code. 543446Smrj * 553446Smrj * 3.2. Redistribution of Source with no Rights to Further Distribute Source. 563446Smrj * Redistribution of source code of any substantial portion of the Covered 573446Smrj * Code or modification without rights to further distribute source must 583446Smrj * include the following Disclaimer and Export Compliance provision in the 593446Smrj * documentation and/or other materials provided with distribution. In 603446Smrj * addition, Licensee may not authorize further sublicense of source of any 613446Smrj * portion of the Covered Code, and must include terms to the effect that the 623446Smrj * license from Licensee to its licensee is limited to the intellectual 633446Smrj * property embodied in the software Licensee provides to its licensee, and 643446Smrj * not to intellectual property embodied in modifications its licensee may 653446Smrj * make. 663446Smrj * 673446Smrj * 3.3. Redistribution of Executable. Redistribution in executable form of any 683446Smrj * substantial portion of the Covered Code or modification must reproduce the 693446Smrj * above Copyright Notice, and the following Disclaimer and Export Compliance 703446Smrj * provision in the documentation and/or other materials provided with the 713446Smrj * distribution. 723446Smrj * 733446Smrj * 3.4. Intel retains all right, title, and interest in and to the Original 743446Smrj * Intel Code. 753446Smrj * 763446Smrj * 3.5. Neither the name Intel nor any other trademark owned or controlled by 773446Smrj * Intel shall be used in advertising or otherwise to promote the sale, use or 783446Smrj * other dealings in products derived from or relating to the Covered Code 793446Smrj * without prior written authorization from Intel. 803446Smrj * 813446Smrj * 4. Disclaimer and Export Compliance 823446Smrj * 833446Smrj * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED 843446Smrj * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE 853446Smrj * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE, 863446Smrj * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY 873446Smrj * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY 883446Smrj * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A 893446Smrj * PARTICULAR PURPOSE. 903446Smrj * 913446Smrj * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES 923446Smrj * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR 933446Smrj * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT, 943446Smrj * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY 953446Smrj * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL 963446Smrj * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS 973446Smrj * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY 983446Smrj * LIMITED REMEDY. 993446Smrj * 1003446Smrj * 4.3. Licensee shall not export, either directly or indirectly, any of this 1013446Smrj * software or system incorporating such software without first obtaining any 1023446Smrj * required license or other approval from the U. S. Department of Commerce or 1033446Smrj * any other agency or department of the United States Government. In the 1043446Smrj * event Licensee exports any such software from the United States or 1053446Smrj * re-exports any such software from a foreign destination, Licensee shall 1063446Smrj * ensure that the distribution and export/re-export of the software is in 1073446Smrj * compliance with all laws, regulations, orders, or other restrictions of the 1083446Smrj * U.S. Export Administration Regulations. Licensee agrees that neither it nor 1093446Smrj * any of its subsidiaries will export/re-export any technical data, process, 1103446Smrj * software, or service, directly or indirectly, to any country for which the 1113446Smrj * United States government or any agency thereof requires an export license, 1123446Smrj * other governmental approval, or letter of assurance, without first obtaining 1133446Smrj * such license, approval or letter. 1143446Smrj * 1153446Smrj *****************************************************************************/ 1163446Smrj 1173446Smrj #define __NSLOAD_C__ 1183446Smrj 1193446Smrj #include "acpi.h" 1203446Smrj #include "acnamesp.h" 1213446Smrj #include "acdispat.h" 122*7851SDana.Myers@Sun.COM #include "actables.h" 1233446Smrj 1243446Smrj 1253446Smrj #define _COMPONENT ACPI_NAMESPACE 1263446Smrj ACPI_MODULE_NAME ("nsload") 1273446Smrj 1283446Smrj /* Local prototypes */ 1293446Smrj 1303446Smrj #ifdef ACPI_FUTURE_IMPLEMENTATION 1313446Smrj ACPI_STATUS 1323446Smrj AcpiNsUnloadNamespace ( 1333446Smrj ACPI_HANDLE Handle); 1343446Smrj 1353446Smrj static ACPI_STATUS 1363446Smrj AcpiNsDeleteSubtree ( 1373446Smrj ACPI_HANDLE StartHandle); 1383446Smrj #endif 1393446Smrj 1403446Smrj 1413446Smrj #ifndef ACPI_NO_METHOD_EXECUTION 1423446Smrj /******************************************************************************* 1433446Smrj * 1443446Smrj * FUNCTION: AcpiNsLoadTable 1453446Smrj * 146*7851SDana.Myers@Sun.COM * PARAMETERS: TableIndex - Index for table to be loaded 1473446Smrj * Node - Owning NS node 1483446Smrj * 1493446Smrj * RETURN: Status 1503446Smrj * 1513446Smrj * DESCRIPTION: Load one ACPI table into the namespace 1523446Smrj * 1533446Smrj ******************************************************************************/ 1543446Smrj 1553446Smrj ACPI_STATUS 1563446Smrj AcpiNsLoadTable ( 157*7851SDana.Myers@Sun.COM UINT32 TableIndex, 1583446Smrj ACPI_NAMESPACE_NODE *Node) 1593446Smrj { 1603446Smrj ACPI_STATUS Status; 1613446Smrj 1623446Smrj 1633446Smrj ACPI_FUNCTION_TRACE (NsLoadTable); 1643446Smrj 1653446Smrj 1663446Smrj /* 1673446Smrj * Parse the table and load the namespace with all named 1683446Smrj * objects found within. Control methods are NOT parsed 1693446Smrj * at this time. In fact, the control methods cannot be 1703446Smrj * parsed until the entire namespace is loaded, because 1713446Smrj * if a control method makes a forward reference (call) 1723446Smrj * to another control method, we can't continue parsing 1733446Smrj * because we don't know how many arguments to parse next! 1743446Smrj */ 1753446Smrj Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE); 1763446Smrj if (ACPI_FAILURE (Status)) 1773446Smrj { 1783446Smrj return_ACPI_STATUS (Status); 1793446Smrj } 1803446Smrj 181*7851SDana.Myers@Sun.COM /* If table already loaded into namespace, just return */ 182*7851SDana.Myers@Sun.COM 183*7851SDana.Myers@Sun.COM if (AcpiTbIsTableLoaded (TableIndex)) 184*7851SDana.Myers@Sun.COM { 185*7851SDana.Myers@Sun.COM Status = AE_ALREADY_EXISTS; 186*7851SDana.Myers@Sun.COM goto Unlock; 187*7851SDana.Myers@Sun.COM } 188*7851SDana.Myers@Sun.COM 189*7851SDana.Myers@Sun.COM ACPI_DEBUG_PRINT ((ACPI_DB_INFO, 190*7851SDana.Myers@Sun.COM "**** Loading table into namespace ****\n")); 191*7851SDana.Myers@Sun.COM 192*7851SDana.Myers@Sun.COM Status = AcpiTbAllocateOwnerId (TableIndex); 193*7851SDana.Myers@Sun.COM if (ACPI_FAILURE (Status)) 194*7851SDana.Myers@Sun.COM { 195*7851SDana.Myers@Sun.COM goto Unlock; 196*7851SDana.Myers@Sun.COM } 197*7851SDana.Myers@Sun.COM 198*7851SDana.Myers@Sun.COM Status = AcpiNsParseTable (TableIndex, Node); 199*7851SDana.Myers@Sun.COM if (ACPI_SUCCESS (Status)) 200*7851SDana.Myers@Sun.COM { 201*7851SDana.Myers@Sun.COM AcpiTbSetTableLoadedFlag (TableIndex, TRUE); 202*7851SDana.Myers@Sun.COM } 203*7851SDana.Myers@Sun.COM else 204*7851SDana.Myers@Sun.COM { 205*7851SDana.Myers@Sun.COM (void) AcpiTbReleaseOwnerId (TableIndex); 206*7851SDana.Myers@Sun.COM } 207*7851SDana.Myers@Sun.COM 208*7851SDana.Myers@Sun.COM Unlock: 2093446Smrj (void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE); 2103446Smrj 2113446Smrj if (ACPI_FAILURE (Status)) 2123446Smrj { 2133446Smrj return_ACPI_STATUS (Status); 2143446Smrj } 2153446Smrj 2163446Smrj /* 2173446Smrj * Now we can parse the control methods. We always parse 2183446Smrj * them here for a sanity check, and if configured for 2193446Smrj * just-in-time parsing, we delete the control method 2203446Smrj * parse trees. 2213446Smrj */ 2223446Smrj ACPI_DEBUG_PRINT ((ACPI_DB_INFO, 2233446Smrj "**** Begin Table Method Parsing and Object Initialization ****\n")); 2243446Smrj 225*7851SDana.Myers@Sun.COM Status = AcpiDsInitializeObjects (TableIndex, Node); 2263446Smrj 2273446Smrj ACPI_DEBUG_PRINT ((ACPI_DB_INFO, 2283446Smrj "**** Completed Table Method Parsing and Object Initialization ****\n")); 2293446Smrj 2303446Smrj return_ACPI_STATUS (Status); 2313446Smrj } 2323446Smrj 2333446Smrj 234*7851SDana.Myers@Sun.COM #ifdef ACPI_OBSOLETE_FUNCTIONS 2353446Smrj /******************************************************************************* 2363446Smrj * 2373446Smrj * FUNCTION: AcpiLoadNamespace 2383446Smrj * 2393446Smrj * PARAMETERS: None 2403446Smrj * 2413446Smrj * RETURN: Status 2423446Smrj * 2433446Smrj * DESCRIPTION: Load the name space from what ever is pointed to by DSDT. 2443446Smrj * (DSDT points to either the BIOS or a buffer.) 2453446Smrj * 2463446Smrj ******************************************************************************/ 2473446Smrj 2483446Smrj ACPI_STATUS 2493446Smrj AcpiNsLoadNamespace ( 2503446Smrj void) 2513446Smrj { 2523446Smrj ACPI_STATUS Status; 2533446Smrj 2543446Smrj 2553446Smrj ACPI_FUNCTION_TRACE (AcpiLoadNameSpace); 2563446Smrj 2573446Smrj 2583446Smrj /* There must be at least a DSDT installed */ 2593446Smrj 2603446Smrj if (AcpiGbl_DSDT == NULL) 2613446Smrj { 2623446Smrj ACPI_ERROR ((AE_INFO, "DSDT is not in memory")); 2633446Smrj return_ACPI_STATUS (AE_NO_ACPI_TABLES); 2643446Smrj } 2653446Smrj 2663446Smrj /* 2673446Smrj * Load the namespace. The DSDT is required, 2683446Smrj * but the SSDT and PSDT tables are optional. 2693446Smrj */ 2703446Smrj Status = AcpiNsLoadTableByType (ACPI_TABLE_ID_DSDT); 2713446Smrj if (ACPI_FAILURE (Status)) 2723446Smrj { 2733446Smrj return_ACPI_STATUS (Status); 2743446Smrj } 2753446Smrj 2763446Smrj /* Ignore exceptions from these */ 2773446Smrj 2783446Smrj (void) AcpiNsLoadTableByType (ACPI_TABLE_ID_SSDT); 2793446Smrj (void) AcpiNsLoadTableByType (ACPI_TABLE_ID_PSDT); 2803446Smrj 2813446Smrj ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INIT, 2823446Smrj "ACPI Namespace successfully loaded at root %p\n", 2833446Smrj AcpiGbl_RootNode)); 2843446Smrj 2853446Smrj return_ACPI_STATUS (Status); 2863446Smrj } 287*7851SDana.Myers@Sun.COM #endif 2883446Smrj 2893446Smrj #ifdef ACPI_FUTURE_IMPLEMENTATION 2903446Smrj /******************************************************************************* 2913446Smrj * 2923446Smrj * FUNCTION: AcpiNsDeleteSubtree 2933446Smrj * 2943446Smrj * PARAMETERS: StartHandle - Handle in namespace where search begins 2953446Smrj * 2963446Smrj * RETURNS Status 2973446Smrj * 2983446Smrj * DESCRIPTION: Walks the namespace starting at the given handle and deletes 2993446Smrj * all objects, entries, and scopes in the entire subtree. 3003446Smrj * 3013446Smrj * Namespace/Interpreter should be locked or the subsystem should 3023446Smrj * be in shutdown before this routine is called. 3033446Smrj * 3043446Smrj ******************************************************************************/ 3053446Smrj 3063446Smrj static ACPI_STATUS 3073446Smrj AcpiNsDeleteSubtree ( 3083446Smrj ACPI_HANDLE StartHandle) 3093446Smrj { 3103446Smrj ACPI_STATUS Status; 3113446Smrj ACPI_HANDLE ChildHandle; 3123446Smrj ACPI_HANDLE ParentHandle; 3133446Smrj ACPI_HANDLE NextChildHandle; 3143446Smrj ACPI_HANDLE Dummy; 3153446Smrj UINT32 Level; 3163446Smrj 3173446Smrj 3183446Smrj ACPI_FUNCTION_TRACE (NsDeleteSubtree); 3193446Smrj 3203446Smrj 3213446Smrj ParentHandle = StartHandle; 3223446Smrj ChildHandle = NULL; 3233446Smrj Level = 1; 3243446Smrj 3253446Smrj /* 3263446Smrj * Traverse the tree of objects until we bubble back up 3273446Smrj * to where we started. 3283446Smrj */ 3293446Smrj while (Level > 0) 3303446Smrj { 3313446Smrj /* Attempt to get the next object in this scope */ 3323446Smrj 3333446Smrj Status = AcpiGetNextObject (ACPI_TYPE_ANY, ParentHandle, 3343446Smrj ChildHandle, &NextChildHandle); 3353446Smrj 3363446Smrj ChildHandle = NextChildHandle; 3373446Smrj 3383446Smrj /* Did we get a new object? */ 3393446Smrj 3403446Smrj if (ACPI_SUCCESS (Status)) 3413446Smrj { 3423446Smrj /* Check if this object has any children */ 3433446Smrj 3443446Smrj if (ACPI_SUCCESS (AcpiGetNextObject (ACPI_TYPE_ANY, ChildHandle, 3453446Smrj NULL, &Dummy))) 3463446Smrj { 3473446Smrj /* 3483446Smrj * There is at least one child of this object, 3493446Smrj * visit the object 3503446Smrj */ 3513446Smrj Level++; 3523446Smrj ParentHandle = ChildHandle; 3533446Smrj ChildHandle = NULL; 3543446Smrj } 3553446Smrj } 3563446Smrj else 3573446Smrj { 3583446Smrj /* 3593446Smrj * No more children in this object, go back up to 3603446Smrj * the object's parent 3613446Smrj */ 3623446Smrj Level--; 3633446Smrj 3643446Smrj /* Delete all children now */ 3653446Smrj 3663446Smrj AcpiNsDeleteChildren (ChildHandle); 3673446Smrj 3683446Smrj ChildHandle = ParentHandle; 3693446Smrj Status = AcpiGetParent (ParentHandle, &ParentHandle); 3703446Smrj if (ACPI_FAILURE (Status)) 3713446Smrj { 3723446Smrj return_ACPI_STATUS (Status); 3733446Smrj } 3743446Smrj } 3753446Smrj } 3763446Smrj 3773446Smrj /* Now delete the starting object, and we are done */ 3783446Smrj 3793446Smrj AcpiNsDeleteNode (ChildHandle); 3803446Smrj 3813446Smrj return_ACPI_STATUS (AE_OK); 3823446Smrj } 3833446Smrj 3843446Smrj 3853446Smrj /******************************************************************************* 3863446Smrj * 3873446Smrj * FUNCTION: AcpiNsUnloadNameSpace 3883446Smrj * 3893446Smrj * PARAMETERS: Handle - Root of namespace subtree to be deleted 3903446Smrj * 3913446Smrj * RETURN: Status 3923446Smrj * 3933446Smrj * DESCRIPTION: Shrinks the namespace, typically in response to an undocking 3943446Smrj * event. Deletes an entire subtree starting from (and 3953446Smrj * including) the given handle. 3963446Smrj * 3973446Smrj ******************************************************************************/ 3983446Smrj 3993446Smrj ACPI_STATUS 4003446Smrj AcpiNsUnloadNamespace ( 4013446Smrj ACPI_HANDLE Handle) 4023446Smrj { 4033446Smrj ACPI_STATUS Status; 4043446Smrj 4053446Smrj 4063446Smrj ACPI_FUNCTION_TRACE (NsUnloadNameSpace); 4073446Smrj 4083446Smrj 4093446Smrj /* Parameter validation */ 4103446Smrj 4113446Smrj if (!AcpiGbl_RootNode) 4123446Smrj { 4133446Smrj return_ACPI_STATUS (AE_NO_NAMESPACE); 4143446Smrj } 4153446Smrj 4163446Smrj if (!Handle) 4173446Smrj { 4183446Smrj return_ACPI_STATUS (AE_BAD_PARAMETER); 4193446Smrj } 4203446Smrj 4213446Smrj /* This function does the real work */ 4223446Smrj 4233446Smrj Status = AcpiNsDeleteSubtree (Handle); 4243446Smrj 4253446Smrj return_ACPI_STATUS (Status); 4263446Smrj } 4273446Smrj #endif 4283446Smrj #endif 4293446Smrj 430