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=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)
                       {