evevent.c (80062) | evevent.c (82367) |
---|---|
1/****************************************************************************** 2 * 3 * Module Name: evevent - Fixed and General Purpose AcpiEvent 4 * handling and dispatch | 1/****************************************************************************** 2 * 3 * Module Name: evevent - Fixed and General Purpose AcpiEvent 4 * handling and dispatch |
5 * $Revision: 46 $ | 5 * $Revision: 47 $ |
6 * 7 *****************************************************************************/ 8 9/****************************************************************************** 10 * 11 * 1. Copyright Notice 12 * 13 * Some or all of this work - Copyright (c) 1999, 2000, 2001, Intel Corp. --- 133 unchanged lines hidden (view full) --- 147 148 FUNCTION_TRACE ("EvInitialize"); 149 150 151 /* Make sure we have ACPI tables */ 152 153 if (!AcpiGbl_DSDT) 154 { | 6 * 7 *****************************************************************************/ 8 9/****************************************************************************** 10 * 11 * 1. Copyright Notice 12 * 13 * Some or all of this work - Copyright (c) 1999, 2000, 2001, Intel Corp. --- 133 unchanged lines hidden (view full) --- 147 148 FUNCTION_TRACE ("EvInitialize"); 149 150 151 /* Make sure we have ACPI tables */ 152 153 if (!AcpiGbl_DSDT) 154 { |
155 DEBUG_PRINTP (ACPI_WARN, ("No ACPI tables present!\n")); | 155 ACPI_DEBUG_PRINT ((ACPI_DB_WARN, "No ACPI tables present!\n")); |
156 return_ACPI_STATUS (AE_NO_ACPI_TABLES); 157 } 158 159 160 /* Make sure the BIOS supports ACPI mode */ 161 162 if (SYS_MODE_LEGACY == AcpiHwGetModeCapabilities()) 163 { | 156 return_ACPI_STATUS (AE_NO_ACPI_TABLES); 157 } 158 159 160 /* Make sure the BIOS supports ACPI mode */ 161 162 if (SYS_MODE_LEGACY == AcpiHwGetModeCapabilities()) 163 { |
164 DEBUG_PRINTP (ACPI_WARN, ("ACPI Mode is not supported!\n")); | 164 ACPI_DEBUG_PRINT ((ACPI_DB_WARN, "ACPI Mode is not supported!\n")); |
165 return_ACPI_STATUS (AE_ERROR); 166 } 167 168 169 AcpiGbl_OriginalMode = AcpiHwGetMode(); 170 171 /* 172 * Initialize the Fixed and General Purpose AcpiEvents prior. This is 173 * done prior to enabling SCIs to prevent interrupts from occuring 174 * before handers are installed. 175 */ 176 177 Status = AcpiEvFixedEventInitialize (); 178 if (ACPI_FAILURE (Status)) 179 { | 165 return_ACPI_STATUS (AE_ERROR); 166 } 167 168 169 AcpiGbl_OriginalMode = AcpiHwGetMode(); 170 171 /* 172 * Initialize the Fixed and General Purpose AcpiEvents prior. This is 173 * done prior to enabling SCIs to prevent interrupts from occuring 174 * before handers are installed. 175 */ 176 177 Status = AcpiEvFixedEventInitialize (); 178 if (ACPI_FAILURE (Status)) 179 { |
180 DEBUG_PRINTP (ACPI_FATAL, ("Unable to initialize fixed events.\n")); | 180 ACPI_DEBUG_PRINT ((ACPI_DB_FATAL, "Unable to initialize fixed events.\n")); |
181 return_ACPI_STATUS (Status); 182 } 183 184 Status = AcpiEvGpeInitialize (); 185 if (ACPI_FAILURE (Status)) 186 { | 181 return_ACPI_STATUS (Status); 182 } 183 184 Status = AcpiEvGpeInitialize (); 185 if (ACPI_FAILURE (Status)) 186 { |
187 DEBUG_PRINTP (ACPI_FATAL, ("Unable to initialize general purpose events.\n")); | 187 ACPI_DEBUG_PRINT ((ACPI_DB_FATAL, "Unable to initialize general purpose events.\n")); |
188 return_ACPI_STATUS (Status); 189 } 190 191 /* Install the SCI handler */ 192 193 Status = AcpiEvInstallSciHandler (); 194 if (ACPI_FAILURE (Status)) 195 { | 188 return_ACPI_STATUS (Status); 189 } 190 191 /* Install the SCI handler */ 192 193 Status = AcpiEvInstallSciHandler (); 194 if (ACPI_FAILURE (Status)) 195 { |
196 DEBUG_PRINTP (ACPI_FATAL, ("Unable to install System Control Interrupt Handler\n")); | 196 ACPI_DEBUG_PRINT ((ACPI_DB_FATAL, "Unable to install System Control Interrupt Handler\n")); |
197 return_ACPI_STATUS (Status); 198 } 199 200 201 /* Install handlers for control method GPE handlers (_Lxx, _Exx) */ 202 203 Status = AcpiEvInitGpeControlMethods (); 204 if (ACPI_FAILURE (Status)) 205 { | 197 return_ACPI_STATUS (Status); 198 } 199 200 201 /* Install handlers for control method GPE handlers (_Lxx, _Exx) */ 202 203 Status = AcpiEvInitGpeControlMethods (); 204 if (ACPI_FAILURE (Status)) 205 { |
206 DEBUG_PRINTP (ACPI_FATAL, ("Unable to initialize Gpe control methods\n")); | 206 ACPI_DEBUG_PRINT ((ACPI_DB_FATAL, "Unable to initialize Gpe control methods\n")); |
207 return_ACPI_STATUS (Status); 208 } 209 210 /* Install the handler for the Global Lock */ 211 212 Status = AcpiEvInitGlobalLockHandler (); 213 if (ACPI_FAILURE (Status)) 214 { | 207 return_ACPI_STATUS (Status); 208 } 209 210 /* Install the handler for the Global Lock */ 211 212 Status = AcpiEvInitGlobalLockHandler (); 213 if (ACPI_FAILURE (Status)) 214 { |
215 DEBUG_PRINTP (ACPI_FATAL, ("Unable to initialize Global Lock handler\n")); | 215 ACPI_DEBUG_PRINT ((ACPI_DB_FATAL, "Unable to initialize Global Lock handler\n")); |
216 return_ACPI_STATUS (Status); 217 } 218 219 220 return_ACPI_STATUS (Status); 221} 222 223 --- 40 unchanged lines hidden (view full) --- 264 * 265 * RETURN: INTERRUPT_HANDLED or INTERRUPT_NOT_HANDLED 266 * 267 * DESCRIPTION: Checks the PM status register for fixed events 268 * 269 ******************************************************************************/ 270 271UINT32 | 216 return_ACPI_STATUS (Status); 217 } 218 219 220 return_ACPI_STATUS (Status); 221} 222 223 --- 40 unchanged lines hidden (view full) --- 264 * 265 * RETURN: INTERRUPT_HANDLED or INTERRUPT_NOT_HANDLED 266 * 267 * DESCRIPTION: Checks the PM status register for fixed events 268 * 269 ******************************************************************************/ 270 271UINT32 |
272AcpiEvFixedEventDetect(void) | 272AcpiEvFixedEventDetect (void) |
273{ 274 UINT32 IntStatus = INTERRUPT_NOT_HANDLED; 275 UINT32 StatusRegister; 276 UINT32 EnableRegister; 277 | 273{ 274 UINT32 IntStatus = INTERRUPT_NOT_HANDLED; 275 UINT32 StatusRegister; 276 UINT32 EnableRegister; 277 |
278 PROC_NAME ("AcpiEvFixedEventDetect"); 279 280 |
|
278 /* 279 * Read the fixed feature status and enable registers, as all the cases 280 * depend on their values. 281 */ 282 283 StatusRegister = AcpiHwRegisterRead (ACPI_MTX_DO_NOT_LOCK, PM1_STS); 284 EnableRegister = AcpiHwRegisterRead (ACPI_MTX_DO_NOT_LOCK, PM1_EN); 285 | 281 /* 282 * Read the fixed feature status and enable registers, as all the cases 283 * depend on their values. 284 */ 285 286 StatusRegister = AcpiHwRegisterRead (ACPI_MTX_DO_NOT_LOCK, PM1_STS); 287 EnableRegister = AcpiHwRegisterRead (ACPI_MTX_DO_NOT_LOCK, PM1_EN); 288 |
286 DEBUG_PRINT (TRACE_INTERRUPTS, 287 ("Fixed AcpiEvent Block: Enable %08X Status %08X\n", | 289 ACPI_DEBUG_PRINT ((ACPI_DB_INTERRUPTS, 290 "Fixed AcpiEvent Block: Enable %08X Status %08X\n", |
288 EnableRegister, StatusRegister)); 289 290 291 /* power management timer roll over */ 292 293 if ((StatusRegister & ACPI_STATUS_PMTIMER) && 294 (EnableRegister & ACPI_ENABLE_PMTIMER)) 295 { --- 158 unchanged lines hidden (view full) --- 454 /* 455 * Allocate the Gpe information block 456 */ 457 458 AcpiGbl_GpeRegisters = ACPI_MEM_CALLOCATE (AcpiGbl_GpeRegisterCount * 459 sizeof (ACPI_GPE_REGISTERS)); 460 if (!AcpiGbl_GpeRegisters) 461 { | 291 EnableRegister, StatusRegister)); 292 293 294 /* power management timer roll over */ 295 296 if ((StatusRegister & ACPI_STATUS_PMTIMER) && 297 (EnableRegister & ACPI_ENABLE_PMTIMER)) 298 { --- 158 unchanged lines hidden (view full) --- 457 /* 458 * Allocate the Gpe information block 459 */ 460 461 AcpiGbl_GpeRegisters = ACPI_MEM_CALLOCATE (AcpiGbl_GpeRegisterCount * 462 sizeof (ACPI_GPE_REGISTERS)); 463 if (!AcpiGbl_GpeRegisters) 464 { |
462 DEBUG_PRINTP (ACPI_ERROR, 463 ("Could not allocate the GpeRegisters block\n")); | 465 ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, 466 "Could not allocate the GpeRegisters block\n")); |
464 return_ACPI_STATUS (AE_NO_MEMORY); 465 } 466 467 /* 468 * Allocate the Gpe dispatch handler block 469 * There are eight distinct GP events per register. 470 * Initialization to zeros is sufficient 471 */ 472 473 AcpiGbl_GpeInfo = ACPI_MEM_CALLOCATE (MUL_8 (AcpiGbl_GpeRegisterCount) * 474 sizeof (ACPI_GPE_LEVEL_INFO)); 475 if (!AcpiGbl_GpeInfo) 476 { 477 ACPI_MEM_FREE (AcpiGbl_GpeRegisters); | 467 return_ACPI_STATUS (AE_NO_MEMORY); 468 } 469 470 /* 471 * Allocate the Gpe dispatch handler block 472 * There are eight distinct GP events per register. 473 * Initialization to zeros is sufficient 474 */ 475 476 AcpiGbl_GpeInfo = ACPI_MEM_CALLOCATE (MUL_8 (AcpiGbl_GpeRegisterCount) * 477 sizeof (ACPI_GPE_LEVEL_INFO)); 478 if (!AcpiGbl_GpeInfo) 479 { 480 ACPI_MEM_FREE (AcpiGbl_GpeRegisters); |
478 DEBUG_PRINTP (ACPI_ERROR, ("Could not allocate the GpeInfo block\n")); | 481 ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Could not allocate the GpeInfo block\n")); |
479 return_ACPI_STATUS (AE_NO_MEMORY); 480 } 481 482 /* Set the Gpe validation table to GPE_INVALID */ 483 484 MEMSET (AcpiGbl_GpeValid, (int) ACPI_GPE_INVALID, ACPI_NUM_GPE); 485 486 /* --- 59 unchanged lines hidden (view full) --- 546 * by writing a '0'. 547 */ 548 AcpiOsWritePort (AcpiGbl_GpeRegisters[RegisterIndex].EnableAddr, 0x00, 8); 549 AcpiOsWritePort (AcpiGbl_GpeRegisters[RegisterIndex].StatusAddr, 0xFF, 8); 550 551 RegisterIndex++; 552 } 553 | 482 return_ACPI_STATUS (AE_NO_MEMORY); 483 } 484 485 /* Set the Gpe validation table to GPE_INVALID */ 486 487 MEMSET (AcpiGbl_GpeValid, (int) ACPI_GPE_INVALID, ACPI_NUM_GPE); 488 489 /* --- 59 unchanged lines hidden (view full) --- 549 * by writing a '0'. 550 */ 551 AcpiOsWritePort (AcpiGbl_GpeRegisters[RegisterIndex].EnableAddr, 0x00, 8); 552 AcpiOsWritePort (AcpiGbl_GpeRegisters[RegisterIndex].StatusAddr, 0xFF, 8); 553 554 RegisterIndex++; 555 } 556 |
554 DEBUG_PRINTP (ACPI_INFO, ("GPE registers: %X@%p (Blk0) %X@%p (Blk1)\n", | 557 ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "GPE registers: %X@%p (Blk0) %X@%p (Blk1)\n", |
555 Gpe0RegisterCount, AcpiGbl_FADT->XGpe0Blk.Address, Gpe1RegisterCount, 556 AcpiGbl_FADT->XGpe1Blk.Address)); 557 558 return_ACPI_STATUS (AE_OK); 559} 560 561 562/******************************************************************************* --- 48 unchanged lines hidden (view full) --- 611 else if (Name[1] == 'E') 612 { 613 Type = ACPI_EVENT_EDGE_TRIGGERED; 614 } 615 else 616 { 617 /* Unknown method type, just ignore it! */ 618 | 558 Gpe0RegisterCount, AcpiGbl_FADT->XGpe0Blk.Address, Gpe1RegisterCount, 559 AcpiGbl_FADT->XGpe1Blk.Address)); 560 561 return_ACPI_STATUS (AE_OK); 562} 563 564 565/******************************************************************************* --- 48 unchanged lines hidden (view full) --- 614 else if (Name[1] == 'E') 615 { 616 Type = ACPI_EVENT_EDGE_TRIGGERED; 617 } 618 else 619 { 620 /* Unknown method type, just ignore it! */ 621 |
619 DEBUG_PRINTP (ACPI_ERROR, 620 ("Unknown GPE method type: %s (name not of form _Lnn or _Enn)\n", | 622 ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, 623 "Unknown GPE method type: %s (name not of form _Lnn or _Enn)\n", |
621 Name)); 622 return (AE_OK); 623 } 624 625 /* Convert the last two characters of the name to the Gpe Number */ 626 627 GpeNumber = STRTOUL (&Name[2], NULL, 16); 628 if (GpeNumber == ACPI_UINT32_MAX) 629 { 630 /* Conversion failed; invalid method, just ignore it */ 631 | 624 Name)); 625 return (AE_OK); 626 } 627 628 /* Convert the last two characters of the name to the Gpe Number */ 629 630 GpeNumber = STRTOUL (&Name[2], NULL, 16); 631 if (GpeNumber == ACPI_UINT32_MAX) 632 { 633 /* Conversion failed; invalid method, just ignore it */ 634 |
632 DEBUG_PRINTP (ACPI_ERROR, 633 ("Could not extract GPE number from name: %s (name not of form _Lnn or _Enn)\n", | 635 ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, 636 "Could not extract GPE number from name: %s (name not of form _Lnn or _Enn)\n", |
634 Name)); 635 return (AE_OK); 636 } 637 638 /* Ensure that we have a valid GPE number */ 639 640 if (AcpiGbl_GpeValid[GpeNumber] == ACPI_GPE_INVALID) 641 { --- 12 unchanged lines hidden (view full) --- 654 655 656 /* 657 * Enable the GPE (SCIs should be disabled at this point) 658 */ 659 660 AcpiHwEnableGpe (GpeNumber); 661 | 637 Name)); 638 return (AE_OK); 639 } 640 641 /* Ensure that we have a valid GPE number */ 642 643 if (AcpiGbl_GpeValid[GpeNumber] == ACPI_GPE_INVALID) 644 { --- 12 unchanged lines hidden (view full) --- 657 658 659 /* 660 * Enable the GPE (SCIs should be disabled at this point) 661 */ 662 663 AcpiHwEnableGpe (GpeNumber); 664 |
662 DEBUG_PRINTP (ACPI_INFO, ("Registered GPE method %s as GPE number %X\n", | 665 ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Registered GPE method %s as GPE number %X\n", |
663 Name, GpeNumber)); 664 return (AE_OK); 665} 666 667 668/******************************************************************************* 669 * 670 * FUNCTION: AcpiEvInitGpeControlMethods --- 52 unchanged lines hidden (view full) --- 723{ 724 UINT32 IntStatus = INTERRUPT_NOT_HANDLED; 725 UINT32 i; 726 UINT32 j; 727 UINT8 EnabledStatusByte; 728 UINT8 BitMask; 729 730 | 666 Name, GpeNumber)); 667 return (AE_OK); 668} 669 670 671/******************************************************************************* 672 * 673 * FUNCTION: AcpiEvInitGpeControlMethods --- 52 unchanged lines hidden (view full) --- 726{ 727 UINT32 IntStatus = INTERRUPT_NOT_HANDLED; 728 UINT32 i; 729 UINT32 j; 730 UINT8 EnabledStatusByte; 731 UINT8 BitMask; 732 733 |
734 PROC_NAME ("EvGpeDetect"); 735 736 |
|
731 /* 732 * Read all of the 8-bit GPE status and enable registers 733 * in both of the register blocks, saving all of it. 734 * Find all currently active GP events. 735 */ 736 for (i = 0; i < AcpiGbl_GpeRegisterCount; i++) 737 { 738 AcpiOsReadPort (AcpiGbl_GpeRegisters[i].StatusAddr, 739 &AcpiGbl_GpeRegisters[i].Status, 8); 740 741 AcpiOsReadPort (AcpiGbl_GpeRegisters[i].EnableAddr, 742 &AcpiGbl_GpeRegisters[i].Enable, 8); 743 | 737 /* 738 * Read all of the 8-bit GPE status and enable registers 739 * in both of the register blocks, saving all of it. 740 * Find all currently active GP events. 741 */ 742 for (i = 0; i < AcpiGbl_GpeRegisterCount; i++) 743 { 744 AcpiOsReadPort (AcpiGbl_GpeRegisters[i].StatusAddr, 745 &AcpiGbl_GpeRegisters[i].Status, 8); 746 747 AcpiOsReadPort (AcpiGbl_GpeRegisters[i].EnableAddr, 748 &AcpiGbl_GpeRegisters[i].Enable, 8); 749 |
744 DEBUG_PRINT (TRACE_INTERRUPTS, 745 ("GPE block at %X - Enable %08X Status %08X\n", | 750 ACPI_DEBUG_PRINT ((ACPI_DB_INTERRUPTS, 751 "GPE block at %X - Enable %08X Status %08X\n", |
746 AcpiGbl_GpeRegisters[i].EnableAddr, 747 AcpiGbl_GpeRegisters[i].Status, 748 AcpiGbl_GpeRegisters[i].Enable)); 749 750 /* First check if there is anything active at all in this register */ 751 752 EnabledStatusByte = (UINT8) (AcpiGbl_GpeRegisters[i].Status & 753 AcpiGbl_GpeRegisters[i].Enable); --- 117 unchanged lines hidden (view full) --- 871 FUNCTION_TRACE ("EvGpeDispatch"); 872 873 874 /* 875 * Valid GPE number? 876 */ 877 if (AcpiGbl_GpeValid[GpeNumber] == ACPI_GPE_INVALID) 878 { | 752 AcpiGbl_GpeRegisters[i].EnableAddr, 753 AcpiGbl_GpeRegisters[i].Status, 754 AcpiGbl_GpeRegisters[i].Enable)); 755 756 /* First check if there is anything active at all in this register */ 757 758 EnabledStatusByte = (UINT8) (AcpiGbl_GpeRegisters[i].Status & 759 AcpiGbl_GpeRegisters[i].Enable); --- 117 unchanged lines hidden (view full) --- 877 FUNCTION_TRACE ("EvGpeDispatch"); 878 879 880 /* 881 * Valid GPE number? 882 */ 883 if (AcpiGbl_GpeValid[GpeNumber] == ACPI_GPE_INVALID) 884 { |
879 DEBUG_PRINTP (ACPI_ERROR, ("Invalid GPE bit [%X].\n", GpeNumber)); | 885 ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Invalid GPE bit [%X].\n", GpeNumber)); |
880 return_VALUE (INTERRUPT_NOT_HANDLED); 881 } 882 883 /* 884 * Disable the GPE. 885 */ 886 AcpiHwDisableGpe (GpeNumber); 887 --- 67 unchanged lines hidden --- | 886 return_VALUE (INTERRUPT_NOT_HANDLED); 887 } 888 889 /* 890 * Disable the GPE. 891 */ 892 AcpiHwDisableGpe (GpeNumber); 893 --- 67 unchanged lines hidden --- |