PCI: Call pci_read_bridge_bases() from core instead of arch code
When we scan a PCI bus, we read PCI-PCI bridge window registers with pci_read_bridge_bases() so we can validate the resource hierarchy. Most architectures call pci_read_bridge_bases() from pcibios_fixup_bus(), but PCI-PCI bridges are not arch-specific, so this doesn't need to be in arch-specific code. Call pci_read_bridge_bases() directly from the PCI core instead of from arch code. For alpha and mips, we now call pci_read_bridge_bases() always; previously we only called it if PCI_PROBE_ONLY was set. [bhelgaas: changelog] Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com> Signed-off-by: Bjorn Helgaas <bhelgaas@google.com> CC: Ralf Baechle <ralf@linux-mips.org> CC: James E.J. Bottomley <jejb@parisc-linux.org> CC: Michael Ellerman <mpe@ellerman.id.au> CC: Bjorn Helgaas <bhelgaas@google.com> CC: Richard Henderson <rth@twiddle.net> CC: Benjamin Herrenschmidt <benh@kernel.crashing.org> CC: David Howells <dhowells@redhat.com> CC: Russell King <linux@arm.linux.org.uk> CC: Tony Luck <tony.luck@intel.com> CC: David S. Miller <davem@davemloft.net> CC: Ingo Molnar <mingo@redhat.com> CC: Guenter Roeck <linux@roeck-us.net> CC: Michal Simek <monstr@monstr.eu> CC: Chris Zankel <chris@zankel.net>
This commit is contained in:
parent
bc0195aad0
commit
dff22d2054
@ -242,12 +242,7 @@ pci_restore_srm_config(void)
|
|||||||
|
|
||||||
void pcibios_fixup_bus(struct pci_bus *bus)
|
void pcibios_fixup_bus(struct pci_bus *bus)
|
||||||
{
|
{
|
||||||
struct pci_dev *dev = bus->self;
|
struct pci_dev *dev;
|
||||||
|
|
||||||
if (pci_has_flag(PCI_PROBE_ONLY) && dev &&
|
|
||||||
(dev->class >> 8) == PCI_CLASS_BRIDGE_PCI) {
|
|
||||||
pci_read_bridge_bases(bus);
|
|
||||||
}
|
|
||||||
|
|
||||||
list_for_each_entry(dev, &bus->devices, bus_list) {
|
list_for_each_entry(dev, &bus->devices, bus_list) {
|
||||||
pdev_save_srm_config(dev);
|
pdev_save_srm_config(dev);
|
||||||
|
@ -294,8 +294,6 @@ void pcibios_fixup_bus(struct pci_bus *bus)
|
|||||||
printk("### PCIBIOS_FIXUP_BUS(%d)\n",bus->number);
|
printk("### PCIBIOS_FIXUP_BUS(%d)\n",bus->number);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
pci_read_bridge_bases(bus);
|
|
||||||
|
|
||||||
if (bus->number == 0) {
|
if (bus->number == 0) {
|
||||||
struct pci_dev *dev;
|
struct pci_dev *dev;
|
||||||
list_for_each_entry(dev, &bus->devices, bus_list) {
|
list_for_each_entry(dev, &bus->devices, bus_list) {
|
||||||
|
@ -533,10 +533,9 @@ void pcibios_fixup_bus(struct pci_bus *b)
|
|||||||
{
|
{
|
||||||
struct pci_dev *dev;
|
struct pci_dev *dev;
|
||||||
|
|
||||||
if (b->self) {
|
if (b->self)
|
||||||
pci_read_bridge_bases(b);
|
|
||||||
pcibios_fixup_bridge_resources(b->self);
|
pcibios_fixup_bridge_resources(b->self);
|
||||||
}
|
|
||||||
list_for_each_entry(dev, &b->devices, bus_list)
|
list_for_each_entry(dev, &b->devices, bus_list)
|
||||||
pcibios_fixup_device_resources(dev);
|
pcibios_fixup_device_resources(dev);
|
||||||
platform_pci_fixup_bus(b);
|
platform_pci_fixup_bus(b);
|
||||||
|
@ -863,14 +863,7 @@ void pcibios_setup_bus_devices(struct pci_bus *bus)
|
|||||||
|
|
||||||
void pcibios_fixup_bus(struct pci_bus *bus)
|
void pcibios_fixup_bus(struct pci_bus *bus)
|
||||||
{
|
{
|
||||||
/* When called from the generic PCI probe, read PCI<->PCI bridge
|
/* Fixup the bus */
|
||||||
* bases. This is -not- called when generating the PCI tree from
|
|
||||||
* the OF device-tree.
|
|
||||||
*/
|
|
||||||
if (bus->self != NULL)
|
|
||||||
pci_read_bridge_bases(bus);
|
|
||||||
|
|
||||||
/* Now fixup the bus bus */
|
|
||||||
pcibios_setup_bus_self(bus);
|
pcibios_setup_bus_self(bus);
|
||||||
|
|
||||||
/* Now fixup devices on that bus */
|
/* Now fixup devices on that bus */
|
||||||
|
@ -311,12 +311,6 @@ int pcibios_enable_device(struct pci_dev *dev, int mask)
|
|||||||
|
|
||||||
void pcibios_fixup_bus(struct pci_bus *bus)
|
void pcibios_fixup_bus(struct pci_bus *bus)
|
||||||
{
|
{
|
||||||
struct pci_dev *dev = bus->self;
|
|
||||||
|
|
||||||
if (pci_has_flag(PCI_PROBE_ONLY) && dev &&
|
|
||||||
(dev->class >> 8) == PCI_CLASS_BRIDGE_PCI) {
|
|
||||||
pci_read_bridge_bases(bus);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
EXPORT_SYMBOL(PCIBIOS_MIN_IO);
|
EXPORT_SYMBOL(PCIBIOS_MIN_IO);
|
||||||
|
@ -324,7 +324,6 @@ void pcibios_fixup_bus(struct pci_bus *bus)
|
|||||||
struct pci_dev *dev;
|
struct pci_dev *dev;
|
||||||
|
|
||||||
if (bus->self) {
|
if (bus->self) {
|
||||||
pci_read_bridge_bases(bus);
|
|
||||||
pcibios_fixup_bridge_resources(bus->self);
|
pcibios_fixup_bridge_resources(bus->self);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1044,13 +1044,7 @@ void pcibios_set_master(struct pci_dev *dev)
|
|||||||
|
|
||||||
void pcibios_fixup_bus(struct pci_bus *bus)
|
void pcibios_fixup_bus(struct pci_bus *bus)
|
||||||
{
|
{
|
||||||
/* When called from the generic PCI probe, read PCI<->PCI bridge
|
/* Fixup the bus */
|
||||||
* bases. This is -not- called when generating the PCI tree from
|
|
||||||
* the OF device-tree.
|
|
||||||
*/
|
|
||||||
pci_read_bridge_bases(bus);
|
|
||||||
|
|
||||||
/* Now fixup the bus bus */
|
|
||||||
pcibios_setup_bus_self(bus);
|
pcibios_setup_bus_self(bus);
|
||||||
|
|
||||||
/* Now fixup devices on that bus */
|
/* Now fixup devices on that bus */
|
||||||
|
@ -166,7 +166,6 @@ void pcibios_fixup_bus(struct pci_bus *b)
|
|||||||
{
|
{
|
||||||
struct pci_dev *dev;
|
struct pci_dev *dev;
|
||||||
|
|
||||||
pci_read_bridge_bases(b);
|
|
||||||
list_for_each_entry(dev, &b->devices, bus_list)
|
list_for_each_entry(dev, &b->devices, bus_list)
|
||||||
pcibios_fixup_device_resources(dev);
|
pcibios_fixup_device_resources(dev);
|
||||||
}
|
}
|
||||||
|
@ -210,10 +210,6 @@ subsys_initcall(pcibios_init);
|
|||||||
|
|
||||||
void pcibios_fixup_bus(struct pci_bus *bus)
|
void pcibios_fixup_bus(struct pci_bus *bus)
|
||||||
{
|
{
|
||||||
if (bus->parent) {
|
|
||||||
/* This is a subordinate bridge */
|
|
||||||
pci_read_bridge_bases(bus);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void pcibios_set_master(struct pci_dev *dev)
|
void pcibios_set_master(struct pci_dev *dev)
|
||||||
|
@ -560,9 +560,6 @@ dino_fixup_bus(struct pci_bus *bus)
|
|||||||
} else if (bus->parent) {
|
} else if (bus->parent) {
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
pci_read_bridge_bases(bus);
|
|
||||||
|
|
||||||
|
|
||||||
for(i = PCI_BRIDGE_RESOURCES; i < PCI_NUM_RESOURCES; i++) {
|
for(i = PCI_BRIDGE_RESOURCES; i < PCI_NUM_RESOURCES; i++) {
|
||||||
if((bus->self->resource[i].flags &
|
if((bus->self->resource[i].flags &
|
||||||
(IORESOURCE_IO | IORESOURCE_MEM)) == 0)
|
(IORESOURCE_IO | IORESOURCE_MEM)) == 0)
|
||||||
|
@ -693,7 +693,6 @@ lba_fixup_bus(struct pci_bus *bus)
|
|||||||
if (bus->parent) {
|
if (bus->parent) {
|
||||||
int i;
|
int i;
|
||||||
/* PCI-PCI Bridge */
|
/* PCI-PCI Bridge */
|
||||||
pci_read_bridge_bases(bus);
|
|
||||||
for (i = PCI_BRIDGE_RESOURCES; i < PCI_NUM_RESOURCES; i++)
|
for (i = PCI_BRIDGE_RESOURCES; i < PCI_NUM_RESOURCES; i++)
|
||||||
pci_claim_bridge_resource(bus->self, i);
|
pci_claim_bridge_resource(bus->self, i);
|
||||||
} else {
|
} else {
|
||||||
|
@ -826,6 +826,9 @@ int pci_scan_bridge(struct pci_bus *bus, struct pci_dev *dev, int max, int pass)
|
|||||||
child->bridge_ctl = bctl;
|
child->bridge_ctl = bctl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Read and initialize bridge resources */
|
||||||
|
pci_read_bridge_bases(child);
|
||||||
|
|
||||||
cmax = pci_scan_child_bus(child);
|
cmax = pci_scan_child_bus(child);
|
||||||
if (cmax > subordinate)
|
if (cmax > subordinate)
|
||||||
dev_warn(&dev->dev, "bridge has subordinate %02x but max busn %02x\n",
|
dev_warn(&dev->dev, "bridge has subordinate %02x but max busn %02x\n",
|
||||||
@ -886,6 +889,9 @@ int pci_scan_bridge(struct pci_bus *bus, struct pci_dev *dev, int max, int pass)
|
|||||||
|
|
||||||
if (!is_cardbus) {
|
if (!is_cardbus) {
|
||||||
child->bridge_ctl = bctl;
|
child->bridge_ctl = bctl;
|
||||||
|
|
||||||
|
/* Read and initialize bridge resources */
|
||||||
|
pci_read_bridge_bases(child);
|
||||||
max = pci_scan_child_bus(child);
|
max = pci_scan_child_bus(child);
|
||||||
} else {
|
} else {
|
||||||
/*
|
/*
|
||||||
|
Loading…
Reference in New Issue
Block a user