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