167754Smsmith/****************************************************************************** 267754Smsmith * 377424Smsmith * Module Name: utinit - Common ACPI subsystem initialization 467754Smsmith * 567754Smsmith *****************************************************************************/ 667754Smsmith 7217365Sjkim/* 8281075Sdim * Copyright (C) 2000 - 2015, Intel Corp. 970243Smsmith * All rights reserved. 1067754Smsmith * 11217365Sjkim * Redistribution and use in source and binary forms, with or without 12217365Sjkim * modification, are permitted provided that the following conditions 13217365Sjkim * are met: 14217365Sjkim * 1. Redistributions of source code must retain the above copyright 15217365Sjkim * notice, this list of conditions, and the following disclaimer, 16217365Sjkim * without modification. 17217365Sjkim * 2. Redistributions in binary form must reproduce at minimum a disclaimer 18217365Sjkim * substantially similar to the "NO WARRANTY" disclaimer below 19217365Sjkim * ("Disclaimer") and any redistribution must be conditioned upon 20217365Sjkim * including a substantially similar Disclaimer requirement for further 21217365Sjkim * binary redistribution. 22217365Sjkim * 3. Neither the names of the above-listed copyright holders nor the names 23217365Sjkim * of any contributors may be used to endorse or promote products derived 24217365Sjkim * from this software without specific prior written permission. 2567754Smsmith * 26217365Sjkim * Alternatively, this software may be distributed under the terms of the 27217365Sjkim * GNU General Public License ("GPL") version 2 as published by the Free 28217365Sjkim * Software Foundation. 2967754Smsmith * 30217365Sjkim * NO WARRANTY 31217365Sjkim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 32217365Sjkim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 33217365Sjkim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 34217365Sjkim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 35217365Sjkim * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 36217365Sjkim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 37217365Sjkim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 38217365Sjkim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 39217365Sjkim * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 40217365Sjkim * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 41217365Sjkim * POSSIBILITY OF SUCH DAMAGES. 42217365Sjkim */ 4367754Smsmith 44193341Sjkim#include <contrib/dev/acpica/include/acpi.h> 45193341Sjkim#include <contrib/dev/acpica/include/accommon.h> 46193341Sjkim#include <contrib/dev/acpica/include/acnamesp.h> 47193341Sjkim#include <contrib/dev/acpica/include/acevents.h> 48193341Sjkim#include <contrib/dev/acpica/include/actables.h> 4967754Smsmith 5077424Smsmith#define _COMPONENT ACPI_UTILITIES 5191116Smsmith ACPI_MODULE_NAME ("utinit") 5267754Smsmith 53151937Sjkim/* Local prototypes */ 5467754Smsmith 55151937Sjkimstatic void AcpiUtTerminate ( 56151937Sjkim void); 57151937Sjkim 58231844Sjkim#if (!ACPI_REDUCED_HARDWARE) 59151937Sjkim 60231844Sjkimstatic void 61231844SjkimAcpiUtFreeGpeLists ( 62231844Sjkim void); 63231844Sjkim 64231844Sjkim#else 65231844Sjkim 66231844Sjkim#define AcpiUtFreeGpeLists() 67231844Sjkim#endif /* !ACPI_REDUCED_HARDWARE */ 68231844Sjkim 69231844Sjkim 70231844Sjkim#if (!ACPI_REDUCED_HARDWARE) 7167754Smsmith/****************************************************************************** 7267754Smsmith * 73231844Sjkim * FUNCTION: AcpiUtFreeGpeLists 7467754Smsmith * 7567754Smsmith * PARAMETERS: none 7667754Smsmith * 7767754Smsmith * RETURN: none 7867754Smsmith * 79231844Sjkim * DESCRIPTION: Free global GPE lists 8067754Smsmith * 8167754Smsmith ******************************************************************************/ 8267754Smsmith 83151937Sjkimstatic void 84231844SjkimAcpiUtFreeGpeLists ( 85151937Sjkim void) 8667754Smsmith{ 87117521Snjl ACPI_GPE_BLOCK_INFO *GpeBlock; 88117521Snjl ACPI_GPE_BLOCK_INFO *NextGpeBlock; 89117521Snjl ACPI_GPE_XRUPT_INFO *GpeXruptInfo; 90117521Snjl ACPI_GPE_XRUPT_INFO *NextGpeXruptInfo; 9167754Smsmith 92117521Snjl 93117521Snjl /* Free global GPE blocks and related info structures */ 94117521Snjl 95117521Snjl GpeXruptInfo = AcpiGbl_GpeXruptListHead; 96117521Snjl while (GpeXruptInfo) 97117521Snjl { 98117521Snjl GpeBlock = GpeXruptInfo->GpeBlockListHead; 99117521Snjl while (GpeBlock) 100117521Snjl { 101117521Snjl NextGpeBlock = GpeBlock->Next; 102167802Sjkim ACPI_FREE (GpeBlock->EventInfo); 103167802Sjkim ACPI_FREE (GpeBlock->RegisterInfo); 104167802Sjkim ACPI_FREE (GpeBlock); 105117521Snjl 106117521Snjl GpeBlock = NextGpeBlock; 107117521Snjl } 108117521Snjl NextGpeXruptInfo = GpeXruptInfo->Next; 109167802Sjkim ACPI_FREE (GpeXruptInfo); 110117521Snjl GpeXruptInfo = NextGpeXruptInfo; 111117521Snjl } 112231844Sjkim} 113231844Sjkim#endif /* !ACPI_REDUCED_HARDWARE */ 114117521Snjl 115231844Sjkim 116281075Sdim/******************************************************************************* 117281075Sdim * 118281075Sdim * FUNCTION: AcpiUtInitGlobals 119281075Sdim * 120281075Sdim * PARAMETERS: None 121281075Sdim * 122281075Sdim * RETURN: Status 123281075Sdim * 124281075Sdim * DESCRIPTION: Initialize ACPICA globals. All globals that require specific 125281075Sdim * initialization should be initialized here. This allows for 126281075Sdim * a warm restart. 127281075Sdim * 128281075Sdim ******************************************************************************/ 129281075Sdim 130281075SdimACPI_STATUS 131281075SdimAcpiUtInitGlobals ( 132281075Sdim void) 133281075Sdim{ 134281075Sdim ACPI_STATUS Status; 135281075Sdim UINT32 i; 136281075Sdim 137281075Sdim 138281075Sdim ACPI_FUNCTION_TRACE (UtInitGlobals); 139281075Sdim 140281075Sdim 141281075Sdim /* Create all memory caches */ 142281075Sdim 143281075Sdim Status = AcpiUtCreateCaches (); 144281075Sdim if (ACPI_FAILURE (Status)) 145281075Sdim { 146281075Sdim return_ACPI_STATUS (Status); 147281075Sdim } 148281075Sdim 149281075Sdim /* Address Range lists */ 150281075Sdim 151281075Sdim for (i = 0; i < ACPI_ADDRESS_RANGE_MAX; i++) 152281075Sdim { 153281075Sdim AcpiGbl_AddressRangeList[i] = NULL; 154281075Sdim } 155281075Sdim 156281075Sdim /* Mutex locked flags */ 157281075Sdim 158281075Sdim for (i = 0; i < ACPI_NUM_MUTEX; i++) 159281075Sdim { 160281075Sdim AcpiGbl_MutexInfo[i].Mutex = NULL; 161281075Sdim AcpiGbl_MutexInfo[i].ThreadId = ACPI_MUTEX_NOT_ACQUIRED; 162281075Sdim AcpiGbl_MutexInfo[i].UseCount = 0; 163281075Sdim } 164281075Sdim 165281075Sdim for (i = 0; i < ACPI_NUM_OWNERID_MASKS; i++) 166281075Sdim { 167281075Sdim AcpiGbl_OwnerIdMask[i] = 0; 168281075Sdim } 169281075Sdim 170281075Sdim /* Last OwnerID is never valid */ 171281075Sdim 172281075Sdim AcpiGbl_OwnerIdMask[ACPI_NUM_OWNERID_MASKS - 1] = 0x80000000; 173281075Sdim 174281075Sdim /* Event counters */ 175281075Sdim 176281075Sdim AcpiMethodCount = 0; 177281075Sdim AcpiSciCount = 0; 178281075Sdim AcpiGpeCount = 0; 179281075Sdim 180281075Sdim for (i = 0; i < ACPI_NUM_FIXED_EVENTS; i++) 181281075Sdim { 182281075Sdim AcpiFixedEventCount[i] = 0; 183281075Sdim } 184281075Sdim 185281075Sdim#if (!ACPI_REDUCED_HARDWARE) 186281075Sdim 187281075Sdim /* GPE/SCI support */ 188281075Sdim 189281075Sdim AcpiGbl_AllGpesInitialized = FALSE; 190281075Sdim AcpiGbl_GpeXruptListHead = NULL; 191281075Sdim AcpiGbl_GpeFadtBlocks[0] = NULL; 192281075Sdim AcpiGbl_GpeFadtBlocks[1] = NULL; 193281075Sdim AcpiCurrentGpeCount = 0; 194281075Sdim 195281075Sdim AcpiGbl_GlobalEventHandler = NULL; 196281075Sdim AcpiGbl_SciHandlerList = NULL; 197281075Sdim 198281075Sdim#endif /* !ACPI_REDUCED_HARDWARE */ 199281075Sdim 200281075Sdim /* Global handlers */ 201281075Sdim 202281075Sdim AcpiGbl_GlobalNotify[0].Handler = NULL; 203281075Sdim AcpiGbl_GlobalNotify[1].Handler = NULL; 204281075Sdim AcpiGbl_ExceptionHandler = NULL; 205281075Sdim AcpiGbl_InitHandler = NULL; 206281075Sdim AcpiGbl_TableHandler = NULL; 207281075Sdim AcpiGbl_InterfaceHandler = NULL; 208281075Sdim 209281075Sdim /* Global Lock support */ 210281075Sdim 211281075Sdim AcpiGbl_GlobalLockSemaphore = NULL; 212281075Sdim AcpiGbl_GlobalLockMutex = NULL; 213281075Sdim AcpiGbl_GlobalLockAcquired = FALSE; 214281075Sdim AcpiGbl_GlobalLockHandle = 0; 215281075Sdim AcpiGbl_GlobalLockPresent = FALSE; 216281075Sdim 217281075Sdim /* Miscellaneous variables */ 218281075Sdim 219281075Sdim AcpiGbl_DSDT = NULL; 220281075Sdim AcpiGbl_CmSingleStep = FALSE; 221281075Sdim AcpiGbl_Shutdown = FALSE; 222281075Sdim AcpiGbl_NsLookupCount = 0; 223281075Sdim AcpiGbl_PsFindCount = 0; 224281075Sdim AcpiGbl_AcpiHardwarePresent = TRUE; 225281075Sdim AcpiGbl_LastOwnerIdIndex = 0; 226281075Sdim AcpiGbl_NextOwnerIdOffset = 0; 227281075Sdim AcpiGbl_TraceDbgLevel = 0; 228281075Sdim AcpiGbl_TraceDbgLayer = 0; 229281075Sdim AcpiGbl_DebuggerConfiguration = DEBUGGER_THREADING; 230281075Sdim AcpiGbl_OsiMutex = NULL; 231281075Sdim AcpiGbl_RegMethodsExecuted = FALSE; 232281075Sdim 233281075Sdim /* Hardware oriented */ 234281075Sdim 235281075Sdim AcpiGbl_EventsInitialized = FALSE; 236281075Sdim AcpiGbl_SystemAwakeAndRunning = TRUE; 237281075Sdim 238281075Sdim /* Namespace */ 239281075Sdim 240281075Sdim AcpiGbl_ModuleCodeList = NULL; 241281075Sdim AcpiGbl_RootNode = NULL; 242281075Sdim AcpiGbl_RootNodeStruct.Name.Integer = ACPI_ROOT_NAME; 243281075Sdim AcpiGbl_RootNodeStruct.DescriptorType = ACPI_DESC_TYPE_NAMED; 244281075Sdim AcpiGbl_RootNodeStruct.Type = ACPI_TYPE_DEVICE; 245281075Sdim AcpiGbl_RootNodeStruct.Parent = NULL; 246281075Sdim AcpiGbl_RootNodeStruct.Child = NULL; 247281075Sdim AcpiGbl_RootNodeStruct.Peer = NULL; 248281075Sdim AcpiGbl_RootNodeStruct.Object = NULL; 249281075Sdim 250281075Sdim 251281075Sdim#ifdef ACPI_DISASSEMBLER 252281075Sdim AcpiGbl_ExternalList = NULL; 253281075Sdim AcpiGbl_NumExternalMethods = 0; 254281075Sdim AcpiGbl_ResolvedExternalMethods = 0; 255281075Sdim#endif 256281075Sdim 257281075Sdim#ifdef ACPI_DEBUG_OUTPUT 258281075Sdim AcpiGbl_LowestStackPointer = ACPI_CAST_PTR (ACPI_SIZE, ACPI_SIZE_MAX); 259281075Sdim#endif 260281075Sdim 261281075Sdim#ifdef ACPI_DBG_TRACK_ALLOCATIONS 262281075Sdim AcpiGbl_DisplayFinalMemStats = FALSE; 263281075Sdim AcpiGbl_DisableMemTracking = FALSE; 264281075Sdim#endif 265281075Sdim 266281075Sdim ACPI_DEBUGGER_EXEC (AcpiGbl_DbTerminateThreads = FALSE); 267281075Sdim 268281075Sdim return_ACPI_STATUS (AE_OK); 269281075Sdim} 270281075Sdim 271281075Sdim 272231844Sjkim/****************************************************************************** 273231844Sjkim * 274231844Sjkim * FUNCTION: AcpiUtTerminate 275231844Sjkim * 276231844Sjkim * PARAMETERS: none 277231844Sjkim * 278231844Sjkim * RETURN: none 279231844Sjkim * 280231844Sjkim * DESCRIPTION: Free global memory 281231844Sjkim * 282231844Sjkim ******************************************************************************/ 283231844Sjkim 284231844Sjkimstatic void 285231844SjkimAcpiUtTerminate ( 286231844Sjkim void) 287231844Sjkim{ 288231844Sjkim ACPI_FUNCTION_TRACE (UtTerminate); 289231844Sjkim 290231844Sjkim AcpiUtFreeGpeLists (); 291229989Sjkim AcpiUtDeleteAddressLists (); 29267754Smsmith return_VOID; 29367754Smsmith} 29467754Smsmith 29567754Smsmith 29677424Smsmith/******************************************************************************* 29767754Smsmith * 29877424Smsmith * FUNCTION: AcpiUtSubsystemShutdown 29967754Smsmith * 300197104Sjkim * PARAMETERS: None 30167754Smsmith * 302197104Sjkim * RETURN: None 30367754Smsmith * 304197104Sjkim * DESCRIPTION: Shutdown the various components. Do not delete the mutex 305197104Sjkim * objects here, because the AML debugger may be still running. 30667754Smsmith * 30767754Smsmith ******************************************************************************/ 30867754Smsmith 30999679Siwasakivoid 310151937SjkimAcpiUtSubsystemShutdown ( 311151937Sjkim void) 31267754Smsmith{ 313167802Sjkim ACPI_FUNCTION_TRACE (UtSubsystemShutdown); 31467754Smsmith 31567754Smsmith 316193267Sjkim#ifndef ACPI_ASL_COMPILER 317193267Sjkim 318102550Siwasaki /* Close the AcpiEvent Handling */ 319102550Siwasaki 320102550Siwasaki AcpiEvTerminate (); 321210976Sjkim 322210976Sjkim /* Delete any dynamic _OSI interfaces */ 323210976Sjkim 324210976Sjkim AcpiUtInterfaceTerminate (); 325193267Sjkim#endif 326102550Siwasaki 32767754Smsmith /* Close the Namespace */ 32867754Smsmith 32967754Smsmith AcpiNsTerminate (); 33067754Smsmith 331167802Sjkim /* Delete the ACPI tables */ 332167802Sjkim 333167802Sjkim AcpiTbTerminate (); 334167802Sjkim 33567754Smsmith /* Close the globals */ 33667754Smsmith 33777424Smsmith AcpiUtTerminate (); 33867754Smsmith 33987031Smsmith /* Purge the local caches */ 34067754Smsmith 341151937Sjkim (void) AcpiUtDeleteCaches (); 34299679Siwasaki return_VOID; 34367754Smsmith} 344