]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
PCI: dw-rockchip: Describe RK3588 BAR4 DMA ctrl window
authorKoichiro Den <den@valinux.co.jp>
Thu, 12 Mar 2026 13:02:32 +0000 (14:02 +0100)
committerManivannan Sadhasivam <mani@kernel.org>
Sun, 15 Mar 2026 16:34:28 +0000 (22:04 +0530)
On RK3588 PCIe3_4L in EP mode, the integrated DMA controller registers
are permanently mapped to BAR4 and must not be repurposed by EPF
drivers.

When the remote peer needs to access these registers, it must use the
fixed BAR4 window instead of creating another inbound mapping in a
different BAR. Mixing the fixed window with an additional mapping can
lead to incorrect behavior.

Advertise the DMA controller MMIO window as a reserved BAR subregion so
EPF drivers can reuse it safely.

Signed-off-by: Koichiro Den <den@valinux.co.jp>
Signed-off-by: Niklas Cassel <cassel@kernel.org>
Signed-off-by: Manivannan Sadhasivam <mani@kernel.org>
Tested-by: Koichiro Den <den@valinux.co.jp>
Reviewed-by: Manikanta Maddireddy <mmaddireddy@nvidia.com>
Reviewed-by: Frank Li <Frank.Li@nxp.com>
Link: https://patch.msgid.link/20260312130229.2282001-16-cassel@kernel.org
drivers/pci/controller/dwc/pcie-dw-rockchip.c

index 5b17da63151d52f7bdc9e5b6fcd20b3420a3be20..ecc28093c5894a0566f5e0c5ba873c6edf38a273 100644 (file)
@@ -403,6 +403,15 @@ static const struct pci_epc_features rockchip_pcie_epc_features_rk3568 = {
        .bar[BAR_5] = { .type = BAR_RESIZABLE, },
 };
 
+static const struct pci_epc_bar_rsvd_region rk3588_bar4_rsvd[] = {
+       {
+               /* DMA_CAP (BAR4: DMA Port Logic Structure) */
+               .type = PCI_EPC_BAR_RSVD_DMA_CTRL_MMIO,
+               .offset = 0x0,
+               .size = 0x2000,
+       },
+};
+
 /*
  * BAR4 on rk3588 exposes the ATU Port Logic Structure to the host regardless of
  * iATU settings for BAR4. This means that BAR4 cannot be used by an EPF driver,
@@ -420,7 +429,11 @@ static const struct pci_epc_features rockchip_pcie_epc_features_rk3588 = {
        .bar[BAR_1] = { .type = BAR_RESIZABLE, },
        .bar[BAR_2] = { .type = BAR_RESIZABLE, },
        .bar[BAR_3] = { .type = BAR_RESIZABLE, },
-       .bar[BAR_4] = { .type = BAR_RESERVED, },
+       .bar[BAR_4] = {
+               .type = BAR_RESERVED,
+               .nr_rsvd_regions = ARRAY_SIZE(rk3588_bar4_rsvd),
+               .rsvd_regions = rk3588_bar4_rsvd,
+       },
        .bar[BAR_5] = { .type = BAR_RESIZABLE, },
 };