PCI/x86: don't assume prefetchable ranges are 64bit
We should not assign 64bit ranges to PCI devices that only take 32bit prefetchable addresses. Try to set IORESOURCE_MEM_64 in 64bit resource of pci_device/pci_bridge and make the bus resource only have that bit set when all devices under it support 64bit prefetchable memory. Use that flag to allocate resources from that range. Reported-by: Yannick <yannick.roehlly@free.fr> Reviewed-by: Ivan Kokshaysky <ink@jurassic.park.msu.ru> Signed-off-by: Yinghai Lu <yinghai@kernel.org> Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
This commit is contained in:
parent
67b5db6502
commit
1f82de10d6
6 changed files with 62 additions and 13 deletions
|
@ -193,7 +193,7 @@ int __pci_read_base(struct pci_dev *dev, enum pci_bar_type type,
|
|||
res->flags |= pci_calc_resource_flags(l) | IORESOURCE_SIZEALIGN;
|
||||
if (type == pci_bar_io) {
|
||||
l &= PCI_BASE_ADDRESS_IO_MASK;
|
||||
mask = PCI_BASE_ADDRESS_IO_MASK & 0xffff;
|
||||
mask = PCI_BASE_ADDRESS_IO_MASK & IO_SPACE_LIMIT;
|
||||
} else {
|
||||
l &= PCI_BASE_ADDRESS_MEM_MASK;
|
||||
mask = (u32)PCI_BASE_ADDRESS_MEM_MASK;
|
||||
|
@ -237,6 +237,8 @@ int __pci_read_base(struct pci_dev *dev, enum pci_bar_type type,
|
|||
dev_printk(KERN_DEBUG, &dev->dev,
|
||||
"reg %x 64bit mmio: %pR\n", pos, res);
|
||||
}
|
||||
|
||||
res->flags |= IORESOURCE_MEM_64;
|
||||
} else {
|
||||
sz = pci_size(l, sz, mask);
|
||||
|
||||
|
@ -362,7 +364,10 @@ void __devinit pci_read_bridge_bases(struct pci_bus *child)
|
|||
}
|
||||
}
|
||||
if (base <= limit) {
|
||||
res->flags = (mem_base_lo & PCI_MEMORY_RANGE_TYPE_MASK) | IORESOURCE_MEM | IORESOURCE_PREFETCH;
|
||||
res->flags = (mem_base_lo & PCI_PREF_RANGE_TYPE_MASK) |
|
||||
IORESOURCE_MEM | IORESOURCE_PREFETCH;
|
||||
if (res->flags & PCI_PREF_RANGE_TYPE_64)
|
||||
res->flags |= IORESOURCE_MEM_64;
|
||||
res->start = base;
|
||||
res->end = limit + 0xfffff;
|
||||
dev_printk(KERN_DEBUG, &dev->dev, "bridge %sbit mmio pref: %pR\n",
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue