Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v2.6.27 1215 lines 35 kB view raw
1/****************************************************************************** 2 * 3 * Module Name: evgpeblk - GPE block creation and initialization. 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#include <acpi/acpi.h> 45#include <acpi/acevents.h> 46#include <acpi/acnamesp.h> 47 48#define _COMPONENT ACPI_EVENTS 49ACPI_MODULE_NAME("evgpeblk") 50 51/* Local prototypes */ 52static acpi_status 53acpi_ev_save_method_info(acpi_handle obj_handle, 54 u32 level, void *obj_desc, void **return_value); 55 56static acpi_status 57acpi_ev_match_prw_and_gpe(acpi_handle obj_handle, 58 u32 level, void *info, void **return_value); 59 60static struct acpi_gpe_xrupt_info *acpi_ev_get_gpe_xrupt_block(u32 61 interrupt_number); 62 63static acpi_status 64acpi_ev_delete_gpe_xrupt(struct acpi_gpe_xrupt_info *gpe_xrupt); 65 66static acpi_status 67acpi_ev_install_gpe_block(struct acpi_gpe_block_info *gpe_block, 68 u32 interrupt_number); 69 70static acpi_status 71acpi_ev_create_gpe_info_blocks(struct acpi_gpe_block_info *gpe_block); 72 73/******************************************************************************* 74 * 75 * FUNCTION: acpi_ev_valid_gpe_event 76 * 77 * PARAMETERS: gpe_event_info - Info for this GPE 78 * 79 * RETURN: TRUE if the gpe_event is valid 80 * 81 * DESCRIPTION: Validate a GPE event. DO NOT CALL FROM INTERRUPT LEVEL. 82 * Should be called only when the GPE lists are semaphore locked 83 * and not subject to change. 84 * 85 ******************************************************************************/ 86 87u8 acpi_ev_valid_gpe_event(struct acpi_gpe_event_info *gpe_event_info) 88{ 89 struct acpi_gpe_xrupt_info *gpe_xrupt_block; 90 struct acpi_gpe_block_info *gpe_block; 91 92 ACPI_FUNCTION_ENTRY(); 93 94 /* No need for spin lock since we are not changing any list elements */ 95 96 /* Walk the GPE interrupt levels */ 97 98 gpe_xrupt_block = acpi_gbl_gpe_xrupt_list_head; 99 while (gpe_xrupt_block) { 100 gpe_block = gpe_xrupt_block->gpe_block_list_head; 101 102 /* Walk the GPE blocks on this interrupt level */ 103 104 while (gpe_block) { 105 if ((&gpe_block->event_info[0] <= gpe_event_info) && 106 (&gpe_block-> 107 event_info[((acpi_size) gpe_block-> 108 register_count) * 8] > 109 gpe_event_info)) { 110 return (TRUE); 111 } 112 113 gpe_block = gpe_block->next; 114 } 115 116 gpe_xrupt_block = gpe_xrupt_block->next; 117 } 118 119 return (FALSE); 120} 121 122/******************************************************************************* 123 * 124 * FUNCTION: acpi_ev_walk_gpe_list 125 * 126 * PARAMETERS: gpe_walk_callback - Routine called for each GPE block 127 * 128 * RETURN: Status 129 * 130 * DESCRIPTION: Walk the GPE lists. 131 * 132 ******************************************************************************/ 133 134acpi_status acpi_ev_walk_gpe_list(acpi_gpe_callback gpe_walk_callback) 135{ 136 struct acpi_gpe_block_info *gpe_block; 137 struct acpi_gpe_xrupt_info *gpe_xrupt_info; 138 acpi_status status = AE_OK; 139 acpi_cpu_flags flags; 140 141 ACPI_FUNCTION_TRACE(ev_walk_gpe_list); 142 143 flags = acpi_os_acquire_lock(acpi_gbl_gpe_lock); 144 145 /* Walk the interrupt level descriptor list */ 146 147 gpe_xrupt_info = acpi_gbl_gpe_xrupt_list_head; 148 while (gpe_xrupt_info) { 149 150 /* Walk all Gpe Blocks attached to this interrupt level */ 151 152 gpe_block = gpe_xrupt_info->gpe_block_list_head; 153 while (gpe_block) { 154 155 /* One callback per GPE block */ 156 157 status = gpe_walk_callback(gpe_xrupt_info, gpe_block); 158 if (ACPI_FAILURE(status)) { 159 goto unlock_and_exit; 160 } 161 162 gpe_block = gpe_block->next; 163 } 164 165 gpe_xrupt_info = gpe_xrupt_info->next; 166 } 167 168 unlock_and_exit: 169 acpi_os_release_lock(acpi_gbl_gpe_lock, flags); 170 return_ACPI_STATUS(status); 171} 172 173/******************************************************************************* 174 * 175 * FUNCTION: acpi_ev_delete_gpe_handlers 176 * 177 * PARAMETERS: gpe_xrupt_info - GPE Interrupt info 178 * gpe_block - Gpe Block info 179 * 180 * RETURN: Status 181 * 182 * DESCRIPTION: Delete all Handler objects found in the GPE data structs. 183 * Used only prior to termination. 184 * 185 ******************************************************************************/ 186 187acpi_status 188acpi_ev_delete_gpe_handlers(struct acpi_gpe_xrupt_info *gpe_xrupt_info, 189 struct acpi_gpe_block_info *gpe_block) 190{ 191 struct acpi_gpe_event_info *gpe_event_info; 192 u32 i; 193 u32 j; 194 195 ACPI_FUNCTION_TRACE(ev_delete_gpe_handlers); 196 197 /* Examine each GPE Register within the block */ 198 199 for (i = 0; i < gpe_block->register_count; i++) { 200 201 /* Now look at the individual GPEs in this byte register */ 202 203 for (j = 0; j < ACPI_GPE_REGISTER_WIDTH; j++) { 204 gpe_event_info = 205 &gpe_block-> 206 event_info[((acpi_size) i * 207 ACPI_GPE_REGISTER_WIDTH) + j]; 208 209 if ((gpe_event_info->flags & ACPI_GPE_DISPATCH_MASK) == 210 ACPI_GPE_DISPATCH_HANDLER) { 211 ACPI_FREE(gpe_event_info->dispatch.handler); 212 gpe_event_info->dispatch.handler = NULL; 213 gpe_event_info->flags &= 214 ~ACPI_GPE_DISPATCH_MASK; 215 } 216 } 217 } 218 219 return_ACPI_STATUS(AE_OK); 220} 221 222/******************************************************************************* 223 * 224 * FUNCTION: acpi_ev_save_method_info 225 * 226 * PARAMETERS: Callback from walk_namespace 227 * 228 * RETURN: Status 229 * 230 * DESCRIPTION: Called from acpi_walk_namespace. Expects each object to be a 231 * control method under the _GPE portion of the namespace. 232 * Extract the name and GPE type from the object, saving this 233 * information for quick lookup during GPE dispatch 234 * 235 * The name of each GPE control method is of the form: 236 * "_Lxx" or "_Exx" 237 * Where: 238 * L - means that the GPE is level triggered 239 * E - means that the GPE is edge triggered 240 * xx - is the GPE number [in HEX] 241 * 242 ******************************************************************************/ 243 244static acpi_status 245acpi_ev_save_method_info(acpi_handle obj_handle, 246 u32 level, void *obj_desc, void **return_value) 247{ 248 struct acpi_gpe_block_info *gpe_block = (void *)obj_desc; 249 struct acpi_gpe_event_info *gpe_event_info; 250 u32 gpe_number; 251 char name[ACPI_NAME_SIZE + 1]; 252 u8 type; 253 acpi_status status; 254 255 ACPI_FUNCTION_TRACE(ev_save_method_info); 256 257 /* 258 * _Lxx and _Exx GPE method support 259 * 260 * 1) Extract the name from the object and convert to a string 261 */ 262 ACPI_MOVE_32_TO_32(name, 263 &((struct acpi_namespace_node *)obj_handle)->name. 264 integer); 265 name[ACPI_NAME_SIZE] = 0; 266 267 /* 268 * 2) Edge/Level determination is based on the 2nd character 269 * of the method name 270 * 271 * NOTE: Default GPE type is RUNTIME. May be changed later to WAKE 272 * if a _PRW object is found that points to this GPE. 273 */ 274 switch (name[1]) { 275 case 'L': 276 type = ACPI_GPE_LEVEL_TRIGGERED; 277 break; 278 279 case 'E': 280 type = ACPI_GPE_EDGE_TRIGGERED; 281 break; 282 283 default: 284 /* Unknown method type, just ignore it! */ 285 286 ACPI_DEBUG_PRINT((ACPI_DB_LOAD, 287 "Ignoring unknown GPE method type: %s (name not of form _Lxx or _Exx)", 288 name)); 289 return_ACPI_STATUS(AE_OK); 290 } 291 292 /* Convert the last two characters of the name to the GPE Number */ 293 294 gpe_number = ACPI_STRTOUL(&name[2], NULL, 16); 295 if (gpe_number == ACPI_UINT32_MAX) { 296 297 /* Conversion failed; invalid method, just ignore it */ 298 299 ACPI_DEBUG_PRINT((ACPI_DB_LOAD, 300 "Could not extract GPE number from name: %s (name is not of form _Lxx or _Exx)", 301 name)); 302 return_ACPI_STATUS(AE_OK); 303 } 304 305 /* Ensure that we have a valid GPE number for this GPE block */ 306 307 if ((gpe_number < gpe_block->block_base_number) || 308 (gpe_number >= 309 (gpe_block->block_base_number + 310 (gpe_block->register_count * 8)))) { 311 /* 312 * Not valid for this GPE block, just ignore it 313 * However, it may be valid for a different GPE block, since GPE0 and GPE1 314 * methods both appear under \_GPE. 315 */ 316 return_ACPI_STATUS(AE_OK); 317 } 318 319 /* 320 * Now we can add this information to the gpe_event_info block 321 * for use during dispatch of this GPE. Default type is RUNTIME, although 322 * this may change when the _PRW methods are executed later. 323 */ 324 gpe_event_info = 325 &gpe_block->event_info[gpe_number - gpe_block->block_base_number]; 326 327 gpe_event_info->flags = (u8) 328 (type | ACPI_GPE_DISPATCH_METHOD | ACPI_GPE_TYPE_RUNTIME); 329 330 gpe_event_info->dispatch.method_node = 331 (struct acpi_namespace_node *)obj_handle; 332 333 /* Update enable mask, but don't enable the HW GPE as of yet */ 334 335 status = acpi_ev_enable_gpe(gpe_event_info, FALSE); 336 337 ACPI_DEBUG_PRINT((ACPI_DB_LOAD, 338 "Registered GPE method %s as GPE number 0x%.2X\n", 339 name, gpe_number)); 340 return_ACPI_STATUS(status); 341} 342 343/******************************************************************************* 344 * 345 * FUNCTION: acpi_ev_match_prw_and_gpe 346 * 347 * PARAMETERS: Callback from walk_namespace 348 * 349 * RETURN: Status. NOTE: We ignore errors so that the _PRW walk is 350 * not aborted on a single _PRW failure. 351 * 352 * DESCRIPTION: Called from acpi_walk_namespace. Expects each object to be a 353 * Device. Run the _PRW method. If present, extract the GPE 354 * number and mark the GPE as a WAKE GPE. 355 * 356 ******************************************************************************/ 357 358static acpi_status 359acpi_ev_match_prw_and_gpe(acpi_handle obj_handle, 360 u32 level, void *info, void **return_value) 361{ 362 struct acpi_gpe_walk_info *gpe_info = (void *)info; 363 struct acpi_namespace_node *gpe_device; 364 struct acpi_gpe_block_info *gpe_block; 365 struct acpi_namespace_node *target_gpe_device; 366 struct acpi_gpe_event_info *gpe_event_info; 367 union acpi_operand_object *pkg_desc; 368 union acpi_operand_object *obj_desc; 369 u32 gpe_number; 370 acpi_status status; 371 372 ACPI_FUNCTION_TRACE(ev_match_prw_and_gpe); 373 374 /* Check for a _PRW method under this device */ 375 376 status = acpi_ut_evaluate_object(obj_handle, METHOD_NAME__PRW, 377 ACPI_BTYPE_PACKAGE, &pkg_desc); 378 if (ACPI_FAILURE(status)) { 379 380 /* Ignore all errors from _PRW, we don't want to abort the subsystem */ 381 382 return_ACPI_STATUS(AE_OK); 383 } 384 385 /* The returned _PRW package must have at least two elements */ 386 387 if (pkg_desc->package.count < 2) { 388 goto cleanup; 389 } 390 391 /* Extract pointers from the input context */ 392 393 gpe_device = gpe_info->gpe_device; 394 gpe_block = gpe_info->gpe_block; 395 396 /* 397 * The _PRW object must return a package, we are only interested 398 * in the first element 399 */ 400 obj_desc = pkg_desc->package.elements[0]; 401 402 if (ACPI_GET_OBJECT_TYPE(obj_desc) == ACPI_TYPE_INTEGER) { 403 404 /* Use FADT-defined GPE device (from definition of _PRW) */ 405 406 target_gpe_device = acpi_gbl_fadt_gpe_device; 407 408 /* Integer is the GPE number in the FADT described GPE blocks */ 409 410 gpe_number = (u32) obj_desc->integer.value; 411 } else if (ACPI_GET_OBJECT_TYPE(obj_desc) == ACPI_TYPE_PACKAGE) { 412 413 /* Package contains a GPE reference and GPE number within a GPE block */ 414 415 if ((obj_desc->package.count < 2) || 416 (ACPI_GET_OBJECT_TYPE(obj_desc->package.elements[0]) != 417 ACPI_TYPE_LOCAL_REFERENCE) 418 || (ACPI_GET_OBJECT_TYPE(obj_desc->package.elements[1]) != 419 ACPI_TYPE_INTEGER)) { 420 goto cleanup; 421 } 422 423 /* Get GPE block reference and decode */ 424 425 target_gpe_device = 426 obj_desc->package.elements[0]->reference.node; 427 gpe_number = (u32) obj_desc->package.elements[1]->integer.value; 428 } else { 429 /* Unknown type, just ignore it */ 430 431 goto cleanup; 432 } 433 434 /* 435 * Is this GPE within this block? 436 * 437 * TRUE iff these conditions are true: 438 * 1) The GPE devices match. 439 * 2) The GPE index(number) is within the range of the Gpe Block 440 * associated with the GPE device. 441 */ 442 if ((gpe_device == target_gpe_device) && 443 (gpe_number >= gpe_block->block_base_number) && 444 (gpe_number < 445 gpe_block->block_base_number + (gpe_block->register_count * 8))) { 446 gpe_event_info = 447 &gpe_block->event_info[gpe_number - 448 gpe_block->block_base_number]; 449 450 /* Mark GPE for WAKE-ONLY but WAKE_DISABLED */ 451 452 gpe_event_info->flags &= 453 ~(ACPI_GPE_WAKE_ENABLED | ACPI_GPE_RUN_ENABLED); 454 455 status = 456 acpi_ev_set_gpe_type(gpe_event_info, ACPI_GPE_TYPE_WAKE); 457 if (ACPI_FAILURE(status)) { 458 goto cleanup; 459 } 460 status = 461 acpi_ev_update_gpe_enable_masks(gpe_event_info, 462 ACPI_GPE_DISABLE); 463 } 464 465 cleanup: 466 acpi_ut_remove_reference(pkg_desc); 467 return_ACPI_STATUS(AE_OK); 468} 469 470/******************************************************************************* 471 * 472 * FUNCTION: acpi_ev_get_gpe_xrupt_block 473 * 474 * PARAMETERS: interrupt_number - Interrupt for a GPE block 475 * 476 * RETURN: A GPE interrupt block 477 * 478 * DESCRIPTION: Get or Create a GPE interrupt block. There is one interrupt 479 * block per unique interrupt level used for GPEs. 480 * Should be called only when the GPE lists are semaphore locked 481 * and not subject to change. 482 * 483 ******************************************************************************/ 484 485static struct acpi_gpe_xrupt_info *acpi_ev_get_gpe_xrupt_block(u32 486 interrupt_number) 487{ 488 struct acpi_gpe_xrupt_info *next_gpe_xrupt; 489 struct acpi_gpe_xrupt_info *gpe_xrupt; 490 acpi_status status; 491 acpi_cpu_flags flags; 492 493 ACPI_FUNCTION_TRACE(ev_get_gpe_xrupt_block); 494 495 /* No need for lock since we are not changing any list elements here */ 496 497 next_gpe_xrupt = acpi_gbl_gpe_xrupt_list_head; 498 while (next_gpe_xrupt) { 499 if (next_gpe_xrupt->interrupt_number == interrupt_number) { 500 return_PTR(next_gpe_xrupt); 501 } 502 503 next_gpe_xrupt = next_gpe_xrupt->next; 504 } 505 506 /* Not found, must allocate a new xrupt descriptor */ 507 508 gpe_xrupt = ACPI_ALLOCATE_ZEROED(sizeof(struct acpi_gpe_xrupt_info)); 509 if (!gpe_xrupt) { 510 return_PTR(NULL); 511 } 512 513 gpe_xrupt->interrupt_number = interrupt_number; 514 515 /* Install new interrupt descriptor with spin lock */ 516 517 flags = acpi_os_acquire_lock(acpi_gbl_gpe_lock); 518 if (acpi_gbl_gpe_xrupt_list_head) { 519 next_gpe_xrupt = acpi_gbl_gpe_xrupt_list_head; 520 while (next_gpe_xrupt->next) { 521 next_gpe_xrupt = next_gpe_xrupt->next; 522 } 523 524 next_gpe_xrupt->next = gpe_xrupt; 525 gpe_xrupt->previous = next_gpe_xrupt; 526 } else { 527 acpi_gbl_gpe_xrupt_list_head = gpe_xrupt; 528 } 529 acpi_os_release_lock(acpi_gbl_gpe_lock, flags); 530 531 /* Install new interrupt handler if not SCI_INT */ 532 533 if (interrupt_number != acpi_gbl_FADT.sci_interrupt) { 534 status = acpi_os_install_interrupt_handler(interrupt_number, 535 acpi_ev_gpe_xrupt_handler, 536 gpe_xrupt); 537 if (ACPI_FAILURE(status)) { 538 ACPI_ERROR((AE_INFO, 539 "Could not install GPE interrupt handler at level 0x%X", 540 interrupt_number)); 541 return_PTR(NULL); 542 } 543 } 544 545 return_PTR(gpe_xrupt); 546} 547 548/******************************************************************************* 549 * 550 * FUNCTION: acpi_ev_delete_gpe_xrupt 551 * 552 * PARAMETERS: gpe_xrupt - A GPE interrupt info block 553 * 554 * RETURN: Status 555 * 556 * DESCRIPTION: Remove and free a gpe_xrupt block. Remove an associated 557 * interrupt handler if not the SCI interrupt. 558 * 559 ******************************************************************************/ 560 561static acpi_status 562acpi_ev_delete_gpe_xrupt(struct acpi_gpe_xrupt_info *gpe_xrupt) 563{ 564 acpi_status status; 565 acpi_cpu_flags flags; 566 567 ACPI_FUNCTION_TRACE(ev_delete_gpe_xrupt); 568 569 /* We never want to remove the SCI interrupt handler */ 570 571 if (gpe_xrupt->interrupt_number == acpi_gbl_FADT.sci_interrupt) { 572 gpe_xrupt->gpe_block_list_head = NULL; 573 return_ACPI_STATUS(AE_OK); 574 } 575 576 /* Disable this interrupt */ 577 578 status = 579 acpi_os_remove_interrupt_handler(gpe_xrupt->interrupt_number, 580 acpi_ev_gpe_xrupt_handler); 581 if (ACPI_FAILURE(status)) { 582 return_ACPI_STATUS(status); 583 } 584 585 /* Unlink the interrupt block with lock */ 586 587 flags = acpi_os_acquire_lock(acpi_gbl_gpe_lock); 588 if (gpe_xrupt->previous) { 589 gpe_xrupt->previous->next = gpe_xrupt->next; 590 } else { 591 /* No previous, update list head */ 592 593 acpi_gbl_gpe_xrupt_list_head = gpe_xrupt->next; 594 } 595 596 if (gpe_xrupt->next) { 597 gpe_xrupt->next->previous = gpe_xrupt->previous; 598 } 599 acpi_os_release_lock(acpi_gbl_gpe_lock, flags); 600 601 /* Free the block */ 602 603 ACPI_FREE(gpe_xrupt); 604 return_ACPI_STATUS(AE_OK); 605} 606 607/******************************************************************************* 608 * 609 * FUNCTION: acpi_ev_install_gpe_block 610 * 611 * PARAMETERS: gpe_block - New GPE block 612 * interrupt_number - Xrupt to be associated with this GPE block 613 * 614 * RETURN: Status 615 * 616 * DESCRIPTION: Install new GPE block with mutex support 617 * 618 ******************************************************************************/ 619 620static acpi_status 621acpi_ev_install_gpe_block(struct acpi_gpe_block_info *gpe_block, 622 u32 interrupt_number) 623{ 624 struct acpi_gpe_block_info *next_gpe_block; 625 struct acpi_gpe_xrupt_info *gpe_xrupt_block; 626 acpi_status status; 627 acpi_cpu_flags flags; 628 629 ACPI_FUNCTION_TRACE(ev_install_gpe_block); 630 631 status = acpi_ut_acquire_mutex(ACPI_MTX_EVENTS); 632 if (ACPI_FAILURE(status)) { 633 return_ACPI_STATUS(status); 634 } 635 636 gpe_xrupt_block = acpi_ev_get_gpe_xrupt_block(interrupt_number); 637 if (!gpe_xrupt_block) { 638 status = AE_NO_MEMORY; 639 goto unlock_and_exit; 640 } 641 642 /* Install the new block at the end of the list with lock */ 643 644 flags = acpi_os_acquire_lock(acpi_gbl_gpe_lock); 645 if (gpe_xrupt_block->gpe_block_list_head) { 646 next_gpe_block = gpe_xrupt_block->gpe_block_list_head; 647 while (next_gpe_block->next) { 648 next_gpe_block = next_gpe_block->next; 649 } 650 651 next_gpe_block->next = gpe_block; 652 gpe_block->previous = next_gpe_block; 653 } else { 654 gpe_xrupt_block->gpe_block_list_head = gpe_block; 655 } 656 657 gpe_block->xrupt_block = gpe_xrupt_block; 658 acpi_os_release_lock(acpi_gbl_gpe_lock, flags); 659 660 unlock_and_exit: 661 status = acpi_ut_release_mutex(ACPI_MTX_EVENTS); 662 return_ACPI_STATUS(status); 663} 664 665/******************************************************************************* 666 * 667 * FUNCTION: acpi_ev_delete_gpe_block 668 * 669 * PARAMETERS: gpe_block - Existing GPE block 670 * 671 * RETURN: Status 672 * 673 * DESCRIPTION: Remove a GPE block 674 * 675 ******************************************************************************/ 676 677acpi_status acpi_ev_delete_gpe_block(struct acpi_gpe_block_info *gpe_block) 678{ 679 acpi_status status; 680 acpi_cpu_flags flags; 681 682 ACPI_FUNCTION_TRACE(ev_install_gpe_block); 683 684 status = acpi_ut_acquire_mutex(ACPI_MTX_EVENTS); 685 if (ACPI_FAILURE(status)) { 686 return_ACPI_STATUS(status); 687 } 688 689 /* Disable all GPEs in this block */ 690 691 status = acpi_hw_disable_gpe_block(gpe_block->xrupt_block, gpe_block); 692 693 if (!gpe_block->previous && !gpe_block->next) { 694 695 /* This is the last gpe_block on this interrupt */ 696 697 status = acpi_ev_delete_gpe_xrupt(gpe_block->xrupt_block); 698 if (ACPI_FAILURE(status)) { 699 goto unlock_and_exit; 700 } 701 } else { 702 /* Remove the block on this interrupt with lock */ 703 704 flags = acpi_os_acquire_lock(acpi_gbl_gpe_lock); 705 if (gpe_block->previous) { 706 gpe_block->previous->next = gpe_block->next; 707 } else { 708 gpe_block->xrupt_block->gpe_block_list_head = 709 gpe_block->next; 710 } 711 712 if (gpe_block->next) { 713 gpe_block->next->previous = gpe_block->previous; 714 } 715 acpi_os_release_lock(acpi_gbl_gpe_lock, flags); 716 } 717 718 /* Free the gpe_block */ 719 720 ACPI_FREE(gpe_block->register_info); 721 ACPI_FREE(gpe_block->event_info); 722 ACPI_FREE(gpe_block); 723 724 unlock_and_exit: 725 status = acpi_ut_release_mutex(ACPI_MTX_EVENTS); 726 return_ACPI_STATUS(status); 727} 728 729/******************************************************************************* 730 * 731 * FUNCTION: acpi_ev_create_gpe_info_blocks 732 * 733 * PARAMETERS: gpe_block - New GPE block 734 * 735 * RETURN: Status 736 * 737 * DESCRIPTION: Create the register_info and event_info blocks for this GPE block 738 * 739 ******************************************************************************/ 740 741static acpi_status 742acpi_ev_create_gpe_info_blocks(struct acpi_gpe_block_info *gpe_block) 743{ 744 struct acpi_gpe_register_info *gpe_register_info = NULL; 745 struct acpi_gpe_event_info *gpe_event_info = NULL; 746 struct acpi_gpe_event_info *this_event; 747 struct acpi_gpe_register_info *this_register; 748 u32 i; 749 u32 j; 750 acpi_status status; 751 752 ACPI_FUNCTION_TRACE(ev_create_gpe_info_blocks); 753 754 /* Allocate the GPE register information block */ 755 756 gpe_register_info = ACPI_ALLOCATE_ZEROED((acpi_size) gpe_block-> 757 register_count * 758 sizeof(struct 759 acpi_gpe_register_info)); 760 if (!gpe_register_info) { 761 ACPI_ERROR((AE_INFO, 762 "Could not allocate the GpeRegisterInfo table")); 763 return_ACPI_STATUS(AE_NO_MEMORY); 764 } 765 766 /* 767 * Allocate the GPE event_info block. There are eight distinct GPEs 768 * per register. Initialization to zeros is sufficient. 769 */ 770 gpe_event_info = ACPI_ALLOCATE_ZEROED(((acpi_size) gpe_block-> 771 register_count * 772 ACPI_GPE_REGISTER_WIDTH) * 773 sizeof(struct 774 acpi_gpe_event_info)); 775 if (!gpe_event_info) { 776 ACPI_ERROR((AE_INFO, 777 "Could not allocate the GpeEventInfo table")); 778 status = AE_NO_MEMORY; 779 goto error_exit; 780 } 781 782 /* Save the new Info arrays in the GPE block */ 783 784 gpe_block->register_info = gpe_register_info; 785 gpe_block->event_info = gpe_event_info; 786 787 /* 788 * Initialize the GPE Register and Event structures. A goal of these 789 * tables is to hide the fact that there are two separate GPE register sets 790 * in a given GPE hardware block, the status registers occupy the first half, 791 * and the enable registers occupy the second half. 792 */ 793 this_register = gpe_register_info; 794 this_event = gpe_event_info; 795 796 for (i = 0; i < gpe_block->register_count; i++) { 797 798 /* Init the register_info for this GPE register (8 GPEs) */ 799 800 this_register->base_gpe_number = 801 (u8) (gpe_block->block_base_number + 802 (i * ACPI_GPE_REGISTER_WIDTH)); 803 804 this_register->status_address.address = 805 gpe_block->block_address.address + i; 806 807 this_register->enable_address.address = 808 gpe_block->block_address.address + i + 809 gpe_block->register_count; 810 811 this_register->status_address.space_id = 812 gpe_block->block_address.space_id; 813 this_register->enable_address.space_id = 814 gpe_block->block_address.space_id; 815 this_register->status_address.bit_width = 816 ACPI_GPE_REGISTER_WIDTH; 817 this_register->enable_address.bit_width = 818 ACPI_GPE_REGISTER_WIDTH; 819 this_register->status_address.bit_offset = 820 ACPI_GPE_REGISTER_WIDTH; 821 this_register->enable_address.bit_offset = 822 ACPI_GPE_REGISTER_WIDTH; 823 824 /* Init the event_info for each GPE within this register */ 825 826 for (j = 0; j < ACPI_GPE_REGISTER_WIDTH; j++) { 827 this_event->gpe_number = 828 (u8) (this_register->base_gpe_number + j); 829 this_event->register_info = this_register; 830 this_event++; 831 } 832 833 /* Disable all GPEs within this register */ 834 835 status = acpi_hw_low_level_write(ACPI_GPE_REGISTER_WIDTH, 0x00, 836 &this_register-> 837 enable_address); 838 if (ACPI_FAILURE(status)) { 839 goto error_exit; 840 } 841 842 /* Clear any pending GPE events within this register */ 843 844 status = acpi_hw_low_level_write(ACPI_GPE_REGISTER_WIDTH, 0xFF, 845 &this_register-> 846 status_address); 847 if (ACPI_FAILURE(status)) { 848 goto error_exit; 849 } 850 851 this_register++; 852 } 853 854 return_ACPI_STATUS(AE_OK); 855 856 error_exit: 857 if (gpe_register_info) { 858 ACPI_FREE(gpe_register_info); 859 } 860 if (gpe_event_info) { 861 ACPI_FREE(gpe_event_info); 862 } 863 864 return_ACPI_STATUS(status); 865} 866 867/******************************************************************************* 868 * 869 * FUNCTION: acpi_ev_create_gpe_block 870 * 871 * PARAMETERS: gpe_device - Handle to the parent GPE block 872 * gpe_block_address - Address and space_iD 873 * register_count - Number of GPE register pairs in the block 874 * gpe_block_base_number - Starting GPE number for the block 875 * interrupt_number - H/W interrupt for the block 876 * return_gpe_block - Where the new block descriptor is returned 877 * 878 * RETURN: Status 879 * 880 * DESCRIPTION: Create and Install a block of GPE registers. All GPEs within 881 * the block are disabled at exit. 882 * Note: Assumes namespace is locked. 883 * 884 ******************************************************************************/ 885 886acpi_status 887acpi_ev_create_gpe_block(struct acpi_namespace_node *gpe_device, 888 struct acpi_generic_address *gpe_block_address, 889 u32 register_count, 890 u8 gpe_block_base_number, 891 u32 interrupt_number, 892 struct acpi_gpe_block_info **return_gpe_block) 893{ 894 acpi_status status; 895 struct acpi_gpe_block_info *gpe_block; 896 897 ACPI_FUNCTION_TRACE(ev_create_gpe_block); 898 899 if (!register_count) { 900 return_ACPI_STATUS(AE_OK); 901 } 902 903 /* Allocate a new GPE block */ 904 905 gpe_block = ACPI_ALLOCATE_ZEROED(sizeof(struct acpi_gpe_block_info)); 906 if (!gpe_block) { 907 return_ACPI_STATUS(AE_NO_MEMORY); 908 } 909 910 /* Initialize the new GPE block */ 911 912 gpe_block->node = gpe_device; 913 gpe_block->register_count = register_count; 914 gpe_block->block_base_number = gpe_block_base_number; 915 916 ACPI_MEMCPY(&gpe_block->block_address, gpe_block_address, 917 sizeof(struct acpi_generic_address)); 918 919 /* 920 * Create the register_info and event_info sub-structures 921 * Note: disables and clears all GPEs in the block 922 */ 923 status = acpi_ev_create_gpe_info_blocks(gpe_block); 924 if (ACPI_FAILURE(status)) { 925 ACPI_FREE(gpe_block); 926 return_ACPI_STATUS(status); 927 } 928 929 /* Install the new block in the global lists */ 930 931 status = acpi_ev_install_gpe_block(gpe_block, interrupt_number); 932 if (ACPI_FAILURE(status)) { 933 ACPI_FREE(gpe_block); 934 return_ACPI_STATUS(status); 935 } 936 937 /* Find all GPE methods (_Lxx, _Exx) for this block */ 938 939 status = acpi_ns_walk_namespace(ACPI_TYPE_METHOD, gpe_device, 940 ACPI_UINT32_MAX, ACPI_NS_WALK_NO_UNLOCK, 941 acpi_ev_save_method_info, gpe_block, 942 NULL); 943 944 /* Return the new block */ 945 946 if (return_gpe_block) { 947 (*return_gpe_block) = gpe_block; 948 } 949 950 ACPI_DEBUG_PRINT((ACPI_DB_INIT, 951 "GPE %02X to %02X [%4.4s] %u regs on int 0x%X\n", 952 (u32) gpe_block->block_base_number, 953 (u32) (gpe_block->block_base_number + 954 ((gpe_block->register_count * 955 ACPI_GPE_REGISTER_WIDTH) - 1)), 956 gpe_device->name.ascii, gpe_block->register_count, 957 interrupt_number)); 958 959 return_ACPI_STATUS(AE_OK); 960} 961 962/******************************************************************************* 963 * 964 * FUNCTION: acpi_ev_initialize_gpe_block 965 * 966 * PARAMETERS: gpe_device - Handle to the parent GPE block 967 * gpe_block - Gpe Block info 968 * 969 * RETURN: Status 970 * 971 * DESCRIPTION: Initialize and enable a GPE block. First find and run any 972 * _PRT methods associated with the block, then enable the 973 * appropriate GPEs. 974 * Note: Assumes namespace is locked. 975 * 976 ******************************************************************************/ 977 978acpi_status 979acpi_ev_initialize_gpe_block(struct acpi_namespace_node *gpe_device, 980 struct acpi_gpe_block_info *gpe_block) 981{ 982 acpi_status status; 983 struct acpi_gpe_event_info *gpe_event_info; 984 struct acpi_gpe_walk_info gpe_info; 985 u32 wake_gpe_count; 986 u32 gpe_enabled_count; 987 u32 i; 988 u32 j; 989 990 ACPI_FUNCTION_TRACE(ev_initialize_gpe_block); 991 992 /* Ignore a null GPE block (e.g., if no GPE block 1 exists) */ 993 994 if (!gpe_block) { 995 return_ACPI_STATUS(AE_OK); 996 } 997 998 /* 999 * Runtime option: Should wake GPEs be enabled at runtime? The default 1000 * is no, they should only be enabled just as the machine goes to sleep. 1001 */ 1002 if (acpi_gbl_leave_wake_gpes_disabled) { 1003 /* 1004 * Differentiate runtime vs wake GPEs, via the _PRW control methods. 1005 * Each GPE that has one or more _PRWs that reference it is by 1006 * definition a wake GPE and will not be enabled while the machine 1007 * is running. 1008 */ 1009 gpe_info.gpe_block = gpe_block; 1010 gpe_info.gpe_device = gpe_device; 1011 1012 status = 1013 acpi_ns_walk_namespace(ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT, 1014 ACPI_UINT32_MAX, ACPI_NS_WALK_UNLOCK, 1015 acpi_ev_match_prw_and_gpe, &gpe_info, 1016 NULL); 1017 } 1018 1019 /* 1020 * Enable all GPEs in this block that have these attributes: 1021 * 1) are "runtime" or "run/wake" GPEs, and 1022 * 2) have a corresponding _Lxx or _Exx method 1023 * 1024 * Any other GPEs within this block must be enabled via the acpi_enable_gpe() 1025 * external interface. 1026 */ 1027 wake_gpe_count = 0; 1028 gpe_enabled_count = 0; 1029 1030 for (i = 0; i < gpe_block->register_count; i++) { 1031 for (j = 0; j < 8; j++) { 1032 1033 /* Get the info block for this particular GPE */ 1034 1035 gpe_event_info = 1036 &gpe_block-> 1037 event_info[((acpi_size) i * 1038 ACPI_GPE_REGISTER_WIDTH) + j]; 1039 1040 if (((gpe_event_info->flags & ACPI_GPE_DISPATCH_MASK) == 1041 ACPI_GPE_DISPATCH_METHOD) 1042 && (gpe_event_info->flags & ACPI_GPE_TYPE_RUNTIME)) { 1043 gpe_enabled_count++; 1044 } 1045 1046 if (gpe_event_info->flags & ACPI_GPE_TYPE_WAKE) { 1047 wake_gpe_count++; 1048 } 1049 } 1050 } 1051 1052 ACPI_DEBUG_PRINT((ACPI_DB_INIT, 1053 "Found %u Wake, Enabled %u Runtime GPEs in this block\n", 1054 wake_gpe_count, gpe_enabled_count)); 1055 1056 /* Enable all valid runtime GPEs found above */ 1057 1058 status = acpi_hw_enable_runtime_gpe_block(NULL, gpe_block); 1059 if (ACPI_FAILURE(status)) { 1060 ACPI_ERROR((AE_INFO, "Could not enable GPEs in GpeBlock %p", 1061 gpe_block)); 1062 } 1063 1064 return_ACPI_STATUS(status); 1065} 1066 1067/******************************************************************************* 1068 * 1069 * FUNCTION: acpi_ev_gpe_initialize 1070 * 1071 * PARAMETERS: None 1072 * 1073 * RETURN: Status 1074 * 1075 * DESCRIPTION: Initialize the GPE data structures 1076 * 1077 ******************************************************************************/ 1078 1079acpi_status acpi_ev_gpe_initialize(void) 1080{ 1081 u32 register_count0 = 0; 1082 u32 register_count1 = 0; 1083 u32 gpe_number_max = 0; 1084 acpi_status status; 1085 1086 ACPI_FUNCTION_TRACE(ev_gpe_initialize); 1087 1088 status = acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE); 1089 if (ACPI_FAILURE(status)) { 1090 return_ACPI_STATUS(status); 1091 } 1092 1093 /* 1094 * Initialize the GPE Block(s) defined in the FADT 1095 * 1096 * Why the GPE register block lengths are divided by 2: From the ACPI Spec, 1097 * section "General-Purpose Event Registers", we have: 1098 * 1099 * "Each register block contains two registers of equal length 1100 * GPEx_STS and GPEx_EN (where x is 0 or 1). The length of the 1101 * GPE0_STS and GPE0_EN registers is equal to half the GPE0_LEN 1102 * The length of the GPE1_STS and GPE1_EN registers is equal to 1103 * half the GPE1_LEN. If a generic register block is not supported 1104 * then its respective block pointer and block length values in the 1105 * FADT table contain zeros. The GPE0_LEN and GPE1_LEN do not need 1106 * to be the same size." 1107 */ 1108 1109 /* 1110 * Determine the maximum GPE number for this machine. 1111 * 1112 * Note: both GPE0 and GPE1 are optional, and either can exist without 1113 * the other. 1114 * 1115 * If EITHER the register length OR the block address are zero, then that 1116 * particular block is not supported. 1117 */ 1118 if (acpi_gbl_FADT.gpe0_block_length && 1119 acpi_gbl_FADT.xgpe0_block.address) { 1120 1121 /* GPE block 0 exists (has both length and address > 0) */ 1122 1123 register_count0 = (u16) (acpi_gbl_FADT.gpe0_block_length / 2); 1124 1125 gpe_number_max = 1126 (register_count0 * ACPI_GPE_REGISTER_WIDTH) - 1; 1127 1128 /* Install GPE Block 0 */ 1129 1130 status = acpi_ev_create_gpe_block(acpi_gbl_fadt_gpe_device, 1131 &acpi_gbl_FADT.xgpe0_block, 1132 register_count0, 0, 1133 acpi_gbl_FADT.sci_interrupt, 1134 &acpi_gbl_gpe_fadt_blocks[0]); 1135 1136 if (ACPI_FAILURE(status)) { 1137 ACPI_EXCEPTION((AE_INFO, status, 1138 "Could not create GPE Block 0")); 1139 } 1140 } 1141 1142 if (acpi_gbl_FADT.gpe1_block_length && 1143 acpi_gbl_FADT.xgpe1_block.address) { 1144 1145 /* GPE block 1 exists (has both length and address > 0) */ 1146 1147 register_count1 = (u16) (acpi_gbl_FADT.gpe1_block_length / 2); 1148 1149 /* Check for GPE0/GPE1 overlap (if both banks exist) */ 1150 1151 if ((register_count0) && 1152 (gpe_number_max >= acpi_gbl_FADT.gpe1_base)) { 1153 ACPI_ERROR((AE_INFO, 1154 "GPE0 block (GPE 0 to %d) overlaps the GPE1 block (GPE %d to %d) - Ignoring GPE1", 1155 gpe_number_max, acpi_gbl_FADT.gpe1_base, 1156 acpi_gbl_FADT.gpe1_base + 1157 ((register_count1 * 1158 ACPI_GPE_REGISTER_WIDTH) - 1))); 1159 1160 /* Ignore GPE1 block by setting the register count to zero */ 1161 1162 register_count1 = 0; 1163 } else { 1164 /* Install GPE Block 1 */ 1165 1166 status = 1167 acpi_ev_create_gpe_block(acpi_gbl_fadt_gpe_device, 1168 &acpi_gbl_FADT.xgpe1_block, 1169 register_count1, 1170 acpi_gbl_FADT.gpe1_base, 1171 acpi_gbl_FADT. 1172 sci_interrupt, 1173 &acpi_gbl_gpe_fadt_blocks 1174 [1]); 1175 1176 if (ACPI_FAILURE(status)) { 1177 ACPI_EXCEPTION((AE_INFO, status, 1178 "Could not create GPE Block 1")); 1179 } 1180 1181 /* 1182 * GPE0 and GPE1 do not have to be contiguous in the GPE number 1183 * space. However, GPE0 always starts at GPE number zero. 1184 */ 1185 gpe_number_max = acpi_gbl_FADT.gpe1_base + 1186 ((register_count1 * ACPI_GPE_REGISTER_WIDTH) - 1); 1187 } 1188 } 1189 1190 /* Exit if there are no GPE registers */ 1191 1192 if ((register_count0 + register_count1) == 0) { 1193 1194 /* GPEs are not required by ACPI, this is OK */ 1195 1196 ACPI_DEBUG_PRINT((ACPI_DB_INIT, 1197 "There are no GPE blocks defined in the FADT\n")); 1198 status = AE_OK; 1199 goto cleanup; 1200 } 1201 1202 /* Check for Max GPE number out-of-range */ 1203 1204 if (gpe_number_max > ACPI_GPE_MAX) { 1205 ACPI_ERROR((AE_INFO, 1206 "Maximum GPE number from FADT is too large: 0x%X", 1207 gpe_number_max)); 1208 status = AE_BAD_VALUE; 1209 goto cleanup; 1210 } 1211 1212 cleanup: 1213 (void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE); 1214 return_ACPI_STATUS(AE_OK); 1215}