[PATCH v4 2/2] PCI: iproc: Use the EROM outbound window on BCMA
Semih Baskan
strst.gs at gmail.com
Tue Oct 13 18:17:46 PDT 2026
On Tue, Oct 13, 2026 at 05:04:21PM -0500, Bjorn Helgaas wrote:
> The PCIe outbound window base on Northstar depends on the PCIe Gen2 core
> revision. Revision 0x01 uses 0x08000000, 0x40000000 and 0x48000000 for
[...]
Thanks for combining them.
Signed-off-by: Semih Baskan <strst.gs at gmail.com>
Tested-by: Semih Baskan <strst.gs at gmail.com>
Tested on an Asus RT-N18U (BCM47081, PCIe core rev 0x01) with both
patches on OpenWrt's 6.18.55, which carries 767012397976 as a backport,
driver built in. bcma0:7 enumerates the BCM4360 with the same window,
BARs and IRQ as OpenWrt's current image (an earlier version of this
patch), and bcma0:8/9 print the two expected warnings (DT 0x20000000
and 0x28000000 against EROM 0x40000000 and 0x48000000). I did not
build it as a module.
For the commit log, here is a version that describes the bcma and
platform side, in case it helps:
PCI: iproc: Use the EROM outbound window on BCMA
The PCIe outbound window base on Northstar depends on the PCIe Gen2
core revision. Revision 0x01 uses 0x08000000, 0x40000000 and
0x48000000 for controllers 0 to 2, revision 0x07 (NS-B0) uses
0x08000000, 0x20000000 and 0x28000000. Broadcom's own driver branches
on the core revision for this reason. The enumeration ROM reports the
base for the revision present, and bcma provides it as addr_s[0].
Commit 767012397976 ("ARM: dts: BCM5301X: Describe PCIe controllers
fully"), in v7.1, gave the controllers in bcm-ns.dtsi a ranges
property with the revision 0x07 values. bcm-ns.dtsi is shared by
every Northstar SoC. The DT ranges cause two problems for this
driver:
1) devm_pci_alloc_host_bridge() parses and requests the DT ranges,
then the driver adds the EROM window and requests the list a
second time, so every controller fails to probe with -EBUSY.
2) The DT window itself is only correct on revision 0x07. On
revision 0x01, controllers 1 and 2 get an address the hardware
does not decode, and the first MMIO access to a BAR takes an
imprecise external abort.
The window comes from the EROM and the interrupt from bcma. Allocate
the bridge with pci_alloc_host_bridge() and free it through a devm
action, so the PCI core no longer parses and requests the DT ranges,
and request only the EROM window. The driver still reads the DT
ranges for one check: if the DT describes a memory window that
differs from the EROM one, it prints a warning, so a wrong dts shows
up instead of being ignored. The driver works whether or not the DT
describes a window.
The same commit also added compatible = "brcm,iproc-pcie", so these
nodes now match pcie-iproc-platform. With CONFIG_PCIE_IPROC_PLATFORM
enabled, the default on ARCH_BCM_IPROC, that driver binds them first.
It takes the DT window as it is, so that path needs a separate fix
either way. This patch fixes configurations with PCIE_IPROC_PLATFORM
disabled, such as OpenWrt's.
Fixes: 767012397976 ("ARM: dts: BCM5301X: Describe PCIe controllers fully")
Cc: stable at vger.kernel.org
More information about the linux-arm-kernel
mailing list