aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/pci/setup-bus.c
diff options
context:
space:
mode:
authorYinghai Lu <yinghai@kernel.org>2013-07-22 17:37:14 -0400
committerBjorn Helgaas <bhelgaas@google.com>2013-07-25 14:35:02 -0400
commitfa216bf4dbe35e15044b90e7b51509768bab3d9a (patch)
tree3437173284dff5d626a944be0215c1aeebc1e4df /drivers/pci/setup-bus.c
parent223d96fc3249b0ffdc30bf77fd90c93f857e9a6e (diff)
PCI: Turn on reallocation for unassigned resources with host bridge offset
Previously we did not turn on automatic PCI resource reallocation for unassigned IOV resources behind a host bridge with address offset. This patch fixes that bug. The intent was that "!r->start" would check for a BAR containing zero. But that check is incorrect for host bridges that apply an offset, because in that case the resource address is not the same as the bus address. This patch fixes that by converting the resource address back to a bus address before checking for zero. [bhelgaas: changelog] Suggested-by: Benjamin Herrenschmidt <benh@kernel.crashing.org> Signed-off-by: Yinghai Lu <yinghai@kernel.org> Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Diffstat (limited to 'drivers/pci/setup-bus.c')
-rw-r--r--drivers/pci/setup-bus.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/drivers/pci/setup-bus.c b/drivers/pci/setup-bus.c
index 20c09bd652db..ed1bd0cdf521 100644
--- a/drivers/pci/setup-bus.c
+++ b/drivers/pci/setup-bus.c
@@ -1367,9 +1367,14 @@ static int __init iov_resources_unassigned(struct pci_dev *dev, void *data)
1367 1367
1368 for (i = PCI_IOV_RESOURCES; i <= PCI_IOV_RESOURCE_END; i++) { 1368 for (i = PCI_IOV_RESOURCES; i <= PCI_IOV_RESOURCE_END; i++) {
1369 struct resource *r = &dev->resource[i]; 1369 struct resource *r = &dev->resource[i];
1370 struct pci_bus_region region;
1370 1371
1371 /* Not assigned or rejected by kernel? */ 1372 /* Not assigned or rejected by kernel? */
1372 if (r->flags && !r->start) { 1373 if (!r->flags)
1374 continue;
1375
1376 pcibios_resource_to_bus(dev, &region, r);
1377 if (!region.start) {
1373 *unassigned = true; 1378 *unassigned = true;
1374 return 1; /* return early from pci_walk_bus() */ 1379 return 1; /* return early from pci_walk_bus() */
1375 } 1380 }