xref: /haiku/src/add-ons/kernel/bus_managers/acpi/acpica/components/utilities/utinit.c (revision a5a3b2d9a3d95cbae71eaf371708c73a1780ac0d)
1 /******************************************************************************
2  *
3  * Module Name: utinit - Common ACPI subsystem initialization
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 "acevents.h"
120 #include "actables.h"
121 
122 #define _COMPONENT          ACPI_UTILITIES
123         ACPI_MODULE_NAME    ("utinit")
124 
125 /* Local prototypes */
126 
127 static void AcpiUtTerminate (
128     void);
129 
130 #if (!ACPI_REDUCED_HARDWARE)
131 
132 static void
133 AcpiUtFreeGpeLists (
134     void);
135 
136 #else
137 
138 #define AcpiUtFreeGpeLists()
139 #endif /* !ACPI_REDUCED_HARDWARE */
140 
141 
142 #if (!ACPI_REDUCED_HARDWARE)
143 /******************************************************************************
144  *
145  * FUNCTION:    AcpiUtFreeGpeLists
146  *
147  * PARAMETERS:  none
148  *
149  * RETURN:      none
150  *
151  * DESCRIPTION: Free global GPE lists
152  *
153  ******************************************************************************/
154 
155 static void
156 AcpiUtFreeGpeLists (
157     void)
158 {
159     ACPI_GPE_BLOCK_INFO     *GpeBlock;
160     ACPI_GPE_BLOCK_INFO     *NextGpeBlock;
161     ACPI_GPE_XRUPT_INFO     *GpeXruptInfo;
162     ACPI_GPE_XRUPT_INFO     *NextGpeXruptInfo;
163 
164 
165     /* Free global GPE blocks and related info structures */
166 
167     GpeXruptInfo = AcpiGbl_GpeXruptListHead;
168     while (GpeXruptInfo)
169     {
170         GpeBlock = GpeXruptInfo->GpeBlockListHead;
171         while (GpeBlock)
172         {
173             NextGpeBlock = GpeBlock->Next;
174             ACPI_FREE (GpeBlock->EventInfo);
175             ACPI_FREE (GpeBlock->RegisterInfo);
176             ACPI_FREE (GpeBlock);
177 
178             GpeBlock = NextGpeBlock;
179         }
180         NextGpeXruptInfo = GpeXruptInfo->Next;
181         ACPI_FREE (GpeXruptInfo);
182         GpeXruptInfo = NextGpeXruptInfo;
183     }
184 }
185 #endif /* !ACPI_REDUCED_HARDWARE */
186 
187 
188 /*******************************************************************************
189  *
190  * FUNCTION:    AcpiUtInitGlobals
191  *
192  * PARAMETERS:  None
193  *
194  * RETURN:      Status
195  *
196  * DESCRIPTION: Initialize ACPICA globals. All globals that require specific
197  *              initialization should be initialized here. This allows for
198  *              a warm restart.
199  *
200  ******************************************************************************/
201 
202 ACPI_STATUS
203 AcpiUtInitGlobals (
204     void)
205 {
206     ACPI_STATUS             Status;
207     UINT32                  i;
208 
209 
210     ACPI_FUNCTION_TRACE (UtInitGlobals);
211 
212 
213     /* Create all memory caches */
214 
215     Status = AcpiUtCreateCaches ();
216     if (ACPI_FAILURE (Status))
217     {
218         return_ACPI_STATUS (Status);
219     }
220 
221     /* Address Range lists */
222 
223     for (i = 0; i < ACPI_ADDRESS_RANGE_MAX; i++)
224     {
225         AcpiGbl_AddressRangeList[i] = NULL;
226     }
227 
228     /* Mutex locked flags */
229 
230     for (i = 0; i < ACPI_NUM_MUTEX; i++)
231     {
232         AcpiGbl_MutexInfo[i].Mutex          = NULL;
233         AcpiGbl_MutexInfo[i].ThreadId       = ACPI_MUTEX_NOT_ACQUIRED;
234         AcpiGbl_MutexInfo[i].UseCount       = 0;
235     }
236 
237     for (i = 0; i < ACPI_NUM_OWNERID_MASKS; i++)
238     {
239         AcpiGbl_OwnerIdMask[i]              = 0;
240     }
241 
242     /* Last OwnerID is never valid */
243 
244     AcpiGbl_OwnerIdMask[ACPI_NUM_OWNERID_MASKS - 1] = 0x80000000;
245 
246     /* Event counters */
247 
248     AcpiMethodCount                     = 0;
249     AcpiSciCount                        = 0;
250     AcpiGpeCount                        = 0;
251 
252     for (i = 0; i < ACPI_NUM_FIXED_EVENTS; i++)
253     {
254         AcpiFixedEventCount[i]              = 0;
255     }
256 
257 #if (!ACPI_REDUCED_HARDWARE)
258 
259     /* GPE/SCI support */
260 
261     AcpiGbl_AllGpesInitialized          = FALSE;
262     AcpiGbl_GpeXruptListHead            = NULL;
263     AcpiGbl_GpeFadtBlocks[0]            = NULL;
264     AcpiGbl_GpeFadtBlocks[1]            = NULL;
265     AcpiCurrentGpeCount                 = 0;
266 
267     AcpiGbl_GlobalEventHandler          = NULL;
268     AcpiGbl_SciHandlerList              = NULL;
269 
270 #endif /* !ACPI_REDUCED_HARDWARE */
271 
272     /* Global handlers */
273 
274     AcpiGbl_GlobalNotify[0].Handler     = NULL;
275     AcpiGbl_GlobalNotify[1].Handler     = NULL;
276     AcpiGbl_ExceptionHandler            = NULL;
277     AcpiGbl_InitHandler                 = NULL;
278     AcpiGbl_TableHandler                = NULL;
279     AcpiGbl_InterfaceHandler            = NULL;
280 
281     /* Global Lock support */
282 
283     AcpiGbl_GlobalLockSemaphore         = NULL;
284     AcpiGbl_GlobalLockMutex             = NULL;
285     AcpiGbl_GlobalLockAcquired          = FALSE;
286     AcpiGbl_GlobalLockHandle            = 0;
287     AcpiGbl_GlobalLockPresent           = FALSE;
288 
289     /* Miscellaneous variables */
290 
291     AcpiGbl_DSDT                        = NULL;
292     AcpiGbl_CmSingleStep                = FALSE;
293     AcpiGbl_Shutdown                    = FALSE;
294     AcpiGbl_NsLookupCount               = 0;
295     AcpiGbl_PsFindCount                 = 0;
296     AcpiGbl_AcpiHardwarePresent         = TRUE;
297     AcpiGbl_LastOwnerIdIndex            = 0;
298     AcpiGbl_NextOwnerIdOffset           = 0;
299     AcpiGbl_DebuggerConfiguration       = DEBUGGER_THREADING;
300     AcpiGbl_OsiMutex                    = NULL;
301     AcpiGbl_MaxLoopIterations           = 0xFFFF;
302 
303     /* Hardware oriented */
304 
305     AcpiGbl_EventsInitialized           = FALSE;
306     AcpiGbl_SystemAwakeAndRunning       = TRUE;
307 
308     /* Namespace */
309 
310     AcpiGbl_ModuleCodeList              = NULL;
311     AcpiGbl_RootNode                    = NULL;
312     AcpiGbl_RootNodeStruct.Name.Integer = ACPI_ROOT_NAME;
313     AcpiGbl_RootNodeStruct.DescriptorType = ACPI_DESC_TYPE_NAMED;
314     AcpiGbl_RootNodeStruct.Type         = ACPI_TYPE_DEVICE;
315     AcpiGbl_RootNodeStruct.Parent       = NULL;
316     AcpiGbl_RootNodeStruct.Child        = NULL;
317     AcpiGbl_RootNodeStruct.Peer         = NULL;
318     AcpiGbl_RootNodeStruct.Object       = NULL;
319 
320 
321 #ifdef ACPI_DISASSEMBLER
322     AcpiGbl_ExternalList                = NULL;
323     AcpiGbl_NumExternalMethods          = 0;
324     AcpiGbl_ResolvedExternalMethods     = 0;
325 #endif
326 
327 #ifdef ACPI_DEBUG_OUTPUT
328     AcpiGbl_LowestStackPointer          = ACPI_CAST_PTR (ACPI_SIZE, ACPI_SIZE_MAX);
329 #endif
330 
331 #ifdef ACPI_DBG_TRACK_ALLOCATIONS
332     AcpiGbl_DisplayFinalMemStats        = FALSE;
333     AcpiGbl_DisableMemTracking          = FALSE;
334 #endif
335 
336     return_ACPI_STATUS (AE_OK);
337 }
338 
339 
340 /******************************************************************************
341  *
342  * FUNCTION:    AcpiUtTerminate
343  *
344  * PARAMETERS:  none
345  *
346  * RETURN:      none
347  *
348  * DESCRIPTION: Free global memory
349  *
350  ******************************************************************************/
351 
352 static void
353 AcpiUtTerminate (
354     void)
355 {
356     ACPI_FUNCTION_TRACE (UtTerminate);
357 
358     AcpiUtFreeGpeLists ();
359     AcpiUtDeleteAddressLists ();
360     return_VOID;
361 }
362 
363 
364 /*******************************************************************************
365  *
366  * FUNCTION:    AcpiUtSubsystemShutdown
367  *
368  * PARAMETERS:  None
369  *
370  * RETURN:      None
371  *
372  * DESCRIPTION: Shutdown the various components. Do not delete the mutex
373  *              objects here, because the AML debugger may be still running.
374  *
375  ******************************************************************************/
376 
377 void
378 AcpiUtSubsystemShutdown (
379     void)
380 {
381     ACPI_FUNCTION_TRACE (UtSubsystemShutdown);
382 
383 
384     /* Just exit if subsystem is already shutdown */
385 
386     if (AcpiGbl_Shutdown)
387     {
388         ACPI_ERROR ((AE_INFO, "ACPI Subsystem is already terminated"));
389         return_VOID;
390     }
391 
392     /* Subsystem appears active, go ahead and shut it down */
393 
394     AcpiGbl_Shutdown = TRUE;
395     AcpiGbl_StartupFlags = 0;
396     ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Shutting down ACPI Subsystem\n"));
397 
398 #ifndef ACPI_ASL_COMPILER
399 
400     /* Close the AcpiEvent Handling */
401 
402     AcpiEvTerminate ();
403 
404     /* Delete any dynamic _OSI interfaces */
405 
406     AcpiUtInterfaceTerminate ();
407 #endif
408 
409     /* Close the Namespace */
410 
411     AcpiNsTerminate ();
412 
413     /* Delete the ACPI tables */
414 
415     AcpiTbTerminate ();
416 
417     /* Close the globals */
418 
419     AcpiUtTerminate ();
420 
421     /* Purge the local caches */
422 
423     (void) AcpiUtDeleteCaches ();
424     return_VOID;
425 }
426