Author: cgutman
Date: Sun Oct 23 03:55:35 2011
New Revision: 54239
URL:
http://svn.reactos.org/svn/reactos?rev=54239&view=rev
Log:
[VIDEOPRT]
- Support passing a resource requirements list to VideoPortGetAccessRanges
Modified:
trunk/reactos/drivers/video/videoprt/resource.c
Modified: trunk/reactos/drivers/video/videoprt/resource.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/video/videoprt/res…
==============================================================================
--- trunk/reactos/drivers/video/videoprt/resource.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/video/videoprt/resource.c [iso-8859-1] Sun Oct 23 03:55:35 2011
@@ -559,210 +559,241 @@
IN PVOID DeviceId,
OUT PULONG Slot)
{
- PCI_SLOT_NUMBER PciSlotNumber;
- ULONG DeviceNumber;
- ULONG FunctionNumber;
- PCI_COMMON_CONFIG Config;
- PCM_RESOURCE_LIST AllocatedResources;
- NTSTATUS Status;
- UINT AssignedCount;
- 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)
- {
- AllocatedResources = DeviceExtension->AllocatedResources;
- if (AllocatedResources == NULL &&
- DeviceExtension->AdapterInterfaceType == PCIBus)
- {
- if (DeviceExtension->PhysicalDeviceObject != NULL)
- {
- PciSlotNumber.u.AsULONG = DeviceExtension->SystemIoSlotNumber;
-
- ReturnedLength = HalGetBusData(
- PCIConfiguration,
- DeviceExtension->SystemIoBusNumber,
- PciSlotNumber.u.AsULONG,
- &Config,
- sizeof(PCI_COMMON_CONFIG));
-
- if (ReturnedLength != sizeof(PCI_COMMON_CONFIG))
+ PCI_SLOT_NUMBER PciSlotNumber;
+ ULONG DeviceNumber;
+ ULONG FunctionNumber;
+ PCI_COMMON_CONFIG Config;
+ PCM_RESOURCE_LIST AllocatedResources;
+ NTSTATUS Status;
+ UINT AssignedCount;
+ 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;
+ ULONG ListSize;
+ PIO_RESOURCE_REQUIREMENTS_LIST ResReqList;
+ BOOLEAN DeviceAndVendorFound = FALSE;
+
+ TRACE_(VIDEOPRT, "VideoPortGetAccessRanges\n");
+
+ DeviceExtension = VIDEO_PORT_GET_DEVICE_EXTENSION(HwDeviceExtension);
+ DriverObject = DeviceExtension->DriverObject;
+ DriverExtension = IoGetDriverObjectExtension(DriverObject, DriverObject);
+
+ if (NumRequestedResources == 0)
+ {
+ AllocatedResources = DeviceExtension->AllocatedResources;
+ if (AllocatedResources == NULL &&
+ DeviceExtension->AdapterInterfaceType == PCIBus)
+ {
+ if (DeviceExtension->PhysicalDeviceObject != NULL)
{
- return ERROR_NOT_ENOUGH_MEMORY;
+ PciSlotNumber.u.AsULONG = DeviceExtension->SystemIoSlotNumber;
+
+ ReturnedLength = HalGetBusData(PCIConfiguration,
+ DeviceExtension->SystemIoBusNumber,
+ PciSlotNumber.u.AsULONG,
+ &Config,
+ sizeof(PCI_COMMON_CONFIG));
+
+ if (ReturnedLength != sizeof(PCI_COMMON_CONFIG))
+ {
+ return ERROR_NOT_ENOUGH_MEMORY;
+ }
}
- }
- else
- {
- VendorIdToFind = VendorId != NULL ? *(PUSHORT)VendorId : 0;
- DeviceIdToFind = DeviceId != NULL ? *(PUSHORT)DeviceId : 0;
-
- if (VendorIdToFind == 0 && DeviceIdToFind == 0)
+ else
{
- /* We're screwed */
- return ERROR_DEV_NOT_EXIST;
+ VendorIdToFind = VendorId != NULL ? *(PUSHORT)VendorId : 0;
+ DeviceIdToFind = DeviceId != NULL ? *(PUSHORT)DeviceId : 0;
+
+ if (VendorIdToFind == 0 && DeviceIdToFind == 0)
+ {
+ /* We're screwed */
+ return ERROR_DEV_NOT_EXIST;
+ }
+
+ INFO_(VIDEOPRT, "Looking for VendorId 0x%04x DeviceId
0x%04x\n",
+ VendorIdToFind, DeviceIdToFind);
+
+ /*
+ * Search for the device id and vendor id on this bus.
+ */
+ for (DeviceNumber = 0; DeviceNumber < PCI_MAX_DEVICES;
DeviceNumber++)
+ {
+ PciSlotNumber.u.bits.DeviceNumber = DeviceNumber;
+ for (FunctionNumber = 0; FunctionNumber < PCI_MAX_FUNCTION;
FunctionNumber++)
+ {
+ INFO_(VIDEOPRT, "- Function number: %d\n",
FunctionNumber);
+ PciSlotNumber.u.bits.FunctionNumber = FunctionNumber;
+ ReturnedLength = HalGetBusData(PCIConfiguration,
+
DeviceExtension->SystemIoBusNumber,
+ PciSlotNumber.u.AsULONG,
+ &Config,
+ sizeof(PCI_COMMON_CONFIG));
+ INFO_(VIDEOPRT, "- Length of data: %x\n",
ReturnedLength);
+ if (ReturnedLength == sizeof(PCI_COMMON_CONFIG))
+ {
+ INFO_(VIDEOPRT, "- Slot 0x%02x (Device %d Function %d)
VendorId 0x%04x "
+ "DeviceId 0x%04x\n",
+ PciSlotNumber.u.AsULONG,
+ PciSlotNumber.u.bits.DeviceNumber,
+ PciSlotNumber.u.bits.FunctionNumber,
+ Config.VendorID,
+ Config.DeviceID);
+
+ if ((VendorIdToFind == 0 || Config.VendorID ==
VendorIdToFind) &&
+ (DeviceIdToFind == 0 || Config.DeviceID ==
DeviceIdToFind))
+ {
+ DeviceAndVendorFound = TRUE;
+ break;
+ }
+ }
+ }
+ if (DeviceAndVendorFound) break;
+ }
+ if (FunctionNumber == PCI_MAX_FUNCTION)
+ {
+ WARN_(VIDEOPRT, "Didn't find device.\n");
+ return ERROR_DEV_NOT_EXIST;
+ }
}
-
- INFO_(VIDEOPRT, "Looking for VendorId 0x%04x DeviceId 0x%04x\n",
- VendorIdToFind, DeviceIdToFind);
-
- /*
- * Search for the device id and vendor id on this bus.
- */
- for (DeviceNumber = 0; DeviceNumber < PCI_MAX_DEVICES; DeviceNumber++)
+
+ Status = HalAssignSlotResources(&DeviceExtension->RegistryPath,
+ NULL,
+ DeviceExtension->DriverObject,
+
DeviceExtension->DriverObject->DeviceObject,
+ DeviceExtension->AdapterInterfaceType,
+ DeviceExtension->SystemIoBusNumber,
+ PciSlotNumber.u.AsULONG,
+ &AllocatedResources);
+
+ if (!NT_SUCCESS(Status))
{
- PciSlotNumber.u.bits.DeviceNumber = DeviceNumber;
- for (FunctionNumber = 0; FunctionNumber < PCI_MAX_FUNCTION;
FunctionNumber++)
- {
- INFO_(VIDEOPRT, "- Function number: %d\n", FunctionNumber);
- PciSlotNumber.u.bits.FunctionNumber = FunctionNumber;
- ReturnedLength = HalGetBusData(
- PCIConfiguration,
- DeviceExtension->SystemIoBusNumber,
- PciSlotNumber.u.AsULONG,
- &Config,
- sizeof(PCI_COMMON_CONFIG));
- INFO_(VIDEOPRT, "- Length of data: %x\n", ReturnedLength);
- if (ReturnedLength == sizeof(PCI_COMMON_CONFIG))
- {
- INFO_(VIDEOPRT, "- Slot 0x%02x (Device %d Function %d) VendorId
0x%04x "
- "DeviceId 0x%04x\n",
- PciSlotNumber.u.AsULONG,
- PciSlotNumber.u.bits.DeviceNumber,
- PciSlotNumber.u.bits.FunctionNumber,
- Config.VendorID,
- Config.DeviceID);
-
- if ((VendorIdToFind == 0 || Config.VendorID == VendorIdToFind)
&&
- (DeviceIdToFind == 0 || Config.DeviceID == DeviceIdToFind))
- {
- DeviceAndVendorFound = TRUE;
- break;
- }
- }
- }
- if (DeviceAndVendorFound) break;
+ WARN_(VIDEOPRT, "HalAssignSlotResources failed with status
%x.\n",Status);
+ return Status;
}
- if (FunctionNumber == PCI_MAX_FUNCTION)
- {
- WARN_(VIDEOPRT, "Didn't find device.\n");
- return ERROR_DEV_NOT_EXIST;
- }
- }
-
- Status = HalAssignSlotResources(
- &DeviceExtension->RegistryPath,
- NULL,
- DeviceExtension->DriverObject,
- DeviceExtension->DriverObject->DeviceObject,
- DeviceExtension->AdapterInterfaceType,
- DeviceExtension->SystemIoBusNumber,
- PciSlotNumber.u.AsULONG,
- &AllocatedResources);
-
- if (!NT_SUCCESS(Status))
- {
- WARN_(VIDEOPRT, "HalAssignSlotResources failed with status
%x.\n",Status);
+ DeviceExtension->AllocatedResources = AllocatedResources;
+ }
+ }
+ else
+ {
+ ListSize = sizeof(IO_RESOURCE_REQUIREMENTS_LIST) + (NumRequestedResources - 1) *
sizeof(IO_RESOURCE_DESCRIPTOR);
+ ResReqList = ExAllocatePool(NonPagedPool, ListSize);
+ if (!ResReqList) return ERROR_NOT_ENOUGH_MEMORY;
+
+ ResReqList->ListSize = ListSize;
+ ResReqList->InterfaceType = DeviceExtension->AdapterInterfaceType;
+ ResReqList->BusNumber = DeviceExtension->SystemIoBusNumber;
+ ResReqList->SlotNumber = DeviceExtension->SystemIoSlotNumber;
+ ResReqList->AlternativeLists = 1;
+ ResReqList->List[0].Version = 1;
+ ResReqList->List[0].Revision = 1;
+ ResReqList->List[0].Count = NumRequestedResources;
+
+ /* Copy in the caller's resource list */
+ RtlCopyMemory(ResReqList->List[0].Descriptors,
+ RequestedResources,
+ NumRequestedResources * sizeof(IO_RESOURCE_DESCRIPTOR));
+
+ Status = IoAssignResources(&DeviceExtension->RegistryPath,
+ NULL,
+ DeviceExtension->DriverObject,
+ DeviceExtension->PhysicalDeviceObject ?
+ DeviceExtension->PhysicalDeviceObject :
+ DeviceExtension->DriverObject->DeviceObject,
+ ResReqList,
+ &AllocatedResources);
+
+ if (!NT_SUCCESS(Status))
return Status;
- }
- DeviceExtension->AllocatedResources = AllocatedResources;
-
- /* Return the slot number if the caller wants it */
- if (Slot != NULL) *Slot = PciSlotNumber.u.AsULONG;
-
- }
- if (AllocatedResources == NULL)
- return ERROR_NOT_ENOUGH_MEMORY;
- 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++)
- {
- INFO_(VIDEOPRT, "InterfaceType %u BusNumber List %u Device BusNumber %u
Version %u Revision %u\n",
- FullList->InterfaceType, FullList->BusNumber,
DeviceExtension->SystemIoBusNumber, FullList->PartialResourceList.Version,
FullList->PartialResourceList.Revision);
-
- ASSERT(FullList->InterfaceType == PCIBus);
- ASSERT(FullList->BusNumber == DeviceExtension->SystemIoBusNumber);
- ASSERT(1 == FullList->PartialResourceList.Version);
- ASSERT(1 == FullList->PartialResourceList.Revision);
- for (Descriptor = FullList->PartialResourceList.PartialDescriptors;
- Descriptor < FullList->PartialResourceList.PartialDescriptors +
FullList->PartialResourceList.Count;
- Descriptor++)
- {
+
+ if (!DeviceExtension->AllocatedResources)
+ DeviceExtension->AllocatedResources = AllocatedResources;
+ }
+
+ if (AllocatedResources == NULL)
+ return ERROR_NOT_ENOUGH_MEMORY;
+
+ /* Return the slot number if the caller wants it */
+ if (Slot != NULL) *Slot = DeviceExtension->SystemIoBusNumber;
+
+ 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++)
+ {
+ INFO_(VIDEOPRT, "InterfaceType %u BusNumber List %u Device BusNumber %u
Version %u Revision %u\n",
+ FullList->InterfaceType, FullList->BusNumber,
DeviceExtension->SystemIoBusNumber, FullList->PartialResourceList.Version,
FullList->PartialResourceList.Revision);
+
+ ASSERT(FullList->InterfaceType == PCIBus);
+ ASSERT(FullList->BusNumber == DeviceExtension->SystemIoBusNumber);
+ ASSERT(1 == FullList->PartialResourceList.Version);
+ ASSERT(1 == FullList->PartialResourceList.Revision);
+ for (Descriptor = FullList->PartialResourceList.PartialDescriptors;
+ Descriptor < FullList->PartialResourceList.PartialDescriptors +
FullList->PartialResourceList.Count;
+ Descriptor++)
+ {
if ((Descriptor->Type == CmResourceTypeMemory ||
Descriptor->Type == CmResourceTypePort) &&
AssignedCount >= NumAccessRanges)
{
- WARN_(VIDEOPRT, "Too many access ranges found\n");
- return ERROR_NOT_ENOUGH_MEMORY;
+ WARN_(VIDEOPRT, "Too many access ranges found\n");
+ return ERROR_NOT_ENOUGH_MEMORY;
}
if (Descriptor->Type == CmResourceTypeMemory)
{
- INFO_(VIDEOPRT, "Memory range starting at 0x%08x length
0x%08x\n",
+ INFO_(VIDEOPRT, "Memory range starting at 0x%08x length
0x%08x\n",
Descriptor->u.Memory.Start.u.LowPart,
Descriptor->u.Memory.Length);
- AccessRanges[AssignedCount].RangeStart = Descriptor->u.Memory.Start;
- AccessRanges[AssignedCount].RangeLength = Descriptor->u.Memory.Length;
- AccessRanges[AssignedCount].RangeInIoSpace = 0;
- AccessRanges[AssignedCount].RangeVisible = 0; /* FIXME: Just guessing */
- AccessRanges[AssignedCount].RangeShareable =
- (Descriptor->ShareDisposition == CmResourceShareShared);
- AccessRanges[AssignedCount].RangePassive = 0;
- AssignedCount++;
+ AccessRanges[AssignedCount].RangeStart = Descriptor->u.Memory.Start;
+ AccessRanges[AssignedCount].RangeLength =
Descriptor->u.Memory.Length;
+ AccessRanges[AssignedCount].RangeInIoSpace = 0;
+ AccessRanges[AssignedCount].RangeVisible = 0; /* FIXME: Just guessing */
+ AccessRanges[AssignedCount].RangeShareable =
+ (Descriptor->ShareDisposition == CmResourceShareShared);
+ AccessRanges[AssignedCount].RangePassive = 0;
+ AssignedCount++;
}
else if (Descriptor->Type == CmResourceTypePort)
{
- INFO_(VIDEOPRT, "Port range starting at 0x%04x length %d\n",
+ INFO_(VIDEOPRT, "Port range starting at 0x%04x length %d\n",
Descriptor->u.Port.Start.u.LowPart,
Descriptor->u.Port.Length);
- AccessRanges[AssignedCount].RangeStart = Descriptor->u.Port.Start;
- AccessRanges[AssignedCount].RangeLength = Descriptor->u.Port.Length;
- AccessRanges[AssignedCount].RangeInIoSpace = 1;
- AccessRanges[AssignedCount].RangeVisible = 0; /* FIXME: Just guessing */
- AccessRanges[AssignedCount].RangeShareable =
- (Descriptor->ShareDisposition == CmResourceShareShared);
- AccessRanges[AssignedCount].RangePassive = 0;
- if (Descriptor->Flags & CM_RESOURCE_PORT_10_BIT_DECODE)
- AccessRanges[AssignedCount].RangePassive |=
VIDEO_RANGE_10_BIT_DECODE;
- if (Descriptor->Flags & CM_RESOURCE_PORT_PASSIVE_DECODE)
- AccessRanges[AssignedCount].RangePassive |=
VIDEO_RANGE_PASSIVE_DECODE;
- AssignedCount++;
+ AccessRanges[AssignedCount].RangeStart = Descriptor->u.Port.Start;
+ AccessRanges[AssignedCount].RangeLength = Descriptor->u.Port.Length;
+ AccessRanges[AssignedCount].RangeInIoSpace = 1;
+ AccessRanges[AssignedCount].RangeVisible = 0; /* FIXME: Just guessing */
+ AccessRanges[AssignedCount].RangeShareable =
+ (Descriptor->ShareDisposition == CmResourceShareShared);
+ AccessRanges[AssignedCount].RangePassive = 0;
+ if (Descriptor->Flags & CM_RESOURCE_PORT_10_BIT_DECODE)
+ AccessRanges[AssignedCount].RangePassive |=
VIDEO_RANGE_10_BIT_DECODE;
+ if (Descriptor->Flags & CM_RESOURCE_PORT_PASSIVE_DECODE)
+ AccessRanges[AssignedCount].RangePassive |=
VIDEO_RANGE_PASSIVE_DECODE;
+ AssignedCount++;
}
else if (Descriptor->Type == CmResourceTypeInterrupt)
{
- DeviceExtension->InterruptLevel = Descriptor->u.Interrupt.Level;
- DeviceExtension->InterruptVector = Descriptor->u.Interrupt.Vector;
- if (Descriptor->ShareDisposition == CmResourceShareShared)
- DeviceExtension->InterruptShared = TRUE;
- else
- DeviceExtension->InterruptShared = FALSE;
+ DeviceExtension->InterruptLevel = Descriptor->u.Interrupt.Level;
+ DeviceExtension->InterruptVector = Descriptor->u.Interrupt.Vector;
+ if (Descriptor->ShareDisposition == CmResourceShareShared)
+ DeviceExtension->InterruptShared = TRUE;
+ else
+ DeviceExtension->InterruptShared = FALSE;
}
- }
- }
- }
- else
- {
- UNIMPLEMENTED
- }
+ }
+ }
return NO_ERROR;
}