sync with trunk r46493
[reactos.git] / drivers / bus / acpi / cmbatt / cmexec.c
index a41865c..beb646a 100644 (file)
 
 NTSTATUS
 NTAPI
-GetDwordElement(PACPI_METHOD_ARGUMENT Argument,
-                PULONG Value)
+GetDwordElement(IN PACPI_METHOD_ARGUMENT Argument,
+                OUT PULONG Value)
 {
-    UNIMPLEMENTED;
-    return STATUS_NOT_IMPLEMENTED;
+    NTSTATUS Status;
+    
+    /* Must have an integer */
+    if (Argument->Type != ACPI_METHOD_ARGUMENT_INTEGER)
+    {
+        /* Not an integer, fail */
+        Status = STATUS_ACPI_INVALID_DATA;
+        if (CmBattDebug & 0x4C)
+            DbgPrint("GetDwordElement: Object contained wrong data type - %d\n",
+                     Argument->Type);
+    }
+    else
+    {
+        /* Read the integer value */
+        *Value = Argument->Argument;
+        Status = STATUS_SUCCESS;
+    }
+    
+    /* Return status */
+    return Status;
 }
 
 NTSTATUS
 NTAPI
-GetStringElement(PACPI_METHOD_ARGUMENT Argument,
-                 PCHAR Value)
+GetStringElement(IN PACPI_METHOD_ARGUMENT Argument,
+                 OUT PCHAR Value)
 {
-    UNIMPLEMENTED;
-    return STATUS_NOT_IMPLEMENTED;
+    NTSTATUS Status;
+    
+    /* Must have a string of buffer */
+    if ((Argument->Type == ACPI_METHOD_ARGUMENT_STRING) ||
+        (Argument->Type == ACPI_METHOD_ARGUMENT_BUFFER))
+    {
+        /* String must be less than 256 characters */
+        if (Argument->DataLength < 256)
+        {
+            /* Copy the buffer */
+            RtlCopyMemory(Value, Argument->Data, Argument->DataLength);
+            Status = STATUS_SUCCESS;
+        }
+        else
+        {
+            /* The buffer is too small (the string is too large) */
+            Status = STATUS_BUFFER_TOO_SMALL;
+            if (CmBattDebug & 0x4C)
+                DbgPrint("GetStringElement: return buffer not big enough - %d\n", Argument->DataLength);
+        }
+    }
+    else
+    {
+        /* Not valid string data */
+        Status = STATUS_ACPI_INVALID_DATA;
+        if (CmBattDebug & 0x4C)
+            DbgPrint("GetStringElement: Object contained wrong data type - %d\n", Argument->Type);
+    }
+    
+    /* Return the status */
+    return Status;
 }
 
 NTSTATUS
 NTAPI
-CmBattGetPsrData(PDEVICE_OBJECT DeviceObject,
-                 PULONG PsrData)
+CmBattSendDownStreamIrp(IN PDEVICE_OBJECT DeviceObject,
+                        IN ULONG IoControlCode,
+                        IN PVOID InputBuffer,
+                        IN ULONG InputBufferLength,
+                        IN PACPI_EVAL_OUTPUT_BUFFER OutputBuffer,
+                        IN ULONG OutputBufferLength)
 {
-    UNIMPLEMENTED;
-    return STATUS_NOT_IMPLEMENTED; 
+    PIRP Irp;
+    NTSTATUS Status;
+    KEVENT Event;
+    IO_STATUS_BLOCK IoStatusBlock;
+    PAGED_CODE();
+
+    /* Initialize our wait event */
+    KeInitializeEvent(&Event, SynchronizationEvent, 0);
+    
+    /* Allocate the IRP */
+    Irp = IoBuildDeviceIoControlRequest(IoControlCode,
+                                        DeviceObject,
+                                        InputBuffer,
+                                        InputBufferLength,
+                                        OutputBuffer,
+                                        OutputBufferLength,
+                                        0,
+                                        &Event,
+                                        &IoStatusBlock);
+    if (!Irp)
+    {
+        /* No IRP, fail */
+        if (CmBattDebug & 0x4C)
+            DbgPrint("CmBattSendDownStreamIrp: Failed to allocate Irp\n");
+        return STATUS_INSUFFICIENT_RESOURCES;
+    }
+    /* Call ACPI */
+    if (CmBattDebug & 0x40)
+        DbgPrint("CmBattSendDownStreamIrp: Irp %x [Tid] %x\n",
+                 Irp, KeGetCurrentThread());
+    Status = IoCallDriver(DeviceObject, Irp);
+    if (Status == STATUS_PENDING)
+    {
+        /* Wait for completion */
+        KeWaitForSingleObject(&Event,
+                              Executive,
+                              KernelMode,
+                              FALSE,
+                              NULL);
+        Status = Irp->IoStatus.Status;
+    }
+    
+    /* Check if caller wanted output */
+    if (OutputBuffer)
+    {
+        /* Make sure it's valid ACPI output buffer */
+        if ((OutputBuffer->Signature != ACPI_EVAL_OUTPUT_BUFFER_SIGNATURE) ||
+            !(OutputBuffer->Count))
+        {
+            /* It isn't, so set failure code */
+            Status = STATUS_ACPI_INVALID_DATA;
+        }
+    }
+    
+    /* Return status */
+    if (CmBattDebug & 0x40)
+        DbgPrint("CmBattSendDownStreamIrp: Irp %x completed %x! [Tid] %x\n",
+                 Irp, Status, KeGetCurrentThread());
+    return Status;
 }
 
 NTSTATUS
 NTAPI
