PCI: Align extra resources for hotplug bridges properly
[ Upstream commit 08f0a15ee8adb4846b08ca5d5c175fbf0f652bc9 ] After division the extra resource space per hotplug bridge may not be aligned according to the window alignment, so align it before passing it down for further distribution. Link: https://lore.kernel.org/r/20230131092405.29121-2-mika.westerberg@linux.intel.com Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com> Signed-off-by: Bjorn Helgaas <bhelgaas@google.com> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:

committed by
Greg Kroah-Hartman

parent
877aacda14
commit
fdca189e52
@@ -2004,6 +2004,7 @@ static void pci_bus_distribute_available_resources(struct pci_bus *bus,
|
|||||||
* resource space between hotplug bridges.
|
* resource space between hotplug bridges.
|
||||||
*/
|
*/
|
||||||
for_each_pci_bridge(dev, bus) {
|
for_each_pci_bridge(dev, bus) {
|
||||||
|
struct resource *res;
|
||||||
struct pci_bus *b;
|
struct pci_bus *b;
|
||||||
|
|
||||||
b = dev->subordinate;
|
b = dev->subordinate;
|
||||||
@@ -2015,16 +2016,28 @@ static void pci_bus_distribute_available_resources(struct pci_bus *bus,
|
|||||||
* hotplug-capable downstream ports taking alignment into
|
* hotplug-capable downstream ports taking alignment into
|
||||||
* account.
|
* account.
|
||||||
*/
|
*/
|
||||||
io.end = io.start + io_per_hp - 1;
|
res = &dev->resource[PCI_BRIDGE_IO_WINDOW];
|
||||||
mmio.end = mmio.start + mmio_per_hp - 1;
|
align = pci_resource_alignment(dev, res);
|
||||||
mmio_pref.end = mmio_pref.start + mmio_pref_per_hp - 1;
|
io.end = align ? io.start + ALIGN_DOWN(io_per_hp, align) - 1
|
||||||
|
: io.start + io_per_hp - 1;
|
||||||
|
|
||||||
|
res = &dev->resource[PCI_BRIDGE_MEM_WINDOW];
|
||||||
|
align = pci_resource_alignment(dev, res);
|
||||||
|
mmio.end = align ? mmio.start + ALIGN_DOWN(mmio_per_hp, align) - 1
|
||||||
|
: mmio.start + mmio_per_hp - 1;
|
||||||
|
|
||||||
|
res = &dev->resource[PCI_BRIDGE_PREF_MEM_WINDOW];
|
||||||
|
align = pci_resource_alignment(dev, res);
|
||||||
|
mmio_pref.end = align ? mmio_pref.start +
|
||||||
|
ALIGN_DOWN(mmio_pref_per_hp, align) - 1
|
||||||
|
: mmio_pref.start + mmio_pref_per_hp - 1;
|
||||||
|
|
||||||
pci_bus_distribute_available_resources(b, add_list, io, mmio,
|
pci_bus_distribute_available_resources(b, add_list, io, mmio,
|
||||||
mmio_pref);
|
mmio_pref);
|
||||||
|
|
||||||
io.start += io_per_hp;
|
io.start += io.end + 1;
|
||||||
mmio.start += mmio_per_hp;
|
mmio.start += mmio.end + 1;
|
||||||
mmio_pref.start += mmio_pref_per_hp;
|
mmio_pref.start += mmio_pref.end + 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user