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