From 94bc2d7a85110d752a8424d5f85382c4f02ec155 Mon Sep 17 00:00:00 2001 From: Frederic Barrat Date: Wed, 9 Oct 2019 21:38:00 +0200 Subject: [PATCH] core/pci: Fix scan of devices for opencapi slots 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 Signed-off-by: Frederic Barrat Signed-off-by: Oliver O'Halloran --- core/pci-opal.c | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/core/pci-opal.c b/core/pci-opal.c index 7f47769938b7..828ce8a9715b 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,