]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
powerpc/powernv/ioda: Find opencapi slot for a device node
authorFrederic Barrat <fbarrat@linux.ibm.com>
Thu, 21 Nov 2019 13:49:12 +0000 (14:49 +0100)
committerMichael Ellerman <mpe@ellerman.id.au>
Thu, 23 Jan 2020 10:31:17 +0000 (21:31 +1100)
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 <fbarrat@linux.ibm.com>
Reviewed-by: Andrew Donnellan <ajd@linux.ibm.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20191121134918.7155-6-fbarrat@linux.ibm.com
arch/powerpc/include/asm/pnv-pci.h
arch/powerpc/platforms/powernv/pci.c

index edcb1fc50aebc5adef08352390b94a295ff80c0c..d0ee0ede576783a94350ef6d9b20098ae337b389 100644 (file)
@@ -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);
index e8e58a2cccddf7e3296eedf6dc0450c99272f71b..929e0241d86235dafdf3a2154329338293d44959 100644 (file)
@@ -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;
        }