Just make pcix work already
Best regards, Alex Ionescu
On Sat, Feb 28, 2015 at 11:52 PM, cgutman@svn.reactos.org wrote:
Author: cgutman Date: Sun Mar 1 07:52:32 2015 New Revision: 66511
URL: http://svn.reactos.org/svn/reactos?rev=66511&view=rev Log: [PCI]
- Handle 64-bit PCI base address registers (BARs)
- Fix maximum address in resource requirements for 20-bit resources
- Fix flags on memory and I/O port resources
[NTOS]
- Fix handling of 64-bit resources
Modified: trunk/reactos/drivers/bus/pci/pdo.c trunk/reactos/ntoskrnl/io/pnpmgr/pnpres.c
Modified: trunk/reactos/drivers/bus/pci/pdo.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/bus/pci/pdo.c?rev=6...
============================================================================== --- trunk/reactos/drivers/bus/pci/pdo.c [iso-8859-1] (original) +++ trunk/reactos/drivers/bus/pci/pdo.c [iso-8859-1] Sun Mar 1 07:52:32 2015 @@ -21,6 +21,9 @@ #define DBGPRINT(...) #endif
+#define PCI_ADDRESS_MEMORY_ADDRESS_MASK_64 0xfffffffffffffff0ull +#define PCI_ADDRESS_IO_ADDRESS_MASK_64 0xfffffffffffffffcull
/*** PRIVATE *****************************************************************/
static NTSTATUS @@ -191,80 +194,159 @@ return STATUS_SUCCESS; }
+static BOOLEAN +PdoReadPciBar(PPDO_DEVICE_EXTENSION DeviceExtension,
ULONG Offset,PULONG OriginalValue,PULONG NewValue)+{
- ULONG Size;
- ULONG AllOnes;
- /* Read the original value */
- Size = HalGetBusDataByOffset(PCIConfiguration,
DeviceExtension->PciDevice->BusNumber,DeviceExtension->PciDevice->SlotNumber.u.AsULONG,
OriginalValue,Offset,sizeof(ULONG));- if (Size != sizeof(ULONG))
- {
DPRINT1("Wrong size %lu\n", Size);return FALSE;- }
- /* Write all ones to determine which bits are held to zero */
- AllOnes = MAXULONG;
- Size = HalSetBusDataByOffset(PCIConfiguration,
DeviceExtension->PciDevice->BusNumber,DeviceExtension->PciDevice->SlotNumber.u.AsULONG,
&AllOnes,Offset,sizeof(ULONG));- if (Size != sizeof(ULONG))
- {
DPRINT1("Wrong size %lu\n", Size);return FALSE;- }
- /* Get the range length */
- Size = HalGetBusDataByOffset(PCIConfiguration,
DeviceExtension->PciDevice->BusNumber,DeviceExtension->PciDevice->SlotNumber.u.AsULONG,
NewValue,Offset,sizeof(ULONG));- if (Size != sizeof(ULONG))
- {
DPRINT1("Wrong size %lu\n", Size);return FALSE;- }
- /* Restore original value */
- Size = HalSetBusDataByOffset(PCIConfiguration,
DeviceExtension->PciDevice->BusNumber,DeviceExtension->PciDevice->SlotNumber.u.AsULONG,
OriginalValue,Offset,sizeof(ULONG));- if (Size != sizeof(ULONG))
- {
DPRINT1("Wrong size %lu\n", Size);return FALSE;- }
- return TRUE;
+}
static BOOLEAN PdoGetRangeLength(PPDO_DEVICE_EXTENSION DeviceExtension,
ULONG Offset,PULONG Base,PULONG Length,PULONG Flags)-{
- ULONG OrigValue;
- ULONG BaseValue;
- ULONG NewValue;
- ULONG Size;
- ULONG XLength;
- /* Save original value */
- Size= HalGetBusDataByOffset(PCIConfiguration,
DeviceExtension->PciDevice->BusNumber,DeviceExtension->PciDevice->SlotNumber.u.AsULONG,
&OrigValue,Offset,sizeof(ULONG));- if (Size != sizeof(ULONG))
- {
DPRINT1("Wrong size %lu\n", Size);
UCHAR Bar,PULONGLONG Base,PULONGLONG Length,PULONG Flags,PUCHAR NextBar,PULONGLONG MaximumAddress)+{
- union {
struct {ULONG Bar0;ULONG Bar1;} Bars;ULONGLONG Bar;- } OriginalValue;
- union {
struct {ULONG Bar0;ULONG Bar1;} Bars;ULONGLONG Bar;- } NewValue;
- ULONG Offset;
- /* Compute the offset of this BAR in PCI config space */
- Offset = 0x10 + Bar * 4;
- /* Assume this is a 32-bit BAR until we find wrong */
- *NextBar = Bar + 1;
- /* Initialize BAR values to zero */
- OriginalValue.Bar = 0ULL;
- NewValue.Bar = 0ULL;
- /* Read the first BAR */
- if (!PdoReadPciBar(DeviceExtension, Offset,
&OriginalValue.Bars.Bar0,&NewValue.Bars.Bar0))- { return FALSE; }
- BaseValue = (OrigValue & PCI_ADDRESS_IO_SPACE)
? (OrigValue & PCI_ADDRESS_IO_ADDRESS_MASK): (OrigValue & PCI_ADDRESS_MEMORY_ADDRESS_MASK);- *Base = BaseValue;
- /* Set magic value */
- NewValue = MAXULONG;
- Size= HalSetBusDataByOffset(PCIConfiguration,
DeviceExtension->PciDevice->BusNumber,DeviceExtension->PciDevice->SlotNumber.u.AsULONG,
&NewValue,Offset,sizeof(ULONG));- if (Size != sizeof(ULONG))
- {
DPRINT1("Wrong size %lu\n", Size);return FALSE;- }
- /* Get the range length */
- Size= HalGetBusDataByOffset(PCIConfiguration,
DeviceExtension->PciDevice->BusNumber,DeviceExtension->PciDevice->SlotNumber.u.AsULONG,
&NewValue,Offset,sizeof(ULONG));- if (Size != sizeof(ULONG))
- {
DPRINT1("Wrong size %lu\n", Size);return FALSE;- }
- /* Restore original value */
- Size= HalSetBusDataByOffset(PCIConfiguration,
DeviceExtension->PciDevice->BusNumber,DeviceExtension->PciDevice->SlotNumber.u.AsULONG,
&OrigValue,Offset,sizeof(ULONG));- if (Size != sizeof(ULONG))
- {
DPRINT1("Wrong size %lu\n", Size);return FALSE;- }
- if (NewValue == 0)
- /* Check if this is a memory BAR */
- if (!(OriginalValue.Bars.Bar0 & PCI_ADDRESS_IO_SPACE))
- {
/* Write the maximum address if the caller asked for it */if (MaximumAddress != NULL){if ((OriginalValue.Bars.Bar0 & PCI_ADDRESS_MEMORY_TYPE_MASK)== PCI_TYPE_32BIT)
{*MaximumAddress = 0x00000000FFFFFFFFULL;}else if ((OriginalValue.Bars.Bar0 &PCI_ADDRESS_MEMORY_TYPE_MASK) == PCI_TYPE_20BIT)
{*MaximumAddress = 0x00000000000FFFFFULL;}else if ((OriginalValue.Bars.Bar0 &PCI_ADDRESS_MEMORY_TYPE_MASK) == PCI_TYPE_64BIT)
{*MaximumAddress = 0xFFFFFFFFFFFFFFFFULL;}}/* Check if this is a 64-bit BAR */if ((OriginalValue.Bars.Bar0 & PCI_ADDRESS_MEMORY_TYPE_MASK) ==PCI_TYPE_64BIT)
{/* We've now consumed the next BAR too */*NextBar = Bar + 2;/* Read the next BAR */if (!PdoReadPciBar(DeviceExtension, Offset + 4,&OriginalValue.Bars.Bar1,&NewValue.Bars.Bar1)){return FALSE;}}- }
- else
- {
/* Write the maximum I/O port address */if (MaximumAddress != NULL){*MaximumAddress = 0x00000000FFFFFFFFULL;}- }
- if (NewValue.Bar == 0) { DPRINT("Unused address register\n"); *Base = 0;
@@ -272,48 +354,16 @@ *Flags = 0; return TRUE; }
- XLength = ~((NewValue & PCI_ADDRESS_IO_SPACE)
? (NewValue & PCI_ADDRESS_IO_ADDRESS_MASK): (NewValue & PCI_ADDRESS_MEMORY_ADDRESS_MASK)) + 1;-#if 0
- DbgPrint("BaseAddress 0x%08lx Length 0x%08lx",
BaseValue, XLength);- if (NewValue & PCI_ADDRESS_IO_SPACE)
- {
DbgPrint(" IO range");- }
- else
- {
DbgPrint(" Memory range");if ((NewValue & PCI_ADDRESS_MEMORY_TYPE_MASK) == 0){DbgPrint(" in 32-Bit address space");}else if ((NewValue & PCI_ADDRESS_MEMORY_TYPE_MASK) == 2){DbgPrint(" below 1BM ");}else if ((NewValue & PCI_ADDRESS_MEMORY_TYPE_MASK) == 4){DbgPrint(" in 64-Bit address space");}if (NewValue & PCI_ADDRESS_MEMORY_PREFETCHABLE){DbgPrint(" prefetchable");}- }
- DbgPrint("\n");
-#endif
- *Length = XLength;
- *Flags = (NewValue & PCI_ADDRESS_IO_SPACE)
? (NewValue & ~PCI_ADDRESS_IO_ADDRESS_MASK): (NewValue & ~PCI_ADDRESS_MEMORY_ADDRESS_MASK);
- *Base = OriginalValue.Bar & PCI_ADDRESS_MEMORY_ADDRESS_MASK_64;
- *Length = ~((NewValue.Bar & PCI_ADDRESS_IO_SPACE)
? (NewValue.Bar & PCI_ADDRESS_IO_ADDRESS_MASK_64): (NewValue.Bar & PCI_ADDRESS_MEMORY_ADDRESS_MASK_64)) +1;
*Flags = (NewValue.Bar & PCI_ADDRESS_IO_SPACE)
? (NewValue.Bar & ~PCI_ADDRESS_IO_ADDRESS_MASK_64): (NewValue.Bar & ~PCI_ADDRESS_MEMORY_ADDRESS_MASK_64);return TRUE;
} @@ -332,10 +382,11 @@ ULONG Size; ULONG ResCount = 0; ULONG ListSize;
- ULONG i;
- ULONG Base;
- ULONG Length;
UCHAR Bar;
ULONGLONG Base;
ULONGLONG Length; ULONG Flags;
ULONGLONG MaximumAddress;
UNREFERENCED_PARAMETER(IrpSp); DPRINT("PdoQueryResourceRequirements() called\n");
@@ -361,13 +412,15 @@ ResCount = 0; if (PCI_CONFIGURATION_TYPE(&PciConfig) == PCI_DEVICE_TYPE) {
for (i = 0; i < PCI_TYPE0_ADDRESSES; i++)
for (Bar = 0; Bar < PCI_TYPE0_ADDRESSES;) { if (!PdoGetRangeLength(DeviceExtension,
0x10 + i * 4,
Bar, &Base, &Length,
&Flags))
&Flags,&Bar,NULL)) break; if (Length != 0)@@ -381,13 +434,15 @@ } else if (PCI_CONFIGURATION_TYPE(&PciConfig) == PCI_BRIDGE_TYPE) {
for (i = 0; i < PCI_TYPE1_ADDRESSES; i++)
for (Bar = 0; Bar < PCI_TYPE1_ADDRESSES;) { if (!PdoGetRangeLength(DeviceExtension,
0x10 + i * 4,
Bar, &Base, &Length,
&Flags))
&Flags,&Bar,NULL)) break; if (Length != 0)@@ -442,13 +497,15 @@ Descriptor = &ResourceList->List[0].Descriptors[0]; if (PCI_CONFIGURATION_TYPE(&PciConfig) == PCI_DEVICE_TYPE) {
for (i = 0; i < PCI_TYPE0_ADDRESSES; i++)
for (Bar = 0; Bar < PCI_TYPE0_ADDRESSES;) { if (!PdoGetRangeLength(DeviceExtension,
0x10 + i * 4,
Bar, &Base, &Length,
&Flags))
&Flags,&Bar,&MaximumAddress)) { DPRINT1("PdoGetRangeLength() failed\n"); break;@@ -472,19 +529,20 @@
Descriptor->u.Port.Length = Length; Descriptor->u.Port.Alignment = 1;
Descriptor->u.Port.MinimumAddress.QuadPart =(ULONGLONG)Base;
Descriptor->u.Port.MaximumAddress.QuadPart =(ULONGLONG)(Base + Length - 1);
Descriptor->u.Port.MinimumAddress.QuadPart = Base;Descriptor->u.Port.MaximumAddress.QuadPart = Base +Length - 1; } else { Descriptor->Type = CmResourceTypeMemory; Descriptor->ShareDisposition = CmResourceShareDeviceExclusive;
Descriptor->Flags = CM_RESOURCE_MEMORY_READ_WRITE;
Descriptor->Flags = CM_RESOURCE_MEMORY_READ_WRITE |(Flags & PCI_ADDRESS_MEMORY_PREFETCHABLE) ?CM_RESOURCE_MEMORY_PREFETCHABLE : 0;
Descriptor->u.Memory.Length = Length; Descriptor->u.Memory.Alignment = 1;
Descriptor->u.Memory.MinimumAddress.QuadPart =(ULONGLONG)Base;
Descriptor->u.Memory.MaximumAddress.QuadPart =(ULONGLONG)(Base + Length - 1);
Descriptor->u.Memory.MinimumAddress.QuadPart = Base;Descriptor->u.Memory.MaximumAddress.QuadPart = Base +Length - 1; } Descriptor++;
@@ -500,19 +558,20 @@
Descriptor->u.Port.Length = Length; Descriptor->u.Port.Alignment = Length;
Descriptor->u.Port.MinimumAddress.QuadPart = (ULONGLONG)0;Descriptor->u.Port.MaximumAddress.QuadPart =(ULONGLONG)0x00000000FFFFFFFF;
Descriptor->u.Port.MinimumAddress.QuadPart = 0;Descriptor->u.Port.MaximumAddress.QuadPart =MaximumAddress; } else { Descriptor->Type = CmResourceTypeMemory; Descriptor->ShareDisposition = CmResourceShareDeviceExclusive;
Descriptor->Flags = CM_RESOURCE_MEMORY_READ_WRITE;
Descriptor->Flags = CM_RESOURCE_MEMORY_READ_WRITE |(Flags & PCI_ADDRESS_MEMORY_PREFETCHABLE) ?CM_RESOURCE_MEMORY_PREFETCHABLE : 0;
Descriptor->u.Memory.Length = Length; Descriptor->u.Memory.Alignment = Length;
Descriptor->u.Port.MinimumAddress.QuadPart = (ULONGLONG)0;Descriptor->u.Port.MaximumAddress.QuadPart =(ULONGLONG)0x00000000FFFFFFFF;
Descriptor->u.Port.MinimumAddress.QuadPart = 0;Descriptor->u.Port.MaximumAddress.QuadPart =MaximumAddress; } Descriptor++; } @@ -532,13 +591,15 @@ } else if (PCI_CONFIGURATION_TYPE(&PciConfig) == PCI_BRIDGE_TYPE) {
for (i = 0; i < PCI_TYPE1_ADDRESSES; i++)
for (Bar = 0; Bar < PCI_TYPE1_ADDRESSES;) { if (!PdoGetRangeLength(DeviceExtension,
0x10 + i * 4,
Bar, &Base, &Length,
&Flags))
&Flags,&Bar,&MaximumAddress)) { DPRINT1("PdoGetRangeLength() failed\n"); break;@@ -562,19 +623,20 @@
Descriptor->u.Port.Length = Length; Descriptor->u.Port.Alignment = 1;
Descriptor->u.Port.MinimumAddress.QuadPart =(ULONGLONG)Base;
Descriptor->u.Port.MaximumAddress.QuadPart =(ULONGLONG)(Base + Length - 1);
Descriptor->u.Port.MinimumAddress.QuadPart = Base;Descriptor->u.Port.MaximumAddress.QuadPart = Base +Length - 1; } else { Descriptor->Type = CmResourceTypeMemory; Descriptor->ShareDisposition = CmResourceShareDeviceExclusive;
Descriptor->Flags = CM_RESOURCE_MEMORY_READ_WRITE;
Descriptor->Flags = CM_RESOURCE_MEMORY_READ_WRITE |(Flags & PCI_ADDRESS_MEMORY_PREFETCHABLE) ?CM_RESOURCE_MEMORY_PREFETCHABLE : 0;
Descriptor->u.Memory.Length = Length; Descriptor->u.Memory.Alignment = 1;
Descriptor->u.Memory.MinimumAddress.QuadPart =(ULONGLONG)Base;
Descriptor->u.Memory.MaximumAddress.QuadPart =(ULONGLONG)(Base + Length - 1);
Descriptor->u.Memory.MinimumAddress.QuadPart = Base;Descriptor->u.Memory.MaximumAddress.QuadPart = Base +Length - 1; } Descriptor++;
@@ -590,19 +652,20 @@
Descriptor->u.Port.Length = Length; Descriptor->u.Port.Alignment = Length;
Descriptor->u.Port.MinimumAddress.QuadPart = (ULONGLONG)0;Descriptor->u.Port.MaximumAddress.QuadPart =(ULONGLONG)0x00000000FFFFFFFF;
Descriptor->u.Port.MinimumAddress.QuadPart = 0;Descriptor->u.Port.MaximumAddress.QuadPart =MaximumAddress; } else { Descriptor->Type = CmResourceTypeMemory; Descriptor->ShareDisposition = CmResourceShareDeviceExclusive;
Descriptor->Flags = CM_RESOURCE_MEMORY_READ_WRITE;
Descriptor->Flags = CM_RESOURCE_MEMORY_READ_WRITE |(Flags & PCI_ADDRESS_MEMORY_PREFETCHABLE) ?CM_RESOURCE_MEMORY_PREFETCHABLE : 0;
Descriptor->u.Memory.Length = Length; Descriptor->u.Memory.Alignment = Length;
Descriptor->u.Port.MinimumAddress.QuadPart = (ULONGLONG)0;Descriptor->u.Port.MaximumAddress.QuadPart =(ULONGLONG)0x00000000FFFFFFFF;
Descriptor->u.Port.MinimumAddress.QuadPart = 0;Descriptor->u.Port.MaximumAddress.QuadPart =MaximumAddress; } Descriptor++; } @@ -645,9 +708,9 @@ ULONG Size; ULONG ResCount = 0; ULONG ListSize;
- ULONG i;
- ULONG Base;
- ULONG Length;
UCHAR Bar;
ULONGLONG Base;
ULONGLONG Length; ULONG Flags;
DPRINT("PdoQueryResources() called\n");
@@ -674,13 +737,15 @@ ResCount = 0; if (PCI_CONFIGURATION_TYPE(&PciConfig) == PCI_DEVICE_TYPE) {
for (i = 0; i < PCI_TYPE0_ADDRESSES; i++)
for (Bar = 0; Bar < PCI_TYPE0_ADDRESSES;) { if (!PdoGetRangeLength(DeviceExtension,
0x10 + i * 4,
Bar, &Base, &Length,
&Flags))
&Flags,&Bar,NULL)) break; if (Length)@@ -694,13 +759,15 @@ } else if (PCI_CONFIGURATION_TYPE(&PciConfig) == PCI_BRIDGE_TYPE) {
for (i = 0; i < PCI_TYPE1_ADDRESSES; i++)
for (Bar = 0; Bar < PCI_TYPE1_ADDRESSES;) { if (!PdoGetRangeLength(DeviceExtension,
0x10 + i * 4,
Bar, &Base, &Length,
&Flags))
&Flags,&Bar,NULL)) break; if (Length != 0)@@ -749,17 +816,16 @@ Descriptor = &PartialList->PartialDescriptors[0]; if (PCI_CONFIGURATION_TYPE(&PciConfig) == PCI_DEVICE_TYPE) {
for (i = 0; i < PCI_TYPE0_ADDRESSES; i++)
for (Bar = 0; Bar < PCI_TYPE0_ADDRESSES;) { if (!PdoGetRangeLength(DeviceExtension,
0x10 + i * 4,
Bar, &Base, &Length,
&Flags)){DPRINT1("PdoGetRangeLength() failed\n");
&Flags,&Bar,NULL)) break;
} if (Length == 0) {@@ -771,7 +837,9 @@ { Descriptor->Type = CmResourceTypePort; Descriptor->ShareDisposition = CmResourceShareDeviceExclusive;
Descriptor->Flags = CM_RESOURCE_PORT_IO;
Descriptor->Flags = CM_RESOURCE_PORT_IO |CM_RESOURCE_PORT_16_BIT_DECODE |CM_RESOURCE_PORT_POSITIVE_DECODE; Descriptor->u.Port.Start.QuadPart = (ULONGLONG)Base; Descriptor->u.Port.Length = Length;@@ -782,7 +850,8 @@ { Descriptor->Type = CmResourceTypeMemory; Descriptor->ShareDisposition = CmResourceShareDeviceExclusive;
Descriptor->Flags = CM_RESOURCE_MEMORY_READ_WRITE;
Descriptor->Flags = CM_RESOURCE_MEMORY_READ_WRITE |(Flags & PCI_ADDRESS_MEMORY_PREFETCHABLE) ?CM_RESOURCE_MEMORY_PREFETCHABLE : 0; Descriptor->u.Memory.Start.QuadPart = (ULONGLONG)Base; Descriptor->u.Memory.Length = Length;
@@ -811,17 +880,16 @@ } else if (PCI_CONFIGURATION_TYPE(&PciConfig) == PCI_BRIDGE_TYPE) {
for (i = 0; i < PCI_TYPE1_ADDRESSES; i++)
for (Bar = 0; Bar < PCI_TYPE1_ADDRESSES;) { if (!PdoGetRangeLength(DeviceExtension,
0x10 + i * 4,
Bar, &Base, &Length,
&Flags)){DPRINT1("PdoGetRangeLength() failed\n");
&Flags,&Bar,NULL)) break;
} if (Length == 0) {@@ -833,7 +901,9 @@ { Descriptor->Type = CmResourceTypePort; Descriptor->ShareDisposition = CmResourceShareDeviceExclusive;
Descriptor->Flags = CM_RESOURCE_PORT_IO;
Descriptor->Flags = CM_RESOURCE_PORT_IO |CM_RESOURCE_PORT_16_BIT_DECODE |CM_RESOURCE_PORT_POSITIVE_DECODE; Descriptor->u.Port.Start.QuadPart = (ULONGLONG)Base; Descriptor->u.Port.Length = Length;@@ -844,7 +914,8 @@ { Descriptor->Type = CmResourceTypeMemory; Descriptor->ShareDisposition = CmResourceShareDeviceExclusive;
Descriptor->Flags = CM_RESOURCE_MEMORY_READ_WRITE;
Descriptor->Flags = CM_RESOURCE_MEMORY_READ_WRITE |(Flags & PCI_ADDRESS_MEMORY_PREFETCHABLE) ?CM_RESOURCE_MEMORY_PREFETCHABLE : 0; Descriptor->u.Memory.Start.QuadPart = (ULONGLONG)Base; Descriptor->u.Memory.Length = Length;
Modified: trunk/reactos/ntoskrnl/io/pnpmgr/pnpres.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/io/pnpmgr/pnpres.c...
============================================================================== --- trunk/reactos/ntoskrnl/io/pnpmgr/pnpres.c [iso-8859-1] (original) +++ trunk/reactos/ntoskrnl/io/pnpmgr/pnpres.c [iso-8859-1] Sun Mar 1 07:52:32 2015 @@ -73,7 +73,7 @@ IN PIO_RESOURCE_DESCRIPTOR IoDesc, OUT PCM_PARTIAL_RESOURCE_DESCRIPTOR CmDesc) {
- LONGLONG Start;
ULONGLONG Start; CM_PARTIAL_RESOURCE_DESCRIPTOR ConflictingDesc;
ASSERT(IoDesc->Type == CmDesc->Type);
@@ -82,16 +82,16 @@ /* HACK */ if (IoDesc->u.Memory.Alignment == 0) IoDesc->u.Memory.Alignment = 1;
- for (Start = IoDesc->u.Memory.MinimumAddress.QuadPart;
Start <= IoDesc->u.Memory.MaximumAddress.QuadPart -IoDesc->u.Memory.Length + 1;
- for (Start = (ULONGLONG)IoDesc->u.Memory.MinimumAddress.QuadPart;
Start <= (ULONGLONG)IoDesc->u.Memory.MaximumAddress.QuadPart -IoDesc->u.Memory.Length + 1; Start += IoDesc->u.Memory.Alignment) { CmDesc->u.Memory.Length = IoDesc->u.Memory.Length;
CmDesc->u.Memory.Start.QuadPart = Start;
CmDesc->u.Memory.Start.QuadPart = (LONGLONG)Start; if (IopCheckDescriptorForConflict(CmDesc, &ConflictingDesc)) {
Start += ConflictingDesc.u.Memory.Start.QuadPart +
Start += (ULONGLONG)ConflictingDesc.u.Memory.Start.QuadPart + ConflictingDesc.u.Memory.Length; } else@@ -110,7 +110,7 @@ IN PIO_RESOURCE_DESCRIPTOR IoDesc, OUT PCM_PARTIAL_RESOURCE_DESCRIPTOR CmDesc) {
- LONGLONG Start;
ULONGLONG Start; CM_PARTIAL_RESOURCE_DESCRIPTOR ConflictingDesc;
ASSERT(IoDesc->Type == CmDesc->Type);
@@ -119,16 +119,16 @@ /* HACK */ if (IoDesc->u.Port.Alignment == 0) IoDesc->u.Port.Alignment = 1;
- for (Start = IoDesc->u.Port.MinimumAddress.QuadPart;
Start <= IoDesc->u.Port.MaximumAddress.QuadPart -IoDesc->u.Port.Length + 1;
- for (Start = (ULONGLONG)IoDesc->u.Port.MinimumAddress.QuadPart;
Start <= (ULONGLONG)IoDesc->u.Port.MaximumAddress.QuadPart -IoDesc->u.Port.Length + 1; Start += IoDesc->u.Port.Alignment) { CmDesc->u.Port.Length = IoDesc->u.Port.Length;
CmDesc->u.Port.Start.QuadPart = Start;
CmDesc->u.Port.Start.QuadPart = (LONGLONG)Start; if (IopCheckDescriptorForConflict(CmDesc, &ConflictingDesc)) {
Start += ConflictingDesc.u.Port.Start.QuadPart +ConflictingDesc.u.Port.Length;
Start += (ULONGLONG)ConflictingDesc.u.Port.Start.QuadPart +ConflictingDesc.u.Port.Length; } else { @@ -300,8 +300,8 @@ case CmResourceTypePort: /* Make sure the length matches and it satisfies our address range */ if (CmDesc->u.Memory.Length == IoDesc->u.Memory.Length &&
CmDesc->u.Memory.Start.QuadPart >=IoDesc->u.Memory.MinimumAddress.QuadPart &&
CmDesc->u.Memory.Start.QuadPart +CmDesc->u.Memory.Length - 1 <= IoDesc->u.Memory.MaximumAddress.QuadPart)
(ULONGLONG)CmDesc->u.Memory.Start.QuadPart >=(ULONGLONG)IoDesc->u.Memory.MinimumAddress.QuadPart &&
(ULONGLONG)CmDesc->u.Memory.Start.QuadPart +CmDesc->u.Memory.Length - 1 <= (ULONGLONG)IoDesc->u.Memory.MaximumAddress.QuadPart) { /* Found it */ Matched = TRUE; @@ -564,11 +564,11 @@ switch (ResDesc->Type) { case CmResourceTypeMemory:
if ((ResDesc->u.Memory.Start.QuadPart <ResDesc2->u.Memory.Start.QuadPart &&
ResDesc->u.Memory.Start.QuadPart +ResDesc->u.Memory.Length >
ResDesc2->u.Memory.Start.QuadPart) ||(ResDesc2->u.Memory.Start.QuadPart <
ResDesc->u.Memory.Start.QuadPart &&ResDesc2->u.Memory.Start.QuadPart +
ResDesc2->u.Memory.Length >ResDesc->u.Memory.Start.QuadPart))
if (((ULONGLONG)ResDesc->u.Memory.Start.QuadPart <(ULONGLONG)ResDesc2->u.Memory.Start.QuadPart &&
(ULONGLONG)ResDesc->u.Memory.Start.QuadPart +ResDesc->u.Memory.Length >
(ULONGLONG)ResDesc2->u.Memory.Start.QuadPart) ||((ULONGLONG)ResDesc2->u.Memory.Start.QuadPart <
(ULONGLONG)ResDesc->u.Memory.Start.QuadPart &&(ULONGLONG)ResDesc2->u.Memory.Start.QuadPart +
ResDesc2->u.Memory.Length >(ULONGLONG)ResDesc->u.Memory.Start.QuadPart)) { if (!Silent) { @@ -585,11 +585,11 @@ break;
case CmResourceTypePort:
if ((ResDesc->u.Port.Start.QuadPart <ResDesc2->u.Port.Start.QuadPart &&
ResDesc->u.Port.Start.QuadPart +ResDesc->u.Port.Length >
ResDesc2->u.Port.Start.QuadPart) ||(ResDesc2->u.Port.Start.QuadPart <
ResDesc->u.Port.Start.QuadPart &&ResDesc2->u.Port.Start.QuadPart +
ResDesc2->u.Port.Length >ResDesc->u.Port.Start.QuadPart))
if (((ULONGLONG)ResDesc->u.Port.Start.QuadPart <(ULONGLONG)ResDesc2->u.Port.Start.QuadPart &&
(ULONGLONG)ResDesc->u.Port.Start.QuadPart +ResDesc->u.Port.Length >
(ULONGLONG)ResDesc2->u.Port.Start.QuadPart) ||((ULONGLONG)ResDesc2->u.Port.Start.QuadPart <
(ULONGLONG)ResDesc->u.Port.Start.QuadPart &&(ULONGLONG)ResDesc2->u.Port.Start.QuadPart +
ResDesc2->u.Port.Length >(ULONGLONG)ResDesc->u.Port.Start.QuadPart)) { if (!Silent) {