Kerry Sheh (shekairui@gmail.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/489
-gerrit
commit 255321a2d294747af779f24247db2a3583c5f48e Author: Kerry Sheh shekairui@gmail.com Date: Thu Dec 15 19:30:50 2011 +0800
Fix multipleVGA cards resource conflict
If both graphic cards decode the IO 3B0-3DF and MEM A00000-BFFFF, Windows 7 complain a resource conflict, so only one VGA card can works at the same time.
There is a discuss in coreboot mail list before, please reference thread: "how to prevent legacy resource conflictwith multipleVGA cards"
For the second graphic device, coreboot already disabled the IO and MEM decode in function set_vga_bridge_bits(). But it will be enabled again in function pci_set_resource(), if the secondary graphic device take any IO/MEM resources.
Following log printed by enable_resources() shows the problem: ...snip... PCI: 00:00.0 cmd <- 06 PCI: 00:01.0 subsystem <- 1022/1410 PCI: 00:01.0 cmd <- 07 <== The first graphic device PCI: 00:01.1 subsystem <- 1022/1410 PCI: 00:01.1 cmd <- 02 PCI: 00:02.0 bridge ctrl <- 0003 PCI: 00:02.0 cmd <- 07 ...snip... PCI: 01:00.0 cmd <- 03 <== The secondary graphic device PCI: 01:00.1 cmd <- 02 PCI: 02:00.0 cmd <- 02 PCI: 03:00.0 cmd <- 03 done. ...snip...
This patch tries to disable IO & MEM decode for the second graphic device, the resource conflict in windows7 resolved.
Signed-off-by: Kerry Sheh shekairui@gmail.com Signed-off-by: Kerry Sheh kerry.she@amd.com Change-Id: I0de5e3761b51e2723d9c1dc0c39fff692e3a779d --- src/devices/pci_device.c | 14 ++++++++++++++ 1 files changed, 14 insertions(+), 0 deletions(-)
diff --git a/src/devices/pci_device.c b/src/devices/pci_device.c index 2ccb38a..5e4269d 100644 --- a/src/devices/pci_device.c +++ b/src/devices/pci_device.c @@ -494,6 +494,20 @@ static void pci_set_resource(struct device *dev, struct resource *resource) dev->command |= PCI_COMMAND_IO; if (resource->flags & IORESOURCE_PCI_BRIDGE) dev->command |= PCI_COMMAND_MASTER; + + /* It isn't safe to enable other VGA cards, + * otherwise windows will report resource conflict when + * more than one graphic card in the system. + */ +#if CONFIG_VGA_BRIDGE_SETUP == 1 + extern device_t vga_pri; + if (((dev->class >> 16) == PCI_BASE_CLASS_DISPLAY) && + ((dev->class >> 8) != PCI_CLASS_DISPLAY_OTHER)) { + if (dev != vga_pri) { + dev->command &= ~(PCI_COMMAND_IO | PCI_COMMAND_MEMORY); + } + } +#endif }
/* Get the base address. */