[ros-diffs] [cgutman] 46429: [ACPI] - Implement IOCTL_GET_SYS_BUTTON_CAPS - Register and maintain PnP interfaces for thermal zones, buttons, lids, and processors

cgutman at svn.reactos.org cgutman at svn.reactos.org
Thu Mar 25 06:11:24 CET 2010


Author: cgutman
Date: Thu Mar 25 06:11:24 2010
New Revision: 46429

URL: http://svn.reactos.org/svn/reactos?rev=46429&view=rev
Log:
[ACPI]
- Implement IOCTL_GET_SYS_BUTTON_CAPS
- Register and maintain PnP interfaces for thermal zones, buttons, lids, and processors

Modified:
    trunk/reactos/drivers/bus/acpi/buspdo.c
    trunk/reactos/drivers/bus/acpi/include/acpisys.h
    trunk/reactos/drivers/bus/acpi/main.c

Modified: trunk/reactos/drivers/bus/acpi/buspdo.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/bus/acpi/buspdo.c?rev=46429&r1=46428&r2=46429&view=diff
==============================================================================
--- trunk/reactos/drivers/bus/acpi/buspdo.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/bus/acpi/buspdo.c [iso-8859-1] Thu Mar 25 06:11:24 2010
@@ -7,6 +7,9 @@
 
 #include <acpi_bus.h>
 #include <acpi_drivers.h>
+
+#include <initguid.h>
+#include <poclass.h>
 
 #define NDEBUG
 #include <debug.h>
@@ -33,8 +36,12 @@
 {
     NTSTATUS                status;
     POWER_STATE             state;
+    struct acpi_device      *device = NULL;
 
     PAGED_CODE ();
+
+    if (DeviceData->AcpiHandle)
+        acpi_bus_get_device(DeviceData->AcpiHandle, &device);
 
     //
     // NB: Because we are a bus enumerator, we have no one to whom we could
@@ -45,7 +52,6 @@
     switch (IrpStack->MinorFunction) {
 
     case IRP_MN_START_DEVICE:
-
         //
         // Here we do what ever initialization and ``turning on'' that is
         // required to allow others to access this device.
@@ -59,6 +65,43 @@
             break;
         }
 
+        DeviceData->InterfaceName.Length = 0;
+
+        if (!device)
+        {
+            IoRegisterDeviceInterface(DeviceData->Common.Self,
+                                      &GUID_DEVICE_SYS_BUTTON,
+                                      NULL,
+                                      &DeviceData->InterfaceName);
+        }
+        else if (device->flags.hardware_id &&
+                 strstr(device->pnp.hardware_id, ACPI_THERMAL_HID))
+        {
+            IoRegisterDeviceInterface(DeviceData->Common.Self,
+                                      &GUID_DEVICE_THERMAL_ZONE,
+                                      NULL,
+                                      &DeviceData->InterfaceName);
+        }
+        else if (device->flags.hardware_id &&
+                 strstr(device->pnp.hardware_id, ACPI_BUTTON_HID_LID))
+        {
+            IoRegisterDeviceInterface(DeviceData->Common.Self,
+                                      &GUID_DEVICE_LID,
+                                      NULL,
+                                      &DeviceData->InterfaceName);
+        }
+        else if (device->flags.hardware_id &&
+                 strstr(device->pnp.hardware_id, ACPI_PROCESSOR_HID))
+        {
+            IoRegisterDeviceInterface(DeviceData->Common.Self,
+                                      &GUID_DEVICE_PROCESSOR,
+                                      NULL,
+                                      &DeviceData->InterfaceName);
+        }
+
+        if (DeviceData->InterfaceName.Length != 0)
+            IoSetDeviceInterfaceState(&DeviceData->InterfaceName, TRUE);
+
         state.DeviceState = PowerDeviceD0;
         PoSetPowerState(DeviceData->Common.Self, DevicePowerState, state);
         DeviceData->Common.DevicePowerState = PowerDeviceD0;
@@ -67,6 +110,9 @@
         break;
 
     case IRP_MN_STOP_DEVICE:
+
+        if (DeviceData->InterfaceName.Length != 0)
+            IoSetDeviceInterfaceState(&DeviceData->InterfaceName, FALSE);
 
         //
         // Here we shut down the device and give up and unmap any resources
@@ -331,20 +377,17 @@
        deviceCapabilities->UniqueID = device->flags.unique_id;
        deviceCapabilities->NoDisplayInUI = !device->status.show_in_ui;
        deviceCapabilities->Address = device->pnp.bus_address;
-       deviceCapabilities->RawDeviceOK = FALSE;
     }
-    else
+
+    if (!device ||
+        (device->flags.hardware_id &&
+         (strstr(device->pnp.hardware_id, ACPI_BUTTON_HID_LID) ||
+          strstr(device->pnp.hardware_id, ACPI_THERMAL_HID) ||
+          strstr(device->pnp.hardware_id, ACPI_PROCESSOR_HID))))
     {
-       deviceCapabilities->EjectSupported = FALSE;
-       deviceCapabilities->HardwareDisabled = FALSE;
-       deviceCapabilities->Removable = FALSE;
-       deviceCapabilities->SurpriseRemovalOK = FALSE;
-       deviceCapabilities->UniqueID = FALSE;
-       deviceCapabilities->NoDisplayInUI = FALSE;
-       deviceCapabilities->Address = 0;
-
-       /* The ACPI driver will run fixed buttons */
-       deviceCapabilities->RawDeviceOK = TRUE;
+        /* Allow ACPI to control the device if it is a lid button,
+         * a thermal zone, a processor, or a fixed feature button */
+        deviceCapabilities->RawDeviceOK = TRUE;
     }
 
     deviceCapabilities->SilentInstall = FALSE;

Modified: trunk/reactos/drivers/bus/acpi/include/acpisys.h
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/bus/acpi/include/acpisys.h?rev=46429&r1=46428&r2=46429&view=diff
==============================================================================
--- trunk/reactos/drivers/bus/acpi/include/acpisys.h [iso-8859-1] (original)
+++ trunk/reactos/drivers/bus/acpi/include/acpisys.h [iso-8859-1] Thu Mar 25 06:11:24 2010
@@ -39,6 +39,7 @@
     // Link point to hold all the PDOs for a single bus together
     LIST_ENTRY  Link;
     ULONG       InterfaceRefCount;
+    UNICODE_STRING InterfaceName;
 
 } PDO_DEVICE_DATA, *PPDO_DEVICE_DATA;
 
@@ -63,10 +64,6 @@
 
     // A synchronization for access to the device extension.
     FAST_MUTEX      Mutex;
-
-    // The name returned from IoRegisterDeviceInterface,
-    // which is used as a handle for IoSetDeviceInterfaceState.
-    UNICODE_STRING      InterfaceName;
 
 } FDO_DEVICE_DATA, *PFDO_DEVICE_DATA;
 

Modified: trunk/reactos/drivers/bus/acpi/main.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/bus/acpi/main.c?rev=46429&r1=46428&r2=46429&view=diff
==============================================================================
--- trunk/reactos/drivers/bus/acpi/main.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/bus/acpi/main.c [iso-8859-1] Thu Mar 25 06:11:24 2010
@@ -7,6 +7,7 @@
 #include <acpi_drivers.h>
 
 #include <acpiioct.h>
+#include <poclass.h>
 
 #define NDEBUG
 #include <debug.h>
@@ -16,8 +17,6 @@
 #pragma alloc_text (PAGE, Bus_AddDevice)
 
 #endif
-
-
 
 NTSTATUS
 NTAPI
@@ -189,6 +188,7 @@
     PIO_STACK_LOCATION      irpStack;
     NTSTATUS                status = STATUS_NOT_SUPPORTED;
     PCOMMON_DEVICE_DATA     commonData;
+    ULONG Caps = 0;
 
     PAGED_CODE ();
 
@@ -208,6 +208,44 @@
                                           Irp);
               break;
 
+           case IOCTL_GET_SYS_BUTTON_CAPS:
+              if (irpStack->Parameters.DeviceIoControl.OutputBufferLength < sizeof(ULONG))
+              {
+                  status = STATUS_BUFFER_TOO_SMALL;
+                  break;
+              }
+
+              if (wcsstr(((PPDO_DEVICE_DATA)commonData)->HardwareIDs, L"PNP0C0C") ||
+                  wcsstr(((PPDO_DEVICE_DATA)commonData)->HardwareIDs, L"ACPI_FPB"))
+              {
+                  DPRINT1("Power button reported to power manager\n");
+                  Caps |= SYS_BUTTON_POWER;
+              }
+              else if (wcsstr(((PPDO_DEVICE_DATA)commonData)->HardwareIDs, L"PNP0C0E") ||
+                       wcsstr(((PPDO_DEVICE_DATA)commonData)->HardwareIDs, L"ACPI_FSB"))
+              {
+                  DPRINT1("Sleep button reported to power manager\n");
+                  Caps |= SYS_BUTTON_SLEEP;
+              }
+              else if (wcsstr(((PPDO_DEVICE_DATA)commonData)->HardwareIDs, L"PNP0C0D"))
+              {
+                  DPRINT1("Lid button reported to power manager\n");
+                  Caps |= SYS_BUTTON_LID;
+              }
+              else
+              {
+                  DPRINT1("IOCTL_GET_SYS_BUTTON_CAPS sent to a non-button device\n");
+                  status = STATUS_INVALID_PARAMETER;
+              }
+
+              if (Caps != 0)
+              {
+                  RtlCopyMemory(Irp->AssociatedIrp.SystemBuffer, &Caps, sizeof(Caps));
+                  Irp->IoStatus.Information = sizeof(Caps);
+                  status = STATUS_SUCCESS;
+              }
+              break;
+
            /* TODO: Implement other IOCTLs */
 
            default:




More information about the Ros-diffs mailing list