-CmBattGetBifData(PCMBATT_DEVICE_EXTENSION DeviceExtension,
-                 PACPI_BIF_DATA BifData)
+CmBattGetPsrData(IN PDEVICE_OBJECT DeviceObject,
+                 OUT PULONG PsrData)
 {
-    UNIMPLEMENTED;
-    return STATUS_NOT_IMPLEMENTED;
+    NTSTATUS Status;
+    ACPI_EVAL_OUTPUT_BUFFER OutputBuffer;
+    ACPI_EVAL_INPUT_BUFFER InputBuffer;
+    PAGED_CODE();
+    if (CmBattDebug & 0x40)
+        DbgPrint("CmBattGetPsrData: Entered with Pdo %x Tid %x\n",
+                 DeviceObject, KeGetCurrentThread());
+    
+    /* Initialize to zero */
+    ASSERT(PsrData != NULL);
+    *PsrData = 0;
+      
+    /* Request the _PSR method */
+    *(PULONG)InputBuffer.MethodName = 'RSP_';
+    InputBuffer.Signature = ACPI_EVAL_INPUT_BUFFER_SIGNATURE;
+
+    /* Send it to ACPI */
+    Status = CmBattSendDownStreamIrp(DeviceObject,
+                                     IOCTL_ACPI_EVAL_METHOD,
+                                     &InputBuffer,
+                                     sizeof(InputBuffer),
+                                     &OutputBuffer,
+                                     sizeof(OutputBuffer));
+    if (NT_SUCCESS(Status))
+    {
+        /* Read the result */
+        Status = GetDwordElement(OutputBuffer.Argument, PsrData);
+        if (CmBattDebug & 0x440)
+            DbgPrint("CmBattGetPsrData: _PSR method returned %x \n", *PsrData);
+    }
+    else if (CmBattDebug & 0x44C)
+    {
+        /* Failure */
+        DbgPrint("CmBattGetPsrData: Failed _PSR method - Status (0x%x)\n", Status);
+    }
+    
+    /* Return status */
+    return Status;
 }
 
 NTSTATUS
 NTAPI
-CmBattGetBstData(PCMBATT_DEVICE_EXTENSION DeviceExtension,
-                 PACPI_BST_DATA BstData)
+CmBattGetStaData(IN PDEVICE_OBJECT DeviceObject,
+                 OUT PULONG StaData)
 {
-    UNIMPLEMENTED;
-    return STATUS_NOT_IMPLEMENTED;
-}   
+    NTSTATUS Status;
+    ACPI_EVAL_OUTPUT_BUFFER OutputBuffer;
+    ACPI_EVAL_INPUT_BUFFER InputBuffer;
+    PAGED_CODE();
+    if (CmBattDebug & 0x40)
+        DbgPrint("CmBattGetStaData: Entered with Pdo %x Tid %x\n",
+                 DeviceObject, KeGetCurrentThread());
+    
+    /* Initialize to zero */
+    ASSERT(StaData != NULL);
+    *StaData = 0;
+      
+    /* Request the _PSR method */
+    *(PULONG)InputBuffer.MethodName = 'ATS_';
+    InputBuffer.Signature = ACPI_EVAL_INPUT_BUFFER_SIGNATURE;
+
+    /* Send it to ACPI */
+    Status = CmBattSendDownStreamIrp(DeviceObject,
+                                     IOCTL_ACPI_EVAL_METHOD,
+                                     &InputBuffer,
+                                     sizeof(InputBuffer),
+                                     &OutputBuffer,
+                                     sizeof(OutputBuffer));
+    if (NT_SUCCESS(Status))
+    {
+        /* Read the result */
+        Status = GetDwordElement(OutputBuffer.Argument, StaData);
+        if (CmBattDebug & 0x440)
+            DbgPrint("CmBattGetStaData: _STA method returned %x \n", *StaData);
+    }
+    else if (CmBattDebug & 0x44C)
+    {
+        /* Failure */
+        DbgPrint("CmBattGetStaData: Failed _STA method - Status (0x%x)\n", Status);
+        Status = STATUS_NO_SUCH_DEVICE;
+    }
+    
+    /* Return status */
+    return Status;
+}
 
 NTSTATUS
 NTAPI
