Home | History | Annotate | Line # | Download | only in utilities
utinit.c revision 1.1.1.7
      1 /******************************************************************************
      2  *
      3  * Module Name: utinit - Common ACPI subsystem initialization
      4  *
      5  *****************************************************************************/
      6 
      7 /*
      8  * Copyright (C) 2000 - 2016, 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 MERCHANTIBILITY 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     AcpiGbl_MaxLoopIterations           = 0xFFFF;
    230 
    231     /* Hardware oriented */
    232 
    233     AcpiGbl_EventsInitialized           = FALSE;
    234     AcpiGbl_SystemAwakeAndRunning       = TRUE;
    235 
    236     /* Namespace */
    237 
    238     AcpiGbl_ModuleCodeList              = NULL;
    239     AcpiGbl_RootNode                    = NULL;
    240     AcpiGbl_RootNodeStruct.Name.Integer = ACPI_ROOT_NAME;
    241     AcpiGbl_RootNodeStruct.DescriptorType = ACPI_DESC_TYPE_NAMED;
    242     AcpiGbl_RootNodeStruct.Type         = ACPI_TYPE_DEVICE;
    243     AcpiGbl_RootNodeStruct.Parent       = NULL;
    244     AcpiGbl_RootNodeStruct.Child        = NULL;
    245     AcpiGbl_RootNodeStruct.Peer         = NULL;
    246     AcpiGbl_RootNodeStruct.Object       = NULL;
    247 
    248 
    249 #ifdef ACPI_DISASSEMBLER
    250     AcpiGbl_ExternalList                = NULL;
    251     AcpiGbl_NumExternalMethods          = 0;
    252     AcpiGbl_ResolvedExternalMethods     = 0;
    253 #endif
    254 
    255 #ifdef ACPI_DEBUG_OUTPUT
    256     AcpiGbl_LowestStackPointer          = ACPI_CAST_PTR (ACPI_SIZE, ACPI_SIZE_MAX);
    257 #endif
    258 
    259 #ifdef ACPI_DBG_TRACK_ALLOCATIONS
    260     AcpiGbl_DisplayFinalMemStats        = FALSE;
    261     AcpiGbl_DisableMemTracking          = FALSE;
    262 #endif
    263 
    264     return_ACPI_STATUS (AE_OK);
    265 }
    266 
    267 
    268 /******************************************************************************
    269  *
    270  * FUNCTION:    AcpiUtTerminate
    271  *
    272  * PARAMETERS:  none
    273  *
    274  * RETURN:      none
    275  *
    276  * DESCRIPTION: Free global memory
    277  *
    278  ******************************************************************************/
    279 
    280 static void
    281 AcpiUtTerminate (
    282     void)
    283 {
    284     ACPI_FUNCTION_TRACE (UtTerminate);
    285 
    286     AcpiUtFreeGpeLists ();
    287     AcpiUtDeleteAddressLists ();
    288     return_VOID;
    289 }
    290 
    291 
    292 /*******************************************************************************
    293  *
    294  * FUNCTION:    AcpiUtSubsystemShutdown
    295  *
    296  * PARAMETERS:  None
    297  *
    298  * RETURN:      None
    299  *
    300  * DESCRIPTION: Shutdown the various components. Do not delete the mutex
    301  *              objects here, because the AML debugger may be still running.
    302  *
    303  ******************************************************************************/
    304 
    305 void
    306 AcpiUtSubsystemShutdown (
    307     void)
    308 {
    309     ACPI_FUNCTION_TRACE (UtSubsystemShutdown);
    310 
    311 
    312     /* Just exit if subsystem is already shutdown */
    313 
    314     if (AcpiGbl_Shutdown)
    315     {
    316         ACPI_ERROR ((AE_INFO, "ACPI Subsystem is already terminated"));
    317         return_VOID;
    318     }
    319 
    320     /* Subsystem appears active, go ahead and shut it down */
    321 
    322     AcpiGbl_Shutdown = TRUE;
    323     AcpiGbl_StartupFlags = 0;
    324     ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Shutting down ACPI Subsystem\n"));
    325 
    326 #ifndef ACPI_ASL_COMPILER
    327 
    328     /* Close the AcpiEvent Handling */
    329 
    330     AcpiEvTerminate ();
    331 
    332     /* Delete any dynamic _OSI interfaces */
    333 
    334     AcpiUtInterfaceTerminate ();
    335 #endif
    336 
    337     /* Close the Namespace */
    338 
    339     AcpiNsTerminate ();
    340 
    341     /* Delete the ACPI tables */
    342 
    343     AcpiTbTerminate ();
    344 
    345     /* Close the globals */
    346 
    347     AcpiUtTerminate ();
    348 
    349     /* Purge the local caches */
    350 
    351     (void) AcpiUtDeleteCaches ();
    352     return_VOID;
    353 }
    354