cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

utinit.c (6973B)


      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 - 2022, 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}