-CmBattGetStaData(PDEVICE_OBJECT DeviceObject,
-                 PULONG StaData)
+CmBattGetUniqueId(IN PDEVICE_OBJECT DeviceObject,
+                  OUT PULONG UniqueId)
 {
-    UNIMPLEMENTED;
-    return STATUS_NOT_IMPLEMENTED;
+    NTSTATUS Status;
+    ACPI_EVAL_OUTPUT_BUFFER OutputBuffer;
+    ACPI_EVAL_INPUT_BUFFER InputBuffer;
+    PAGED_CODE();
+    if (CmBattDebug & 0x40)
+        DbgPrint("CmBattGetUniqueId: Entered with Pdo %x Tid %x\n",
+                 DeviceObject, KeGetCurrentThread());
+    
+    /* Initialize to zero */
+    ASSERT(UniqueId != NULL);
+    *UniqueId = 0;
+      
+    /* Request the _PSR method */
+    *(PULONG)InputBuffer.MethodName = 'DIU_';
+    InputBuffer.Signature = ACPI_EVAL_INPUT_BUFFER_SIGNATURE;
+
+    /* Send it to ACPI */
+    Status = CmBattSendDownStreamIrp(DeviceObject,
+                                     IOCTL_ACPI_EVAL_METHOD,
+                                     &InputBuffer,
+                                     sizeof(InputBuffer),
+                                     &OutputBuffer,
+                                     sizeof(OutputBuffer));
+    if (NT_SUCCESS(Status))
+    {
+        /* Read the result */
+        Status = GetDwordElement(OutputBuffer.Argument, UniqueId);
+        if (CmBattDebug & 0x440)
+            DbgPrint("CmBattGetUniqueId: _UID method returned %x \n", *UniqueId);
+    }
+    else if (CmBattDebug & 0x44C)
+    {
+        /* Failure */
+        DbgPrint("CmBattGetUniqueId: Failed _UID method - Status (0x%x)\n", Status);
+        Status = STATUS_NO_SUCH_DEVICE;
+    }
+    
+    /* Return status */
+    return Status;
 }
 
 NTSTATUS
 NTAPI
-CmBattGetUniqueId(PDEVICE_OBJECT DeviceObject,
-                  PULONG UniqueId)
+CmBattSetTripPpoint(IN PCMBATT_DEVICE_EXTENSION DeviceExtension,
+                    IN ULONG AlarmValue)
 {
-    UNIMPLEMENTED;
-    return STATUS_NOT_IMPLEMENTED;  
+    NTSTATUS Status;
+    ACPI_EVAL_INPUT_BUFFER_SIMPLE_INTEGER InputBuffer;
+    PAGED_CODE();
+    if (CmBattDebug & 0x440)
+        DbgPrint("CmBattSetTripPpoint: _BTP Alarm Value %x Device %x Tid %x\n",
+                 AlarmValue, DeviceExtension->DeviceId, KeGetCurrentThread);
+    
+    /* Request the _BTP method */
+    *(PULONG)InputBuffer.MethodName = 'PTB_';
+    InputBuffer.Signature = ACPI_EVAL_INPUT_BUFFER_SIMPLE_INTEGER_SIGNATURE;
+    InputBuffer.IntegerArgument = AlarmValue;
+
+    /* Send it to ACPI */
+    Status = CmBattSendDownStreamIrp(DeviceExtension->AttachedDevice,
+                                     IOCTL_ACPI_EVAL_METHOD,
+                                     &InputBuffer,
+                                     sizeof(InputBuffer),
+                                     NULL,
+                                     0);
+    if (!(NT_SUCCESS(Status)) && (CmBattDebug & 0x440))
+        DbgPrint("CmBattSetTripPpoint: Failed _BTP method on device %x - Status (0x%x)\n",
+                 DeviceExtension->DeviceId, Status);
+    
+    /* Return status */
+    return Status;
 }
 
 NTSTATUS
 NTAPI
-CmBattSetTripPpoint(PCMBATT_DEVICE_EXTENSION DeviceExtension,
-                    ULONG AlarmValue)
+CmBattGetBifData(PCMBATT_DEVICE_EXTENSION DeviceExtension,
+                 PACPI_BIF_DATA BifData)
 {
     UNIMPLEMENTED;
     return STATUS_NOT_IMPLEMENTED;
@@ -86,15 +328,11 @@ CmBattSetTripPpoint(PCMBATT_DEVICE_EXTENSION DeviceExtension,
 
 NTSTATUS
 NTAPI
-CmBattSendDownStreamIrp(PDEVICE_OBJECT DeviceObject,
-                        ULONG IoControlCode,
-                        PVOID InputBuffer,
-                        ULONG InputBufferLength,
-                        PACPI_EVAL_OUTPUT_BUFFER OutputBuffer,
-                        ULONG OutputBufferLength)
+CmBattGetBstData(PCMBATT_DEVICE_EXTENSION DeviceExtension,
+                 PACPI_BST_DATA BstData)
 {
     UNIMPLEMENTED;
     return STATUS_NOT_IMPLEMENTED;
 }
-     
+
 /* EOF */