1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * Copyright (c) 2016 HGST, a Western Digital Company. 4*4882a593Smuzhiyun */ 5*4882a593Smuzhiyun #ifndef _RDMA_RW_H 6*4882a593Smuzhiyun #define _RDMA_RW_H 7*4882a593Smuzhiyun 8*4882a593Smuzhiyun #include <linux/dma-mapping.h> 9*4882a593Smuzhiyun #include <linux/scatterlist.h> 10*4882a593Smuzhiyun #include <rdma/ib_verbs.h> 11*4882a593Smuzhiyun #include <rdma/rdma_cm.h> 12*4882a593Smuzhiyun #include <rdma/mr_pool.h> 13*4882a593Smuzhiyun 14*4882a593Smuzhiyun struct rdma_rw_ctx { 15*4882a593Smuzhiyun /* number of RDMA READ/WRITE WRs (not counting MR WRs) */ 16*4882a593Smuzhiyun u32 nr_ops; 17*4882a593Smuzhiyun 18*4882a593Smuzhiyun /* tag for the union below: */ 19*4882a593Smuzhiyun u8 type; 20*4882a593Smuzhiyun 21*4882a593Smuzhiyun union { 22*4882a593Smuzhiyun /* for mapping a single SGE: */ 23*4882a593Smuzhiyun struct { 24*4882a593Smuzhiyun struct ib_sge sge; 25*4882a593Smuzhiyun struct ib_rdma_wr wr; 26*4882a593Smuzhiyun } single; 27*4882a593Smuzhiyun 28*4882a593Smuzhiyun /* for mapping of multiple SGEs: */ 29*4882a593Smuzhiyun struct { 30*4882a593Smuzhiyun struct ib_sge *sges; 31*4882a593Smuzhiyun struct ib_rdma_wr *wrs; 32*4882a593Smuzhiyun } map; 33*4882a593Smuzhiyun 34*4882a593Smuzhiyun /* for registering multiple WRs: */ 35*4882a593Smuzhiyun struct rdma_rw_reg_ctx { 36*4882a593Smuzhiyun struct ib_sge sge; 37*4882a593Smuzhiyun struct ib_rdma_wr wr; 38*4882a593Smuzhiyun struct ib_reg_wr reg_wr; 39*4882a593Smuzhiyun struct ib_send_wr inv_wr; 40*4882a593Smuzhiyun struct ib_mr *mr; 41*4882a593Smuzhiyun } *reg; 42*4882a593Smuzhiyun }; 43*4882a593Smuzhiyun }; 44*4882a593Smuzhiyun 45*4882a593Smuzhiyun int rdma_rw_ctx_init(struct rdma_rw_ctx *ctx, struct ib_qp *qp, u8 port_num, 46*4882a593Smuzhiyun struct scatterlist *sg, u32 sg_cnt, u32 sg_offset, 47*4882a593Smuzhiyun u64 remote_addr, u32 rkey, enum dma_data_direction dir); 48*4882a593Smuzhiyun void rdma_rw_ctx_destroy(struct rdma_rw_ctx *ctx, struct ib_qp *qp, u8 port_num, 49*4882a593Smuzhiyun struct scatterlist *sg, u32 sg_cnt, 50*4882a593Smuzhiyun enum dma_data_direction dir); 51*4882a593Smuzhiyun 52*4882a593Smuzhiyun int rdma_rw_ctx_signature_init(struct rdma_rw_ctx *ctx, struct ib_qp *qp, 53*4882a593Smuzhiyun u8 port_num, struct scatterlist *sg, u32 sg_cnt, 54*4882a593Smuzhiyun struct scatterlist *prot_sg, u32 prot_sg_cnt, 55*4882a593Smuzhiyun struct ib_sig_attrs *sig_attrs, u64 remote_addr, u32 rkey, 56*4882a593Smuzhiyun enum dma_data_direction dir); 57*4882a593Smuzhiyun void rdma_rw_ctx_destroy_signature(struct rdma_rw_ctx *ctx, struct ib_qp *qp, 58*4882a593Smuzhiyun u8 port_num, struct scatterlist *sg, u32 sg_cnt, 59*4882a593Smuzhiyun struct scatterlist *prot_sg, u32 prot_sg_cnt, 60*4882a593Smuzhiyun enum dma_data_direction dir); 61*4882a593Smuzhiyun 62*4882a593Smuzhiyun struct ib_send_wr *rdma_rw_ctx_wrs(struct rdma_rw_ctx *ctx, struct ib_qp *qp, 63*4882a593Smuzhiyun u8 port_num, struct ib_cqe *cqe, struct ib_send_wr *chain_wr); 64*4882a593Smuzhiyun int rdma_rw_ctx_post(struct rdma_rw_ctx *ctx, struct ib_qp *qp, u8 port_num, 65*4882a593Smuzhiyun struct ib_cqe *cqe, struct ib_send_wr *chain_wr); 66*4882a593Smuzhiyun 67*4882a593Smuzhiyun unsigned int rdma_rw_mr_factor(struct ib_device *device, u8 port_num, 68*4882a593Smuzhiyun unsigned int maxpages); 69*4882a593Smuzhiyun void rdma_rw_init_qp(struct ib_device *dev, struct ib_qp_init_attr *attr); 70*4882a593Smuzhiyun int rdma_rw_init_mrs(struct ib_qp *qp, struct ib_qp_init_attr *attr); 71*4882a593Smuzhiyun void rdma_rw_cleanup_mrs(struct ib_qp *qp); 72*4882a593Smuzhiyun 73*4882a593Smuzhiyun #endif /* _RDMA_RW_H */ 74