diff options
Diffstat (limited to 'sys/contrib/dev/acpica/evevent.c')
-rw-r--r-- | sys/contrib/dev/acpica/evevent.c | 80 |
1 files changed, 50 insertions, 30 deletions
diff --git a/sys/contrib/dev/acpica/evevent.c b/sys/contrib/dev/acpica/evevent.c index 32af556..fe4bc56 100644 --- a/sys/contrib/dev/acpica/evevent.c +++ b/sys/contrib/dev/acpica/evevent.c @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: evevent - Fixed and General Purpose Even handling and dispatch - * $Revision: 92 $ + * $Revision: 96 $ * *****************************************************************************/ @@ -446,44 +446,63 @@ AcpiEvGpeInitialize (void) AcpiGbl_GpeBlockInfo[0].BlockBaseNumber = 0; AcpiGbl_GpeBlockInfo[1].BlockBaseNumber = AcpiGbl_FADT->Gpe1Base; + /* Warn and exit if there are no GPE registers */ + AcpiGbl_GpeRegisterCount = AcpiGbl_GpeBlockInfo[0].RegisterCount + AcpiGbl_GpeBlockInfo[1].RegisterCount; if (!AcpiGbl_GpeRegisterCount) { - ACPI_REPORT_WARNING (("Zero GPEs are defined in the FADT\n")); + ACPI_REPORT_WARNING (("There are no GPE blocks defined in the FADT\n")); return_ACPI_STATUS (AE_OK); } - /* Determine the maximum GPE number for this machine */ + /* + * Determine the maximum GPE number for this machine. + * Note: both GPE0 and GPE1 are optional, and either can exist without + * the other + */ + if (AcpiGbl_GpeBlockInfo[0].RegisterCount) + { + /* GPE block 0 exists */ - AcpiGbl_GpeNumberMax = ACPI_MUL_8 (AcpiGbl_GpeBlockInfo[0].RegisterCount) - 1; + AcpiGbl_GpeNumberMax = ACPI_MUL_8 (AcpiGbl_GpeBlockInfo[0].RegisterCount) - 1; + } if (AcpiGbl_GpeBlockInfo[1].RegisterCount) { - /* Check for GPE0/GPE1 overlap */ + /* GPE block 1 exists */ + + /* Check for GPE0/GPE1 overlap (if both banks exist) */ - if (AcpiGbl_GpeNumberMax >= AcpiGbl_FADT->Gpe1Base) + if ((AcpiGbl_GpeBlockInfo[0].RegisterCount) && + (AcpiGbl_GpeNumberMax >= AcpiGbl_FADT->Gpe1Base)) { - ACPI_REPORT_ERROR (("GPE0 block overlaps the GPE1 block\n")); + ACPI_REPORT_ERROR (( + "GPE0 block (GPE 0 to %d) overlaps the GPE1 block (GPE %d to %d)\n", + AcpiGbl_GpeNumberMax, AcpiGbl_FADT->Gpe1Base, + AcpiGbl_FADT->Gpe1Base + (ACPI_MUL_8 (AcpiGbl_GpeBlockInfo[1].RegisterCount) - 1))); return_ACPI_STATUS (AE_BAD_VALUE); } - /* GPE0 and GPE1 do not have to be contiguous in the GPE number space */ - - AcpiGbl_GpeNumberMax = AcpiGbl_FADT->Gpe1Base + (ACPI_MUL_8 (AcpiGbl_GpeBlockInfo[1].RegisterCount) - 1); + /* + * GPE0 and GPE1 do not have to be contiguous in the GPE number space, + * But, GPE0 always starts at zero. + */ + AcpiGbl_GpeNumberMax = AcpiGbl_FADT->Gpe1Base + + (ACPI_MUL_8 (AcpiGbl_GpeBlockInfo[1].RegisterCount) - 1); } /* Check for Max GPE number out-of-range */ if (AcpiGbl_GpeNumberMax > ACPI_GPE_MAX) { - ACPI_REPORT_ERROR (("Maximum GPE number from FADT is too large: 0x%X\n", AcpiGbl_GpeNumberMax)); + ACPI_REPORT_ERROR (("Maximum GPE number from FADT is too large: 0x%X\n", + AcpiGbl_GpeNumberMax)); return_ACPI_STATUS (AE_BAD_VALUE); } - /* - * Allocate the GPE number-to-index translation table - */ + /* Allocate the GPE number-to-index translation table */ + AcpiGbl_GpeNumberToIndex = ACPI_MEM_CALLOCATE ( sizeof (ACPI_GPE_INDEX_INFO) * ((ACPI_SIZE) AcpiGbl_GpeNumberMax + 1)); @@ -499,9 +518,8 @@ AcpiEvGpeInitialize (void) ACPI_MEMSET (AcpiGbl_GpeNumberToIndex, (int) ACPI_GPE_INVALID, sizeof (ACPI_GPE_INDEX_INFO) * ((ACPI_SIZE) AcpiGbl_GpeNumberMax + 1)); - /* - * Allocate the GPE register information block - */ + /* Allocate the GPE register information block */ + AcpiGbl_GpeRegisterInfo = ACPI_MEM_CALLOCATE ( (ACPI_SIZE) AcpiGbl_GpeRegisterCount * sizeof (ACPI_GPE_REGISTER_INFO)); @@ -578,7 +596,6 @@ AcpiEvGpeInitialize (void) * are cleared by writing a '1', while enable registers are cleared * by writing a '0'. */ - Status = AcpiHwLowLevelWrite (8, 0x00, &GpeRegisterInfo->EnableAddress, 0); if (ACPI_FAILURE (Status)) { @@ -594,16 +611,19 @@ AcpiEvGpeInitialize (void) GpeRegister++; } - ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "GPE Block%d: %X registers at %8.8X%8.8X\n", - (INT32) GpeBlock, AcpiGbl_GpeBlockInfo[0].RegisterCount, - ACPI_HIDWORD (ACPI_GET_ADDRESS (AcpiGbl_GpeBlockInfo[GpeBlock].BlockAddress->Address)), - ACPI_LODWORD (ACPI_GET_ADDRESS (AcpiGbl_GpeBlockInfo[GpeBlock].BlockAddress->Address)))); - - ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "GPE Block%d Range GPE #%2.2X to GPE #%2.2X\n", - (INT32) GpeBlock, - AcpiGbl_GpeBlockInfo[GpeBlock].BlockBaseNumber, - AcpiGbl_GpeBlockInfo[GpeBlock].BlockBaseNumber + - ((AcpiGbl_GpeBlockInfo[GpeBlock].RegisterCount * 8) -1))); + if (i) + { + ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "GPE Block%d: %X registers at %8.8X%8.8X\n", + (INT32) GpeBlock, AcpiGbl_GpeBlockInfo[0].RegisterCount, + ACPI_HIDWORD (ACPI_GET_ADDRESS (AcpiGbl_GpeBlockInfo[GpeBlock].BlockAddress->Address)), + ACPI_LODWORD (ACPI_GET_ADDRESS (AcpiGbl_GpeBlockInfo[GpeBlock].BlockAddress->Address)))); + + ACPI_REPORT_INFO (("GPE Block%d defined as GPE%d to GPE%d\n", + (INT32) GpeBlock, + (UINT32) AcpiGbl_GpeBlockInfo[GpeBlock].BlockBaseNumber, + (UINT32) (AcpiGbl_GpeBlockInfo[GpeBlock].BlockBaseNumber + + ((AcpiGbl_GpeBlockInfo[GpeBlock].RegisterCount * 8) -1)))); + } } return_ACPI_STATUS (AE_OK); @@ -925,7 +945,7 @@ AcpiEvAsynchExecuteGpeMethod ( Status = AcpiNsEvaluateByHandle (GpeInfo.MethodHandle, NULL, NULL); if (ACPI_FAILURE (Status)) { - ACPI_REPORT_ERROR (("%s while evaluated GPE%X method\n", + ACPI_REPORT_ERROR (("%s while evaluating GPE%X method\n", AcpiFormatException (Status), GpeNumber)); } } @@ -980,7 +1000,7 @@ AcpiEvGpeDispatch ( GpeNumberIndex = AcpiEvGetGpeNumberIndex (GpeNumber); if (GpeNumberIndex == ACPI_GPE_INVALID) { - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Invalid event, GPE[%X].\n", GpeNumber)); + ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "GPE[%X] is not a valid event\n", GpeNumber)); return_VALUE (ACPI_INTERRUPT_NOT_HANDLED); } |