Unlike real PCI slots, opencapi slots are directly associated to
the (virtual) opencapi PHB, there's no intermediate bridge. So when
looking for a slot ID, we must start the search from the device node
itself and not its parent.

Also, the slot ID is not attached to a specific bdfn, so let's build
it from the PHB ID, like skiboot.

Signed-off-by: Frederic Barrat <fbar...@linux.ibm.com>
---
Changelog:
v2:
 - rename variable used when looping (Andrew)


 arch/powerpc/include/asm/pnv-pci.h   |  1 +
 arch/powerpc/platforms/powernv/pci.c | 24 ++++++++++++++----------
 2 files changed, 15 insertions(+), 10 deletions(-)

diff --git a/arch/powerpc/include/asm/pnv-pci.h 
b/arch/powerpc/include/asm/pnv-pci.h
index edcb1fc50aeb..d0ee0ede5767 100644
--- a/arch/powerpc/include/asm/pnv-pci.h
+++ b/arch/powerpc/include/asm/pnv-pci.h
@@ -15,6 +15,7 @@
 #define PCI_SLOT_ID_PREFIX     (1UL << 63)
 #define PCI_SLOT_ID(phb_id, bdfn)      \
        (PCI_SLOT_ID_PREFIX | ((uint64_t)(bdfn) << 16) | (phb_id))
+#define PCI_PHB_SLOT_ID(phb_id)                (phb_id)
 
 extern int pnv_pci_get_slot_id(struct device_node *np, uint64_t *id);
 extern int pnv_pci_get_device_tree(uint32_t phandle, void *buf, uint64_t len);
diff --git a/arch/powerpc/platforms/powernv/pci.c 
b/arch/powerpc/platforms/powernv/pci.c
index 2825d004dece..44c973bfaa97 100644
--- a/arch/powerpc/platforms/powernv/pci.c
+++ b/arch/powerpc/platforms/powernv/pci.c
@@ -38,7 +38,7 @@ static DEFINE_MUTEX(tunnel_mutex);
 
 int pnv_pci_get_slot_id(struct device_node *np, uint64_t *id)
 {
-       struct device_node *parent = np;
+       struct device_node *node = np;
        u32 bdfn;
        u64 phbid;
        int ret;
@@ -48,25 +48,29 @@ int pnv_pci_get_slot_id(struct device_node *np, uint64_t 
*id)
                return -ENXIO;
 
        bdfn = ((bdfn & 0x00ffff00) >> 8);
-       while ((parent = of_get_parent(parent))) {
-               if (!PCI_DN(parent)) {
-                       of_node_put(parent);
+       for (node = np; node; node = of_get_parent(node)) {
+               if (!PCI_DN(node)) {
+                       of_node_put(node);
                        break;
                }
 
-               if (!of_device_is_compatible(parent, "ibm,ioda2-phb") &&
-                   !of_device_is_compatible(parent, "ibm,ioda3-phb")) {
-                       of_node_put(parent);
+               if (!of_device_is_compatible(node, "ibm,ioda2-phb") &&
+                   !of_device_is_compatible(node, "ibm,ioda3-phb") &&
+                   !of_device_is_compatible(node, 
"ibm,ioda2-npu2-opencapi-phb")) {
+                       of_node_put(node);
                        continue;
                }
 
-               ret = of_property_read_u64(parent, "ibm,opal-phbid", &phbid);
+               ret = of_property_read_u64(node, "ibm,opal-phbid", &phbid);
                if (ret) {
-                       of_node_put(parent);
+                       of_node_put(node);
                        return -ENXIO;
                }
 
-               *id = PCI_SLOT_ID(phbid, bdfn);
+               if (of_device_is_compatible(node, 
"ibm,ioda2-npu2-opencapi-phb"))
+                       *id = PCI_PHB_SLOT_ID(phbid);
+               else
+                       *id = PCI_SLOT_ID(phbid, bdfn);
                return 0;
        }
 
-- 
2.21.0

Reply via email to