diff options
author | Bjorn Helgaas <bjorn.helgaas@hp.com> | 2010-02-23 12:24:21 -0500 |
---|---|---|
committer | Jesse Barnes <jbarnes@virtuousgeek.org> | 2010-02-23 12:43:17 -0500 |
commit | fa27b2d108fa49685129867a8c5b968344d6e197 (patch) | |
tree | 442356bc1afa2aacf1afc7e53ebc9aca8a14903d /drivers/pci/probe.c | |
parent | b16694f70c40ea8d539cdc93a422039771e85870 (diff) |
PCI: split up pci_read_bridge_bases()
No functional change; this breaks up pci_read_bridge_bases() into separate
pieces for the I/O, memory, and prefetchable memory windows, similar to how
Yinghai recently split up pci_setup_bridge() in 68e84ff3bdc.
Signed-off-by: Bjorn Helgaas <bjorn.helgaas@hp.com>
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Diffstat (limited to 'drivers/pci/probe.c')
-rw-r--r-- | drivers/pci/probe.c | 54 |
1 files changed, 39 insertions, 15 deletions
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c index d3009430eab6..4b47b4bfb066 100644 --- a/drivers/pci/probe.c +++ b/drivers/pci/probe.c | |||
@@ -281,26 +281,12 @@ static void pci_read_bases(struct pci_dev *dev, unsigned int howmany, int rom) | |||
281 | } | 281 | } |
282 | } | 282 | } |
283 | 283 | ||
284 | void __devinit pci_read_bridge_bases(struct pci_bus *child) | 284 | static void __devinit pci_read_bridge_io(struct pci_bus *child) |
285 | { | 285 | { |
286 | struct pci_dev *dev = child->self; | 286 | struct pci_dev *dev = child->self; |
287 | u8 io_base_lo, io_limit_lo; | 287 | u8 io_base_lo, io_limit_lo; |
288 | u16 mem_base_lo, mem_limit_lo; | ||
289 | unsigned long base, limit; | 288 | unsigned long base, limit; |
290 | struct resource *res; | 289 | struct resource *res; |
291 | int i; | ||
292 | |||
293 | if (pci_is_root_bus(child)) /* It's a host bus, nothing to read */ | ||
294 | return; | ||
295 | |||
296 | dev_info(&dev->dev, "PCI bridge to [bus %02x-%02x]%s\n", | ||
297 | child->secondary, child->subordinate, | ||
298 | dev->transparent ? " (subtractive decode)": ""); | ||
299 | |||
300 | if (dev->transparent) { | ||
301 | for(i = 3; i < PCI_BUS_NUM_RESOURCES; i++) | ||
302 | child->resource[i] = child->parent->resource[i - 3]; | ||
303 | } | ||
304 | 290 | ||
305 | res = child->resource[0]; | 291 | res = child->resource[0]; |
306 | pci_read_config_byte(dev, PCI_IO_BASE, &io_base_lo); | 292 | pci_read_config_byte(dev, PCI_IO_BASE, &io_base_lo); |
@@ -328,6 +314,14 @@ void __devinit pci_read_bridge_bases(struct pci_bus *child) | |||
328 | " bridge window [io %04lx - %04lx] reg reading\n", | 314 | " bridge window [io %04lx - %04lx] reg reading\n", |
329 | base, limit); | 315 | base, limit); |
330 | } | 316 | } |
317 | } | ||
318 | |||
319 | static void __devinit pci_read_bridge_mmio(struct pci_bus *child) | ||
320 | { | ||
321 | struct pci_dev *dev = child->self; | ||
322 | u16 mem_base_lo, mem_limit_lo; | ||
323 | unsigned long base, limit; | ||
324 | struct resource *res; | ||
331 | 325 | ||
332 | res = child->resource[1]; | 326 | res = child->resource[1]; |
333 | pci_read_config_word(dev, PCI_MEMORY_BASE, &mem_base_lo); | 327 | pci_read_config_word(dev, PCI_MEMORY_BASE, &mem_base_lo); |
@@ -344,6 +338,14 @@ void __devinit pci_read_bridge_bases(struct pci_bus *child) | |||
344 | " bridge window [mem 0x%08lx - 0x%08lx] reg reading\n", | 338 | " bridge window [mem 0x%08lx - 0x%08lx] reg reading\n", |
345 | base, limit + 0xfffff); | 339 | base, limit + 0xfffff); |
346 | } | 340 | } |
341 | } | ||
342 | |||
343 | static void __devinit pci_read_bridge_mmio_pref(struct pci_bus *child) | ||
344 | { | ||
345 | struct pci_dev *dev = child->self; | ||
346 | u16 mem_base_lo, mem_limit_lo; | ||
347 | unsigned long base, limit; | ||
348 | struct resource *res; | ||
347 | 349 | ||
348 | res = child->resource[2]; | 350 | res = child->resource[2]; |
349 | pci_read_config_word(dev, PCI_PREF_MEMORY_BASE, &mem_base_lo); | 351 | pci_read_config_word(dev, PCI_PREF_MEMORY_BASE, &mem_base_lo); |
@@ -389,6 +391,28 @@ void __devinit pci_read_bridge_bases(struct pci_bus *child) | |||
389 | } | 391 | } |
390 | } | 392 | } |
391 | 393 | ||
394 | void __devinit pci_read_bridge_bases(struct pci_bus *child) | ||
395 | { | ||
396 | struct pci_dev *dev = child->self; | ||
397 | int i; | ||
398 | |||
399 | if (pci_is_root_bus(child)) /* It's a host bus, nothing to read */ | ||
400 | return; | ||
401 | |||
402 | dev_info(&dev->dev, "PCI bridge to [bus %02x-%02x]%s\n", | ||
403 | child->secondary, child->subordinate, | ||
404 | dev->transparent ? " (subtractive decode)" : ""); | ||
405 | |||
406 | if (dev->transparent) { | ||
407 | for (i = 3; i < PCI_BUS_NUM_RESOURCES; i++) | ||
408 | child->resource[i] = child->parent->resource[i - 3]; | ||
409 | } | ||
410 | |||
411 | pci_read_bridge_io(child); | ||
412 | pci_read_bridge_mmio(child); | ||
413 | pci_read_bridge_mmio_pref(child); | ||
414 | } | ||
415 | |||
392 | static struct pci_bus * pci_alloc_bus(void) | 416 | static struct pci_bus * pci_alloc_bus(void) |
393 | { | 417 | { |
394 | struct pci_bus *b; | 418 | struct pci_bus *b; |