Author: cgutman
Date: Sun Oct 23 02:45:09 2011
New Revision: 54237

URL: http://svn.reactos.org/svn/reactos?rev=54237&view=rev
Log:
[VIDEOPRT]
- Report legacy resources to the PnP manager via 
IRP_MN_FILTER_RESOURCE_REQUIREMENTS
- Report legacy access ranges in response to VideoPortGetAccessRanges
- TODO: Handle an optional resource requirements list in 
VideoPortGetAccessRanges

Modified:
    trunk/reactos/drivers/video/videoprt/dispatch.c
    trunk/reactos/drivers/video/videoprt/resource.c
    trunk/reactos/drivers/video/videoprt/videoprt.h

Modified: trunk/reactos/drivers/video/videoprt/dispatch.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/video/videoprt/dispatch.c?rev=54237&r1=54236&r2=54237&view=diff
==============================================================================
--- trunk/reactos/drivers/video/videoprt/dispatch.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/video/videoprt/dispatch.c [iso-8859-1] Sun Oct 23 
02:45:09 2011
@@ -304,7 +304,6 @@
 
    return nErrCode;
 }
-
 
 NTSTATUS NTAPI
 IntVideoPortPnPStartDevice(
@@ -456,6 +455,14 @@
          IoCompleteRequest(Irp, IO_NO_INCREMENT);
          break;
 
+       case IRP_MN_FILTER_RESOURCE_REQUIREMENTS:
+         Status = IntVideoPortForwardIrpAndWait(DeviceObject, Irp);
+         if (NT_SUCCESS(Status) && NT_SUCCESS(Irp->IoStatus.Status))
+             Status = IntVideoPortFilterResourceRequirements(DeviceObject, 
Irp);
+         Irp->IoStatus.Status = Status;
+         Irp->IoStatus.Information = 0;
+         IoCompleteRequest(Irp, IO_NO_INCREMENT);
+         break;
 
       case IRP_MN_REMOVE_DEVICE:
       case IRP_MN_QUERY_REMOVE_DEVICE:

Modified: trunk/reactos/drivers/video/videoprt/resource.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/video/videoprt/resource.c?rev=54237&r1=54236&r2=54237&view=diff
==============================================================================
--- trunk/reactos/drivers/video/videoprt/resource.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/video/videoprt/resource.c [iso-8859-1] Sun Oct 23 
02:45:09 2011
@@ -22,6 +22,166 @@
 #include "videoprt.h"
 
 /* PRIVATE FUNCTIONS 
**********************************************************/
+
+NTSTATUS NTAPI
+IntVideoPortGetLegacyResources(
+    IN PVIDEO_PORT_DRIVER_EXTENSION DriverExtension,
+    IN PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension,
+    OUT PVIDEO_ACCESS_RANGE *AccessRanges,
+    OUT PULONG AccessRangeCount)
+{
+    PCI_COMMON_CONFIG PciConfig;
+    ULONG ReadLength;
+    
+    if (!DriverExtension->InitializationData.HwGetLegacyResources &&
+        !DriverExtension->InitializationData.HwLegacyResourceCount)
+    {
+        /* No legacy resources to report */
+        *AccessRangeCount = 0;
+        return STATUS_SUCCESS;
+    }
+    
+    if (DriverExtension->InitializationData.HwGetLegacyResources)
+    {
+        ReadLength = HalGetBusData(PCIConfiguration,
+                                   DeviceExtension->SystemIoBusNumber,
+                                   DeviceExtension->SystemIoSlotNumber,
+                                   &PciConfig,
+                                   sizeof(PciConfig));
+        if (ReadLength != sizeof(PciConfig))
+        {
+            /* This device doesn't exist */
+            return STATUS_NO_SUCH_DEVICE;
+        }
+        
+        
DriverExtension->InitializationData.HwGetLegacyResources(PciConfig.VendorID,
+                                                                 
PciConfig.DeviceID,
+                                                                 AccessRanges,
+                                                                 
AccessRangeCount);
+    }
+    else
+    {
+        *AccessRanges = 
DriverExtension->InitializationData.HwLegacyResourceList;
+        *AccessRangeCount = 
DriverExtension->InitializationData.HwLegacyResourceCount;
+    }
+    
+    return STATUS_SUCCESS;
+}
+
+NTSTATUS NTAPI
+IntVideoPortFilterResourceRequirements(
+    IN PDEVICE_OBJECT DeviceObject,
+    IN PIRP Irp)
+{
+    PDRIVER_OBJECT DriverObject;
+    PVIDEO_PORT_DRIVER_EXTENSION DriverExtension;
+    PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension;
+    PVIDEO_ACCESS_RANGE AccessRanges;
+    ULONG AccessRangeCount, ListSize, i;
+    PIO_RESOURCE_REQUIREMENTS_LIST ResList, OldResList = 
(PVOID)Irp->IoStatus.Information;
+    PIO_RESOURCE_DESCRIPTOR CurrentDescriptor;
+    NTSTATUS Status;
+
+    DriverObject = DeviceObject->DriverObject;
+    DriverExtension = IoGetDriverObjectExtension(DriverObject, DriverObject);
+    DeviceExtension = 
(PVIDEO_PORT_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
+
+    Status = IntVideoPortGetLegacyResources(DriverExtension, DeviceExtension, 
&AccessRanges, &AccessRangeCount);
+    if (!NT_SUCCESS(Status))
+        return Status;
+    if (!AccessRangeCount)
+    {
+        /* No legacy resources to report */
+        return Irp->IoStatus.Information;
+    }
+
+    /* OK, we've got the access ranges now. Let's set up the resource 
requirements list */
+
+    if (OldResList)
+    {
+        /* Already one there so let's add to it */
+        ListSize = OldResList->ListSize + sizeof(IO_RESOURCE_DESCRIPTOR) * 
AccessRangeCount;
+        ResList = ExAllocatePool(NonPagedPool,
+                                 ListSize);
+        if (!ResList) return STATUS_NO_MEMORY;
+        
+        RtlCopyMemory(ResList, OldResList, OldResList->ListSize);
+        
+        ASSERT(ResList->AlternativeLists == 1);
+        
+        ResList->ListSize = ListSize;
+        ResList->List[0].Count += AccessRangeCount;
+        
+        CurrentDescriptor = (PIO_RESOURCE_DESCRIPTOR)((PUCHAR)ResList + 
OldResList->ListSize);
+        
+        ExFreePool(OldResList);
+        Irp->IoStatus.Information = 0;
+    }
+    else
+    {
+        /* We need to make a new one */
+        ListSize = sizeof(IO_RESOURCE_REQUIREMENTS_LIST) + 
sizeof(IO_RESOURCE_DESCRIPTOR) * (AccessRangeCount - 1);
+        ResList = ExAllocatePool(NonPagedPool,
+                                 ListSize);
+        if (!ResList) return STATUS_NO_MEMORY;
+        
+        RtlZeroMemory(ResList, ListSize);
+        
+        /* We need to initialize some fields */
+        ResList->ListSize = ListSize;
+        ResList->InterfaceType = DeviceExtension->AdapterInterfaceType;
+        ResList->BusNumber = DeviceExtension->SystemIoBusNumber;
+        ResList->SlotNumber = DeviceExtension->SystemIoSlotNumber;
+        ResList->AlternativeLists = 1;
+        ResList->List[0].Version = 1;
+        ResList->List[0].Revision = 1;
+        ResList->List[0].Count = AccessRangeCount;
+        
+        CurrentDescriptor = ResList->List[0].Descriptors;
+    }
+
+    for (i = 0; i < AccessRangeCount; i++)
+    {
+        /* This is a required resource */
+        CurrentDescriptor->Option = 0;
+        
+        if (AccessRanges[i].RangeInIoSpace)
+            CurrentDescriptor->Type = CmResourceTypePort;
+        else
+            CurrentDescriptor->Type = CmResourceTypeMemory;
+        
+        CurrentDescriptor->ShareDisposition =
+        (AccessRanges[i].RangeShareable ? CmResourceShareShared : 
CmResourceShareDeviceExclusive);
+        
+        CurrentDescriptor->Flags = 0;
+        
+        if (CurrentDescriptor->Type == CmResourceTypePort)
+        {
+            CurrentDescriptor->u.Port.Length = AccessRanges[i].RangeLength;
+            CurrentDescriptor->u.Port.MinimumAddress =
+            CurrentDescriptor->u.Port.MaximumAddress = 
AccessRanges[i].RangeStart;
+            CurrentDescriptor->u.Port.Alignment = 1;
+            if (AccessRanges[i].RangePassive & VIDEO_RANGE_PASSIVE_DECODE)
+                CurrentDescriptor->Flags |= CM_RESOURCE_PORT_PASSIVE_DECODE;
+            if (AccessRanges[i].RangePassive & VIDEO_RANGE_10_BIT_DECODE)
+                CurrentDescriptor->Flags |= CM_RESOURCE_PORT_10_BIT_DECODE;
+        }
+        else
+        {
+            CurrentDescriptor->u.Memory.Length = AccessRanges[i].RangeLength;
+            CurrentDescriptor->u.Memory.MinimumAddress =
+            CurrentDescriptor->u.Memory.MaximumAddress = 
AccessRanges[i].RangeStart;
+            CurrentDescriptor->u.Memory.Alignment = 1;
+            CurrentDescriptor->Flags |= CM_RESOURCE_MEMORY_READ_WRITE;
+        }
+        
+        CurrentDescriptor++;
+    }
+
+    Irp->IoStatus.Information = (ULONG_PTR)ResList;
+
+    return STATUS_SUCCESS;
+}
 
 NTSTATUS NTAPI
 IntVideoPortMapPhysicalMemory(
@@ -409,14 +569,20 @@
    CM_FULL_RESOURCE_DESCRIPTOR *FullList;
    CM_PARTIAL_RESOURCE_DESCRIPTOR *Descriptor;
    PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension;
+   PVIDEO_PORT_DRIVER_EXTENSION DriverExtension;
    USHORT VendorIdToFind;
    USHORT DeviceIdToFind;
    ULONG ReturnedLength;
+   PVIDEO_ACCESS_RANGE LegacyAccessRanges;
+   ULONG LegacyAccessRangeCount;
+   PDRIVER_OBJECT DriverObject;
    BOOLEAN DeviceAndVendorFound = FALSE;
 
    TRACE_(VIDEOPRT, "VideoPortGetAccessRanges\n");
 
    DeviceExtension = VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension);
+   DriverObject = DeviceExtension->DriverObject;
+   DriverExtension = IoGetDriverObjectExtension(DriverObject, DriverObject);
 
    if (NumRequestedResources == 0)
    {
@@ -521,7 +687,14 @@
       }
       if (AllocatedResources == NULL)
          return ERROR_NOT_ENOUGH_MEMORY;
-      AssignedCount = 0;
+      Status = IntVideoPortGetLegacyResources(DriverExtension, DeviceExtension,
+                                              &LegacyAccessRanges, 
&LegacyAccessRangeCount);
+      if (!NT_SUCCESS(Status))
+          return ERROR_DEV_NOT_EXIST;
+      if (NumAccessRanges < LegacyAccessRangeCount)
+          return ERROR_NOT_ENOUGH_MEMORY;
+      RtlCopyMemory(AccessRanges, LegacyAccessRanges, LegacyAccessRangeCount * 
sizeof(VIDEO_ACCESS_RANGE));
+      AssignedCount = LegacyAccessRangeCount;
       for (FullList = AllocatedResources->List;
            FullList < AllocatedResources->List + AllocatedResources->Count;
            FullList++)

Modified: trunk/reactos/drivers/video/videoprt/videoprt.h
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/video/videoprt/videoprt.h?rev=54237&r1=54236&r2=54237&view=diff
==============================================================================
--- trunk/reactos/drivers/video/videoprt/videoprt.h [iso-8859-1] (original)
+++ trunk/reactos/drivers/video/videoprt/videoprt.h [iso-8859-1] Sun Oct 23 
02:45:09 2011
@@ -198,6 +198,11 @@
 /* resource.c */
 
 NTSTATUS NTAPI
+IntVideoPortFilterResourceRequirements(
+   IN PDEVICE_OBJECT DeviceObject,
+   IN PIRP Irp);
+
+NTSTATUS NTAPI
 IntVideoPortMapPhysicalMemory(
    IN HANDLE Process,
    IN PHYSICAL_ADDRESS PhysicalAddress,


Reply via email to