[PATCH RFC 08/11] PCI: Allow expanding the bridges
Sergey Miroshnichenko
s.miroshnichenko at yadro.com
Fri Oct 25 04:21:54 AEDT 2019
When hotplugging a bridge, the parent bus may not have [enough] reserved
bus numbers. So before rescanning the bus, set its subordinate number to
the maximum possible value: it is 255 when there is only one root bridge
in the domain.
During the PCI rescan, the subordinate bus number of every bus will be
contracted to the actual value.
Signed-off-by: Sergey Miroshnichenko <s.miroshnichenko at yadro.com>
---
drivers/pci/probe.c | 8 +++++---
1 file changed, 5 insertions(+), 3 deletions(-)
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
index 539f5d39bb6d..3494b5d265d5 100644
--- a/drivers/pci/probe.c
+++ b/drivers/pci/probe.c
@@ -3195,20 +3195,22 @@ static unsigned int pci_dev_count_res_mask(struct pci_dev *dev)
return res_mask;
}
-static void pci_bus_rescan_prepare(struct pci_bus *bus)
+static void pci_bus_rescan_prepare(struct pci_bus *bus, int last_bus_number)
{
struct pci_dev *dev;
if (bus->self)
pci_config_pm_runtime_get(bus->self);
+ bus->busn_res.end = last_bus_number;
+
list_for_each_entry(dev, &bus->devices, bus_list) {
struct pci_bus *child = dev->subordinate;
dev->res_mask = pci_dev_count_res_mask(dev);
if (child)
- pci_bus_rescan_prepare(child);
+ pci_bus_rescan_prepare(child, last_bus_number);
if (dev->driver &&
dev->driver->rescan_prepare)
@@ -3439,7 +3441,7 @@ unsigned int pci_rescan_bus(struct pci_bus *bus)
if (pci_can_move_bars) {
pcibios_root_bus_rescan_prepare(root);
- pci_bus_rescan_prepare(root);
+ pci_bus_rescan_prepare(root, root->busn_res.end);
pci_bus_update_immovable_range(root);
pci_bus_release_root_bridge_resources(root);
--
2.23.0
More information about the Linuxppc-dev
mailing list