Commit 74713893 authored by Paul Mackerras's avatar Paul Mackerras Committed by Linus Torvalds

[PATCH] ppc64: remove deprecated firmware API

From: Linas Vepstas <linas@austin.ibm.com>

This patch eliminates the usage of the deprecated ibm,fw-phb-id token for
idnetifying PCI bus heads in favor of the documented, offically supported
mechanism for obtaining this info.  Please note that some versions of
firmware may return incorrect values for the ibm,fw-phb-id token.
Signed-off-by: default avatarLinas Vepstas <linas@linas.org>
Signed-off-by: default avatarPaul Mackerras <paulus@samba.org>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent d650e991
...@@ -543,7 +543,7 @@ static void *early_enable_eeh(struct device_node *dn, void *data) ...@@ -543,7 +543,7 @@ static void *early_enable_eeh(struct device_node *dn, void *data)
dn->full_name); dn->full_name);
#endif #endif
} else { } else {
printk(KERN_WARNING "EEH: %s: rtas_call failed.\n", printk(KERN_WARNING "EEH: %s: could not enable EEH, rtas_call failed.\n",
dn->full_name); dn->full_name);
} }
} else { } else {
...@@ -588,24 +588,17 @@ void __init eeh_init(void) ...@@ -588,24 +588,17 @@ void __init eeh_init(void)
} }
/* Enable EEH for all adapters. Note that eeh requires buid's */ /* Enable EEH for all adapters. Note that eeh requires buid's */
init_pci_config_tokens();
for (phb = of_find_node_by_name(NULL, "pci"); phb; for (phb = of_find_node_by_name(NULL, "pci"); phb;
phb = of_find_node_by_name(phb, "pci")) { phb = of_find_node_by_name(phb, "pci")) {
int len; unsigned long buid;
int *buid_vals;
buid_vals = (int *)get_property(phb, "ibm,fw-phb-id", &len); buid = get_phb_buid(phb);
if (!buid_vals) if (buid == 0)
continue; continue;
if (len == sizeof(int)) {
info.buid_lo = buid_vals[0]; info.buid_lo = BUID_LO(buid);
info.buid_hi = 0; info.buid_hi = BUID_HI(buid);
} else if (len == sizeof(int)*2) {
info.buid_hi = buid_vals[0];
info.buid_lo = buid_vals[1];
} else {
printk(KERN_INFO "EEH: odd ibm,fw-phb-id len returned: %d\n", len);
continue;
}
traverse_pci_devices(phb, early_enable_eeh, NULL, &info); traverse_pci_devices(phb, early_enable_eeh, NULL, &info);
} }
......
...@@ -355,14 +355,51 @@ static void python_countermeasures(unsigned long addr) ...@@ -355,14 +355,51 @@ static void python_countermeasures(unsigned long addr)
iounmap(chip_regs); iounmap(chip_regs);
} }
struct pci_controller *alloc_phb(struct device_node *dev, void __init init_pci_config_tokens (void)
{
read_pci_config = rtas_token("read-pci-config");
write_pci_config = rtas_token("write-pci-config");
ibm_read_pci_config = rtas_token("ibm,read-pci-config");
ibm_write_pci_config = rtas_token("ibm,write-pci-config");
}
unsigned long __init get_phb_buid (struct device_node *phb)
{
int addr_cells;
unsigned int *buid_vals;
unsigned int len;
unsigned long buid;
if (ibm_read_pci_config == -1) return 0;
/* PHB's will always be children of the root node,
* or so it is promised by the current firmware. */
if (phb->parent == NULL)
return 0;
if (phb->parent->parent)
return 0;
buid_vals = (unsigned int *) get_property(phb, "reg", &len);
if (buid_vals == NULL)
return 0;
addr_cells = prom_n_addr_cells(phb);
if (addr_cells == 1) {
buid = (unsigned long) buid_vals[0];
} else {
buid = (((unsigned long)buid_vals[0]) << 32UL) |
(((unsigned long)buid_vals[1]) & 0xffffffff);
}
return buid;
}
static struct pci_controller * __init alloc_phb(struct device_node *dev,
unsigned int addr_size_words) unsigned int addr_size_words)
{ {
struct pci_controller *phb; struct pci_controller *phb;
unsigned int *ui_ptr = NULL, len; unsigned int *ui_ptr = NULL, len;
struct reg_property64 reg_struct; struct reg_property64 reg_struct;
int *bus_range; int *bus_range;
int *buid_vals;
char *model; char *model;
enum phb_types phb_type; enum phb_types phb_type;
struct property *of_prop; struct property *of_prop;
...@@ -433,18 +470,7 @@ struct pci_controller *alloc_phb(struct device_node *dev, ...@@ -433,18 +470,7 @@ struct pci_controller *alloc_phb(struct device_node *dev,
phb->arch_data = dev; phb->arch_data = dev;
phb->ops = &rtas_pci_ops; phb->ops = &rtas_pci_ops;
buid_vals = (int *) get_property(dev, "ibm,fw-phb-id", &len); phb->buid = get_phb_buid(dev);
if (buid_vals == NULL) {
phb->buid = 0;
} else {
if (len < 2 * sizeof(int))
// Support for new OF that only has 1 integer for buid.
phb->buid = (unsigned long)buid_vals[0];
else
phb->buid = (((unsigned long)buid_vals[0]) << 32UL) |
(((unsigned long)buid_vals[1]) & 0xffffffff);
}
return phb; return phb;
} }
...@@ -458,11 +484,6 @@ unsigned long __init find_and_init_phbs(void) ...@@ -458,11 +484,6 @@ unsigned long __init find_and_init_phbs(void)
unsigned int *opprop; unsigned int *opprop;
struct device_node *root = of_find_node_by_path("/"); struct device_node *root = of_find_node_by_path("/");
read_pci_config = rtas_token("read-pci-config");
write_pci_config = rtas_token("write-pci-config");
ibm_read_pci_config = rtas_token("ibm,read-pci-config");
ibm_write_pci_config = rtas_token("ibm,write-pci-config");
if (naca->interrupt_controller == IC_OPEN_PIC) { if (naca->interrupt_controller == IC_OPEN_PIC) {
opprop = (unsigned int *)get_property(root, opprop = (unsigned int *)get_property(root,
"platform-open-pic", NULL); "platform-open-pic", NULL);
......
...@@ -47,4 +47,9 @@ struct device_node *fetch_dev_dn(struct pci_dev *dev); ...@@ -47,4 +47,9 @@ struct device_node *fetch_dev_dn(struct pci_dev *dev);
void pci_addr_cache_insert_device(struct pci_dev *dev); void pci_addr_cache_insert_device(struct pci_dev *dev);
void pci_addr_cache_remove_device(struct pci_dev *dev); void pci_addr_cache_remove_device(struct pci_dev *dev);
/* From pSeries_pci.h */
void init_pci_config_tokens (void);
unsigned long get_phb_buid (struct device_node *);
#endif /* __PPC_KERNEL_PCI_H__ */ #endif /* __PPC_KERNEL_PCI_H__ */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment