xref: /haiku/src/add-ons/kernel/bus_managers/acpi/acpica/components/namespace/nsload.c (revision 97dfeb96704e5dbc5bec32ad7b21379d0125e031)
1 /******************************************************************************
2  *
3  * Module Name: nsload - namespace loading/expanding/contracting procedures
4  *
5  *****************************************************************************/
6 
7 /******************************************************************************
8  *
9  * 1. Copyright Notice
10  *
11  * Some or all of this work - Copyright (c) 1999 - 2016, Intel Corp.
12  * All rights reserved.
13  *
14  * 2. License
15  *
16  * 2.1. This is your license from Intel Corp. under its intellectual property
17  * rights. You may have additional license terms from the party that provided
18  * you this software, covering your right to use that party's intellectual
19  * property rights.
20  *
21  * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
22  * copy of the source code appearing in this file ("Covered Code") an
23  * irrevocable, perpetual, worldwide license under Intel's copyrights in the
24  * base code distributed originally by Intel ("Original Intel Code") to copy,
25  * make derivatives, distribute, use and display any portion of the Covered
26  * Code in any form, with the right to sublicense such rights; and
27  *
28  * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
29  * license (with the right to sublicense), under only those claims of Intel
30  * patents that are infringed by the Original Intel Code, to make, use, sell,
31  * offer to sell, and import the Covered Code and derivative works thereof
32  * solely to the minimum extent necessary to exercise the above copyright
33  * license, and in no event shall the patent license extend to any additions
34  * to or modifications of the Original Intel Code. No other license or right
35  * is granted directly or by implication, estoppel or otherwise;
36  *
37  * The above copyright and patent license is granted only if the following
38  * conditions are met:
39  *
40  * 3. Conditions
41  *
42  * 3.1. Redistribution of Source with Rights to Further Distribute Source.
43  * Redistribution of source code of any substantial portion of the Covered
44  * Code or modification with rights to further distribute source must include
45  * the above Copyright Notice, the above License, this list of Conditions,
46  * and the following Disclaimer and Export Compliance provision. In addition,
47  * Licensee must cause all Covered Code to which Licensee contributes to
48  * contain a file documenting the changes Licensee made to create that Covered
49  * Code and the date of any change. Licensee must include in that file the
50  * documentation of any changes made by any predecessor Licensee. Licensee
51  * must include a prominent statement that the modification is derived,
52  * directly or indirectly, from Original Intel Code.
53  *
54  * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
55  * Redistribution of source code of any substantial portion of the Covered
56  * Code or modification without rights to further distribute source must
57  * include the following Disclaimer and Export Compliance provision in the
58  * documentation and/or other materials provided with distribution. In
59  * addition, Licensee may not authorize further sublicense of source of any
60  * portion of the Covered Code, and must include terms to the effect that the
61  * license from Licensee to its licensee is limited to the intellectual
62  * property embodied in the software Licensee provides to its licensee, and
63  * not to intellectual property embodied in modifications its licensee may
64  * make.
65  *
66  * 3.3. Redistribution of Executable. Redistribution in executable form of any
67  * substantial portion of the Covered Code or modification must reproduce the
68  * above Copyright Notice, and the following Disclaimer and Export Compliance
69  * provision in the documentation and/or other materials provided with the
70  * distribution.
71  *
72  * 3.4. Intel retains all right, title, and interest in and to the Original
73  * Intel Code.
74  *
75  * 3.5. Neither the name Intel nor any other trademark owned or controlled by
76  * Intel shall be used in advertising or otherwise to promote the sale, use or
77  * other dealings in products derived from or relating to the Covered Code
78  * without prior written authorization from Intel.
79  *
80  * 4. Disclaimer and Export Compliance
81  *
82  * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
83  * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
84  * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
85  * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
86  * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
87  * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
88  * PARTICULAR PURPOSE.
89  *
90  * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
91  * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
92  * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
93  * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
94  * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
95  * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
96  * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
97  * LIMITED REMEDY.
98  *
99  * 4.3. Licensee shall not export, either directly or indirectly, any of this
100  * software or system incorporating such software without first obtaining any
101  * required license or other approval from the U. S. Department of Commerce or
102  * any other agency or department of the United States Government. In the
103  * event Licensee exports any such software from the United States or
104  * re-exports any such software from a foreign destination, Licensee shall
105  * ensure that the distribution and export/re-export of the software is in
106  * compliance with all laws, regulations, orders, or other restrictions of the
107  * U.S. Export Administration Regulations. Licensee agrees that neither it nor
108  * any of its subsidiaries will export/re-export any technical data, process,
109  * software, or service, directly or indirectly, to any country for which the
110  * United States government or any agency thereof requires an export license,
111  * other governmental approval, or letter of assurance, without first obtaining
112  * such license, approval or letter.
113  *
114  *****************************************************************************/
115 
116 #include "acpi.h"
117 #include "accommon.h"
118 #include "acnamesp.h"
119 #include "acdispat.h"
120 #include "actables.h"
121 
122 
123 #define _COMPONENT          ACPI_NAMESPACE
124         ACPI_MODULE_NAME    ("nsload")
125 
126 /* Local prototypes */
127 
128 #ifdef ACPI_FUTURE_IMPLEMENTATION
129 ACPI_STATUS
130 AcpiNsUnloadNamespace (
131     ACPI_HANDLE             Handle);
132 
133 static ACPI_STATUS
134 AcpiNsDeleteSubtree (
135     ACPI_HANDLE             StartHandle);
136 #endif
137 
138 
139 #ifndef ACPI_NO_METHOD_EXECUTION
140 /*******************************************************************************
141  *
142  * FUNCTION:    AcpiNsLoadTable
143  *
144  * PARAMETERS:  TableIndex      - Index for table to be loaded
145  *              Node            - Owning NS node
146  *
147  * RETURN:      Status
148  *
149  * DESCRIPTION: Load one ACPI table into the namespace
150  *
151  ******************************************************************************/
152 
153 ACPI_STATUS
154 AcpiNsLoadTable (
155     UINT32                  TableIndex,
156     ACPI_NAMESPACE_NODE     *Node)
157 {
158     ACPI_STATUS             Status;
159 
160 
161     ACPI_FUNCTION_TRACE (NsLoadTable);
162 
163 
164     /*
165      * Parse the table and load the namespace with all named
166      * objects found within. Control methods are NOT parsed
167      * at this time. In fact, the control methods cannot be
168      * parsed until the entire namespace is loaded, because
169      * if a control method makes a forward reference (call)
170      * to another control method, we can't continue parsing
171      * because we don't know how many arguments to parse next!
172      */
173     Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE);
174     if (ACPI_FAILURE (Status))
175     {
176         return_ACPI_STATUS (Status);
177     }
178 
179     /* If table already loaded into namespace, just return */
180 
181     if (AcpiTbIsTableLoaded (TableIndex))
182     {
183         Status = AE_ALREADY_EXISTS;
184         goto Unlock;
185     }
186 
187     ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
188         "**** Loading table into namespace ****\n"));
189 
190     Status = AcpiTbAllocateOwnerId (TableIndex);
191     if (ACPI_FAILURE (Status))
192     {
193         goto Unlock;
194     }
195 
196     Status = AcpiNsParseTable (TableIndex, Node);
197     if (ACPI_SUCCESS (Status))
198     {
199         AcpiTbSetTableLoadedFlag (TableIndex, TRUE);
200     }
201     else
202     {
203         /*
204          * On error, delete any namespace objects created by this table.
205          * We cannot initialize these objects, so delete them. There are
206          * a couple of expecially bad cases:
207          * AE_ALREADY_EXISTS - namespace collision.
208          * AE_NOT_FOUND - the target of a Scope operator does not
209          * exist. This target of Scope must already exist in the
210          * namespace, as per the ACPI specification.
211          */
212         (void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE);
213         AcpiNsDeleteNamespaceByOwner (
214             AcpiGbl_RootTableList.Tables[TableIndex].OwnerId);
215             AcpiTbReleaseOwnerId (TableIndex);
216 
217         return_ACPI_STATUS (Status);
218     }
219 
220 Unlock:
221     (void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE);
222 
223     if (ACPI_FAILURE (Status))
224     {
225         return_ACPI_STATUS (Status);
226     }
227 
228     /*
229      * Now we can parse the control methods. We always parse
230      * them here for a sanity check, and if configured for
231      * just-in-time parsing, we delete the control method
232      * parse trees.
233      */
234     ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
235         "**** Begin Table Object Initialization\n"));
236 
237     Status = AcpiDsInitializeObjects (TableIndex, Node);
238 
239     ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
240         "**** Completed Table Object Initialization\n"));
241 
242     /*
243      * Execute any module-level code that was detected during the table load
244      * phase. Although illegal since ACPI 2.0, there are many machines that
245      * contain this type of code. Each block of detected executable AML code
246      * outside of any control method is wrapped with a temporary control
247      * method object and placed on a global list. The methods on this list
248      * are executed below.
249      *
250      * This case executes the module-level code for each table immediately
251      * after the table has been loaded. This provides compatibility with
252      * other ACPI implementations. Optionally, the execution can be deferred
253      * until later, see AcpiInitializeObjects.
254      */
255     if (!AcpiGbl_GroupModuleLevelCode)
256     {
257         AcpiNsExecModuleCodeList ();
258     }
259 
260     return_ACPI_STATUS (Status);
261 }
262 
263 
264 #ifdef ACPI_OBSOLETE_FUNCTIONS
265 /*******************************************************************************
266  *
267  * FUNCTION:    AcpiLoadNamespace
268  *
269  * PARAMETERS:  None
270  *
271  * RETURN:      Status
272  *
273  * DESCRIPTION: Load the name space from what ever is pointed to by DSDT.
274  *              (DSDT points to either the BIOS or a buffer.)
275  *
276  ******************************************************************************/
277 
278 ACPI_STATUS
279 AcpiNsLoadNamespace (
280     void)
281 {
282     ACPI_STATUS             Status;
283 
284 
285     ACPI_FUNCTION_TRACE (AcpiLoadNameSpace);
286 
287 
288     /* There must be at least a DSDT installed */
289 
290     if (AcpiGbl_DSDT == NULL)
291     {
292         ACPI_ERROR ((AE_INFO, "DSDT is not in memory"));
293         return_ACPI_STATUS (AE_NO_ACPI_TABLES);
294     }
295 
296     /*
297      * Load the namespace. The DSDT is required,
298      * but the SSDT and PSDT tables are optional.
299      */
300     Status = AcpiNsLoadTableByType (ACPI_TABLE_ID_DSDT);
301     if (ACPI_FAILURE (Status))
302     {
303         return_ACPI_STATUS (Status);
304     }
305 
306     /* Ignore exceptions from these */
307 
308     (void) AcpiNsLoadTableByType (ACPI_TABLE_ID_SSDT);
309     (void) AcpiNsLoadTableByType (ACPI_TABLE_ID_PSDT);
310 
311     ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INIT,
312         "ACPI Namespace successfully loaded at root %p\n",
313         AcpiGbl_RootNode));
314 
315     return_ACPI_STATUS (Status);
316 }
317 #endif
318 
319 #ifdef ACPI_FUTURE_IMPLEMENTATION
320 /*******************************************************************************
321  *
322  * FUNCTION:    AcpiNsDeleteSubtree
323  *
324  * PARAMETERS:  StartHandle         - Handle in namespace where search begins
325  *
326  * RETURNS      Status
327  *
328  * DESCRIPTION: Walks the namespace starting at the given handle and deletes
329  *              all objects, entries, and scopes in the entire subtree.
330  *
331  *              Namespace/Interpreter should be locked or the subsystem should
332  *              be in shutdown before this routine is called.
333  *
334  ******************************************************************************/
335 
336 static ACPI_STATUS
337 AcpiNsDeleteSubtree (
338     ACPI_HANDLE             StartHandle)
339 {
340     ACPI_STATUS             Status;
341     ACPI_HANDLE             ChildHandle;
342     ACPI_HANDLE             ParentHandle;
343     ACPI_HANDLE             NextChildHandle;
344     ACPI_HANDLE             Dummy;
345     UINT32                  Level;
346 
347 
348     ACPI_FUNCTION_TRACE (NsDeleteSubtree);
349 
350 
351     ParentHandle = StartHandle;
352     ChildHandle = NULL;
353     Level = 1;
354 
355     /*
356      * Traverse the tree of objects until we bubble back up
357      * to where we started.
358      */
359     while (Level > 0)
360     {
361         /* Attempt to get the next object in this scope */
362 
363         Status = AcpiGetNextObject (ACPI_TYPE_ANY, ParentHandle,
364             ChildHandle, &NextChildHandle);
365 
366         ChildHandle = NextChildHandle;
367 
368         /* Did we get a new object? */
369 
370         if (ACPI_SUCCESS (Status))
371         {
372             /* Check if this object has any children */
373 
374             if (ACPI_SUCCESS (AcpiGetNextObject (ACPI_TYPE_ANY, ChildHandle,
375                 NULL, &Dummy)))
376             {
377                 /*
378                  * There is at least one child of this object,
379                  * visit the object
380                  */
381                 Level++;
382                 ParentHandle = ChildHandle;
383                 ChildHandle  = NULL;
384             }
385         }
386         else
387         {
388             /*
389              * No more children in this object, go back up to
390              * the object's parent
391              */
392             Level--;
393 
394             /* Delete all children now */
395 
396             AcpiNsDeleteChildren (ChildHandle);
397 
398             ChildHandle = ParentHandle;
399             Status = AcpiGetParent (ParentHandle, &ParentHandle);
400             if (ACPI_FAILURE (Status))
401             {
402                 return_ACPI_STATUS (Status);
403             }
404         }
405     }
406 
407     /* Now delete the starting object, and we are done */
408 
409     AcpiNsRemoveNode (ChildHandle);
410     return_ACPI_STATUS (AE_OK);
411 }
412 
413 
414 /*******************************************************************************
415  *
416  *  FUNCTION:       AcpiNsUnloadNameSpace
417  *
418  *  PARAMETERS:     Handle          - Root of namespace subtree to be deleted
419  *
420  *  RETURN:         Status
421  *
422  *  DESCRIPTION:    Shrinks the namespace, typically in response to an undocking
423  *                  event. Deletes an entire subtree starting from (and
424  *                  including) the given handle.
425  *
426  ******************************************************************************/
427 
428 ACPI_STATUS
429 AcpiNsUnloadNamespace (
430     ACPI_HANDLE             Handle)
431 {
432     ACPI_STATUS             Status;
433 
434 
435     ACPI_FUNCTION_TRACE (NsUnloadNameSpace);
436 
437 
438     /* Parameter validation */
439 
440     if (!AcpiGbl_RootNode)
441     {
442         return_ACPI_STATUS (AE_NO_NAMESPACE);
443     }
444 
445     if (!Handle)
446     {
447         return_ACPI_STATUS (AE_BAD_PARAMETER);
448     }
449 
450     /* This function does the real work */
451 
452     Status = AcpiNsDeleteSubtree (Handle);
453     return_ACPI_STATUS (Status);
454 }
455 #endif
456 #endif
457