Just make pcix work already Best regards, Alex Ionescu
On Sat, Feb 28, 2015 at 11:52 PM, <cgut...@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=66511&r1=66510&r2=66511&view=diff > > ============================================================================== > --- 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?rev=66511&r1=66510&r2=66511&view=diff > > ============================================================================== > --- 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) > { > > >
_______________________________________________ Ros-dev mailing list Ros-dev@reactos.org http://www.reactos.org/mailman/listinfo/ros-dev