hrev47754 adds 4 changesets to branch 'master' old head: 22491e14911a00867a7ac87d9959918c9a16f25a new head: fbe9d6de535dd675291b58292910cc905ee676c3 overview: http://cgit.haiku-os.org/haiku/log/?qt=range&q=fbe9d6d+%5E22491e1 ---------------------------------------------------------------------------- 278d57f: Fix warning printf should use %d. 0842eba: Use ACPICA defaults, don't set interpreterslack to true anymore. ACPIA has internal code to detect and fix most problems now. c5baf46: DRY - Use a helper function to check and log failures. fbe9d6d: Add a global log GPE handler, enable all runtime GPE's. For now we only log messages. [ Fredrik Holmqvist <fredrik.holmqvist@xxxxxxxxx> ] ---------------------------------------------------------------------------- 1 file changed, 114 insertions(+), 56 deletions(-) .../kernel/bus_managers/acpi/BusManager.cpp | 170 +++++++++++++------ ############################################################################ Commit: 278d57f27bd8e540cf71c7deac7989e68b3eba11 URL: http://cgit.haiku-os.org/haiku/commit/?id=278d57f Author: Fredrik Holmqvist <fredrik.holmqvist@xxxxxxxxx> Date: Wed Aug 27 20:41:14 2014 UTC Fix warning printf should use %d. ---------------------------------------------------------------------------- diff --git a/src/add-ons/kernel/bus_managers/acpi/BusManager.cpp b/src/add-ons/kernel/bus_managers/acpi/BusManager.cpp index 57fe4a0..e4a51c7 100644 --- a/src/add-ons/kernel/bus_managers/acpi/BusManager.cpp +++ b/src/add-ons/kernel/bus_managers/acpi/BusManager.cpp @@ -52,7 +52,7 @@ get_device_by_hid_callback(ACPI_HANDLE object, UINT32 depth, void* context, ACPI_STATUS status; ACPI_BUFFER buffer; - TRACE("get_device_by_hid_callback %p, %ld, %p\n", object, depth, context); + TRACE("get_device_by_hid_callback %p, %d, %p\n", object, depth, context); *_returnValue = NULL; ############################################################################ Commit: 0842eba04e92437150ca6f0455193f83cc957ee8 URL: http://cgit.haiku-os.org/haiku/commit/?id=0842eba Author: Fredrik Holmqvist <fredrik.holmqvist@xxxxxxxxx> Date: Wed Aug 27 20:45:49 2014 UTC Use ACPICA defaults, don't set interpreterslack to true anymore. ACPIA has internal code to detect and fix most problems now. ---------------------------------------------------------------------------- diff --git a/src/add-ons/kernel/bus_managers/acpi/BusManager.cpp b/src/add-ons/kernel/bus_managers/acpi/BusManager.cpp index e4a51c7..436977f 100644 --- a/src/add-ons/kernel/bus_managers/acpi/BusManager.cpp +++ b/src/add-ons/kernel/bus_managers/acpi/BusManager.cpp @@ -120,9 +120,6 @@ acpi_std_ops(int32 op,...) return B_ERROR; } - AcpiGbl_EnableInterpreterSlack = true; -// AcpiGbl_CreateOSIMethod = true; - #ifdef ACPI_DEBUG_OUTPUT AcpiDbgLevel = ACPI_DEBUG_ALL | ACPI_LV_VERBOSE; AcpiDbgLayer = ACPI_ALL_COMPONENTS; ############################################################################ Commit: c5baf4605501efe425cb21c048f6d51aa9ceb303 URL: http://cgit.haiku-os.org/haiku/commit/?id=c5baf46 Author: Fredrik Holmqvist <fredrik.holmqvist@xxxxxxxxx> Date: Wed Aug 27 20:49:09 2014 UTC DRY - Use a helper function to check and log failures. ---------------------------------------------------------------------------- diff --git a/src/add-ons/kernel/bus_managers/acpi/BusManager.cpp b/src/add-ons/kernel/bus_managers/acpi/BusManager.cpp index 436977f..7f8459e 100644 --- a/src/add-ons/kernel/bus_managers/acpi/BusManager.cpp +++ b/src/add-ons/kernel/bus_managers/acpi/BusManager.cpp @@ -44,12 +44,22 @@ extern dpc_module_info* gDPC; void* gDPCHandle = NULL; +static bool +checkAndLogFailure(const ACPI_STATUS status, const char* msg) +{ + bool failure = ACPI_FAILURE(status); + if (failure) + dprintf("acpi: %s %s\n", msg, AcpiFormatException(status)); + + return failure; +} + + static ACPI_STATUS get_device_by_hid_callback(ACPI_HANDLE object, UINT32 depth, void* context, void** _returnValue) { uint32* counter = (uint32*)context; - ACPI_STATUS status; ACPI_BUFFER buffer; TRACE("get_device_by_hid_callback %p, %d, %p\n", object, depth, context); @@ -60,8 +70,8 @@ get_device_by_hid_callback(ACPI_HANDLE object, UINT32 depth, void* context, buffer.Length = 254; buffer.Pointer = malloc(255); - status = AcpiGetName(object, ACPI_FULL_PATHNAME, &buffer); - if (status != AE_OK) { + if (checkAndLogFailure(AcpiGetName(object, ACPI_FULL_PATHNAME, &buffer), + "Failed to find device")) { free(buffer.Pointer); return AE_CTRL_TERMINATE; } @@ -85,7 +95,6 @@ acpi_std_ops(int32 op,...) switch (op) { case B_MODULE_INIT: { - ACPI_STATUS status; ACPI_OBJECT arg; ACPI_OBJECT_LIST parameter; void *settings; @@ -125,51 +134,36 @@ acpi_std_ops(int32 op,...) AcpiDbgLayer = ACPI_ALL_COMPONENTS; #endif - status = AcpiInitializeSubsystem(); - if (ACPI_FAILURE(status)) { - ERROR("AcpiInitializeSubsystem failed (%s)\n", - AcpiFormatException(status)); + if (checkAndLogFailure(AcpiInitializeSubsystem(), + "AcpiInitializeSubsystem failed")) goto err; - } - status = AcpiInitializeTables(NULL, 0, TRUE); - if (ACPI_FAILURE(status)) { - ERROR("AcpiInitializeTables failed (%s)\n", - AcpiFormatException(status)); + if (checkAndLogFailure(AcpiInitializeTables(NULL, 0, TRUE), + "AcpiInitializeTables failed")) goto err; - } - status = AcpiLoadTables(); - if (ACPI_FAILURE(status)) { - ERROR("AcpiLoadTables failed (%s)\n", - AcpiFormatException(status)); + if (checkAndLogFailure(AcpiLoadTables(), + "AcpiLoadTables failed")) goto err; - } /* Install the default address space handlers. */ - status = AcpiInstallAddressSpaceHandler(ACPI_ROOT_OBJECT, - ACPI_ADR_SPACE_SYSTEM_MEMORY, ACPI_DEFAULT_HANDLER, NULL, NULL); - if (ACPI_FAILURE(status)) { - ERROR("Could not initialise SystemMemory handler: %s\n", - AcpiFormatException(status)); + if (checkAndLogFailure(AcpiInstallAddressSpaceHandler( + ACPI_ROOT_OBJECT, ACPI_ADR_SPACE_SYSTEM_MEMORY, + ACPI_DEFAULT_HANDLER, NULL, NULL), + "Could not initialise SystemMemory handler:")) goto err; - } - status = AcpiInstallAddressSpaceHandler(ACPI_ROOT_OBJECT, - ACPI_ADR_SPACE_SYSTEM_IO, ACPI_DEFAULT_HANDLER, NULL, NULL); - if (ACPI_FAILURE(status)) { - ERROR("Could not initialise SystemIO handler: %s\n", - AcpiFormatException(status)); + if (checkAndLogFailure(AcpiInstallAddressSpaceHandler( + ACPI_ROOT_OBJECT, ACPI_ADR_SPACE_SYSTEM_IO, + ACPI_DEFAULT_HANDLER, NULL, NULL), + "Could not initialise SystemIO handler:")) goto err; - } - status = AcpiInstallAddressSpaceHandler(ACPI_ROOT_OBJECT, - ACPI_ADR_SPACE_PCI_CONFIG, ACPI_DEFAULT_HANDLER, NULL, NULL); - if (ACPI_FAILURE(status)) { - ERROR("Could not initialise PciConfig handler: %s\n", - AcpiFormatException(status)); + if (checkAndLogFailure(AcpiInstallAddressSpaceHandler( + ACPI_ROOT_OBJECT, ACPI_ADR_SPACE_PCI_CONFIG, + ACPI_DEFAULT_HANDLER, NULL, NULL), + "Could not initialise PciConfig handler:")) goto err; - } arg.Integer.Type = ACPI_TYPE_INTEGER; arg.Integer.Value = 0; @@ -179,22 +173,15 @@ acpi_std_ops(int32 op,...) AcpiEvaluateObject(NULL, "\\_PIC", ¶meter, NULL); - // FreeBSD seems to pass in the above flags here as - // well but specs don't define ACPI_NO_DEVICE_INIT - // and ACPI_NO_OBJECT_INIT here. - status = AcpiEnableSubsystem(ACPI_FULL_INITIALIZATION); - if (ACPI_FAILURE(status)) { - ERROR("AcpiEnableSubsystem failed (%s)\n", - AcpiFormatException(status)); + if (checkAndLogFailure(AcpiEnableSubsystem( + ACPI_FULL_INITIALIZATION), + "AcpiEnableSubsystem failed")) goto err; - } - status = AcpiInitializeObjects(ACPI_FULL_INITIALIZATION); - if (ACPI_FAILURE(status)) { - ERROR("AcpiInitializeObjects failed (%s)\n", - AcpiFormatException(status)); + if (checkAndLogFailure(AcpiInitializeObjects( + ACPI_FULL_INITIALIZATION), + "AcpiInitializeObjects failed")) goto err; - } /* Phew. Now in ACPI mode */ TRACE("ACPI initialized\n"); @@ -206,8 +193,8 @@ acpi_std_ops(int32 op,...) case B_MODULE_UNINIT: { - if (AcpiTerminate() != AE_OK) - ERROR("Could not bring system out of ACPI mode. Oh well.\n"); + if (checkAndLogFailure(AcpiTerminate(), + "Could not bring system out of ACPI mode. Oh well.")); gDPC->delete_dpc_queue(gDPCHandle); gDPCHandle = NULL; ############################################################################ Revision: hrev47754 Commit: fbe9d6de535dd675291b58292910cc905ee676c3 URL: http://cgit.haiku-os.org/haiku/commit/?id=fbe9d6d Author: Fredrik Holmqvist <fredrik.holmqvist@xxxxxxxxx> Date: Wed Aug 27 20:52:37 2014 UTC Add a global log GPE handler, enable all runtime GPE's. For now we only log messages. ---------------------------------------------------------------------------- diff --git a/src/add-ons/kernel/bus_managers/acpi/BusManager.cpp b/src/add-ons/kernel/bus_managers/acpi/BusManager.cpp index 7f8459e..c3ef6df 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;