[haiku-commits] haiku: hrev47754 - src/add-ons/kernel/bus_managers/acpi

  • From: fredrik.holmqvist@xxxxxxxxx
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Wed, 27 Aug 2014 22:54:53 +0200 (CEST)

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", &parameter, 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;


Other related posts: