195857638SErik Schmauss // SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0
2d978348bSBob Moore /******************************************************************************
3d978348bSBob Moore *
4d978348bSBob Moore * Module Name: utxfinit - External interfaces for ACPICA initialization
5d978348bSBob Moore *
6*612c2932SBob Moore * Copyright (C) 2000 - 2023, Intel Corp.
7d978348bSBob Moore *
895857638SErik Schmauss *****************************************************************************/
9d978348bSBob Moore
10839e928fSLv Zheng #define EXPORT_ACPI_INTERFACES
11839e928fSLv Zheng
12d978348bSBob Moore #include <acpi/acpi.h>
13d978348bSBob Moore #include "accommon.h"
14d978348bSBob Moore #include "acevents.h"
15d978348bSBob Moore #include "acnamesp.h"
16d978348bSBob Moore #include "acdebug.h"
17d978348bSBob Moore #include "actables.h"
18d978348bSBob Moore
19d978348bSBob Moore #define _COMPONENT ACPI_UTILITIES
20d978348bSBob Moore ACPI_MODULE_NAME("utxfinit")
21d978348bSBob Moore
22b487867cSBob Moore /* For acpi_exec only */
23b487867cSBob Moore void ae_do_object_overrides(void);
24b487867cSBob Moore
25d978348bSBob Moore /*******************************************************************************
26d978348bSBob Moore *
27d978348bSBob Moore * FUNCTION: acpi_initialize_subsystem
28d978348bSBob Moore *
29d978348bSBob Moore * PARAMETERS: None
30d978348bSBob Moore *
31d978348bSBob Moore * RETURN: Status
32d978348bSBob Moore *
33d978348bSBob Moore * DESCRIPTION: Initializes all global variables. This is the first function
34d978348bSBob Moore * called, so any early initialization belongs here.
35d978348bSBob Moore *
36d978348bSBob Moore ******************************************************************************/
37b487867cSBob Moore
acpi_initialize_subsystem(void)382368b1a1SLv Zheng acpi_status ACPI_INIT_FUNCTION acpi_initialize_subsystem(void)
39d978348bSBob Moore {
40d978348bSBob Moore acpi_status status;
41d978348bSBob Moore
42d978348bSBob Moore ACPI_FUNCTION_TRACE(acpi_initialize_subsystem);
43d978348bSBob Moore
44d978348bSBob Moore acpi_gbl_startup_flags = ACPI_SUBSYSTEM_INITIALIZE;
45d978348bSBob Moore ACPI_DEBUG_EXEC(acpi_ut_init_stack_ptr_trace());
46d978348bSBob Moore
47d978348bSBob Moore /* Initialize the OS-Dependent layer */
48d978348bSBob Moore
49d978348bSBob Moore status = acpi_os_initialize();
50d978348bSBob Moore if (ACPI_FAILURE(status)) {
51d978348bSBob Moore ACPI_EXCEPTION((AE_INFO, status, "During OSL initialization"));
52d978348bSBob Moore return_ACPI_STATUS(status);
53d978348bSBob Moore }
54d978348bSBob Moore
55d978348bSBob Moore /* Initialize all globals used by the subsystem */
56d978348bSBob Moore
57d978348bSBob Moore status = acpi_ut_init_globals();
58d978348bSBob Moore if (ACPI_FAILURE(status)) {
59d978348bSBob Moore ACPI_EXCEPTION((AE_INFO, status,
60d978348bSBob Moore "During initialization of globals"));
61d978348bSBob Moore return_ACPI_STATUS(status);
62d978348bSBob Moore }
63d978348bSBob Moore
64d978348bSBob Moore /* Create the default mutex objects */
65d978348bSBob Moore
66d978348bSBob Moore status = acpi_ut_mutex_initialize();
67d978348bSBob Moore if (ACPI_FAILURE(status)) {
68d978348bSBob Moore ACPI_EXCEPTION((AE_INFO, status,
69d978348bSBob Moore "During Global Mutex creation"));
70d978348bSBob Moore return_ACPI_STATUS(status);
71d978348bSBob Moore }
72d978348bSBob Moore
73d978348bSBob Moore /*
74d978348bSBob Moore * Initialize the namespace manager and
75d978348bSBob Moore * the root of the namespace tree
76d978348bSBob Moore */
77d978348bSBob Moore status = acpi_ns_root_initialize();
78d978348bSBob Moore if (ACPI_FAILURE(status)) {
79d978348bSBob Moore ACPI_EXCEPTION((AE_INFO, status,
80d978348bSBob Moore "During Namespace initialization"));
81d978348bSBob Moore return_ACPI_STATUS(status);
82d978348bSBob Moore }
83d978348bSBob Moore
84d978348bSBob Moore /* Initialize the global OSI interfaces list with the static names */
85d978348bSBob Moore
86d978348bSBob Moore status = acpi_ut_initialize_interfaces();
87d978348bSBob Moore if (ACPI_FAILURE(status)) {
88d978348bSBob Moore ACPI_EXCEPTION((AE_INFO, status,
89d978348bSBob Moore "During OSI interfaces initialization"));
90d978348bSBob Moore return_ACPI_STATUS(status);
91d978348bSBob Moore }
92d978348bSBob Moore
931a2c4783SBob Moore return_ACPI_STATUS(AE_OK);
941a2c4783SBob Moore }
95d21f600bSLv Zheng
ACPI_EXPORT_SYMBOL_INIT(acpi_initialize_subsystem)96d21f600bSLv Zheng ACPI_EXPORT_SYMBOL_INIT(acpi_initialize_subsystem)
97d978348bSBob Moore
98d978348bSBob Moore /*******************************************************************************
99d978348bSBob Moore *
100d978348bSBob Moore * FUNCTION: acpi_enable_subsystem
101d978348bSBob Moore *
102d978348bSBob Moore * PARAMETERS: flags - Init/enable Options
103d978348bSBob Moore *
104d978348bSBob Moore * RETURN: Status
105d978348bSBob Moore *
106d978348bSBob Moore * DESCRIPTION: Completes the subsystem initialization including hardware.
107d978348bSBob Moore * Puts system into ACPI mode if it isn't already.
108d978348bSBob Moore *
109d978348bSBob Moore ******************************************************************************/
1102368b1a1SLv Zheng acpi_status ACPI_INIT_FUNCTION acpi_enable_subsystem(u32 flags)
111d978348bSBob Moore {
112d978348bSBob Moore acpi_status status = AE_OK;
113d978348bSBob Moore
114d978348bSBob Moore ACPI_FUNCTION_TRACE(acpi_enable_subsystem);
115d978348bSBob Moore
1167b738064SBob Moore /*
1177b738064SBob Moore * The early initialization phase is complete. The namespace is loaded,
1187b738064SBob Moore * and we can now support address spaces other than Memory, I/O, and
1197b738064SBob Moore * PCI_Config.
1207b738064SBob Moore */
1217b738064SBob Moore acpi_gbl_early_initialization = FALSE;
1227b738064SBob Moore
123d978348bSBob Moore #if (!ACPI_REDUCED_HARDWARE)
124d978348bSBob Moore
125d978348bSBob Moore /* Enable ACPI mode */
126d978348bSBob Moore
127d978348bSBob Moore if (!(flags & ACPI_NO_ACPI_ENABLE)) {
128d978348bSBob Moore ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
129d978348bSBob Moore "[Init] Going into ACPI mode\n"));
130d978348bSBob Moore
131d978348bSBob Moore acpi_gbl_original_mode = acpi_hw_get_mode();
132d978348bSBob Moore
133d978348bSBob Moore status = acpi_enable();
134d978348bSBob Moore if (ACPI_FAILURE(status)) {
135d978348bSBob Moore ACPI_WARNING((AE_INFO, "AcpiEnable failed"));
136d978348bSBob Moore return_ACPI_STATUS(status);
137d978348bSBob Moore }
138d978348bSBob Moore }
139d978348bSBob Moore
140d978348bSBob Moore /*
141d978348bSBob Moore * Obtain a permanent mapping for the FACS. This is required for the
142d978348bSBob Moore * Global Lock and the Firmware Waking Vector
143d978348bSBob Moore */
144c04be184SLv Zheng if (!(flags & ACPI_NO_FACS_INIT)) {
145d978348bSBob Moore status = acpi_tb_initialize_facs();
146d978348bSBob Moore if (ACPI_FAILURE(status)) {
147d978348bSBob Moore ACPI_WARNING((AE_INFO, "Could not map the FACS table"));
148d978348bSBob Moore return_ACPI_STATUS(status);
149d978348bSBob Moore }
150c04be184SLv Zheng }
151d978348bSBob Moore
152d978348bSBob Moore /*
153d978348bSBob Moore * Initialize ACPI Event handling (Fixed and General Purpose)
154d978348bSBob Moore *
155d978348bSBob Moore * Note1: We must have the hardware and events initialized before we can
156d978348bSBob Moore * execute any control methods safely. Any control method can require
157d978348bSBob Moore * ACPI hardware support, so the hardware must be fully initialized before
158d978348bSBob Moore * any method execution!
159d978348bSBob Moore *
160d978348bSBob Moore * Note2: Fixed events are initialized and enabled here. GPEs are
161d978348bSBob Moore * initialized, but cannot be enabled until after the hardware is
162d978348bSBob Moore * completely initialized (SCI and global_lock activated) and the various
163d978348bSBob Moore * initialization control methods are run (_REG, _STA, _INI) on the
164d978348bSBob Moore * entire namespace.
165d978348bSBob Moore */
166d978348bSBob Moore if (!(flags & ACPI_NO_EVENT_INIT)) {
167d978348bSBob Moore ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
168d978348bSBob Moore "[Init] Initializing ACPI events\n"));
169d978348bSBob Moore
170d978348bSBob Moore status = acpi_ev_initialize_events();
171d978348bSBob Moore if (ACPI_FAILURE(status)) {
172d978348bSBob Moore return_ACPI_STATUS(status);
173d978348bSBob Moore }
174d978348bSBob Moore }
175d978348bSBob Moore
176d978348bSBob Moore /*
177d978348bSBob Moore * Install the SCI handler and Global Lock handler. This completes the
178d978348bSBob Moore * hardware initialization.
179d978348bSBob Moore */
180d978348bSBob Moore if (!(flags & ACPI_NO_HANDLER_INIT)) {
181d978348bSBob Moore ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
182d978348bSBob Moore "[Init] Installing SCI/GL handlers\n"));
183d978348bSBob Moore
184d978348bSBob Moore status = acpi_ev_install_xrupt_handlers();
185d978348bSBob Moore if (ACPI_FAILURE(status)) {
186d978348bSBob Moore return_ACPI_STATUS(status);
187d978348bSBob Moore }
188d978348bSBob Moore }
189d978348bSBob Moore #endif /* !ACPI_REDUCED_HARDWARE */
190d978348bSBob Moore
191d978348bSBob Moore return_ACPI_STATUS(status);
192d978348bSBob Moore }
193d21f600bSLv Zheng
ACPI_EXPORT_SYMBOL_INIT(acpi_enable_subsystem)194d21f600bSLv Zheng ACPI_EXPORT_SYMBOL_INIT(acpi_enable_subsystem)
195d978348bSBob Moore
196d978348bSBob Moore /*******************************************************************************
197d978348bSBob Moore *
198d978348bSBob Moore * FUNCTION: acpi_initialize_objects
199d978348bSBob Moore *
200d978348bSBob Moore * PARAMETERS: flags - Init/enable Options
201d978348bSBob Moore *
202d978348bSBob Moore * RETURN: Status
203d978348bSBob Moore *
204d978348bSBob Moore * DESCRIPTION: Completes namespace initialization by initializing device
205d978348bSBob Moore * objects and executing AML code for Regions, buffers, etc.
206d978348bSBob Moore *
207d978348bSBob Moore ******************************************************************************/
2082368b1a1SLv Zheng acpi_status ACPI_INIT_FUNCTION acpi_initialize_objects(u32 flags)
209d978348bSBob Moore {
210d978348bSBob Moore acpi_status status = AE_OK;
211d978348bSBob Moore
212d978348bSBob Moore ACPI_FUNCTION_TRACE(acpi_initialize_objects);
213d978348bSBob Moore
21486a33cf3SBob Moore #ifdef ACPI_OBSOLETE_BEHAVIOR
21586a33cf3SBob Moore /*
21686a33cf3SBob Moore * 05/2019: Removed, initialization now happens at both object
21786a33cf3SBob Moore * creation and table load time
21886a33cf3SBob Moore */
21986a33cf3SBob Moore
220b487867cSBob Moore /*
2215508df89SLv Zheng * Initialize the objects that remain uninitialized. This
2225508df89SLv Zheng * runs the executable AML that may be part of the
22386a33cf3SBob Moore * declaration of these objects: operation_regions, buffer_fields,
22486a33cf3SBob Moore * bank_fields, Buffers, and Packages.
225d978348bSBob Moore */
226d978348bSBob Moore if (!(flags & ACPI_NO_OBJECT_INIT)) {
227d978348bSBob Moore status = acpi_ns_initialize_objects();
228d978348bSBob Moore if (ACPI_FAILURE(status)) {
229d978348bSBob Moore return_ACPI_STATUS(status);
230d978348bSBob Moore }
231d978348bSBob Moore }
23286a33cf3SBob Moore #endif
2339559130bSLv Zheng
2349559130bSLv Zheng /*
235ced04366SLv Zheng * Initialize all device/region objects in the namespace. This runs
236ced04366SLv Zheng * the device _STA and _INI methods and region _REG methods.
237d978348bSBob Moore */
238ced04366SLv Zheng if (!(flags & (ACPI_NO_DEVICE_INIT | ACPI_NO_ADDRESS_SPACE_INIT))) {
239ced04366SLv Zheng status = acpi_ns_initialize_devices(flags);
240d978348bSBob Moore if (ACPI_FAILURE(status)) {
241d978348bSBob Moore return_ACPI_STATUS(status);
242d978348bSBob Moore }
243d978348bSBob Moore }
244d978348bSBob Moore
245d978348bSBob Moore /*
246d978348bSBob Moore * Empty the caches (delete the cached objects) on the assumption that
247d978348bSBob Moore * the table load filled them up more than they will be at runtime --
248d978348bSBob Moore * thus wasting non-paged memory.
249d978348bSBob Moore */
250d978348bSBob Moore status = acpi_purge_cached_objects();
251d978348bSBob Moore
252d978348bSBob Moore acpi_gbl_startup_flags |= ACPI_INITIALIZED_OK;
253d978348bSBob Moore return_ACPI_STATUS(status);
254d978348bSBob Moore }
255d21f600bSLv Zheng
256d21f600bSLv Zheng ACPI_EXPORT_SYMBOL_INIT(acpi_initialize_objects)
257