forked from mirrors/linux
		
	 840c02ca22
			
		
	
	
		840c02ca22
		
	
	
	
	
		
			
			ACPICA commit 62f4f98e941d86e41969bf2ab5a93b8dc94dc49e The update includes userspace tool signons. Link: https://github.com/acpica/acpica/commit/62f4f98e Signed-off-by: Bob Moore <robert.moore@intel.com> Signed-off-by: Erik Schmauss <erik.schmauss@intel.com> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
		
			
				
	
	
		
			262 lines
		
	
	
	
		
			7.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			262 lines
		
	
	
	
		
			7.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| // SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0
 | |
| /******************************************************************************
 | |
|  *
 | |
|  * Module Name: utxfinit - External interfaces for ACPICA initialization
 | |
|  *
 | |
|  * Copyright (C) 2000 - 2019, Intel Corp.
 | |
|  *
 | |
|  *****************************************************************************/
 | |
| 
 | |
| #define EXPORT_ACPI_INTERFACES
 | |
| 
 | |
| #include <acpi/acpi.h>
 | |
| #include "accommon.h"
 | |
| #include "acevents.h"
 | |
| #include "acnamesp.h"
 | |
| #include "acdebug.h"
 | |
| #include "actables.h"
 | |
| 
 | |
| #define _COMPONENT          ACPI_UTILITIES
 | |
| ACPI_MODULE_NAME("utxfinit")
 | |
| 
 | |
| /* For acpi_exec only */
 | |
| void ae_do_object_overrides(void);
 | |
| 
 | |
| /*******************************************************************************
 | |
|  *
 | |
|  * FUNCTION:    acpi_initialize_subsystem
 | |
|  *
 | |
|  * PARAMETERS:  None
 | |
|  *
 | |
|  * RETURN:      Status
 | |
|  *
 | |
|  * DESCRIPTION: Initializes all global variables. This is the first function
 | |
|  *              called, so any early initialization belongs here.
 | |
|  *
 | |
|  ******************************************************************************/
 | |
| 
 | |
| acpi_status ACPI_INIT_FUNCTION acpi_initialize_subsystem(void)
 | |
| {
 | |
| 	acpi_status status;
 | |
| 
 | |
| 	ACPI_FUNCTION_TRACE(acpi_initialize_subsystem);
 | |
| 
 | |
| 	acpi_gbl_startup_flags = ACPI_SUBSYSTEM_INITIALIZE;
 | |
| 	ACPI_DEBUG_EXEC(acpi_ut_init_stack_ptr_trace());
 | |
| 
 | |
| 	/* Initialize the OS-Dependent layer */
 | |
| 
 | |
| 	status = acpi_os_initialize();
 | |
| 	if (ACPI_FAILURE(status)) {
 | |
| 		ACPI_EXCEPTION((AE_INFO, status, "During OSL initialization"));
 | |
| 		return_ACPI_STATUS(status);
 | |
| 	}
 | |
| 
 | |
| 	/* Initialize all globals used by the subsystem */
 | |
| 
 | |
| 	status = acpi_ut_init_globals();
 | |
| 	if (ACPI_FAILURE(status)) {
 | |
| 		ACPI_EXCEPTION((AE_INFO, status,
 | |
| 				"During initialization of globals"));
 | |
| 		return_ACPI_STATUS(status);
 | |
| 	}
 | |
| 
 | |
| 	/* Create the default mutex objects */
 | |
| 
 | |
| 	status = acpi_ut_mutex_initialize();
 | |
| 	if (ACPI_FAILURE(status)) {
 | |
| 		ACPI_EXCEPTION((AE_INFO, status,
 | |
| 				"During Global Mutex creation"));
 | |
| 		return_ACPI_STATUS(status);
 | |
| 	}
 | |
| 
 | |
| 	/*
 | |
| 	 * Initialize the namespace manager and
 | |
| 	 * the root of the namespace tree
 | |
| 	 */
 | |
| 	status = acpi_ns_root_initialize();
 | |
| 	if (ACPI_FAILURE(status)) {
 | |
| 		ACPI_EXCEPTION((AE_INFO, status,
 | |
| 				"During Namespace initialization"));
 | |
| 		return_ACPI_STATUS(status);
 | |
| 	}
 | |
| 
 | |
| 	/* Initialize the global OSI interfaces list with the static names */
 | |
| 
 | |
| 	status = acpi_ut_initialize_interfaces();
 | |
| 	if (ACPI_FAILURE(status)) {
 | |
| 		ACPI_EXCEPTION((AE_INFO, status,
 | |
| 				"During OSI interfaces initialization"));
 | |
| 		return_ACPI_STATUS(status);
 | |
| 	}
 | |
| 
 | |
| 	return_ACPI_STATUS(AE_OK);
 | |
| }
 | |
