Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

IB/hfi1: Build TID RDMA WRITE request

This patch adds the functions to build TID RDMA WRITE request.
The work request opcode, packet opcode, and packet formats for TID
RDMA WRITE protocol are also defined in this patch.

Signed-off-by: Mitko Haralanov <mitko.haralanov@intel.com>
Signed-off-by: Mike Marciniszyn <mike.marciniszyn@intel.com>
Signed-off-by: Ashutosh Dixit <ashutosh.dixit@intel.com>
Signed-off-by: Kaike Wan <kaike.wan@intel.com>
Signed-off-by: Dennis Dalessandro <dennis.dalessandro@intel.com>
Signed-off-by: Doug Ledford <dledford@redhat.com>

authored by

Kaike Wan and committed by
Doug Ledford
c098bbb0 a2f3bde8

+104
+2
drivers/infiniband/hw/hfi1/qp.h
··· 64 64 * HFI1_S_AHG_CLEAR - have send engine clear ahg state 65 65 * HFI1_S_WAIT_PIO_DRAIN - qp waiting for PIOs to drain 66 66 * HFI1_S_WAIT_TID_SPACE - a QP is waiting for TID resource 67 + * HFI1_S_WAIT_TID_RESP - waiting for a TID RDMA WRITE response 67 68 * HFI1_S_MIN_BIT_MASK - the lowest bit that can be used by hfi1 68 69 */ 69 70 #define HFI1_S_AHG_VALID 0x80000000 70 71 #define HFI1_S_AHG_CLEAR 0x40000000 71 72 #define HFI1_S_WAIT_PIO_DRAIN 0x20000000 72 73 #define HFI1_S_WAIT_TID_SPACE 0x10000000 74 + #define HFI1_S_WAIT_TID_RESP 0x08000000 73 75 #define HFI1_S_MIN_BIT_MASK 0x01000000 74 76 75 77 /*
+38
drivers/infiniband/hw/hfi1/tid_rdma.c
··· 2975 2975 exit: 2976 2976 rcu_read_unlock(); 2977 2977 } 2978 + 2979 + /* TID RDMA WRITE functions */ 2980 + 2981 + u32 hfi1_build_tid_rdma_write_req(struct rvt_qp *qp, struct rvt_swqe *wqe, 2982 + struct ib_other_headers *ohdr, 2983 + u32 *bth1, u32 *bth2, u32 *len) 2984 + { 2985 + struct hfi1_qp_priv *qpriv = qp->priv; 2986 + struct tid_rdma_request *req = wqe_to_tid_req(wqe); 2987 + struct tid_rdma_params *remote; 2988 + 2989 + rcu_read_lock(); 2990 + remote = rcu_dereference(qpriv->tid_rdma.remote); 2991 + /* 2992 + * Set the number of flow to be used based on negotiated 2993 + * parameters. 2994 + */ 2995 + req->n_flows = remote->max_write; 2996 + req->state = TID_REQUEST_ACTIVE; 2997 + 2998 + KDETH_RESET(ohdr->u.tid_rdma.w_req.kdeth0, KVER, 0x1); 2999 + KDETH_RESET(ohdr->u.tid_rdma.w_req.kdeth1, JKEY, remote->jkey); 3000 + ohdr->u.tid_rdma.w_req.reth.vaddr = 3001 + cpu_to_be64(wqe->rdma_wr.remote_addr + (wqe->length - *len)); 3002 + ohdr->u.tid_rdma.w_req.reth.rkey = 3003 + cpu_to_be32(wqe->rdma_wr.rkey); 3004 + ohdr->u.tid_rdma.w_req.reth.length = cpu_to_be32(*len); 3005 + ohdr->u.tid_rdma.w_req.verbs_qp = cpu_to_be32(qp->remote_qpn); 3006 + *bth1 &= ~RVT_QPN_MASK; 3007 + *bth1 |= remote->qp; 3008 + qp->s_state = TID_OP(WRITE_REQ); 3009 + qp->s_flags |= HFI1_S_WAIT_TID_RESP; 3010 + *bth2 |= IB_BTH_REQ_ACK; 3011 + *len = 0; 3012 + 3013 + rcu_read_unlock(); 3014 + return sizeof(ohdr->u.tid_rdma.w_req) / sizeof(u32); 3015 + }
+3
drivers/infiniband/hw/hfi1/tid_rdma.h
··· 233 233 setup_tid_rdma_wqe(qp, wqe); 234 234 } 235 235 236 + u32 hfi1_build_tid_rdma_write_req(struct rvt_qp *qp, struct rvt_swqe *wqe, 237 + struct ib_other_headers *ohdr, 238 + u32 *bth1, u32 *bth2, u32 *len); 236 239 #endif /* HFI1_TID_RDMA_H */
+5
include/rdma/ib_hdrs.h
··· 123 123 union { 124 124 struct tid_rdma_read_req r_req; 125 125 struct tid_rdma_read_resp r_rsp; 126 + struct tid_rdma_write_req w_req; 127 + struct tid_rdma_write_resp w_rsp; 128 + struct tid_rdma_write_data w_data; 129 + struct tid_rdma_resync resync; 130 + struct tid_rdma_ack ack; 126 131 } tid_rdma; 127 132 } __packed; 128 133
+56
include/rdma/tid_rdma_defs.h
··· 27 27 __be32 verbs_qp; 28 28 }; 29 29 30 + struct tid_rdma_write_req { 31 + __le32 kdeth0; 32 + __le32 kdeth1; 33 + struct ib_reth reth; 34 + __be32 reserved[2]; 35 + __be32 verbs_qp; 36 + }; 37 + 38 + struct tid_rdma_write_resp { 39 + __le32 kdeth0; 40 + __le32 kdeth1; 41 + __be32 aeth; 42 + __be32 reserved[3]; 43 + __be32 tid_flow_psn; 44 + __be32 tid_flow_qp; 45 + __be32 verbs_qp; 46 + }; 47 + 48 + struct tid_rdma_write_data { 49 + __le32 kdeth0; 50 + __le32 kdeth1; 51 + __be32 reserved[6]; 52 + __be32 verbs_qp; 53 + }; 54 + 55 + struct tid_rdma_resync { 56 + __le32 kdeth0; 57 + __le32 kdeth1; 58 + __be32 reserved[6]; 59 + __be32 verbs_qp; 60 + }; 61 + 62 + struct tid_rdma_ack { 63 + __le32 kdeth0; 64 + __le32 kdeth1; 65 + __be32 aeth; 66 + __be32 reserved[2]; 67 + __be32 tid_flow_psn; 68 + __be32 verbs_psn; 69 + __be32 tid_flow_qp; 70 + __be32 verbs_qp; 71 + }; 72 + 30 73 /* 31 74 * TID RDMA Opcodes 32 75 */ 33 76 #define IB_OPCODE_TID_RDMA 0xe0 34 77 enum { 78 + IB_OPCODE_WRITE_REQ = 0x0, 79 + IB_OPCODE_WRITE_RESP = 0x1, 80 + IB_OPCODE_WRITE_DATA = 0x2, 81 + IB_OPCODE_WRITE_DATA_LAST = 0x3, 35 82 IB_OPCODE_READ_REQ = 0x4, 36 83 IB_OPCODE_READ_RESP = 0x5, 84 + IB_OPCODE_RESYNC = 0x6, 85 + IB_OPCODE_ACK = 0x7, 37 86 87 + IB_OPCODE(TID_RDMA, WRITE_REQ), 88 + IB_OPCODE(TID_RDMA, WRITE_RESP), 89 + IB_OPCODE(TID_RDMA, WRITE_DATA), 90 + IB_OPCODE(TID_RDMA, WRITE_DATA_LAST), 38 91 IB_OPCODE(TID_RDMA, READ_REQ), 39 92 IB_OPCODE(TID_RDMA, READ_RESP), 93 + IB_OPCODE(TID_RDMA, RESYNC), 94 + IB_OPCODE(TID_RDMA, ACK), 40 95 }; 41 96 42 97 #define TID_OP(x) IB_OPCODE_TID_RDMA_##x ··· 102 47 * low level drivers. Two of those are used but renamed 103 48 * to be more descriptive. 104 49 */ 50 + #define IB_WR_TID_RDMA_WRITE IB_WR_RESERVED1 105 51 #define IB_WR_TID_RDMA_READ IB_WR_RESERVED2 106 52 107 53 #endif /* TID_RDMA_DEFS_H */