aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFrederic Barrat <fbarrat@linux.ibm.com>2019-10-09 21:38:00 +0200
committerVasant Hegde <hegdevasant@linux.vnet.ibm.com>2020-03-10 16:30:13 +0530
commit912ea85ceaf72021ac9778c477f580fafbba7828 (patch)
treeae341f1c644864d8d6e114c240b62394d84a0f1e
parent8859366e18179264b9be7b18ed4900b2ba5fb60c (diff)
downloadskiboot-912ea85ceaf72021ac9778c477f580fafbba7828.zip
skiboot-912ea85ceaf72021ac9778c477f580fafbba7828.tar.gz
skiboot-912ea85ceaf72021ac9778c477f580fafbba7828.tar.bz2
core/pci: Fix scan of devices for opencapi slots
[ Upstream commit 94bc2d7a85110d752a8424d5f85382c4f02ec155 ] Opencapi devices are found directly under the PHB and the PHB slot doesn't have an associated PCI device (root complex). So when scanning a PHB, devices are added directly under the PHB, like it's done at boot time. Reviewed-by: Christophe Lombard <clombard@linux.vnet.ibm.com> Signed-off-by: Frederic Barrat <fbarrat@linux.ibm.com> Signed-off-by: Oliver O'Halloran <oohall@gmail.com> Signed-off-by: Vasant Hegde <hegdevasant@linux.vnet.ibm.com>
-rw-r--r--core/pci-opal.c20
1 files changed, 15 insertions, 5 deletions
diff --git a/core/pci-opal.c b/core/pci-opal.c
index 7f47769..828ce8a 100644
--- a/core/pci-opal.c
+++ b/core/pci-opal.c
@@ -667,10 +667,17 @@ static void rescan_slot_devices(struct pci_slot *slot)
* prepare_link_change() is called (if needed) by the state
* machine during the slot reset or link polling
*/
- pci_scan_bus(phb, pd->secondary_bus,
- pd->subordinate_bus, &pd->children, pd, true);
- pci_add_device_nodes(phb, &pd->children, pd->dn,
- &phb->lstate, 0);
+ if (phb->phb_type != phb_type_npu_v2_opencapi) {
+ pci_scan_bus(phb, pd->secondary_bus,
+ pd->subordinate_bus, &pd->children, pd, true);
+ pci_add_device_nodes(phb, &pd->children, pd->dn,
+ &phb->lstate, 0);
+ } else {
+ pci_scan_bus(phb, 0, 0xff, &phb->devices, NULL, true);
+ pci_add_device_nodes(phb, &phb->devices,
+ phb->dt_node, &phb->lstate, 0);
+ phb->ops->phb_final_fixup(phb);
+ }
}
static void remove_slot_devices(struct pci_slot *slot)
@@ -678,7 +685,10 @@ static void remove_slot_devices(struct pci_slot *slot)
struct phb *phb = slot->phb;
struct pci_device *pd = slot->pd;
- pci_remove_bus(phb, &pd->children);
+ if (phb->phb_type != phb_type_npu_v2_opencapi)
+ pci_remove_bus(phb, &pd->children);
+ else
+ pci_remove_bus(phb, &phb->devices);
}
static void link_up_timer(struct timer *t, void *data,