utxfinit.c revision 306536
1/******************************************************************************
2 *
3 * Module Name: utxfinit - External interfaces for ACPICA initialization
4 *
5 *****************************************************************************/
6
7/*
8 * Copyright (C) 2000 - 2016, Intel Corp.
9 * All rights reserved.
10 *
11 * Redistribution and use in source and binary forms, with or without
12 * modification, are permitted provided that the following conditions
13 * are met:
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.
25 *
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.
29 *
30 * NO WARRANTY
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.
42 */
43
44#define EXPORT_ACPI_INTERFACES
45
46#include <contrib/dev/acpica/include/acpi.h>
47#include <contrib/dev/acpica/include/accommon.h>
48#include <contrib/dev/acpica/include/acevents.h>
49#include <contrib/dev/acpica/include/acnamesp.h>
50#include <contrib/dev/acpica/include/acdebug.h>
51#include <contrib/dev/acpica/include/actables.h>
52
53#define _COMPONENT          ACPI_UTILITIES
54        ACPI_MODULE_NAME    ("utxfinit")
55
56/* For AcpiExec only */
57void
58AeDoObjectOverrides (
59    void);
60
61
62/*******************************************************************************
63 *
64 * FUNCTION:    AcpiInitializeSubsystem
65 *
66 * PARAMETERS:  None
67 *
68 * RETURN:      Status
69 *
70 * DESCRIPTION: Initializes all global variables. This is the first function
71 *              called, so any early initialization belongs here.
72 *
73 ******************************************************************************/
74
75ACPI_STATUS
76AcpiInitializeSubsystem (
77    void)
78{
79    ACPI_STATUS             Status;
80
81
82    ACPI_FUNCTION_TRACE (AcpiInitializeSubsystem);
83
84
85    AcpiGbl_StartupFlags = ACPI_SUBSYSTEM_INITIALIZE;
86    ACPI_DEBUG_EXEC (AcpiUtInitStackPtrTrace ());
87
88    /* Initialize the OS-Dependent layer */
89
90    Status = AcpiOsInitialize ();
91    if (ACPI_FAILURE (Status))
92    {
93        ACPI_EXCEPTION ((AE_INFO, Status, "During OSL initialization"));
94        return_ACPI_STATUS (Status);
95    }
96
97    /* Initialize all globals used by the subsystem */
98
99    Status = AcpiUtInitGlobals ();
100    if (ACPI_FAILURE (Status))
101    {
102        ACPI_EXCEPTION ((AE_INFO, Status, "During initialization of globals"));
103        return_ACPI_STATUS (Status);
104    }
105
106    /* Create the default mutex objects */
107
108    Status = AcpiUtMutexInitialize ();
109    if (ACPI_FAILURE (Status))
110    {
111        ACPI_EXCEPTION ((AE_INFO, Status, "During Global Mutex creation"));
112        return_ACPI_STATUS (Status);
113    }
114
115    /*
116     * Initialize the namespace manager and
117     * the root of the namespace tree
118     */
119    Status = AcpiNsRootInitialize ();
120    if (ACPI_FAILURE (Status))
121    {
122        ACPI_EXCEPTION ((AE_INFO, Status, "During Namespace initialization"));
123        return_ACPI_STATUS (Status);
124    }
125
126    /* Initialize the global OSI interfaces list with the static names */
127
128    Status = AcpiUtInitializeInterfaces ();
129    if (ACPI_FAILURE (Status))
130    {
131        ACPI_EXCEPTION ((AE_INFO, Status, "During OSI interfaces initialization"));
132        return_ACPI_STATUS (Status);
133    }
134
135    return_ACPI_STATUS (AE_OK);
136}
137
138ACPI_EXPORT_SYMBOL_INIT (AcpiInitializeSubsystem)
139
140
141/*******************************************************************************
142 *
143 * FUNCTION:    AcpiEnableSubsystem
144 *
145 * PARAMETERS:  Flags               - Init/enable Options
146 *
147 * RETURN:      Status
148 *
149 * DESCRIPTION: Completes the subsystem initialization including hardware.
150 *              Puts system into ACPI mode if it isn't already.
151 *
152 ******************************************************************************/
153
154ACPI_STATUS
155AcpiEnableSubsystem (
156    UINT32                  Flags)
157{
158    ACPI_STATUS             Status = AE_OK;
159
160
161    ACPI_FUNCTION_TRACE (AcpiEnableSubsystem);
162
163
164    /*
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
167     * PCI_Config.
168     */
169    AcpiGbl_EarlyInitialization = FALSE;
170
171#if (!ACPI_REDUCED_HARDWARE)
172
173    /* Enable ACPI mode */
174
175    if (!(Flags & ACPI_NO_ACPI_ENABLE))
176    {
177        ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "[Init] Going into ACPI mode\n"));
178
179        AcpiGbl_OriginalMode = AcpiHwGetMode();
180
181        Status = AcpiEnable ();
182        if (ACPI_FAILURE (Status))
183        {
184            ACPI_WARNING ((AE_INFO, "AcpiEnable failed"));
185            return_ACPI_STATUS (Status);
186        }
187    }
188
189    /*
190     * Obtain a permanent mapping for the FACS. This is required for the
191     * Global Lock and the Firmware Waking Vector
192     */
193    if (!(Flags & ACPI_NO_FACS_INIT))
194    {
195        Status = AcpiTbInitializeFacs ();
196        if (ACPI_FAILURE (Status))
197        {
198            ACPI_WARNING ((AE_INFO, "Could not map the FACS table"));
199            return_ACPI_STATUS (Status);
200        }
201    }
202
203    /*
204     * Initialize ACPI Event handling (Fixed and General Purpose)
205     *
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!
210     *
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
215     * entire namespace.
216     */
217    if (!(Flags & ACPI_NO_EVENT_INIT))
218    {
219        ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
220            "[Init] Initializing ACPI events\n"));
221
222        Status = AcpiEvInitializeEvents ();
223        if (ACPI_FAILURE (Status))
224        {
225            return_ACPI_STATUS (Status);
226        }
227    }
228
229    /*
230     * Install the SCI handler and Global Lock handler. This completes the
231     * hardware initialization.
232     */
233    if (!(Flags & ACPI_NO_HANDLER_INIT))
234    {
235        ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
236            "[Init] Installing SCI/GL handlers\n"));
237
238        Status = AcpiEvInstallXruptHandlers ();
239        if (ACPI_FAILURE (Status))
240        {
241            return_ACPI_STATUS (Status);
242        }
243    }
244
245#endif /* !ACPI_REDUCED_HARDWARE */
246
247    return_ACPI_STATUS (Status);
248}
249
250ACPI_EXPORT_SYMBOL_INIT (AcpiEnableSubsystem)
251
252
253/*******************************************************************************
254 *
255 * FUNCTION:    AcpiInitializeObjects
256 *
257 * PARAMETERS:  Flags               - Init/enable Options
258 *
259 * RETURN:      Status
260 *
261 * DESCRIPTION: Completes namespace initialization by initializing device
262 *              objects and executing AML code for Regions, buffers, etc.
263 *
264 ******************************************************************************/
265
266ACPI_STATUS
267AcpiInitializeObjects (
268    UINT32                  Flags)
269{
270    ACPI_STATUS             Status = AE_OK;
271
272
273    ACPI_FUNCTION_TRACE (AcpiInitializeObjects);
274
275
276#ifdef ACPI_EXEC_APP
277    /*
278     * This call implements the "initialization file" option for AcpiExec.
279     * This is the precise point that we want to perform the overrides.
280     */
281    AeDoObjectOverrides ();
282#endif
283
284    /*
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.
291     *
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.
295     */
296    if (AcpiGbl_GroupModuleLevelCode)
297    {
298        AcpiNsExecModuleCodeList ();
299
300        /*
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.
305         */
306        if (!(Flags & ACPI_NO_OBJECT_INIT))
307        {
308            Status = AcpiNsInitializeObjects ();
309            if (ACPI_FAILURE (Status))
310            {
311                return_ACPI_STATUS (Status);
312            }
313        }
314    }
315
316    /*
317     * Initialize all device/region objects in the namespace. This runs
318     * the device _STA and _INI methods and region _REG methods.
319     */
320    if (!(Flags & (ACPI_NO_DEVICE_INIT | ACPI_NO_ADDRESS_SPACE_INIT)))
321    {
322        Status = AcpiNsInitializeDevices (Flags);
323        if (ACPI_FAILURE (Status))
324        {
325            return_ACPI_STATUS (Status);
326        }
327    }
328
329    /*
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.
333     */
334    Status = AcpiPurgeCachedObjects ();
335
336    AcpiGbl_StartupFlags |= ACPI_INITIALIZED_OK;
337    return_ACPI_STATUS (Status);
338}
339
340ACPI_EXPORT_SYMBOL_INIT (AcpiInitializeObjects)
341