utinit.c revision 7b1019a6d29ccb7999dc76cba3dde1c627e8e609
2N/A/******************************************************************************
2N/A *
2N/A * Module Name: utinit - Common ACPI subsystem initialization
2N/A *
2N/A *****************************************************************************/
2N/A
2N/A/*
2N/A * Copyright (C) 2000 - 2016, Intel Corp.
2N/A * All rights reserved.
2N/A *
2N/A * Redistribution and use in source and binary forms, with or without
2N/A * modification, are permitted provided that the following conditions
2N/A * are met:
2N/A * 1. Redistributions of source code must retain the above copyright
2N/A * notice, this list of conditions, and the following disclaimer,
2N/A * without modification.
2N/A * 2. Redistributions in binary form must reproduce at minimum a disclaimer
2N/A * substantially similar to the "NO WARRANTY" disclaimer below
2N/A * ("Disclaimer") and any redistribution must be conditioned upon
2N/A * including a substantially similar Disclaimer requirement for further
2N/A * binary redistribution.
2N/A * 3. Neither the names of the above-listed copyright holders nor the names
2N/A * of any contributors may be used to endorse or promote products derived
2N/A * from this software without specific prior written permission.
2N/A *
2N/A * Alternatively, this software may be distributed under the terms of the
2N/A * GNU General Public License ("GPL") version 2 as published by the Free
2N/A * Software Foundation.
2N/A *
2N/A * NO WARRANTY
2N/A * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
2N/A * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2N/A * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
2N/A * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2N/A * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2N/A * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2N/A * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2N/A * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
2N/A * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
2N/A * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
2N/A * POSSIBILITY OF SUCH DAMAGES.
2N/A */
2N/A
2N/A#include "acpi.h"
2N/A#include "accommon.h"
2N/A#include "acnamesp.h"
2N/A#include "acevents.h"
2N/A#include "actables.h"
2N/A
2N/A#define _COMPONENT ACPI_UTILITIES
2N/A ACPI_MODULE_NAME ("utinit")
2N/A
2N/A/* Local prototypes */
2N/A
2N/Astatic void AcpiUtTerminate (
2N/A void);
2N/A
2N/A#if (!ACPI_REDUCED_HARDWARE)
2N/A
2N/Astatic void
2N/AAcpiUtFreeGpeLists (
2N/A void);
2N/A
2N/A#else
2N/A
2N/A#define AcpiUtFreeGpeLists()
2N/A#endif /* !ACPI_REDUCED_HARDWARE */
2N/A
2N/A
2N/A#if (!ACPI_REDUCED_HARDWARE)
2N/A/******************************************************************************
2N/A *
2N/A * FUNCTION: AcpiUtFreeGpeLists
2N/A *
2N/A * PARAMETERS: none
2N/A *
2N/A * RETURN: none
2N/A *
2N/A * DESCRIPTION: Free global GPE lists
2N/A *
2N/A ******************************************************************************/
2N/A
2N/Astatic void
2N/AAcpiUtFreeGpeLists (
2N/A void)
2N/A{
2N/A ACPI_GPE_BLOCK_INFO *GpeBlock;
2N/A ACPI_GPE_BLOCK_INFO *NextGpeBlock;
2N/A ACPI_GPE_XRUPT_INFO *GpeXruptInfo;
2N/A ACPI_GPE_XRUPT_INFO *NextGpeXruptInfo;
2N/A
2N/A
2N/A /* Free global GPE blocks and related info structures */
2N/A
2N/A GpeXruptInfo = AcpiGbl_GpeXruptListHead;
2N/A while (GpeXruptInfo)
2N/A {
2N/A GpeBlock = GpeXruptInfo->GpeBlockListHead;
2N/A while (GpeBlock)
2N/A {
2N/A NextGpeBlock = GpeBlock->Next;
2N/A ACPI_FREE (GpeBlock->EventInfo);
2N/A ACPI_FREE (GpeBlock->RegisterInfo);
2N/A ACPI_FREE (GpeBlock);
2N/A
2N/A GpeBlock = NextGpeBlock;
2N/A }
2N/A NextGpeXruptInfo = GpeXruptInfo->Next;
2N/A ACPI_FREE (GpeXruptInfo);
2N/A GpeXruptInfo = NextGpeXruptInfo;
2N/A }
2N/A}
2N/A#endif /* !ACPI_REDUCED_HARDWARE */
2N/A
2N/A
2N/A/*******************************************************************************
2N/A *
2N/A * FUNCTION: AcpiUtInitGlobals
2N/A *
2N/A * PARAMETERS: None
2N/A *
2N/A * RETURN: Status
2N/A *
2N/A * DESCRIPTION: Initialize ACPICA globals. All globals that require specific
2N/A * initialization should be initialized here. This allows for
2N/A * a warm restart.
2N/A *
2N/A ******************************************************************************/
2N/A
2N/AACPI_STATUS
2N/AAcpiUtInitGlobals (
2N/A void)
2N/A{
2N/A ACPI_STATUS Status;
2N/A UINT32 i;
2N/A
2N/A
2N/A ACPI_FUNCTION_TRACE (UtInitGlobals);
2N/A
2N/A
2N/A /* Create all memory caches */
2N/A
2N/A Status = AcpiUtCreateCaches ();
2N/A if (ACPI_FAILURE (Status))
2N/A {
2N/A return_ACPI_STATUS (Status);
2N/A }
2N/A
2N/A /* Address Range lists */
2N/A
2N/A for (i = 0; i < ACPI_ADDRESS_RANGE_MAX; i++)
2N/A {
2N/A AcpiGbl_AddressRangeList[i] = NULL;
2N/A }
2N/A
2N/A /* Mutex locked flags */
2N/A
2N/A for (i = 0; i < ACPI_NUM_MUTEX; i++)
2N/A {
2N/A AcpiGbl_MutexInfo[i].Mutex = NULL;
2N/A AcpiGbl_MutexInfo[i].ThreadId = ACPI_MUTEX_NOT_ACQUIRED;
2N/A AcpiGbl_MutexInfo[i].UseCount = 0;
2N/A }
2N/A
2N/A for (i = 0; i < ACPI_NUM_OWNERID_MASKS; i++)
2N/A {
2N/A AcpiGbl_OwnerIdMask[i] = 0;
2N/A }
2N/A
2N/A /* Last OwnerID is never valid */
2N/A
2N/A AcpiGbl_OwnerIdMask[ACPI_NUM_OWNERID_MASKS - 1] = 0x80000000;
2N/A
2N/A /* Event counters */
2N/A
2N/A AcpiMethodCount = 0;
2N/A AcpiSciCount = 0;
2N/A AcpiGpeCount = 0;
2N/A
2N/A for (i = 0; i < ACPI_NUM_FIXED_EVENTS; i++)
2N/A {
2N/A AcpiFixedEventCount[i] = 0;
2N/A }
2N/A
2N/A#if (!ACPI_REDUCED_HARDWARE)
2N/A
2N/A /* GPE/SCI support */
2N/A
2N/A AcpiGbl_AllGpesInitialized = FALSE;
2N/A AcpiGbl_GpeXruptListHead = NULL;
2N/A AcpiGbl_GpeFadtBlocks[0] = NULL;
2N/A AcpiGbl_GpeFadtBlocks[1] = NULL;
2N/A AcpiCurrentGpeCount = 0;
2N/A
2N/A AcpiGbl_GlobalEventHandler = NULL;
2N/A AcpiGbl_SciHandlerList = NULL;
2N/A
2N/A#endif /* !ACPI_REDUCED_HARDWARE */
2N/A
2N/A /* Global handlers */
2N/A
2N/A AcpiGbl_GlobalNotify[0].Handler = NULL;
2N/A AcpiGbl_GlobalNotify[1].Handler = NULL;
2N/A AcpiGbl_ExceptionHandler = NULL;
2N/A AcpiGbl_InitHandler = NULL;
2N/A AcpiGbl_TableHandler = NULL;
2N/A AcpiGbl_InterfaceHandler = NULL;
2N/A
2N/A /* Global Lock support */
2N/A
2N/A AcpiGbl_GlobalLockSemaphore = NULL;
2N/A AcpiGbl_GlobalLockMutex = NULL;
2N/A AcpiGbl_GlobalLockAcquired = FALSE;
2N/A AcpiGbl_GlobalLockHandle = 0;
2N/A AcpiGbl_GlobalLockPresent = FALSE;
2N/A
2N/A /* Miscellaneous variables */
2N/A
2N/A AcpiGbl_DSDT = NULL;
2N/A AcpiGbl_CmSingleStep = FALSE;
2N/A AcpiGbl_Shutdown = FALSE;
2N/A AcpiGbl_NsLookupCount = 0;
2N/A AcpiGbl_PsFindCount = 0;
2N/A AcpiGbl_AcpiHardwarePresent = TRUE;
2N/A AcpiGbl_LastOwnerIdIndex = 0;
2N/A AcpiGbl_NextOwnerIdOffset = 0;
2N/A AcpiGbl_DebuggerConfiguration = DEBUGGER_THREADING;
2N/A AcpiGbl_OsiMutex = NULL;
2N/A AcpiGbl_MaxLoopIterations = 0xFFFF;
2N/A
2N/A /* Hardware oriented */
2N/A
2N/A AcpiGbl_EventsInitialized = FALSE;
2N/A AcpiGbl_SystemAwakeAndRunning = TRUE;
2N/A
2N/A /* Namespace */
2N/A
2N/A AcpiGbl_ModuleCodeList = NULL;
2N/A AcpiGbl_RootNode = NULL;
2N/A AcpiGbl_RootNodeStruct.Name.Integer = ACPI_ROOT_NAME;
2N/A AcpiGbl_RootNodeStruct.DescriptorType = ACPI_DESC_TYPE_NAMED;
2N/A AcpiGbl_RootNodeStruct.Type = ACPI_TYPE_DEVICE;
2N/A AcpiGbl_RootNodeStruct.Parent = NULL;
2N/A AcpiGbl_RootNodeStruct.Child = NULL;
2N/A AcpiGbl_RootNodeStruct.Peer = NULL;
2N/A AcpiGbl_RootNodeStruct.Object = NULL;
2N/A
2N/A
2N/A#ifdef ACPI_DISASSEMBLER
2N/A AcpiGbl_ExternalList = NULL;
2N/A AcpiGbl_NumExternalMethods = 0;
2N/A AcpiGbl_ResolvedExternalMethods = 0;
2N/A#endif
2N/A
2N/A#ifdef ACPI_DEBUG_OUTPUT
2N/A AcpiGbl_LowestStackPointer = ACPI_CAST_PTR (ACPI_SIZE, ACPI_SIZE_MAX);
2N/A#endif
2N/A
2N/A#ifdef ACPI_DBG_TRACK_ALLOCATIONS
2N/A AcpiGbl_DisplayFinalMemStats = FALSE;
2N/A AcpiGbl_DisableMemTracking = FALSE;
2N/A#endif
2N/A
2N/A return_ACPI_STATUS (AE_OK);
2N/A}
2N/A
2N/A
2N/A/******************************************************************************
2N/A *
2N/A * FUNCTION: AcpiUtTerminate
2N/A *
2N/A * PARAMETERS: none
2N/A *
2N/A * RETURN: none
2N/A *
2N/A * DESCRIPTION: Free global memory
2N/A *
2N/A ******************************************************************************/
2N/A
2N/Astatic void
2N/AAcpiUtTerminate (
2N/A void)
2N/A{
2N/A ACPI_FUNCTION_TRACE (UtTerminate);
2N/A
2N/A AcpiUtFreeGpeLists ();
2N/A AcpiUtDeleteAddressLists ();
2N/A return_VOID;
2N/A}
2N/A
2N/A
2N/A/*******************************************************************************
2N/A *
2N/A * FUNCTION: AcpiUtSubsystemShutdown
2N/A *
2N/A * PARAMETERS: None
2N/A *
2N/A * RETURN: None
2N/A *
2N/A * DESCRIPTION: Shutdown the various components. Do not delete the mutex
* objects here, because the AML debugger may be still running.
*
******************************************************************************/
void
AcpiUtSubsystemShutdown (
void)
{
ACPI_FUNCTION_TRACE (UtSubsystemShutdown);
/* Just exit if subsystem is already shutdown */
if (AcpiGbl_Shutdown)
{
ACPI_ERROR ((AE_INFO, "ACPI Subsystem is already terminated"));
return_VOID;
}
/* Subsystem appears active, go ahead and shut it down */
AcpiGbl_Shutdown = TRUE;
AcpiGbl_StartupFlags = 0;
ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Shutting down ACPI Subsystem\n"));
#ifndef ACPI_ASL_COMPILER
/* Close the AcpiEvent Handling */
AcpiEvTerminate ();
/* Delete any dynamic _OSI interfaces */
AcpiUtInterfaceTerminate ();
#endif
/* Close the Namespace */
AcpiNsTerminate ();
/* Delete the ACPI tables */
AcpiTbTerminate ();
/* Close the globals */
AcpiUtTerminate ();
/* Purge the local caches */
(void) AcpiUtDeleteCaches ();
return_VOID;
}