xref: /openbmc/linux/drivers/acpi/acpica/utxfinit.c (revision 1ac731c529cd4d6adbce134754b51ff7d822b145)
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