1 /******************************************************************************
3 * Module Name: utxfinit - External interfaces for ACPICA initialization
5 *****************************************************************************/
8 * Copyright (C) 2000 - 2016, Intel Corp.
11 * Redistribution and use in source and binary forms, with or without
12 * modification, are permitted provided that the following conditions
14 * 1. Redistributions of source code must retain the above copyright
15 * notice, this list of conditions, and the following disclaimer,
16 * without modification.
17 * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18 * substantially similar to the "NO WARRANTY" disclaimer below
19 * ("Disclaimer") and any redistribution must be conditioned upon
20 * including a substantially similar Disclaimer requirement for further
21 * binary redistribution.
22 * 3. Neither the names of the above-listed copyright holders nor the names
23 * of any contributors may be used to endorse or promote products derived
24 * from this software without specific prior written permission.
26 * Alternatively, this software may be distributed under the terms of the
27 * GNU General Public License ("GPL") version 2 as published by the Free
28 * Software Foundation.
31 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41 * POSSIBILITY OF SUCH DAMAGES.
44 #define EXPORT_ACPI_INTERFACES
53 #define _COMPONENT ACPI_UTILITIES
54 ACPI_MODULE_NAME ("utxfinit")
56 /* For AcpiExec only */
62 /*******************************************************************************
64 * FUNCTION: AcpiInitializeSubsystem
70 * DESCRIPTION: Initializes all global variables. This is the first function
71 * called, so any early initialization belongs here.
73 ******************************************************************************/
76 AcpiInitializeSubsystem (
82 ACPI_FUNCTION_TRACE (AcpiInitializeSubsystem
);
85 AcpiGbl_StartupFlags
= ACPI_SUBSYSTEM_INITIALIZE
;
86 ACPI_DEBUG_EXEC (AcpiUtInitStackPtrTrace ());
88 /* Initialize the OS-Dependent layer */
90 Status
= AcpiOsInitialize ();
91 if (ACPI_FAILURE (Status
))
93 ACPI_EXCEPTION ((AE_INFO
, Status
, "During OSL initialization"));
94 return_ACPI_STATUS (Status
);
97 /* Initialize all globals used by the subsystem */
99 Status
= AcpiUtInitGlobals ();
100 if (ACPI_FAILURE (Status
))
102 ACPI_EXCEPTION ((AE_INFO
, Status
, "During initialization of globals"));
103 return_ACPI_STATUS (Status
);
106 /* Create the default mutex objects */
108 Status
= AcpiUtMutexInitialize ();
109 if (ACPI_FAILURE (Status
))
111 ACPI_EXCEPTION ((AE_INFO
, Status
, "During Global Mutex creation"));
112 return_ACPI_STATUS (Status
);
116 * Initialize the namespace manager and
117 * the root of the namespace tree
119 Status
= AcpiNsRootInitialize ();
120 if (ACPI_FAILURE (Status
))
122 ACPI_EXCEPTION ((AE_INFO
, Status
, "During Namespace initialization"));
123 return_ACPI_STATUS (Status
);
126 /* Initialize the global OSI interfaces list with the static names */
128 Status
= AcpiUtInitializeInterfaces ();
129 if (ACPI_FAILURE (Status
))
131 ACPI_EXCEPTION ((AE_INFO
, Status
, "During OSI interfaces initialization"));
132 return_ACPI_STATUS (Status
);
135 return_ACPI_STATUS (AE_OK
);
138 ACPI_EXPORT_SYMBOL_INIT (AcpiInitializeSubsystem
)
141 /*******************************************************************************
143 * FUNCTION: AcpiEnableSubsystem
145 * PARAMETERS: Flags - Init/enable Options
149 * DESCRIPTION: Completes the subsystem initialization including hardware.
150 * Puts system into ACPI mode if it isn't already.
152 ******************************************************************************/
155 AcpiEnableSubsystem (
158 ACPI_STATUS Status
= AE_OK
;
161 ACPI_FUNCTION_TRACE (AcpiEnableSubsystem
);
165 * The early initialization phase is complete. The namespace is loaded,
166 * and we can now support address spaces other than Memory, I/O, and
169 AcpiGbl_EarlyInitialization
= FALSE
;
171 #if (!ACPI_REDUCED_HARDWARE)
173 /* Enable ACPI mode */
175 if (!(Flags
& ACPI_NO_ACPI_ENABLE
))
177 ACPI_DEBUG_PRINT ((ACPI_DB_EXEC
, "[Init] Going into ACPI mode\n"));
179 AcpiGbl_OriginalMode
= AcpiHwGetMode();
181 Status
= AcpiEnable ();
182 if (ACPI_FAILURE (Status
))
184 ACPI_WARNING ((AE_INFO
, "AcpiEnable failed"));
185 return_ACPI_STATUS (Status
);
190 * Obtain a permanent mapping for the FACS. This is required for the
191 * Global Lock and the Firmware Waking Vector
193 if (!(Flags
& ACPI_NO_FACS_INIT
))
195 Status
= AcpiTbInitializeFacs ();
196 if (ACPI_FAILURE (Status
))
198 ACPI_WARNING ((AE_INFO
, "Could not map the FACS table"));
199 return_ACPI_STATUS (Status
);
204 * Initialize ACPI Event handling (Fixed and General Purpose)
206 * Note1: We must have the hardware and events initialized before we can
207 * execute any control methods safely. Any control method can require
208 * ACPI hardware support, so the hardware must be fully initialized before
209 * any method execution!
211 * Note2: Fixed events are initialized and enabled here. GPEs are
212 * initialized, but cannot be enabled until after the hardware is
213 * completely initialized (SCI and GlobalLock activated) and the various
214 * initialization control methods are run (_REG, _STA, _INI) on the
217 if (!(Flags
& ACPI_NO_EVENT_INIT
))
219 ACPI_DEBUG_PRINT ((ACPI_DB_EXEC
,
220 "[Init] Initializing ACPI events\n"));
222 Status
= AcpiEvInitializeEvents ();
223 if (ACPI_FAILURE (Status
))
225 return_ACPI_STATUS (Status
);
230 * Install the SCI handler and Global Lock handler. This completes the
231 * hardware initialization.
233 if (!(Flags
& ACPI_NO_HANDLER_INIT
))
235 ACPI_DEBUG_PRINT ((ACPI_DB_EXEC
,
236 "[Init] Installing SCI/GL handlers\n"));
238 Status
= AcpiEvInstallXruptHandlers ();
239 if (ACPI_FAILURE (Status
))
241 return_ACPI_STATUS (Status
);
245 #endif /* !ACPI_REDUCED_HARDWARE */
247 return_ACPI_STATUS (Status
);
250 ACPI_EXPORT_SYMBOL_INIT (AcpiEnableSubsystem
)
253 /*******************************************************************************
255 * FUNCTION: AcpiInitializeObjects
257 * PARAMETERS: Flags - Init/enable Options
261 * DESCRIPTION: Completes namespace initialization by initializing device
262 * objects and executing AML code for Regions, buffers, etc.
264 ******************************************************************************/
267 AcpiInitializeObjects (
270 ACPI_STATUS Status
= AE_OK
;
273 ACPI_FUNCTION_TRACE (AcpiInitializeObjects
);
278 * This call implements the "initialization file" option for AcpiExec.
279 * This is the precise point that we want to perform the overrides.
281 AeDoObjectOverrides ();
285 * Execute any module-level code that was detected during the table load
286 * phase. Although illegal since ACPI 2.0, there are many machines that
287 * contain this type of code. Each block of detected executable AML code
288 * outside of any control method is wrapped with a temporary control
289 * method object and placed on a global list. The methods on this list
290 * are executed below.
292 * This case executes the module-level code for all tables only after
293 * all of the tables have been loaded. It is a legacy option and is
294 * not compatible with other ACPI implementations. See AcpiNsLoadTable.
296 if (AcpiGbl_GroupModuleLevelCode
)
298 AcpiNsExecModuleCodeList ();
301 * Initialize the objects that remain uninitialized. This
302 * runs the executable AML that may be part of the
303 * declaration of these objects:
304 * OperationRegions, BufferFields, Buffers, and Packages.
306 if (!(Flags
& ACPI_NO_OBJECT_INIT
))
308 Status
= AcpiNsInitializeObjects ();
309 if (ACPI_FAILURE (Status
))
311 return_ACPI_STATUS (Status
);
317 * Initialize all device/region objects in the namespace. This runs
318 * the device _STA and _INI methods and region _REG methods.
320 if (!(Flags
& (ACPI_NO_DEVICE_INIT
| ACPI_NO_ADDRESS_SPACE_INIT
)))
322 Status
= AcpiNsInitializeDevices (Flags
);
323 if (ACPI_FAILURE (Status
))
325 return_ACPI_STATUS (Status
);
330 * Empty the caches (delete the cached objects) on the assumption that
331 * the table load filled them up more than they will be at runtime --
332 * thus wasting non-paged memory.
334 Status
= AcpiPurgeCachedObjects ();
336 AcpiGbl_StartupFlags
|= ACPI_INITIALIZED_OK
;
337 return_ACPI_STATUS (Status
);
340 ACPI_EXPORT_SYMBOL_INIT (AcpiInitializeObjects
)