aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Vrabel <dvrabel@arcom.com>2006-01-14 13:21:23 -0800
committerLinus Torvalds <torvalds@g5.osdl.org>2006-01-14 18:27:14 -0800
commita80da7389891d0eeacbd568a9b54f665fd424d14 (patch)
tree1f0629804d83692546c9db0223236331cb70a44e
parent4836f5749e55663f884ea25920ff88de7822f0a8 (diff)
[PATCH] gx1fb: (try to) play nicer with various BIOSes
Seems that the CS5530A chip used in Geode GX1 systems has some crazy feature that causes SMI traps when accessing the PCI configuration space of the video device. Various GX1 BIOSes seem to use this 'feature' to hide the real BARs of the device. This patch disables these traps (in an early PCI fixup) so that Linux sees the real, physical BARs and not the virtual ones provided by the BIOS. This should allow the GX1 framebuffer driver to work on more systems that have different BIOSes as the driver no longer guesses at what the virtual BARs mean. I'm not entirely sure it the correct solution as I can neither test regular VGA console nor the X's 'cyrix' video driver so there might be some breakage there -- probably best to get some more testers before applying it. Signed-off-by: Antonino Daplas <adaplas@pol.net> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
-rw-r--r--arch/i386/pci/fixup.c16
-rw-r--r--drivers/video/geode/gx1fb_core.c11
2 files changed, 20 insertions, 7 deletions
diff --git a/arch/i386/pci/fixup.c b/arch/i386/pci/fixup.c
index 65f67070db6..83c3645ccc4 100644
--- a/arch/i386/pci/fixup.c
+++ b/arch/i386/pci/fixup.c
@@ -449,3 +449,19 @@ static void __devinit pci_post_fixup_toshiba_ohci1394(struct pci_dev *dev)
}
DECLARE_PCI_FIXUP_ENABLE(PCI_VENDOR_ID_TI, 0x8032,
pci_post_fixup_toshiba_ohci1394);
+
+
+/*
+ * Prevent the BIOS trapping accesses to the Cyrix CS5530A video device
+ * configuration space.
+ */
+static void __devinit pci_early_fixup_cyrix_5530(struct pci_dev *dev)
+{
+ u8 r;
+ /* clear 'F4 Video Configuration Trap' bit */
+ pci_read_config_byte(dev, 0x42, &r);
+ r &= 0xfd;
+ pci_write_config_byte(dev, 0x42, r);
+}
+DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_CYRIX, PCI_DEVICE_ID_CYRIX_5530_LEGACY,
+ pci_early_fixup_cyrix_5530);
diff --git a/drivers/video/geode/gx1fb_core.c b/drivers/video/geode/gx1fb_core.c
index 8e8da743399..20e69156d72 100644
--- a/drivers/video/geode/gx1fb_core.c
+++ b/drivers/video/geode/gx1fb_core.c
@@ -215,11 +215,11 @@ static int __init gx1fb_map_video_memory(struct fb_info *info, struct pci_dev *d
if (ret < 0)
return ret;
- ret = pci_request_region(dev, 1, "gx1fb (video)");
+ ret = pci_request_region(dev, 0, "gx1fb (video)");
if (ret < 0)
return ret;
- par->vid_regs = ioremap(pci_resource_start(dev, 1),
- pci_resource_len(dev, 1));
+ par->vid_regs = ioremap(pci_resource_start(dev, 0),
+ pci_resource_len(dev, 0));
if (!par->vid_regs)
return -ENOMEM;
@@ -229,12 +229,9 @@ static int __init gx1fb_map_video_memory(struct fb_info *info, struct pci_dev *d
if (!par->dc_regs)
return -ENOMEM;
- ret = pci_request_region(dev, 0, "gx1fb (frame buffer)");
- if (ret < 0 )
- return -EBUSY;
if ((fb_len = gx1_frame_buffer_size()) < 0)
return -ENOMEM;
- info->fix.smem_start = pci_resource_start(dev, 0);
+ info->fix.smem_start = gx_base + 0x800000;
info->fix.smem_len = fb_len;
info->screen_base = ioremap(info->fix.smem_start, info->fix.smem_len);
if (!info->screen_base)