Message ID | 20241007040319.157412-1-dlemoal@kernel.org (mailing list archive) |
---|---|
Headers | show |
Series | Improve PCI memory mapping API | expand |
On 10/7/24 13:03, Damien Le Moal wrote: > This series introduces the new functions pci_epc_map_align(), > pci_epc_mem_map() and pci_epc_mem_unmap() to improve handling of the > PCI address mapping alignment constraints of endpoint controllers in a > controller independent manner. > > The issue fixed is that the fixed alignment defined by the "align" field > of struct pci_epc_features is defined for inbound ATU entries (e.g. > BARs) and is a fixed value, whereas some controllers need a PCI address > alignment that depends on the PCI address itself. For instance, the > rk3399 SoC controller in endpoint mode uses the lower bits of the local > endpoint memory address as the lower bits for the PCI addresses for data > transfers. That is, when mapping local memory, one must take into > account the number of bits of the RC PCI address that change from the > start address of the mapping. > > To fix this, the new endpoint controller method .map_align is introduced > and called from pci_epc_map_align(). This method is optional and for > controllers that do not define it, it is assumed that the controller has > no PCI address constraint. > > The functions pci_epc_mem_map() is a helper function which obtains > mapping information, allocates endpoint controller memory according to > the mapping size obtained and maps the memory. pci_epc_mem_unmap() > unmaps and frees the endpoint memory. > > This series is organized as follows: > - Patch 1 introduces a small helper to clean up the epc core code > - Patch 2 improves pci_epc_mem_alloc_addr() > - Patch 3 and 4 introduce the new map_align endpoint controller method > and the epc functions pci_epc_mem_map() and pci_epc_mem_unmap(). > - Patch 5 documents these new functions. > - Patch 6 modifies the test endpoint function driver to use > pci_epc_mem_map() and pci_epc_mem_unmap() to illustrate the use of > these functions. > - Finally, patch 7 implements the rk3588 endpoint controller driver > .map_align operation to satisfy that controller PCI address > alignment constraint. I forgot to add that the series was extensively tested using the rk3588 endpoint controller with the test endpoint function driver (as-is and modified to remove the forced host buffer alignment) as well as using the NVMe endpoint function driver (v1 patches just posted). > > Changes from v3: > - Addressed Niklas comments (improved patch 2 commit message, added > comments in the pci_epc_map_align() function in patch 3, typos and > improvements in patch 5, patch 7 commit message). > - Added review tags > > Changes from v2: > - Dropped all patches for the rockchip-ep. These patches will be sent > later as a separate series. > - Added patch 2 and 5 > - Added review tags to patch 1 > > Changes from v1: > - Changed pci_epc_check_func() to pci_epc_function_is_valid() in patch > 1. > - Removed patch "PCI: endpoint: Improve pci_epc_mem_alloc_addr()" > (former patch 2 of v1) > - Various typos cleanups all over. Also fixed some blank space > indentation. > - Added review tags > > Damien Le Moal (7): > PCI: endpoint: Introduce pci_epc_function_is_valid() > PCI: endpoint: Improve pci_epc_mem_alloc_addr() > PCI: endpoint: Introduce pci_epc_map_align() > PCI: endpoint: Introduce pci_epc_mem_map()/unmap() > PCI: endpoint: Update documentation > PCI: endpoint: test: Use pci_epc_mem_map/unmap() > PCI: dwc: endpoint: Define the .map_align() controller operation > > Documentation/PCI/endpoint/pci-endpoint.rst | 35 ++ > .../pci/controller/dwc/pcie-designware-ep.c | 15 + > drivers/pci/endpoint/functions/pci-epf-test.c | 372 +++++++++--------- > drivers/pci/endpoint/pci-epc-core.c | 223 ++++++++--- > drivers/pci/endpoint/pci-epc-mem.c | 9 +- > include/linux/pci-epc.h | 41 ++ > 6 files changed, 465 insertions(+), 230 deletions(-) >