linux/drivers/acpi/acpica/utinit.c
<<
>>
Prefs
   1// SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0
   2/******************************************************************************
   3 *
   4 * Module Name: utinit - Common ACPI subsystem initialization
   5 *
   6 * Copyright (C) 2000 - 2021, Intel Corp.
   7 *
   8 *****************************************************************************/
   9
  10#include <acpi/acpi.h>
  11#include "accommon.h"
  12#include "acnamesp.h"
  13#include "acevents.h"
  14#include "actables.h"
  15
  16#define _COMPONENT          ACPI_UTILITIES
  17ACPI_MODULE_NAME("utinit")
  18
  19/* Local prototypes */
  20static void acpi_ut_terminate(void);
  21
  22#if (!ACPI_REDUCED_HARDWARE)
  23
  24static void acpi_ut_free_gpe_lists(void);
  25
  26#else
  27
  28#define acpi_ut_free_gpe_lists()
  29#endif                          /* !ACPI_REDUCED_HARDWARE */
  30
  31#if (!ACPI_REDUCED_HARDWARE)
  32/******************************************************************************
  33 *
  34 * FUNCTION:    acpi_ut_free_gpe_lists
  35 *
  36 * PARAMETERS:  none
  37 *
  38 * RETURN:      none
  39 *
  40 * DESCRIPTION: Free global GPE lists
  41 *
  42 ******************************************************************************/
  43
  44static void acpi_ut_free_gpe_lists(void)
  45{
  46        struct acpi_gpe_block_info *gpe_block;
  47        struct acpi_gpe_block_info *next_gpe_block;
  48        struct acpi_gpe_xrupt_info *gpe_xrupt_info;
  49        struct acpi_gpe_xrupt_info *next_gpe_xrupt_info;
  50
  51        /* Free global GPE blocks and related info structures */
  52
  53        gpe_xrupt_info = acpi_gbl_gpe_xrupt_list_head;
  54        while (gpe_xrupt_info) {
  55                gpe_block = gpe_xrupt_info->gpe_block_list_head;
  56                while (gpe_block) {
  57                        next_gpe_block = gpe_block->next;
  58                        ACPI_FREE(gpe_block->event_info);
  59                        ACPI_FREE(gpe_block->register_info);
  60                        ACPI_FREE(gpe_block);
  61
  62                        gpe_block = next_gpe_block;
  63                }
  64                next_gpe_xrupt_info = gpe_xrupt_info->next;
  65                ACPI_FREE(gpe_xrupt_info);
  66                gpe_xrupt_info = next_gpe_xrupt_info;
  67        }
  68}
  69#endif                          /* !ACPI_REDUCED_HARDWARE */
  70
  71/*******************************************************************************
  72 *
  73 * FUNCTION:    acpi_ut_init_globals
  74 *
  75 * PARAMETERS:  None
  76 *
  77 * RETURN:      Status
  78 *
  79 * DESCRIPTION: Initialize ACPICA globals. All globals that require specific
  80 *              initialization should be initialized here. This allows for
  81 *              a warm restart.
  82 *
  83 ******************************************************************************/
  84
  85acpi_status acpi_ut_init_globals(void)
  86{
  87        acpi_status status;
  88        u32 i;
  89
  90        ACPI_FUNCTION_TRACE(ut_init_globals);
  91
  92        /* Create all memory caches */
  93
  94        status = acpi_ut_create_caches();
  95        if (ACPI_FAILURE(status)) {
  96                return_ACPI_STATUS(status);
  97        }
  98
  99        /* Address Range lists */
 100
 101        for (i = 0; i < ACPI_ADDRESS_RANGE_MAX; i++) {
 102                acpi_gbl_address_range_list[i] = NULL;
 103        }
 104
 105        /* Mutex locked flags */
 106
 107        for (i = 0; i < ACPI_NUM_MUTEX; i++) {
 108                acpi_gbl_mutex_info[i].mutex = NULL;
 109                acpi_gbl_mutex_info[i].thread_id = ACPI_MUTEX_NOT_ACQUIRED;
 110                acpi_gbl_mutex_info[i].use_count = 0;
 111        }
 112
 113        for (i = 0; i < ACPI_NUM_OWNERID_MASKS; i++) {
 114                acpi_gbl_owner_id_mask[i] = 0;
 115        }
 116
 117        /* Last owner_ID is never valid */
 118
 119        acpi_gbl_owner_id_mask[ACPI_NUM_OWNERID_MASKS - 1] = 0x80000000;
 120
 121        /* Event counters */
 122
 123        acpi_method_count = 0;
 124        acpi_sci_count = 0;
 125        acpi_gpe_count = 0;
 126
 127        for (i = 0; i < ACPI_NUM_FIXED_EVENTS; i++) {
 128                acpi_fixed_event_count[i] = 0;
 129        }
 130
 131#if (!ACPI_REDUCED_HARDWARE)
 132
 133        /* GPE/SCI support */
 134
 135        acpi_gbl_all_gpes_initialized = FALSE;
 136        acpi_gbl_gpe_xrupt_list_head = NULL;
 137        acpi_gbl_gpe_fadt_blocks[0] = NULL;
 138        acpi_gbl_gpe_fadt_blocks[1] = NULL;
 139        acpi_current_gpe_count = 0;
 140
 141        acpi_gbl_global_event_handler = NULL;
 142        acpi_gbl_sci_handler_list = NULL;
 143
 144#endif                          /* !ACPI_REDUCED_HARDWARE */
 145
 146        /* Global handlers */
 147
 148        acpi_gbl_global_notify[0].handler = NULL;
 149        acpi_gbl_global_notify[1].handler = NULL;
 150        acpi_gbl_exception_handler = NULL;
 151        acpi_gbl_init_handler = NULL;
 152        acpi_gbl_table_handler = NULL;
 153        acpi_gbl_interface_handler = NULL;
 154
 155        /* Global Lock support */
 156
 157        acpi_gbl_global_lock_semaphore = NULL;
 158        acpi_gbl_global_lock_mutex = NULL;
 159        acpi_gbl_global_lock_acquired = FALSE;
 160        acpi_gbl_global_lock_handle = 0;
 161        acpi_gbl_global_lock_present = FALSE;
 162
 163        /* Miscellaneous variables */
 164
 165        acpi_gbl_DSDT = NULL;
 166        acpi_gbl_cm_single_step = FALSE;
 167        acpi_gbl_shutdown = FALSE;
 168        acpi_gbl_ns_lookup_count = 0;
 169        acpi_gbl_ps_find_count = 0;
 170        acpi_gbl_acpi_hardware_present = TRUE;
 171        acpi_gbl_last_owner_id_index = 0;
 172        acpi_gbl_next_owner_id_offset = 0;
 173        acpi_gbl_debugger_configuration = DEBUGGER_THREADING;
 174        acpi_gbl_osi_mutex = NULL;
 175
 176        /* Hardware oriented */
 177
 178        acpi_gbl_events_initialized = FALSE;
 179        acpi_gbl_system_awake_and_running = TRUE;
 180
 181        /* Namespace */
 182
 183        acpi_gbl_root_node = NULL;
 184        acpi_gbl_root_node_struct.name.integer = ACPI_ROOT_NAME;
 185        acpi_gbl_root_node_struct.descriptor_type = ACPI_DESC_TYPE_NAMED;
 186        acpi_gbl_root_node_struct.type = ACPI_TYPE_DEVICE;
 187        acpi_gbl_root_node_struct.parent = NULL;
 188        acpi_gbl_root_node_struct.child = NULL;
 189        acpi_gbl_root_node_struct.peer = NULL;
 190        acpi_gbl_root_node_struct.object = NULL;
 191
 192#ifdef ACPI_DISASSEMBLER
 193        acpi_gbl_external_list = NULL;
 194        acpi_gbl_num_external_methods = 0;
 195        acpi_gbl_resolved_external_methods = 0;
 196#endif
 197
 198#ifdef ACPI_DEBUG_OUTPUT
 199        acpi_gbl_lowest_stack_pointer = ACPI_CAST_PTR(acpi_size, ACPI_SIZE_MAX);
 200#endif
 201
 202#ifdef ACPI_DBG_TRACK_ALLOCATIONS
 203        acpi_gbl_display_final_mem_stats = FALSE;
 204        acpi_gbl_disable_mem_tracking = FALSE;
 205#endif
 206
 207        return_ACPI_STATUS(AE_OK);
 208}
 209
 210/******************************************************************************
 211 *
 212 * FUNCTION:    acpi_ut_terminate
 213 *
 214 * PARAMETERS:  none
 215 *
 216 * RETURN:      none
 217 *
 218 * DESCRIPTION: Free global memory
 219 *
 220 ******************************************************************************/
 221
 222static void acpi_ut_terminate(void)
 223{
 224        ACPI_FUNCTION_TRACE(ut_terminate);
 225
 226        acpi_ut_free_gpe_lists();
 227        acpi_ut_delete_address_lists();
 228        return_VOID;
 229}
 230
 231/*******************************************************************************
 232 *
 233 * FUNCTION:    acpi_ut_subsystem_shutdown
 234 *
 235 * PARAMETERS:  None
 236 *
 237 * RETURN:      None
 238 *
 239 * DESCRIPTION: Shutdown the various components. Do not delete the mutex
 240 *              objects here, because the AML debugger may be still running.
 241 *
 242 ******************************************************************************/
 243
 244void acpi_ut_subsystem_shutdown(void)
 245{
 246        ACPI_FUNCTION_TRACE(ut_subsystem_shutdown);
 247
 248        /* Just exit if subsystem is already shutdown */
 249
 250        if (acpi_gbl_shutdown) {
 251                ACPI_ERROR((AE_INFO, "ACPI Subsystem is already terminated"));
 252                return_VOID;
 253        }
 254
 255        /* Subsystem appears active, go ahead and shut it down */
 256
 257        acpi_gbl_shutdown = TRUE;
 258        acpi_gbl_startup_flags = 0;
 259        ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Shutting down ACPI Subsystem\n"));
 260
 261#ifndef ACPI_ASL_COMPILER
 262
 263        /* Close the acpi_event Handling */
 264
 265        acpi_ev_terminate();
 266
 267        /* Delete any dynamic _OSI interfaces */
 268
 269        acpi_ut_interface_terminate();
 270#endif
 271
 272        /* Close the Namespace */
 273
 274        acpi_ns_terminate();
 275
 276        /* Delete the ACPI tables */
 277
 278        acpi_tb_terminate();
 279
 280        /* Close the globals */
 281
 282        acpi_ut_terminate();
 283
 284        /* Purge the local caches */
 285
 286        (void)acpi_ut_delete_caches();
 287        return_VOID;
 288}
 289