diff --git a/sys/dev/pci/pci_pci.c b/sys/dev/pci/pci_pci.c index 6ef04251cd74..a6035b8cd8b6 100644 --- a/sys/dev/pci/pci_pci.c +++ b/sys/dev/pci/pci_pci.c @@ -436,6 +436,20 @@ pcib_alloc_window(struct pcib_softc *sc, struct pcib_window *w, int type, if (!pcib_is_window_open(w)) return; + /* + * Assume that a window where both the base and limit read as + * zero is not really open, or at least not assigned a valid + * range by the firmware. If devices behind this bridge have + * firmware-assigned resources in this range then the window + * will be allocated on-demand. + */ + if (w->base == 0 && w->limit == (pci_addr_t)1 << w->step) { + w->base = max_address; + w->limit = 0; + pcib_write_windows(sc, w->mask); + return; + } + if (w->base > max_address || w->limit > max_address) { device_printf(sc->dev, "initial %s window has too many bits, ignoring\n", w->name);