ACPICA: Major update for acpi_get_object_info external interface
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / drivers / acpi / acpica / utglobal.c
CommitLineData
1da177e4
LT
1/******************************************************************************
2 *
3 * Module Name: utglobal - Global variables for the ACPI subsystem
4 *
5 *****************************************************************************/
6
7/*
75a44ce0 8 * Copyright (C) 2000 - 2008, Intel Corp.
1da177e4
LT
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#define DEFINE_ACPI_GLOBALS
45
1da177e4 46#include <acpi/acpi.h>
e2f7a777
LB
47#include "accommon.h"
48#include "acnamesp.h"
1da177e4
LT
49
50#define _COMPONENT ACPI_UTILITIES
e97d6bf1 51ACPI_MODULE_NAME("utglobal")
1da177e4 52
44f6c012 53/*******************************************************************************
1da177e4
LT
54 *
55 * Static global variable initialization.
56 *
57 ******************************************************************************/
1da177e4
LT
58/*
59 * We want the debug switches statically initialized so they
60 * are already set when the debugger is entered.
61 */
1da177e4 62/* Debug switch - level and trace mask */
4be44fcd 63u32 acpi_dbg_level = ACPI_DEBUG_DEFAULT;
1da177e4
LT
64
65/* Debug switch - layer (component) mask */
66
e76f4276 67u32 acpi_dbg_layer = 0;
4be44fcd 68u32 acpi_gbl_nesting_level = 0;
1da177e4
LT
69
70/* Debugger globals */
71
4be44fcd
LB
72u8 acpi_gbl_db_terminate_threads = FALSE;
73u8 acpi_gbl_abort_method = FALSE;
74u8 acpi_gbl_method_executing = FALSE;
1da177e4
LT
75
76/* System flags */
77
4be44fcd 78u32 acpi_gbl_startup_flags = 0;
1da177e4
LT
79
80/* System starts uninitialized */
81
4be44fcd 82u8 acpi_gbl_shutdown = TRUE;
1da177e4 83
4be44fcd 84const char *acpi_gbl_sleep_state_names[ACPI_S_STATE_COUNT] = {
1da177e4
LT
85 "\\_S0_",
86 "\\_S1_",
87 "\\_S2_",
88 "\\_S3_",
89 "\\_S4_",
90 "\\_S5_"
91};
92
15b8dd53
BM
93const char *acpi_gbl_lowest_dstate_names[ACPI_NUM_sx_w_METHODS] = {
94 "_S0W",
95 "_S1W",
96 "_S2W",
97 "_S3W",
98 "_S4W"
99};
100
101const char *acpi_gbl_highest_dstate_names[ACPI_NUM_sx_d_METHODS] = {
1da177e4
LT
102 "_S1D",
103 "_S2D",
104 "_S3D",
105 "_S4D"
106};
107
44f6c012 108/*******************************************************************************
1da177e4 109 *
84fb2c97
BM
110 * FUNCTION: acpi_format_exception
111 *
112 * PARAMETERS: Status - The acpi_status code to be formatted
113 *
114 * RETURN: A string containing the exception text. A valid pointer is
115 * always returned.
116 *
117 * DESCRIPTION: This function translates an ACPI exception into an ASCII string
118 * It is here instead of utxface.c so it is always present.
1da177e4
LT
119 *
120 ******************************************************************************/
121
84fb2c97
BM
122const char *acpi_format_exception(acpi_status status)
123{
124 const char *exception = NULL;
125
126 ACPI_FUNCTION_ENTRY();
127
128 exception = acpi_ut_validate_exception(status);
129 if (!exception) {
130
131 /* Exception code was not recognized */
132
133 ACPI_ERROR((AE_INFO,
134 "Unknown exception code: 0x%8.8X", status));
135
136 exception = "UNKNOWN_STATUS_CODE";
3e0d69ec 137 dump_stack();
84fb2c97
BM
138 }
139
140 return (ACPI_CAST_PTR(const char, exception));
141}
142
143ACPI_EXPORT_SYMBOL(acpi_format_exception)
144
145/*******************************************************************************
146 *
147 * Namespace globals
148 *
149 ******************************************************************************/
1da177e4
LT
150/*
151 * Predefined ACPI Names (Built-in to the Interpreter)
152 *
153 * NOTES:
154 * 1) _SB_ is defined to be a device to allow \_SB_._INI to be run
155 * during the initialization sequence.
156 * 2) _TZ_ is defined to be a thermal zone in order to allow ASL code to
157 * perform a Notify() operation on it.
158 */
0897831b
BM
159const struct acpi_predefined_names acpi_gbl_pre_defined_names[] = {
160 {"_GPE", ACPI_TYPE_LOCAL_SCOPE, NULL},
161 {"_PR_", ACPI_TYPE_LOCAL_SCOPE, NULL},
162 {"_SB_", ACPI_TYPE_DEVICE, NULL},
163 {"_SI_", ACPI_TYPE_LOCAL_SCOPE, NULL},
164 {"_TZ_", ACPI_TYPE_THERMAL, NULL},
165 {"_REV", ACPI_TYPE_INTEGER, (char *)ACPI_CA_SUPPORT_LEVEL},
166 {"_OS_", ACPI_TYPE_STRING, ACPI_OS_NAME},
167 {"_GL_", ACPI_TYPE_MUTEX, (char *)1},
1da177e4
LT
168
169#if !defined (ACPI_NO_METHOD_EXECUTION) || defined (ACPI_CONSTANT_EVAL_ONLY)
0897831b 170 {"_OSI", ACPI_TYPE_METHOD, (char *)1},
1da177e4 171#endif
1da177e4 172
44f6c012
RM
173 /* Table terminator */
174
0897831b 175 {NULL, ACPI_TYPE_ANY, NULL}
44f6c012 176};
1da177e4
LT
177
178/*
179 * Properties of the ACPI Object Types, both internal and external.
180 * The table is indexed by values of acpi_object_type
181 */
4be44fcd
LB
182const u8 acpi_gbl_ns_properties[] = {
183 ACPI_NS_NORMAL, /* 00 Any */
184 ACPI_NS_NORMAL, /* 01 Number */
185 ACPI_NS_NORMAL, /* 02 String */
186 ACPI_NS_NORMAL, /* 03 Buffer */
187 ACPI_NS_NORMAL, /* 04 Package */
188 ACPI_NS_NORMAL, /* 05 field_unit */
189 ACPI_NS_NEWSCOPE, /* 06 Device */
190 ACPI_NS_NORMAL, /* 07 Event */
191 ACPI_NS_NEWSCOPE, /* 08 Method */
192 ACPI_NS_NORMAL, /* 09 Mutex */
193 ACPI_NS_NORMAL, /* 10 Region */
194 ACPI_NS_NEWSCOPE, /* 11 Power */
195 ACPI_NS_NEWSCOPE, /* 12 Processor */
196 ACPI_NS_NEWSCOPE, /* 13 Thermal */
197 ACPI_NS_NORMAL, /* 14 buffer_field */
198 ACPI_NS_NORMAL, /* 15 ddb_handle */
199 ACPI_NS_NORMAL, /* 16 Debug Object */
200 ACPI_NS_NORMAL, /* 17 def_field */
201 ACPI_NS_NORMAL, /* 18 bank_field */
202 ACPI_NS_NORMAL, /* 19 index_field */
203 ACPI_NS_NORMAL, /* 20 Reference */
204 ACPI_NS_NORMAL, /* 21 Alias */
205 ACPI_NS_NORMAL, /* 22 method_alias */
206 ACPI_NS_NORMAL, /* 23 Notify */
207 ACPI_NS_NORMAL, /* 24 Address Handler */
208 ACPI_NS_NEWSCOPE | ACPI_NS_LOCAL, /* 25 Resource Desc */
209 ACPI_NS_NEWSCOPE | ACPI_NS_LOCAL, /* 26 Resource Field */
210 ACPI_NS_NEWSCOPE, /* 27 Scope */
211 ACPI_NS_NORMAL, /* 28 Extra */
212 ACPI_NS_NORMAL, /* 29 Data */
213 ACPI_NS_NORMAL /* 30 Invalid */
1da177e4
LT
214};
215
1da177e4
LT
216/* Hex to ASCII conversion table */
217
4be44fcd
LB
218static const char acpi_gbl_hex_to_ascii[] = {
219 '0', '1', '2', '3', '4', '5', '6', '7',
220 '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
44f6c012
RM
221};
222
44f6c012 223/*******************************************************************************
1da177e4
LT
224 *
225 * FUNCTION: acpi_ut_hex_to_ascii_char
226 *
227 * PARAMETERS: Integer - Contains the hex digit
228 * Position - bit position of the digit within the
44f6c012 229 * integer (multiple of 4)
1da177e4 230 *
44f6c012 231 * RETURN: The converted Ascii character
1da177e4 232 *
44f6c012 233 * DESCRIPTION: Convert a hex digit to an Ascii character
1da177e4 234 *
44f6c012 235 ******************************************************************************/
1da177e4 236
4be44fcd 237char acpi_ut_hex_to_ascii_char(acpi_integer integer, u32 position)
1da177e4
LT
238{
239
240 return (acpi_gbl_hex_to_ascii[(integer >> position) & 0xF]);
241}
242
1da177e4
LT
243/******************************************************************************
244 *
245 * Event and Hardware globals
246 *
247 ******************************************************************************/
248
4be44fcd 249struct acpi_bit_register_info acpi_gbl_bit_register_info[ACPI_NUM_BITREG] = {
1da177e4
LT
250 /* Name Parent Register Register Bit Position Register Bit Mask */
251
4be44fcd
LB
252 /* ACPI_BITREG_TIMER_STATUS */ {ACPI_REGISTER_PM1_STATUS,
253 ACPI_BITPOSITION_TIMER_STATUS,
254 ACPI_BITMASK_TIMER_STATUS},
255 /* ACPI_BITREG_BUS_MASTER_STATUS */ {ACPI_REGISTER_PM1_STATUS,
256 ACPI_BITPOSITION_BUS_MASTER_STATUS,
257 ACPI_BITMASK_BUS_MASTER_STATUS},
258 /* ACPI_BITREG_GLOBAL_LOCK_STATUS */ {ACPI_REGISTER_PM1_STATUS,
259 ACPI_BITPOSITION_GLOBAL_LOCK_STATUS,
260 ACPI_BITMASK_GLOBAL_LOCK_STATUS},
261 /* ACPI_BITREG_POWER_BUTTON_STATUS */ {ACPI_REGISTER_PM1_STATUS,
262 ACPI_BITPOSITION_POWER_BUTTON_STATUS,
263 ACPI_BITMASK_POWER_BUTTON_STATUS},
264 /* ACPI_BITREG_SLEEP_BUTTON_STATUS */ {ACPI_REGISTER_PM1_STATUS,
265 ACPI_BITPOSITION_SLEEP_BUTTON_STATUS,
266 ACPI_BITMASK_SLEEP_BUTTON_STATUS},
267 /* ACPI_BITREG_RT_CLOCK_STATUS */ {ACPI_REGISTER_PM1_STATUS,
268 ACPI_BITPOSITION_RT_CLOCK_STATUS,
269 ACPI_BITMASK_RT_CLOCK_STATUS},
270 /* ACPI_BITREG_WAKE_STATUS */ {ACPI_REGISTER_PM1_STATUS,
271 ACPI_BITPOSITION_WAKE_STATUS,
272 ACPI_BITMASK_WAKE_STATUS},
273 /* ACPI_BITREG_PCIEXP_WAKE_STATUS */ {ACPI_REGISTER_PM1_STATUS,
274 ACPI_BITPOSITION_PCIEXP_WAKE_STATUS,
275 ACPI_BITMASK_PCIEXP_WAKE_STATUS},
276
277 /* ACPI_BITREG_TIMER_ENABLE */ {ACPI_REGISTER_PM1_ENABLE,
278 ACPI_BITPOSITION_TIMER_ENABLE,
279 ACPI_BITMASK_TIMER_ENABLE},
280 /* ACPI_BITREG_GLOBAL_LOCK_ENABLE */ {ACPI_REGISTER_PM1_ENABLE,
281 ACPI_BITPOSITION_GLOBAL_LOCK_ENABLE,
282 ACPI_BITMASK_GLOBAL_LOCK_ENABLE},
283 /* ACPI_BITREG_POWER_BUTTON_ENABLE */ {ACPI_REGISTER_PM1_ENABLE,
284 ACPI_BITPOSITION_POWER_BUTTON_ENABLE,
285 ACPI_BITMASK_POWER_BUTTON_ENABLE},
286 /* ACPI_BITREG_SLEEP_BUTTON_ENABLE */ {ACPI_REGISTER_PM1_ENABLE,
287 ACPI_BITPOSITION_SLEEP_BUTTON_ENABLE,
288 ACPI_BITMASK_SLEEP_BUTTON_ENABLE},
289 /* ACPI_BITREG_RT_CLOCK_ENABLE */ {ACPI_REGISTER_PM1_ENABLE,
290 ACPI_BITPOSITION_RT_CLOCK_ENABLE,
291 ACPI_BITMASK_RT_CLOCK_ENABLE},
4be44fcd
LB
292 /* ACPI_BITREG_PCIEXP_WAKE_DISABLE */ {ACPI_REGISTER_PM1_ENABLE,
293 ACPI_BITPOSITION_PCIEXP_WAKE_DISABLE,
294 ACPI_BITMASK_PCIEXP_WAKE_DISABLE},
295
296 /* ACPI_BITREG_SCI_ENABLE */ {ACPI_REGISTER_PM1_CONTROL,
297 ACPI_BITPOSITION_SCI_ENABLE,
298 ACPI_BITMASK_SCI_ENABLE},
299 /* ACPI_BITREG_BUS_MASTER_RLD */ {ACPI_REGISTER_PM1_CONTROL,
300 ACPI_BITPOSITION_BUS_MASTER_RLD,
301 ACPI_BITMASK_BUS_MASTER_RLD},
302 /* ACPI_BITREG_GLOBAL_LOCK_RELEASE */ {ACPI_REGISTER_PM1_CONTROL,
303 ACPI_BITPOSITION_GLOBAL_LOCK_RELEASE,
304 ACPI_BITMASK_GLOBAL_LOCK_RELEASE},
82d79b86
BM
305 /* ACPI_BITREG_SLEEP_TYPE */ {ACPI_REGISTER_PM1_CONTROL,
306 ACPI_BITPOSITION_SLEEP_TYPE,
307 ACPI_BITMASK_SLEEP_TYPE},
4be44fcd
LB
308 /* ACPI_BITREG_SLEEP_ENABLE */ {ACPI_REGISTER_PM1_CONTROL,
309 ACPI_BITPOSITION_SLEEP_ENABLE,
310 ACPI_BITMASK_SLEEP_ENABLE},
311
312 /* ACPI_BITREG_ARB_DIS */ {ACPI_REGISTER_PM2_CONTROL,
313 ACPI_BITPOSITION_ARB_DISABLE,
314 ACPI_BITMASK_ARB_DISABLE}
1da177e4
LT
315};
316
4be44fcd
LB
317struct acpi_fixed_event_info acpi_gbl_fixed_event_info[ACPI_NUM_FIXED_EVENTS] = {
318 /* ACPI_EVENT_PMTIMER */ {ACPI_BITREG_TIMER_STATUS,
319 ACPI_BITREG_TIMER_ENABLE,
320 ACPI_BITMASK_TIMER_STATUS,
321 ACPI_BITMASK_TIMER_ENABLE},
322 /* ACPI_EVENT_GLOBAL */ {ACPI_BITREG_GLOBAL_LOCK_STATUS,
323 ACPI_BITREG_GLOBAL_LOCK_ENABLE,
324 ACPI_BITMASK_GLOBAL_LOCK_STATUS,
325 ACPI_BITMASK_GLOBAL_LOCK_ENABLE},
326 /* ACPI_EVENT_POWER_BUTTON */ {ACPI_BITREG_POWER_BUTTON_STATUS,
327 ACPI_BITREG_POWER_BUTTON_ENABLE,
328 ACPI_BITMASK_POWER_BUTTON_STATUS,
329 ACPI_BITMASK_POWER_BUTTON_ENABLE},
330 /* ACPI_EVENT_SLEEP_BUTTON */ {ACPI_BITREG_SLEEP_BUTTON_STATUS,
331 ACPI_BITREG_SLEEP_BUTTON_ENABLE,
332 ACPI_BITMASK_SLEEP_BUTTON_STATUS,
333 ACPI_BITMASK_SLEEP_BUTTON_ENABLE},
334 /* ACPI_EVENT_RTC */ {ACPI_BITREG_RT_CLOCK_STATUS,
335 ACPI_BITREG_RT_CLOCK_ENABLE,
336 ACPI_BITMASK_RT_CLOCK_STATUS,
337 ACPI_BITMASK_RT_CLOCK_ENABLE},
1da177e4
LT
338};
339
44f6c012 340/*******************************************************************************
1da177e4
LT
341 *
342 * FUNCTION: acpi_ut_get_region_name
343 *
344 * PARAMETERS: None.
345 *
346 * RETURN: Status
347 *
348 * DESCRIPTION: Translate a Space ID into a name string (Debug only)
349 *
44f6c012 350 ******************************************************************************/
1da177e4
LT
351
352/* Region type decoding */
353
4be44fcd 354const char *acpi_gbl_region_types[ACPI_NUM_PREDEFINED_REGIONS] = {
1da177e4
LT
355 "SystemMemory",
356 "SystemIO",
357 "PCI_Config",
358 "EmbeddedControl",
359 "SMBus",
34830726 360 "SystemCMOS",
1da177e4
LT
361 "PCIBARTarget",
362 "DataTable"
1da177e4
LT
363};
364
4be44fcd 365char *acpi_ut_get_region_name(u8 space_id)
1da177e4
LT
366{
367
4be44fcd 368 if (space_id >= ACPI_USER_REGION_BEGIN) {
b229cf92 369 return ("UserDefinedRegion");
4be44fcd 370 } else if (space_id >= ACPI_NUM_PREDEFINED_REGIONS) {
b229cf92 371 return ("InvalidSpaceId");
1da177e4
LT
372 }
373
defba1d8 374 return (ACPI_CAST_PTR(char, acpi_gbl_region_types[space_id]));
1da177e4
LT
375}
376
44f6c012 377/*******************************************************************************
1da177e4
LT
378 *
379 * FUNCTION: acpi_ut_get_event_name
380 *
381 * PARAMETERS: None.
382 *
383 * RETURN: Status
384 *
385 * DESCRIPTION: Translate a Event ID into a name string (Debug only)
386 *
44f6c012 387 ******************************************************************************/
1da177e4
LT
388
389/* Event type decoding */
390
4be44fcd 391static const char *acpi_gbl_event_types[ACPI_NUM_FIXED_EVENTS] = {
1da177e4 392 "PM_Timer",
0897831b
BM
393 "GlobalLock",
394 "PowerButton",
395 "SleepButton",
396 "RealTimeClock",
1da177e4
LT
397};
398
4be44fcd 399char *acpi_ut_get_event_name(u32 event_id)
1da177e4
LT
400{
401
4be44fcd 402 if (event_id > ACPI_EVENT_MAX) {
b229cf92 403 return ("InvalidEventID");
1da177e4
LT
404 }
405
4a90c7e8 406 return (ACPI_CAST_PTR(char, acpi_gbl_event_types[event_id]));
1da177e4
LT
407}
408
44f6c012 409/*******************************************************************************
1da177e4
LT
410 *
411 * FUNCTION: acpi_ut_get_type_name
412 *
413 * PARAMETERS: None.
414 *
415 * RETURN: Status
416 *
417 * DESCRIPTION: Translate a Type ID into a name string (Debug only)
418 *
44f6c012 419 ******************************************************************************/
1da177e4
LT
420
421/*
422 * Elements of acpi_gbl_ns_type_names below must match
423 * one-to-one with values of acpi_object_type
424 *
44f6c012
RM
425 * The type ACPI_TYPE_ANY (Untyped) is used as a "don't care" when searching;
426 * when stored in a table it really means that we have thus far seen no
427 * evidence to indicate what type is actually going to be stored for this entry.
1da177e4 428 */
4be44fcd 429static const char acpi_gbl_bad_type[] = "UNDEFINED";
1da177e4 430
44f6c012
RM
431/* Printable names of the ACPI object types */
432
4be44fcd 433static const char *acpi_gbl_ns_type_names[] = {
1da177e4
LT
434 /* 00 */ "Untyped",
435 /* 01 */ "Integer",
436 /* 02 */ "String",
437 /* 03 */ "Buffer",
438 /* 04 */ "Package",
0897831b 439 /* 05 */ "FieldUnit",
1da177e4
LT
440 /* 06 */ "Device",
441 /* 07 */ "Event",
442 /* 08 */ "Method",
443 /* 09 */ "Mutex",
444 /* 10 */ "Region",
445 /* 11 */ "Power",
446 /* 12 */ "Processor",
447 /* 13 */ "Thermal",
0897831b
BM
448 /* 14 */ "BufferField",
449 /* 15 */ "DdbHandle",
450 /* 16 */ "DebugObject",
451 /* 17 */ "RegionField",
452 /* 18 */ "BankField",
453 /* 19 */ "IndexField",
1da177e4
LT
454 /* 20 */ "Reference",
455 /* 21 */ "Alias",
0897831b 456 /* 22 */ "MethodAlias",
1da177e4 457 /* 23 */ "Notify",
0897831b
BM
458 /* 24 */ "AddrHandler",
459 /* 25 */ "ResourceDesc",
460 /* 26 */ "ResourceFld",
1da177e4
LT
461 /* 27 */ "Scope",
462 /* 28 */ "Extra",
463 /* 29 */ "Data",
464 /* 30 */ "Invalid"
465};
466
4be44fcd 467char *acpi_ut_get_type_name(acpi_object_type type)
1da177e4
LT
468{
469
4be44fcd 470 if (type > ACPI_TYPE_INVALID) {
4a90c7e8 471 return (ACPI_CAST_PTR(char, acpi_gbl_bad_type));
1da177e4
LT
472 }
473
4a90c7e8 474 return (ACPI_CAST_PTR(char, acpi_gbl_ns_type_names[type]));
1da177e4
LT
475}
476
4be44fcd 477char *acpi_ut_get_object_type_name(union acpi_operand_object *obj_desc)
1da177e4
LT
478{
479
4be44fcd 480 if (!obj_desc) {
1da177e4
LT
481 return ("[NULL Object Descriptor]");
482 }
483
3371c19c 484 return (acpi_ut_get_type_name(obj_desc->common.type));
1da177e4
LT
485}
486
44f6c012 487/*******************************************************************************
1da177e4
LT
488 *
489 * FUNCTION: acpi_ut_get_node_name
490 *
491 * PARAMETERS: Object - A namespace node
492 *
493 * RETURN: Pointer to a string
494 *
495 * DESCRIPTION: Validate the node and return the node's ACPI name.
496 *
44f6c012 497 ******************************************************************************/
1da177e4 498
4be44fcd 499char *acpi_ut_get_node_name(void *object)
1da177e4 500{
4be44fcd 501 struct acpi_namespace_node *node = (struct acpi_namespace_node *)object;
1da177e4
LT
502
503 /* Must return a string of exactly 4 characters == ACPI_NAME_SIZE */
504
4be44fcd 505 if (!object) {
1da177e4
LT
506 return ("NULL");
507 }
508
509 /* Check for Root node */
510
4be44fcd 511 if ((object == ACPI_ROOT_OBJECT) || (object == acpi_gbl_root_node)) {
1da177e4
LT
512 return ("\"\\\" ");
513 }
514
515 /* Descriptor must be a namespace node */
516
61686124 517 if (ACPI_GET_DESCRIPTOR_TYPE(node) != ACPI_DESC_TYPE_NAMED) {
1da177e4
LT
518 return ("####");
519 }
520
521 /* Name must be a valid ACPI name */
522
c51a4de8 523 if (!acpi_ut_valid_acpi_name(node->name.integer)) {
3d81b236 524 node->name.integer = acpi_ut_repair_name(node->name.ascii);
1da177e4
LT
525 }
526
527 /* Return the name */
528
529 return (node->name.ascii);
530}
531
44f6c012 532/*******************************************************************************
1da177e4
LT
533 *
534 * FUNCTION: acpi_ut_get_descriptor_name
535 *
536 * PARAMETERS: Object - An ACPI object
537 *
538 * RETURN: Pointer to a string
539 *
540 * DESCRIPTION: Validate object and return the descriptor type
541 *
44f6c012
RM
542 ******************************************************************************/
543
544/* Printable names of object descriptor types */
1da177e4 545
4be44fcd 546static const char *acpi_gbl_desc_type_names[] = {
1da177e4
LT
547 /* 00 */ "Invalid",
548 /* 01 */ "Cached",
549 /* 02 */ "State-Generic",
550 /* 03 */ "State-Update",
551 /* 04 */ "State-Package",
552 /* 05 */ "State-Control",
0897831b
BM
553 /* 06 */ "State-RootParseScope",
554 /* 07 */ "State-ParseScope",
555 /* 08 */ "State-WalkScope",
1da177e4
LT
556 /* 09 */ "State-Result",
557 /* 10 */ "State-Notify",
558 /* 11 */ "State-Thread",
559 /* 12 */ "Walk",
560 /* 13 */ "Parser",
561 /* 14 */ "Operand",
562 /* 15 */ "Node"
563};
564
4be44fcd 565char *acpi_ut_get_descriptor_name(void *object)
1da177e4
LT
566{
567
4be44fcd 568 if (!object) {
1da177e4
LT
569 return ("NULL OBJECT");
570 }
571
4be44fcd 572 if (ACPI_GET_DESCRIPTOR_TYPE(object) > ACPI_DESC_TYPE_MAX) {
defba1d8 573 return (ACPI_CAST_PTR(char, acpi_gbl_bad_type));
1da177e4
LT
574 }
575
defba1d8
BM
576 return (ACPI_CAST_PTR(char,
577 acpi_gbl_desc_type_names[ACPI_GET_DESCRIPTOR_TYPE
578 (object)]));
1da177e4
LT
579
580}
581
f02a99ac
BM
582/*******************************************************************************
583 *
584 * FUNCTION: acpi_ut_get_reference_name
585 *
586 * PARAMETERS: Object - An ACPI reference object
587 *
588 * RETURN: Pointer to a string
589 *
590 * DESCRIPTION: Decode a reference object sub-type to a string.
591 *
592 ******************************************************************************/
593
594/* Printable names of reference object sub-types */
595
1044f1f6
BM
596static const char *acpi_gbl_ref_class_names[] = {
597 /* 00 */ "Local",
598 /* 01 */ "Argument",
599 /* 02 */ "RefOf",
600 /* 03 */ "Index",
601 /* 04 */ "DdbHandle",
602 /* 05 */ "Named Object",
603 /* 06 */ "Debug"
604};
605
f02a99ac
BM
606const char *acpi_ut_get_reference_name(union acpi_operand_object *object)
607{
1044f1f6
BM
608 if (!object)
609 return "NULL Object";
f02a99ac 610
1044f1f6
BM
611 if (ACPI_GET_DESCRIPTOR_TYPE(object) != ACPI_DESC_TYPE_OPERAND)
612 return "Not an Operand object";
f02a99ac 613
1044f1f6
BM
614 if (object->common.type != ACPI_TYPE_LOCAL_REFERENCE)
615 return "Not a Reference object";
f02a99ac 616
1044f1f6
BM
617 if (object->reference.class > ACPI_REFCLASS_MAX)
618 return "Unknown Reference class";
f02a99ac 619
1044f1f6 620 return acpi_gbl_ref_class_names[object->reference.class];
f02a99ac
BM
621}
622
1da177e4
LT
623#if defined(ACPI_DEBUG_OUTPUT) || defined(ACPI_DEBUGGER)
624/*
625 * Strings and procedures used for debug only
626 */
627
44f6c012 628/*******************************************************************************
1da177e4
LT
629 *
630 * FUNCTION: acpi_ut_get_mutex_name
631 *
44f6c012 632 * PARAMETERS: mutex_id - The predefined ID for this mutex.
1da177e4 633 *
44f6c012
RM
634 * RETURN: String containing the name of the mutex. Always returns a valid
635 * pointer.
1da177e4
LT
636 *
637 * DESCRIPTION: Translate a mutex ID into a name string (Debug only)
638 *
44f6c012 639 ******************************************************************************/
1da177e4 640
4be44fcd 641char *acpi_ut_get_mutex_name(u32 mutex_id)
1da177e4
LT
642{
643
4c90ece2 644 if (mutex_id > ACPI_MAX_MUTEX) {
1da177e4
LT
645 return ("Invalid Mutex ID");
646 }
647
648 return (acpi_gbl_mutex_names[mutex_id]);
649}
514d18d7
ZR
650
651/*******************************************************************************
652 *
653 * FUNCTION: acpi_ut_get_notify_name
654 *
655 * PARAMETERS: notify_value - Value from the Notify() request
656 *
657 * RETURN: String corresponding to the Notify Value.
658 *
659 * DESCRIPTION: Translate a Notify Value to a notify namestring.
660 *
661 ******************************************************************************/
662
663/* Names for Notify() values, used for debug output */
664
665static const char *acpi_gbl_notify_value_names[] = {
666 "Bus Check",
667 "Device Check",
668 "Device Wake",
669 "Eject Request",
670 "Device Check Light",
671 "Frequency Mismatch",
672 "Bus Mode Mismatch",
673 "Power Fault",
674 "Capabilities Check",
675 "Device PLD Check",
676 "Reserved",
677 "System Locality Update"
678};
679
680const char *acpi_ut_get_notify_name(u32 notify_value)
681{
682
683 if (notify_value <= ACPI_NOTIFY_MAX) {
684 return (acpi_gbl_notify_value_names[notify_value]);
685 } else if (notify_value <= ACPI_MAX_SYS_NOTIFY) {
686 return ("Reserved");
687 } else { /* Greater or equal to 0x80 */
688
689 return ("**Device Specific**");
690 }
691}
1da177e4
LT
692#endif
693
44f6c012 694/*******************************************************************************
1da177e4
LT
695 *
696 * FUNCTION: acpi_ut_valid_object_type
697 *
698 * PARAMETERS: Type - Object type to be validated
699 *
44f6c012 700 * RETURN: TRUE if valid object type, FALSE otherwise
1da177e4
LT
701 *
702 * DESCRIPTION: Validate an object type
703 *
44f6c012 704 ******************************************************************************/
1da177e4 705
4be44fcd 706u8 acpi_ut_valid_object_type(acpi_object_type type)
1da177e4
LT
707{
708
4be44fcd 709 if (type > ACPI_TYPE_LOCAL_MAX) {
52fc0b02 710
1da177e4
LT
711 /* Note: Assumes all TYPEs are contiguous (external/local) */
712
713 return (FALSE);
714 }
715
716 return (TRUE);
717}
718
44f6c012 719/*******************************************************************************
1da177e4
LT
720 *
721 * FUNCTION: acpi_ut_init_globals
722 *
44f6c012
RM
723 * PARAMETERS: None
724 *
b417d40b 725 * RETURN: Status
1da177e4
LT
726 *
727 * DESCRIPTION: Init library globals. All globals that require specific
728 * initialization should be initialized here!
729 *
44f6c012 730 ******************************************************************************/
1da177e4 731
b417d40b 732acpi_status acpi_ut_init_globals(void)
1da177e4 733{
4be44fcd
LB
734 acpi_status status;
735 u32 i;
1da177e4 736
b229cf92 737 ACPI_FUNCTION_TRACE(ut_init_globals);
1da177e4 738
73459f73
RM
739 /* Create all memory caches */
740
4be44fcd
LB
741 status = acpi_ut_create_caches();
742 if (ACPI_FAILURE(status)) {
b417d40b 743 return_ACPI_STATUS(status);
73459f73 744 }
1da177e4 745
1da177e4
LT
746 /* Mutex locked flags */
747
4c90ece2 748 for (i = 0; i < ACPI_NUM_MUTEX; i++) {
4be44fcd
LB
749 acpi_gbl_mutex_info[i].mutex = NULL;
750 acpi_gbl_mutex_info[i].thread_id = ACPI_MUTEX_NOT_ACQUIRED;
751 acpi_gbl_mutex_info[i].use_count = 0;
1da177e4
LT
752 }
753
28f55ebc
BM
754 for (i = 0; i < ACPI_NUM_OWNERID_MASKS; i++) {
755 acpi_gbl_owner_id_mask[i] = 0;
756 }
ec41f193
BM
757
758 /* Last owner_iD is never valid */
759
760 acpi_gbl_owner_id_mask[ACPI_NUM_OWNERID_MASKS - 1] = 0x80000000;
28f55ebc 761
1da177e4
LT
762 /* GPE support */
763
4be44fcd
LB
764 acpi_gbl_gpe_xrupt_list_head = NULL;
765 acpi_gbl_gpe_fadt_blocks[0] = NULL;
766 acpi_gbl_gpe_fadt_blocks[1] = NULL;
e97d6bf1 767 acpi_current_gpe_count = 0;
1da177e4 768
3e08e2d2 769 /* Global handlers */
1da177e4 770
4be44fcd
LB
771 acpi_gbl_system_notify.handler = NULL;
772 acpi_gbl_device_notify.handler = NULL;
773 acpi_gbl_exception_handler = NULL;
774 acpi_gbl_init_handler = NULL;
3e08e2d2 775 acpi_gbl_table_handler = NULL;
1da177e4 776
1da177e4
LT
777 /* Global Lock support */
778
967440e3 779 acpi_gbl_global_lock_semaphore = NULL;
c81da666 780 acpi_gbl_global_lock_mutex = NULL;
4be44fcd 781 acpi_gbl_global_lock_acquired = FALSE;
4be44fcd 782 acpi_gbl_global_lock_handle = 0;
009c4cbe 783 acpi_gbl_global_lock_present = FALSE;
1da177e4
LT
784
785 /* Miscellaneous variables */
786
4be44fcd
LB
787 acpi_gbl_cm_single_step = FALSE;
788 acpi_gbl_db_terminate_threads = FALSE;
789 acpi_gbl_shutdown = FALSE;
790 acpi_gbl_ns_lookup_count = 0;
791 acpi_gbl_ps_find_count = 0;
792 acpi_gbl_acpi_hardware_present = TRUE;
28f55ebc
BM
793 acpi_gbl_last_owner_id_index = 0;
794 acpi_gbl_next_owner_id_offset = 0;
50eca3eb
BM
795 acpi_gbl_trace_method_name = 0;
796 acpi_gbl_trace_dbg_level = 0;
797 acpi_gbl_trace_dbg_layer = 0;
4be44fcd
LB
798 acpi_gbl_debugger_configuration = DEBUGGER_THREADING;
799 acpi_gbl_db_output_flags = ACPI_DB_CONSOLE_OUTPUT;
7f071903 800 acpi_gbl_osi_data = 0;
1da177e4
LT
801
802 /* Hardware oriented */
803
4be44fcd
LB
804 acpi_gbl_events_initialized = FALSE;
805 acpi_gbl_system_awake_and_running = TRUE;
1da177e4
LT
806
807 /* Namespace */
808
4be44fcd 809 acpi_gbl_root_node = NULL;
1da177e4 810 acpi_gbl_root_node_struct.name.integer = ACPI_ROOT_NAME;
61686124 811 acpi_gbl_root_node_struct.descriptor_type = ACPI_DESC_TYPE_NAMED;
4be44fcd
LB
812 acpi_gbl_root_node_struct.type = ACPI_TYPE_DEVICE;
813 acpi_gbl_root_node_struct.child = NULL;
814 acpi_gbl_root_node_struct.peer = NULL;
815 acpi_gbl_root_node_struct.object = NULL;
816 acpi_gbl_root_node_struct.flags = ANOBJ_END_OF_PEER_LIST;
1da177e4
LT
817
818#ifdef ACPI_DEBUG_OUTPUT
1d18c058 819 acpi_gbl_lowest_stack_pointer = ACPI_CAST_PTR(acpi_size, ACPI_SIZE_MAX);
1da177e4
LT
820#endif
821
d41eb99b
BM
822#ifdef ACPI_DBG_TRACK_ALLOCATIONS
823 acpi_gbl_display_final_mem_stats = FALSE;
824#endif
825
b417d40b 826 return_ACPI_STATUS(AE_OK);
1da177e4 827}
8313524a 828
e97d6bf1 829ACPI_EXPORT_SYMBOL(acpi_gbl_FADT)
8313524a 830ACPI_EXPORT_SYMBOL(acpi_dbg_level)
1044f1f6 831ACPI_EXPORT_SYMBOL(acpi_dbg_layer)
e97d6bf1 832ACPI_EXPORT_SYMBOL(acpi_current_gpe_count)