diff options
author | Bjorn Helgaas <bhelgaas@google.com> | 2012-02-23 22:19:01 -0500 |
---|---|---|
committer | Bjorn Helgaas <bhelgaas@google.com> | 2012-02-23 22:19:01 -0500 |
commit | c04d9e35790013606f18cf56db07f80c3a339608 (patch) | |
tree | 4388d15997ddca63a7ba21f822654f13871a3767 /arch/alpha/kernel | |
parent | 36a66cd6fd0a70ac6848d740d9cf7a4360b5776a (diff) |
alpha/PCI: get rid of device resource fixups
Tell the PCI core about host bridge address translation so it can take
care of bus-to-resource conversion for us.
CC: linux-alpha@vger.kernel.org
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Diffstat (limited to 'arch/alpha/kernel')
-rw-r--r-- | arch/alpha/kernel/pci.c | 71 |
1 files changed, 4 insertions, 67 deletions
diff --git a/arch/alpha/kernel/pci.c b/arch/alpha/kernel/pci.c index 3a5cdf2a8fd0..1a629636cc16 100644 --- a/arch/alpha/kernel/pci.c +++ b/arch/alpha/kernel/pci.c | |||
@@ -251,32 +251,6 @@ pci_restore_srm_config(void) | |||
251 | #endif | 251 | #endif |
252 | 252 | ||
253 | void __devinit | 253 | void __devinit |
254 | pcibios_fixup_resource(struct resource *res, struct resource *root) | ||
255 | { | ||
256 | res->start += root->start; | ||
257 | res->end += root->start; | ||
258 | } | ||
259 | |||
260 | void __devinit | ||
261 | pcibios_fixup_device_resources(struct pci_dev *dev, struct pci_bus *bus) | ||
262 | { | ||
263 | /* Update device resources. */ | ||
264 | struct pci_controller *hose = (struct pci_controller *)bus->sysdata; | ||
265 | int i; | ||
266 | |||
267 | for (i = 0; i < PCI_NUM_RESOURCES; i++) { | ||
268 | if (!dev->resource[i].start) | ||
269 | continue; | ||
270 | if (dev->resource[i].flags & IORESOURCE_IO) | ||
271 | pcibios_fixup_resource(&dev->resource[i], | ||
272 | hose->io_space); | ||
273 | else if (dev->resource[i].flags & IORESOURCE_MEM) | ||
274 | pcibios_fixup_resource(&dev->resource[i], | ||
275 | hose->mem_space); | ||
276 | } | ||
277 | } | ||
278 | |||
279 | void __devinit | ||
280 | pcibios_fixup_bus(struct pci_bus *bus) | 254 | pcibios_fixup_bus(struct pci_bus *bus) |
281 | { | 255 | { |
282 | struct pci_dev *dev = bus->self; | 256 | struct pci_dev *dev = bus->self; |
@@ -284,13 +258,10 @@ pcibios_fixup_bus(struct pci_bus *bus) | |||
284 | if (pci_has_flag(PCI_PROBE_ONLY) && dev && | 258 | if (pci_has_flag(PCI_PROBE_ONLY) && dev && |
285 | (dev->class >> 8) == PCI_CLASS_BRIDGE_PCI) { | 259 | (dev->class >> 8) == PCI_CLASS_BRIDGE_PCI) { |
286 | pci_read_bridge_bases(bus); | 260 | pci_read_bridge_bases(bus); |
287 | pcibios_fixup_device_resources(dev, bus); | ||
288 | } | 261 | } |
289 | 262 | ||
290 | list_for_each_entry(dev, &bus->devices, bus_list) { | 263 | list_for_each_entry(dev, &bus->devices, bus_list) { |
291 | pdev_save_srm_config(dev); | 264 | pdev_save_srm_config(dev); |
292 | if ((dev->class >> 8) != PCI_CLASS_BRIDGE_PCI) | ||
293 | pcibios_fixup_device_resources(dev, bus); | ||
294 | } | 265 | } |
295 | } | 266 | } |
296 | 267 | ||
@@ -300,42 +271,6 @@ pcibios_update_irq(struct pci_dev *dev, int irq) | |||
300 | pci_write_config_byte(dev, PCI_INTERRUPT_LINE, irq); | 271 | pci_write_config_byte(dev, PCI_INTERRUPT_LINE, irq); |
301 | } | 272 | } |
302 | 273 | ||
303 | void | ||
304 | pcibios_resource_to_bus(struct pci_dev *dev, struct pci_bus_region *region, | ||
305 | struct resource *res) | ||
306 | { | ||
307 | struct pci_controller *hose = (struct pci_controller *)dev->sysdata; | ||
308 | unsigned long offset = 0; | ||
309 | |||
310 | if (res->flags & IORESOURCE_IO) | ||
311 | offset = hose->io_space->start; | ||
312 | else if (res->flags & IORESOURCE_MEM) | ||
313 | offset = hose->mem_space->start; | ||
314 | |||
315 | region->start = res->start - offset; | ||
316 | region->end = res->end - offset; | ||
317 | } | ||
318 | |||
319 | void pcibios_bus_to_resource(struct pci_dev *dev, struct resource *res, | ||
320 | struct pci_bus_region *region) | ||
321 | { | ||
322 | struct pci_controller *hose = (struct pci_controller *)dev->sysdata; | ||
323 | unsigned long offset = 0; | ||
324 | |||
325 | if (res->flags & IORESOURCE_IO) | ||
326 | offset = hose->io_space->start; | ||
327 | else if (res->flags & IORESOURCE_MEM) | ||
328 | offset = hose->mem_space->start; | ||
329 | |||
330 | res->start = region->start + offset; | ||
331 | res->end = region->end + offset; | ||
332 | } | ||
333 | |||
334 | #ifdef CONFIG_HOTPLUG | ||
335 | EXPORT_SYMBOL(pcibios_resource_to_bus); | ||
336 | EXPORT_SYMBOL(pcibios_bus_to_resource); | ||
337 | #endif | ||
338 | |||
339 | int | 274 | int |
340 | pcibios_enable_device(struct pci_dev *dev, int mask) | 275 | pcibios_enable_device(struct pci_dev *dev, int mask) |
341 | { | 276 | { |
@@ -415,8 +350,10 @@ common_init_pci(void) | |||
415 | hose->mem_space->end = end; | 350 | hose->mem_space->end = end; |
416 | 351 | ||
417 | INIT_LIST_HEAD(&resources); | 352 | INIT_LIST_HEAD(&resources); |
418 | pci_add_resource(&resources, hose->io_space); | 353 | pci_add_resource_offset(&resources, hose->io_space, |
419 | pci_add_resource(&resources, hose->mem_space); | 354 | hose->io_space->start); |
355 | pci_add_resource_offset(&resources, hose->mem_space, | ||
356 | hose->mem_space->start); | ||
420 | 357 | ||
421 | bus = pci_scan_root_bus(NULL, next_busno, alpha_mv.pci_ops, | 358 | bus = pci_scan_root_bus(NULL, next_busno, alpha_mv.pci_ops, |
422 | hose, &resources); | 359 | hose, &resources); |