128c506b8Sjruoho /****************************************************************************** 228c506b8Sjruoho * 328c506b8Sjruoho * Module Name: utinit - Common ACPI subsystem initialization 428c506b8Sjruoho * 528c506b8Sjruoho *****************************************************************************/ 628c506b8Sjruoho 7124f4c82Sjruoho /* 8046a2985Schristos * Copyright (C) 2000 - 2023, Intel Corp. 928c506b8Sjruoho * All rights reserved. 1028c506b8Sjruoho * 11124f4c82Sjruoho * Redistribution and use in source and binary forms, with or without 12124f4c82Sjruoho * modification, are permitted provided that the following conditions 13124f4c82Sjruoho * are met: 14124f4c82Sjruoho * 1. Redistributions of source code must retain the above copyright 15124f4c82Sjruoho * notice, this list of conditions, and the following disclaimer, 16124f4c82Sjruoho * without modification. 17124f4c82Sjruoho * 2. Redistributions in binary form must reproduce at minimum a disclaimer 18124f4c82Sjruoho * substantially similar to the "NO WARRANTY" disclaimer below 19124f4c82Sjruoho * ("Disclaimer") and any redistribution must be conditioned upon 20124f4c82Sjruoho * including a substantially similar Disclaimer requirement for further 21124f4c82Sjruoho * binary redistribution. 22124f4c82Sjruoho * 3. Neither the names of the above-listed copyright holders nor the names 23124f4c82Sjruoho * of any contributors may be used to endorse or promote products derived 24124f4c82Sjruoho * from this software without specific prior written permission. 2528c506b8Sjruoho * 26124f4c82Sjruoho * Alternatively, this software may be distributed under the terms of the 27124f4c82Sjruoho * GNU General Public License ("GPL") version 2 as published by the Free 28124f4c82Sjruoho * Software Foundation. 2928c506b8Sjruoho * 30124f4c82Sjruoho * NO WARRANTY 31124f4c82Sjruoho * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 32124f4c82Sjruoho * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 3346a330b4Schristos * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 34124f4c82Sjruoho * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 35124f4c82Sjruoho * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 36124f4c82Sjruoho * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 37124f4c82Sjruoho * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 38124f4c82Sjruoho * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 39124f4c82Sjruoho * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 40124f4c82Sjruoho * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 41124f4c82Sjruoho * POSSIBILITY OF SUCH DAMAGES. 42124f4c82Sjruoho */ 4328c506b8Sjruoho 4428c506b8Sjruoho #include "acpi.h" 4528c506b8Sjruoho #include "accommon.h" 4628c506b8Sjruoho #include "acnamesp.h" 4728c506b8Sjruoho #include "acevents.h" 4828c506b8Sjruoho #include "actables.h" 4928c506b8Sjruoho 5028c506b8Sjruoho #define _COMPONENT ACPI_UTILITIES 5128c506b8Sjruoho ACPI_MODULE_NAME ("utinit") 5228c506b8Sjruoho 5328c506b8Sjruoho /* Local prototypes */ 5428c506b8Sjruoho 5528c506b8Sjruoho static void AcpiUtTerminate ( 5628c506b8Sjruoho void); 5728c506b8Sjruoho 58ff4a156dSchristos #if (!ACPI_REDUCED_HARDWARE) 5928c506b8Sjruoho 60ff4a156dSchristos static void 61ff4a156dSchristos AcpiUtFreeGpeLists ( 62ff4a156dSchristos void); 63ff4a156dSchristos 64ff4a156dSchristos #else 65ff4a156dSchristos 66ff4a156dSchristos #define AcpiUtFreeGpeLists() 67ff4a156dSchristos #endif /* !ACPI_REDUCED_HARDWARE */ 68ff4a156dSchristos 69ff4a156dSchristos 70ff4a156dSchristos #if (!ACPI_REDUCED_HARDWARE) 7128c506b8Sjruoho /****************************************************************************** 7228c506b8Sjruoho * 73ff4a156dSchristos * FUNCTION: AcpiUtFreeGpeLists 7428c506b8Sjruoho * 7528c506b8Sjruoho * PARAMETERS: none 7628c506b8Sjruoho * 7728c506b8Sjruoho * RETURN: none 7828c506b8Sjruoho * 79ff4a156dSchristos * DESCRIPTION: Free global GPE lists 8028c506b8Sjruoho * 8128c506b8Sjruoho ******************************************************************************/ 8228c506b8Sjruoho 8328c506b8Sjruoho static void 84ff4a156dSchristos AcpiUtFreeGpeLists ( 8528c506b8Sjruoho void) 8628c506b8Sjruoho { 8728c506b8Sjruoho ACPI_GPE_BLOCK_INFO *GpeBlock; 8828c506b8Sjruoho ACPI_GPE_BLOCK_INFO *NextGpeBlock; 8928c506b8Sjruoho ACPI_GPE_XRUPT_INFO *GpeXruptInfo; 9028c506b8Sjruoho ACPI_GPE_XRUPT_INFO *NextGpeXruptInfo; 9128c506b8Sjruoho 9228c506b8Sjruoho 9328c506b8Sjruoho /* Free global GPE blocks and related info structures */ 9428c506b8Sjruoho 9528c506b8Sjruoho GpeXruptInfo = AcpiGbl_GpeXruptListHead; 9628c506b8Sjruoho while (GpeXruptInfo) 9728c506b8Sjruoho { 9828c506b8Sjruoho GpeBlock = GpeXruptInfo->GpeBlockListHead; 9928c506b8Sjruoho while (GpeBlock) 10028c506b8Sjruoho { 10128c506b8Sjruoho NextGpeBlock = GpeBlock->Next; 10228c506b8Sjruoho ACPI_FREE (GpeBlock->EventInfo); 10328c506b8Sjruoho ACPI_FREE (GpeBlock->RegisterInfo); 10428c506b8Sjruoho ACPI_FREE (GpeBlock); 10528c506b8Sjruoho 10628c506b8Sjruoho GpeBlock = NextGpeBlock; 10728c506b8Sjruoho } 10828c506b8Sjruoho NextGpeXruptInfo = GpeXruptInfo->Next; 10928c506b8Sjruoho ACPI_FREE (GpeXruptInfo); 11028c506b8Sjruoho GpeXruptInfo = NextGpeXruptInfo; 11128c506b8Sjruoho } 112ff4a156dSchristos } 113ff4a156dSchristos #endif /* !ACPI_REDUCED_HARDWARE */ 11428c506b8Sjruoho 115ff4a156dSchristos 116460301d4Schristos /******************************************************************************* 117460301d4Schristos * 118460301d4Schristos * FUNCTION: AcpiUtInitGlobals 119460301d4Schristos * 120460301d4Schristos * PARAMETERS: None 121460301d4Schristos * 122460301d4Schristos * RETURN: Status 123460301d4Schristos * 124460301d4Schristos * DESCRIPTION: Initialize ACPICA globals. All globals that require specific 125460301d4Schristos * initialization should be initialized here. This allows for 126460301d4Schristos * a warm restart. 127460301d4Schristos * 128460301d4Schristos ******************************************************************************/ 129460301d4Schristos 130460301d4Schristos ACPI_STATUS 131460301d4Schristos AcpiUtInitGlobals ( 132460301d4Schristos void) 133460301d4Schristos { 134460301d4Schristos ACPI_STATUS Status; 135460301d4Schristos UINT32 i; 136460301d4Schristos 137460301d4Schristos 138460301d4Schristos ACPI_FUNCTION_TRACE (UtInitGlobals); 139460301d4Schristos 140460301d4Schristos 141460301d4Schristos /* Create all memory caches */ 142460301d4Schristos 143460301d4Schristos Status = AcpiUtCreateCaches (); 144460301d4Schristos if (ACPI_FAILURE (Status)) 145460301d4Schristos { 146460301d4Schristos return_ACPI_STATUS (Status); 147460301d4Schristos } 148460301d4Schristos 149460301d4Schristos /* Address Range lists */ 150460301d4Schristos 151460301d4Schristos for (i = 0; i < ACPI_ADDRESS_RANGE_MAX; i++) 152460301d4Schristos { 153460301d4Schristos AcpiGbl_AddressRangeList[i] = NULL; 154460301d4Schristos } 155460301d4Schristos 156460301d4Schristos /* Mutex locked flags */ 157460301d4Schristos 158460301d4Schristos for (i = 0; i < ACPI_NUM_MUTEX; i++) 159460301d4Schristos { 160460301d4Schristos AcpiGbl_MutexInfo[i].Mutex = NULL; 161460301d4Schristos AcpiGbl_MutexInfo[i].ThreadId = ACPI_MUTEX_NOT_ACQUIRED; 162460301d4Schristos AcpiGbl_MutexInfo[i].UseCount = 0; 163460301d4Schristos } 164460301d4Schristos 165460301d4Schristos for (i = 0; i < ACPI_NUM_OWNERID_MASKS; i++) 166460301d4Schristos { 167460301d4Schristos AcpiGbl_OwnerIdMask[i] = 0; 168460301d4Schristos } 169460301d4Schristos 170460301d4Schristos /* Last OwnerID is never valid */ 171460301d4Schristos 172460301d4Schristos AcpiGbl_OwnerIdMask[ACPI_NUM_OWNERID_MASKS - 1] = 0x80000000; 173460301d4Schristos 174460301d4Schristos /* Event counters */ 175460301d4Schristos 176460301d4Schristos AcpiMethodCount = 0; 177460301d4Schristos AcpiSciCount = 0; 178460301d4Schristos AcpiGpeCount = 0; 179460301d4Schristos 180460301d4Schristos for (i = 0; i < ACPI_NUM_FIXED_EVENTS; i++) 181460301d4Schristos { 182460301d4Schristos AcpiFixedEventCount[i] = 0; 183460301d4Schristos } 184460301d4Schristos 185460301d4Schristos #if (!ACPI_REDUCED_HARDWARE) 186460301d4Schristos 187460301d4Schristos /* GPE/SCI support */ 188460301d4Schristos 189460301d4Schristos AcpiGbl_AllGpesInitialized = FALSE; 190460301d4Schristos AcpiGbl_GpeXruptListHead = NULL; 191460301d4Schristos AcpiGbl_GpeFadtBlocks[0] = NULL; 192460301d4Schristos AcpiGbl_GpeFadtBlocks[1] = NULL; 193460301d4Schristos AcpiCurrentGpeCount = 0; 194460301d4Schristos 195460301d4Schristos AcpiGbl_GlobalEventHandler = NULL; 196460301d4Schristos AcpiGbl_SciHandlerList = NULL; 197460301d4Schristos 198460301d4Schristos #endif /* !ACPI_REDUCED_HARDWARE */ 199460301d4Schristos 200460301d4Schristos /* Global handlers */ 201460301d4Schristos 202460301d4Schristos AcpiGbl_GlobalNotify[0].Handler = NULL; 203460301d4Schristos AcpiGbl_GlobalNotify[1].Handler = NULL; 204460301d4Schristos AcpiGbl_ExceptionHandler = NULL; 205460301d4Schristos AcpiGbl_InitHandler = NULL; 206460301d4Schristos AcpiGbl_TableHandler = NULL; 207460301d4Schristos AcpiGbl_InterfaceHandler = NULL; 208460301d4Schristos 209460301d4Schristos /* Global Lock support */ 210460301d4Schristos 211*c7960b37Schristos AcpiGbl_GlobalLockSemaphore = ACPI_SEMAPHORE_NULL; 212460301d4Schristos AcpiGbl_GlobalLockMutex = NULL; 213460301d4Schristos AcpiGbl_GlobalLockAcquired = FALSE; 214460301d4Schristos AcpiGbl_GlobalLockHandle = 0; 215460301d4Schristos AcpiGbl_GlobalLockPresent = FALSE; 216460301d4Schristos 217460301d4Schristos /* Miscellaneous variables */ 218460301d4Schristos 219460301d4Schristos AcpiGbl_DSDT = NULL; 220460301d4Schristos AcpiGbl_CmSingleStep = FALSE; 221460301d4Schristos AcpiGbl_Shutdown = FALSE; 222460301d4Schristos AcpiGbl_NsLookupCount = 0; 223460301d4Schristos AcpiGbl_PsFindCount = 0; 224460301d4Schristos AcpiGbl_AcpiHardwarePresent = TRUE; 225460301d4Schristos AcpiGbl_LastOwnerIdIndex = 0; 226460301d4Schristos AcpiGbl_NextOwnerIdOffset = 0; 227460301d4Schristos AcpiGbl_DebuggerConfiguration = DEBUGGER_THREADING; 228460301d4Schristos AcpiGbl_OsiMutex = NULL; 229460301d4Schristos 230460301d4Schristos /* Hardware oriented */ 231460301d4Schristos 232460301d4Schristos AcpiGbl_EventsInitialized = FALSE; 233460301d4Schristos AcpiGbl_SystemAwakeAndRunning = TRUE; 234460301d4Schristos 235460301d4Schristos /* Namespace */ 236460301d4Schristos 237460301d4Schristos AcpiGbl_RootNode = NULL; 238460301d4Schristos AcpiGbl_RootNodeStruct.Name.Integer = ACPI_ROOT_NAME; 239460301d4Schristos AcpiGbl_RootNodeStruct.DescriptorType = ACPI_DESC_TYPE_NAMED; 240460301d4Schristos AcpiGbl_RootNodeStruct.Type = ACPI_TYPE_DEVICE; 241460301d4Schristos AcpiGbl_RootNodeStruct.Parent = NULL; 242460301d4Schristos AcpiGbl_RootNodeStruct.Child = NULL; 243460301d4Schristos AcpiGbl_RootNodeStruct.Peer = NULL; 244460301d4Schristos AcpiGbl_RootNodeStruct.Object = NULL; 245460301d4Schristos 246460301d4Schristos 247460301d4Schristos #ifdef ACPI_DISASSEMBLER 248460301d4Schristos AcpiGbl_ExternalList = NULL; 249460301d4Schristos AcpiGbl_NumExternalMethods = 0; 250460301d4Schristos AcpiGbl_ResolvedExternalMethods = 0; 251460301d4Schristos #endif 252460301d4Schristos 253460301d4Schristos #ifdef ACPI_DEBUG_OUTPUT 254460301d4Schristos AcpiGbl_LowestStackPointer = ACPI_CAST_PTR (ACPI_SIZE, ACPI_SIZE_MAX); 255460301d4Schristos #endif 256460301d4Schristos 257460301d4Schristos #ifdef ACPI_DBG_TRACK_ALLOCATIONS 258460301d4Schristos AcpiGbl_DisplayFinalMemStats = FALSE; 259460301d4Schristos AcpiGbl_DisableMemTracking = FALSE; 260460301d4Schristos #endif 261460301d4Schristos 262460301d4Schristos return_ACPI_STATUS (AE_OK); 263460301d4Schristos } 264460301d4Schristos 265460301d4Schristos 266ff4a156dSchristos /****************************************************************************** 267ff4a156dSchristos * 268ff4a156dSchristos * FUNCTION: AcpiUtTerminate 269ff4a156dSchristos * 270ff4a156dSchristos * PARAMETERS: none 271ff4a156dSchristos * 272ff4a156dSchristos * RETURN: none 273ff4a156dSchristos * 274ff4a156dSchristos * DESCRIPTION: Free global memory 275ff4a156dSchristos * 276ff4a156dSchristos ******************************************************************************/ 277ff4a156dSchristos 278ff4a156dSchristos static void 279ff4a156dSchristos AcpiUtTerminate ( 280ff4a156dSchristos void) 281ff4a156dSchristos { 282ff4a156dSchristos ACPI_FUNCTION_TRACE (UtTerminate); 283ff4a156dSchristos 284ff4a156dSchristos AcpiUtFreeGpeLists (); 285ff4a156dSchristos AcpiUtDeleteAddressLists (); 28628c506b8Sjruoho return_VOID; 28728c506b8Sjruoho } 28828c506b8Sjruoho 28928c506b8Sjruoho 29028c506b8Sjruoho /******************************************************************************* 29128c506b8Sjruoho * 29228c506b8Sjruoho * FUNCTION: AcpiUtSubsystemShutdown 29328c506b8Sjruoho * 29428c506b8Sjruoho * PARAMETERS: None 29528c506b8Sjruoho * 29628c506b8Sjruoho * RETURN: None 29728c506b8Sjruoho * 29828c506b8Sjruoho * DESCRIPTION: Shutdown the various components. Do not delete the mutex 29928c506b8Sjruoho * objects here, because the AML debugger may be still running. 30028c506b8Sjruoho * 30128c506b8Sjruoho ******************************************************************************/ 30228c506b8Sjruoho 30328c506b8Sjruoho void 30428c506b8Sjruoho AcpiUtSubsystemShutdown ( 30528c506b8Sjruoho void) 30628c506b8Sjruoho { 30728c506b8Sjruoho ACPI_FUNCTION_TRACE (UtSubsystemShutdown); 30828c506b8Sjruoho 30928c506b8Sjruoho 31071e38f1dSchristos /* Just exit if subsystem is already shutdown */ 31171e38f1dSchristos 31271e38f1dSchristos if (AcpiGbl_Shutdown) 31371e38f1dSchristos { 31471e38f1dSchristos ACPI_ERROR ((AE_INFO, "ACPI Subsystem is already terminated")); 31571e38f1dSchristos return_VOID; 31671e38f1dSchristos } 31771e38f1dSchristos 31871e38f1dSchristos /* Subsystem appears active, go ahead and shut it down */ 31971e38f1dSchristos 32071e38f1dSchristos AcpiGbl_Shutdown = TRUE; 32171e38f1dSchristos AcpiGbl_StartupFlags = 0; 32271e38f1dSchristos ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Shutting down ACPI Subsystem\n")); 32371e38f1dSchristos 32428c506b8Sjruoho #ifndef ACPI_ASL_COMPILER 32528c506b8Sjruoho 32628c506b8Sjruoho /* Close the AcpiEvent Handling */ 32728c506b8Sjruoho 32828c506b8Sjruoho AcpiEvTerminate (); 329124f4c82Sjruoho 330124f4c82Sjruoho /* Delete any dynamic _OSI interfaces */ 331124f4c82Sjruoho 332124f4c82Sjruoho AcpiUtInterfaceTerminate (); 33328c506b8Sjruoho #endif 33428c506b8Sjruoho 33528c506b8Sjruoho /* Close the Namespace */ 33628c506b8Sjruoho 33728c506b8Sjruoho AcpiNsTerminate (); 33828c506b8Sjruoho 33928c506b8Sjruoho /* Delete the ACPI tables */ 34028c506b8Sjruoho 34128c506b8Sjruoho AcpiTbTerminate (); 34228c506b8Sjruoho 34328c506b8Sjruoho /* Close the globals */ 34428c506b8Sjruoho 34528c506b8Sjruoho AcpiUtTerminate (); 34628c506b8Sjruoho 34728c506b8Sjruoho /* Purge the local caches */ 34828c506b8Sjruoho 34928c506b8Sjruoho (void) AcpiUtDeleteCaches (); 35028c506b8Sjruoho return_VOID; 35128c506b8Sjruoho } 352