dm: pci: Enable VGA address forwarding on bridges
authorBin Meng <bmeng.cn@gmail.com>
Thu, 1 Oct 2015 07:36:02 +0000 (00:36 -0700)
committerSimon Glass <sjg@chromium.org>
Wed, 21 Oct 2015 13:46:25 +0000 (07:46 -0600)
To support graphics card behind a PCI bridge, the bridge control
register (offset 0x3e) in the configuration space must turn on
VGA address forwarding.

Signed-off-by: Bin Meng <bmeng.cn@gmail.com>
Acked-by: Simon Glass <sjg@chromium.org>
drivers/pci/pci-uclass.c

index d15de5a..1d93194 100644 (file)
@@ -364,9 +364,23 @@ int dm_pci_read_config32(struct udevice *dev, int offset, u32 *valuep)
        return 0;
 }
 
+static void set_vga_bridge_bits(struct udevice *dev)
+{
+       struct udevice *parent = dev->parent;
+       u16 bc;
+
+       while (parent->seq != 0) {
+               dm_pci_read_config16(parent, PCI_BRIDGE_CONTROL, &bc);
+               bc |= PCI_BRIDGE_CTL_VGA;
+               dm_pci_write_config16(parent, PCI_BRIDGE_CONTROL, bc);
+               parent = parent->parent;
+       }
+}
+
 int pci_auto_config_devices(struct udevice *bus)
 {
        struct pci_controller *hose = bus->uclass_priv;
+       struct pci_child_platdata *pplat;
        unsigned int sub_bus;
        struct udevice *dev;
        int ret;
@@ -386,6 +400,10 @@ int pci_auto_config_devices(struct udevice *bus)
                        return ret;
                max_bus = ret;
                sub_bus = max(sub_bus, max_bus);
+
+               pplat = dev_get_parent_platdata(dev);
+               if (pplat->class == (PCI_CLASS_DISPLAY_VGA << 8))
+                       set_vga_bridge_bits(dev);
        }
        debug("%s: done\n", __func__);