[HALACPI]: Implement HalpQueryResources: We take the resource requirements, find...
authorSir Richard <sir_richard@svn.reactos.org>
Fri, 2 Apr 2010 06:46:33 +0000 (06:46 +0000)
committerSir Richard <sir_richard@svn.reactos.org>
Fri, 2 Apr 2010 06:46:33 +0000 (06:46 +0000)
svn path=/trunk/; revision=46664

reactos/hal/halx86/generic/acpi/halpnpdd.c

index 26276f7..ca85188 100644 (file)
@@ -331,9 +331,95 @@ NTAPI
 HalpQueryResources(IN PDEVICE_OBJECT DeviceObject,
                    OUT PCM_RESOURCE_LIST *Resources)
 {
-    UNIMPLEMENTED;
-    while (TRUE);
-    return STATUS_NO_SUCH_DEVICE;
+    PPDO_EXTENSION DeviceExtension = DeviceObject->DeviceExtension;
+    NTSTATUS Status;
+    PCM_RESOURCE_LIST ResourceList;
+    PIO_RESOURCE_REQUIREMENTS_LIST RequirementsList;
+    PIO_RESOURCE_DESCRIPTOR Descriptor;
+    PCM_PARTIAL_RESOURCE_DESCRIPTOR PartialDesc;
+    ULONG i;
+    PAGED_CODE();
+    
+    /* Only the ACPI PDO has requirements */
+    if (DeviceExtension->PdoType == AcpiPdo)
+    {
+        /* Query ACPI requirements */
+        Status = HalpQueryAcpiResourceRequirements(&RequirementsList);
+        ASSERT(RequirementsList->AlternativeLists == 1);
+        if (!NT_SUCCESS(Status)) return Status;
+        
+        /* Allocate the resourcel ist */
+        ResourceList = ExAllocatePoolWithTag(PagedPool,
+                                             sizeof(CM_RESOURCE_LIST),
+                                             ' laH');
+        if (!ResourceList )
+        {
+            /* Fail, no memory */
+            Status = STATUS_INSUFFICIENT_RESOURCES;
+            ExFreePoolWithTag(RequirementsList, 0);
+            return Status;
+        }
+        
+        /* Initialize it */
+        RtlZeroMemory(ResourceList, sizeof(CM_RESOURCE_LIST));
+        ResourceList->Count = 1;
+
+        /* Setup the list fields */
+        ResourceList->List[0].BusNumber = -1;
+        ResourceList->List[0].InterfaceType = PNPBus;
+        ResourceList->List[0].PartialResourceList.Version = 1;
+        ResourceList->List[0].PartialResourceList.Revision = 1;
+        ResourceList->List[0].PartialResourceList.Count = 1;
+
+        /* Setup the first descriptor */
+        PartialDesc = ResourceList->List[0].PartialResourceList.PartialDescriptors;
+        PartialDesc->Type = CmResourceTypeInterrupt;
+
+        /* Find the requirement descriptor for the SCI */
+        for (i = 0; i < RequirementsList->List[0].Count; i++)
+        {
+            /* Get this descriptor */
+            Descriptor = &RequirementsList->List[0].Descriptors[i];
+            if (Descriptor->Type == CmResourceTypeInterrupt) break;
+            Descriptor = NULL;
+        }
+        
+        /* Make sure we found the descriptor */
+        if (Descriptor)
+        { 
+            /* Copy requirements descriptor into resource descriptor */
+            PartialDesc->ShareDisposition = Descriptor->ShareDisposition;
+            PartialDesc->Flags = Descriptor->Flags;
+            ASSERT(Descriptor->u.Interrupt.MinimumVector ==
+                   Descriptor->u.Interrupt.MaximumVector);
+            PartialDesc->u.Interrupt.Vector = Descriptor->u.Interrupt.MinimumVector;
+            PartialDesc->u.Interrupt.Level = Descriptor->u.Interrupt.MinimumVector;
+            PartialDesc->u.Interrupt.Affinity = 0xFFFFFFFF;
+            
+            /* Return resources and success */
+            *Resources = ResourceList;
+            ExFreePoolWithTag(RequirementsList, 0);
+            return STATUS_SUCCESS;
+        }
+        
+        /* Free memory and fail */
+        ExFreePoolWithTag(RequirementsList, 0);
+        ExFreePoolWithTag(ResourceList, 0);
+        Status = STATUS_NOT_FOUND;
+    }
+    else if (DeviceExtension->PdoType == WdPdo)
+    {
+        /* Watchdog doesn't */
+        return STATUS_NOT_SUPPORTED;    
+    }
+    else
+    {
+        /* This shouldn't happen */
+        return STATUS_UNSUCCESSFUL;
+    }
+    
+    /* Return the status */
+    return Status;
 }
 
 NTSTATUS