Skip to content

Commit

Permalink
PCI: Fix starting basis for resource requests
Browse files Browse the repository at this point in the history
pci_revert_fw_address() is used to reinstate a PCI device's original
FW-assigned BIOS BAR value(s) if normal resource assignment fails.

When attempting to reinstate an address, the point within the resource
tree from which to attempt the new resource request should be the parent
resource corresponding to the device, not the base of the resource tree
(ioport_resource or iomem_resource).  For PCI devices this would
typically be the resource corresponding to the upstream PCI host bridge
or P2P bridge aperture.

This patch sets the point within the resource tree to attempt a new
resource assignment request to the PCI device's parent resource and only
if that fails does it fall back to the base ioport_resource or
iomem_resource.

Signed-off-by: Myron Stowe <myron.stowe@redhat.com>
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
  • Loading branch information
Myron Stowe authored and Jesse Barnes committed Feb 14, 2012
1 parent 3682a39 commit 351fc6d
Showing 1 changed file with 9 additions and 5 deletions.
14 changes: 9 additions & 5 deletions drivers/pci/setup-res.c
Original file line number Diff line number Diff line change
Expand Up @@ -165,15 +165,19 @@ static int pci_revert_fw_address(struct resource *res, struct pci_dev *dev,
resource_size_t start, end;
int ret = 0;

if (res->flags & IORESOURCE_IO)
root = &ioport_resource;
else
root = &iomem_resource;

start = res->start;
end = res->end;
res->start = dev->fw_addr[resno];
res->end = res->start + size - 1;

root = pci_find_parent_resource(dev, res);
if (!root) {
if (res->flags & IORESOURCE_IO)
root = &ioport_resource;
else
root = &iomem_resource;
}

dev_info(&dev->dev, "BAR %d: trying firmware assignment %pR\n",
resno, res);
conflict = request_resource_conflict(root, res);
Expand Down

0 comments on commit 351fc6d

Please sign in to comment.