1*385cc6b4SJerry Jelinek /******************************************************************************
2*385cc6b4SJerry Jelinek *
3*385cc6b4SJerry Jelinek * Module Name: utxfinit - External interfaces for ACPICA initialization
4*385cc6b4SJerry Jelinek *
5*385cc6b4SJerry Jelinek *****************************************************************************/
6*385cc6b4SJerry Jelinek
7*385cc6b4SJerry Jelinek /*
8*385cc6b4SJerry Jelinek * Copyright (C) 2000 - 2016, Intel Corp.
9*385cc6b4SJerry Jelinek * All rights reserved.
10*385cc6b4SJerry Jelinek *
11*385cc6b4SJerry Jelinek * Redistribution and use in source and binary forms, with or without
12*385cc6b4SJerry Jelinek * modification, are permitted provided that the following conditions
13*385cc6b4SJerry Jelinek * are met:
14*385cc6b4SJerry Jelinek * 1. Redistributions of source code must retain the above copyright
15*385cc6b4SJerry Jelinek * notice, this list of conditions, and the following disclaimer,
16*385cc6b4SJerry Jelinek * without modification.
17*385cc6b4SJerry Jelinek * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18*385cc6b4SJerry Jelinek * substantially similar to the "NO WARRANTY" disclaimer below
19*385cc6b4SJerry Jelinek * ("Disclaimer") and any redistribution must be conditioned upon
20*385cc6b4SJerry Jelinek * including a substantially similar Disclaimer requirement for further
21*385cc6b4SJerry Jelinek * binary redistribution.
22*385cc6b4SJerry Jelinek * 3. Neither the names of the above-listed copyright holders nor the names
23*385cc6b4SJerry Jelinek * of any contributors may be used to endorse or promote products derived
24*385cc6b4SJerry Jelinek * from this software without specific prior written permission.
25*385cc6b4SJerry Jelinek *
26*385cc6b4SJerry Jelinek * Alternatively, this software may be distributed under the terms of the
27*385cc6b4SJerry Jelinek * GNU General Public License ("GPL") version 2 as published by the Free
28*385cc6b4SJerry Jelinek * Software Foundation.
29*385cc6b4SJerry Jelinek *
30*385cc6b4SJerry Jelinek * NO WARRANTY
31*385cc6b4SJerry Jelinek * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32*385cc6b4SJerry Jelinek * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33*385cc6b4SJerry Jelinek * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34*385cc6b4SJerry Jelinek * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35*385cc6b4SJerry Jelinek * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36*385cc6b4SJerry Jelinek * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37*385cc6b4SJerry Jelinek * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38*385cc6b4SJerry Jelinek * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39*385cc6b4SJerry Jelinek * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40*385cc6b4SJerry Jelinek * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41*385cc6b4SJerry Jelinek * POSSIBILITY OF SUCH DAMAGES.
42*385cc6b4SJerry Jelinek */
43*385cc6b4SJerry Jelinek
44*385cc6b4SJerry Jelinek #define EXPORT_ACPI_INTERFACES
45*385cc6b4SJerry Jelinek
46*385cc6b4SJerry Jelinek #include "acpi.h"
47*385cc6b4SJerry Jelinek #include "accommon.h"
48*385cc6b4SJerry Jelinek #include "acevents.h"
49*385cc6b4SJerry Jelinek #include "acnamesp.h"
50*385cc6b4SJerry Jelinek #include "acdebug.h"
51*385cc6b4SJerry Jelinek #include "actables.h"
52*385cc6b4SJerry Jelinek
53*385cc6b4SJerry Jelinek #define _COMPONENT ACPI_UTILITIES
54*385cc6b4SJerry Jelinek ACPI_MODULE_NAME ("utxfinit")
55*385cc6b4SJerry Jelinek
56*385cc6b4SJerry Jelinek /* For AcpiExec only */
57*385cc6b4SJerry Jelinek void
58*385cc6b4SJerry Jelinek AeDoObjectOverrides (
59*385cc6b4SJerry Jelinek void);
60*385cc6b4SJerry Jelinek
61*385cc6b4SJerry Jelinek
62*385cc6b4SJerry Jelinek /*******************************************************************************
63*385cc6b4SJerry Jelinek *
64*385cc6b4SJerry Jelinek * FUNCTION: AcpiInitializeSubsystem
65*385cc6b4SJerry Jelinek *
66*385cc6b4SJerry Jelinek * PARAMETERS: None
67*385cc6b4SJerry Jelinek *
68*385cc6b4SJerry Jelinek * RETURN: Status
69*385cc6b4SJerry Jelinek *
70*385cc6b4SJerry Jelinek * DESCRIPTION: Initializes all global variables. This is the first function
71*385cc6b4SJerry Jelinek * called, so any early initialization belongs here.
72*385cc6b4SJerry Jelinek *
73*385cc6b4SJerry Jelinek ******************************************************************************/
74*385cc6b4SJerry Jelinek
75*385cc6b4SJerry Jelinek ACPI_STATUS
AcpiInitializeSubsystem(void)76*385cc6b4SJerry Jelinek AcpiInitializeSubsystem (
77*385cc6b4SJerry Jelinek void)
78*385cc6b4SJerry Jelinek {
79*385cc6b4SJerry Jelinek ACPI_STATUS Status;
80*385cc6b4SJerry Jelinek
81*385cc6b4SJerry Jelinek
82*385cc6b4SJerry Jelinek ACPI_FUNCTION_TRACE (AcpiInitializeSubsystem);
83*385cc6b4SJerry Jelinek
84*385cc6b4SJerry Jelinek
85*385cc6b4SJerry Jelinek AcpiGbl_StartupFlags = ACPI_SUBSYSTEM_INITIALIZE;
86*385cc6b4SJerry Jelinek ACPI_DEBUG_EXEC (AcpiUtInitStackPtrTrace ());
87*385cc6b4SJerry Jelinek
88*385cc6b4SJerry Jelinek /* Initialize the OS-Dependent layer */
89*385cc6b4SJerry Jelinek
90*385cc6b4SJerry Jelinek Status = AcpiOsInitialize ();
91*385cc6b4SJerry Jelinek if (ACPI_FAILURE (Status))
92*385cc6b4SJerry Jelinek {
93*385cc6b4SJerry Jelinek ACPI_EXCEPTION ((AE_INFO, Status, "During OSL initialization"));
94*385cc6b4SJerry Jelinek return_ACPI_STATUS (Status);
95*385cc6b4SJerry Jelinek }
96*385cc6b4SJerry Jelinek
97*385cc6b4SJerry Jelinek /* Initialize all globals used by the subsystem */
98*385cc6b4SJerry Jelinek
99*385cc6b4SJerry Jelinek Status = AcpiUtInitGlobals ();
100*385cc6b4SJerry Jelinek if (ACPI_FAILURE (Status))
101*385cc6b4SJerry Jelinek {
102*385cc6b4SJerry Jelinek ACPI_EXCEPTION ((AE_INFO, Status, "During initialization of globals"));
103*385cc6b4SJerry Jelinek return_ACPI_STATUS (Status);
104*385cc6b4SJerry Jelinek }
105*385cc6b4SJerry Jelinek
106*385cc6b4SJerry Jelinek /* Create the default mutex objects */
107*385cc6b4SJerry Jelinek
108*385cc6b4SJerry Jelinek Status = AcpiUtMutexInitialize ();
109*385cc6b4SJerry Jelinek if (ACPI_FAILURE (Status))
110*385cc6b4SJerry Jelinek {
111*385cc6b4SJerry Jelinek ACPI_EXCEPTION ((AE_INFO, Status, "During Global Mutex creation"));
112*385cc6b4SJerry Jelinek return_ACPI_STATUS (Status);
113*385cc6b4SJerry Jelinek }
114*385cc6b4SJerry Jelinek
115*385cc6b4SJerry Jelinek /*
116*385cc6b4SJerry Jelinek * Initialize the namespace manager and
117*385cc6b4SJerry Jelinek * the root of the namespace tree
118*385cc6b4SJerry Jelinek */
119*385cc6b4SJerry Jelinek Status = AcpiNsRootInitialize ();
120*385cc6b4SJerry Jelinek if (ACPI_FAILURE (Status))
121*385cc6b4SJerry Jelinek {
122*385cc6b4SJerry Jelinek ACPI_EXCEPTION ((AE_INFO, Status, "During Namespace initialization"));
123*385cc6b4SJerry Jelinek return_ACPI_STATUS (Status);
124*385cc6b4SJerry Jelinek }
125*385cc6b4SJerry Jelinek
126*385cc6b4SJerry Jelinek /* Initialize the global OSI interfaces list with the static names */
127*385cc6b4SJerry Jelinek
128*385cc6b4SJerry Jelinek Status = AcpiUtInitializeInterfaces ();
129*385cc6b4SJerry Jelinek if (ACPI_FAILURE (Status))
130*385cc6b4SJerry Jelinek {
131*385cc6b4SJerry Jelinek ACPI_EXCEPTION ((AE_INFO, Status, "During OSI interfaces initialization"));
132*385cc6b4SJerry Jelinek return_ACPI_STATUS (Status);
133*385cc6b4SJerry Jelinek }
134*385cc6b4SJerry Jelinek
135*385cc6b4SJerry Jelinek return_ACPI_STATUS (AE_OK);
136*385cc6b4SJerry Jelinek }
137*385cc6b4SJerry Jelinek
ACPI_EXPORT_SYMBOL_INIT(AcpiInitializeSubsystem)138*385cc6b4SJerry Jelinek ACPI_EXPORT_SYMBOL_INIT (AcpiInitializeSubsystem)
139*385cc6b4SJerry Jelinek
140*385cc6b4SJerry Jelinek
141*385cc6b4SJerry Jelinek /*******************************************************************************
142*385cc6b4SJerry Jelinek *
143*385cc6b4SJerry Jelinek * FUNCTION: AcpiEnableSubsystem
144*385cc6b4SJerry Jelinek *
145*385cc6b4SJerry Jelinek * PARAMETERS: Flags - Init/enable Options
146*385cc6b4SJerry Jelinek *
147*385cc6b4SJerry Jelinek * RETURN: Status
148*385cc6b4SJerry Jelinek *
149*385cc6b4SJerry Jelinek * DESCRIPTION: Completes the subsystem initialization including hardware.
150*385cc6b4SJerry Jelinek * Puts system into ACPI mode if it isn't already.
151*385cc6b4SJerry Jelinek *
152*385cc6b4SJerry Jelinek ******************************************************************************/
153*385cc6b4SJerry Jelinek
154*385cc6b4SJerry Jelinek ACPI_STATUS
155*385cc6b4SJerry Jelinek AcpiEnableSubsystem (
156*385cc6b4SJerry Jelinek UINT32 Flags)
157*385cc6b4SJerry Jelinek {
158*385cc6b4SJerry Jelinek ACPI_STATUS Status = AE_OK;
159*385cc6b4SJerry Jelinek
160*385cc6b4SJerry Jelinek
161*385cc6b4SJerry Jelinek ACPI_FUNCTION_TRACE (AcpiEnableSubsystem);
162*385cc6b4SJerry Jelinek
163*385cc6b4SJerry Jelinek
164*385cc6b4SJerry Jelinek /*
165*385cc6b4SJerry Jelinek * The early initialization phase is complete. The namespace is loaded,
166*385cc6b4SJerry Jelinek * and we can now support address spaces other than Memory, I/O, and
167*385cc6b4SJerry Jelinek * PCI_Config.
168*385cc6b4SJerry Jelinek */
169*385cc6b4SJerry Jelinek AcpiGbl_EarlyInitialization = FALSE;
170*385cc6b4SJerry Jelinek
171*385cc6b4SJerry Jelinek #if (!ACPI_REDUCED_HARDWARE)
172*385cc6b4SJerry Jelinek
173*385cc6b4SJerry Jelinek /* Enable ACPI mode */
174*385cc6b4SJerry Jelinek
175*385cc6b4SJerry Jelinek if (!(Flags & ACPI_NO_ACPI_ENABLE))
176*385cc6b4SJerry Jelinek {
177*385cc6b4SJerry Jelinek ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "[Init] Going into ACPI mode\n"));
178*385cc6b4SJerry Jelinek
179*385cc6b4SJerry Jelinek AcpiGbl_OriginalMode = AcpiHwGetMode();
180*385cc6b4SJerry Jelinek
181*385cc6b4SJerry Jelinek Status = AcpiEnable ();
182*385cc6b4SJerry Jelinek if (ACPI_FAILURE (Status))
183*385cc6b4SJerry Jelinek {
184*385cc6b4SJerry Jelinek ACPI_WARNING ((AE_INFO, "AcpiEnable failed"));
185*385cc6b4SJerry Jelinek return_ACPI_STATUS (Status);
186*385cc6b4SJerry Jelinek }
187*385cc6b4SJerry Jelinek }
188*385cc6b4SJerry Jelinek
189*385cc6b4SJerry Jelinek /*
190*385cc6b4SJerry Jelinek * Obtain a permanent mapping for the FACS. This is required for the
191*385cc6b4SJerry Jelinek * Global Lock and the Firmware Waking Vector
192*385cc6b4SJerry Jelinek */
193*385cc6b4SJerry Jelinek if (!(Flags & ACPI_NO_FACS_INIT))
194*385cc6b4SJerry Jelinek {
195*385cc6b4SJerry Jelinek Status = AcpiTbInitializeFacs ();
196*385cc6b4SJerry Jelinek if (ACPI_FAILURE (Status))
197*385cc6b4SJerry Jelinek {
198*385cc6b4SJerry Jelinek ACPI_WARNING ((AE_INFO, "Could not map the FACS table"));
199*385cc6b4SJerry Jelinek return_ACPI_STATUS (Status);
200*385cc6b4SJerry Jelinek }
201*385cc6b4SJerry Jelinek }
202*385cc6b4SJerry Jelinek
203*385cc6b4SJerry Jelinek /*
204*385cc6b4SJerry Jelinek * Initialize ACPI Event handling (Fixed and General Purpose)
205*385cc6b4SJerry Jelinek *
206*385cc6b4SJerry Jelinek * Note1: We must have the hardware and events initialized before we can
207*385cc6b4SJerry Jelinek * execute any control methods safely. Any control method can require
208*385cc6b4SJerry Jelinek * ACPI hardware support, so the hardware must be fully initialized before
209*385cc6b4SJerry Jelinek * any method execution!
210*385cc6b4SJerry Jelinek *
211*385cc6b4SJerry Jelinek * Note2: Fixed events are initialized and enabled here. GPEs are
212*385cc6b4SJerry Jelinek * initialized, but cannot be enabled until after the hardware is
213*385cc6b4SJerry Jelinek * completely initialized (SCI and GlobalLock activated) and the various
214*385cc6b4SJerry Jelinek * initialization control methods are run (_REG, _STA, _INI) on the
215*385cc6b4SJerry Jelinek * entire namespace.
216*385cc6b4SJerry Jelinek */
217*385cc6b4SJerry Jelinek if (!(Flags & ACPI_NO_EVENT_INIT))
218*385cc6b4SJerry Jelinek {
219*385cc6b4SJerry Jelinek ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
220*385cc6b4SJerry Jelinek "[Init] Initializing ACPI events\n"));
221*385cc6b4SJerry Jelinek
222*385cc6b4SJerry Jelinek Status = AcpiEvInitializeEvents ();
223*385cc6b4SJerry Jelinek if (ACPI_FAILURE (Status))
224*385cc6b4SJerry Jelinek {
225*385cc6b4SJerry Jelinek return_ACPI_STATUS (Status);
226*385cc6b4SJerry Jelinek }
227*385cc6b4SJerry Jelinek }
228*385cc6b4SJerry Jelinek
229*385cc6b4SJerry Jelinek /*
230*385cc6b4SJerry Jelinek * Install the SCI handler and Global Lock handler. This completes the
231*385cc6b4SJerry Jelinek * hardware initialization.
232*385cc6b4SJerry Jelinek */
233*385cc6b4SJerry Jelinek if (!(Flags & ACPI_NO_HANDLER_INIT))
234*385cc6b4SJerry Jelinek {
235*385cc6b4SJerry Jelinek ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
236*385cc6b4SJerry Jelinek "[Init] Installing SCI/GL handlers\n"));
237*385cc6b4SJerry Jelinek
238*385cc6b4SJerry Jelinek Status = AcpiEvInstallXruptHandlers ();
239*385cc6b4SJerry Jelinek if (ACPI_FAILURE (Status))
240*385cc6b4SJerry Jelinek {
241*385cc6b4SJerry Jelinek return_ACPI_STATUS (Status);
242*385cc6b4SJerry Jelinek }
243*385cc6b4SJerry Jelinek }
244*385cc6b4SJerry Jelinek
245*385cc6b4SJerry Jelinek #endif /* !ACPI_REDUCED_HARDWARE */
246*385cc6b4SJerry Jelinek
247*385cc6b4SJerry Jelinek return_ACPI_STATUS (Status);
248*385cc6b4SJerry Jelinek }
249*385cc6b4SJerry Jelinek
ACPI_EXPORT_SYMBOL_INIT(AcpiEnableSubsystem)250*385cc6b4SJerry Jelinek ACPI_EXPORT_SYMBOL_INIT (AcpiEnableSubsystem)
251*385cc6b4SJerry Jelinek
252*385cc6b4SJerry Jelinek
253*385cc6b4SJerry Jelinek /*******************************************************************************
254*385cc6b4SJerry Jelinek *
255*385cc6b4SJerry Jelinek * FUNCTION: AcpiInitializeObjects
256*385cc6b4SJerry Jelinek *
257*385cc6b4SJerry Jelinek * PARAMETERS: Flags - Init/enable Options
258*385cc6b4SJerry Jelinek *
259*385cc6b4SJerry Jelinek * RETURN: Status
260*385cc6b4SJerry Jelinek *
261*385cc6b4SJerry Jelinek * DESCRIPTION: Completes namespace initialization by initializing device
262*385cc6b4SJerry Jelinek * objects and executing AML code for Regions, buffers, etc.
263*385cc6b4SJerry Jelinek *
264*385cc6b4SJerry Jelinek ******************************************************************************/
265*385cc6b4SJerry Jelinek
266*385cc6b4SJerry Jelinek ACPI_STATUS
267*385cc6b4SJerry Jelinek AcpiInitializeObjects (
268*385cc6b4SJerry Jelinek UINT32 Flags)
269*385cc6b4SJerry Jelinek {
270*385cc6b4SJerry Jelinek ACPI_STATUS Status = AE_OK;
271*385cc6b4SJerry Jelinek
272*385cc6b4SJerry Jelinek
273*385cc6b4SJerry Jelinek ACPI_FUNCTION_TRACE (AcpiInitializeObjects);
274*385cc6b4SJerry Jelinek
275*385cc6b4SJerry Jelinek
276*385cc6b4SJerry Jelinek #ifdef ACPI_EXEC_APP
277*385cc6b4SJerry Jelinek /*
278*385cc6b4SJerry Jelinek * This call implements the "initialization file" option for AcpiExec.
279*385cc6b4SJerry Jelinek * This is the precise point that we want to perform the overrides.
280*385cc6b4SJerry Jelinek */
281*385cc6b4SJerry Jelinek AeDoObjectOverrides ();
282*385cc6b4SJerry Jelinek #endif
283*385cc6b4SJerry Jelinek
284*385cc6b4SJerry Jelinek /*
285*385cc6b4SJerry Jelinek * Execute any module-level code that was detected during the table load
286*385cc6b4SJerry Jelinek * phase. Although illegal since ACPI 2.0, there are many machines that
287*385cc6b4SJerry Jelinek * contain this type of code. Each block of detected executable AML code
288*385cc6b4SJerry Jelinek * outside of any control method is wrapped with a temporary control
289*385cc6b4SJerry Jelinek * method object and placed on a global list. The methods on this list
290*385cc6b4SJerry Jelinek * are executed below.
291*385cc6b4SJerry Jelinek *
292*385cc6b4SJerry Jelinek * This case executes the module-level code for all tables only after
293*385cc6b4SJerry Jelinek * all of the tables have been loaded. It is a legacy option and is
294*385cc6b4SJerry Jelinek * not compatible with other ACPI implementations. See AcpiNsLoadTable.
295*385cc6b4SJerry Jelinek */
296*385cc6b4SJerry Jelinek if (AcpiGbl_GroupModuleLevelCode)
297*385cc6b4SJerry Jelinek {
298*385cc6b4SJerry Jelinek AcpiNsExecModuleCodeList ();
299*385cc6b4SJerry Jelinek
300*385cc6b4SJerry Jelinek /*
301*385cc6b4SJerry Jelinek * Initialize the objects that remain uninitialized. This
302*385cc6b4SJerry Jelinek * runs the executable AML that may be part of the
303*385cc6b4SJerry Jelinek * declaration of these objects:
304*385cc6b4SJerry Jelinek * OperationRegions, BufferFields, Buffers, and Packages.
305*385cc6b4SJerry Jelinek */
306*385cc6b4SJerry Jelinek if (!(Flags & ACPI_NO_OBJECT_INIT))
307*385cc6b4SJerry Jelinek {
308*385cc6b4SJerry Jelinek Status = AcpiNsInitializeObjects ();
309*385cc6b4SJerry Jelinek if (ACPI_FAILURE (Status))
310*385cc6b4SJerry Jelinek {
311*385cc6b4SJerry Jelinek return_ACPI_STATUS (Status);
312*385cc6b4SJerry Jelinek }
313*385cc6b4SJerry Jelinek }
314*385cc6b4SJerry Jelinek }
315*385cc6b4SJerry Jelinek
316*385cc6b4SJerry Jelinek /*
317*385cc6b4SJerry Jelinek * Initialize all device/region objects in the namespace. This runs
318*385cc6b4SJerry Jelinek * the device _STA and _INI methods and region _REG methods.
319*385cc6b4SJerry Jelinek */
320*385cc6b4SJerry Jelinek if (!(Flags & (ACPI_NO_DEVICE_INIT | ACPI_NO_ADDRESS_SPACE_INIT)))
321*385cc6b4SJerry Jelinek {
322*385cc6b4SJerry Jelinek Status = AcpiNsInitializeDevices (Flags);
323*385cc6b4SJerry Jelinek if (ACPI_FAILURE (Status))
324*385cc6b4SJerry Jelinek {
325*385cc6b4SJerry Jelinek return_ACPI_STATUS (Status);
326*385cc6b4SJerry Jelinek }
327*385cc6b4SJerry Jelinek }
328*385cc6b4SJerry Jelinek
329*385cc6b4SJerry Jelinek /*
330*385cc6b4SJerry Jelinek * Empty the caches (delete the cached objects) on the assumption that
331*385cc6b4SJerry Jelinek * the table load filled them up more than they will be at runtime --
332*385cc6b4SJerry Jelinek * thus wasting non-paged memory.
333*385cc6b4SJerry Jelinek */
334*385cc6b4SJerry Jelinek Status = AcpiPurgeCachedObjects ();
335*385cc6b4SJerry Jelinek
336*385cc6b4SJerry Jelinek AcpiGbl_StartupFlags |= ACPI_INITIALIZED_OK;
337*385cc6b4SJerry Jelinek return_ACPI_STATUS (Status);
338*385cc6b4SJerry Jelinek }
339*385cc6b4SJerry Jelinek
340*385cc6b4SJerry Jelinek ACPI_EXPORT_SYMBOL_INIT (AcpiInitializeObjects)
341