mirror of
https://github.com/torvalds/linux.git
synced 2026-08-01 12:11:59 +02:00
pci-v6.1-fixes-1
-----BEGIN PGP SIGNATURE----- iQJIBAABCgAyFiEEgMe7l+5h9hnxdsnuWYigwDrT+vwFAmNKzlUUHGJoZWxnYWFz QGdvb2dsZS5jb20ACgkQWYigwDrT+vxBbA//QYuw8iZHzshJntCyWlTRg742x2jI 2NrLojVG/ccSlqnl/KRultaPFdSlZb221UASt7CAEIGoP6+/SNepazEEJ4QJhMX6 inY/hYrVd2OHhCnO+OoNd7DKfbeJRkFVMHOGJdpbQ7jMwa99YSaN6xEMfALcZIrg 8CqYKDpdJW4avYyKlfXayY42d8gljWJwfLuK1xEnnIrdvXQEB3vj3yKxziadhBtA EJbLWORVF+yQwq63NCPkLvCe0ZuV09a4q4IhlzWo+30FLMOsk2z4HBi1B2fwlawV tnYCt0i6FNC6e3DJyWX/hkAiIbJUadnych+LcGq+/FY30tCBtNkNaQN3XsrvdvI4 5piacj1av21R7JHSyk64M4jdNlE7MYonQNsc8vp4yDtlAjQYkaj7BJdsIq3MCTei ce6mxguVb2hrMr4fZXc8ka7XZkofJNv/XhfuQAorzKfEqA8cI4enICsPdoTFyZDV pYYuHIJXY4rTm0wUD+TlDg/Cn6gyLu3WYVyEn6q/E53Twj1rr5ske7igDMDVYYly qMg8CTPHYzHJ0wbzkf0CfND7SVAAE1BnIzr4Drfbrm+fi11HVhd0u/0XiWf2NthW /ZFQUDBh0SwSHgUnO+ONqcR3arhIT4PEsEJadD4kuW4nIyPS7t1Nfu0V3XUZDa14 U6UeL6URnXBDV7U= =gs3v -----END PGP SIGNATURE----- Merge tag 'pci-v6.1-fixes-1' of git://git.kernel.org/pub/scm/linux/kernel/git/helgaas/pci Pull pci fix from Bjorn Helgaas: "Revert the attempt to distribute spare resources to unconfigured hotplug bridges at boot time. This fixed some dock hot-add scenarios, but Jonathan Cameron reported that it broke a topology with a multi-function device where one function was a Switch Upstream Port and the other was an Endpoint" * tag 'pci-v6.1-fixes-1' of git://git.kernel.org/pub/scm/linux/kernel/git/helgaas/pci: Revert "PCI: Distribute available resources for root buses, too"
This commit is contained in:
commit
41410965c3
|
|
@ -1768,10 +1768,7 @@ static void adjust_bridge_window(struct pci_dev *bridge, struct resource *res,
|
||||||
}
|
}
|
||||||
|
|
||||||
res->end = res->start + new_size - 1;
|
res->end = res->start + new_size - 1;
|
||||||
|
remove_from_list(add_list, res);
|
||||||
/* If the resource is part of the add_list remove it now */
|
|
||||||
if (add_list)
|
|
||||||
remove_from_list(add_list, res);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void pci_bus_distribute_available_resources(struct pci_bus *bus,
|
static void pci_bus_distribute_available_resources(struct pci_bus *bus,
|
||||||
|
|
@ -1926,8 +1923,6 @@ static void pci_bridge_distribute_available_resources(struct pci_dev *bridge,
|
||||||
if (!bridge->is_hotplug_bridge)
|
if (!bridge->is_hotplug_bridge)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
pci_dbg(bridge, "distributing available resources\n");
|
|
||||||
|
|
||||||
/* Take the initial extra resources from the hotplug port */
|
/* Take the initial extra resources from the hotplug port */
|
||||||
available_io = bridge->resource[PCI_BRIDGE_IO_WINDOW];
|
available_io = bridge->resource[PCI_BRIDGE_IO_WINDOW];
|
||||||
available_mmio = bridge->resource[PCI_BRIDGE_MEM_WINDOW];
|
available_mmio = bridge->resource[PCI_BRIDGE_MEM_WINDOW];
|
||||||
|
|
@ -1939,59 +1934,6 @@ static void pci_bridge_distribute_available_resources(struct pci_dev *bridge,
|
||||||
available_mmio_pref);
|
available_mmio_pref);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool pci_bridge_resources_not_assigned(struct pci_dev *dev)
|
|
||||||
{
|
|
||||||
const struct resource *r;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Check the child device's resources and if they are not yet
|
|
||||||
* assigned it means we are configuring them (not the boot
|
|
||||||
* firmware) so we should be able to extend the upstream
|
|
||||||
* bridge's (that's the hotplug downstream PCIe port) resources
|
|
||||||
* in the same way we do with the normal hotplug case.
|
|
||||||
*/
|
|
||||||
r = &dev->resource[PCI_BRIDGE_IO_WINDOW];
|
|
||||||
if (!r->flags || !(r->flags & IORESOURCE_STARTALIGN))
|
|
||||||
return false;
|
|
||||||
r = &dev->resource[PCI_BRIDGE_MEM_WINDOW];
|
|
||||||
if (!r->flags || !(r->flags & IORESOURCE_STARTALIGN))
|
|
||||||
return false;
|
|
||||||
r = &dev->resource[PCI_BRIDGE_PREF_MEM_WINDOW];
|
|
||||||
if (!r->flags || !(r->flags & IORESOURCE_STARTALIGN))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void pci_root_bus_distribute_available_resources(struct pci_bus *bus,
|
|
||||||
struct list_head *add_list)
|
|
||||||
{
|
|
||||||
struct pci_dev *dev, *bridge = bus->self;
|
|
||||||
|
|
||||||
for_each_pci_bridge(dev, bus) {
|
|
||||||
struct pci_bus *b;
|
|
||||||
|
|
||||||
b = dev->subordinate;
|
|
||||||
if (!b)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Need to check "bridge" here too because it is NULL
|
|
||||||
* in case of root bus.
|
|
||||||
*/
|
|
||||||
if (bridge && pci_bridge_resources_not_assigned(dev)) {
|
|
||||||
pci_bridge_distribute_available_resources(bridge, add_list);
|
|
||||||
/*
|
|
||||||
* There is only PCIe upstream port on the bus
|
|
||||||
* so we don't need to go futher.
|
|
||||||
*/
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
pci_root_bus_distribute_available_resources(b, add_list);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* First try will not touch PCI bridge res.
|
* First try will not touch PCI bridge res.
|
||||||
* Second and later try will clear small leaf bridge res.
|
* Second and later try will clear small leaf bridge res.
|
||||||
|
|
@ -2031,8 +1973,6 @@ void pci_assign_unassigned_root_bus_resources(struct pci_bus *bus)
|
||||||
*/
|
*/
|
||||||
__pci_bus_size_bridges(bus, add_list);
|
__pci_bus_size_bridges(bus, add_list);
|
||||||
|
|
||||||
pci_root_bus_distribute_available_resources(bus, add_list);
|
|
||||||
|
|
||||||
/* Depth last, allocate resources and update the hardware. */
|
/* Depth last, allocate resources and update the hardware. */
|
||||||
__pci_bus_assign_resources(bus, add_list, &fail_head);
|
__pci_bus_assign_resources(bus, add_list, &fail_head);
|
||||||
if (add_list)
|
if (add_list)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user