diff options
author | Daniel Burcaw <dburcaw@terrasoftsolutions.com> | 2005-09-09 13:04:59 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2005-09-09 13:58:02 -0700 |
commit | 5251bffc9b4ca699993c79166adf02faf1bbc043 (patch) | |
tree | 0d3a0c8f3efe9a71d68e7f9de0b79195aa790909 | |
parent | c5eb5c1ea919f3f717236c5d0892f9c37f19de37 (diff) | |
download | linux-5251bffc9b4ca699993c79166adf02faf1bbc043.tar.bz2 |
[PATCH] radeonfb: Only request resources we need
This patch changes radeon to request only resources 0 and 2 instead of all
3. This works around problems with some setups where BAR 1 (IO BAR) has
not been assigned by the firmware since it's not used on the machine and
the kernel fails to assign something to it due to the card being between a
P2P bridge that was configured without an IO range at all.
This typically fixes radeonfb on some Apple Xserve G5 machines
Signed-off-by: Daniel Burcaw <dburcaw@terrasoftsolutions.com>
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
-rw-r--r-- | drivers/video/aty/radeon_base.c | 29 |
1 files changed, 20 insertions, 9 deletions
diff --git a/drivers/video/aty/radeon_base.c b/drivers/video/aty/radeon_base.c index e7e8b52014c3..8a7c04c35a75 100644 --- a/drivers/video/aty/radeon_base.c +++ b/drivers/video/aty/radeon_base.c @@ -2312,19 +2312,27 @@ static int radeonfb_pci_register (struct pci_dev *pdev, rinfo->mmio_base_phys = pci_resource_start (pdev, 2); /* request the mem regions */ - ret = pci_request_regions(pdev, "radeonfb"); + ret = pci_request_region(pdev, 0, "radeonfb framebuffer"); if (ret < 0) { - printk( KERN_ERR "radeonfb (%s): cannot reserve PCI regions." - " Someone already got them?\n", pci_name(rinfo->pdev)); + printk( KERN_ERR "radeonfb (%s): cannot request region 0.\n", + pci_name(rinfo->pdev)); goto err_release_fb; } + ret = pci_request_region(pdev, 2, "radeonfb mmio"); + if (ret < 0) { + printk( KERN_ERR "radeonfb (%s): cannot request region 2.\n", + pci_name(rinfo->pdev)); + goto err_release_pci0; + } + /* map the regions */ rinfo->mmio_base = ioremap(rinfo->mmio_base_phys, RADEON_REGSIZE); if (!rinfo->mmio_base) { - printk(KERN_ERR "radeonfb (%s): cannot map MMIO\n", pci_name(rinfo->pdev)); + printk(KERN_ERR "radeonfb (%s): cannot map MMIO\n", + pci_name(rinfo->pdev)); ret = -EIO; - goto err_release_pci; + goto err_release_pci2; } rinfo->fb_local_base = INREG(MC_FB_LOCATION) << 16; @@ -2499,10 +2507,12 @@ err_unmap_rom: if (rinfo->bios_seg) radeon_unmap_ROM(rinfo, pdev); iounmap(rinfo->mmio_base); -err_release_pci: - pci_release_regions(pdev); +err_release_pci2: + pci_release_region(pdev, 2); +err_release_pci0: + pci_release_region(pdev, 0); err_release_fb: - framebuffer_release(info); + framebuffer_release(info); err_disable: pci_disable_device(pdev); err_out: @@ -2548,7 +2558,8 @@ static void __devexit radeonfb_pci_unregister (struct pci_dev *pdev) iounmap(rinfo->mmio_base); iounmap(rinfo->fb_base); - pci_release_regions(pdev); + pci_release_region(pdev, 2); + pci_release_region(pdev, 0); kfree(rinfo->mon1_EDID); kfree(rinfo->mon2_EDID); |