--- setup-bus.c 2007-02-19 22:34:32.000000000 -0800 +++ setup-bus.c.new 2007-09-05 10:02:34.000000000 -0700 @@ -156,6 +156,7 @@ struct pci_dev *bridge = bus->self; struct pci_bus_region region; u32 l, io_upper16; + u32 pref_upper32, pref_limit_upper32; DBG(KERN_INFO "PCI: Bridge: %s\n", pci_name(bridge)); @@ -209,17 +210,21 @@ if (bus->resource[2]->flags & IORESOURCE_PREFETCH) { l = (region.start >> 16) & 0xfff0; l |= region.end & 0xfff00000; + pref_upper32 = region.start >> 32; + pref_limit_upper32 = region.end >> 32; DBG(KERN_INFO " PREFETCH window: %08lx-%08lx\n", region.start, region.end); } else { l = 0x0000fff0; + pref_upper32 = pref_limit_upper32 = 0; DBG(KERN_INFO " PREFETCH window: disabled.\n"); } pci_write_config_dword(bridge, PCI_PREF_MEMORY_BASE, l); - /* Clear out the upper 32 bits of PREF base. */ - pci_write_config_dword(bridge, PCI_PREF_BASE_UPPER32, 0); + pci_write_config_dword(bridge, PCI_PREF_BASE_UPPER32, pref_upper32); + + pci_write_config_dword(bridge, PCI_PREF_LIMIT_UPPER32, pref_limit_upper32); pci_write_config_word(bridge, PCI_BRIDGE_CONTROL, bus->bridge_ctl); }