From fbe9d6de535dd675291b58292910cc905ee676c3 Mon Sep 17 00:00:00 2001 From: Fredrik Holmqvist Date: Wed, 27 Aug 2014 22:52:37 +0200 Subject: [PATCH] Add a global log GPE handler, enable all runtime GPE's. For now we only log messages. --- .../kernel/bus_managers/acpi/BusManager.cpp | 74 +++++++++++++++++++ 1 file changed, 74 insertions(+) diff --git a/src/add-ons/kernel/bus_managers/acpi/BusManager.cpp b/src/add-ons/kernel/bus_managers/acpi/BusManager.cpp index 7f8459e62f..c3ef6dfe88 100644 --- a/src/add-ons/kernel/bus_managers/acpi/BusManager.cpp +++ b/src/add-ons/kernel/bus_managers/acpi/BusManager.cpp @@ -86,6 +86,69 @@ get_device_by_hid_callback(ACPI_HANDLE object, UINT32 depth, void* context, } +static void +globalGPEHandler(UINT32 eventType, ACPI_HANDLE device, UINT32 eventNumber, + void *context) +{ + ACPI_BUFFER path; + char deviceName[256]; + path.Length = sizeof(deviceName); + path.Pointer = deviceName; + + ACPI_STATUS status = AcpiNsHandleToPathname(device, &path); + if (ACPI_FAILURE(status)) { + deviceName[0] = '?'; + deviceName[1] = '?'; + deviceName[2] = '?'; + deviceName[3] = 0; + } + + switch (eventType) { + case ACPI_EVENT_TYPE_GPE: + dprintf("acpi: GPE Event %d for %s\n", eventNumber, deviceName); + break; + + case ACPI_EVENT_TYPE_FIXED: + { + switch(eventNumber) { + case ACPI_EVENT_PMTIMER: + dprintf("acpi: PMTIMER(%d) event for %s\n", eventNumber, + deviceName); + break; + + case ACPI_EVENT_GLOBAL: + dprintf("acpi: Global(%d) event for %s\n", eventNumber, + deviceName); + break; + + case ACPI_EVENT_POWER_BUTTON: + dprintf("acpi: Powerbutton(%d) event for %s\n", eventNumber, + deviceName); + break; + + case ACPI_EVENT_SLEEP_BUTTON: + dprintf("acpi: sleepbutton(%d) event for %s\n", eventNumber, + deviceName); + break; + + case ACPI_EVENT_RTC: + dprintf("acpi: RTC(%d) event for %s\n", eventNumber, + deviceName); + break; + + default: + dprintf("acpi: unknown fixed(%d) event for %s\n", + eventNumber, deviceName); + } + } break; + + default: + dprintf("acpi: unknown event type (%d:%d) event for %s\n", + eventType, eventNumber, deviceName); + } +} + + // #pragma mark - ACPI bus manager API @@ -183,6 +246,17 @@ acpi_std_ops(int32 op,...) "AcpiInitializeObjects failed")) goto err; + + checkAndLogFailure( + AcpiInstallGlobalEventHandler(globalGPEHandler, NULL), + "Failed to install global GPE handler."); + + checkAndLogFailure(AcpiEnableAllRuntimeGpes(), + "Failed to enable all runtime Gpes"); + + checkAndLogFailure(AcpiUpdateAllGpes(), + "Failed to update all Gpes"); + /* Phew. Now in ACPI mode */ TRACE("ACPI initialized\n"); return B_OK;