summaryrefslogtreecommitdiffstats
path: root/drivers/pci/setup-res.c
diff options
context:
space:
mode:
authorDave Airlie <airlied@redhat.com>2010-08-02 10:24:46 +1000
committerDave Airlie <airlied@redhat.com>2010-08-02 10:24:46 +1000
commit7827627107aeb629f1a056cb56b17bd4fb789e03 (patch)
treecbd83582abb9120c7ef724bf439916c8bf864e37 /drivers/pci/setup-res.c
parente190bfe56841551b1ad5abb42ebd0c4798cc8c01 (diff)
parent219de62a1627247fca10789f28902f66cb0b408f (diff)
Merge branch 'drm-radeon-next' of ../drm-radeon-next into drm-core-next
* 'drm-radeon-next' of ../drm-radeon-next: (333 commits) drm/radeon/kms: trivial code style fixes for audio drm/radeon: remove viewport transform from r6xx/r7xx blit emit drm/radeon: group r6xx/r7xx newly sequential blit state drm/radeon: reorder r6xx/r7xx blit state emit to make more regs sequential drm/radeon: r6xx/r7xx move vport clipping to a single packet drm/radeon: group r6xx/r7xx sequential blit state drm/radeon: remove duplicate state emit in r6xx/r7xx blit drm/radeon: add comments to r6xx/r7xx blit state drm/radeon/kms/r7xx: add workaround for hw issue with HDP flush drm/radeon/kms: remove rs4xx gart limit drm: radeon: fix sign bug drm/radeon/kms: check/restore sanity before doing anything else with GPU. drm/radeon: fall back to GTT if bo creation/validation in VRAM fails. drm/radeon/kms: add ioport register access drm/radeon/kms: enable HDMI audio on RS600/RS690/RS740 drm/radeon/kms: track audio engine state, do not use not setup timer drm/radeon/kms/r6xx+: add query for tile config (v2) drm/radeon/kms: fix CS alignment checking for tiling (v2) drm/radeon/kms: add tiling support to the cs checker for r6xx/r7xx drm/radeon/kms: Add crtc tiling setup support for evergreen ...
Diffstat (limited to 'drivers/pci/setup-res.c')
-rw-r--r--drivers/pci/setup-res.c32
1 files changed, 32 insertions, 0 deletions
diff --git a/drivers/pci/setup-res.c b/drivers/pci/setup-res.c
index 92379e2d37e..2aaa13150de 100644
--- a/drivers/pci/setup-res.c
+++ b/drivers/pci/setup-res.c
@@ -156,6 +156,38 @@ static int __pci_assign_resource(struct pci_bus *bus, struct pci_dev *dev,
pcibios_align_resource, dev);
}
+ if (ret < 0 && dev->fw_addr[resno]) {
+ struct resource *root, *conflict;
+ resource_size_t start, end;
+
+ /*
+ * If we failed to assign anything, let's try the address
+ * where firmware left it. That at least has a chance of
+ * working, which is better than just leaving it disabled.
+ */
+
+ 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;
+ dev_info(&dev->dev, "BAR %d: trying firmware assignment %pR\n",
+ resno, res);
+ conflict = request_resource_conflict(root, res);
+ if (conflict) {
+ dev_info(&dev->dev,
+ "BAR %d: %pR conflicts with %s %pR\n", resno,
+ res, conflict->name, conflict);
+ res->start = start;
+ res->end = end;
+ } else
+ ret = 0;
+ }
+
if (!ret) {
res->flags &= ~IORESOURCE_STARTALIGN;
dev_info(&dev->dev, "BAR %d: assigned %pR\n", resno, res);