| 
 | |
| ACPI_EXPORT_SYMBOL_INIT(acpi_initialize_subsystem)
 | |
| 
 | |
| /*******************************************************************************
 | |
|  *
 | |
|  * FUNCTION:    acpi_enable_subsystem
 | |
|  *
 | |
|  * PARAMETERS:  flags               - Init/enable Options
 | |
|  *
 | |
|  * RETURN:      Status
 | |
|  *
 | |
|  * DESCRIPTION: Completes the subsystem initialization including hardware.
 | |
|  *              Puts system into ACPI mode if it isn't already.
 | |
|  *
 | |
|  ******************************************************************************/
 | |
| acpi_status ACPI_INIT_FUNCTION acpi_enable_subsystem(u32 flags)
 | |
| {
 | |
| 	acpi_status status = AE_OK;
 | |
| 
 | |
| 	ACPI_FUNCTION_TRACE(acpi_enable_subsystem);
 | |
| 
 | |
| 	/*
 | |
| 	 * The early initialization phase is complete. The namespace is loaded,
 | |
| 	 * and we can now support address spaces other than Memory, I/O, and
 | |
| 	 * PCI_Config.
 | |
| 	 */
 | |
| 	acpi_gbl_early_initialization = FALSE;
 | |
| 
 | |
| #if (!ACPI_REDUCED_HARDWARE)
 | |
| 
 | |
| 	/* Enable ACPI mode */
 | |
| 
 | |
| 	if (!(flags & ACPI_NO_ACPI_ENABLE)) {
 | |
| 		ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
 | |
| 				  "[Init] Going into ACPI mode\n"));
 | |
| 
 | |
| 		acpi_gbl_original_mode = acpi_hw_get_mode();
 | |
| 
 | |
| 		status = acpi_enable();
 | |
| 		if (ACPI_FAILURE(status)) {
 | |
| 			ACPI_WARNING((AE_INFO, "AcpiEnable failed"));
 | |
| 			return_ACPI_STATUS(status);
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	/*
 | |
| 	 * Obtain a permanent mapping for the FACS. This is required for the
 | |
| 	 * Global Lock and the Firmware Waking Vector
 | |
| 	 */
 | |
| 	if (!(flags & ACPI_NO_FACS_INIT)) {
 | |
| 		status = acpi_tb_initialize_facs();
 | |
| 		if (ACPI_FAILURE(status)) {
 | |
| 			ACPI_WARNING((AE_INFO, "Could not map the FACS table"));
 | |
| 			return_ACPI_STATUS(status);
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	/*
 | |
| 	 * Initialize ACPI Event handling (Fixed and General Purpose)
 | |
| 	 *
 | |
| 	 * Note1: We must have the hardware and events initialized before we can
 | |
| 	 * execute any control methods safely. Any control method can require
 | |
| 	 * ACPI hardware support, so the hardware must be fully initialized before
 | |
| 	 * any method execution!
 | |
| 	 *
 | |
| 	 * Note2: Fixed events are initialized and enabled here. GPEs are
 | |
| 	 * initialized, but cannot be enabled until after the hardware is
 | |
| 	 * completely initialized (SCI and global_lock activated) and the various
 | |
| 	 * initialization control methods are run (_REG, _STA, _INI) on the
 | |
| 	 * entire namespace.
 | |
| 	 */
 | |
| 	if (!(flags & ACPI_NO_EVENT_INIT)) {
 | |
| 		ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
 | |
| 				  "[Init] Initializing ACPI events\n"));
 | |
| 
 | |
| 		status = acpi_ev_initialize_events();
 | |
| 		if (ACPI_FAILURE(status)) {
 | |
| 			return_ACPI_STATUS(status);
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	/*
 | |
| 	 * Install the SCI handler and Global Lock handler. This completes the
 | |
| 	 * hardware initialization.
 | |
| 	 */
 | |
| 	if (!(flags & ACPI_NO_HANDLER_INIT)) {
 | |
| 		ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
 | |
| 				  "[Init] Installing SCI/GL handlers\n"));
 | |
| 
 | |
| 		status = acpi_ev_install_xrupt_handlers();
 | |
| 		if (ACPI_FAILURE(status)) {
 | |
| 			return_ACPI_STATUS(status);
 | |
| 		}
 | |
| 	}
 | |
| #endif				/* !ACPI_REDUCED_HARDWARE */
 | |
| 
 | |
| 	return_ACPI_STATUS(status);
 | |
| }
 | |
