ACPI_STATUS AtGpeCommon( ACPI_STRING Pathname, UINT32 GpeNumber[], UINT8 GpeType[], UINT32 GpeCount, UINT32 ApiCall, UINT32 CheckAction, ACPI_STATUS ExpectedStatus) { ACPI_STATUS Status; ACPI_HANDLE GpeDevice = NULL; UINT32 Gpe; UINT32 i; char *ApiCallName; ACPI_EVENT_STATUS GpeStatus, *GpeStatusPointer = &GpeStatus; if (ACPI_FAILURE(Status = AtAMLcodeFileNameSet("gpev0000.aml"))) { return (Status); } Status = AtSubsystemInit( AAPITS_INI_DEF, AAPITS_EN_FLAGS, AAPITS_OI_FLAGS, AtAMLcodeFileName); if (ACPI_FAILURE(Status)) { return (Status); } if (CheckAction == 1) { if (ACPI_FAILURE(Status = AtAuxiliarySsdt(AT_LOAD))) { return (Status); } Pathname = "\\AUX2.DEV0"; } if (Pathname) { Status = AcpiGetHandle (NULL, Pathname, &GpeDevice); if (ACPI_FAILURE(Status)) { AapiErrors++; printf ("Api Error: AcpiGetHandle(%s) returned %s\n", Pathname, AcpiFormatException(Status)); return (Status); } if (CheckAction != 2) { Status = AcpiInstallGpeBlock (GpeDevice, &GpeBlockAddress, RegisterCount, InterruptNumber); if (ACPI_FAILURE(Status)) { AapiErrors++; printf ("Api Error: AcpiInstallGpeBlock(%s) returned %s\n", Pathname, AcpiFormatException(Status)); return (Status); } } } #if 0 /* OBSOLETE interface, AcpiSetGpeType */ if (CheckAction != 2 && ApiCall != 0) { for (i = 0; i < GpeCount; i++) { Gpe = GpeNumber[i]; Type = GpeType[i]; Status = AcpiSetGpeType(GpeDevice, Gpe, Type); if (ACPI_FAILURE(Status)) { AapiErrors++; printf ("API Error: AcpiSetGpeType(0x%x, 0x%x) returned %s\n", Gpe, (UINT32)Type, AcpiFormatException(Status)); return (Status); } } } #endif if (CheckAction == 1) { /* Make Device handle invalid by unloading SSDT table*/ if (ACPI_FAILURE(Status = AtAuxiliarySsdt(AT_UNLOAD))) { return (Status); } } for (i = 0; i < GpeCount; i++) { Gpe = GpeNumber[i]; if (CheckAction == 3) { Gpe += 256; } else if (CheckAction == 5) { GpeStatusPointer = NULL; } switch (ApiCall) { case 0: ApiCallName = "AcpiSetGpeType"; #if 0 /* OBSOLETE INTERFACE */ Status = AcpiSetGpeType(GpeDevice, Gpe, Type); #endif Status = AE_OK; break; case 1: ApiCallName = "AcpiEnableGpe"; Status = AcpiEnableGpe(GpeDevice, Gpe); break; case 2: ApiCallName = "AcpiClearGpe"; Status = AcpiClearGpe(GpeDevice, Gpe); break; case 3: ApiCallName = "AcpiGetGpeStatus"; Status = AcpiGetGpeStatus(GpeDevice, Gpe, GpeStatusPointer); break; case 4: ApiCallName = "AcpiDisableGpe"; Status = AcpiDisableGpe(GpeDevice, Gpe); break; default: TestErrors++; printf ("Test Error: the ApiCall number (%d) should be in range 0-4\n", ApiCall); return (AE_ERROR); } if (Status != ExpectedStatus) { AapiErrors++; printf ("Api Error: %s(%d) returned %s, expected %s\n", ApiCallName, Gpe, AcpiFormatException(Status), AcpiFormatException(ExpectedStatus)); if (Status != AE_OK) { return (Status); } else { return (AE_ERROR); } } } return (AtTerminateCtrlCheck(AE_OK, ALL_STAT)); }
status_t clear_gpe(acpi_handle handle, uint32 gpeNumber) { return AcpiClearGpe(handle, gpeNumber) == AE_OK ? B_OK : B_ERROR; }