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

Reply via email to