xref: /netbsd-src/sys/external/bsd/acpica/dist/utilities/utinit.c (revision c7960b37466ae0fd417c32e6acbb4b956ac7a121)
128c506b8Sjruoho /******************************************************************************
228c506b8Sjruoho  *
328c506b8Sjruoho  * Module Name: utinit - Common ACPI subsystem initialization
428c506b8Sjruoho  *
528c506b8Sjruoho  *****************************************************************************/
628c506b8Sjruoho 
7124f4c82Sjruoho /*
8046a2985Schristos  * Copyright (C) 2000 - 2023, Intel Corp.
928c506b8Sjruoho  * All rights reserved.
1028c506b8Sjruoho  *
11124f4c82Sjruoho  * Redistribution and use in source and binary forms, with or without
12124f4c82Sjruoho  * modification, are permitted provided that the following conditions
13124f4c82Sjruoho  * are met:
14124f4c82Sjruoho  * 1. Redistributions of source code must retain the above copyright
15124f4c82Sjruoho  *    notice, this list of conditions, and the following disclaimer,
16124f4c82Sjruoho  *    without modification.
17124f4c82Sjruoho  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18124f4c82Sjruoho  *    substantially similar to the "NO WARRANTY" disclaimer below
19124f4c82Sjruoho  *    ("Disclaimer") and any redistribution must be conditioned upon
20124f4c82Sjruoho  *    including a substantially similar Disclaimer requirement for further
21124f4c82Sjruoho  *    binary redistribution.
22124f4c82Sjruoho  * 3. Neither the names of the above-listed copyright holders nor the names
23124f4c82Sjruoho  *    of any contributors may be used to endorse or promote products derived
24124f4c82Sjruoho  *    from this software without specific prior written permission.
2528c506b8Sjruoho  *
26124f4c82Sjruoho  * Alternatively, this software may be distributed under the terms of the
27124f4c82Sjruoho  * GNU General Public License ("GPL") version 2 as published by the Free
28124f4c82Sjruoho  * Software Foundation.
2928c506b8Sjruoho  *
30124f4c82Sjruoho  * NO WARRANTY
31124f4c82Sjruoho  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32124f4c82Sjruoho  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
3346a330b4Schristos  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
34124f4c82Sjruoho  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35124f4c82Sjruoho  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36124f4c82Sjruoho  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37124f4c82Sjruoho  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38124f4c82Sjruoho  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39124f4c82Sjruoho  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40124f4c82Sjruoho  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41124f4c82Sjruoho  * POSSIBILITY OF SUCH DAMAGES.
42124f4c82Sjruoho  */
4328c506b8Sjruoho 
4428c506b8Sjruoho #include "acpi.h"
4528c506b8Sjruoho #include "accommon.h"
4628c506b8Sjruoho #include "acnamesp.h"
4728c506b8Sjruoho #include "acevents.h"
4828c506b8Sjruoho #include "actables.h"
4928c506b8Sjruoho 
5028c506b8Sjruoho #define _COMPONENT          ACPI_UTILITIES
5128c506b8Sjruoho         ACPI_MODULE_NAME    ("utinit")
5228c506b8Sjruoho 
5328c506b8Sjruoho /* Local prototypes */
5428c506b8Sjruoho 
5528c506b8Sjruoho static void AcpiUtTerminate (
5628c506b8Sjruoho     void);
5728c506b8Sjruoho 
58ff4a156dSchristos #if (!ACPI_REDUCED_HARDWARE)
5928c506b8Sjruoho 
60ff4a156dSchristos static void
61ff4a156dSchristos AcpiUtFreeGpeLists (
62ff4a156dSchristos     void);
63ff4a156dSchristos 
64ff4a156dSchristos #else
65ff4a156dSchristos 
66ff4a156dSchristos #define AcpiUtFreeGpeLists()
67ff4a156dSchristos #endif /* !ACPI_REDUCED_HARDWARE */
68ff4a156dSchristos 
69ff4a156dSchristos 
70ff4a156dSchristos #if (!ACPI_REDUCED_HARDWARE)
7128c506b8Sjruoho /******************************************************************************
7228c506b8Sjruoho  *
73ff4a156dSchristos  * FUNCTION:    AcpiUtFreeGpeLists
7428c506b8Sjruoho  *
7528c506b8Sjruoho  * PARAMETERS:  none
7628c506b8Sjruoho  *
7728c506b8Sjruoho  * RETURN:      none
7828c506b8Sjruoho  *
79ff4a156dSchristos  * DESCRIPTION: Free global GPE lists
8028c506b8Sjruoho  *
8128c506b8Sjruoho  ******************************************************************************/
8228c506b8Sjruoho 
8328c506b8Sjruoho static void
84ff4a156dSchristos AcpiUtFreeGpeLists (
8528c506b8Sjruoho     void)
8628c506b8Sjruoho {
8728c506b8Sjruoho     ACPI_GPE_BLOCK_INFO     *GpeBlock;
8828c506b8Sjruoho     ACPI_GPE_BLOCK_INFO     *NextGpeBlock;
8928c506b8Sjruoho     ACPI_GPE_XRUPT_INFO     *GpeXruptInfo;
9028c506b8Sjruoho     ACPI_GPE_XRUPT_INFO     *NextGpeXruptInfo;
9128c506b8Sjruoho 
9228c506b8Sjruoho 
9328c506b8Sjruoho     /* Free global GPE blocks and related info structures */
9428c506b8Sjruoho 
9528c506b8Sjruoho     GpeXruptInfo = AcpiGbl_GpeXruptListHead;
9628c506b8Sjruoho     while (GpeXruptInfo)
9728c506b8Sjruoho     {
9828c506b8Sjruoho         GpeBlock = GpeXruptInfo->GpeBlockListHead;
9928c506b8Sjruoho         while (GpeBlock)
10028c506b8Sjruoho         {
10128c506b8Sjruoho             NextGpeBlock = GpeBlock->Next;
10228c506b8Sjruoho             ACPI_FREE (GpeBlock->EventInfo);
10328c506b8Sjruoho             ACPI_FREE (GpeBlock->RegisterInfo);
10428c506b8Sjruoho             ACPI_FREE (GpeBlock);
10528c506b8Sjruoho 
10628c506b8Sjruoho             GpeBlock = NextGpeBlock;
10728c506b8Sjruoho         }
10828c506b8Sjruoho         NextGpeXruptInfo = GpeXruptInfo->Next;
10928c506b8Sjruoho         ACPI_FREE (GpeXruptInfo);
11028c506b8Sjruoho         GpeXruptInfo = NextGpeXruptInfo;
11128c506b8Sjruoho     }
112ff4a156dSchristos }
113ff4a156dSchristos #endif /* !ACPI_REDUCED_HARDWARE */
11428c506b8Sjruoho 
115ff4a156dSchristos 
116460301d4Schristos /*******************************************************************************
117460301d4Schristos  *
118460301d4Schristos  * FUNCTION:    AcpiUtInitGlobals
119460301d4Schristos  *
120460301d4Schristos  * PARAMETERS:  None
121460301d4Schristos  *
122460301d4Schristos  * RETURN:      Status
123460301d4Schristos  *
124460301d4Schristos  * DESCRIPTION: Initialize ACPICA globals. All globals that require specific
125460301d4Schristos  *              initialization should be initialized here. This allows for
126460301d4Schristos  *              a warm restart.
127460301d4Schristos  *
128460301d4Schristos  ******************************************************************************/
129460301d4Schristos 
130460301d4Schristos ACPI_STATUS
131460301d4Schristos AcpiUtInitGlobals (
132460301d4Schristos     void)
133460301d4Schristos {
134460301d4Schristos     ACPI_STATUS             Status;
135460301d4Schristos     UINT32                  i;
136460301d4Schristos 
137460301d4Schristos 
138460301d4Schristos     ACPI_FUNCTION_TRACE (UtInitGlobals);
139460301d4Schristos 
140460301d4Schristos 
141460301d4Schristos     /* Create all memory caches */
142460301d4Schristos 
143460301d4Schristos     Status = AcpiUtCreateCaches ();
144460301d4Schristos     if (ACPI_FAILURE (Status))
145460301d4Schristos     {
146460301d4Schristos         return_ACPI_STATUS (Status);
147460301d4Schristos     }
148460301d4Schristos 
149460301d4Schristos     /* Address Range lists */
150460301d4Schristos 
151460301d4Schristos     for (i = 0; i < ACPI_ADDRESS_RANGE_MAX; i++)
152460301d4Schristos     {
153460301d4Schristos         AcpiGbl_AddressRangeList[i] = NULL;
154460301d4Schristos     }
155460301d4Schristos 
156460301d4Schristos     /* Mutex locked flags */
157460301d4Schristos 
158460301d4Schristos     for (i = 0; i < ACPI_NUM_MUTEX; i++)
159460301d4Schristos     {
160460301d4Schristos         AcpiGbl_MutexInfo[i].Mutex          = NULL;
161460301d4Schristos         AcpiGbl_MutexInfo[i].ThreadId       = ACPI_MUTEX_NOT_ACQUIRED;
162460301d4Schristos         AcpiGbl_MutexInfo[i].UseCount       = 0;
163460301d4Schristos     }
164460301d4Schristos 
165460301d4Schristos     for (i = 0; i < ACPI_NUM_OWNERID_MASKS; i++)
166460301d4Schristos     {
167460301d4Schristos         AcpiGbl_OwnerIdMask[i]              = 0;
168460301d4Schristos     }
169460301d4Schristos 
170460301d4Schristos     /* Last OwnerID is never valid */
171460301d4Schristos 
172460301d4Schristos     AcpiGbl_OwnerIdMask[ACPI_NUM_OWNERID_MASKS - 1] = 0x80000000;
173460301d4Schristos 
174460301d4Schristos     /* Event counters */
175460301d4Schristos 
176460301d4Schristos     AcpiMethodCount                     = 0;
177460301d4Schristos     AcpiSciCount                        = 0;
178460301d4Schristos     AcpiGpeCount                        = 0;
179460301d4Schristos 
180460301d4Schristos     for (i = 0; i < ACPI_NUM_FIXED_EVENTS; i++)
181460301d4Schristos     {
182460301d4Schristos         AcpiFixedEventCount[i]              = 0;
183460301d4Schristos     }
184460301d4Schristos 
185460301d4Schristos #if (!ACPI_REDUCED_HARDWARE)
186460301d4Schristos 
187460301d4Schristos     /* GPE/SCI support */
188460301d4Schristos 
189460301d4Schristos     AcpiGbl_AllGpesInitialized          = FALSE;
190460301d4Schristos     AcpiGbl_GpeXruptListHead            = NULL;
191460301d4Schristos     AcpiGbl_GpeFadtBlocks[0]            = NULL;
192460301d4Schristos     AcpiGbl_GpeFadtBlocks[1]            = NULL;
193460301d4Schristos     AcpiCurrentGpeCount                 = 0;
194460301d4Schristos 
195460301d4Schristos     AcpiGbl_GlobalEventHandler          = NULL;
196460301d4Schristos     AcpiGbl_SciHandlerList              = NULL;
197460301d4Schristos 
198460301d4Schristos #endif /* !ACPI_REDUCED_HARDWARE */
199460301d4Schristos 
200460301d4Schristos     /* Global handlers */
201460301d4Schristos 
202460301d4Schristos     AcpiGbl_GlobalNotify[0].Handler     = NULL;
203460301d4Schristos     AcpiGbl_GlobalNotify[1].Handler     = NULL;
204460301d4Schristos     AcpiGbl_ExceptionHandler            = NULL;
205460301d4Schristos     AcpiGbl_InitHandler                 = NULL;
206460301d4Schristos     AcpiGbl_TableHandler                = NULL;
207460301d4Schristos     AcpiGbl_InterfaceHandler            = NULL;
208460301d4Schristos 
209460301d4Schristos     /* Global Lock support */
210460301d4Schristos 
211*c7960b37Schristos     AcpiGbl_GlobalLockSemaphore         = ACPI_SEMAPHORE_NULL;
212460301d4Schristos     AcpiGbl_GlobalLockMutex             = NULL;
213460301d4Schristos     AcpiGbl_GlobalLockAcquired          = FALSE;
214460301d4Schristos     AcpiGbl_GlobalLockHandle            = 0;
215460301d4Schristos     AcpiGbl_GlobalLockPresent           = FALSE;
216460301d4Schristos 
217460301d4Schristos     /* Miscellaneous variables */
218460301d4Schristos 
219460301d4Schristos     AcpiGbl_DSDT                        = NULL;
220460301d4Schristos     AcpiGbl_CmSingleStep                = FALSE;
221460301d4Schristos     AcpiGbl_Shutdown                    = FALSE;
222460301d4Schristos     AcpiGbl_NsLookupCount               = 0;
223460301d4Schristos     AcpiGbl_PsFindCount                 = 0;
224460301d4Schristos     AcpiGbl_AcpiHardwarePresent         = TRUE;
225460301d4Schristos     AcpiGbl_LastOwnerIdIndex            = 0;
226460301d4Schristos     AcpiGbl_NextOwnerIdOffset           = 0;
227460301d4Schristos     AcpiGbl_DebuggerConfiguration       = DEBUGGER_THREADING;
228460301d4Schristos     AcpiGbl_OsiMutex                    = NULL;
229460301d4Schristos 
230460301d4Schristos     /* Hardware oriented */
231460301d4Schristos 
232460301d4Schristos     AcpiGbl_EventsInitialized           = FALSE;
233460301d4Schristos     AcpiGbl_SystemAwakeAndRunning       = TRUE;
234460301d4Schristos 
235460301d4Schristos     /* Namespace */
236460301d4Schristos 
237460301d4Schristos     AcpiGbl_RootNode                    = NULL;
238460301d4Schristos     AcpiGbl_RootNodeStruct.Name.Integer = ACPI_ROOT_NAME;
239460301d4Schristos     AcpiGbl_RootNodeStruct.DescriptorType = ACPI_DESC_TYPE_NAMED;
240460301d4Schristos     AcpiGbl_RootNodeStruct.Type         = ACPI_TYPE_DEVICE;
241460301d4Schristos     AcpiGbl_RootNodeStruct.Parent       = NULL;
242460301d4Schristos     AcpiGbl_RootNodeStruct.Child        = NULL;
243460301d4Schristos     AcpiGbl_RootNodeStruct.Peer         = NULL;
244460301d4Schristos     AcpiGbl_RootNodeStruct.Object       = NULL;
245460301d4Schristos 
246460301d4Schristos 
247460301d4Schristos #ifdef ACPI_DISASSEMBLER
248460301d4Schristos     AcpiGbl_ExternalList                = NULL;
249460301d4Schristos     AcpiGbl_NumExternalMethods          = 0;
250460301d4Schristos     AcpiGbl_ResolvedExternalMethods     = 0;
251460301d4Schristos #endif
252460301d4Schristos 
253460301d4Schristos #ifdef ACPI_DEBUG_OUTPUT
254460301d4Schristos     AcpiGbl_LowestStackPointer          = ACPI_CAST_PTR (ACPI_SIZE, ACPI_SIZE_MAX);
255460301d4Schristos #endif
256460301d4Schristos 
257460301d4Schristos #ifdef ACPI_DBG_TRACK_ALLOCATIONS
258460301d4Schristos     AcpiGbl_DisplayFinalMemStats        = FALSE;
259460301d4Schristos     AcpiGbl_DisableMemTracking          = FALSE;
260460301d4Schristos #endif
261460301d4Schristos 
262460301d4Schristos     return_ACPI_STATUS (AE_OK);
263460301d4Schristos }
264460301d4Schristos 
265460301d4Schristos 
266ff4a156dSchristos /******************************************************************************
267ff4a156dSchristos  *
268ff4a156dSchristos  * FUNCTION:    AcpiUtTerminate
269ff4a156dSchristos  *
270ff4a156dSchristos  * PARAMETERS:  none
271ff4a156dSchristos  *
272ff4a156dSchristos  * RETURN:      none
273ff4a156dSchristos  *
274ff4a156dSchristos  * DESCRIPTION: Free global memory
275ff4a156dSchristos  *
276ff4a156dSchristos  ******************************************************************************/
277ff4a156dSchristos 
278ff4a156dSchristos static void
279ff4a156dSchristos AcpiUtTerminate (
280ff4a156dSchristos     void)
281ff4a156dSchristos {
282ff4a156dSchristos     ACPI_FUNCTION_TRACE (UtTerminate);
283ff4a156dSchristos 
284ff4a156dSchristos     AcpiUtFreeGpeLists ();
285ff4a156dSchristos     AcpiUtDeleteAddressLists ();
28628c506b8Sjruoho     return_VOID;
28728c506b8Sjruoho }
28828c506b8Sjruoho 
28928c506b8Sjruoho 
29028c506b8Sjruoho /*******************************************************************************
29128c506b8Sjruoho  *
29228c506b8Sjruoho  * FUNCTION:    AcpiUtSubsystemShutdown
29328c506b8Sjruoho  *
29428c506b8Sjruoho  * PARAMETERS:  None
29528c506b8Sjruoho  *
29628c506b8Sjruoho  * RETURN:      None
29728c506b8Sjruoho  *
29828c506b8Sjruoho  * DESCRIPTION: Shutdown the various components. Do not delete the mutex
29928c506b8Sjruoho  *              objects here, because the AML debugger may be still running.
30028c506b8Sjruoho  *
30128c506b8Sjruoho  ******************************************************************************/
30228c506b8Sjruoho 
30328c506b8Sjruoho void
30428c506b8Sjruoho AcpiUtSubsystemShutdown (
30528c506b8Sjruoho     void)
30628c506b8Sjruoho {
30728c506b8Sjruoho     ACPI_FUNCTION_TRACE (UtSubsystemShutdown);
30828c506b8Sjruoho 
30928c506b8Sjruoho 
31071e38f1dSchristos     /* Just exit if subsystem is already shutdown */
31171e38f1dSchristos 
31271e38f1dSchristos     if (AcpiGbl_Shutdown)
31371e38f1dSchristos     {
31471e38f1dSchristos         ACPI_ERROR ((AE_INFO, "ACPI Subsystem is already terminated"));
31571e38f1dSchristos         return_VOID;
31671e38f1dSchristos     }
31771e38f1dSchristos 
31871e38f1dSchristos     /* Subsystem appears active, go ahead and shut it down */
31971e38f1dSchristos 
32071e38f1dSchristos     AcpiGbl_Shutdown = TRUE;
32171e38f1dSchristos     AcpiGbl_StartupFlags = 0;
32271e38f1dSchristos     ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Shutting down ACPI Subsystem\n"));
32371e38f1dSchristos 
32428c506b8Sjruoho #ifndef ACPI_ASL_COMPILER
32528c506b8Sjruoho 
32628c506b8Sjruoho     /* Close the AcpiEvent Handling */
32728c506b8Sjruoho 
32828c506b8Sjruoho     AcpiEvTerminate ();
329124f4c82Sjruoho 
330124f4c82Sjruoho     /* Delete any dynamic _OSI interfaces */
331124f4c82Sjruoho 
332124f4c82Sjruoho     AcpiUtInterfaceTerminate ();
33328c506b8Sjruoho #endif
33428c506b8Sjruoho 
33528c506b8Sjruoho     /* Close the Namespace */
33628c506b8Sjruoho 
33728c506b8Sjruoho     AcpiNsTerminate ();
33828c506b8Sjruoho 
33928c506b8Sjruoho     /* Delete the ACPI tables */
34028c506b8Sjruoho 
34128c506b8Sjruoho     AcpiTbTerminate ();
34228c506b8Sjruoho 
34328c506b8Sjruoho     /* Close the globals */
34428c506b8Sjruoho 
34528c506b8Sjruoho     AcpiUtTerminate ();
34628c506b8Sjruoho 
34728c506b8Sjruoho     /* Purge the local caches */
34828c506b8Sjruoho 
34928c506b8Sjruoho     (void) AcpiUtDeleteCaches ();
35028c506b8Sjruoho     return_VOID;
35128c506b8Sjruoho }
352