Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
6595 serge 1
/******************************************************************************
2
 *
3
 * Module Name: utinit - Common ACPI subsystem initialization
4
 *
5
 *****************************************************************************/
6
 
7
/*
8
 * Copyright (C) 2000 - 2015, 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 
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
static void acpi_ut_terminate(void);
55
 
56
#if (!ACPI_REDUCED_HARDWARE)
57
 
58
static void acpi_ut_free_gpe_lists(void);
59
 
60
#else
61
 
62
#define acpi_ut_free_gpe_lists()
63
#endif				/* !ACPI_REDUCED_HARDWARE */
64
 
65
#if (!ACPI_REDUCED_HARDWARE)
66
/******************************************************************************
67
 *
68
 * FUNCTION:    acpi_ut_free_gpe_lists
69
 *
70
 * PARAMETERS:  none
71
 *
72
 * RETURN:      none
73
 *
74
 * DESCRIPTION: Free global GPE lists
75
 *
76
 ******************************************************************************/
77
 
78
static void acpi_ut_free_gpe_lists(void)
79
{
80
	struct acpi_gpe_block_info *gpe_block;
81
	struct acpi_gpe_block_info *next_gpe_block;
82
	struct acpi_gpe_xrupt_info *gpe_xrupt_info;
83
	struct acpi_gpe_xrupt_info *next_gpe_xrupt_info;
84
 
85
	/* Free global GPE blocks and related info structures */
86
 
87
	gpe_xrupt_info = acpi_gbl_gpe_xrupt_list_head;
88
	while (gpe_xrupt_info) {
89
		gpe_block = gpe_xrupt_info->gpe_block_list_head;
90
		while (gpe_block) {
91
			next_gpe_block = gpe_block->next;
92
			ACPI_FREE(gpe_block->event_info);
93
			ACPI_FREE(gpe_block->register_info);
94
			ACPI_FREE(gpe_block);
95
 
96
			gpe_block = next_gpe_block;
97
		}
98
		next_gpe_xrupt_info = gpe_xrupt_info->next;
99
		ACPI_FREE(gpe_xrupt_info);
100
		gpe_xrupt_info = next_gpe_xrupt_info;
101
	}
102
}
103
#endif				/* !ACPI_REDUCED_HARDWARE */
104
 
105
/*******************************************************************************
106
 *
107
 * FUNCTION:    acpi_ut_init_globals
108
 *
109
 * PARAMETERS:  None
110
 *
111
 * RETURN:      Status
112
 *
113
 * DESCRIPTION: Initialize ACPICA globals. All globals that require specific
114
 *              initialization should be initialized here. This allows for
115
 *              a warm restart.
116
 *
117
 ******************************************************************************/
118
 
