Kerry Sheh ([email protected]) just uploaded a new patch set to gerrit, which 
you can find at http://review.coreboot.org/489

-gerrit

commit 255321a2d294747af779f24247db2a3583c5f48e
Author: Kerry Sheh <[email protected]>
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 <[email protected]>
    Signed-off-by: Kerry Sheh <[email protected]>
    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. */

-- 
coreboot mailing list: [email protected]
http://www.coreboot.org/mailman/listinfo/coreboot

Reply via email to