[ros-dev] [ros-diffs] [cgutman] 66511: [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] - Fi...
Alex Ionescu
ionucu at videotron.ca
Tue Mar 3 03:55:02 UTC 2015
Just make pcix work already
Best regards,
Alex Ionescu
On Sat, Feb 28, 2015 at 11:52 PM, <cgutman at 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)
> {
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.reactos.org/pipermail/ros-dev/attachments/20150302/be828f76/attachment-0001.html>
More information about the Ros-dev
mailing list