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