With movable BARs, adding a hotplugged device may affect all the PCIe
domain starting from the root, so use a pci_rescan_bus() function which
handles the rearrangement of existing BARs and bridge windows.

Signed-off-by: Sergey Miroshnichenko <s.miroshniche...@yadro.com>
---
 drivers/pci/hotplug/pciehp_pci.c | 14 +++++++++-----
 1 file changed, 9 insertions(+), 5 deletions(-)

diff --git a/drivers/pci/hotplug/pciehp_pci.c b/drivers/pci/hotplug/pciehp_pci.c
index b9c1396db6fe..7c0871db5bae 100644
--- a/drivers/pci/hotplug/pciehp_pci.c
+++ b/drivers/pci/hotplug/pciehp_pci.c
@@ -56,12 +56,16 @@ int pciehp_configure_device(struct controller *ctrl)
                goto out;
        }
 
-       for_each_pci_bridge(dev, parent)
-               pci_hp_add_bridge(dev);
+       if (pci_movable_bars_enabled()) {
+               pci_rescan_bus(parent);
+       } else {
+               for_each_pci_bridge(dev, parent)
+                       pci_hp_add_bridge(dev);
 
-       pci_assign_unassigned_bridge_resources(bridge);
-       pcie_bus_configure_settings(parent);
-       pci_bus_add_devices(parent);
+               pci_assign_unassigned_bridge_resources(bridge);
+               pcie_bus_configure_settings(parent);
+               pci_bus_add_devices(parent);
+       }
 
  out:
        pci_unlock_rescan_remove();
-- 
2.20.1

Reply via email to