git: 349808d8bd19 - main - pcib: Assume a window where both the base and limit are 0 is uninitialized
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Wed, 18 Feb 2026 16:05:10 UTC
The branch main has been updated by jhb:
URL: https://cgit.FreeBSD.org/src/commit/?id=349808d8bd197165390a286bccdaa29a1d77c7ab
commit 349808d8bd197165390a286bccdaa29a1d77c7ab
Author: John Baldwin <jhb@FreeBSD.org>
AuthorDate: 2026-02-18 16:04:54 +0000
Commit: John Baldwin <jhb@FreeBSD.org>
CommitDate: 2026-02-18 16:04:54 +0000
pcib: Assume a window where both the base and limit are 0 is uninitialized
Since the low bits of a window's limit are hardwired to 1, this
configuration looks like a minimally sized window at address 0.
However, PCI resources are not generally at address 0 (see the
__PCI_BAR_ZERO_VALID macro that was only defined on sparc64), and some
PCI-PCI bridges report these register values after a reset. The
result today is a lot of spam in dmesg as the minimally-sized windows
fail to allocate. By ignoring these windows and treating them as
closed the end result is the same, but there is less spam during boot.
Reported by: jrtc27
Differential Revision: https://reviews.freebsd.org/D43922
---
sys/dev/pci/pci_pci.c | 18 ++++++++++++++++++
1 file changed, 18 insertions(+)
diff --git a/sys/dev/pci/pci_pci.c b/sys/dev/pci/pci_pci.c
index 788af7339418..5cdb1de71c3f 100644
--- a/sys/dev/pci/pci_pci.c
+++ b/sys/dev/pci/pci_pci.c
@@ -437,6 +437,24 @@ 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. This can happen if a bridge device
+ * is never initialized by firmware, or if a platform driver
+ * resets the bridge.
+ *
+ * If devices behind this bridge have firmware-assigned
+ * resources in this range then the window will be reallocated
+ * on-demand.
+ */
+ if (w->base == 0 && w->limit == ((pci_addr_t)1 << w->step) - 1) {
+ 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);