1 /* 2 * Copyright (c) 2016 HGST, a Western Digital Company. 3 * 4 * This program is free software; you can redistribute it and/or modify it 5 * under the terms and conditions of the GNU General Public License, 6 * version 2, as published by the Free Software Foundation. 7 * 8 * This program is distributed in the hope it will be useful, but WITHOUT 9 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 10 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 11 * more details. 12 */ 13 #ifndef _RDMA_RW_H 14 #define _RDMA_RW_H 15 16 #include <linux/dma-mapping.h> 17 #include <linux/scatterlist.h> 18 #include <rdma/ib_verbs.h> 19 #include <rdma/rdma_cm.h> 20 #include <rdma/mr_pool.h> 21 22 struct rdma_rw_ctx { 23 /* number of RDMA READ/WRITE WRs (not counting MR WRs) */ 24 u32 nr_ops; 25 26 /* tag for the union below: */ 27 u8 type; 28 29 union { 30 /* for mapping a single SGE: */ 31 struct { 32 struct ib_sge sge; 33 struct ib_rdma_wr wr; 34 } single; 35 36 /* for mapping of multiple SGEs: */ 37 struct { 38 struct ib_sge *sges; 39 struct ib_rdma_wr *wrs; 40 } map; 41 42 /* for registering multiple WRs: */ 43 struct rdma_rw_reg_ctx { 44 struct ib_sge sge; 45 struct ib_rdma_wr wr; 46 struct ib_reg_wr reg_wr; 47 struct ib_send_wr inv_wr; 48 struct ib_mr *mr; 49 } *reg; 50 }; 51 }; 52 53 int rdma_rw_ctx_init(struct rdma_rw_ctx *ctx, struct ib_qp *qp, u8 port_num, 54 struct scatterlist *sg, u32 sg_cnt, u32 sg_offset, 55 u64 remote_addr, u32 rkey, enum dma_data_direction dir); 56 void rdma_rw_ctx_destroy(struct rdma_rw_ctx *ctx, struct ib_qp *qp, u8 port_num, 57 struct scatterlist *sg, u32 sg_cnt, 58 enum dma_data_direction dir); 59 60 int rdma_rw_ctx_signature_init(struct rdma_rw_ctx *ctx, struct ib_qp *qp, 61 u8 port_num, struct scatterlist *sg, u32 sg_cnt, 62 struct scatterlist *prot_sg, u32 prot_sg_cnt, 63 struct ib_sig_attrs *sig_attrs, u64 remote_addr, u32 rkey, 64 enum dma_data_direction dir); 65 void rdma_rw_ctx_destroy_signature(struct rdma_rw_ctx *ctx, struct ib_qp *qp, 66 u8 port_num, struct scatterlist *sg, u32 sg_cnt, 67 struct scatterlist *prot_sg, u32 prot_sg_cnt, 68 enum dma_data_direction dir); 69 70 struct ib_send_wr *rdma_rw_ctx_wrs(struct rdma_rw_ctx *ctx, struct ib_qp *qp, 71 u8 port_num, struct ib_cqe *cqe, struct ib_send_wr *chain_wr); 72 int rdma_rw_ctx_post(struct rdma_rw_ctx *ctx, struct ib_qp *qp, u8 port_num, 73 struct ib_cqe *cqe, struct ib_send_wr *chain_wr); 74 75 unsigned int rdma_rw_mr_factor(struct ib_device *device, u8 port_num, 76 unsigned int maxpages); 77 void rdma_rw_init_qp(struct ib_device *dev, struct ib_qp_init_attr *attr); 78 int rdma_rw_init_mrs(struct ib_qp *qp, struct ib_qp_init_attr *attr); 79 void rdma_rw_cleanup_mrs(struct ib_qp *qp); 80 81 #endif /* _RDMA_RW_H */ 82