[PATCH] powerpc: clean up iSeries PCI probe
Only scan the host bridges and then use the existing pci_devs_phb_init() routine. Also fix typo in setup of reg property. Signed-off-by: Stephen Rothwell <sfr@canb.auug.org.au> Signed-off-by: Paul Mackerras <paulus@samba.org>
This commit is contained in:
Родитель
efbd386967
Коммит
095eed4f8d
|
@ -31,6 +31,7 @@
|
||||||
#include <asm/pci-bridge.h>
|
#include <asm/pci-bridge.h>
|
||||||
#include <asm/pSeries_reconfig.h>
|
#include <asm/pSeries_reconfig.h>
|
||||||
#include <asm/ppc-pci.h>
|
#include <asm/ppc-pci.h>
|
||||||
|
#include <asm/firmware.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Traverse_func that inits the PCI fields of the device node.
|
* Traverse_func that inits the PCI fields of the device node.
|
||||||
|
@ -59,6 +60,11 @@ static void * __devinit update_dn_pci_info(struct device_node *dn, void *data)
|
||||||
pdn->busno = (regs[0] >> 16) & 0xff;
|
pdn->busno = (regs[0] >> 16) & 0xff;
|
||||||
pdn->devfn = (regs[0] >> 8) & 0xff;
|
pdn->devfn = (regs[0] >> 8) & 0xff;
|
||||||
}
|
}
|
||||||
|
if (firmware_has_feature(FW_FEATURE_ISERIES)) {
|
||||||
|
u32 *busp = (u32 *)get_property(dn, "linux,subbus", NULL);
|
||||||
|
if (busp)
|
||||||
|
pdn->bussubno = *busp;
|
||||||
|
}
|
||||||
|
|
||||||
pdn->pci_ext_config_space = (type && *type == 1);
|
pdn->pci_ext_config_space = (type && *type == 1);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
|
@ -166,13 +166,21 @@ static void pci_Log_Error(char *Error_Text, int Bus, int SubBus,
|
||||||
void iSeries_pcibios_init(void)
|
void iSeries_pcibios_init(void)
|
||||||
{
|
{
|
||||||
struct pci_controller *phb;
|
struct pci_controller *phb;
|
||||||
struct device_node *node;
|
struct device_node *root = of_find_node_by_path("/");
|
||||||
struct device_node *dn;
|
struct device_node *node = NULL;
|
||||||
|
|
||||||
for_each_node_by_type(node, "pci") {
|
if (root == NULL) {
|
||||||
|
printk(KERN_CRIT "iSeries_pcibios_init: can't find root "
|
||||||
|
"of device tree\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
while ((node = of_get_next_child(root, node)) != NULL) {
|
||||||
HvBusNumber bus;
|
HvBusNumber bus;
|
||||||
u32 *busp;
|
u32 *busp;
|
||||||
|
|
||||||
|
if ((node->type == NULL) || (strcmp(node->type, "pci") != 0))
|
||||||
|
continue;
|
||||||
|
|
||||||
busp = (u32 *)get_property(node, "bus-range", NULL);
|
busp = (u32 *)get_property(node, "bus-range", NULL);
|
||||||
if (busp == NULL)
|
if (busp == NULL)
|
||||||
continue;
|
continue;
|
||||||
|
@ -186,33 +194,11 @@ void iSeries_pcibios_init(void)
|
||||||
phb->first_busno = bus;
|
phb->first_busno = bus;
|
||||||
phb->last_busno = bus;
|
phb->last_busno = bus;
|
||||||
phb->ops = &iSeries_pci_ops;
|
phb->ops = &iSeries_pci_ops;
|
||||||
|
|
||||||
/* Find and connect the devices. */
|
|
||||||
for (dn = NULL; (dn = of_get_next_child(node, dn)) != NULL;) {
|
|
||||||
struct pci_dn *pdn;
|
|
||||||
u32 *reg;
|
|
||||||
|
|
||||||
reg = (u32 *)get_property(dn, "reg", NULL);
|
|
||||||
if (reg == NULL) {
|
|
||||||
printk(KERN_DEBUG "no reg property!\n");
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
busp = (u32 *)get_property(dn, "linux,subbus", NULL);
|
|
||||||
if (busp == NULL) {
|
|
||||||
printk(KERN_DEBUG "no subbus property!\n");
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
pdn = kzalloc(sizeof(*pdn), GFP_KERNEL);
|
|
||||||
if (pdn == NULL)
|
|
||||||
return;
|
|
||||||
dn->data = pdn;
|
|
||||||
pdn->node = dn;
|
|
||||||
pdn->busno = bus;
|
|
||||||
pdn->devfn = (reg[0] >> 8) & 0xff;
|
|
||||||
pdn->bussubno = *busp;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
of_node_put(root);
|
||||||
|
|
||||||
|
pci_devs_phb_init();
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -1073,7 +1073,7 @@ static void scan_bridge_slot(struct iseries_flat_dt *dt, HvBusNumber bus,
|
||||||
snprintf(buf, sizeof(buf), "pci@%x,%d",
|
snprintf(buf, sizeof(buf), "pci@%x,%d",
|
||||||
PCI_SLOT(devfn), function);
|
PCI_SLOT(devfn), function);
|
||||||
dt_start_node(dt, buf);
|
dt_start_node(dt, buf);
|
||||||
reg[0] = (bus << 18) | (devfn << 8);
|
reg[0] = (bus << 16) | (devfn << 8);
|
||||||
reg[1] = 0;
|
reg[1] = 0;
|
||||||
reg[2] = 0;
|
reg[2] = 0;
|
||||||
reg[3] = 0;
|
reg[3] = 0;
|
||||||
|
|
Загрузка…
Ссылка в новой задаче