[ros-diffs] [sir_richard] 46663: [HALACPI]: Implement querying HALACPI resource requirements. If it exists, the SCI Vector is added to the list as a requirement.

sir_richard at svn.reactos.org sir_richard at svn.reactos.org
Fri Apr 2 08:28:43 CEST 2010


Author: sir_richard
Date: Fri Apr  2 08:28:43 2010
New Revision: 46663

URL: http://svn.reactos.org/svn/reactos?rev=46663&view=rev
Log:
[HALACPI]: Implement querying HALACPI resource requirements. If it exists, the SCI Vector is added to the list as a requirement.

Modified:
    trunk/reactos/hal/halx86/generic/acpi/halacpi.c
    trunk/reactos/hal/halx86/generic/acpi/halpnpdd.c
    trunk/reactos/hal/halx86/include/halp.h

Modified: trunk/reactos/hal/halx86/generic/acpi/halacpi.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/hal/halx86/generic/acpi/halacpi.c?rev=46663&r1=46662&r2=46663&view=diff
==============================================================================
--- trunk/reactos/hal/halx86/generic/acpi/halacpi.c [iso-8859-1] (original)
+++ trunk/reactos/hal/halx86/generic/acpi/halacpi.c [iso-8859-1] Fri Apr  2 08:28:43 2010
@@ -36,6 +36,8 @@
 LIST_ENTRY HalpAcpiTableMatchList;
 
 ULONG HalpInvalidAcpiTable;
+
+ULONG HalpPicVectorRedirect[] = {0, 1, 2, 3, 4, 5, 6, 7, 9, 10, 11, 12, 13, 14, 15};
 
 /* This determines the HAL type */
 BOOLEAN HalDisableFirmwareMapper = TRUE;
@@ -900,6 +902,98 @@
     return CM_RESOURCE_PORT_16_BIT_DECODE;
 }
 
+VOID
+NTAPI
+HalpAcpiDetectResourceListSize(OUT PULONG ListSize)
+{
+    PAGED_CODE();
+    
+    /* One element if there is a SCI */
+    *ListSize = HalpFixedAcpiDescTable.sci_int_vector ? 1: 0;
+}
+
+NTSTATUS
+NTAPI
+HalpBuildAcpiResourceList(IN PIO_RESOURCE_REQUIREMENTS_LIST ResourceList)
+{
+    ULONG Interrupt;
+    PAGED_CODE();
+    ASSERT(ResourceList != NULL);
+
+    /* Initialize the list */
+    ResourceList->BusNumber = -1;
+    ResourceList->AlternativeLists = 1;
+    ResourceList->InterfaceType = PNPBus;
+    ResourceList->List[0].Version = 1;
+    ResourceList->List[0].Revision = 1;
+    
+    /* Is there a SCI? */
+    if (HalpFixedAcpiDescTable.sci_int_vector)
+    {
+        /* Fill out the entry for it */
+        ResourceList->List[0].Descriptors[0].Flags = CM_RESOURCE_INTERRUPT_LEVEL_SENSITIVE;
+        ResourceList->List[0].Descriptors[0].Type = CmResourceTypeInterrupt;
+        ResourceList->List[0].Descriptors[0].ShareDisposition = CmResourceShareShared;
+        
+        /* Get the interrupt number */
+        Interrupt = HalpPicVectorRedirect[HalpFixedAcpiDescTable.sci_int_vector];
+        ResourceList->List[0].Descriptors[0].u.Interrupt.MinimumVector = Interrupt;
+        ResourceList->List[0].Descriptors[0].u.Interrupt.MaximumVector = Interrupt;
+        
+        /* One more */
+        ++ResourceList->List[0].Count;
+    }
+    
+    /* All good */
+    return STATUS_SUCCESS;
+}
+
+NTSTATUS
+NTAPI
+HalpQueryAcpiResourceRequirements(OUT PIO_RESOURCE_REQUIREMENTS_LIST *Requirements)
+{
+    PIO_RESOURCE_REQUIREMENTS_LIST RequirementsList;
+    ULONG Count = 0, ListSize;
+    NTSTATUS Status;
+    PAGED_CODE();
+  
+    /* Get ACPI resources */
+    HalpAcpiDetectResourceListSize(&Count);
+    
+    /* Compute size of the list and allocate it */
+    ListSize = sizeof(IO_RESOURCE_LIST) * (Count - 1) +
+               sizeof(IO_RESOURCE_REQUIREMENTS_LIST);
+    RequirementsList = ExAllocatePoolWithTag(PagedPool, ListSize, ' laH');
+    if (RequirementsList)
+    {
+        /* Initialize it */
+        RtlZeroMemory(RequirementsList, ListSize);
+        RequirementsList->ListSize = ListSize;
+        
+        /* Build it */
+        Status = HalpBuildAcpiResourceList(RequirementsList);
+        if (NT_SUCCESS(Status))
+        {
+            /* It worked, return it */
+            *Requirements = RequirementsList;
+        }
+        else
+        {
+            /* Fail */
+            ExFreePoolWithTag(RequirementsList, 0);
+            Status = STATUS_NO_SUCH_DEVICE;
+        }
+    }
+    else
+    {
+        /* Not enough memory */
+        Status = STATUS_INSUFFICIENT_RESOURCES;
+    }
+    
+    /* Return the status */
+    return Status;
+}
+
 /*
  * @implemented
  */

Modified: trunk/reactos/hal/halx86/generic/acpi/halpnpdd.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/hal/halx86/generic/acpi/halpnpdd.c?rev=46663&r1=46662&r2=46663&view=diff
==============================================================================
--- trunk/reactos/hal/halx86/generic/acpi/halpnpdd.c [iso-8859-1] (original)
+++ trunk/reactos/hal/halx86/generic/acpi/halpnpdd.c [iso-8859-1] Fri Apr  2 08:28:43 2010
@@ -341,9 +341,29 @@
 HalpQueryResourceRequirements(IN PDEVICE_OBJECT DeviceObject,
                               OUT PIO_RESOURCE_REQUIREMENTS_LIST *Requirements)
 {
-    UNIMPLEMENTED;
-    while (TRUE);
-    return STATUS_NO_SUCH_DEVICE;
+    PPDO_EXTENSION DeviceExtension = DeviceObject->DeviceExtension;
+    NTSTATUS Status;
+    PAGED_CODE();
+    
+    /* Only the ACPI PDO has requirements */
+    if (DeviceExtension->PdoType == AcpiPdo)
+    {
+        /* Query ACPI requirements */
+        Status = HalpQueryAcpiResourceRequirements(Requirements);
+    }
+    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

Modified: trunk/reactos/hal/halx86/include/halp.h
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/hal/halx86/include/halp.h?rev=46663&r1=46662&r2=46663&view=diff
==============================================================================
--- trunk/reactos/hal/halx86/include/halp.h [iso-8859-1] (original)
+++ trunk/reactos/hal/halx86/include/halp.h [iso-8859-1] Fri Apr  2 08:28:43 2010
@@ -751,6 +751,12 @@
     VOID
 );
 
+NTSTATUS
+NTAPI
+HalpQueryAcpiResourceRequirements(
+    OUT PIO_RESOURCE_REQUIREMENTS_LIST *Requirements
+);
+
 VOID
 FASTCALL
 KeUpdateSystemTime(




More information about the Ros-diffs mailing list