1/****************************************************************************** 2 * 3 * Module Name: evevent - Fixed and General Purpose AcpiEvent 4 * handling and dispatch |
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 { |
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 { |
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 { |
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 { |
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 { |
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 { |
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 { |
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 |
272AcpiEvFixedEventDetect (void) |
273{ 274 UINT32 IntStatus = INTERRUPT_NOT_HANDLED; 275 UINT32 StatusRegister; 276 UINT32 EnableRegister; 277 |
278 PROC_NAME ("AcpiEvFixedEventDetect"); 279 280 |
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 |
289 ACPI_DEBUG_PRINT ((ACPI_DB_INTERRUPTS, 290 "Fixed AcpiEvent Block: Enable %08X Status %08X\n", |
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 { |
465 ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, 466 "Could not allocate the GpeRegisters block\n")); |
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); |
481 ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Could not allocate the GpeInfo block\n")); |
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 |
557 ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "GPE registers: %X@%p (Blk0) %X@%p (Blk1)\n", |
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 |
622 ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, 623 "Unknown GPE method type: %s (name not of form _Lnn or _Enn)\n", |
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 |
635 ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, 636 "Could not extract GPE number from name: %s (name not of form _Lnn or _Enn)\n", |
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 |
665 ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Registered GPE method %s as GPE number %X\n", |
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 |
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 |
750 ACPI_DEBUG_PRINT ((ACPI_DB_INTERRUPTS, 751 "GPE block at %X - Enable %08X Status %08X\n", |
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 { |
885 ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Invalid GPE bit [%X].\n", GpeNumber)); |
886 return_VALUE (INTERRUPT_NOT_HANDLED); 887 } 888 889 /* 890 * Disable the GPE. 891 */ 892 AcpiHwDisableGpe (GpeNumber); 893 --- 67 unchanged lines hidden --- |