Deleted Added
full compact
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}