| 
 | |
| ACPI_EXPORT_SYMBOL_INIT(acpi_enable_subsystem)
 | |
| 
 | |
| /*******************************************************************************
 | |
|  *
 | |
|  * FUNCTION:    acpi_initialize_objects
 | |
|  *
 | |
|  * PARAMETERS:  flags               - Init/enable Options
 | |
|  *
 | |
|  * RETURN:      Status
 | |
|  *
 | |
|  * DESCRIPTION: Completes namespace initialization by initializing device
 | |
|  *              objects and executing AML code for Regions, buffers, etc.
 | |
|  *
 | |
|  ******************************************************************************/
 | |
| acpi_status ACPI_INIT_FUNCTION acpi_initialize_objects(u32 flags)
 | |
| {
 | |
| 	acpi_status status = AE_OK;
 | |
| 
 | |
| 	ACPI_FUNCTION_TRACE(acpi_initialize_objects);
 | |
| 
 | |
| 	/*
 | |
| 	 * This case handles the legacy option that groups all module-level
 | |
| 	 * code blocks together and defers execution until all of the tables
 | |
| 	 * are loaded. Execute all of these blocks at this time.
 | |
| 	 * Execute any module-level code that was detected during the table
 | |
| 	 * load phase.
 | |
| 	 *
 | |
| 	 * Note: this option is deprecated and will be eliminated in the
 | |
| 	 * future. Use of this option can cause problems with AML code that
 | |
| 	 * depends upon in-order immediate execution of module-level code.
 | |
| 	 */
 | |
| 	acpi_ns_exec_module_code_list();
 | |
| 
 | |
| 	/*
 | |
| 	 * Initialize the objects that remain uninitialized. This
 | |
| 	 * runs the executable AML that may be part of the
 | |
| 	 * declaration of these objects:
 | |
| 	 * operation_regions, buffer_fields, Buffers, and Packages.
 | |
| 	 */
 | |
| 	if (!(flags & ACPI_NO_OBJECT_INIT)) {
 | |
| 		status = acpi_ns_initialize_objects();
 | |
| 		if (ACPI_FAILURE(status)) {
 | |
| 			return_ACPI_STATUS(status);
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	/*
 | |
| 	 * Initialize all device/region objects in the namespace. This runs
 | |
| 	 * the device _STA and _INI methods and region _REG methods.
 | |
| 	 */
 | |
| 	if (!(flags & (ACPI_NO_DEVICE_INIT | ACPI_NO_ADDRESS_SPACE_INIT))) {
 | |
| 		status = acpi_ns_initialize_devices(flags);
 | |
| 		if (ACPI_FAILURE(status)) {
 | |
| 			return_ACPI_STATUS(status);
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	/*
 | |
| 	 * Empty the caches (delete the cached objects) on the assumption that
 | |
| 	 * the table load filled them up more than they will be at runtime --
 | |
| 	 * thus wasting non-paged memory.
 | |
| 	 */
 | |
| 	status = acpi_purge_cached_objects();
 | |
| 
 | |
| 	acpi_gbl_startup_flags |= ACPI_INITIALIZED_OK;
 | |
| 	return_ACPI_STATUS(status);
 | |
| }
 | |
| 
 | |
| ACPI_EXPORT_SYMBOL_INIT(acpi_initialize_objects)
 |