This series proposes support for mapping subranges within a PCIe endpoint BAR and enables controllers to program inbound address translation for those subranges.
- Patch 1/5 introduces dynamic_inbound_mapping feature bit. This can be used as a safeguard to check whether a BAR can really be reconfigured without clearing/resetting it. - Patch 2/5 introduces generic BAR subrange mapping support in the PCI endpoint core. - Patch 3/5 advertises dynamic inbound mapping support via DWC_EPC_COMMON_FEATURES for all DWC-based glue drivers. - Patch 4/5 adds an implementation for the DesignWare PCIe endpoint controller using Address Match Mode IB iATU. It also advertises subrange_mapping support via DWC_EPC_COMMON_FEATURES. - Patch 5/5 updates a documentation for pci_epc_set_bar(). This series is originally a spin-off from a larger RFC series posted earlier: https://lore.kernel.org/all/[email protected]/ The first user will likely be Remote eDMA-backed NTB transport, demonstrated in that RFC series. Kernel base: - repo: git://git.kernel.org/pub/scm/linux/kernel/git/pci/pci.git - branch: controller/dwc - commit: 68ac85fb42cf ("PCI: dwc: Use cfg0_base as iMSI-RX target address to support 32-bit MSI devices") Changelog: * v7->v8 changes: - Drop the explicit submap offset and use_submap fields. The submap array order now defines BAR offsets (gapless decomposition). Commit messages and source code documentations are adjusted accordingly. - Drop the no-longer-needed dw_pcie_ib_map and add ib_atu_indexes field to track iatu indexes used for teardown. - Move inbound mapping teardown into dw_pcie_ep_set_bar() to cover all BAR transition cases. - Centralize feature bit advertisement via DWC_EPC_COMMON_FEATURES. - Added a (epf_bar->num_submap && !epf_bar->submap) check in pci_epc_set_bar(). - Note that some Reviewed-by tags are dropped, as the changes need to be re-reviewed. * v6->v7 changes: - Added missing check of dynamic_inbound_mapping feature bit in pci_epc_set_bar() when use_submap is set true. - Addressed the remaining review comments from Niklas (patch reordering, splitting, and source code comment/documentation refinements). * v5->v6 changes: - Added a new feature bit dynamic_inbound_mapping and set it centrally in dw_pcie_ep_get_features() for all DWC-based glue drivers. - Updated documentation for pci_epc_set_bar(). - Dropped a needless and harmful dw_pcie_ep_clear_bar() call on the error path. - Fixed "Bar Match Mode" to "BAR Match Mode" in a source code comment. * v4->v5 changes: - Added subrange_mapping to struct pci_epc_features and enforced a strict capability check in pci_epc_set_bar() (reject use_submap when unsupported). - Changed DWC-based glue drivers to return a mutable features pointer and set subrange_mapping centrally at the DWC midlayer. - Split the series into 3 patches accordingly. * v3->v4 changes: - Drop unused includes that should have been removed in v3 * v2->v3 changes: - Remove submap copying and sorting from dw_pcie_ep_ib_atu_addr(), and require callers to pass a sorted submap. The related source code comments are updated accordingly. - Refine source code comments and commit messages, including normalizing "Address Match Mode" wording. - Add const qualifiers where applicable. * v1->v2 changes: - Introduced stricter submap validation: no holes/overlaps and the subranges must exactly cover the whole BAR. Added dw_pcie_ep_validate_submap() to enforce alignment and full-coverage constraints. - Enforced one-shot (all-or-nothing) submap programming to avoid leaving half-programmed BAR state: * Dropped incremental/overwrite logic that is no longer needed with the one-shot design. * Added dw_pcie_ep_clear_ib_maps() and used it from multiple places to tear down BAR match / address match inbound mappings without code duplication. - Updated kernel source code comments and commit messages, including a small refinement made along the way. - Changed num_submap type to unsigned int. v7: https://lore.kernel.org/all/[email protected]/ v6: https://lore.kernel.org/all/[email protected]/ v5: https://lore.kernel.org/all/[email protected]/ v4: https://lore.kernel.org/all/[email protected]/ v3: https://lore.kernel.org/all/[email protected]/ v2: https://lore.kernel.org/all/[email protected]/ v1: https://lore.kernel.org/all/[email protected]/ Thank you for reviewing, Koichiro Den (5): PCI: endpoint: Add dynamic_inbound_mapping EPC feature PCI: endpoint: Add BAR subrange mapping support PCI: dwc: Advertise dynamic inbound mapping support PCI: dwc: ep: Support BAR subrange inbound mapping via Address Match Mode iATU Documentation: PCI: endpoint: Clarify pci_epc_set_bar() usage Documentation/PCI/endpoint/pci-endpoint.rst | 24 +++ drivers/pci/controller/dwc/pci-dra7xx.c | 1 + drivers/pci/controller/dwc/pci-imx6.c | 3 + drivers/pci/controller/dwc/pci-keystone.c | 1 + drivers/pci/controller/dwc/pcie-artpec6.c | 1 + .../pci/controller/dwc/pcie-designware-ep.c | 203 +++++++++++++++++- .../pci/controller/dwc/pcie-designware-plat.c | 1 + drivers/pci/controller/dwc/pcie-designware.h | 8 + drivers/pci/controller/dwc/pcie-dw-rockchip.c | 2 + drivers/pci/controller/dwc/pcie-keembay.c | 1 + drivers/pci/controller/dwc/pcie-qcom-ep.c | 1 + drivers/pci/controller/dwc/pcie-rcar-gen4.c | 1 + drivers/pci/controller/dwc/pcie-stm32-ep.c | 1 + drivers/pci/controller/dwc/pcie-tegra194.c | 1 + drivers/pci/controller/dwc/pcie-uniphier-ep.c | 2 + drivers/pci/endpoint/pci-epc-core.c | 8 + include/linux/pci-epc.h | 9 + include/linux/pci-epf.h | 27 +++ 18 files changed, 285 insertions(+), 10 deletions(-) -- 2.51.0
