1 /****************************************************************************** 2 * 3 * Module Name: utxface - External interfaces for "global" ACPI functions 4 * 5 *****************************************************************************/ 6 7 /* 8 * Copyright (C) 2000 - 2011, 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 <linux/export.h> 45 #include <acpi/acpi.h> 46 #include "accommon.h" 47 #include "acevents.h" 48 #include "acnamesp.h" 49 #include "acdebug.h" 50 #include "actables.h" 51 52 #define _COMPONENT ACPI_UTILITIES 53 ACPI_MODULE_NAME("utxface") 54 55 #ifndef ACPI_ASL_COMPILER 56 /******************************************************************************* 57 * 58 * FUNCTION: acpi_initialize_subsystem 59 * 60 * PARAMETERS: None 61 * 62 * RETURN: Status 63 * 64 * DESCRIPTION: Initializes all global variables. This is the first function 65 * called, so any early initialization belongs here. 66 * 67 ******************************************************************************/ 68 acpi_status __init acpi_initialize_subsystem(void) 69 { 70 acpi_status status; 71 72 ACPI_FUNCTION_TRACE(acpi_initialize_subsystem); 73 74 acpi_gbl_startup_flags = ACPI_SUBSYSTEM_INITIALIZE; 75 ACPI_DEBUG_EXEC(acpi_ut_init_stack_ptr_trace()); 76 77 /* Initialize the OS-Dependent layer */ 78 79 status = acpi_os_initialize(); 80 if (ACPI_FAILURE(status)) { 81 ACPI_EXCEPTION((AE_INFO, status, "During OSL initialization")); 82 return_ACPI_STATUS(status); 83 } 84 85 /* Initialize all globals used by the subsystem */ 86 87 status = acpi_ut_init_globals(); 88 if (ACPI_FAILURE(status)) { 89 ACPI_EXCEPTION((AE_INFO, status, 90 "During initialization of globals")); 91 return_ACPI_STATUS(status); 92 } 93 94 /* Create the default mutex objects */ 95 96 status = acpi_ut_mutex_initialize(); 97 if (ACPI_FAILURE(status)) { 98 ACPI_EXCEPTION((AE_INFO, status, 99 "During Global Mutex creation")); 100 return_ACPI_STATUS(status); 101 } 102 103 /* 104 * Initialize the namespace manager and 105 * the root of the namespace tree 106 */ 107 status = acpi_ns_root_initialize(); 108 if (ACPI_FAILURE(status)) { 109 ACPI_EXCEPTION((AE_INFO, status, 110 "During Namespace initialization")); 111 return_ACPI_STATUS(status); 112 } 113 114 /* Initialize the global OSI interfaces list with the static names */ 115 116 status = acpi_ut_initialize_interfaces(); 117 if (ACPI_FAILURE(status)) { 118 ACPI_EXCEPTION((AE_INFO, status, 119 "During OSI interfaces initialization")); 120 return_ACPI_STATUS(status); 121 } 122 123 /* If configured, initialize the AML debugger */ 124 125 ACPI_DEBUGGER_EXEC(status = acpi_db_initialize()); 126 return_ACPI_STATUS(status); 127 } 128 129 /******************************************************************************* 130 * 131 * FUNCTION: acpi_enable_subsystem 132 * 133 * PARAMETERS: Flags - Init/enable Options 134 * 135 * RETURN: Status 136 * 137 * DESCRIPTION: Completes the subsystem initialization including hardware. 138 * Puts system into ACPI mode if it isn't already. 139 * 140 ******************************************************************************/ 141 acpi_status acpi_enable_subsystem(u32 flags) 142 { 143 acpi_status status = AE_OK; 144 145 ACPI_FUNCTION_TRACE(acpi_enable_subsystem); 146 147 /* Enable ACPI mode */ 148 149 if (!(flags & ACPI_NO_ACPI_ENABLE)) { 150 ACPI_DEBUG_PRINT((ACPI_DB_EXEC, 151 "[Init] Going into ACPI mode\n")); 152 153 acpi_gbl_original_mode = acpi_hw_get_mode(); 154 155 status = acpi_enable(); 156 if (ACPI_FAILURE(status)) { 157 ACPI_WARNING((AE_INFO, "AcpiEnable failed")); 158 return_ACPI_STATUS(status); 159 } 160 } 161 162 /* 163 * Obtain a permanent mapping for the FACS. This is required for the 164 * Global Lock and the Firmware Waking Vector 165 */ 166 status = acpi_tb_initialize_facs(); 167 if (ACPI_FAILURE(status)) { 168 ACPI_WARNING((AE_INFO, "Could not map the FACS table")); 169 return_ACPI_STATUS(status); 170 } 171 172 /* 173 * Install the default op_region handlers. These are installed unless 174 * other handlers have already been installed via the 175 * install_address_space_handler interface. 176 */ 177 if (!(flags & ACPI_NO_ADDRESS_SPACE_INIT)) { 178 ACPI_DEBUG_PRINT((ACPI_DB_EXEC, 179 "[Init] Installing default address space handlers\n")); 180 181 status = acpi_ev_install_region_handlers(); 182 if (ACPI_FAILURE(status)) { 183 return_ACPI_STATUS(status); 184 } 185 } 186 187 /* 188 * Initialize ACPI Event handling (Fixed and General Purpose) 189 * 190 * Note1: We must have the hardware and events initialized before we can 191 * execute any control methods safely. Any control method can require 192 * ACPI hardware support, so the hardware must be fully initialized before 193 * any method execution! 194 * 195 * Note2: Fixed events are initialized and enabled here. GPEs are 196 * initialized, but cannot be enabled until after the hardware is 197 * completely initialized (SCI and global_lock activated) 198 */ 199 if (!(flags & ACPI_NO_EVENT_INIT)) { 200 ACPI_DEBUG_PRINT((ACPI_DB_EXEC, 201 "[Init] Initializing ACPI events\n")); 202 203 status = acpi_ev_initialize_events(); 204 if (ACPI_FAILURE(status)) { 205 return_ACPI_STATUS(status); 206 } 207 } 208 209 /* 210 * Install the SCI handler and Global Lock handler. This completes the 211 * hardware initialization. 212 */ 213 if (!(flags & ACPI_NO_HANDLER_INIT)) { 214 ACPI_DEBUG_PRINT((ACPI_DB_EXEC, 215 "[Init] Installing SCI/GL handlers\n")); 216 217 status = acpi_ev_install_xrupt_handlers(); 218 if (ACPI_FAILURE(status)) { 219 return_ACPI_STATUS(status); 220 } 221 } 222 223 return_ACPI_STATUS(status); 224 } 225 226 ACPI_EXPORT_SYMBOL(acpi_enable_subsystem) 227 228 /******************************************************************************* 229 * 230 * FUNCTION: acpi_initialize_objects 231 * 232 * PARAMETERS: Flags - Init/enable Options 233 * 234 * RETURN: Status 235 * 236 * DESCRIPTION: Completes namespace initialization by initializing device 237 * objects and executing AML code for Regions, buffers, etc. 238 * 239 ******************************************************************************/ 240 acpi_status acpi_initialize_objects(u32 flags) 241 { 242 acpi_status status = AE_OK; 243 244 ACPI_FUNCTION_TRACE(acpi_initialize_objects); 245 246 /* 247 * Run all _REG methods 248 * 249 * Note: Any objects accessed by the _REG methods will be automatically 250 * initialized, even if they contain executable AML (see the call to 251 * acpi_ns_initialize_objects below). 252 */ 253 if (!(flags & ACPI_NO_ADDRESS_SPACE_INIT)) { 254 ACPI_DEBUG_PRINT((ACPI_DB_EXEC, 255 "[Init] Executing _REG OpRegion methods\n")); 256 257 status = acpi_ev_initialize_op_regions(); 258 if (ACPI_FAILURE(status)) { 259 return_ACPI_STATUS(status); 260 } 261 } 262 263 /* 264 * Execute any module-level code that was detected during the table load 265 * phase. Although illegal since ACPI 2.0, there are many machines that 266 * contain this type of code. Each block of detected executable AML code 267 * outside of any control method is wrapped with a temporary control 268 * method object and placed on a global list. The methods on this list 269 * are executed below. 270 */ 271 acpi_ns_exec_module_code_list(); 272 273 /* 274 * Initialize the objects that remain uninitialized. This runs the 275 * executable AML that may be part of the declaration of these objects: 276 * operation_regions, buffer_fields, Buffers, and Packages. 277 */ 278 if (!(flags & ACPI_NO_OBJECT_INIT)) { 279 ACPI_DEBUG_PRINT((ACPI_DB_EXEC, 280 "[Init] Completing Initialization of ACPI Objects\n")); 281 282 status = acpi_ns_initialize_objects(); 283 if (ACPI_FAILURE(status)) { 284 return_ACPI_STATUS(status); 285 } 286 } 287 288 /* 289 * Initialize all device objects in the namespace. This runs the device 290 * _STA and _INI methods. 291 */ 292 if (!(flags & ACPI_NO_DEVICE_INIT)) { 293 ACPI_DEBUG_PRINT((ACPI_DB_EXEC, 294 "[Init] Initializing ACPI Devices\n")); 295 296 status = acpi_ns_initialize_devices(); 297 if (ACPI_FAILURE(status)) { 298 return_ACPI_STATUS(status); 299 } 300 } 301 302 /* 303 * Empty the caches (delete the cached objects) on the assumption that 304 * the table load filled them up more than they will be at runtime -- 305 * thus wasting non-paged memory. 306 */ 307 status = acpi_purge_cached_objects(); 308 309 acpi_gbl_startup_flags |= ACPI_INITIALIZED_OK; 310 return_ACPI_STATUS(status); 311 } 312 313 ACPI_EXPORT_SYMBOL(acpi_initialize_objects) 314 315 #endif 316 /******************************************************************************* 317 * 318 * FUNCTION: acpi_terminate 319 * 320 * PARAMETERS: None 321 * 322 * RETURN: Status 323 * 324 * DESCRIPTION: Shutdown the ACPICA subsystem and release all resources. 325 * 326 ******************************************************************************/ 327 acpi_status acpi_terminate(void) 328 { 329 acpi_status status; 330 331 ACPI_FUNCTION_TRACE(acpi_terminate); 332 333 /* Just exit if subsystem is already shutdown */ 334 335 if (acpi_gbl_shutdown) { 336 ACPI_ERROR((AE_INFO, "ACPI Subsystem is already terminated")); 337 return_ACPI_STATUS(AE_OK); 338 } 339 340 /* Subsystem appears active, go ahead and shut it down */ 341 342 acpi_gbl_shutdown = TRUE; 343 acpi_gbl_startup_flags = 0; 344 ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Shutting down ACPI Subsystem\n")); 345 346 /* Terminate the AML Debugger if present */ 347 348 ACPI_DEBUGGER_EXEC(acpi_gbl_db_terminate_threads = TRUE); 349 350 /* Shutdown and free all resources */ 351 352 acpi_ut_subsystem_shutdown(); 353 354 /* Free the mutex objects */ 355 356 acpi_ut_mutex_terminate(); 357 358 #ifdef ACPI_DEBUGGER 359 360 /* Shut down the debugger */ 361 362 acpi_db_terminate(); 363 #endif 364 365 /* Now we can shutdown the OS-dependent layer */ 366 367 status = acpi_os_terminate(); 368 return_ACPI_STATUS(status); 369 } 370 371 ACPI_EXPORT_SYMBOL(acpi_terminate) 372 373 #ifndef ACPI_ASL_COMPILER 374 #ifdef ACPI_FUTURE_USAGE 375 /******************************************************************************* 376 * 377 * FUNCTION: acpi_subsystem_status 378 * 379 * PARAMETERS: None 380 * 381 * RETURN: Status of the ACPI subsystem 382 * 383 * DESCRIPTION: Other drivers that use the ACPI subsystem should call this 384 * before making any other calls, to ensure the subsystem 385 * initialized successfully. 386 * 387 ******************************************************************************/ 388 acpi_status acpi_subsystem_status(void) 389 { 390 391 if (acpi_gbl_startup_flags & ACPI_INITIALIZED_OK) { 392 return (AE_OK); 393 } else { 394 return (AE_ERROR); 395 } 396 } 397 398 ACPI_EXPORT_SYMBOL(acpi_subsystem_status) 399 400 /******************************************************************************* 401 * 402 * FUNCTION: acpi_get_system_info 403 * 404 * PARAMETERS: out_buffer - A buffer to receive the resources for the 405 * device 406 * 407 * RETURN: Status - the status of the call 408 * 409 * DESCRIPTION: This function is called to get information about the current 410 * state of the ACPI subsystem. It will return system information 411 * in the out_buffer. 412 * 413 * If the function fails an appropriate status will be returned 414 * and the value of out_buffer is undefined. 415 * 416 ******************************************************************************/ 417 acpi_status acpi_get_system_info(struct acpi_buffer * out_buffer) 418 { 419 struct acpi_system_info *info_ptr; 420 acpi_status status; 421 422 ACPI_FUNCTION_TRACE(acpi_get_system_info); 423 424 /* Parameter validation */ 425 426 status = acpi_ut_validate_buffer(out_buffer); 427 if (ACPI_FAILURE(status)) { 428 return_ACPI_STATUS(status); 429 } 430 431 /* Validate/Allocate/Clear caller buffer */ 432 433 status = 434 acpi_ut_initialize_buffer(out_buffer, 435 sizeof(struct acpi_system_info)); 436 if (ACPI_FAILURE(status)) { 437 return_ACPI_STATUS(status); 438 } 439 440 /* 441 * Populate the return buffer 442 */ 443 info_ptr = (struct acpi_system_info *)out_buffer->pointer; 444 445 info_ptr->acpi_ca_version = ACPI_CA_VERSION; 446 447 /* System flags (ACPI capabilities) */ 448 449 info_ptr->flags = ACPI_SYS_MODE_ACPI; 450 451 /* Timer resolution - 24 or 32 bits */ 452 453 if (acpi_gbl_FADT.flags & ACPI_FADT_32BIT_TIMER) { 454 info_ptr->timer_resolution = 24; 455 } else { 456 info_ptr->timer_resolution = 32; 457 } 458 459 /* Clear the reserved fields */ 460 461 info_ptr->reserved1 = 0; 462 info_ptr->reserved2 = 0; 463 464 /* Current debug levels */ 465 466 info_ptr->debug_layer = acpi_dbg_layer; 467 info_ptr->debug_level = acpi_dbg_level; 468 469 return_ACPI_STATUS(AE_OK); 470 } 471 472 ACPI_EXPORT_SYMBOL(acpi_get_system_info) 473 474 /***************************************************************************** 475 * 476 * FUNCTION: acpi_install_initialization_handler 477 * 478 * PARAMETERS: Handler - Callback procedure 479 * Function - Not (currently) used, see below 480 * 481 * RETURN: Status 482 * 483 * DESCRIPTION: Install an initialization handler 484 * 485 * TBD: When a second function is added, must save the Function also. 486 * 487 ****************************************************************************/ 488 acpi_status 489 acpi_install_initialization_handler(acpi_init_handler handler, u32 function) 490 { 491 492 if (!handler) { 493 return (AE_BAD_PARAMETER); 494 } 495 496 if (acpi_gbl_init_handler) { 497 return (AE_ALREADY_EXISTS); 498 } 499 500 acpi_gbl_init_handler = handler; 501 return AE_OK; 502 } 503 504 ACPI_EXPORT_SYMBOL(acpi_install_initialization_handler) 505 #endif /* ACPI_FUTURE_USAGE */ 506 507 /***************************************************************************** 508 * 509 * FUNCTION: acpi_purge_cached_objects 510 * 511 * PARAMETERS: None 512 * 513 * RETURN: Status 514 * 515 * DESCRIPTION: Empty all caches (delete the cached objects) 516 * 517 ****************************************************************************/ 518 acpi_status acpi_purge_cached_objects(void) 519 { 520 ACPI_FUNCTION_TRACE(acpi_purge_cached_objects); 521 522 (void)acpi_os_purge_cache(acpi_gbl_state_cache); 523 (void)acpi_os_purge_cache(acpi_gbl_operand_cache); 524 (void)acpi_os_purge_cache(acpi_gbl_ps_node_cache); 525 (void)acpi_os_purge_cache(acpi_gbl_ps_node_ext_cache); 526 return_ACPI_STATUS(AE_OK); 527 } 528 529 ACPI_EXPORT_SYMBOL(acpi_purge_cached_objects) 530 531 /***************************************************************************** 532 * 533 * FUNCTION: acpi_install_interface 534 * 535 * PARAMETERS: interface_name - The interface to install 536 * 537 * RETURN: Status 538 * 539 * DESCRIPTION: Install an _OSI interface to the global list 540 * 541 ****************************************************************************/ 542 acpi_status acpi_install_interface(acpi_string interface_name) 543 { 544 acpi_status status; 545 struct acpi_interface_info *interface_info; 546 547 /* Parameter validation */ 548 549 if (!interface_name || (ACPI_STRLEN(interface_name) == 0)) { 550 return (AE_BAD_PARAMETER); 551 } 552 553 (void)acpi_os_acquire_mutex(acpi_gbl_osi_mutex, ACPI_WAIT_FOREVER); 554 555 /* Check if the interface name is already in the global list */ 556 557 interface_info = acpi_ut_get_interface(interface_name); 558 if (interface_info) { 559 /* 560 * The interface already exists in the list. This is OK if the 561 * interface has been marked invalid -- just clear the bit. 562 */ 563 if (interface_info->flags & ACPI_OSI_INVALID) { 564 interface_info->flags &= ~ACPI_OSI_INVALID; 565 status = AE_OK; 566 } else { 567 status = AE_ALREADY_EXISTS; 568 } 569 } else { 570 /* New interface name, install into the global list */ 571 572 status = acpi_ut_install_interface(interface_name); 573 } 574 575 acpi_os_release_mutex(acpi_gbl_osi_mutex); 576 return (status); 577 } 578 579 ACPI_EXPORT_SYMBOL(acpi_install_interface) 580 581 /***************************************************************************** 582 * 583 * FUNCTION: acpi_remove_interface 584 * 585 * PARAMETERS: interface_name - The interface to remove 586 * 587 * RETURN: Status 588 * 589 * DESCRIPTION: Remove an _OSI interface from the global list 590 * 591 ****************************************************************************/ 592 acpi_status acpi_remove_interface(acpi_string interface_name) 593 { 594 acpi_status status; 595 596 /* Parameter validation */ 597 598 if (!interface_name || (ACPI_STRLEN(interface_name) == 0)) { 599 return (AE_BAD_PARAMETER); 600 } 601 602 (void)acpi_os_acquire_mutex(acpi_gbl_osi_mutex, ACPI_WAIT_FOREVER); 603 604 status = acpi_ut_remove_interface(interface_name); 605 606 acpi_os_release_mutex(acpi_gbl_osi_mutex); 607 return (status); 608 } 609 610 ACPI_EXPORT_SYMBOL(acpi_remove_interface) 611 612 /***************************************************************************** 613 * 614 * FUNCTION: acpi_install_interface_handler 615 * 616 * PARAMETERS: Handler - The _OSI interface handler to install 617 * NULL means "remove existing handler" 618 * 619 * RETURN: Status 620 * 621 * DESCRIPTION: Install a handler for the predefined _OSI ACPI method. 622 * invoked during execution of the internal implementation of 623 * _OSI. A NULL handler simply removes any existing handler. 624 * 625 ****************************************************************************/ 626 acpi_status acpi_install_interface_handler(acpi_interface_handler handler) 627 { 628 acpi_status status = AE_OK; 629 630 (void)acpi_os_acquire_mutex(acpi_gbl_osi_mutex, ACPI_WAIT_FOREVER); 631 632 if (handler && acpi_gbl_interface_handler) { 633 status = AE_ALREADY_EXISTS; 634 } else { 635 acpi_gbl_interface_handler = handler; 636 } 637 638 acpi_os_release_mutex(acpi_gbl_osi_mutex); 639 return (status); 640 } 641 642 ACPI_EXPORT_SYMBOL(acpi_install_interface_handler) 643 #endif /* !ACPI_ASL_COMPILER */ 644