119
acpi_status acpi_ut_init_globals(void)
120
{
121
	acpi_status status;
122
	u32 i;
123
 
124
	ACPI_FUNCTION_TRACE(ut_init_globals);
125
 
126
	/* Create all memory caches */
127
 
128
	status = acpi_ut_create_caches();
129
	if (ACPI_FAILURE(status)) {
130
		return_ACPI_STATUS(status);
131
	}
132
 
133
	/* Address Range lists */
134
 
135
	for (i = 0; i < ACPI_ADDRESS_RANGE_MAX; i++) {
136
		acpi_gbl_address_range_list[i] = NULL;
137
	}
138
 
139
	/* Mutex locked flags */
140
 
141
	for (i = 0; i < ACPI_NUM_MUTEX; i++) {
142
		acpi_gbl_mutex_info[i].mutex = NULL;
143
		acpi_gbl_mutex_info[i].thread_id = ACPI_MUTEX_NOT_ACQUIRED;
144
		acpi_gbl_mutex_info[i].use_count = 0;
145
	}
146
 
147
	for (i = 0; i < ACPI_NUM_OWNERID_MASKS; i++) {
148
		acpi_gbl_owner_id_mask[i] = 0;
149
	}
150
 
151
	/* Last owner_ID is never valid */
152
 
153
	acpi_gbl_owner_id_mask[ACPI_NUM_OWNERID_MASKS - 1] = 0x80000000;
154
 
155
	/* Event counters */
156
 
157
	acpi_method_count = 0;
158
	acpi_sci_count = 0;
159
	acpi_gpe_count = 0;
160
 
161
	for (i = 0; i < ACPI_NUM_FIXED_EVENTS; i++) {
162
		acpi_fixed_event_count[i] = 0;
163
	}
164
 
165
#if (!ACPI_REDUCED_HARDWARE)
166
 
167
	/* GPE/SCI support */
168
 
169
	acpi_gbl_all_gpes_initialized = FALSE;
170
	acpi_gbl_gpe_xrupt_list_head = NULL;
171
	acpi_gbl_gpe_fadt_blocks[0] = NULL;
172
	acpi_gbl_gpe_fadt_blocks[1] = NULL;
173
	acpi_current_gpe_count = 0;
174
 
175
	acpi_gbl_global_event_handler = NULL;
176
	acpi_gbl_sci_handler_list = NULL;
177
 
178
#endif				/* !ACPI_REDUCED_HARDWARE */
179
 
180
	/* Global handlers */
181
 
182
	acpi_gbl_global_notify[0].handler = NULL;
183
	acpi_gbl_global_notify[1].handler = NULL;
184
	acpi_gbl_exception_handler = NULL;
185
	acpi_gbl_init_handler = NULL;
186
	acpi_gbl_table_handler = NULL;
187
	acpi_gbl_interface_handler = NULL;
188
 
189
	/* Global Lock support */
190
 
191
	acpi_gbl_global_lock_semaphore = NULL;
192
	acpi_gbl_global_lock_mutex = NULL;
193
	acpi_gbl_global_lock_acquired = FALSE;
194
	acpi_gbl_global_lock_handle = 0;
195
	acpi_gbl_global_lock_present = FALSE;
196
 
197
	/* Miscellaneous variables */
198
 
199
	acpi_gbl_DSDT = NULL;
200
	acpi_gbl_cm_single_step = FALSE;
201
	acpi_gbl_shutdown = FALSE;
202
	acpi_gbl_ns_lookup_count = 0;
203
	acpi_gbl_ps_find_count = 0;
204
	acpi_gbl_acpi_hardware_present = TRUE;
205
	acpi_gbl_last_owner_id_index = 0;
206
	acpi_gbl_next_owner_id_offset = 0;
207
	acpi_gbl_debugger_configuration = DEBUGGER_THREADING;
208
	acpi_gbl_osi_mutex = NULL;
209
	acpi_gbl_reg_methods_executed = FALSE;
210
	acpi_gbl_max_loop_iterations = 0xFFFF;
211
 
212
	/* Hardware oriented */
213
 
214
	acpi_gbl_events_initialized = FALSE;
215
	acpi_gbl_system_awake_and_running = TRUE;
216
 
217
	/* Namespace */
218
 
219
	acpi_gbl_module_code_list = NULL;
220
	acpi_gbl_root_node = NULL;
221
	acpi_gbl_root_node_struct.name.integer = ACPI_ROOT_NAME;
222
	acpi_gbl_root_node_struct.descriptor_type = ACPI_DESC_TYPE_NAMED;
223
	acpi_gbl_root_node_struct.type = ACPI_TYPE_DEVICE;
224
	acpi_gbl_root_node_struct.parent = NULL;
225
	acpi_gbl_root_node_struct.child = NULL;
226
	acpi_gbl_root_node_struct.peer = NULL;
227
	acpi_gbl_root_node_struct.object = NULL;
228
 
229
#ifdef ACPI_DISASSEMBLER
230
	acpi_gbl_external_list = NULL;
231
	acpi_gbl_num_external_methods = 0;
232
	acpi_gbl_resolved_external_methods = 0;
233
#endif
234
 
235
#ifdef ACPI_DEBUG_OUTPUT
236
	acpi_gbl_lowest_stack_pointer = ACPI_CAST_PTR(acpi_size, ACPI_SIZE_MAX);
237
#endif
238
 
239
#ifdef ACPI_DBG_TRACK_ALLOCATIONS
240
	acpi_gbl_display_final_mem_stats = FALSE;
241
	acpi_gbl_disable_mem_tracking = FALSE;
242
#endif
243
 
244
	return_ACPI_STATUS(AE_OK);
245
}
246
 
247
/******************************************************************************
248
 *
249
 * FUNCTION:    acpi_ut_terminate
250
 *
251
 * PARAMETERS:  none
252
 *
253
 * RETURN:      none
254
 *
255
 * DESCRIPTION: Free global memory
256
 *
257
 ******************************************************************************/
258
 
259
static void acpi_ut_terminate(void)
260
{
261
	ACPI_FUNCTION_TRACE(ut_terminate);
262
 
263
	acpi_ut_free_gpe_lists();
264
	acpi_ut_delete_address_lists();
265
	return_VOID;
266
}
267
 
268
/*******************************************************************************
269
 *
270
 * FUNCTION:    acpi_ut_subsystem_shutdown
271
 *
272
 * PARAMETERS:  None
273
 *
274
 * RETURN:      None
275
 *
276
 * DESCRIPTION: Shutdown the various components. Do not delete the mutex
277
 *              objects here, because the AML debugger may be still running.
278
 *
279
 ******************************************************************************/
280
 
281
void acpi_ut_subsystem_shutdown(void)
282
{
283
	ACPI_FUNCTION_TRACE(ut_subsystem_shutdown);
284
 
285
	/* Just exit if subsystem is already shutdown */
286
 
287
	if (acpi_gbl_shutdown) {
288
		ACPI_ERROR((AE_INFO, "ACPI Subsystem is already terminated"));
289
		return_VOID;
290
	}
291
 
292
	/* Subsystem appears active, go ahead and shut it down */
293
 
294
	acpi_gbl_shutdown = TRUE;
295
	acpi_gbl_startup_flags = 0;
296
	ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Shutting down ACPI Subsystem\n"));
297
 
298
#ifndef ACPI_ASL_COMPILER
299
 
300
	/* Close the acpi_event Handling */
301
 
302
	acpi_ev_terminate();
303
 
304
	/* Delete any dynamic _OSI interfaces */
305
 
306
	acpi_ut_interface_terminate();
307
#endif
308
 
309
	/* Close the Namespace */
310
 
311
	acpi_ns_terminate();
312
 
313
	/* Delete the ACPI tables */
314
 
315
	acpi_tb_terminate();
316
 
317
	/* Close the globals */
318
 
319
	acpi_ut_terminate();
320
 
321
	/* Purge the local caches */
322
 
323
	(void)acpi_ut_delete_caches();
324
	return_VOID;
325
}