hwgpe.c (126372) | hwgpe.c (128212) |
---|---|
1 2/****************************************************************************** 3 * 4 * Module Name: hwgpe - Low level GPE enable/disable/clear functions | 1 2/****************************************************************************** 3 * 4 * Module Name: hwgpe - Low level GPE enable/disable/clear functions |
5 * $Revision: 56 $ | 5 * $Revision: 57 $ |
6 * 7 *****************************************************************************/ 8 9/****************************************************************************** 10 * 11 * 1. Copyright Notice 12 * 13 * Some or all of this work - Copyright (c) 1999 - 2004, Intel Corp. --- 107 unchanged lines hidden (view full) --- 121#define _COMPONENT ACPI_HARDWARE 122 ACPI_MODULE_NAME ("hwgpe") 123 124 125/****************************************************************************** 126 * 127 * FUNCTION: AcpiHwEnableGpe 128 * | 6 * 7 *****************************************************************************/ 8 9/****************************************************************************** 10 * 11 * 1. Copyright Notice 12 * 13 * Some or all of this work - Copyright (c) 1999 - 2004, Intel Corp. --- 107 unchanged lines hidden (view full) --- 121#define _COMPONENT ACPI_HARDWARE 122 ACPI_MODULE_NAME ("hwgpe") 123 124 125/****************************************************************************** 126 * 127 * FUNCTION: AcpiHwEnableGpe 128 * |
129 * PARAMETERS: GpeNumber - The GPE | 129 * PARAMETERS: GpeEventInfo - Info block for the GPE to be enabled |
130 * | 130 * |
131 * RETURN: None | 131 * RETURN: Status |
132 * 133 * DESCRIPTION: Enable a single GPE. 134 * 135 ******************************************************************************/ 136 137ACPI_STATUS 138AcpiHwEnableGpe ( 139 ACPI_GPE_EVENT_INFO *GpeEventInfo) --- 24 unchanged lines hidden (view full) --- 164 return (Status); 165} 166 167 168/****************************************************************************** 169 * 170 * FUNCTION: AcpiHwEnableGpeForWakeup 171 * | 132 * 133 * DESCRIPTION: Enable a single GPE. 134 * 135 ******************************************************************************/ 136 137ACPI_STATUS 138AcpiHwEnableGpe ( 139 ACPI_GPE_EVENT_INFO *GpeEventInfo) --- 24 unchanged lines hidden (view full) --- 164 return (Status); 165} 166 167 168/****************************************************************************** 169 * 170 * FUNCTION: AcpiHwEnableGpeForWakeup 171 * |
172 * PARAMETERS: GpeNumber - The GPE | 172 * PARAMETERS: GpeEventInfo - Info block for the GPE to be enabled |
173 * 174 * RETURN: None 175 * 176 * DESCRIPTION: Keep track of which GPEs the OS has requested not be 177 * disabled when going to sleep. 178 * 179 ******************************************************************************/ 180 --- 11 unchanged lines hidden (view full) --- 192 193 GpeRegisterInfo = GpeEventInfo->RegisterInfo; 194 if (!GpeRegisterInfo) 195 { 196 return; 197 } 198 199 /* | 173 * 174 * RETURN: None 175 * 176 * DESCRIPTION: Keep track of which GPEs the OS has requested not be 177 * disabled when going to sleep. 178 * 179 ******************************************************************************/ 180 --- 11 unchanged lines hidden (view full) --- 192 193 GpeRegisterInfo = GpeEventInfo->RegisterInfo; 194 if (!GpeRegisterInfo) 195 { 196 return; 197 } 198 199 /* |
200 * Set the bit so we will not disable this when sleeping | 200 * Set the bit so we will not enable this GPE when sleeping (and disable 201 * it upon wake) |
201 */ 202 GpeRegisterInfo->WakeEnable |= GpeEventInfo->BitMask; | 202 */ 203 GpeRegisterInfo->WakeEnable |= GpeEventInfo->BitMask; |
204 GpeEventInfo->Flags |= (ACPI_GPE_TYPE_WAKE | ACPI_GPE_ENABLED); |
|
203} 204 205 206/****************************************************************************** 207 * 208 * FUNCTION: AcpiHwDisableGpe 209 * | 205} 206 207 208/****************************************************************************** 209 * 210 * FUNCTION: AcpiHwDisableGpe 211 * |
210 * PARAMETERS: GpeNumber - The GPE | 212 * PARAMETERS: GpeEventInfo - Info block for the GPE to be disabled |
211 * | 213 * |
212 * RETURN: None | 214 * RETURN: Status |
213 * 214 * DESCRIPTION: Disable a single GPE. 215 * 216 ******************************************************************************/ 217 218ACPI_STATUS 219AcpiHwDisableGpe ( 220 ACPI_GPE_EVENT_INFO *GpeEventInfo) --- 29 unchanged lines hidden (view full) --- 250 251 Status = AcpiHwLowLevelWrite (8, (InByte & ~(GpeEventInfo->BitMask)), 252 &GpeRegisterInfo->EnableAddress); 253 if (ACPI_FAILURE (Status)) 254 { 255 return (Status); 256 } 257 | 215 * 216 * DESCRIPTION: Disable a single GPE. 217 * 218 ******************************************************************************/ 219 220ACPI_STATUS 221AcpiHwDisableGpe ( 222 ACPI_GPE_EVENT_INFO *GpeEventInfo) --- 29 unchanged lines hidden (view full) --- 252 253 Status = AcpiHwLowLevelWrite (8, (InByte & ~(GpeEventInfo->BitMask)), 254 &GpeRegisterInfo->EnableAddress); 255 if (ACPI_FAILURE (Status)) 256 { 257 return (Status); 258 } 259 |
260 /* Make sure this GPE is disabled for wake, also */ 261 |
|
258 AcpiHwDisableGpeForWakeup (GpeEventInfo); 259 return (AE_OK); 260} 261 262 263/****************************************************************************** 264 * 265 * FUNCTION: AcpiHwDisableGpeForWakeup 266 * | 262 AcpiHwDisableGpeForWakeup (GpeEventInfo); 263 return (AE_OK); 264} 265 266 267/****************************************************************************** 268 * 269 * FUNCTION: AcpiHwDisableGpeForWakeup 270 * |
267 * PARAMETERS: GpeNumber - The GPE | 271 * PARAMETERS: GpeEventInfo - Info block for the GPE to be disabled |
268 * 269 * RETURN: None 270 * 271 * DESCRIPTION: Keep track of which GPEs the OS has requested not be 272 * disabled when going to sleep. 273 * 274 ******************************************************************************/ 275 --- 10 unchanged lines hidden (view full) --- 286 /* Get the info block for the entire GPE register */ 287 288 GpeRegisterInfo = GpeEventInfo->RegisterInfo; 289 if (!GpeRegisterInfo) 290 { 291 return; 292 } 293 | 272 * 273 * RETURN: None 274 * 275 * DESCRIPTION: Keep track of which GPEs the OS has requested not be 276 * disabled when going to sleep. 277 * 278 ******************************************************************************/ 279 --- 10 unchanged lines hidden (view full) --- 290 /* Get the info block for the entire GPE register */ 291 292 GpeRegisterInfo = GpeEventInfo->RegisterInfo; 293 if (!GpeRegisterInfo) 294 { 295 return; 296 } 297 |
294 /* 295 * Clear the bit so we will disable this when sleeping 296 */ | 298 /* Clear the bit so we will disable this when sleeping */ 299 |
297 GpeRegisterInfo->WakeEnable &= ~(GpeEventInfo->BitMask); 298} 299 300 301/****************************************************************************** 302 * 303 * FUNCTION: AcpiHwClearGpe 304 * | 300 GpeRegisterInfo->WakeEnable &= ~(GpeEventInfo->BitMask); 301} 302 303 304/****************************************************************************** 305 * 306 * FUNCTION: AcpiHwClearGpe 307 * |
305 * PARAMETERS: GpeNumber - The GPE | 308 * PARAMETERS: GpeEventInfo - Info block for the GPE to be cleared |
306 * | 309 * |
307 * RETURN: None | 310 * RETURN: StatusStatus |
308 * | 311 * |
309 * DESCRIPTION: Clear a single GPE. | 312 * DESCRIPTION: Clear the status bit for a single GPE. |
310 * 311 ******************************************************************************/ 312 313ACPI_STATUS 314AcpiHwClearGpe ( 315 ACPI_GPE_EVENT_INFO *GpeEventInfo) 316{ 317 ACPI_STATUS Status; --- 12 unchanged lines hidden (view full) --- 330 return (Status); 331} 332 333 334/****************************************************************************** 335 * 336 * FUNCTION: AcpiHwGetGpeStatus 337 * | 313 * 314 ******************************************************************************/ 315 316ACPI_STATUS 317AcpiHwClearGpe ( 318 ACPI_GPE_EVENT_INFO *GpeEventInfo) 319{ 320 ACPI_STATUS Status; --- 12 unchanged lines hidden (view full) --- 333 return (Status); 334} 335 336 337/****************************************************************************** 338 * 339 * FUNCTION: AcpiHwGetGpeStatus 340 * |
338 * PARAMETERS: GpeNumber - The GPE | 341 * PARAMETERS: GpeEventInfo - Info block for the GPE to queried 342 * EventStatus - Where the GPE status is returned |
339 * | 343 * |
340 * RETURN: None | 344 * RETURN: Status |
341 * 342 * DESCRIPTION: Return the status of a single GPE. 343 * 344 ******************************************************************************/ 345 346ACPI_STATUS 347AcpiHwGetGpeStatus ( 348 ACPI_GPE_EVENT_INFO *GpeEventInfo, --- 109 unchanged lines hidden (view full) --- 458 * 459 * FUNCTION: AcpiHwClearGpeBlock 460 * 461 * PARAMETERS: GpeXruptInfo - GPE Interrupt info 462 * GpeBlock - Gpe Block info 463 * 464 * RETURN: Status 465 * | 345 * 346 * DESCRIPTION: Return the status of a single GPE. 347 * 348 ******************************************************************************/ 349 350ACPI_STATUS 351AcpiHwGetGpeStatus ( 352 ACPI_GPE_EVENT_INFO *GpeEventInfo, --- 109 unchanged lines hidden (view full) --- 462 * 463 * FUNCTION: AcpiHwClearGpeBlock 464 * 465 * PARAMETERS: GpeXruptInfo - GPE Interrupt info 466 * GpeBlock - Gpe Block info 467 * 468 * RETURN: Status 469 * |
466 * DESCRIPTION: Clear all GPEs within a GPE block | 470 * DESCRIPTION: Clear status bits for all GPEs within a GPE block |
467 * 468 ******************************************************************************/ 469 470ACPI_STATUS 471AcpiHwClearGpeBlock ( 472 ACPI_GPE_XRUPT_INFO *GpeXruptInfo, 473 ACPI_GPE_BLOCK_INFO *GpeBlock) 474{ 475 UINT32 i; 476 ACPI_STATUS Status; 477 478 479 /* Examine each GPE Register within the block */ 480 481 for (i = 0; i < GpeBlock->RegisterCount; i++) 482 { | 471 * 472 ******************************************************************************/ 473 474ACPI_STATUS 475AcpiHwClearGpeBlock ( 476 ACPI_GPE_XRUPT_INFO *GpeXruptInfo, 477 ACPI_GPE_BLOCK_INFO *GpeBlock) 478{ 479 UINT32 i; 480 ACPI_STATUS Status; 481 482 483 /* Examine each GPE Register within the block */ 484 485 for (i = 0; i < GpeBlock->RegisterCount; i++) 486 { |
483 /* Clear all GPEs in this register */ | 487 /* Clear status on all GPEs in this register */ |
484 485 Status = AcpiHwLowLevelWrite (8, 0xFF, 486 &GpeBlock->RegisterInfo[i].StatusAddress); 487 if (ACPI_FAILURE (Status)) 488 { 489 return (Status); 490 } 491 } 492 493 return (AE_OK); 494} 495 496 497/****************************************************************************** 498 * | 488 489 Status = AcpiHwLowLevelWrite (8, 0xFF, 490 &GpeBlock->RegisterInfo[i].StatusAddress); 491 if (ACPI_FAILURE (Status)) 492 { 493 return (Status); 494 } 495 } 496 497 return (AE_OK); 498} 499 500 501/****************************************************************************** 502 * |
499 * FUNCTION: AcpiHwDisableNonWakeupGpeBlock | 503 * FUNCTION: AcpiHwPrepareGpeBlockForSleep |
500 * 501 * PARAMETERS: GpeXruptInfo - GPE Interrupt info 502 * GpeBlock - Gpe Block info 503 * 504 * RETURN: Status 505 * | 504 * 505 * PARAMETERS: GpeXruptInfo - GPE Interrupt info 506 * GpeBlock - Gpe Block info 507 * 508 * RETURN: Status 509 * |
506 * DESCRIPTION: Disable all GPEs except wakeup GPEs in a GPE block | 510 * DESCRIPTION: Disable all runtime GPEs and enable all wakeup GPEs -- within 511 * a single GPE block |
507 * 508 ******************************************************************************/ 509 510static ACPI_STATUS | 512 * 513 ******************************************************************************/ 514 515static ACPI_STATUS |
511AcpiHwDisableNonWakeupGpeBlock ( | 516AcpiHwPrepareGpeBlockForSleep ( |
512 ACPI_GPE_XRUPT_INFO *GpeXruptInfo, 513 ACPI_GPE_BLOCK_INFO *GpeBlock) 514{ 515 UINT32 i; 516 ACPI_GPE_REGISTER_INFO *GpeRegisterInfo; 517 UINT32 InValue; 518 ACPI_STATUS Status; 519 520 521 /* Get the register info for the entire GPE block */ 522 523 GpeRegisterInfo = GpeBlock->RegisterInfo; 524 525 /* Examine each GPE Register within the block */ 526 527 for (i = 0; i < GpeBlock->RegisterCount; i++) 528 { 529 /* | 517 ACPI_GPE_XRUPT_INFO *GpeXruptInfo, 518 ACPI_GPE_BLOCK_INFO *GpeBlock) 519{ 520 UINT32 i; 521 ACPI_GPE_REGISTER_INFO *GpeRegisterInfo; 522 UINT32 InValue; 523 ACPI_STATUS Status; 524 525 526 /* Get the register info for the entire GPE block */ 527 528 GpeRegisterInfo = GpeBlock->RegisterInfo; 529 530 /* Examine each GPE Register within the block */ 531 532 for (i = 0; i < GpeBlock->RegisterCount; i++) 533 { 534 /* |
530 * Read the enabled status of all GPEs. We | 535 * Read the enabled/disabled status of all GPEs. We |
531 * will be using it to restore all the GPEs later. | 536 * will be using it to restore all the GPEs later. |
537 * 538 * NOTE: Wake GPEs are are ALL disabled at this time, so when we wake 539 * and restore this register, they will be automatically disabled. |
|
532 */ 533 Status = AcpiHwLowLevelRead (8, &InValue, 534 &GpeRegisterInfo->EnableAddress); 535 if (ACPI_FAILURE (Status)) 536 { 537 return (Status); 538 } 539 540 GpeRegisterInfo->Enable = (UINT8) InValue; 541 542 /* | 540 */ 541 Status = AcpiHwLowLevelRead (8, &InValue, 542 &GpeRegisterInfo->EnableAddress); 543 if (ACPI_FAILURE (Status)) 544 { 545 return (Status); 546 } 547 548 GpeRegisterInfo->Enable = (UINT8) InValue; 549 550 /* |
543 * Disable all GPEs except wakeup GPEs. | 551 * 1) Disable all runtime GPEs 552 * 2) Enable all wakeup GPEs |
544 */ 545 Status = AcpiHwLowLevelWrite (8, GpeRegisterInfo->WakeEnable, 546 &GpeRegisterInfo->EnableAddress); 547 if (ACPI_FAILURE (Status)) 548 { 549 return (Status); 550 } 551 | 553 */ 554 Status = AcpiHwLowLevelWrite (8, GpeRegisterInfo->WakeEnable, 555 &GpeRegisterInfo->EnableAddress); 556 if (ACPI_FAILURE (Status)) 557 { 558 return (Status); 559 } 560 |
561 /* Point to next GPE register */ 562 |
|
552 GpeRegisterInfo++; 553 } 554 555 return (AE_OK); 556} 557 558 559/****************************************************************************** 560 * | 563 GpeRegisterInfo++; 564 } 565 566 return (AE_OK); 567} 568 569 570/****************************************************************************** 571 * |
561 * FUNCTION: AcpiHwDisableNonWakeupGpes | 572 * FUNCTION: AcpiHwPrepareGpesForSleep |
562 * 563 * PARAMETERS: None 564 * | 573 * 574 * PARAMETERS: None 575 * |
565 * RETURN: None | 576 * RETURN: Status |
566 * | 577 * |
567 * DESCRIPTION: Disable all non-wakeup GPEs | 578 * DESCRIPTION: Disable all runtime GPEs, enable all wake GPEs. |
568 * Called with interrupts disabled. The interrupt handler also 569 * modifies GpeRegisterInfo->Enable, so it should not be | 579 * Called with interrupts disabled. The interrupt handler also 580 * modifies GpeRegisterInfo->Enable, so it should not be |
570 * given the chance to run until after non-wake GPEs are | 581 * given the chance to run until after the runtime GPEs are |
571 * re-enabled. 572 * 573 ******************************************************************************/ 574 575ACPI_STATUS | 582 * re-enabled. 583 * 584 ******************************************************************************/ 585 586ACPI_STATUS |
576AcpiHwDisableNonWakeupGpes ( | 587AcpiHwPrepareGpesForSleep ( |
577 void) 578{ 579 ACPI_STATUS Status; 580 581 582 ACPI_FUNCTION_ENTRY (); 583 584 | 588 void) 589{ 590 ACPI_STATUS Status; 591 592 593 ACPI_FUNCTION_ENTRY (); 594 595 |
585 Status = AcpiEvWalkGpeList (AcpiHwDisableNonWakeupGpeBlock); 586 | 596 Status = AcpiEvWalkGpeList (AcpiHwPrepareGpeBlockForSleep); |
587 return (Status); 588} 589 590 591/****************************************************************************** 592 * | 597 return (Status); 598} 599 600 601/****************************************************************************** 602 * |
593 * FUNCTION: AcpiHwEnableNonWakeupGpeBlock | 603 * FUNCTION: AcpiHwRestoreGpeBlockOnWake |
594 * 595 * PARAMETERS: GpeXruptInfo - GPE Interrupt info 596 * GpeBlock - Gpe Block info 597 * 598 * RETURN: Status 599 * | 604 * 605 * PARAMETERS: GpeXruptInfo - GPE Interrupt info 606 * GpeBlock - Gpe Block info 607 * 608 * RETURN: Status 609 * |
600 * DESCRIPTION: Enable a single GPE. | 610 * DESCRIPTION: Enable all runtime GPEs and disable all wake GPEs -- in one 611 * GPE block |
601 * 602 ******************************************************************************/ 603 604static ACPI_STATUS | 612 * 613 ******************************************************************************/ 614 615static ACPI_STATUS |
605AcpiHwEnableNonWakeupGpeBlock ( | 616AcpiHwRestoreGpeBlockOnWake ( |
606 ACPI_GPE_XRUPT_INFO *GpeXruptInfo, 607 ACPI_GPE_BLOCK_INFO *GpeBlock) 608{ 609 UINT32 i; 610 ACPI_GPE_REGISTER_INFO *GpeRegisterInfo; 611 ACPI_STATUS Status; 612 613 --- 12 unchanged lines hidden (view full) --- 626 Status = AcpiHwLowLevelWrite (8, 0xFF, 627 &GpeBlock->RegisterInfo[i].StatusAddress); 628 if (ACPI_FAILURE (Status)) 629 { 630 return (Status); 631 } 632 633 /* | 617 ACPI_GPE_XRUPT_INFO *GpeXruptInfo, 618 ACPI_GPE_BLOCK_INFO *GpeBlock) 619{ 620 UINT32 i; 621 ACPI_GPE_REGISTER_INFO *GpeRegisterInfo; 622 ACPI_STATUS Status; 623 624 --- 12 unchanged lines hidden (view full) --- 637 Status = AcpiHwLowLevelWrite (8, 0xFF, 638 &GpeBlock->RegisterInfo[i].StatusAddress); 639 if (ACPI_FAILURE (Status)) 640 { 641 return (Status); 642 } 643 644 /* |
634 * We previously stored the enabled status of all GPEs. 635 * Blast them back in. | 645 * Restore the GPE Enable register, which will do the following: 646 * 647 * 1) Disable all wakeup GPEs 648 * 2) Enable all runtime GPEs 649 * 650 * (On sleep, we saved the enabled status of all GPEs) |
636 */ 637 Status = AcpiHwLowLevelWrite (8, GpeRegisterInfo->Enable, 638 &GpeRegisterInfo->EnableAddress); 639 if (ACPI_FAILURE (Status)) 640 { 641 return (Status); 642 } 643 | 651 */ 652 Status = AcpiHwLowLevelWrite (8, GpeRegisterInfo->Enable, 653 &GpeRegisterInfo->EnableAddress); 654 if (ACPI_FAILURE (Status)) 655 { 656 return (Status); 657 } 658 |
659 /* Point to next GPE register */ 660 |
|
644 GpeRegisterInfo++; 645 } 646 | 661 GpeRegisterInfo++; 662 } 663 |
647 | |
648 return (AE_OK); 649} 650 651 652/****************************************************************************** 653 * | 664 return (AE_OK); 665} 666 667 668/****************************************************************************** 669 * |
654 * FUNCTION: AcpiHwEnableNonWakeupGpes | 670 * FUNCTION: AcpiHwRestoreGpesOnWake |
655 * 656 * PARAMETERS: None 657 * | 671 * 672 * PARAMETERS: None 673 * |
658 * RETURN: None | 674 * RETURN: Status |
659 * | 675 * |
660 * DESCRIPTION: Enable all non-wakeup GPEs we previously enabled. | 676 * DESCRIPTION: Enable all runtime GPEs and disable all wake GPEs -- in all 677 * GPE blocks |
661 * 662 ******************************************************************************/ 663 664ACPI_STATUS | 678 * 679 ******************************************************************************/ 680 681ACPI_STATUS |
665AcpiHwEnableNonWakeupGpes ( | 682AcpiHwRestoreGpesOnWake ( |
666 void) 667{ 668 ACPI_STATUS Status; 669 670 671 ACPI_FUNCTION_ENTRY (); 672 673 | 683 void) 684{ 685 ACPI_STATUS Status; 686 687 688 ACPI_FUNCTION_ENTRY (); 689 690 |
674 Status = AcpiEvWalkGpeList (AcpiHwEnableNonWakeupGpeBlock); 675 | 691 Status = AcpiEvWalkGpeList (AcpiHwRestoreGpeBlockOnWake); |
676 return (Status); 677} | 692 return (Status); 693} |