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/disp... ============================================================================== --- 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/reso... ============================================================================== --- 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/vide... ============================================================================== --- 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,