167754Smsmith/******************************************************************************
267754Smsmith *
377424Smsmith * Module Name: utinit - Common ACPI subsystem initialization
467754Smsmith *
567754Smsmith *****************************************************************************/
667754Smsmith
7217365Sjkim/*
8281075Sdim * Copyright (C) 2000 - 2015, Intel Corp.
970243Smsmith * All rights reserved.
1067754Smsmith *
11217365Sjkim * Redistribution and use in source and binary forms, with or without
12217365Sjkim * modification, are permitted provided that the following conditions
13217365Sjkim * are met:
14217365Sjkim * 1. Redistributions of source code must retain the above copyright
15217365Sjkim *    notice, this list of conditions, and the following disclaimer,
16217365Sjkim *    without modification.
17217365Sjkim * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18217365Sjkim *    substantially similar to the "NO WARRANTY" disclaimer below
19217365Sjkim *    ("Disclaimer") and any redistribution must be conditioned upon
20217365Sjkim *    including a substantially similar Disclaimer requirement for further
21217365Sjkim *    binary redistribution.
22217365Sjkim * 3. Neither the names of the above-listed copyright holders nor the names
23217365Sjkim *    of any contributors may be used to endorse or promote products derived
24217365Sjkim *    from this software without specific prior written permission.
2567754Smsmith *
26217365Sjkim * Alternatively, this software may be distributed under the terms of the
27217365Sjkim * GNU General Public License ("GPL") version 2 as published by the Free
28217365Sjkim * Software Foundation.
2967754Smsmith *
30217365Sjkim * NO WARRANTY
31217365Sjkim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32217365Sjkim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33217365Sjkim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34217365Sjkim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35217365Sjkim * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36217365Sjkim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37217365Sjkim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38217365Sjkim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39217365Sjkim * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40217365Sjkim * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41217365Sjkim * POSSIBILITY OF SUCH DAMAGES.
42217365Sjkim */
4367754Smsmith
44193341Sjkim#include <contrib/dev/acpica/include/acpi.h>
45193341Sjkim#include <contrib/dev/acpica/include/accommon.h>
46193341Sjkim#include <contrib/dev/acpica/include/acnamesp.h>
47193341Sjkim#include <contrib/dev/acpica/include/acevents.h>
48193341Sjkim#include <contrib/dev/acpica/include/actables.h>
4967754Smsmith
5077424Smsmith#define _COMPONENT          ACPI_UTILITIES
5191116Smsmith        ACPI_MODULE_NAME    ("utinit")
5267754Smsmith
53151937Sjkim/* Local prototypes */
5467754Smsmith
55151937Sjkimstatic void AcpiUtTerminate (
56151937Sjkim    void);
57151937Sjkim
58231844Sjkim#if (!ACPI_REDUCED_HARDWARE)
59151937Sjkim
60231844Sjkimstatic void
61231844SjkimAcpiUtFreeGpeLists (
62231844Sjkim    void);
63231844Sjkim
64231844Sjkim#else
65231844Sjkim
66231844Sjkim#define AcpiUtFreeGpeLists()
67231844Sjkim#endif /* !ACPI_REDUCED_HARDWARE */
68231844Sjkim
69231844Sjkim
70231844Sjkim#if (!ACPI_REDUCED_HARDWARE)
7167754Smsmith/******************************************************************************
7267754Smsmith *
73231844Sjkim * FUNCTION:    AcpiUtFreeGpeLists
7467754Smsmith *
7567754Smsmith * PARAMETERS:  none
7667754Smsmith *
7767754Smsmith * RETURN:      none
7867754Smsmith *
79231844Sjkim * DESCRIPTION: Free global GPE lists
8067754Smsmith *
8167754Smsmith ******************************************************************************/
8267754Smsmith
83151937Sjkimstatic void
84231844SjkimAcpiUtFreeGpeLists (
85151937Sjkim    void)
8667754Smsmith{
87117521Snjl    ACPI_GPE_BLOCK_INFO     *GpeBlock;
88117521Snjl    ACPI_GPE_BLOCK_INFO     *NextGpeBlock;
89117521Snjl    ACPI_GPE_XRUPT_INFO     *GpeXruptInfo;
90117521Snjl    ACPI_GPE_XRUPT_INFO     *NextGpeXruptInfo;
9167754Smsmith
92117521Snjl
93117521Snjl    /* Free global GPE blocks and related info structures */
94117521Snjl
95117521Snjl    GpeXruptInfo = AcpiGbl_GpeXruptListHead;
96117521Snjl    while (GpeXruptInfo)
97117521Snjl    {
98117521Snjl        GpeBlock = GpeXruptInfo->GpeBlockListHead;
99117521Snjl        while (GpeBlock)
100117521Snjl        {
101117521Snjl            NextGpeBlock = GpeBlock->Next;
102167802Sjkim            ACPI_FREE (GpeBlock->EventInfo);
103167802Sjkim            ACPI_FREE (GpeBlock->RegisterInfo);
104167802Sjkim            ACPI_FREE (GpeBlock);
105117521Snjl
106117521Snjl            GpeBlock = NextGpeBlock;
107117521Snjl        }
108117521Snjl        NextGpeXruptInfo = GpeXruptInfo->Next;
109167802Sjkim        ACPI_FREE (GpeXruptInfo);
110117521Snjl        GpeXruptInfo = NextGpeXruptInfo;
111117521Snjl    }
112231844Sjkim}
113231844Sjkim#endif /* !ACPI_REDUCED_HARDWARE */
114117521Snjl
115231844Sjkim
116281075Sdim/*******************************************************************************
117281075Sdim *
118281075Sdim * FUNCTION:    AcpiUtInitGlobals
119281075Sdim *
120281075Sdim * PARAMETERS:  None
121281075Sdim *
122281075Sdim * RETURN:      Status
123281075Sdim *
124281075Sdim * DESCRIPTION: Initialize ACPICA globals. All globals that require specific
125281075Sdim *              initialization should be initialized here. This allows for
126281075Sdim *              a warm restart.
127281075Sdim *
128281075Sdim ******************************************************************************/
129281075Sdim
130281075SdimACPI_STATUS
131281075SdimAcpiUtInitGlobals (
132281075Sdim    void)
133281075Sdim{
134281075Sdim    ACPI_STATUS             Status;
135281075Sdim    UINT32                  i;
136281075Sdim
137281075Sdim
138281075Sdim    ACPI_FUNCTION_TRACE (UtInitGlobals);
139281075Sdim
140281075Sdim
141281075Sdim    /* Create all memory caches */
142281075Sdim
143281075Sdim    Status = AcpiUtCreateCaches ();
144281075Sdim    if (ACPI_FAILURE (Status))
145281075Sdim    {
146281075Sdim        return_ACPI_STATUS (Status);
147281075Sdim    }
148281075Sdim
149281075Sdim    /* Address Range lists */
150281075Sdim
151281075Sdim    for (i = 0; i < ACPI_ADDRESS_RANGE_MAX; i++)
152281075Sdim    {
153281075Sdim        AcpiGbl_AddressRangeList[i] = NULL;
154281075Sdim    }
155281075Sdim
156281075Sdim    /* Mutex locked flags */
157281075Sdim
158281075Sdim    for (i = 0; i < ACPI_NUM_MUTEX; i++)
159281075Sdim    {
160281075Sdim        AcpiGbl_MutexInfo[i].Mutex          = NULL;
161281075Sdim        AcpiGbl_MutexInfo[i].ThreadId       = ACPI_MUTEX_NOT_ACQUIRED;
162281075Sdim        AcpiGbl_MutexInfo[i].UseCount       = 0;
163281075Sdim    }
164281075Sdim
165281075Sdim    for (i = 0; i < ACPI_NUM_OWNERID_MASKS; i++)
166281075Sdim    {
167281075Sdim        AcpiGbl_OwnerIdMask[i]              = 0;
168281075Sdim    }
169281075Sdim
170281075Sdim    /* Last OwnerID is never valid */
171281075Sdim
172281075Sdim    AcpiGbl_OwnerIdMask[ACPI_NUM_OWNERID_MASKS - 1] = 0x80000000;
173281075Sdim
174281075Sdim    /* Event counters */
175281075Sdim
176281075Sdim    AcpiMethodCount                     = 0;
177281075Sdim    AcpiSciCount                        = 0;
178281075Sdim    AcpiGpeCount                        = 0;
179281075Sdim
180281075Sdim    for (i = 0; i < ACPI_NUM_FIXED_EVENTS; i++)
181281075Sdim    {
182281075Sdim        AcpiFixedEventCount[i]              = 0;
183281075Sdim    }
184281075Sdim
185281075Sdim#if (!ACPI_REDUCED_HARDWARE)
186281075Sdim
187281075Sdim    /* GPE/SCI support */
188281075Sdim
189281075Sdim    AcpiGbl_AllGpesInitialized          = FALSE;
190281075Sdim    AcpiGbl_GpeXruptListHead            = NULL;
191281075Sdim    AcpiGbl_GpeFadtBlocks[0]            = NULL;
192281075Sdim    AcpiGbl_GpeFadtBlocks[1]            = NULL;
193281075Sdim    AcpiCurrentGpeCount                 = 0;
194281075Sdim
195281075Sdim    AcpiGbl_GlobalEventHandler          = NULL;
196281075Sdim    AcpiGbl_SciHandlerList              = NULL;
197281075Sdim
198281075Sdim#endif /* !ACPI_REDUCED_HARDWARE */
199281075Sdim
200281075Sdim    /* Global handlers */
201281075Sdim
202281075Sdim    AcpiGbl_GlobalNotify[0].Handler     = NULL;
203281075Sdim    AcpiGbl_GlobalNotify[1].Handler     = NULL;
204281075Sdim    AcpiGbl_ExceptionHandler            = NULL;
205281075Sdim    AcpiGbl_InitHandler                 = NULL;
206281075Sdim    AcpiGbl_TableHandler                = NULL;
207281075Sdim    AcpiGbl_InterfaceHandler            = NULL;
208281075Sdim
209281075Sdim    /* Global Lock support */
210281075Sdim
211281075Sdim    AcpiGbl_GlobalLockSemaphore         = NULL;
212281075Sdim    AcpiGbl_GlobalLockMutex             = NULL;
213281075Sdim    AcpiGbl_GlobalLockAcquired          = FALSE;
214281075Sdim    AcpiGbl_GlobalLockHandle            = 0;
215281075Sdim    AcpiGbl_GlobalLockPresent           = FALSE;
216281075Sdim
217281075Sdim    /* Miscellaneous variables */
218281075Sdim
219281075Sdim    AcpiGbl_DSDT                        = NULL;
220281075Sdim    AcpiGbl_CmSingleStep                = FALSE;
221281075Sdim    AcpiGbl_Shutdown                    = FALSE;
222281075Sdim    AcpiGbl_NsLookupCount               = 0;
223281075Sdim    AcpiGbl_PsFindCount                 = 0;
224281075Sdim    AcpiGbl_AcpiHardwarePresent         = TRUE;
225281075Sdim    AcpiGbl_LastOwnerIdIndex            = 0;
226281075Sdim    AcpiGbl_NextOwnerIdOffset           = 0;
227281075Sdim    AcpiGbl_TraceDbgLevel               = 0;
228281075Sdim    AcpiGbl_TraceDbgLayer               = 0;
229281075Sdim    AcpiGbl_DebuggerConfiguration       = DEBUGGER_THREADING;
230281075Sdim    AcpiGbl_OsiMutex                    = NULL;
231281075Sdim    AcpiGbl_RegMethodsExecuted          = FALSE;
232281075Sdim
233281075Sdim    /* Hardware oriented */
234281075Sdim
235281075Sdim    AcpiGbl_EventsInitialized           = FALSE;
236281075Sdim    AcpiGbl_SystemAwakeAndRunning       = TRUE;
237281075Sdim
238281075Sdim    /* Namespace */
239281075Sdim
240281075Sdim    AcpiGbl_ModuleCodeList              = NULL;
241281075Sdim    AcpiGbl_RootNode                    = NULL;
242281075Sdim    AcpiGbl_RootNodeStruct.Name.Integer = ACPI_ROOT_NAME;
243281075Sdim    AcpiGbl_RootNodeStruct.DescriptorType = ACPI_DESC_TYPE_NAMED;
244281075Sdim    AcpiGbl_RootNodeStruct.Type         = ACPI_TYPE_DEVICE;
245281075Sdim    AcpiGbl_RootNodeStruct.Parent       = NULL;
246281075Sdim    AcpiGbl_RootNodeStruct.Child        = NULL;
247281075Sdim    AcpiGbl_RootNodeStruct.Peer         = NULL;
248281075Sdim    AcpiGbl_RootNodeStruct.Object       = NULL;
249281075Sdim
250281075Sdim
251281075Sdim#ifdef ACPI_DISASSEMBLER
252281075Sdim    AcpiGbl_ExternalList                = NULL;
253281075Sdim    AcpiGbl_NumExternalMethods          = 0;
254281075Sdim    AcpiGbl_ResolvedExternalMethods     = 0;
255281075Sdim#endif
256281075Sdim
257281075Sdim#ifdef ACPI_DEBUG_OUTPUT
258281075Sdim    AcpiGbl_LowestStackPointer          = ACPI_CAST_PTR (ACPI_SIZE, ACPI_SIZE_MAX);
259281075Sdim#endif
260281075Sdim
261281075Sdim#ifdef ACPI_DBG_TRACK_ALLOCATIONS
262281075Sdim    AcpiGbl_DisplayFinalMemStats        = FALSE;
263281075Sdim    AcpiGbl_DisableMemTracking          = FALSE;
264281075Sdim#endif
265281075Sdim
266281075Sdim    ACPI_DEBUGGER_EXEC (AcpiGbl_DbTerminateThreads = FALSE);
267281075Sdim
268281075Sdim    return_ACPI_STATUS (AE_OK);
269281075Sdim}
270281075Sdim
271281075Sdim
272231844Sjkim/******************************************************************************
273231844Sjkim *
274231844Sjkim * FUNCTION:    AcpiUtTerminate
275231844Sjkim *
276231844Sjkim * PARAMETERS:  none
277231844Sjkim *
278231844Sjkim * RETURN:      none
279231844Sjkim *
280231844Sjkim * DESCRIPTION: Free global memory
281231844Sjkim *
282231844Sjkim ******************************************************************************/
283231844Sjkim
284231844Sjkimstatic void
285231844SjkimAcpiUtTerminate (
286231844Sjkim    void)
287231844Sjkim{
288231844Sjkim    ACPI_FUNCTION_TRACE (UtTerminate);
289231844Sjkim
290231844Sjkim    AcpiUtFreeGpeLists ();
291229989Sjkim    AcpiUtDeleteAddressLists ();
29267754Smsmith    return_VOID;
29367754Smsmith}
29467754Smsmith
29567754Smsmith
29677424Smsmith/*******************************************************************************
29767754Smsmith *
29877424Smsmith * FUNCTION:    AcpiUtSubsystemShutdown
29967754Smsmith *
300197104Sjkim * PARAMETERS:  None
30167754Smsmith *
302197104Sjkim * RETURN:      None
30367754Smsmith *
304197104Sjkim * DESCRIPTION: Shutdown the various components. Do not delete the mutex
305197104Sjkim *              objects here, because the AML debugger may be still running.
30667754Smsmith *
30767754Smsmith ******************************************************************************/
30867754Smsmith
30999679Siwasakivoid
310151937SjkimAcpiUtSubsystemShutdown (
311151937Sjkim    void)
31267754Smsmith{
313167802Sjkim    ACPI_FUNCTION_TRACE (UtSubsystemShutdown);
31467754Smsmith
31567754Smsmith
316193267Sjkim#ifndef ACPI_ASL_COMPILER
317193267Sjkim
318102550Siwasaki    /* Close the AcpiEvent Handling */
319102550Siwasaki
320102550Siwasaki    AcpiEvTerminate ();
321210976Sjkim
322210976Sjkim    /* Delete any dynamic _OSI interfaces */
323210976Sjkim
324210976Sjkim    AcpiUtInterfaceTerminate ();
325193267Sjkim#endif
326102550Siwasaki
32767754Smsmith    /* Close the Namespace */
32867754Smsmith
32967754Smsmith    AcpiNsTerminate ();
33067754Smsmith
331167802Sjkim    /* Delete the ACPI tables */
332167802Sjkim
333167802Sjkim    AcpiTbTerminate ();
334167802Sjkim
33567754Smsmith    /* Close the globals */
33667754Smsmith
33777424Smsmith    AcpiUtTerminate ();
33867754Smsmith
33987031Smsmith    /* Purge the local caches */
34067754Smsmith
341151937Sjkim    (void) AcpiUtDeleteCaches ();
34299679Siwasaki    return_VOID;
34367754Smsmith}
344