| From c82da6da37a975fb2b8d07723b76be3b339b5291 Mon Sep 17 00:00:00 2001 |
| From: Gavin Shan <gwshan@linux.vnet.ibm.com> |
| Date: Thu, 28 Jan 2016 16:18:37 +1100 |
| Subject: [PATCH 4/5] powerpc/eeh: Fix PE location code |
| |
| In eeh_pe_loc_get(), the PE location code is retrieved from the |
| "ibm,loc-code" property of the device node for the bridge of the |
| PE's primary bus. It's not correct because the property indicates |
| the parent PE's location code. |
| |
| This reads the correct PE location code from "ibm,io-base-loc-code" |
| or "ibm,slot-location-code" property of PE parent bus's device node. |
| |
| Signed-off-by: Gavin Shan <gwshan@linux.vnet.ibm.com> |
| Signed-off-by: Sam Mendoza-Jonas <sam@mendozajonas.com> |
| Signed-off-by: Joel Stanley <joel@jms.id.au> |
| --- |
| arch/powerpc/kernel/eeh_pe.c | 33 +++++++++++++++------------------ |
| 1 file changed, 15 insertions(+), 18 deletions(-) |
| |
| diff --git a/arch/powerpc/kernel/eeh_pe.c b/arch/powerpc/kernel/eeh_pe.c |
| index 8654cb166c19..ca9e5371930e 100644 |
| --- a/arch/powerpc/kernel/eeh_pe.c |
| +++ b/arch/powerpc/kernel/eeh_pe.c |
| @@ -883,32 +883,29 @@ void eeh_pe_restore_bars(struct eeh_pe *pe) |
| const char *eeh_pe_loc_get(struct eeh_pe *pe) |
| { |
| struct pci_bus *bus = eeh_pe_bus_get(pe); |
| - struct device_node *dn = pci_bus_to_OF_node(bus); |
| + struct device_node *dn; |
| const char *loc = NULL; |
| |
| - if (!dn) |
| - goto out; |
| + while (bus) { |
| + dn = pci_bus_to_OF_node(bus); |
| + if (!dn) { |
| + bus = bus->parent; |
| + continue; |
| + } |
| |
| - /* PHB PE or root PE ? */ |
| - if (pci_is_root_bus(bus)) { |
| - loc = of_get_property(dn, "ibm,loc-code", NULL); |
| - if (!loc) |
| + if (pci_is_root_bus(bus)) |
| loc = of_get_property(dn, "ibm,io-base-loc-code", NULL); |
| + else |
| + loc = of_get_property(dn, "ibm,slot-location-code", |
| + NULL); |
| + |
| if (loc) |
| - goto out; |
| + return loc; |
| |
| - /* Check the root port */ |
| - dn = dn->child; |
| - if (!dn) |
| - goto out; |
| + bus = bus->parent; |
| } |
| |
| - loc = of_get_property(dn, "ibm,loc-code", NULL); |
| - if (!loc) |
| - loc = of_get_property(dn, "ibm,slot-location-code", NULL); |
| - |
| -out: |
| - return loc ? loc : "N/A"; |
| + return "N/A"; |
| } |
| |
| /** |
| -- |
| 2.7.0 |
| |