Skip to content

Commit

Permalink
[PATCH] powerpc: properly configure DDR/P5IOC children devs
Browse files Browse the repository at this point in the history
The dynamic add path for PCI Host Bridges can fail to configure children
adapters under P5IOC controllers.  It fails to properly fixup bus/device
resources, and it fails to properly enable EEH.  Both of these steps
need to occur before any children devices are enabled in
pci_bus_add_devices().

Signed-off-by: John Rose <johnrose@austin.ibm.com>
Signed-off-by: Paul Mackerras <paulus@samba.org>
  • Loading branch information
John Rose authored and Paul Mackerras committed Mar 16, 2006
1 parent 920573b commit 92eb460
Show file tree
Hide file tree
Showing 4 changed files with 33 additions and 25 deletions.
5 changes: 3 additions & 2 deletions arch/powerpc/kernel/pci_64.c
Original file line number Diff line number Diff line change
Expand Up @@ -589,7 +589,6 @@ void __devinit scan_phb(struct pci_controller *hose)
#endif /* CONFIG_PPC_MULTIPLATFORM */
if (mode == PCI_PROBE_NORMAL)
hose->last_busno = bus->subordinate = pci_scan_child_bus(bus);
pci_bus_add_devices(bus);
}

static int __init pcibios_init(void)
Expand All @@ -608,8 +607,10 @@ static int __init pcibios_init(void)
printk("PCI: Probing PCI hardware\n");

/* Scan all of the recorded PCI controllers. */
list_for_each_entry_safe(hose, tmp, &hose_list, list_node)
list_for_each_entry_safe(hose, tmp, &hose_list, list_node) {
scan_phb(hose);
pci_bus_add_devices(hose->bus);
}

#ifndef CONFIG_PPC_ISERIES
if (pci_probe_only)
Expand Down
24 changes: 1 addition & 23 deletions arch/powerpc/kernel/rtas_pci.c
Original file line number Diff line number Diff line change
Expand Up @@ -280,8 +280,7 @@ static int phb_set_bus_ranges(struct device_node *dev,
return 0;
}

static int __devinit setup_phb(struct device_node *dev,
struct pci_controller *phb)
int __devinit setup_phb(struct device_node *dev, struct pci_controller *phb)
{
if (is_python(dev))
python_countermeasures(dev);
Expand Down Expand Up @@ -359,27 +358,6 @@ unsigned long __init find_and_init_phbs(void)
return 0;
}

struct pci_controller * __devinit init_phb_dynamic(struct device_node *dn)
{
struct pci_controller *phb;
int primary;

primary = list_empty(&hose_list);
phb = pcibios_alloc_controller(dn);
if (!phb)
return NULL;
setup_phb(dn, phb);
pci_process_bridge_OF_ranges(phb, dn, primary);

pci_setup_phb_io_dynamic(phb, primary);

pci_devs_phb_init_dynamic(phb);
scan_phb(phb);

return phb;
}
EXPORT_SYMBOL(init_phb_dynamic);

/* RPA-specific bits for removing PHBs */
int pcibios_remove_root_bus(struct pci_controller *phb)
{
Expand Down
28 changes: 28 additions & 0 deletions arch/powerpc/platforms/pseries/pci_dlpar.c
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@

#include <linux/pci.h>
#include <asm/pci-bridge.h>
#include <asm/ppc-pci.h>

static struct pci_bus *
find_bus_among_children(struct pci_bus *bus,
Expand Down Expand Up @@ -179,3 +180,30 @@ pcibios_add_pci_devices(struct pci_bus * bus)
}
}
EXPORT_SYMBOL_GPL(pcibios_add_pci_devices);

struct pci_controller * __devinit init_phb_dynamic(struct device_node *dn)
{
struct pci_controller *phb;
int primary;

primary = list_empty(&hose_list);
phb = pcibios_alloc_controller(dn);
if (!phb)
return NULL;
setup_phb(dn, phb);
pci_process_bridge_OF_ranges(phb, dn, 0);

pci_setup_phb_io_dynamic(phb, primary);

pci_devs_phb_init_dynamic(phb);

if (dn->child)
eeh_add_device_tree_early(dn);

scan_phb(phb);
pcibios_fixup_new_pci_devices(phb->bus, 0);
pci_bus_add_devices(phb->bus);

return phb;
}
EXPORT_SYMBOL_GPL(init_phb_dynamic);
1 change: 1 addition & 0 deletions include/asm-powerpc/ppc-pci.h
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ void *traverse_pci_devices(struct device_node *start, traverse_func pre,

void pci_devs_phb_init(void);
void pci_devs_phb_init_dynamic(struct pci_controller *phb);
int setup_phb(struct device_node *dev, struct pci_controller *phb);
void __devinit scan_phb(struct pci_controller *hose);

/* From rtas_pci.h */
Expand Down

0 comments on commit 92eb460

Please sign in to comment.