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