From: Tatyana Nikolova-Gross <tatyana.e.nikolova@xxxxxxxxx> This irdma patch series is the last part of the staged submission introducing RDMA RoCEv2 support for the IPU E2000 line of products, referred to as GEN3. To support RDMA GEN3 devices, the irdma driver uses common functions and definitions implemented by the Intel Inter-Driver Communication (IIDC) interface and driver specific IIDC functionality exported by the idpf driver. This interface is already in use between ice and irdma. The IPU model can host one or more logical network endpoints called vPorts per PCI function that are flexibly associated with a physical port or an internal communication port. irdma exposes a verbs device per vPort. The irdma driver communicates with the device Control Plane (CP) to discover device capabilities and perform privileged operations through an RDMA-specific messaging interface built atop the Infrastructure Data-Plane Function (IDPF) mailbox and virtchannel protocol [1]. Other features as it pertains to GEN3 devices include: * Host Memory Cache (HMC) resource initialization based on FW capability * Shared Receive Queue (SRQ) Support * Atomic Operations Support * Completion Queue Element (CQE) Error and Flush Handling * 64-byte CQEs Support * Type2 Memory Windows and Timestamping Support These patches are split from the submission "Add RDMA support for Intel IPU E2000 (GEN3)" [2]. The patches have been tested on a range of hosts and platforms with a variety of general RDMA applications which include standalone verbs (rping, perftest, etc.), storage and HPC applications. Changelog: Changes since split: * Use exported symbols instead of device ops struct * Move ice/idpf specific functionality to icrdma_/ig3rdma_* files * Adapt to the renamed IIDC structs/functions iidc_* * Use iidc_priv struct to access core driver specific info * Remove push mode support for GEN3 At [4]: * Move the call to get RDMA features just after CQP is created, otherwise the feature flags are not defined before used. * Move the check for supported atomic operations after reading the RDMA feature info to correctly enable atomics. * Round up to power of two the resource size for Read Responses and Transmit Queue elements. * Do not use the Work Queue element index passed in the Asynchronous Event info to get SRQ context, because it is incorrect. * Fix detection of Completion Queue (CQ) empty when 64-byte CQ elements are enabled. * Minor improvements and cleanup. Patch series at [3] includes only idpf changes. [1] https://elixir.bootlin.com/linux/latest/source/drivers/net/ethernet/intel/idpf/idpf_virtchnl.c [2] https://lore.kernel.org/all/20240724233917.704-1-tatyana.e.nikolova@xxxxxxxxx/ [3] https://lore.kernel.org/all/20240824031924.421-1-tatyana.e.nikolova@xxxxxxxxx/ [4] https://lore.kernel.org/all/20250207194931.1569-1-tatyana.e.nikolova@xxxxxxxxx/ Christopher Bednarz (1): RDMA/irdma: Discover and set up GEN3 hardware register layout Faisal Latif (2): RDMA/irdma: Add SRQ support RDMA/irdma: Add Atomic Operations support Krzysztof Czurylo (2): RDMA/irdma: Add GEN3 CQP support with deferred completions RDMA/irdma: Add GEN3 HW statistics support Mustafa Ismail (3): RDMA/irdma: Refactor GEN2 auxiliary driver RDMA/irdma: Add GEN3 core driver support RDMA/irdma: Introduce GEN3 vPort driver support Shiraz Saleem (6): RDMA/irdma: Add GEN3 support for AEQ and CEQ RDMA/irdma: Add GEN3 virtual QP1 support RDMA/irdma: Extend QP context programming for GEN3 RDMA/irdma: Support 64-byte CQEs and GEN3 CQE opcode decoding RDMA/irdma: Restrict Memory Window and CQE Timestamping to GEN3 RDMA/irdma: Extend CQE Error and Flush Handling for GEN3 Devices Tatyana Nikolova (1): RDMA/irdma: Update Kconfig Vinoth Kumar Chandra Mohan (1): RDMA/irdma: Add support for V2 HMC resource management scheme drivers/infiniband/hw/irdma/Kconfig | 7 +- drivers/infiniband/hw/irdma/Makefile | 4 + drivers/infiniband/hw/irdma/ctrl.c | 1468 ++++++++++++++++++++-- drivers/infiniband/hw/irdma/defs.h | 264 ++-- drivers/infiniband/hw/irdma/hmc.c | 18 +- drivers/infiniband/hw/irdma/hmc.h | 19 +- drivers/infiniband/hw/irdma/hw.c | 363 +++--- drivers/infiniband/hw/irdma/i40iw_hw.c | 2 + drivers/infiniband/hw/irdma/i40iw_hw.h | 2 + drivers/infiniband/hw/irdma/i40iw_if.c | 3 + drivers/infiniband/hw/irdma/icrdma_hw.c | 3 + drivers/infiniband/hw/irdma/icrdma_hw.h | 5 +- drivers/infiniband/hw/irdma/icrdma_if.c | 343 +++++ drivers/infiniband/hw/irdma/ig3rdma_hw.c | 170 +++ drivers/infiniband/hw/irdma/ig3rdma_hw.h | 32 + drivers/infiniband/hw/irdma/ig3rdma_if.c | 232 ++++ drivers/infiniband/hw/irdma/irdma.h | 22 +- drivers/infiniband/hw/irdma/main.c | 371 ++---- drivers/infiniband/hw/irdma/main.h | 35 +- drivers/infiniband/hw/irdma/pble.c | 20 +- drivers/infiniband/hw/irdma/protos.h | 1 + drivers/infiniband/hw/irdma/puda.h | 4 +- drivers/infiniband/hw/irdma/type.h | 221 +++- drivers/infiniband/hw/irdma/uda_d.h | 5 +- drivers/infiniband/hw/irdma/uk.c | 303 ++++- drivers/infiniband/hw/irdma/user.h | 267 +++- drivers/infiniband/hw/irdma/utils.c | 112 +- drivers/infiniband/hw/irdma/verbs.c | 825 ++++++++++-- drivers/infiniband/hw/irdma/verbs.h | 44 + drivers/infiniband/hw/irdma/virtchnl.c | 618 +++++++++ drivers/infiniband/hw/irdma/virtchnl.h | 176 +++ include/uapi/rdma/irdma-abi.h | 16 +- 32 files changed, 5120 insertions(+), 855 deletions(-) create mode 100644 drivers/infiniband/hw/irdma/icrdma_if.c create mode 100644 drivers/infiniband/hw/irdma/ig3rdma_hw.c create mode 100644 drivers/infiniband/hw/irdma/ig3rdma_hw.h create mode 100644 drivers/infiniband/hw/irdma/ig3rdma_if.c create mode 100644 drivers/infiniband/hw/irdma/virtchnl.c create mode 100644 drivers/infiniband/hw/irdma/virtchnl.h -- 2.42.0