1 /****************************************************************************** 2 * 3 * Module Name: utinit - Common ACPI subsystem initialization 4 * 5 *****************************************************************************/ 6 7 /* 8 * Copyright (C) 2000 - 2022, Intel Corp. 9 * All rights reserved. 10 * 11 * Redistribution and use in source and binary forms, with or without 12 * modification, are permitted provided that the following conditions 13 * are met: 14 * 1. Redistributions of source code must retain the above copyright 15 * notice, this list of conditions, and the following disclaimer, 16 * without modification. 17 * 2. Redistributions in binary form must reproduce at minimum a disclaimer 18 * substantially similar to the "NO WARRANTY" disclaimer below 19 * ("Disclaimer") and any redistribution must be conditioned upon 20 * including a substantially similar Disclaimer requirement for further 21 * binary redistribution. 22 * 3. Neither the names of the above-listed copyright holders nor the names 23 * of any contributors may be used to endorse or promote products derived 24 * from this software without specific prior written permission. 25 * 26 * Alternatively, this software may be distributed under the terms of the 27 * GNU General Public License ("GPL") version 2 as published by the Free 28 * Software Foundation. 29 * 30 * NO WARRANTY 31 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 32 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 33 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 34 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 35 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 36 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 37 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 38 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 39 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 40 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 41 * POSSIBILITY OF SUCH DAMAGES. 42 */ 43 44 #include "acpi.h" 45 #include "accommon.h" 46 #include "acnamesp.h" 47 #include "acevents.h" 48 #include "actables.h" 49 50 #define _COMPONENT ACPI_UTILITIES 51 ACPI_MODULE_NAME ("utinit") 52 53 /* Local prototypes */ 54 55 static void AcpiUtTerminate ( 56 void); 57 58 #if (!ACPI_REDUCED_HARDWARE) 59 60 static void 61 AcpiUtFreeGpeLists ( 62 void); 63 64 #else 65 66 #define AcpiUtFreeGpeLists() 67 #endif /* !ACPI_REDUCED_HARDWARE */ 68 69 70 #if (!ACPI_REDUCED_HARDWARE) 71 /****************************************************************************** 72 * 73 * FUNCTION: AcpiUtFreeGpeLists 74 * 75 * PARAMETERS: none 76 * 77 * RETURN: none 78 * 79 * DESCRIPTION: Free global GPE lists 80 * 81 ******************************************************************************/ 82 83 static void 84 AcpiUtFreeGpeLists ( 85 void) 86 { 87 ACPI_GPE_BLOCK_INFO *GpeBlock; 88 ACPI_GPE_BLOCK_INFO *NextGpeBlock; 89 ACPI_GPE_XRUPT_INFO *GpeXruptInfo; 90 ACPI_GPE_XRUPT_INFO *NextGpeXruptInfo; 91 92 93 /* Free global GPE blocks and related info structures */ 94 95 GpeXruptInfo = AcpiGbl_GpeXruptListHead; 96 while (GpeXruptInfo) 97 { 98 GpeBlock = GpeXruptInfo->GpeBlockListHead; 99 while (GpeBlock) 100 { 101 NextGpeBlock = GpeBlock->Next; 102 ACPI_FREE (GpeBlock->EventInfo); 103 ACPI_FREE (GpeBlock->RegisterInfo); 104 ACPI_FREE (GpeBlock); 105 106 GpeBlock = NextGpeBlock; 107 } 108 NextGpeXruptInfo = GpeXruptInfo->Next; 109 ACPI_FREE (GpeXruptInfo); 110 GpeXruptInfo = NextGpeXruptInfo; 111 } 112 } 113 #endif /* !ACPI_REDUCED_HARDWARE */ 114 115 116 /******************************************************************************* 117 * 118 * FUNCTION: AcpiUtInitGlobals 119 * 120 * PARAMETERS: None 121 * 122 * RETURN: Status 123 * 124 * DESCRIPTION: Initialize ACPICA globals. All globals that require specific 125 * initialization should be initialized here. This allows for 126 * a warm restart. 127 * 128 ******************************************************************************/ 129 130 ACPI_STATUS 131 AcpiUtInitGlobals ( 132 void) 133 { 134 ACPI_STATUS Status; 135 UINT32 i; 136 137 138 ACPI_FUNCTION_TRACE (UtInitGlobals); 139 140 141 /* Create all memory caches */ 142 143 Status = AcpiUtCreateCaches (); 144 if (ACPI_FAILURE (Status)) 145 { 146 return_ACPI_STATUS (Status); 147 } 148 149 /* Address Range lists */ 150 151 for (i = 0; i < ACPI_ADDRESS_RANGE_MAX; i++) 152 { 153 AcpiGbl_AddressRangeList[i] = NULL; 154 } 155 156 /* Mutex locked flags */ 157 158 for (i = 0; i < ACPI_NUM_MUTEX; i++) 159 { 160 AcpiGbl_MutexInfo[i].Mutex = NULL; 161 AcpiGbl_MutexInfo[i].ThreadId = ACPI_MUTEX_NOT_ACQUIRED; 162 AcpiGbl_MutexInfo[i].UseCount = 0; 163 } 164 165 for (i = 0; i < ACPI_NUM_OWNERID_MASKS; i++) 166 { 167 AcpiGbl_OwnerIdMask[i] = 0; 168 } 169 170 /* Last OwnerID is never valid */ 171 172 AcpiGbl_OwnerIdMask[ACPI_NUM_OWNERID_MASKS - 1] = 0x80000000; 173 174 /* Event counters */ 175 176 AcpiMethodCount = 0; 177 AcpiSciCount = 0; 178 AcpiGpeCount = 0; 179 180 for (i = 0; i < ACPI_NUM_FIXED_EVENTS; i++) 181 { 182 AcpiFixedEventCount[i] = 0; 183 } 184 185 #if (!ACPI_REDUCED_HARDWARE) 186 187 /* GPE/SCI support */ 188 189 AcpiGbl_AllGpesInitialized = FALSE; 190 AcpiGbl_GpeXruptListHead = NULL; 191 AcpiGbl_GpeFadtBlocks[0] = NULL; 192 AcpiGbl_GpeFadtBlocks[1] = NULL; 193 AcpiCurrentGpeCount = 0; 194 195 AcpiGbl_GlobalEventHandler = NULL; 196 AcpiGbl_SciHandlerList = NULL; 197 198 #endif /* !ACPI_REDUCED_HARDWARE */ 199 200 /* Global handlers */ 201 202 AcpiGbl_GlobalNotify[0].Handler = NULL; 203 AcpiGbl_GlobalNotify[1].Handler = NULL; 204 AcpiGbl_ExceptionHandler = NULL; 205 AcpiGbl_InitHandler = NULL; 206 AcpiGbl_TableHandler = NULL; 207 AcpiGbl_InterfaceHandler = NULL; 208 209 /* Global Lock support */ 210 211 AcpiGbl_GlobalLockSemaphore = NULL; 212 AcpiGbl_GlobalLockMutex = NULL; 213 AcpiGbl_GlobalLockAcquired = FALSE; 214 AcpiGbl_GlobalLockHandle = 0; 215 AcpiGbl_GlobalLockPresent = FALSE; 216 217 /* Miscellaneous variables */ 218 219 AcpiGbl_DSDT = NULL; 220 AcpiGbl_CmSingleStep = FALSE; 221 AcpiGbl_Shutdown = FALSE; 222 AcpiGbl_NsLookupCount = 0; 223 AcpiGbl_PsFindCount = 0; 224 AcpiGbl_AcpiHardwarePresent = TRUE; 225 AcpiGbl_LastOwnerIdIndex = 0; 226 AcpiGbl_NextOwnerIdOffset = 0; 227 AcpiGbl_DebuggerConfiguration = DEBUGGER_THREADING; 228 AcpiGbl_OsiMutex = NULL; 229 230 /* Hardware oriented */ 231 232 AcpiGbl_EventsInitialized = FALSE; 233 AcpiGbl_SystemAwakeAndRunning = TRUE; 234 235 /* Namespace */ 236 237 AcpiGbl_RootNode = NULL; 238 AcpiGbl_RootNodeStruct.Name.Integer = ACPI_ROOT_NAME; 239 AcpiGbl_RootNodeStruct.DescriptorType = ACPI_DESC_TYPE_NAMED; 240 AcpiGbl_RootNodeStruct.Type = ACPI_TYPE_DEVICE; 241 AcpiGbl_RootNodeStruct.Parent = NULL; 242 AcpiGbl_RootNodeStruct.Child = NULL; 243 AcpiGbl_RootNodeStruct.Peer = NULL; 244 AcpiGbl_RootNodeStruct.Object = NULL; 245 246 247 #ifdef ACPI_DISASSEMBLER 248 AcpiGbl_ExternalList = NULL; 249 AcpiGbl_NumExternalMethods = 0; 250 AcpiGbl_ResolvedExternalMethods = 0; 251 #endif 252 253 #ifdef ACPI_DEBUG_OUTPUT 254 AcpiGbl_LowestStackPointer = ACPI_CAST_PTR (ACPI_SIZE, ACPI_SIZE_MAX); 255 #endif 256 257 #ifdef ACPI_DBG_TRACK_ALLOCATIONS 258 AcpiGbl_DisplayFinalMemStats = FALSE; 259 AcpiGbl_DisableMemTracking = FALSE; 260 #endif 261 262 return_ACPI_STATUS (AE_OK); 263 } 264 265 266 /****************************************************************************** 267 * 268 * FUNCTION: AcpiUtTerminate 269 * 270 * PARAMETERS: none 271 * 272 * RETURN: none 273 * 274 * DESCRIPTION: Free global memory 275 * 276 ******************************************************************************/ 277 278 static void 279 AcpiUtTerminate ( 280 void) 281 { 282 ACPI_FUNCTION_TRACE (UtTerminate); 283 284 AcpiUtFreeGpeLists (); 285 AcpiUtDeleteAddressLists (); 286 return_VOID; 287 } 288 289 290 /******************************************************************************* 291 * 292 * FUNCTION: AcpiUtSubsystemShutdown 293 * 294 * PARAMETERS: None 295 * 296 * RETURN: None 297 * 298 * DESCRIPTION: Shutdown the various components. Do not delete the mutex 299 * objects here, because the AML debugger may be still running. 300 * 301 ******************************************************************************/ 302 303 void 304 AcpiUtSubsystemShutdown ( 305 void) 306 { 307 ACPI_FUNCTION_TRACE (UtSubsystemShutdown); 308 309 310 /* Just exit if subsystem is already shutdown */ 311 312 if (AcpiGbl_Shutdown) 313 { 314 ACPI_ERROR ((AE_INFO, "ACPI Subsystem is already terminated")); 315 return_VOID; 316 } 317 318 /* Subsystem appears active, go ahead and shut it down */ 319 320 AcpiGbl_Shutdown = TRUE; 321 AcpiGbl_StartupFlags = 0; 322 ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Shutting down ACPI Subsystem\n")); 323 324 #ifndef ACPI_ASL_COMPILER 325 326 /* Close the AcpiEvent Handling */ 327 328 AcpiEvTerminate (); 329 330 /* Delete any dynamic _OSI interfaces */ 331 332 AcpiUtInterfaceTerminate (); 333 #endif 334 335 /* Close the Namespace */ 336 337 AcpiNsTerminate (); 338 339 /* Delete the ACPI tables */ 340 341 AcpiTbTerminate (); 342 343 /* Close the globals */ 344 345 AcpiUtTerminate (); 346 347 /* Purge the local caches */ 348 349 (void) AcpiUtDeleteCaches (); 350 return_VOID; 351 } 352