diff options
author | Alex Williamson <alex.williamson@hp.com> | 2009-11-30 16:51:44 -0500 |
---|---|---|
committer | Jesse Barnes <jbarnes@virtuousgeek.org> | 2009-12-04 18:52:43 -0500 |
commit | 59353ea30e65ab3ae181d6175e3212e1361c3787 (patch) | |
tree | 4fc54f9c8e3b4dd5af6d7f125739ccac9f9d6410 /drivers/pci/setup-bus.c | |
parent | 04b55c4732780381410e52db0e9bfb7661f2b4b3 (diff) |
PCI: Always set prefetchable base/limit upper32 registers
Prior to 1f82de10 we always initialized the upper 32bits of the
prefetchable memory window, regardless of the address range used.
Now we only touch it for a >32bit address, which means the upper32
registers remain whatever the BIOS initialized them too.
It's valid for the BIOS to set the upper32 base/limit to
0xffffffff/0x00000000, which makes us program prefetchable ranges
like 0xffffffffabc00000 - 0x00000000abc00000
Revert the chunk of 1f82de10 that made this conditional so we always
write the upper32 registers and remove now unused pref_mem64 variable.
Signed-off-by: Alex Williamson <alex.williamson@hp.com>
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Diffstat (limited to 'drivers/pci/setup-bus.c')
-rw-r--r-- | drivers/pci/setup-bus.c | 11 |
1 files changed, 3 insertions, 8 deletions
diff --git a/drivers/pci/setup-bus.c b/drivers/pci/setup-bus.c index 502d1704c533..c48cd377b3f5 100644 --- a/drivers/pci/setup-bus.c +++ b/drivers/pci/setup-bus.c | |||
@@ -140,7 +140,6 @@ static void pci_setup_bridge(struct pci_bus *bus) | |||
140 | struct resource *res; | 140 | struct resource *res; |
141 | struct pci_bus_region region; | 141 | struct pci_bus_region region; |
142 | u32 l, bu, lu, io_upper16; | 142 | u32 l, bu, lu, io_upper16; |
143 | int pref_mem64; | ||
144 | 143 | ||
145 | if (pci_is_enabled(bridge)) | 144 | if (pci_is_enabled(bridge)) |
146 | return; | 145 | return; |
@@ -194,7 +193,6 @@ static void pci_setup_bridge(struct pci_bus *bus) | |||
194 | pci_write_config_dword(bridge, PCI_PREF_LIMIT_UPPER32, 0); | 193 | pci_write_config_dword(bridge, PCI_PREF_LIMIT_UPPER32, 0); |
195 | 194 | ||
196 | /* Set up PREF base/limit. */ | 195 | /* Set up PREF base/limit. */ |
197 | pref_mem64 = 0; | ||
198 | bu = lu = 0; | 196 | bu = lu = 0; |
199 | res = bus->resource[2]; | 197 | res = bus->resource[2]; |
200 | pcibios_resource_to_bus(bridge, ®ion, res); | 198 | pcibios_resource_to_bus(bridge, ®ion, res); |
@@ -202,7 +200,6 @@ static void pci_setup_bridge(struct pci_bus *bus) | |||
202 | l = (region.start >> 16) & 0xfff0; | 200 | l = (region.start >> 16) & 0xfff0; |
203 | l |= region.end & 0xfff00000; | 201 | l |= region.end & 0xfff00000; |
204 | if (res->flags & IORESOURCE_MEM_64) { | 202 | if (res->flags & IORESOURCE_MEM_64) { |
205 | pref_mem64 = 1; | ||
206 | bu = upper_32_bits(region.start); | 203 | bu = upper_32_bits(region.start); |
207 | lu = upper_32_bits(region.end); | 204 | lu = upper_32_bits(region.end); |
208 | } | 205 | } |
@@ -214,11 +211,9 @@ static void pci_setup_bridge(struct pci_bus *bus) | |||
214 | } | 211 | } |
215 | pci_write_config_dword(bridge, PCI_PREF_MEMORY_BASE, l); | 212 | pci_write_config_dword(bridge, PCI_PREF_MEMORY_BASE, l); |
216 | 213 | ||
217 | if (pref_mem64) { | 214 | /* Set the upper 32 bits of PREF base & limit. */ |
218 | /* Set the upper 32 bits of PREF base & limit. */ | 215 | pci_write_config_dword(bridge, PCI_PREF_BASE_UPPER32, bu); |
219 | pci_write_config_dword(bridge, PCI_PREF_BASE_UPPER32, bu); | 216 | pci_write_config_dword(bridge, PCI_PREF_LIMIT_UPPER32, lu); |
220 | pci_write_config_dword(bridge, PCI_PREF_LIMIT_UPPER32, lu); | ||
221 | } | ||
222 | 217 | ||
223 | pci_write_config_word(bridge, PCI_BRIDGE_CONTROL, bus->bridge_ctl); | 218 | pci_write_config_word(bridge, PCI_BRIDGE_CONTROL, bus->bridge_ctl); |
224 | } | 219 | } |