xref: /freebsd/sys/contrib/dev/acpica/components/utilities/utxface.c (revision a159c266a93c3c4f229864954c5f963acd8f60f2)
1*a159c266SJung-uk Kim /******************************************************************************
2*a159c266SJung-uk Kim  *
3*a159c266SJung-uk Kim  * Module Name: utxface - External interfaces for "global" ACPI functions
4*a159c266SJung-uk Kim  *
5*a159c266SJung-uk Kim  *****************************************************************************/
6*a159c266SJung-uk Kim 
7*a159c266SJung-uk Kim /*
8*a159c266SJung-uk Kim  * Copyright (C) 2000 - 2012, Intel Corp.
9*a159c266SJung-uk Kim  * All rights reserved.
10*a159c266SJung-uk Kim  *
11*a159c266SJung-uk Kim  * Redistribution and use in source and binary forms, with or without
12*a159c266SJung-uk Kim  * modification, are permitted provided that the following conditions
13*a159c266SJung-uk Kim  * are met:
14*a159c266SJung-uk Kim  * 1. Redistributions of source code must retain the above copyright
15*a159c266SJung-uk Kim  *    notice, this list of conditions, and the following disclaimer,
16*a159c266SJung-uk Kim  *    without modification.
17*a159c266SJung-uk Kim  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18*a159c266SJung-uk Kim  *    substantially similar to the "NO WARRANTY" disclaimer below
19*a159c266SJung-uk Kim  *    ("Disclaimer") and any redistribution must be conditioned upon
20*a159c266SJung-uk Kim  *    including a substantially similar Disclaimer requirement for further
21*a159c266SJung-uk Kim  *    binary redistribution.
22*a159c266SJung-uk Kim  * 3. Neither the names of the above-listed copyright holders nor the names
23*a159c266SJung-uk Kim  *    of any contributors may be used to endorse or promote products derived
24*a159c266SJung-uk Kim  *    from this software without specific prior written permission.
25*a159c266SJung-uk Kim  *
26*a159c266SJung-uk Kim  * Alternatively, this software may be distributed under the terms of the
27*a159c266SJung-uk Kim  * GNU General Public License ("GPL") version 2 as published by the Free
28*a159c266SJung-uk Kim  * Software Foundation.
29*a159c266SJung-uk Kim  *
30*a159c266SJung-uk Kim  * NO WARRANTY
31*a159c266SJung-uk Kim  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32*a159c266SJung-uk Kim  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33*a159c266SJung-uk Kim  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34*a159c266SJung-uk Kim  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35*a159c266SJung-uk Kim  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36*a159c266SJung-uk Kim  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37*a159c266SJung-uk Kim  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38*a159c266SJung-uk Kim  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39*a159c266SJung-uk Kim  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40*a159c266SJung-uk Kim  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41*a159c266SJung-uk Kim  * POSSIBILITY OF SUCH DAMAGES.
42*a159c266SJung-uk Kim  */
43*a159c266SJung-uk Kim 
44*a159c266SJung-uk Kim 
45*a159c266SJung-uk Kim #define __UTXFACE_C__
46*a159c266SJung-uk Kim 
47*a159c266SJung-uk Kim #include <contrib/dev/acpica/include/acpi.h>
48*a159c266SJung-uk Kim #include <contrib/dev/acpica/include/accommon.h>
49*a159c266SJung-uk Kim #include <contrib/dev/acpica/include/acevents.h>
50*a159c266SJung-uk Kim #include <contrib/dev/acpica/include/acnamesp.h>
51*a159c266SJung-uk Kim #include <contrib/dev/acpica/include/acdebug.h>
52*a159c266SJung-uk Kim #include <contrib/dev/acpica/include/actables.h>
53*a159c266SJung-uk Kim 
54*a159c266SJung-uk Kim #define _COMPONENT          ACPI_UTILITIES
55*a159c266SJung-uk Kim         ACPI_MODULE_NAME    ("utxface")
56*a159c266SJung-uk Kim 
57*a159c266SJung-uk Kim 
58*a159c266SJung-uk Kim #ifndef ACPI_ASL_COMPILER
59*a159c266SJung-uk Kim /*******************************************************************************
60*a159c266SJung-uk Kim  *
61*a159c266SJung-uk Kim  * FUNCTION:    AcpiInitializeSubsystem
62*a159c266SJung-uk Kim  *
63*a159c266SJung-uk Kim  * PARAMETERS:  None
64*a159c266SJung-uk Kim  *
65*a159c266SJung-uk Kim  * RETURN:      Status
66*a159c266SJung-uk Kim  *
67*a159c266SJung-uk Kim  * DESCRIPTION: Initializes all global variables.  This is the first function
68*a159c266SJung-uk Kim  *              called, so any early initialization belongs here.
69*a159c266SJung-uk Kim  *
70*a159c266SJung-uk Kim  ******************************************************************************/
71*a159c266SJung-uk Kim 
72*a159c266SJung-uk Kim ACPI_STATUS
73*a159c266SJung-uk Kim AcpiInitializeSubsystem (
74*a159c266SJung-uk Kim     void)
75*a159c266SJung-uk Kim {
76*a159c266SJung-uk Kim     ACPI_STATUS             Status;
77*a159c266SJung-uk Kim 
78*a159c266SJung-uk Kim 
79*a159c266SJung-uk Kim     ACPI_FUNCTION_TRACE (AcpiInitializeSubsystem);
80*a159c266SJung-uk Kim 
81*a159c266SJung-uk Kim 
82*a159c266SJung-uk Kim     AcpiGbl_StartupFlags = ACPI_SUBSYSTEM_INITIALIZE;
83*a159c266SJung-uk Kim     ACPI_DEBUG_EXEC (AcpiUtInitStackPtrTrace ());
84*a159c266SJung-uk Kim 
85*a159c266SJung-uk Kim     /* Initialize the OS-Dependent layer */
86*a159c266SJung-uk Kim 
87*a159c266SJung-uk Kim     Status = AcpiOsInitialize ();
88*a159c266SJung-uk Kim     if (ACPI_FAILURE (Status))
89*a159c266SJung-uk Kim     {
90*a159c266SJung-uk Kim         ACPI_EXCEPTION ((AE_INFO, Status, "During OSL initialization"));
91*a159c266SJung-uk Kim         return_ACPI_STATUS (Status);
92*a159c266SJung-uk Kim     }
93*a159c266SJung-uk Kim 
94*a159c266SJung-uk Kim     /* Initialize all globals used by the subsystem */
95*a159c266SJung-uk Kim 
96*a159c266SJung-uk Kim     Status = AcpiUtInitGlobals ();
97*a159c266SJung-uk Kim     if (ACPI_FAILURE (Status))
98*a159c266SJung-uk Kim     {
99*a159c266SJung-uk Kim         ACPI_EXCEPTION ((AE_INFO, Status, "During initialization of globals"));
100*a159c266SJung-uk Kim         return_ACPI_STATUS (Status);
101*a159c266SJung-uk Kim     }
102*a159c266SJung-uk Kim 
103*a159c266SJung-uk Kim     /* Create the default mutex objects */
104*a159c266SJung-uk Kim 
105*a159c266SJung-uk Kim     Status = AcpiUtMutexInitialize ();
106*a159c266SJung-uk Kim     if (ACPI_FAILURE (Status))
107*a159c266SJung-uk Kim     {
108*a159c266SJung-uk Kim         ACPI_EXCEPTION ((AE_INFO, Status, "During Global Mutex creation"));
109*a159c266SJung-uk Kim         return_ACPI_STATUS (Status);
110*a159c266SJung-uk Kim     }
111*a159c266SJung-uk Kim 
112*a159c266SJung-uk Kim     /*
113*a159c266SJung-uk Kim      * Initialize the namespace manager and
114*a159c266SJung-uk Kim      * the root of the namespace tree
115*a159c266SJung-uk Kim      */
116*a159c266SJung-uk Kim     Status = AcpiNsRootInitialize ();
117*a159c266SJung-uk Kim     if (ACPI_FAILURE (Status))
118*a159c266SJung-uk Kim     {
119*a159c266SJung-uk Kim         ACPI_EXCEPTION ((AE_INFO, Status, "During Namespace initialization"));
120*a159c266SJung-uk Kim         return_ACPI_STATUS (Status);
121*a159c266SJung-uk Kim     }
122*a159c266SJung-uk Kim 
123*a159c266SJung-uk Kim     /* Initialize the global OSI interfaces list with the static names */
124*a159c266SJung-uk Kim 
125*a159c266SJung-uk Kim     Status = AcpiUtInitializeInterfaces ();
126*a159c266SJung-uk Kim     if (ACPI_FAILURE (Status))
127*a159c266SJung-uk Kim     {
128*a159c266SJung-uk Kim         ACPI_EXCEPTION ((AE_INFO, Status, "During OSI interfaces initialization"));
129*a159c266SJung-uk Kim         return_ACPI_STATUS (Status);
130*a159c266SJung-uk Kim     }
131*a159c266SJung-uk Kim 
132*a159c266SJung-uk Kim     /* If configured, initialize the AML debugger */
133*a159c266SJung-uk Kim 
134*a159c266SJung-uk Kim     ACPI_DEBUGGER_EXEC (Status = AcpiDbInitialize ());
135*a159c266SJung-uk Kim     return_ACPI_STATUS (Status);
136*a159c266SJung-uk Kim }
137*a159c266SJung-uk Kim 
138*a159c266SJung-uk Kim ACPI_EXPORT_SYMBOL (AcpiInitializeSubsystem)
139*a159c266SJung-uk Kim 
140*a159c266SJung-uk Kim 
141*a159c266SJung-uk Kim /*******************************************************************************
142*a159c266SJung-uk Kim  *
143*a159c266SJung-uk Kim  * FUNCTION:    AcpiEnableSubsystem
144*a159c266SJung-uk Kim  *
145*a159c266SJung-uk Kim  * PARAMETERS:  Flags           - Init/enable Options
146*a159c266SJung-uk Kim  *
147*a159c266SJung-uk Kim  * RETURN:      Status
148*a159c266SJung-uk Kim  *
149*a159c266SJung-uk Kim  * DESCRIPTION: Completes the subsystem initialization including hardware.
150*a159c266SJung-uk Kim  *              Puts system into ACPI mode if it isn't already.
151*a159c266SJung-uk Kim  *
152*a159c266SJung-uk Kim  ******************************************************************************/
153*a159c266SJung-uk Kim 
154*a159c266SJung-uk Kim ACPI_STATUS
155*a159c266SJung-uk Kim AcpiEnableSubsystem (
156*a159c266SJung-uk Kim     UINT32                  Flags)
157*a159c266SJung-uk Kim {
158*a159c266SJung-uk Kim     ACPI_STATUS             Status = AE_OK;
159*a159c266SJung-uk Kim 
160*a159c266SJung-uk Kim 
161*a159c266SJung-uk Kim     ACPI_FUNCTION_TRACE (AcpiEnableSubsystem);
162*a159c266SJung-uk Kim 
163*a159c266SJung-uk Kim 
164*a159c266SJung-uk Kim #if (!ACPI_REDUCED_HARDWARE)
165*a159c266SJung-uk Kim 
166*a159c266SJung-uk Kim     /* Enable ACPI mode */
167*a159c266SJung-uk Kim 
168*a159c266SJung-uk Kim     if (!(Flags & ACPI_NO_ACPI_ENABLE))
169*a159c266SJung-uk Kim     {
170*a159c266SJung-uk Kim         ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "[Init] Going into ACPI mode\n"));
171*a159c266SJung-uk Kim 
172*a159c266SJung-uk Kim         AcpiGbl_OriginalMode = AcpiHwGetMode();
173*a159c266SJung-uk Kim 
174*a159c266SJung-uk Kim         Status = AcpiEnable ();
175*a159c266SJung-uk Kim         if (ACPI_FAILURE (Status))
176*a159c266SJung-uk Kim         {
177*a159c266SJung-uk Kim             ACPI_WARNING ((AE_INFO, "AcpiEnable failed"));
178*a159c266SJung-uk Kim             return_ACPI_STATUS (Status);
179*a159c266SJung-uk Kim         }
180*a159c266SJung-uk Kim     }
181*a159c266SJung-uk Kim 
182*a159c266SJung-uk Kim     /*
183*a159c266SJung-uk Kim      * Obtain a permanent mapping for the FACS. This is required for the
184*a159c266SJung-uk Kim      * Global Lock and the Firmware Waking Vector
185*a159c266SJung-uk Kim      */
186*a159c266SJung-uk Kim     Status = AcpiTbInitializeFacs ();
187*a159c266SJung-uk Kim     if (ACPI_FAILURE (Status))
188*a159c266SJung-uk Kim     {
189*a159c266SJung-uk Kim         ACPI_WARNING ((AE_INFO, "Could not map the FACS table"));
190*a159c266SJung-uk Kim         return_ACPI_STATUS (Status);
191*a159c266SJung-uk Kim     }
192*a159c266SJung-uk Kim 
193*a159c266SJung-uk Kim #endif /* !ACPI_REDUCED_HARDWARE */
194*a159c266SJung-uk Kim 
195*a159c266SJung-uk Kim     /*
196*a159c266SJung-uk Kim      * Install the default OpRegion handlers.  These are installed unless
197*a159c266SJung-uk Kim      * other handlers have already been installed via the
198*a159c266SJung-uk Kim      * InstallAddressSpaceHandler interface.
199*a159c266SJung-uk Kim      */
200*a159c266SJung-uk Kim     if (!(Flags & ACPI_NO_ADDRESS_SPACE_INIT))
201*a159c266SJung-uk Kim     {
202*a159c266SJung-uk Kim         ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
203*a159c266SJung-uk Kim             "[Init] Installing default address space handlers\n"));
204*a159c266SJung-uk Kim 
205*a159c266SJung-uk Kim         Status = AcpiEvInstallRegionHandlers ();
206*a159c266SJung-uk Kim         if (ACPI_FAILURE (Status))
207*a159c266SJung-uk Kim         {
208*a159c266SJung-uk Kim             return_ACPI_STATUS (Status);
209*a159c266SJung-uk Kim         }
210*a159c266SJung-uk Kim     }
211*a159c266SJung-uk Kim 
212*a159c266SJung-uk Kim #if (!ACPI_REDUCED_HARDWARE)
213*a159c266SJung-uk Kim     /*
214*a159c266SJung-uk Kim      * Initialize ACPI Event handling (Fixed and General Purpose)
215*a159c266SJung-uk Kim      *
216*a159c266SJung-uk Kim      * Note1: We must have the hardware and events initialized before we can
217*a159c266SJung-uk Kim      * execute any control methods safely. Any control method can require
218*a159c266SJung-uk Kim      * ACPI hardware support, so the hardware must be fully initialized before
219*a159c266SJung-uk Kim      * any method execution!
220*a159c266SJung-uk Kim      *
221*a159c266SJung-uk Kim      * Note2: Fixed events are initialized and enabled here. GPEs are
222*a159c266SJung-uk Kim      * initialized, but cannot be enabled until after the hardware is
223*a159c266SJung-uk Kim      * completely initialized (SCI and GlobalLock activated) and the various
224*a159c266SJung-uk Kim      * initialization control methods are run (_REG, _STA, _INI) on the
225*a159c266SJung-uk Kim      * entire namespace.
226*a159c266SJung-uk Kim      */
227*a159c266SJung-uk Kim     if (!(Flags & ACPI_NO_EVENT_INIT))
228*a159c266SJung-uk Kim     {
229*a159c266SJung-uk Kim         ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
230*a159c266SJung-uk Kim             "[Init] Initializing ACPI events\n"));
231*a159c266SJung-uk Kim 
232*a159c266SJung-uk Kim         Status = AcpiEvInitializeEvents ();
233*a159c266SJung-uk Kim         if (ACPI_FAILURE (Status))
234*a159c266SJung-uk Kim         {
235*a159c266SJung-uk Kim             return_ACPI_STATUS (Status);
236*a159c266SJung-uk Kim         }
237*a159c266SJung-uk Kim     }
238*a159c266SJung-uk Kim 
239*a159c266SJung-uk Kim     /*
240*a159c266SJung-uk Kim      * Install the SCI handler and Global Lock handler. This completes the
241*a159c266SJung-uk Kim      * hardware initialization.
242*a159c266SJung-uk Kim      */
243*a159c266SJung-uk Kim     if (!(Flags & ACPI_NO_HANDLER_INIT))
244*a159c266SJung-uk Kim     {
245*a159c266SJung-uk Kim         ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
246*a159c266SJung-uk Kim             "[Init] Installing SCI/GL handlers\n"));
247*a159c266SJung-uk Kim 
248*a159c266SJung-uk Kim         Status = AcpiEvInstallXruptHandlers ();
249*a159c266SJung-uk Kim         if (ACPI_FAILURE (Status))
250*a159c266SJung-uk Kim         {
251*a159c266SJung-uk Kim             return_ACPI_STATUS (Status);
252*a159c266SJung-uk Kim         }
253*a159c266SJung-uk Kim     }
254*a159c266SJung-uk Kim 
255*a159c266SJung-uk Kim #endif /* !ACPI_REDUCED_HARDWARE */
256*a159c266SJung-uk Kim 
257*a159c266SJung-uk Kim     return_ACPI_STATUS (Status);
258*a159c266SJung-uk Kim }
259*a159c266SJung-uk Kim 
260*a159c266SJung-uk Kim ACPI_EXPORT_SYMBOL (AcpiEnableSubsystem)
261*a159c266SJung-uk Kim 
262*a159c266SJung-uk Kim 
263*a159c266SJung-uk Kim /*******************************************************************************
264*a159c266SJung-uk Kim  *
265*a159c266SJung-uk Kim  * FUNCTION:    AcpiInitializeObjects
266*a159c266SJung-uk Kim  *
267*a159c266SJung-uk Kim  * PARAMETERS:  Flags           - Init/enable Options
268*a159c266SJung-uk Kim  *
269*a159c266SJung-uk Kim  * RETURN:      Status
270*a159c266SJung-uk Kim  *
271*a159c266SJung-uk Kim  * DESCRIPTION: Completes namespace initialization by initializing device
272*a159c266SJung-uk Kim  *              objects and executing AML code for Regions, buffers, etc.
273*a159c266SJung-uk Kim  *
274*a159c266SJung-uk Kim  ******************************************************************************/
275*a159c266SJung-uk Kim 
276*a159c266SJung-uk Kim ACPI_STATUS
277*a159c266SJung-uk Kim AcpiInitializeObjects (
278*a159c266SJung-uk Kim     UINT32                  Flags)
279*a159c266SJung-uk Kim {
280*a159c266SJung-uk Kim     ACPI_STATUS             Status = AE_OK;
281*a159c266SJung-uk Kim 
282*a159c266SJung-uk Kim 
283*a159c266SJung-uk Kim     ACPI_FUNCTION_TRACE (AcpiInitializeObjects);
284*a159c266SJung-uk Kim 
285*a159c266SJung-uk Kim 
286*a159c266SJung-uk Kim     /*
287*a159c266SJung-uk Kim      * Run all _REG methods
288*a159c266SJung-uk Kim      *
289*a159c266SJung-uk Kim      * Note: Any objects accessed by the _REG methods will be automatically
290*a159c266SJung-uk Kim      * initialized, even if they contain executable AML (see the call to
291*a159c266SJung-uk Kim      * AcpiNsInitializeObjects below).
292*a159c266SJung-uk Kim      */
293*a159c266SJung-uk Kim     if (!(Flags & ACPI_NO_ADDRESS_SPACE_INIT))
294*a159c266SJung-uk Kim     {
295*a159c266SJung-uk Kim         ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
296*a159c266SJung-uk Kim             "[Init] Executing _REG OpRegion methods\n"));
297*a159c266SJung-uk Kim 
298*a159c266SJung-uk Kim         Status = AcpiEvInitializeOpRegions ();
299*a159c266SJung-uk Kim         if (ACPI_FAILURE (Status))
300*a159c266SJung-uk Kim         {
301*a159c266SJung-uk Kim             return_ACPI_STATUS (Status);
302*a159c266SJung-uk Kim         }
303*a159c266SJung-uk Kim     }
304*a159c266SJung-uk Kim 
305*a159c266SJung-uk Kim     /*
306*a159c266SJung-uk Kim      * Execute any module-level code that was detected during the table load
307*a159c266SJung-uk Kim      * phase. Although illegal since ACPI 2.0, there are many machines that
308*a159c266SJung-uk Kim      * contain this type of code. Each block of detected executable AML code
309*a159c266SJung-uk Kim      * outside of any control method is wrapped with a temporary control
310*a159c266SJung-uk Kim      * method object and placed on a global list. The methods on this list
311*a159c266SJung-uk Kim      * are executed below.
312*a159c266SJung-uk Kim      */
313*a159c266SJung-uk Kim     AcpiNsExecModuleCodeList ();
314*a159c266SJung-uk Kim 
315*a159c266SJung-uk Kim     /*
316*a159c266SJung-uk Kim      * Initialize the objects that remain uninitialized. This runs the
317*a159c266SJung-uk Kim      * executable AML that may be part of the declaration of these objects:
318*a159c266SJung-uk Kim      * OperationRegions, BufferFields, Buffers, and Packages.
319*a159c266SJung-uk Kim      */
320*a159c266SJung-uk Kim     if (!(Flags & ACPI_NO_OBJECT_INIT))
321*a159c266SJung-uk Kim     {
322*a159c266SJung-uk Kim         ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
323*a159c266SJung-uk Kim             "[Init] Completing Initialization of ACPI Objects\n"));
324*a159c266SJung-uk Kim 
325*a159c266SJung-uk Kim         Status = AcpiNsInitializeObjects ();
326*a159c266SJung-uk Kim         if (ACPI_FAILURE (Status))
327*a159c266SJung-uk Kim         {
328*a159c266SJung-uk Kim             return_ACPI_STATUS (Status);
329*a159c266SJung-uk Kim         }
330*a159c266SJung-uk Kim     }
331*a159c266SJung-uk Kim 
332*a159c266SJung-uk Kim     /*
333*a159c266SJung-uk Kim      * Initialize all device objects in the namespace. This runs the device
334*a159c266SJung-uk Kim      * _STA and _INI methods.
335*a159c266SJung-uk Kim      */
336*a159c266SJung-uk Kim     if (!(Flags & ACPI_NO_DEVICE_INIT))
337*a159c266SJung-uk Kim     {
338*a159c266SJung-uk Kim         ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
339*a159c266SJung-uk Kim             "[Init] Initializing ACPI Devices\n"));
340*a159c266SJung-uk Kim 
341*a159c266SJung-uk Kim         Status = AcpiNsInitializeDevices ();
342*a159c266SJung-uk Kim         if (ACPI_FAILURE (Status))
343*a159c266SJung-uk Kim         {
344*a159c266SJung-uk Kim             return_ACPI_STATUS (Status);
345*a159c266SJung-uk Kim         }
346*a159c266SJung-uk Kim     }
347*a159c266SJung-uk Kim 
348*a159c266SJung-uk Kim     /*
349*a159c266SJung-uk Kim      * Empty the caches (delete the cached objects) on the assumption that
350*a159c266SJung-uk Kim      * the table load filled them up more than they will be at runtime --
351*a159c266SJung-uk Kim      * thus wasting non-paged memory.
352*a159c266SJung-uk Kim      */
353*a159c266SJung-uk Kim     Status = AcpiPurgeCachedObjects ();
354*a159c266SJung-uk Kim 
355*a159c266SJung-uk Kim     AcpiGbl_StartupFlags |= ACPI_INITIALIZED_OK;
356*a159c266SJung-uk Kim     return_ACPI_STATUS (Status);
357*a159c266SJung-uk Kim }
358*a159c266SJung-uk Kim 
359*a159c266SJung-uk Kim ACPI_EXPORT_SYMBOL (AcpiInitializeObjects)
360*a159c266SJung-uk Kim 
361*a159c266SJung-uk Kim 
362*a159c266SJung-uk Kim #endif
363*a159c266SJung-uk Kim 
364*a159c266SJung-uk Kim /*******************************************************************************
365*a159c266SJung-uk Kim  *
366*a159c266SJung-uk Kim  * FUNCTION:    AcpiTerminate
367*a159c266SJung-uk Kim  *
368*a159c266SJung-uk Kim  * PARAMETERS:  None
369*a159c266SJung-uk Kim  *
370*a159c266SJung-uk Kim  * RETURN:      Status
371*a159c266SJung-uk Kim  *
372*a159c266SJung-uk Kim  * DESCRIPTION: Shutdown the ACPICA subsystem and release all resources.
373*a159c266SJung-uk Kim  *
374*a159c266SJung-uk Kim  ******************************************************************************/
375*a159c266SJung-uk Kim 
376*a159c266SJung-uk Kim ACPI_STATUS
377*a159c266SJung-uk Kim AcpiTerminate (
378*a159c266SJung-uk Kim     void)
379*a159c266SJung-uk Kim {
380*a159c266SJung-uk Kim     ACPI_STATUS         Status;
381*a159c266SJung-uk Kim 
382*a159c266SJung-uk Kim 
383*a159c266SJung-uk Kim     ACPI_FUNCTION_TRACE (AcpiTerminate);
384*a159c266SJung-uk Kim 
385*a159c266SJung-uk Kim 
386*a159c266SJung-uk Kim     /* Just exit if subsystem is already shutdown */
387*a159c266SJung-uk Kim 
388*a159c266SJung-uk Kim     if (AcpiGbl_Shutdown)
389*a159c266SJung-uk Kim     {
390*a159c266SJung-uk Kim         ACPI_ERROR ((AE_INFO, "ACPI Subsystem is already terminated"));
391*a159c266SJung-uk Kim         return_ACPI_STATUS (AE_OK);
392*a159c266SJung-uk Kim     }
393*a159c266SJung-uk Kim 
394*a159c266SJung-uk Kim     /* Subsystem appears active, go ahead and shut it down */
395*a159c266SJung-uk Kim 
396*a159c266SJung-uk Kim     AcpiGbl_Shutdown = TRUE;
397*a159c266SJung-uk Kim     AcpiGbl_StartupFlags = 0;
398*a159c266SJung-uk Kim     ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Shutting down ACPI Subsystem\n"));
399*a159c266SJung-uk Kim 
400*a159c266SJung-uk Kim     /* Terminate the AML Debugger if present */
401*a159c266SJung-uk Kim 
402*a159c266SJung-uk Kim     ACPI_DEBUGGER_EXEC (AcpiGbl_DbTerminateThreads = TRUE);
403*a159c266SJung-uk Kim 
404*a159c266SJung-uk Kim     /* Shutdown and free all resources */
405*a159c266SJung-uk Kim 
406*a159c266SJung-uk Kim     AcpiUtSubsystemShutdown ();
407*a159c266SJung-uk Kim 
408*a159c266SJung-uk Kim     /* Free the mutex objects */
409*a159c266SJung-uk Kim 
410*a159c266SJung-uk Kim     AcpiUtMutexTerminate ();
411*a159c266SJung-uk Kim 
412*a159c266SJung-uk Kim 
413*a159c266SJung-uk Kim #ifdef ACPI_DEBUGGER
414*a159c266SJung-uk Kim 
415*a159c266SJung-uk Kim     /* Shut down the debugger */
416*a159c266SJung-uk Kim 
417*a159c266SJung-uk Kim     AcpiDbTerminate ();
418*a159c266SJung-uk Kim #endif
419*a159c266SJung-uk Kim 
420*a159c266SJung-uk Kim     /* Now we can shutdown the OS-dependent layer */
421*a159c266SJung-uk Kim 
422*a159c266SJung-uk Kim     Status = AcpiOsTerminate ();
423*a159c266SJung-uk Kim     return_ACPI_STATUS (Status);
424*a159c266SJung-uk Kim }
425*a159c266SJung-uk Kim 
426*a159c266SJung-uk Kim ACPI_EXPORT_SYMBOL (AcpiTerminate)
427*a159c266SJung-uk Kim 
428*a159c266SJung-uk Kim 
429*a159c266SJung-uk Kim #ifndef ACPI_ASL_COMPILER
430*a159c266SJung-uk Kim /*******************************************************************************
431*a159c266SJung-uk Kim  *
432*a159c266SJung-uk Kim  * FUNCTION:    AcpiSubsystemStatus
433*a159c266SJung-uk Kim  *
434*a159c266SJung-uk Kim  * PARAMETERS:  None
435*a159c266SJung-uk Kim  *
436*a159c266SJung-uk Kim  * RETURN:      Status of the ACPI subsystem
437*a159c266SJung-uk Kim  *
438*a159c266SJung-uk Kim  * DESCRIPTION: Other drivers that use the ACPI subsystem should call this
439*a159c266SJung-uk Kim  *              before making any other calls, to ensure the subsystem
440*a159c266SJung-uk Kim  *              initialized successfully.
441*a159c266SJung-uk Kim  *
442*a159c266SJung-uk Kim  ******************************************************************************/
443*a159c266SJung-uk Kim 
444*a159c266SJung-uk Kim ACPI_STATUS
445*a159c266SJung-uk Kim AcpiSubsystemStatus (
446*a159c266SJung-uk Kim     void)
447*a159c266SJung-uk Kim {
448*a159c266SJung-uk Kim 
449*a159c266SJung-uk Kim     if (AcpiGbl_StartupFlags & ACPI_INITIALIZED_OK)
450*a159c266SJung-uk Kim     {
451*a159c266SJung-uk Kim         return (AE_OK);
452*a159c266SJung-uk Kim     }
453*a159c266SJung-uk Kim     else
454*a159c266SJung-uk Kim     {
455*a159c266SJung-uk Kim         return (AE_ERROR);
456*a159c266SJung-uk Kim     }
457*a159c266SJung-uk Kim }
458*a159c266SJung-uk Kim 
459*a159c266SJung-uk Kim ACPI_EXPORT_SYMBOL (AcpiSubsystemStatus)
460*a159c266SJung-uk Kim 
461*a159c266SJung-uk Kim 
462*a159c266SJung-uk Kim /*******************************************************************************
463*a159c266SJung-uk Kim  *
464*a159c266SJung-uk Kim  * FUNCTION:    AcpiGetSystemInfo
465*a159c266SJung-uk Kim  *
466*a159c266SJung-uk Kim  * PARAMETERS:  OutBuffer       - A buffer to receive the resources for the
467*a159c266SJung-uk Kim  *                                device
468*a159c266SJung-uk Kim  *
469*a159c266SJung-uk Kim  * RETURN:      Status          - the status of the call
470*a159c266SJung-uk Kim  *
471*a159c266SJung-uk Kim  * DESCRIPTION: This function is called to get information about the current
472*a159c266SJung-uk Kim  *              state of the ACPI subsystem.  It will return system information
473*a159c266SJung-uk Kim  *              in the OutBuffer.
474*a159c266SJung-uk Kim  *
475*a159c266SJung-uk Kim  *              If the function fails an appropriate status will be returned
476*a159c266SJung-uk Kim  *              and the value of OutBuffer is undefined.
477*a159c266SJung-uk Kim  *
478*a159c266SJung-uk Kim  ******************************************************************************/
479*a159c266SJung-uk Kim 
480*a159c266SJung-uk Kim ACPI_STATUS
481*a159c266SJung-uk Kim AcpiGetSystemInfo (
482*a159c266SJung-uk Kim     ACPI_BUFFER             *OutBuffer)
483*a159c266SJung-uk Kim {
484*a159c266SJung-uk Kim     ACPI_SYSTEM_INFO        *InfoPtr;
485*a159c266SJung-uk Kim     ACPI_STATUS             Status;
486*a159c266SJung-uk Kim 
487*a159c266SJung-uk Kim 
488*a159c266SJung-uk Kim     ACPI_FUNCTION_TRACE (AcpiGetSystemInfo);
489*a159c266SJung-uk Kim 
490*a159c266SJung-uk Kim 
491*a159c266SJung-uk Kim     /* Parameter validation */
492*a159c266SJung-uk Kim 
493*a159c266SJung-uk Kim     Status = AcpiUtValidateBuffer (OutBuffer);
494*a159c266SJung-uk Kim     if (ACPI_FAILURE (Status))
495*a159c266SJung-uk Kim     {
496*a159c266SJung-uk Kim         return_ACPI_STATUS (Status);
497*a159c266SJung-uk Kim     }
498*a159c266SJung-uk Kim 
499*a159c266SJung-uk Kim     /* Validate/Allocate/Clear caller buffer */
500*a159c266SJung-uk Kim 
501*a159c266SJung-uk Kim     Status = AcpiUtInitializeBuffer (OutBuffer, sizeof (ACPI_SYSTEM_INFO));
502*a159c266SJung-uk Kim     if (ACPI_FAILURE (Status))
503*a159c266SJung-uk Kim     {
504*a159c266SJung-uk Kim         return_ACPI_STATUS (Status);
505*a159c266SJung-uk Kim     }
506*a159c266SJung-uk Kim 
507*a159c266SJung-uk Kim     /*
508*a159c266SJung-uk Kim      * Populate the return buffer
509*a159c266SJung-uk Kim      */
510*a159c266SJung-uk Kim     InfoPtr = (ACPI_SYSTEM_INFO *) OutBuffer->Pointer;
511*a159c266SJung-uk Kim 
512*a159c266SJung-uk Kim     InfoPtr->AcpiCaVersion = ACPI_CA_VERSION;
513*a159c266SJung-uk Kim 
514*a159c266SJung-uk Kim     /* System flags (ACPI capabilities) */
515*a159c266SJung-uk Kim 
516*a159c266SJung-uk Kim     InfoPtr->Flags = ACPI_SYS_MODE_ACPI;
517*a159c266SJung-uk Kim 
518*a159c266SJung-uk Kim     /* Timer resolution - 24 or 32 bits  */
519*a159c266SJung-uk Kim 
520*a159c266SJung-uk Kim     if (AcpiGbl_FADT.Flags & ACPI_FADT_32BIT_TIMER)
521*a159c266SJung-uk Kim     {
522*a159c266SJung-uk Kim         InfoPtr->TimerResolution = 24;
523*a159c266SJung-uk Kim     }
524*a159c266SJung-uk Kim     else
525*a159c266SJung-uk Kim     {
526*a159c266SJung-uk Kim         InfoPtr->TimerResolution = 32;
527*a159c266SJung-uk Kim     }
528*a159c266SJung-uk Kim 
529*a159c266SJung-uk Kim     /* Clear the reserved fields */
530*a159c266SJung-uk Kim 
531*a159c266SJung-uk Kim     InfoPtr->Reserved1 = 0;
532*a159c266SJung-uk Kim     InfoPtr->Reserved2 = 0;
533*a159c266SJung-uk Kim 
534*a159c266SJung-uk Kim     /* Current debug levels */
535*a159c266SJung-uk Kim 
536*a159c266SJung-uk Kim     InfoPtr->DebugLayer = AcpiDbgLayer;
537*a159c266SJung-uk Kim     InfoPtr->DebugLevel = AcpiDbgLevel;
538*a159c266SJung-uk Kim 
539*a159c266SJung-uk Kim     return_ACPI_STATUS (AE_OK);
540*a159c266SJung-uk Kim }
541*a159c266SJung-uk Kim 
542*a159c266SJung-uk Kim ACPI_EXPORT_SYMBOL (AcpiGetSystemInfo)
543*a159c266SJung-uk Kim 
544*a159c266SJung-uk Kim 
545*a159c266SJung-uk Kim /*******************************************************************************
546*a159c266SJung-uk Kim  *
547*a159c266SJung-uk Kim  * FUNCTION:    AcpiGetStatistics
548*a159c266SJung-uk Kim  *
549*a159c266SJung-uk Kim  * PARAMETERS:  Stats           - Where the statistics are returned
550*a159c266SJung-uk Kim  *
551*a159c266SJung-uk Kim  * RETURN:      Status          - the status of the call
552*a159c266SJung-uk Kim  *
553*a159c266SJung-uk Kim  * DESCRIPTION: Get the contents of the various system counters
554*a159c266SJung-uk Kim  *
555*a159c266SJung-uk Kim  ******************************************************************************/
556*a159c266SJung-uk Kim 
557*a159c266SJung-uk Kim ACPI_STATUS
558*a159c266SJung-uk Kim AcpiGetStatistics (
559*a159c266SJung-uk Kim     ACPI_STATISTICS         *Stats)
560*a159c266SJung-uk Kim {
561*a159c266SJung-uk Kim     ACPI_FUNCTION_TRACE (AcpiGetStatistics);
562*a159c266SJung-uk Kim 
563*a159c266SJung-uk Kim 
564*a159c266SJung-uk Kim     /* Parameter validation */
565*a159c266SJung-uk Kim 
566*a159c266SJung-uk Kim     if (!Stats)
567*a159c266SJung-uk Kim     {
568*a159c266SJung-uk Kim         return_ACPI_STATUS (AE_BAD_PARAMETER);
569*a159c266SJung-uk Kim     }
570*a159c266SJung-uk Kim 
571*a159c266SJung-uk Kim     /* Various interrupt-based event counters */
572*a159c266SJung-uk Kim 
573*a159c266SJung-uk Kim     Stats->SciCount = AcpiSciCount;
574*a159c266SJung-uk Kim     Stats->GpeCount = AcpiGpeCount;
575*a159c266SJung-uk Kim 
576*a159c266SJung-uk Kim     ACPI_MEMCPY (Stats->FixedEventCount, AcpiFixedEventCount,
577*a159c266SJung-uk Kim         sizeof (AcpiFixedEventCount));
578*a159c266SJung-uk Kim 
579*a159c266SJung-uk Kim 
580*a159c266SJung-uk Kim     /* Other counters */
581*a159c266SJung-uk Kim 
582*a159c266SJung-uk Kim     Stats->MethodCount = AcpiMethodCount;
583*a159c266SJung-uk Kim 
584*a159c266SJung-uk Kim     return_ACPI_STATUS (AE_OK);
585*a159c266SJung-uk Kim }
586*a159c266SJung-uk Kim 
587*a159c266SJung-uk Kim ACPI_EXPORT_SYMBOL (AcpiGetStatistics)
588*a159c266SJung-uk Kim 
589*a159c266SJung-uk Kim 
590*a159c266SJung-uk Kim /*****************************************************************************
591*a159c266SJung-uk Kim  *
592*a159c266SJung-uk Kim  * FUNCTION:    AcpiInstallInitializationHandler
593*a159c266SJung-uk Kim  *
594*a159c266SJung-uk Kim  * PARAMETERS:  Handler             - Callback procedure
595*a159c266SJung-uk Kim  *              Function            - Not (currently) used, see below
596*a159c266SJung-uk Kim  *
597*a159c266SJung-uk Kim  * RETURN:      Status
598*a159c266SJung-uk Kim  *
599*a159c266SJung-uk Kim  * DESCRIPTION: Install an initialization handler
600*a159c266SJung-uk Kim  *
601*a159c266SJung-uk Kim  * TBD: When a second function is added, must save the Function also.
602*a159c266SJung-uk Kim  *
603*a159c266SJung-uk Kim  ****************************************************************************/
604*a159c266SJung-uk Kim 
605*a159c266SJung-uk Kim ACPI_STATUS
606*a159c266SJung-uk Kim AcpiInstallInitializationHandler (
607*a159c266SJung-uk Kim     ACPI_INIT_HANDLER       Handler,
608*a159c266SJung-uk Kim     UINT32                  Function)
609*a159c266SJung-uk Kim {
610*a159c266SJung-uk Kim 
611*a159c266SJung-uk Kim     if (!Handler)
612*a159c266SJung-uk Kim     {
613*a159c266SJung-uk Kim         return (AE_BAD_PARAMETER);
614*a159c266SJung-uk Kim     }
615*a159c266SJung-uk Kim 
616*a159c266SJung-uk Kim     if (AcpiGbl_InitHandler)
617*a159c266SJung-uk Kim     {
618*a159c266SJung-uk Kim         return (AE_ALREADY_EXISTS);
619*a159c266SJung-uk Kim     }
620*a159c266SJung-uk Kim 
621*a159c266SJung-uk Kim     AcpiGbl_InitHandler = Handler;
622*a159c266SJung-uk Kim     return AE_OK;
623*a159c266SJung-uk Kim }
624*a159c266SJung-uk Kim 
625*a159c266SJung-uk Kim ACPI_EXPORT_SYMBOL (AcpiInstallInitializationHandler)
626*a159c266SJung-uk Kim 
627*a159c266SJung-uk Kim 
628*a159c266SJung-uk Kim /*****************************************************************************
629*a159c266SJung-uk Kim  *
630*a159c266SJung-uk Kim  * FUNCTION:    AcpiPurgeCachedObjects
631*a159c266SJung-uk Kim  *
632*a159c266SJung-uk Kim  * PARAMETERS:  None
633*a159c266SJung-uk Kim  *
634*a159c266SJung-uk Kim  * RETURN:      Status
635*a159c266SJung-uk Kim  *
636*a159c266SJung-uk Kim  * DESCRIPTION: Empty all caches (delete the cached objects)
637*a159c266SJung-uk Kim  *
638*a159c266SJung-uk Kim  ****************************************************************************/
639*a159c266SJung-uk Kim 
640*a159c266SJung-uk Kim ACPI_STATUS
641*a159c266SJung-uk Kim AcpiPurgeCachedObjects (
642*a159c266SJung-uk Kim     void)
643*a159c266SJung-uk Kim {
644*a159c266SJung-uk Kim     ACPI_FUNCTION_TRACE (AcpiPurgeCachedObjects);
645*a159c266SJung-uk Kim 
646*a159c266SJung-uk Kim     (void) AcpiOsPurgeCache (AcpiGbl_StateCache);
647*a159c266SJung-uk Kim     (void) AcpiOsPurgeCache (AcpiGbl_OperandCache);
648*a159c266SJung-uk Kim     (void) AcpiOsPurgeCache (AcpiGbl_PsNodeCache);
649*a159c266SJung-uk Kim     (void) AcpiOsPurgeCache (AcpiGbl_PsNodeExtCache);
650*a159c266SJung-uk Kim     return_ACPI_STATUS (AE_OK);
651*a159c266SJung-uk Kim }
652*a159c266SJung-uk Kim 
653*a159c266SJung-uk Kim ACPI_EXPORT_SYMBOL (AcpiPurgeCachedObjects)
654*a159c266SJung-uk Kim 
655*a159c266SJung-uk Kim 
656*a159c266SJung-uk Kim /*****************************************************************************
657*a159c266SJung-uk Kim  *
658*a159c266SJung-uk Kim  * FUNCTION:    AcpiInstallInterface
659*a159c266SJung-uk Kim  *
660*a159c266SJung-uk Kim  * PARAMETERS:  InterfaceName       - The interface to install
661*a159c266SJung-uk Kim  *
662*a159c266SJung-uk Kim  * RETURN:      Status
663*a159c266SJung-uk Kim  *
664*a159c266SJung-uk Kim  * DESCRIPTION: Install an _OSI interface to the global list
665*a159c266SJung-uk Kim  *
666*a159c266SJung-uk Kim  ****************************************************************************/
667*a159c266SJung-uk Kim 
668*a159c266SJung-uk Kim ACPI_STATUS
669*a159c266SJung-uk Kim AcpiInstallInterface (
670*a159c266SJung-uk Kim     ACPI_STRING             InterfaceName)
671*a159c266SJung-uk Kim {
672*a159c266SJung-uk Kim     ACPI_STATUS             Status;
673*a159c266SJung-uk Kim     ACPI_INTERFACE_INFO     *InterfaceInfo;
674*a159c266SJung-uk Kim 
675*a159c266SJung-uk Kim 
676*a159c266SJung-uk Kim     /* Parameter validation */
677*a159c266SJung-uk Kim 
678*a159c266SJung-uk Kim     if (!InterfaceName || (ACPI_STRLEN (InterfaceName) == 0))
679*a159c266SJung-uk Kim     {
680*a159c266SJung-uk Kim         return (AE_BAD_PARAMETER);
681*a159c266SJung-uk Kim     }
682*a159c266SJung-uk Kim 
683*a159c266SJung-uk Kim     (void) AcpiOsAcquireMutex (AcpiGbl_OsiMutex, ACPI_WAIT_FOREVER);
684*a159c266SJung-uk Kim 
685*a159c266SJung-uk Kim     /* Check if the interface name is already in the global list */
686*a159c266SJung-uk Kim 
687*a159c266SJung-uk Kim     InterfaceInfo = AcpiUtGetInterface (InterfaceName);
688*a159c266SJung-uk Kim     if (InterfaceInfo)
689*a159c266SJung-uk Kim     {
690*a159c266SJung-uk Kim         /*
691*a159c266SJung-uk Kim          * The interface already exists in the list. This is OK if the
692*a159c266SJung-uk Kim          * interface has been marked invalid -- just clear the bit.
693*a159c266SJung-uk Kim          */
694*a159c266SJung-uk Kim         if (InterfaceInfo->Flags & ACPI_OSI_INVALID)
695*a159c266SJung-uk Kim         {
696*a159c266SJung-uk Kim             InterfaceInfo->Flags &= ~ACPI_OSI_INVALID;
697*a159c266SJung-uk Kim             Status = AE_OK;
698*a159c266SJung-uk Kim         }
699*a159c266SJung-uk Kim         else
700*a159c266SJung-uk Kim         {
701*a159c266SJung-uk Kim             Status = AE_ALREADY_EXISTS;
702*a159c266SJung-uk Kim         }
703*a159c266SJung-uk Kim     }
704*a159c266SJung-uk Kim     else
705*a159c266SJung-uk Kim     {
706*a159c266SJung-uk Kim         /* New interface name, install into the global list */
707*a159c266SJung-uk Kim 
708*a159c266SJung-uk Kim         Status = AcpiUtInstallInterface (InterfaceName);
709*a159c266SJung-uk Kim     }
710*a159c266SJung-uk Kim 
711*a159c266SJung-uk Kim     AcpiOsReleaseMutex (AcpiGbl_OsiMutex);
712*a159c266SJung-uk Kim     return (Status);
713*a159c266SJung-uk Kim }
714*a159c266SJung-uk Kim 
715*a159c266SJung-uk Kim ACPI_EXPORT_SYMBOL (AcpiInstallInterface)
716*a159c266SJung-uk Kim 
717*a159c266SJung-uk Kim 
718*a159c266SJung-uk Kim /*****************************************************************************
719*a159c266SJung-uk Kim  *
720*a159c266SJung-uk Kim  * FUNCTION:    AcpiRemoveInterface
721*a159c266SJung-uk Kim  *
722*a159c266SJung-uk Kim  * PARAMETERS:  InterfaceName       - The interface to remove
723*a159c266SJung-uk Kim  *
724*a159c266SJung-uk Kim  * RETURN:      Status
725*a159c266SJung-uk Kim  *
726*a159c266SJung-uk Kim  * DESCRIPTION: Remove an _OSI interface from the global list
727*a159c266SJung-uk Kim  *
728*a159c266SJung-uk Kim  ****************************************************************************/
729*a159c266SJung-uk Kim 
730*a159c266SJung-uk Kim ACPI_STATUS
731*a159c266SJung-uk Kim AcpiRemoveInterface (
732*a159c266SJung-uk Kim     ACPI_STRING             InterfaceName)
733*a159c266SJung-uk Kim {
734*a159c266SJung-uk Kim     ACPI_STATUS             Status;
735*a159c266SJung-uk Kim 
736*a159c266SJung-uk Kim 
737*a159c266SJung-uk Kim     /* Parameter validation */
738*a159c266SJung-uk Kim 
739*a159c266SJung-uk Kim     if (!InterfaceName || (ACPI_STRLEN (InterfaceName) == 0))
740*a159c266SJung-uk Kim     {
741*a159c266SJung-uk Kim         return (AE_BAD_PARAMETER);
742*a159c266SJung-uk Kim     }
743*a159c266SJung-uk Kim 
744*a159c266SJung-uk Kim     (void) AcpiOsAcquireMutex (AcpiGbl_OsiMutex, ACPI_WAIT_FOREVER);
745*a159c266SJung-uk Kim 
746*a159c266SJung-uk Kim     Status = AcpiUtRemoveInterface (InterfaceName);
747*a159c266SJung-uk Kim 
748*a159c266SJung-uk Kim     AcpiOsReleaseMutex (AcpiGbl_OsiMutex);
749*a159c266SJung-uk Kim     return (Status);
750*a159c266SJung-uk Kim }
751*a159c266SJung-uk Kim 
752*a159c266SJung-uk Kim ACPI_EXPORT_SYMBOL (AcpiRemoveInterface)
753*a159c266SJung-uk Kim 
754*a159c266SJung-uk Kim 
755*a159c266SJung-uk Kim /*****************************************************************************
756*a159c266SJung-uk Kim  *
757*a159c266SJung-uk Kim  * FUNCTION:    AcpiInstallInterfaceHandler
758*a159c266SJung-uk Kim  *
759*a159c266SJung-uk Kim  * PARAMETERS:  Handler             - The _OSI interface handler to install
760*a159c266SJung-uk Kim  *                                    NULL means "remove existing handler"
761*a159c266SJung-uk Kim  *
762*a159c266SJung-uk Kim  * RETURN:      Status
763*a159c266SJung-uk Kim  *
764*a159c266SJung-uk Kim  * DESCRIPTION: Install a handler for the predefined _OSI ACPI method.
765*a159c266SJung-uk Kim  *              invoked during execution of the internal implementation of
766*a159c266SJung-uk Kim  *              _OSI. A NULL handler simply removes any existing handler.
767*a159c266SJung-uk Kim  *
768*a159c266SJung-uk Kim  ****************************************************************************/
769*a159c266SJung-uk Kim 
770*a159c266SJung-uk Kim ACPI_STATUS
771*a159c266SJung-uk Kim AcpiInstallInterfaceHandler (
772*a159c266SJung-uk Kim     ACPI_INTERFACE_HANDLER  Handler)
773*a159c266SJung-uk Kim {
774*a159c266SJung-uk Kim     ACPI_STATUS             Status = AE_OK;
775*a159c266SJung-uk Kim 
776*a159c266SJung-uk Kim 
777*a159c266SJung-uk Kim     (void) AcpiOsAcquireMutex (AcpiGbl_OsiMutex, ACPI_WAIT_FOREVER);
778*a159c266SJung-uk Kim 
779*a159c266SJung-uk Kim     if (Handler && AcpiGbl_InterfaceHandler)
780*a159c266SJung-uk Kim     {
781*a159c266SJung-uk Kim         Status = AE_ALREADY_EXISTS;
782*a159c266SJung-uk Kim     }
783*a159c266SJung-uk Kim     else
784*a159c266SJung-uk Kim     {
785*a159c266SJung-uk Kim         AcpiGbl_InterfaceHandler = Handler;
786*a159c266SJung-uk Kim     }
787*a159c266SJung-uk Kim 
788*a159c266SJung-uk Kim     AcpiOsReleaseMutex (AcpiGbl_OsiMutex);
789*a159c266SJung-uk Kim     return (Status);
790*a159c266SJung-uk Kim }
791*a159c266SJung-uk Kim 
792*a159c266SJung-uk Kim ACPI_EXPORT_SYMBOL (AcpiInstallInterfaceHandler)
793*a159c266SJung-uk Kim 
794*a159c266SJung-uk Kim 
795*a159c266SJung-uk Kim /*****************************************************************************
796*a159c266SJung-uk Kim  *
797*a159c266SJung-uk Kim  * FUNCTION:    AcpiCheckAddressRange
798*a159c266SJung-uk Kim  *
799*a159c266SJung-uk Kim  * PARAMETERS:  SpaceId             - Address space ID
800*a159c266SJung-uk Kim  *              Address             - Start address
801*a159c266SJung-uk Kim  *              Length              - Length
802*a159c266SJung-uk Kim  *              Warn                - TRUE if warning on overlap desired
803*a159c266SJung-uk Kim  *
804*a159c266SJung-uk Kim  * RETURN:      Count of the number of conflicts detected.
805*a159c266SJung-uk Kim  *
806*a159c266SJung-uk Kim  * DESCRIPTION: Check if the input address range overlaps any of the
807*a159c266SJung-uk Kim  *              ASL operation region address ranges.
808*a159c266SJung-uk Kim  *
809*a159c266SJung-uk Kim  ****************************************************************************/
810*a159c266SJung-uk Kim 
811*a159c266SJung-uk Kim UINT32
812*a159c266SJung-uk Kim AcpiCheckAddressRange (
813*a159c266SJung-uk Kim     ACPI_ADR_SPACE_TYPE     SpaceId,
814*a159c266SJung-uk Kim     ACPI_PHYSICAL_ADDRESS   Address,
815*a159c266SJung-uk Kim     ACPI_SIZE               Length,
816*a159c266SJung-uk Kim     BOOLEAN                 Warn)
817*a159c266SJung-uk Kim {
818*a159c266SJung-uk Kim     UINT32                  Overlaps;
819*a159c266SJung-uk Kim     ACPI_STATUS             Status;
820*a159c266SJung-uk Kim 
821*a159c266SJung-uk Kim 
822*a159c266SJung-uk Kim     Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE);
823*a159c266SJung-uk Kim     if (ACPI_FAILURE (Status))
824*a159c266SJung-uk Kim     {
825*a159c266SJung-uk Kim         return (0);
826*a159c266SJung-uk Kim     }
827*a159c266SJung-uk Kim 
828*a159c266SJung-uk Kim     Overlaps = AcpiUtCheckAddressRange (SpaceId, Address,
829*a159c266SJung-uk Kim         (UINT32) Length, Warn);
830*a159c266SJung-uk Kim 
831*a159c266SJung-uk Kim     (void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE);
832*a159c266SJung-uk Kim     return (Overlaps);
833*a159c266SJung-uk Kim }
834*a159c266SJung-uk Kim 
835*a159c266SJung-uk Kim ACPI_EXPORT_SYMBOL (AcpiCheckAddressRange)
836*a159c266SJung-uk Kim 
837*a159c266SJung-uk Kim #endif /* !ACPI_ASL_COMPILER */
838