[PATCH] fix ROM enable/disable in r128 and radeon fb drivers

From: Jesse Barnes
Date: Tue Dec 14 2004 - 15:58:04 EST


My mail to the maintainer bounced, but these should be safe for everybody.
Both the r128 and radeon fb drivers do bad things with the PCI BAR
corresponding to their option ROM. They incorrectly use the host address
instead of the BAR address to enable the ROM, and then incorrectly lose the
original value on unmap. This patch fixes both problems. Tested on Altix.

Signed-off-by: Jesse Barnes <jbarnes@xxxxxxx>

Thanks,
Jesse
===== drivers/video/aty/aty128fb.c 1.52 vs edited =====
--- 1.52/drivers/video/aty/aty128fb.c 2004-11-12 11:40:39 -08:00
+++ edited/drivers/video/aty/aty128fb.c 2004-12-13 15:13:55 -08:00
@@ -791,6 +791,7 @@
static void __init aty128_unmap_ROM(struct pci_dev *dev, void __iomem * rom)
{
struct resource *r = &dev->resource[PCI_ROM_RESOURCE];
+ u32 val;

iounmap(rom);

@@ -801,8 +802,9 @@
r->end -= r->start;
r->start = 0;
}
- /* This will disable and set address to unassigned */
- pci_write_config_dword(dev, dev->rom_base_reg, 0);
+ /* This will disable it again */
+ pci_read_config_dword(dev, dev->rom_base_reg, &val);
+ pci_write_config_dword(dev, dev->rom_base_reg, val & ~PCI_ROM_ADDRESS_ENABLE);
}


@@ -830,8 +832,10 @@

/* enable if needed */
if (!(r->flags & PCI_ROM_ADDRESS_ENABLE)) {
+ u32 val;
+ pci_read_config_dword(dev, dev->rom_base_reg, &val);
pci_write_config_dword(dev, dev->rom_base_reg,
- r->start | PCI_ROM_ADDRESS_ENABLE);
+ val | PCI_ROM_ADDRESS_ENABLE);
r->flags |= PCI_ROM_ADDRESS_ENABLE;
}

===== drivers/video/aty/radeon_base.c 1.35 vs edited =====
--- 1.35/drivers/video/aty/radeon_base.c 2004-11-11 00:39:04 -08:00
+++ edited/drivers/video/aty/radeon_base.c 2004-12-13 15:11:56 -08:00
@@ -265,6 +265,7 @@
{
// leave it disabled and unassigned
struct resource *r = &dev->resource[PCI_ROM_RESOURCE];
+ u32 val;

if (!rinfo->bios_seg)
return;
@@ -277,8 +278,9 @@
r->end -= r->start;
r->start = 0;
}
- /* This will disable and set address to unassigned */
- pci_write_config_dword(dev, dev->rom_base_reg, 0);
+ /* This will disable it again */
+ pci_read_config_dword(dev, dev->rom_base_reg, &val);
+ pci_write_config_dword(dev, dev->rom_base_reg, val & ~PCI_ROM_ADDRESS_ENABLE);
}

static int __devinit radeon_map_ROM(struct radeonfb_info *rinfo, struct pci_dev *dev)
@@ -310,8 +312,10 @@

/* enable if needed */
if (!(r->flags & PCI_ROM_ADDRESS_ENABLE)) {
+ u32 val;
+ pci_read_config_dword(dev, dev->rom_base_reg, &val);
pci_write_config_dword(dev, dev->rom_base_reg,
- r->start | PCI_ROM_ADDRESS_ENABLE);
+ val | PCI_ROM_ADDRESS_ENABLE);
r->flags |= PCI_ROM_ADDRESS_ENABLE;
}