brintos

brintos / linux-shallow public Read only

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