@@ -278,6 +278,8 @@ bool pci_dev_bar_fixed(struct pci_dev *dev, struct resource *res);
bool pci_dev_bar_enabled(const struct pci_dev *dev, int idx);
bool pci_bus_check_bars_assigned(struct pci_bus *bus, bool complete_set);
+extern bool pci_init_done;
+
/* PCIe link information from Link Capabilities 2 */
#define PCIE_LNKCAP2_SLS2SPEED(lnkcap2) \
((lnkcap2) & PCI_EXP_LNKCAP2_SLS_64_0GB ? PCIE_SPEED_64_0GT : \
@@ -41,6 +41,7 @@ EXPORT_SYMBOL(pci_root_buses);
* were assigned before the rescan.
*/
static bool pci_try_failed_bars = true;
+bool pci_init_done;
static LIST_HEAD(pci_domain_busn_res_list);
@@ -3288,7 +3289,7 @@ static unsigned int pci_dev_count_res_mask(struct pci_dev *dev)
struct resource *r = &dev->resource[i];
if (!r->flags || !r->parent ||
- (r->flags & IORESOURCE_UNSET))
+ (pci_init_done && (r->flags & IORESOURCE_UNSET)))
continue;
res_mask |= (1 << i);
@@ -1919,7 +1919,14 @@ void __init pci_assign_unassigned_resources(void)
/* Make sure the root bridge has a companion ACPI device */
if (ACPI_HANDLE(root_bus->bridge))
acpi_ioapic_add(ACPI_HANDLE(root_bus->bridge));
+
+ if (pci_can_move_bars && !pci_bus_check_bars_assigned(root_bus, true)) {
+ dev_err(&root_bus->dev, "Not all requested BARs are assigned, triggering a rescan with movable BARs");
+ pci_rescan_bus(root_bus);
+ }
}
+
+ pci_init_done = true;
}
static void adjust_bridge_window(struct pci_dev *bridge, struct resource *res,
Some BIOSes don't allocate all requested BARs, leaving some (for example, SR_IOV) unassigned, without gaps for bridge windows to extend. If that happens, let the kernel use its own methods of BAR allocating on an early init stage, when drivers aren't yet bound to their devices, and it is safe to shuffle BARs that are not yet used. If the reassignment fails, retry without BARs omitted by BIOS, they have the IORESOURCE_UNSET flag being set. To use this property, a new bool was introduced: pci_init_done. Signed-off-by: Sergei Miroshnichenko <s.miroshnichenko@yadro.com> --- drivers/pci/pci.h | 2 ++ drivers/pci/probe.c | 3 ++- drivers/pci/setup-bus.c | 7 +++++++ 3 files changed, 11 insertions(+), 1 deletion(-)