1*4882a593Smuzhiyun // SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0 2*4882a593Smuzhiyun /****************************************************************************** 3*4882a593Smuzhiyun * 4*4882a593Smuzhiyun * Module Name: utinit - Common ACPI subsystem initialization 5*4882a593Smuzhiyun * 6*4882a593Smuzhiyun * Copyright (C) 2000 - 2020, Intel Corp. 7*4882a593Smuzhiyun * 8*4882a593Smuzhiyun *****************************************************************************/ 9*4882a593Smuzhiyun 10*4882a593Smuzhiyun #include <acpi/acpi.h> 11*4882a593Smuzhiyun #include "accommon.h" 12*4882a593Smuzhiyun #include "acnamesp.h" 13*4882a593Smuzhiyun #include "acevents.h" 14*4882a593Smuzhiyun #include "actables.h" 15*4882a593Smuzhiyun 16*4882a593Smuzhiyun #define _COMPONENT ACPI_UTILITIES 17*4882a593Smuzhiyun ACPI_MODULE_NAME("utinit") 18*4882a593Smuzhiyun 19*4882a593Smuzhiyun /* Local prototypes */ 20*4882a593Smuzhiyun static void acpi_ut_terminate(void); 21*4882a593Smuzhiyun 22*4882a593Smuzhiyun #if (!ACPI_REDUCED_HARDWARE) 23*4882a593Smuzhiyun 24*4882a593Smuzhiyun static void acpi_ut_free_gpe_lists(void); 25*4882a593Smuzhiyun 26*4882a593Smuzhiyun #else 27*4882a593Smuzhiyun 28*4882a593Smuzhiyun #define acpi_ut_free_gpe_lists() 29*4882a593Smuzhiyun #endif /* !ACPI_REDUCED_HARDWARE */ 30*4882a593Smuzhiyun 31*4882a593Smuzhiyun #if (!ACPI_REDUCED_HARDWARE) 32*4882a593Smuzhiyun /****************************************************************************** 33*4882a593Smuzhiyun * 34*4882a593Smuzhiyun * FUNCTION: acpi_ut_free_gpe_lists 35*4882a593Smuzhiyun * 36*4882a593Smuzhiyun * PARAMETERS: none 37*4882a593Smuzhiyun * 38*4882a593Smuzhiyun * RETURN: none 39*4882a593Smuzhiyun * 40*4882a593Smuzhiyun * DESCRIPTION: Free global GPE lists 41*4882a593Smuzhiyun * 42*4882a593Smuzhiyun ******************************************************************************/ 43*4882a593Smuzhiyun acpi_ut_free_gpe_lists(void)44*4882a593Smuzhiyunstatic void acpi_ut_free_gpe_lists(void) 45*4882a593Smuzhiyun { 46*4882a593Smuzhiyun struct acpi_gpe_block_info *gpe_block; 47*4882a593Smuzhiyun struct acpi_gpe_block_info *next_gpe_block; 48*4882a593Smuzhiyun struct acpi_gpe_xrupt_info *gpe_xrupt_info; 49*4882a593Smuzhiyun struct acpi_gpe_xrupt_info *next_gpe_xrupt_info; 50*4882a593Smuzhiyun 51*4882a593Smuzhiyun /* Free global GPE blocks and related info structures */ 52*4882a593Smuzhiyun 53*4882a593Smuzhiyun gpe_xrupt_info = acpi_gbl_gpe_xrupt_list_head; 54*4882a593Smuzhiyun while (gpe_xrupt_info) { 55*4882a593Smuzhiyun gpe_block = gpe_xrupt_info->gpe_block_list_head; 56*4882a593Smuzhiyun while (gpe_block) { 57*4882a593Smuzhiyun next_gpe_block = gpe_block->next; 58*4882a593Smuzhiyun ACPI_FREE(gpe_block->event_info); 59*4882a593Smuzhiyun ACPI_FREE(gpe_block->register_info); 60*4882a593Smuzhiyun ACPI_FREE(gpe_block); 61*4882a593Smuzhiyun 62*4882a593Smuzhiyun gpe_block = next_gpe_block; 63*4882a593Smuzhiyun } 64*4882a593Smuzhiyun next_gpe_xrupt_info = gpe_xrupt_info->next; 65*4882a593Smuzhiyun ACPI_FREE(gpe_xrupt_info); 66*4882a593Smuzhiyun gpe_xrupt_info = next_gpe_xrupt_info; 67*4882a593Smuzhiyun } 68*4882a593Smuzhiyun } 69*4882a593Smuzhiyun #endif /* !ACPI_REDUCED_HARDWARE */ 70*4882a593Smuzhiyun 71*4882a593Smuzhiyun /******************************************************************************* 72*4882a593Smuzhiyun * 73*4882a593Smuzhiyun * FUNCTION: acpi_ut_init_globals 74*4882a593Smuzhiyun * 75*4882a593Smuzhiyun * PARAMETERS: None 76*4882a593Smuzhiyun * 77*4882a593Smuzhiyun * RETURN: Status 78*4882a593Smuzhiyun * 79*4882a593Smuzhiyun * DESCRIPTION: Initialize ACPICA globals. All globals that require specific 80*4882a593Smuzhiyun * initialization should be initialized here. This allows for 81*4882a593Smuzhiyun * a warm restart. 82*4882a593Smuzhiyun * 83*4882a593Smuzhiyun ******************************************************************************/ 84*4882a593Smuzhiyun acpi_ut_init_globals(void)85*4882a593Smuzhiyunacpi_status acpi_ut_init_globals(void) 86*4882a593Smuzhiyun { 87*4882a593Smuzhiyun acpi_status status; 88*4882a593Smuzhiyun u32 i; 89*4882a593Smuzhiyun 90*4882a593Smuzhiyun ACPI_FUNCTION_TRACE(ut_init_globals); 91*4882a593Smuzhiyun 92*4882a593Smuzhiyun /* Create all memory caches */ 93*4882a593Smuzhiyun 94*4882a593Smuzhiyun status = acpi_ut_create_caches(); 95*4882a593Smuzhiyun if (ACPI_FAILURE(status)) { 96*4882a593Smuzhiyun return_ACPI_STATUS(status); 97*4882a593Smuzhiyun } 98*4882a593Smuzhiyun 99*4882a593Smuzhiyun /* Address Range lists */ 100*4882a593Smuzhiyun 101*4882a593Smuzhiyun for (i = 0; i < ACPI_ADDRESS_RANGE_MAX; i++) { 102*4882a593Smuzhiyun acpi_gbl_address_range_list[i] = NULL; 103*4882a593Smuzhiyun } 104*4882a593Smuzhiyun 105*4882a593Smuzhiyun /* Mutex locked flags */ 106*4882a593Smuzhiyun 107*4882a593Smuzhiyun for (i = 0; i < ACPI_NUM_MUTEX; i++) { 108*4882a593Smuzhiyun acpi_gbl_mutex_info[i].mutex = NULL; 109*4882a593Smuzhiyun acpi_gbl_mutex_info[i].thread_id = ACPI_MUTEX_NOT_ACQUIRED; 110*4882a593Smuzhiyun acpi_gbl_mutex_info[i].use_count = 0; 111*4882a593Smuzhiyun } 112*4882a593Smuzhiyun 113*4882a593Smuzhiyun for (i = 0; i < ACPI_NUM_OWNERID_MASKS; i++) { 114*4882a593Smuzhiyun acpi_gbl_owner_id_mask[i] = 0; 115*4882a593Smuzhiyun } 116*4882a593Smuzhiyun 117*4882a593Smuzhiyun /* Last owner_ID is never valid */ 118*4882a593Smuzhiyun 119*4882a593Smuzhiyun acpi_gbl_owner_id_mask[ACPI_NUM_OWNERID_MASKS - 1] = 0x80000000; 120*4882a593Smuzhiyun 121*4882a593Smuzhiyun /* Event counters */ 122*4882a593Smuzhiyun 123*4882a593Smuzhiyun acpi_method_count = 0; 124*4882a593Smuzhiyun acpi_sci_count = 0; 125*4882a593Smuzhiyun acpi_gpe_count = 0; 126*4882a593Smuzhiyun 127*4882a593Smuzhiyun for (i = 0; i < ACPI_NUM_FIXED_EVENTS; i++) { 128*4882a593Smuzhiyun acpi_fixed_event_count[i] = 0; 129*4882a593Smuzhiyun } 130*4882a593Smuzhiyun 131*4882a593Smuzhiyun #if (!ACPI_REDUCED_HARDWARE) 132*4882a593Smuzhiyun 133*4882a593Smuzhiyun /* GPE/SCI support */ 134*4882a593Smuzhiyun 135*4882a593Smuzhiyun acpi_gbl_all_gpes_initialized = FALSE; 136*4882a593Smuzhiyun acpi_gbl_gpe_xrupt_list_head = NULL; 137*4882a593Smuzhiyun acpi_gbl_gpe_fadt_blocks[0] = NULL; 138*4882a593Smuzhiyun acpi_gbl_gpe_fadt_blocks[1] = NULL; 139*4882a593Smuzhiyun acpi_current_gpe_count = 0; 140*4882a593Smuzhiyun 141*4882a593Smuzhiyun acpi_gbl_global_event_handler = NULL; 142*4882a593Smuzhiyun acpi_gbl_sci_handler_list = NULL; 143*4882a593Smuzhiyun 144*4882a593Smuzhiyun #endif /* !ACPI_REDUCED_HARDWARE */ 145*4882a593Smuzhiyun 146*4882a593Smuzhiyun /* Global handlers */ 147*4882a593Smuzhiyun 148*4882a593Smuzhiyun acpi_gbl_global_notify[0].handler = NULL; 149*4882a593Smuzhiyun acpi_gbl_global_notify[1].handler = NULL; 150*4882a593Smuzhiyun acpi_gbl_exception_handler = NULL; 151*4882a593Smuzhiyun acpi_gbl_init_handler = NULL; 152*4882a593Smuzhiyun acpi_gbl_table_handler = NULL; 153*4882a593Smuzhiyun acpi_gbl_interface_handler = NULL; 154*4882a593Smuzhiyun 155*4882a593Smuzhiyun /* Global Lock support */ 156*4882a593Smuzhiyun 157*4882a593Smuzhiyun acpi_gbl_global_lock_semaphore = NULL; 158*4882a593Smuzhiyun acpi_gbl_global_lock_mutex = NULL; 159*4882a593Smuzhiyun acpi_gbl_global_lock_acquired = FALSE; 160*4882a593Smuzhiyun acpi_gbl_global_lock_handle = 0; 161*4882a593Smuzhiyun acpi_gbl_global_lock_present = FALSE; 162*4882a593Smuzhiyun 163*4882a593Smuzhiyun /* Miscellaneous variables */ 164*4882a593Smuzhiyun 165*4882a593Smuzhiyun acpi_gbl_DSDT = NULL; 166*4882a593Smuzhiyun acpi_gbl_cm_single_step = FALSE; 167*4882a593Smuzhiyun acpi_gbl_shutdown = FALSE; 168*4882a593Smuzhiyun acpi_gbl_ns_lookup_count = 0; 169*4882a593Smuzhiyun acpi_gbl_ps_find_count = 0; 170*4882a593Smuzhiyun acpi_gbl_acpi_hardware_present = TRUE; 171*4882a593Smuzhiyun acpi_gbl_last_owner_id_index = 0; 172*4882a593Smuzhiyun acpi_gbl_next_owner_id_offset = 0; 173*4882a593Smuzhiyun acpi_gbl_debugger_configuration = DEBUGGER_THREADING; 174*4882a593Smuzhiyun acpi_gbl_osi_mutex = NULL; 175*4882a593Smuzhiyun 176*4882a593Smuzhiyun /* Hardware oriented */ 177*4882a593Smuzhiyun 178*4882a593Smuzhiyun acpi_gbl_events_initialized = FALSE; 179*4882a593Smuzhiyun acpi_gbl_system_awake_and_running = TRUE; 180*4882a593Smuzhiyun 181*4882a593Smuzhiyun /* Namespace */ 182*4882a593Smuzhiyun 183*4882a593Smuzhiyun acpi_gbl_root_node = NULL; 184*4882a593Smuzhiyun acpi_gbl_root_node_struct.name.integer = ACPI_ROOT_NAME; 185*4882a593Smuzhiyun acpi_gbl_root_node_struct.descriptor_type = ACPI_DESC_TYPE_NAMED; 186*4882a593Smuzhiyun acpi_gbl_root_node_struct.type = ACPI_TYPE_DEVICE; 187*4882a593Smuzhiyun acpi_gbl_root_node_struct.parent = NULL; 188*4882a593Smuzhiyun acpi_gbl_root_node_struct.child = NULL; 189*4882a593Smuzhiyun acpi_gbl_root_node_struct.peer = NULL; 190*4882a593Smuzhiyun acpi_gbl_root_node_struct.object = NULL; 191*4882a593Smuzhiyun 192*4882a593Smuzhiyun #ifdef ACPI_DISASSEMBLER 193*4882a593Smuzhiyun acpi_gbl_external_list = NULL; 194*4882a593Smuzhiyun acpi_gbl_num_external_methods = 0; 195*4882a593Smuzhiyun acpi_gbl_resolved_external_methods = 0; 196*4882a593Smuzhiyun #endif 197*4882a593Smuzhiyun 198*4882a593Smuzhiyun #ifdef ACPI_DEBUG_OUTPUT 199*4882a593Smuzhiyun acpi_gbl_lowest_stack_pointer = ACPI_CAST_PTR(acpi_size, ACPI_SIZE_MAX); 200*4882a593Smuzhiyun #endif 201*4882a593Smuzhiyun 202*4882a593Smuzhiyun #ifdef ACPI_DBG_TRACK_ALLOCATIONS 203*4882a593Smuzhiyun acpi_gbl_display_final_mem_stats = FALSE; 204*4882a593Smuzhiyun acpi_gbl_disable_mem_tracking = FALSE; 205*4882a593Smuzhiyun #endif 206*4882a593Smuzhiyun 207*4882a593Smuzhiyun return_ACPI_STATUS(AE_OK); 208*4882a593Smuzhiyun } 209*4882a593Smuzhiyun 210*4882a593Smuzhiyun /****************************************************************************** 211*4882a593Smuzhiyun * 212*4882a593Smuzhiyun * FUNCTION: acpi_ut_terminate 213*4882a593Smuzhiyun * 214*4882a593Smuzhiyun * PARAMETERS: none 215*4882a593Smuzhiyun * 216*4882a593Smuzhiyun * RETURN: none 217*4882a593Smuzhiyun * 218*4882a593Smuzhiyun * DESCRIPTION: Free global memory 219*4882a593Smuzhiyun * 220*4882a593Smuzhiyun ******************************************************************************/ 221*4882a593Smuzhiyun acpi_ut_terminate(void)222*4882a593Smuzhiyunstatic void acpi_ut_terminate(void) 223*4882a593Smuzhiyun { 224*4882a593Smuzhiyun ACPI_FUNCTION_TRACE(ut_terminate); 225*4882a593Smuzhiyun 226*4882a593Smuzhiyun acpi_ut_free_gpe_lists(); 227*4882a593Smuzhiyun acpi_ut_delete_address_lists(); 228*4882a593Smuzhiyun return_VOID; 229*4882a593Smuzhiyun } 230*4882a593Smuzhiyun 231*4882a593Smuzhiyun /******************************************************************************* 232*4882a593Smuzhiyun * 233*4882a593Smuzhiyun * FUNCTION: acpi_ut_subsystem_shutdown 234*4882a593Smuzhiyun * 235*4882a593Smuzhiyun * PARAMETERS: None 236*4882a593Smuzhiyun * 237*4882a593Smuzhiyun * RETURN: None 238*4882a593Smuzhiyun * 239*4882a593Smuzhiyun * DESCRIPTION: Shutdown the various components. Do not delete the mutex 240*4882a593Smuzhiyun * objects here, because the AML debugger may be still running. 241*4882a593Smuzhiyun * 242*4882a593Smuzhiyun ******************************************************************************/ 243*4882a593Smuzhiyun acpi_ut_subsystem_shutdown(void)244*4882a593Smuzhiyunvoid acpi_ut_subsystem_shutdown(void) 245*4882a593Smuzhiyun { 246*4882a593Smuzhiyun ACPI_FUNCTION_TRACE(ut_subsystem_shutdown); 247*4882a593Smuzhiyun 248*4882a593Smuzhiyun /* Just exit if subsystem is already shutdown */ 249*4882a593Smuzhiyun 250*4882a593Smuzhiyun if (acpi_gbl_shutdown) { 251*4882a593Smuzhiyun ACPI_ERROR((AE_INFO, "ACPI Subsystem is already terminated")); 252*4882a593Smuzhiyun return_VOID; 253*4882a593Smuzhiyun } 254*4882a593Smuzhiyun 255*4882a593Smuzhiyun /* Subsystem appears active, go ahead and shut it down */ 256*4882a593Smuzhiyun 257*4882a593Smuzhiyun acpi_gbl_shutdown = TRUE; 258*4882a593Smuzhiyun acpi_gbl_startup_flags = 0; 259*4882a593Smuzhiyun ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Shutting down ACPI Subsystem\n")); 260*4882a593Smuzhiyun 261*4882a593Smuzhiyun #ifndef ACPI_ASL_COMPILER 262*4882a593Smuzhiyun 263*4882a593Smuzhiyun /* Close the acpi_event Handling */ 264*4882a593Smuzhiyun 265*4882a593Smuzhiyun acpi_ev_terminate(); 266*4882a593Smuzhiyun 267*4882a593Smuzhiyun /* Delete any dynamic _OSI interfaces */ 268*4882a593Smuzhiyun 269*4882a593Smuzhiyun acpi_ut_interface_terminate(); 270*4882a593Smuzhiyun #endif 271*4882a593Smuzhiyun 272*4882a593Smuzhiyun /* Close the Namespace */ 273*4882a593Smuzhiyun 274*4882a593Smuzhiyun acpi_ns_terminate(); 275*4882a593Smuzhiyun 276*4882a593Smuzhiyun /* Delete the ACPI tables */ 277*4882a593Smuzhiyun 278*4882a593Smuzhiyun acpi_tb_terminate(); 279*4882a593Smuzhiyun 280*4882a593Smuzhiyun /* Close the globals */ 281*4882a593Smuzhiyun 282*4882a593Smuzhiyun acpi_ut_terminate(); 283*4882a593Smuzhiyun 284*4882a593Smuzhiyun /* Purge the local caches */ 285*4882a593Smuzhiyun 286*4882a593Smuzhiyun (void)acpi_ut_delete_caches(); 287*4882a593Smuzhiyun return_VOID; 288*4882a593Smuzhiyun } 289