17c478bd9Sstevel@tonic-gate /*******************************************************************************
27c478bd9Sstevel@tonic-gate *
37c478bd9Sstevel@tonic-gate * Module Name: nsalloc - Namespace allocation and deletion utilities
47c478bd9Sstevel@tonic-gate *
57c478bd9Sstevel@tonic-gate ******************************************************************************/
67c478bd9Sstevel@tonic-gate
7*35786f68SRobert Mustacchi /******************************************************************************
8*35786f68SRobert Mustacchi *
9*35786f68SRobert Mustacchi * 1. Copyright Notice
10*35786f68SRobert Mustacchi *
11*35786f68SRobert Mustacchi * Some or all of this work - Copyright (c) 1999 - 2018, Intel Corp.
127c478bd9Sstevel@tonic-gate * All rights reserved.
137c478bd9Sstevel@tonic-gate *
14*35786f68SRobert Mustacchi * 2. License
15*35786f68SRobert Mustacchi *
16*35786f68SRobert Mustacchi * 2.1. This is your license from Intel Corp. under its intellectual property
17*35786f68SRobert Mustacchi * rights. You may have additional license terms from the party that provided
18*35786f68SRobert Mustacchi * you this software, covering your right to use that party's intellectual
19*35786f68SRobert Mustacchi * property rights.
20*35786f68SRobert Mustacchi *
21*35786f68SRobert Mustacchi * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
22*35786f68SRobert Mustacchi * copy of the source code appearing in this file ("Covered Code") an
23*35786f68SRobert Mustacchi * irrevocable, perpetual, worldwide license under Intel's copyrights in the
24*35786f68SRobert Mustacchi * base code distributed originally by Intel ("Original Intel Code") to copy,
25*35786f68SRobert Mustacchi * make derivatives, distribute, use and display any portion of the Covered
26*35786f68SRobert Mustacchi * Code in any form, with the right to sublicense such rights; and
27*35786f68SRobert Mustacchi *
28*35786f68SRobert Mustacchi * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
29*35786f68SRobert Mustacchi * license (with the right to sublicense), under only those claims of Intel
30*35786f68SRobert Mustacchi * patents that are infringed by the Original Intel Code, to make, use, sell,
31*35786f68SRobert Mustacchi * offer to sell, and import the Covered Code and derivative works thereof
32*35786f68SRobert Mustacchi * solely to the minimum extent necessary to exercise the above copyright
33*35786f68SRobert Mustacchi * license, and in no event shall the patent license extend to any additions
34*35786f68SRobert Mustacchi * to or modifications of the Original Intel Code. No other license or right
35*35786f68SRobert Mustacchi * is granted directly or by implication, estoppel or otherwise;
36*35786f68SRobert Mustacchi *
37*35786f68SRobert Mustacchi * The above copyright and patent license is granted only if the following
38*35786f68SRobert Mustacchi * conditions are met:
39*35786f68SRobert Mustacchi *
40*35786f68SRobert Mustacchi * 3. Conditions
41*35786f68SRobert Mustacchi *
42*35786f68SRobert Mustacchi * 3.1. Redistribution of Source with Rights to Further Distribute Source.
43*35786f68SRobert Mustacchi * Redistribution of source code of any substantial portion of the Covered
44*35786f68SRobert Mustacchi * Code or modification with rights to further distribute source must include
45*35786f68SRobert Mustacchi * the above Copyright Notice, the above License, this list of Conditions,
46*35786f68SRobert Mustacchi * and the following Disclaimer and Export Compliance provision. In addition,
47*35786f68SRobert Mustacchi * Licensee must cause all Covered Code to which Licensee contributes to
48*35786f68SRobert Mustacchi * contain a file documenting the changes Licensee made to create that Covered
49*35786f68SRobert Mustacchi * Code and the date of any change. Licensee must include in that file the
50*35786f68SRobert Mustacchi * documentation of any changes made by any predecessor Licensee. Licensee
51*35786f68SRobert Mustacchi * must include a prominent statement that the modification is derived,
52*35786f68SRobert Mustacchi * directly or indirectly, from Original Intel Code.
53*35786f68SRobert Mustacchi *
54*35786f68SRobert Mustacchi * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
55*35786f68SRobert Mustacchi * Redistribution of source code of any substantial portion of the Covered
56*35786f68SRobert Mustacchi * Code or modification without rights to further distribute source must
57*35786f68SRobert Mustacchi * include the following Disclaimer and Export Compliance provision in the
58*35786f68SRobert Mustacchi * documentation and/or other materials provided with distribution. In
59*35786f68SRobert Mustacchi * addition, Licensee may not authorize further sublicense of source of any
60*35786f68SRobert Mustacchi * portion of the Covered Code, and must include terms to the effect that the
61*35786f68SRobert Mustacchi * license from Licensee to its licensee is limited to the intellectual
62*35786f68SRobert Mustacchi * property embodied in the software Licensee provides to its licensee, and
63*35786f68SRobert Mustacchi * not to intellectual property embodied in modifications its licensee may
64*35786f68SRobert Mustacchi * make.
65*35786f68SRobert Mustacchi *
66*35786f68SRobert Mustacchi * 3.3. Redistribution of Executable. Redistribution in executable form of any
67*35786f68SRobert Mustacchi * substantial portion of the Covered Code or modification must reproduce the
68*35786f68SRobert Mustacchi * above Copyright Notice, and the following Disclaimer and Export Compliance
69*35786f68SRobert Mustacchi * provision in the documentation and/or other materials provided with the
70*35786f68SRobert Mustacchi * distribution.
71*35786f68SRobert Mustacchi *
72*35786f68SRobert Mustacchi * 3.4. Intel retains all right, title, and interest in and to the Original
73*35786f68SRobert Mustacchi * Intel Code.
74*35786f68SRobert Mustacchi *
75*35786f68SRobert Mustacchi * 3.5. Neither the name Intel nor any other trademark owned or controlled by
76*35786f68SRobert Mustacchi * Intel shall be used in advertising or otherwise to promote the sale, use or
77*35786f68SRobert Mustacchi * other dealings in products derived from or relating to the Covered Code
78*35786f68SRobert Mustacchi * without prior written authorization from Intel.
79*35786f68SRobert Mustacchi *
80*35786f68SRobert Mustacchi * 4. Disclaimer and Export Compliance
81*35786f68SRobert Mustacchi *
82*35786f68SRobert Mustacchi * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
83*35786f68SRobert Mustacchi * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
84*35786f68SRobert Mustacchi * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
85*35786f68SRobert Mustacchi * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
86*35786f68SRobert Mustacchi * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
87*35786f68SRobert Mustacchi * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
88*35786f68SRobert Mustacchi * PARTICULAR PURPOSE.
89*35786f68SRobert Mustacchi *
90*35786f68SRobert Mustacchi * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
91*35786f68SRobert Mustacchi * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
92*35786f68SRobert Mustacchi * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
93*35786f68SRobert Mustacchi * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
94*35786f68SRobert Mustacchi * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
95*35786f68SRobert Mustacchi * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
96*35786f68SRobert Mustacchi * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
97*35786f68SRobert Mustacchi * LIMITED REMEDY.
98*35786f68SRobert Mustacchi *
99*35786f68SRobert Mustacchi * 4.3. Licensee shall not export, either directly or indirectly, any of this
100*35786f68SRobert Mustacchi * software or system incorporating such software without first obtaining any
101*35786f68SRobert Mustacchi * required license or other approval from the U. S. Department of Commerce or
102*35786f68SRobert Mustacchi * any other agency or department of the United States Government. In the
103*35786f68SRobert Mustacchi * event Licensee exports any such software from the United States or
104*35786f68SRobert Mustacchi * re-exports any such software from a foreign destination, Licensee shall
105*35786f68SRobert Mustacchi * ensure that the distribution and export/re-export of the software is in
106*35786f68SRobert Mustacchi * compliance with all laws, regulations, orders, or other restrictions of the
107*35786f68SRobert Mustacchi * U.S. Export Administration Regulations. Licensee agrees that neither it nor
108*35786f68SRobert Mustacchi * any of its subsidiaries will export/re-export any technical data, process,
109*35786f68SRobert Mustacchi * software, or service, directly or indirectly, to any country for which the
110*35786f68SRobert Mustacchi * United States government or any agency thereof requires an export license,
111*35786f68SRobert Mustacchi * other governmental approval, or letter of assurance, without first obtaining
112*35786f68SRobert Mustacchi * such license, approval or letter.
113*35786f68SRobert Mustacchi *
114*35786f68SRobert Mustacchi *****************************************************************************
115*35786f68SRobert Mustacchi *
116*35786f68SRobert Mustacchi * Alternatively, you may choose to be licensed under the terms of the
117*35786f68SRobert Mustacchi * following license:
118*35786f68SRobert Mustacchi *
11926f3cdf0SGordon Ross * Redistribution and use in source and binary forms, with or without
12026f3cdf0SGordon Ross * modification, are permitted provided that the following conditions
12126f3cdf0SGordon Ross * are met:
12226f3cdf0SGordon Ross * 1. Redistributions of source code must retain the above copyright
12326f3cdf0SGordon Ross * notice, this list of conditions, and the following disclaimer,
12426f3cdf0SGordon Ross * without modification.
12526f3cdf0SGordon Ross * 2. Redistributions in binary form must reproduce at minimum a disclaimer
12626f3cdf0SGordon Ross * substantially similar to the "NO WARRANTY" disclaimer below
12726f3cdf0SGordon Ross * ("Disclaimer") and any redistribution must be conditioned upon
12826f3cdf0SGordon Ross * including a substantially similar Disclaimer requirement for further
12926f3cdf0SGordon Ross * binary redistribution.
13026f3cdf0SGordon Ross * 3. Neither the names of the above-listed copyright holders nor the names
13126f3cdf0SGordon Ross * of any contributors may be used to endorse or promote products derived
13226f3cdf0SGordon Ross * from this software without specific prior written permission.
13326f3cdf0SGordon Ross *
13426f3cdf0SGordon Ross * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
13526f3cdf0SGordon Ross * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
136*35786f68SRobert Mustacchi * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
13726f3cdf0SGordon Ross * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
138*35786f68SRobert Mustacchi * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
139*35786f68SRobert Mustacchi * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
140*35786f68SRobert Mustacchi * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
141*35786f68SRobert Mustacchi * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
142*35786f68SRobert Mustacchi * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
143*35786f68SRobert Mustacchi * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
144*35786f68SRobert Mustacchi * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
145*35786f68SRobert Mustacchi *
146*35786f68SRobert Mustacchi * Alternatively, you may choose to be licensed under the terms of the
147*35786f68SRobert Mustacchi * GNU General Public License ("GPL") version 2 as published by the Free
148*35786f68SRobert Mustacchi * Software Foundation.
149*35786f68SRobert Mustacchi *
150*35786f68SRobert Mustacchi *****************************************************************************/
1517c478bd9Sstevel@tonic-gate
1527c478bd9Sstevel@tonic-gate #include "acpi.h"
153aa2aa9a6SDana Myers #include "accommon.h"
1547c478bd9Sstevel@tonic-gate #include "acnamesp.h"
1557c478bd9Sstevel@tonic-gate
1567c478bd9Sstevel@tonic-gate
1577c478bd9Sstevel@tonic-gate #define _COMPONENT ACPI_NAMESPACE
1587c478bd9Sstevel@tonic-gate ACPI_MODULE_NAME ("nsalloc")
1597c478bd9Sstevel@tonic-gate
1607c478bd9Sstevel@tonic-gate
1617c478bd9Sstevel@tonic-gate /*******************************************************************************
1627c478bd9Sstevel@tonic-gate *
1637c478bd9Sstevel@tonic-gate * FUNCTION: AcpiNsCreateNode
1647c478bd9Sstevel@tonic-gate *
1657c478bd9Sstevel@tonic-gate * PARAMETERS: Name - Name of the new node (4 char ACPI name)
1667c478bd9Sstevel@tonic-gate *
1677c478bd9Sstevel@tonic-gate * RETURN: New namespace node (Null on failure)
1687c478bd9Sstevel@tonic-gate *
1697c478bd9Sstevel@tonic-gate * DESCRIPTION: Create a namespace node
1707c478bd9Sstevel@tonic-gate *
1717c478bd9Sstevel@tonic-gate ******************************************************************************/
1727c478bd9Sstevel@tonic-gate
1737c478bd9Sstevel@tonic-gate ACPI_NAMESPACE_NODE *
AcpiNsCreateNode(UINT32 Name)1747c478bd9Sstevel@tonic-gate AcpiNsCreateNode (
1757c478bd9Sstevel@tonic-gate UINT32 Name)
1767c478bd9Sstevel@tonic-gate {
1777c478bd9Sstevel@tonic-gate ACPI_NAMESPACE_NODE *Node;
178db2bae30SDana Myers #ifdef ACPI_DBG_TRACK_ALLOCATIONS
179db2bae30SDana Myers UINT32 Temp;
180db2bae30SDana Myers #endif
1817c478bd9Sstevel@tonic-gate
1827c478bd9Sstevel@tonic-gate
18327f7c583Smyers ACPI_FUNCTION_TRACE (NsCreateNode);
1847c478bd9Sstevel@tonic-gate
1857c478bd9Sstevel@tonic-gate
18627f7c583Smyers Node = AcpiOsAcquireObject (AcpiGbl_NamespaceCache);
1877c478bd9Sstevel@tonic-gate if (!Node)
1887c478bd9Sstevel@tonic-gate {
1897c478bd9Sstevel@tonic-gate return_PTR (NULL);
1907c478bd9Sstevel@tonic-gate }
1917c478bd9Sstevel@tonic-gate
192450d6964Smyers ACPI_MEM_TRACKING (AcpiGbl_NsNodeList->TotalAllocated++);
1937c478bd9Sstevel@tonic-gate
194db2bae30SDana Myers #ifdef ACPI_DBG_TRACK_ALLOCATIONS
195aa2aa9a6SDana Myers Temp = AcpiGbl_NsNodeList->TotalAllocated -
1967b1019a6SJerry Jelinek AcpiGbl_NsNodeList->TotalFreed;
197db2bae30SDana Myers if (Temp > AcpiGbl_NsNodeList->MaxOccupied)
198db2bae30SDana Myers {
199db2bae30SDana Myers AcpiGbl_NsNodeList->MaxOccupied = Temp;
200db2bae30SDana Myers }
201db2bae30SDana Myers #endif
202db2bae30SDana Myers
20327f7c583Smyers Node->Name.Integer = Name;
2047c478bd9Sstevel@tonic-gate ACPI_SET_DESCRIPTOR_TYPE (Node, ACPI_DESC_TYPE_NAMED);
2057c478bd9Sstevel@tonic-gate return_PTR (Node);
2067c478bd9Sstevel@tonic-gate }
2077c478bd9Sstevel@tonic-gate
2087c478bd9Sstevel@tonic-gate
2097c478bd9Sstevel@tonic-gate /*******************************************************************************
2107c478bd9Sstevel@tonic-gate *
2117c478bd9Sstevel@tonic-gate * FUNCTION: AcpiNsDeleteNode
2127c478bd9Sstevel@tonic-gate *
2137c478bd9Sstevel@tonic-gate * PARAMETERS: Node - Node to be deleted
2147c478bd9Sstevel@tonic-gate *
2157c478bd9Sstevel@tonic-gate * RETURN: None
2167c478bd9Sstevel@tonic-gate *
21757190917SDana Myers * DESCRIPTION: Delete a namespace node. All node deletions must come through
21857190917SDana Myers * here. Detaches any attached objects, including any attached
21957190917SDana Myers * data. If a handler is associated with attached data, it is
22057190917SDana Myers * invoked before the node is deleted.
2217c478bd9Sstevel@tonic-gate *
2227c478bd9Sstevel@tonic-gate ******************************************************************************/
2237c478bd9Sstevel@tonic-gate
2247c478bd9Sstevel@tonic-gate void
AcpiNsDeleteNode(ACPI_NAMESPACE_NODE * Node)2257c478bd9Sstevel@tonic-gate AcpiNsDeleteNode (
2267c478bd9Sstevel@tonic-gate ACPI_NAMESPACE_NODE *Node)
22757190917SDana Myers {
22857190917SDana Myers ACPI_OPERAND_OBJECT *ObjDesc;
2297b1019a6SJerry Jelinek ACPI_OPERAND_OBJECT *NextDesc;
23057190917SDana Myers
23157190917SDana Myers
23257190917SDana Myers ACPI_FUNCTION_NAME (NsDeleteNode);
23357190917SDana Myers
23457190917SDana Myers
23557190917SDana Myers /* Detach an object if there is one */
23657190917SDana Myers
23757190917SDana Myers AcpiNsDetachObject (Node);
23857190917SDana Myers
23957190917SDana Myers /*
2407b1019a6SJerry Jelinek * Delete an attached data object list if present (objects that were
2417b1019a6SJerry Jelinek * attached via AcpiAttachData). Note: After any normal object is
2427b1019a6SJerry Jelinek * detached above, the only possible remaining object(s) are data
2437b1019a6SJerry Jelinek * objects, in a linked list.
24457190917SDana Myers */
24557190917SDana Myers ObjDesc = Node->Object;
2467b1019a6SJerry Jelinek while (ObjDesc &&
24757190917SDana Myers (ObjDesc->Common.Type == ACPI_TYPE_LOCAL_DATA))
24857190917SDana Myers {
24957190917SDana Myers /* Invoke the attached data deletion handler if present */
25057190917SDana Myers
25157190917SDana Myers if (ObjDesc->Data.Handler)
25257190917SDana Myers {
25357190917SDana Myers ObjDesc->Data.Handler (Node, ObjDesc->Data.Pointer);
25457190917SDana Myers }
25557190917SDana Myers
2567b1019a6SJerry Jelinek NextDesc = ObjDesc->Common.NextObject;
25757190917SDana Myers AcpiUtRemoveReference (ObjDesc);
2587b1019a6SJerry Jelinek ObjDesc = NextDesc;
2597b1019a6SJerry Jelinek }
2607b1019a6SJerry Jelinek
2617b1019a6SJerry Jelinek /* Special case for the statically allocated root node */
2627b1019a6SJerry Jelinek
2637b1019a6SJerry Jelinek if (Node == AcpiGbl_RootNode)
2647b1019a6SJerry Jelinek {
2657b1019a6SJerry Jelinek return;
26657190917SDana Myers }
26757190917SDana Myers
26857190917SDana Myers /* Now we can delete the node */
26957190917SDana Myers
27057190917SDana Myers (void) AcpiOsReleaseObject (AcpiGbl_NamespaceCache, Node);
27157190917SDana Myers
27257190917SDana Myers ACPI_MEM_TRACKING (AcpiGbl_NsNodeList->TotalFreed++);
27357190917SDana Myers ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS, "Node %p, Remaining %X\n",
27457190917SDana Myers Node, AcpiGbl_CurrentNodeCount));
27557190917SDana Myers }
27657190917SDana Myers
27757190917SDana Myers
27857190917SDana Myers /*******************************************************************************
27957190917SDana Myers *
28057190917SDana Myers * FUNCTION: AcpiNsRemoveNode
28157190917SDana Myers *
28257190917SDana Myers * PARAMETERS: Node - Node to be removed/deleted
28357190917SDana Myers *
28457190917SDana Myers * RETURN: None
28557190917SDana Myers *
28657190917SDana Myers * DESCRIPTION: Remove (unlink) and delete a namespace node
28757190917SDana Myers *
28857190917SDana Myers ******************************************************************************/
28957190917SDana Myers
29057190917SDana Myers void
AcpiNsRemoveNode(ACPI_NAMESPACE_NODE * Node)29157190917SDana Myers AcpiNsRemoveNode (
29257190917SDana Myers ACPI_NAMESPACE_NODE *Node)
2937c478bd9Sstevel@tonic-gate {
2947c478bd9Sstevel@tonic-gate ACPI_NAMESPACE_NODE *ParentNode;
2957c478bd9Sstevel@tonic-gate ACPI_NAMESPACE_NODE *PrevNode;
2967c478bd9Sstevel@tonic-gate ACPI_NAMESPACE_NODE *NextNode;
2977c478bd9Sstevel@tonic-gate
2987c478bd9Sstevel@tonic-gate
29957190917SDana Myers ACPI_FUNCTION_TRACE_PTR (NsRemoveNode, Node);
3007c478bd9Sstevel@tonic-gate
3017c478bd9Sstevel@tonic-gate
30226f3cdf0SGordon Ross ParentNode = Node->Parent;
3037c478bd9Sstevel@tonic-gate
3047c478bd9Sstevel@tonic-gate PrevNode = NULL;
3057c478bd9Sstevel@tonic-gate NextNode = ParentNode->Child;
3067c478bd9Sstevel@tonic-gate
3077c478bd9Sstevel@tonic-gate /* Find the node that is the previous peer in the parent's child list */
3087c478bd9Sstevel@tonic-gate
3097c478bd9Sstevel@tonic-gate while (NextNode != Node)
3107c478bd9Sstevel@tonic-gate {
3117c478bd9Sstevel@tonic-gate PrevNode = NextNode;
31226f3cdf0SGordon Ross NextNode = NextNode->Peer;
3137c478bd9Sstevel@tonic-gate }
3147c478bd9Sstevel@tonic-gate
3157c478bd9Sstevel@tonic-gate if (PrevNode)
3167c478bd9Sstevel@tonic-gate {
3177c478bd9Sstevel@tonic-gate /* Node is not first child, unlink it */
3187c478bd9Sstevel@tonic-gate
31926f3cdf0SGordon Ross PrevNode->Peer = Node->Peer;
3207c478bd9Sstevel@tonic-gate }
3217c478bd9Sstevel@tonic-gate else
3227c478bd9Sstevel@tonic-gate {
32326f3cdf0SGordon Ross /*
32426f3cdf0SGordon Ross * Node is first child (has no previous peer).
32526f3cdf0SGordon Ross * Link peer list to parent
32626f3cdf0SGordon Ross */
32726f3cdf0SGordon Ross ParentNode->Child = Node->Peer;
3287c478bd9Sstevel@tonic-gate }
3297c478bd9Sstevel@tonic-gate
33057190917SDana Myers /* Delete the node and any attached objects */
331aa2aa9a6SDana Myers
33257190917SDana Myers AcpiNsDeleteNode (Node);
3337c478bd9Sstevel@tonic-gate return_VOID;
3347c478bd9Sstevel@tonic-gate }
3357c478bd9Sstevel@tonic-gate
3367c478bd9Sstevel@tonic-gate
3377c478bd9Sstevel@tonic-gate /*******************************************************************************
3387c478bd9Sstevel@tonic-gate *
3397c478bd9Sstevel@tonic-gate * FUNCTION: AcpiNsInstallNode
3407c478bd9Sstevel@tonic-gate *
3417c478bd9Sstevel@tonic-gate * PARAMETERS: WalkState - Current state of the walk
3427c478bd9Sstevel@tonic-gate * ParentNode - The parent of the new Node
3437c478bd9Sstevel@tonic-gate * Node - The new Node to install
3447c478bd9Sstevel@tonic-gate * Type - ACPI object type of the new Node
3457c478bd9Sstevel@tonic-gate *
3467c478bd9Sstevel@tonic-gate * RETURN: None
3477c478bd9Sstevel@tonic-gate *
3487c478bd9Sstevel@tonic-gate * DESCRIPTION: Initialize a new namespace node and install it amongst
3497c478bd9Sstevel@tonic-gate * its peers.
3507c478bd9Sstevel@tonic-gate *
351186507a7Smyers * Note: Current namespace lookup is linear search. This appears
352186507a7Smyers * to be sufficient as namespace searches consume only a small
353186507a7Smyers * fraction of the execution time of the ACPI subsystem.
3547c478bd9Sstevel@tonic-gate *
3557c478bd9Sstevel@tonic-gate ******************************************************************************/
3567c478bd9Sstevel@tonic-gate
3577c478bd9Sstevel@tonic-gate void
AcpiNsInstallNode(ACPI_WALK_STATE * WalkState,ACPI_NAMESPACE_NODE * ParentNode,ACPI_NAMESPACE_NODE * Node,ACPI_OBJECT_TYPE Type)3587c478bd9Sstevel@tonic-gate AcpiNsInstallNode (
3597c478bd9Sstevel@tonic-gate ACPI_WALK_STATE *WalkState,
3607c478bd9Sstevel@tonic-gate ACPI_NAMESPACE_NODE *ParentNode, /* Parent */
3617c478bd9Sstevel@tonic-gate ACPI_NAMESPACE_NODE *Node, /* New Child*/
3627c478bd9Sstevel@tonic-gate ACPI_OBJECT_TYPE Type)
3637c478bd9Sstevel@tonic-gate {
364450d6964Smyers ACPI_OWNER_ID OwnerId = 0;
3657c478bd9Sstevel@tonic-gate ACPI_NAMESPACE_NODE *ChildNode;
3667c478bd9Sstevel@tonic-gate
3677c478bd9Sstevel@tonic-gate
36827f7c583Smyers ACPI_FUNCTION_TRACE (NsInstallNode);
3697c478bd9Sstevel@tonic-gate
3707c478bd9Sstevel@tonic-gate
3717c478bd9Sstevel@tonic-gate if (WalkState)
3727c478bd9Sstevel@tonic-gate {
37326f3cdf0SGordon Ross /*
37426f3cdf0SGordon Ross * Get the owner ID from the Walk state. The owner ID is used to
37526f3cdf0SGordon Ross * track table deletion and deletion of objects created by methods.
37626f3cdf0SGordon Ross */
3777c478bd9Sstevel@tonic-gate OwnerId = WalkState->OwnerId;
37826f3cdf0SGordon Ross
37926f3cdf0SGordon Ross if ((WalkState->MethodDesc) &&
38026f3cdf0SGordon Ross (ParentNode != WalkState->MethodNode))
38126f3cdf0SGordon Ross {
38226f3cdf0SGordon Ross /*
38326f3cdf0SGordon Ross * A method is creating a new node that is not a child of the
38426f3cdf0SGordon Ross * method (it is non-local). Mark the executing method as having
38526f3cdf0SGordon Ross * modified the namespace. This is used for cleanup when the
38626f3cdf0SGordon Ross * method exits.
38726f3cdf0SGordon Ross */
3887b1019a6SJerry Jelinek WalkState->MethodDesc->Method.InfoFlags |=
3897b1019a6SJerry Jelinek ACPI_METHOD_MODIFIED_NAMESPACE;
39026f3cdf0SGordon Ross }
3917c478bd9Sstevel@tonic-gate }
3927c478bd9Sstevel@tonic-gate
3937c478bd9Sstevel@tonic-gate /* Link the new entry into the parent and existing children */
3947c478bd9Sstevel@tonic-gate
39526f3cdf0SGordon Ross Node->Peer = NULL;
39626f3cdf0SGordon Ross Node->Parent = ParentNode;
3977c478bd9Sstevel@tonic-gate ChildNode = ParentNode->Child;
39826f3cdf0SGordon Ross
3997c478bd9Sstevel@tonic-gate if (!ChildNode)
4007c478bd9Sstevel@tonic-gate {
4017c478bd9Sstevel@tonic-gate ParentNode->Child = Node;
4027c478bd9Sstevel@tonic-gate }
4037c478bd9Sstevel@tonic-gate else
4047c478bd9Sstevel@tonic-gate {
40526f3cdf0SGordon Ross /* Add node to the end of the peer list */
40626f3cdf0SGordon Ross
40726f3cdf0SGordon Ross while (ChildNode->Peer)
4087c478bd9Sstevel@tonic-gate {
4097c478bd9Sstevel@tonic-gate ChildNode = ChildNode->Peer;
4107c478bd9Sstevel@tonic-gate }
4117c478bd9Sstevel@tonic-gate
4127c478bd9Sstevel@tonic-gate ChildNode->Peer = Node;
4137c478bd9Sstevel@tonic-gate }
4147c478bd9Sstevel@tonic-gate
4157c478bd9Sstevel@tonic-gate /* Init the new entry */
4167c478bd9Sstevel@tonic-gate
4177c478bd9Sstevel@tonic-gate Node->OwnerId = OwnerId;
4187c478bd9Sstevel@tonic-gate Node->Type = (UINT8) Type;
4197c478bd9Sstevel@tonic-gate
4207c478bd9Sstevel@tonic-gate ACPI_DEBUG_PRINT ((ACPI_DB_NAMES,
4217c478bd9Sstevel@tonic-gate "%4.4s (%s) [Node %p Owner %X] added to %4.4s (%s) [Node %p]\n",
4227c478bd9Sstevel@tonic-gate AcpiUtGetNodeName (Node), AcpiUtGetTypeName (Node->Type), Node, OwnerId,
4237c478bd9Sstevel@tonic-gate AcpiUtGetNodeName (ParentNode), AcpiUtGetTypeName (ParentNode->Type),
4247c478bd9Sstevel@tonic-gate ParentNode));
4257c478bd9Sstevel@tonic-gate
4267c478bd9Sstevel@tonic-gate return_VOID;
4277c478bd9Sstevel@tonic-gate }
4287c478bd9Sstevel@tonic-gate
4297c478bd9Sstevel@tonic-gate
4307c478bd9Sstevel@tonic-gate /*******************************************************************************
4317c478bd9Sstevel@tonic-gate *
4327c478bd9Sstevel@tonic-gate * FUNCTION: AcpiNsDeleteChildren
4337c478bd9Sstevel@tonic-gate *
4347c478bd9Sstevel@tonic-gate * PARAMETERS: ParentNode - Delete this objects children
4357c478bd9Sstevel@tonic-gate *
4367c478bd9Sstevel@tonic-gate * RETURN: None.
4377c478bd9Sstevel@tonic-gate *
4387c478bd9Sstevel@tonic-gate * DESCRIPTION: Delete all children of the parent object. In other words,
4397c478bd9Sstevel@tonic-gate * deletes a "scope".
4407c478bd9Sstevel@tonic-gate *
4417c478bd9Sstevel@tonic-gate ******************************************************************************/
4427c478bd9Sstevel@tonic-gate
4437c478bd9Sstevel@tonic-gate void
AcpiNsDeleteChildren(ACPI_NAMESPACE_NODE * ParentNode)4447c478bd9Sstevel@tonic-gate AcpiNsDeleteChildren (
4457c478bd9Sstevel@tonic-gate ACPI_NAMESPACE_NODE *ParentNode)
4467c478bd9Sstevel@tonic-gate {
4477c478bd9Sstevel@tonic-gate ACPI_NAMESPACE_NODE *NextNode;
44826f3cdf0SGordon Ross ACPI_NAMESPACE_NODE *NodeToDelete;
4497c478bd9Sstevel@tonic-gate
4507c478bd9Sstevel@tonic-gate
45127f7c583Smyers ACPI_FUNCTION_TRACE_PTR (NsDeleteChildren, ParentNode);
4527c478bd9Sstevel@tonic-gate
4537c478bd9Sstevel@tonic-gate
4547c478bd9Sstevel@tonic-gate if (!ParentNode)
4557c478bd9Sstevel@tonic-gate {
4567c478bd9Sstevel@tonic-gate return_VOID;
4577c478bd9Sstevel@tonic-gate }
4587c478bd9Sstevel@tonic-gate
459aa2aa9a6SDana Myers /* Deallocate all children at this level */
460aa2aa9a6SDana Myers
46126f3cdf0SGordon Ross NextNode = ParentNode->Child;
46226f3cdf0SGordon Ross while (NextNode)
4637c478bd9Sstevel@tonic-gate {
4647c478bd9Sstevel@tonic-gate /* Grandchildren should have all been deleted already */
4657c478bd9Sstevel@tonic-gate
46626f3cdf0SGordon Ross if (NextNode->Child)
4677c478bd9Sstevel@tonic-gate {
46830082d0cSmyers ACPI_ERROR ((AE_INFO, "Found a grandchild! P=%p C=%p",
46926f3cdf0SGordon Ross ParentNode, NextNode));
4707c478bd9Sstevel@tonic-gate }
4717c478bd9Sstevel@tonic-gate
47257190917SDana Myers /*
47357190917SDana Myers * Delete this child node and move on to the next child in the list.
47457190917SDana Myers * No need to unlink the node since we are deleting the entire branch.
47557190917SDana Myers */
47626f3cdf0SGordon Ross NodeToDelete = NextNode;
47726f3cdf0SGordon Ross NextNode = NextNode->Peer;
47826f3cdf0SGordon Ross AcpiNsDeleteNode (NodeToDelete);
47926f3cdf0SGordon Ross };
4807c478bd9Sstevel@tonic-gate
4817c478bd9Sstevel@tonic-gate /* Clear the parent's child pointer */
4827c478bd9Sstevel@tonic-gate
4837c478bd9Sstevel@tonic-gate ParentNode->Child = NULL;
4847c478bd9Sstevel@tonic-gate return_VOID;
4857c478bd9Sstevel@tonic-gate }
4867c478bd9Sstevel@tonic-gate
4877c478bd9Sstevel@tonic-gate
4887c478bd9Sstevel@tonic-gate /*******************************************************************************
4897c478bd9Sstevel@tonic-gate *
4907c478bd9Sstevel@tonic-gate * FUNCTION: AcpiNsDeleteNamespaceSubtree
4917c478bd9Sstevel@tonic-gate *
4927c478bd9Sstevel@tonic-gate * PARAMETERS: ParentNode - Root of the subtree to be deleted
4937c478bd9Sstevel@tonic-gate *
4947c478bd9Sstevel@tonic-gate * RETURN: None.
4957c478bd9Sstevel@tonic-gate *
4967b1019a6SJerry Jelinek * DESCRIPTION: Delete a subtree of the namespace. This includes all objects
4977c478bd9Sstevel@tonic-gate * stored within the subtree.
4987c478bd9Sstevel@tonic-gate *
4997c478bd9Sstevel@tonic-gate ******************************************************************************/
5007c478bd9Sstevel@tonic-gate
5017c478bd9Sstevel@tonic-gate void
AcpiNsDeleteNamespaceSubtree(ACPI_NAMESPACE_NODE * ParentNode)5027c478bd9Sstevel@tonic-gate AcpiNsDeleteNamespaceSubtree (
5037c478bd9Sstevel@tonic-gate ACPI_NAMESPACE_NODE *ParentNode)
5047c478bd9Sstevel@tonic-gate {
5057c478bd9Sstevel@tonic-gate ACPI_NAMESPACE_NODE *ChildNode = NULL;
5067c478bd9Sstevel@tonic-gate UINT32 Level = 1;
50726f3cdf0SGordon Ross ACPI_STATUS Status;
5087c478bd9Sstevel@tonic-gate
5097c478bd9Sstevel@tonic-gate
51027f7c583Smyers ACPI_FUNCTION_TRACE (NsDeleteNamespaceSubtree);
5117c478bd9Sstevel@tonic-gate
5127c478bd9Sstevel@tonic-gate
5137c478bd9Sstevel@tonic-gate if (!ParentNode)
5147c478bd9Sstevel@tonic-gate {
5157c478bd9Sstevel@tonic-gate return_VOID;
5167c478bd9Sstevel@tonic-gate }
5177c478bd9Sstevel@tonic-gate
51826f3cdf0SGordon Ross /* Lock namespace for possible update */
51926f3cdf0SGordon Ross
52026f3cdf0SGordon Ross Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE);
52126f3cdf0SGordon Ross if (ACPI_FAILURE (Status))
52226f3cdf0SGordon Ross {
52326f3cdf0SGordon Ross return_VOID;
52426f3cdf0SGordon Ross }
52526f3cdf0SGordon Ross
5267c478bd9Sstevel@tonic-gate /*
5277c478bd9Sstevel@tonic-gate * Traverse the tree of objects until we bubble back up
5287c478bd9Sstevel@tonic-gate * to where we started.
5297c478bd9Sstevel@tonic-gate */
5307c478bd9Sstevel@tonic-gate while (Level > 0)
5317c478bd9Sstevel@tonic-gate {
5327c478bd9Sstevel@tonic-gate /* Get the next node in this scope (NULL if none) */
5337c478bd9Sstevel@tonic-gate
534aa2aa9a6SDana Myers ChildNode = AcpiNsGetNextNode (ParentNode, ChildNode);
5357c478bd9Sstevel@tonic-gate if (ChildNode)
5367c478bd9Sstevel@tonic-gate {
5377c478bd9Sstevel@tonic-gate /* Found a child node - detach any attached object */
5387c478bd9Sstevel@tonic-gate
5397c478bd9Sstevel@tonic-gate AcpiNsDetachObject (ChildNode);
5407c478bd9Sstevel@tonic-gate
5417c478bd9Sstevel@tonic-gate /* Check if this node has any children */
5427c478bd9Sstevel@tonic-gate
543aa2aa9a6SDana Myers if (ChildNode->Child)
5447c478bd9Sstevel@tonic-gate {
5457c478bd9Sstevel@tonic-gate /*
5467c478bd9Sstevel@tonic-gate * There is at least one child of this node,
5477c478bd9Sstevel@tonic-gate * visit the node
5487c478bd9Sstevel@tonic-gate */
5497c478bd9Sstevel@tonic-gate Level++;
5507c478bd9Sstevel@tonic-gate ParentNode = ChildNode;
5517c478bd9Sstevel@tonic-gate ChildNode = NULL;
5527c478bd9Sstevel@tonic-gate }
5537c478bd9Sstevel@tonic-gate }
5547c478bd9Sstevel@tonic-gate else
5557c478bd9Sstevel@tonic-gate {
5567c478bd9Sstevel@tonic-gate /*
5577c478bd9Sstevel@tonic-gate * No more children of this parent node.
5587c478bd9Sstevel@tonic-gate * Move up to the grandparent.
5597c478bd9Sstevel@tonic-gate */
5607c478bd9Sstevel@tonic-gate Level--;
5617c478bd9Sstevel@tonic-gate
5627c478bd9Sstevel@tonic-gate /*
5637c478bd9Sstevel@tonic-gate * Now delete all of the children of this parent
5647c478bd9Sstevel@tonic-gate * all at the same time.
5657c478bd9Sstevel@tonic-gate */
5667c478bd9Sstevel@tonic-gate AcpiNsDeleteChildren (ParentNode);
5677c478bd9Sstevel@tonic-gate
5687c478bd9Sstevel@tonic-gate /* New "last child" is this parent node */
5697c478bd9Sstevel@tonic-gate
5707c478bd9Sstevel@tonic-gate ChildNode = ParentNode;
5717c478bd9Sstevel@tonic-gate
5727c478bd9Sstevel@tonic-gate /* Move up the tree to the grandparent */
5737c478bd9Sstevel@tonic-gate
57426f3cdf0SGordon Ross ParentNode = ParentNode->Parent;
5757c478bd9Sstevel@tonic-gate }
5767c478bd9Sstevel@tonic-gate }
5777c478bd9Sstevel@tonic-gate
57826f3cdf0SGordon Ross (void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE);
5797c478bd9Sstevel@tonic-gate return_VOID;
5807c478bd9Sstevel@tonic-gate }
5817c478bd9Sstevel@tonic-gate
5827c478bd9Sstevel@tonic-gate
5837c478bd9Sstevel@tonic-gate /*******************************************************************************
5847c478bd9Sstevel@tonic-gate *
5857c478bd9Sstevel@tonic-gate * FUNCTION: AcpiNsDeleteNamespaceByOwner
5867c478bd9Sstevel@tonic-gate *
5877c478bd9Sstevel@tonic-gate * PARAMETERS: OwnerId - All nodes with this owner will be deleted
5887c478bd9Sstevel@tonic-gate *
5897c478bd9Sstevel@tonic-gate * RETURN: Status
5907c478bd9Sstevel@tonic-gate *
5917c478bd9Sstevel@tonic-gate * DESCRIPTION: Delete entries within the namespace that are owned by a
5927b1019a6SJerry Jelinek * specific ID. Used to delete entire ACPI tables. All
5937c478bd9Sstevel@tonic-gate * reference counts are updated.
5947c478bd9Sstevel@tonic-gate *
59527f7c583Smyers * MUTEX: Locks namespace during deletion walk.
59627f7c583Smyers *
5977c478bd9Sstevel@tonic-gate ******************************************************************************/
5987c478bd9Sstevel@tonic-gate
5997c478bd9Sstevel@tonic-gate void
AcpiNsDeleteNamespaceByOwner(ACPI_OWNER_ID OwnerId)6007c478bd9Sstevel@tonic-gate AcpiNsDeleteNamespaceByOwner (
601450d6964Smyers ACPI_OWNER_ID OwnerId)
6027c478bd9Sstevel@tonic-gate {
6037c478bd9Sstevel@tonic-gate ACPI_NAMESPACE_NODE *ChildNode;
6047c478bd9Sstevel@tonic-gate ACPI_NAMESPACE_NODE *DeletionNode;
6057c478bd9Sstevel@tonic-gate ACPI_NAMESPACE_NODE *ParentNode;
60627f7c583Smyers UINT32 Level;
60727f7c583Smyers ACPI_STATUS Status;
6087c478bd9Sstevel@tonic-gate
6097c478bd9Sstevel@tonic-gate
61027f7c583Smyers ACPI_FUNCTION_TRACE_U32 (NsDeleteNamespaceByOwner, OwnerId);
6117c478bd9Sstevel@tonic-gate
6127c478bd9Sstevel@tonic-gate
613186507a7Smyers if (OwnerId == 0)
614186507a7Smyers {
615186507a7Smyers return_VOID;
616186507a7Smyers }
617186507a7Smyers
61827f7c583Smyers /* Lock namespace for possible update */
61927f7c583Smyers
62027f7c583Smyers Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE);
62127f7c583Smyers if (ACPI_FAILURE (Status))
62227f7c583Smyers {
62327f7c583Smyers return_VOID;
62427f7c583Smyers }
62527f7c583Smyers
62627f7c583Smyers DeletionNode = NULL;
62727f7c583Smyers ParentNode = AcpiGbl_RootNode;
62827f7c583Smyers ChildNode = NULL;
62927f7c583Smyers Level = 1;
6307c478bd9Sstevel@tonic-gate
6317c478bd9Sstevel@tonic-gate /*
6327c478bd9Sstevel@tonic-gate * Traverse the tree of nodes until we bubble back up
6337c478bd9Sstevel@tonic-gate * to where we started.
6347c478bd9Sstevel@tonic-gate */
6357c478bd9Sstevel@tonic-gate while (Level > 0)
6367c478bd9Sstevel@tonic-gate {
6377c478bd9Sstevel@tonic-gate /*
6387c478bd9Sstevel@tonic-gate * Get the next child of this parent node. When ChildNode is NULL,
6397c478bd9Sstevel@tonic-gate * the first child of the parent is returned
6407c478bd9Sstevel@tonic-gate */
641aa2aa9a6SDana Myers ChildNode = AcpiNsGetNextNode (ParentNode, ChildNode);
6427c478bd9Sstevel@tonic-gate
6437c478bd9Sstevel@tonic-gate if (DeletionNode)
6447c478bd9Sstevel@tonic-gate {
64527f7c583Smyers AcpiNsDeleteChildren (DeletionNode);
64657190917SDana Myers AcpiNsRemoveNode (DeletionNode);
6477c478bd9Sstevel@tonic-gate DeletionNode = NULL;
6487c478bd9Sstevel@tonic-gate }
6497c478bd9Sstevel@tonic-gate
6507c478bd9Sstevel@tonic-gate if (ChildNode)
6517c478bd9Sstevel@tonic-gate {
6527c478bd9Sstevel@tonic-gate if (ChildNode->OwnerId == OwnerId)
6537c478bd9Sstevel@tonic-gate {
6547c478bd9Sstevel@tonic-gate /* Found a matching child node - detach any attached object */
6557c478bd9Sstevel@tonic-gate
6567c478bd9Sstevel@tonic-gate AcpiNsDetachObject (ChildNode);
6577c478bd9Sstevel@tonic-gate }
6587c478bd9Sstevel@tonic-gate
6597c478bd9Sstevel@tonic-gate /* Check if this node has any children */
6607c478bd9Sstevel@tonic-gate
661aa2aa9a6SDana Myers if (ChildNode->Child)
6627c478bd9Sstevel@tonic-gate {
6637c478bd9Sstevel@tonic-gate /*
6647c478bd9Sstevel@tonic-gate * There is at least one child of this node,
6657c478bd9Sstevel@tonic-gate * visit the node
6667c478bd9Sstevel@tonic-gate */
6677c478bd9Sstevel@tonic-gate Level++;
6687c478bd9Sstevel@tonic-gate ParentNode = ChildNode;
6697c478bd9Sstevel@tonic-gate ChildNode = NULL;
6707c478bd9Sstevel@tonic-gate }
6717c478bd9Sstevel@tonic-gate else if (ChildNode->OwnerId == OwnerId)
6727c478bd9Sstevel@tonic-gate {
6737c478bd9Sstevel@tonic-gate DeletionNode = ChildNode;
6747c478bd9Sstevel@tonic-gate }
6757c478bd9Sstevel@tonic-gate }
6767c478bd9Sstevel@tonic-gate else
6777c478bd9Sstevel@tonic-gate {
6787c478bd9Sstevel@tonic-gate /*
6797c478bd9Sstevel@tonic-gate * No more children of this parent node.
6807c478bd9Sstevel@tonic-gate * Move up to the grandparent.
6817c478bd9Sstevel@tonic-gate */
6827c478bd9Sstevel@tonic-gate Level--;
6837c478bd9Sstevel@tonic-gate if (Level != 0)
6847c478bd9Sstevel@tonic-gate {
6857c478bd9Sstevel@tonic-gate if (ParentNode->OwnerId == OwnerId)
6867c478bd9Sstevel@tonic-gate {
6877c478bd9Sstevel@tonic-gate DeletionNode = ParentNode;
6887c478bd9Sstevel@tonic-gate }
6897c478bd9Sstevel@tonic-gate }
6907c478bd9Sstevel@tonic-gate
6917c478bd9Sstevel@tonic-gate /* New "last child" is this parent node */
6927c478bd9Sstevel@tonic-gate
6937c478bd9Sstevel@tonic-gate ChildNode = ParentNode;
6947c478bd9Sstevel@tonic-gate
6957c478bd9Sstevel@tonic-gate /* Move up the tree to the grandparent */
6967c478bd9Sstevel@tonic-gate
69726f3cdf0SGordon Ross ParentNode = ParentNode->Parent;
6987c478bd9Sstevel@tonic-gate }
6997c478bd9Sstevel@tonic-gate }
7007c478bd9Sstevel@tonic-gate
70127f7c583Smyers (void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE);
7027c478bd9Sstevel@tonic-gate return_VOID;
7037c478bd9Sstevel@tonic-gate }
704