1 /*
2 * Copyright (c) 2017-2018 Cavium, Inc.
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 *
15 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
16 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
19 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
24 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25 * POSSIBILITY OF SUCH DAMAGE.
26 *
27 * $FreeBSD$
28 *
29 */
30
31 #ifndef __RDMA_COMMON__
32 #define __RDMA_COMMON__
33 /************************************************************************/
34 /* Add include to common rdma target for both eCore and protocol rdma driver */
35 /************************************************************************/
36
37 #define RDMA_RESERVED_LKEY (0) //Reserved lkey
38 #define RDMA_RING_PAGE_SIZE (0x1000) //4KB pages
39
40 #define RDMA_MAX_SGE_PER_SQ_WQE (4) //max number of SGEs in a single request
41 #define RDMA_MAX_SGE_PER_RQ_WQE (4) //max number of SGEs in a single request
42
43 #define RDMA_MAX_DATA_SIZE_IN_WQE (0x80000000) //max size of data in single request
44
45 #define RDMA_REQ_RD_ATOMIC_ELM_SIZE (0x50)
46 #define RDMA_RESP_RD_ATOMIC_ELM_SIZE (0x20)
47
48 #define RDMA_MAX_CQS (64*1024)
49 #define RDMA_MAX_TIDS (128*1024-1)
50 #define RDMA_MAX_PDS (64*1024)
51 #define RDMA_MAX_XRC_SRQS (1024)
52 #define RDMA_MAX_SRQS (32*1024)
53
54 #define RDMA_NUM_STATISTIC_COUNTERS MAX_NUM_VPORTS
55 #define RDMA_NUM_STATISTIC_COUNTERS_K2 MAX_NUM_VPORTS_K2
56 #define RDMA_NUM_STATISTIC_COUNTERS_BB MAX_NUM_VPORTS_BB
57
58 #define RDMA_TASK_TYPE (PROTOCOLID_ROCE)
59
60 struct rdma_srq_id
61 {
62 __le16 srq_idx /* SRQ index */;
63 __le16 opaque_fid;
64 };
65
66 struct rdma_srq_producers
67 {
68 __le32 sge_prod /* Current produced sge in SRQ */;
69 __le32 wqe_prod /* Current produced WQE to SRQ */;
70 };
71
72 /*
73 * rdma completion notification queue element
74 */
75 struct rdma_cnqe
76 {
77 struct regpair cq_handle;
78 };
79
80 struct rdma_cqe_responder
81 {
82 struct regpair srq_wr_id;
83 struct regpair qp_handle;
84 __le32 imm_data_or_inv_r_Key /* immediate data in case imm_flg is set, or invalidated r_key in case inv_flg is set */;
85 __le32 length;
86 __le32 imm_data_hi /* High bytes of immediate data in case imm_flg is set in iWARP only */;
87 __le16 rq_cons /* Valid only when status is WORK_REQUEST_FLUSHED_ERR. Indicates an aggregative flush on all posted RQ WQEs until the reported rq_cons. */;
88 u8 flags;
89 #define RDMA_CQE_RESPONDER_TOGGLE_BIT_MASK 0x1 /* indicates a valid completion written by FW. FW toggle this bit each time it finishes producing all PBL entries */
90 #define RDMA_CQE_RESPONDER_TOGGLE_BIT_SHIFT 0
91 #define RDMA_CQE_RESPONDER_TYPE_MASK 0x3 /* (use enum rdma_cqe_type) */
92 #define RDMA_CQE_RESPONDER_TYPE_SHIFT 1
93 #define RDMA_CQE_RESPONDER_INV_FLG_MASK 0x1 /* r_key invalidated indicator */
94 #define RDMA_CQE_RESPONDER_INV_FLG_SHIFT 3
95 #define RDMA_CQE_RESPONDER_IMM_FLG_MASK 0x1 /* immediate data indicator */
96 #define RDMA_CQE_RESPONDER_IMM_FLG_SHIFT 4
97 #define RDMA_CQE_RESPONDER_RDMA_FLG_MASK 0x1 /* 1=this CQE relates to an RDMA Write. 0=Send. */
98 #define RDMA_CQE_RESPONDER_RDMA_FLG_SHIFT 5
99 #define RDMA_CQE_RESPONDER_RESERVED2_MASK 0x3
100 #define RDMA_CQE_RESPONDER_RESERVED2_SHIFT 6
101 u8 status;
102 };
103
104 struct rdma_cqe_requester
105 {
106 __le16 sq_cons;
107 __le16 reserved0;
108 __le32 reserved1;
109 struct regpair qp_handle;
110 struct regpair reserved2;
111 __le32 reserved3;
112 __le16 reserved4;
113 u8 flags;
114 #define RDMA_CQE_REQUESTER_TOGGLE_BIT_MASK 0x1 /* indicates a valid completion written by FW. FW toggle this bit each time it finishes producing all PBL entries */
115 #define RDMA_CQE_REQUESTER_TOGGLE_BIT_SHIFT 0
116 #define RDMA_CQE_REQUESTER_TYPE_MASK 0x3 /* (use enum rdma_cqe_type) */
117 #define RDMA_CQE_REQUESTER_TYPE_SHIFT 1
118 #define RDMA_CQE_REQUESTER_RESERVED5_MASK 0x1F
119 #define RDMA_CQE_REQUESTER_RESERVED5_SHIFT 3
120 u8 status;
121 };
122
123 struct rdma_cqe_common
124 {
125 struct regpair reserved0;
126 struct regpair qp_handle;
127 __le16 reserved1[7];
128 u8 flags;
129 #define RDMA_CQE_COMMON_TOGGLE_BIT_MASK 0x1 /* indicates a valid completion written by FW. FW toggle this bit each time it finishes producing all PBL entries */
130 #define RDMA_CQE_COMMON_TOGGLE_BIT_SHIFT 0
131 #define RDMA_CQE_COMMON_TYPE_MASK 0x3 /* (use enum rdma_cqe_type) */
132 #define RDMA_CQE_COMMON_TYPE_SHIFT 1
133 #define RDMA_CQE_COMMON_RESERVED2_MASK 0x1F
134 #define RDMA_CQE_COMMON_RESERVED2_SHIFT 3
135 u8 status;
136 };
137
138 /*
139 * rdma completion queue element
140 */
141 union rdma_cqe
142 {
143 struct rdma_cqe_responder resp;
144 struct rdma_cqe_requester req;
145 struct rdma_cqe_common cmn;
146 };
147
148 /*
149 * CQE requester status enumeration
150 */
151 enum rdma_cqe_requester_status_enum
152 {
153 RDMA_CQE_REQ_STS_OK,
154 RDMA_CQE_REQ_STS_BAD_RESPONSE_ERR,
155 RDMA_CQE_REQ_STS_LOCAL_LENGTH_ERR,
156 RDMA_CQE_REQ_STS_LOCAL_QP_OPERATION_ERR,
157 RDMA_CQE_REQ_STS_LOCAL_PROTECTION_ERR,
158 RDMA_CQE_REQ_STS_MEMORY_MGT_OPERATION_ERR,
159 RDMA_CQE_REQ_STS_REMOTE_INVALID_REQUEST_ERR,
160 RDMA_CQE_REQ_STS_REMOTE_ACCESS_ERR,
161 RDMA_CQE_REQ_STS_REMOTE_OPERATION_ERR,
162 RDMA_CQE_REQ_STS_RNR_NAK_RETRY_CNT_ERR,
163 RDMA_CQE_REQ_STS_TRANSPORT_RETRY_CNT_ERR,
164 RDMA_CQE_REQ_STS_WORK_REQUEST_FLUSHED_ERR,
165 MAX_RDMA_CQE_REQUESTER_STATUS_ENUM
166 };
167
168 /*
169 * CQE responder status enumeration
170 */
171 enum rdma_cqe_responder_status_enum
172 {
173 RDMA_CQE_RESP_STS_OK,
174 RDMA_CQE_RESP_STS_LOCAL_ACCESS_ERR,
175 RDMA_CQE_RESP_STS_LOCAL_LENGTH_ERR,
176 RDMA_CQE_RESP_STS_LOCAL_QP_OPERATION_ERR,
177 RDMA_CQE_RESP_STS_LOCAL_PROTECTION_ERR,
178 RDMA_CQE_RESP_STS_MEMORY_MGT_OPERATION_ERR,
179 RDMA_CQE_RESP_STS_REMOTE_INVALID_REQUEST_ERR,
180 RDMA_CQE_RESP_STS_WORK_REQUEST_FLUSHED_ERR,
181 MAX_RDMA_CQE_RESPONDER_STATUS_ENUM
182 };
183
184 /*
185 * CQE type enumeration
186 */
187 enum rdma_cqe_type
188 {
189 RDMA_CQE_TYPE_REQUESTER,
190 RDMA_CQE_TYPE_RESPONDER_RQ,
191 RDMA_CQE_TYPE_RESPONDER_SRQ,
192 RDMA_CQE_TYPE_INVALID,
193 MAX_RDMA_CQE_TYPE
194 };
195
196 /*
197 * DIF Block size options
198 */
199 enum rdma_dif_block_size
200 {
201 RDMA_DIF_BLOCK_512=0,
202 RDMA_DIF_BLOCK_4096=1,
203 MAX_RDMA_DIF_BLOCK_SIZE
204 };
205
206 /*
207 * DIF CRC initial value
208 */
209 enum rdma_dif_crc_seed
210 {
211 RDMA_DIF_CRC_SEED_0000=0,
212 RDMA_DIF_CRC_SEED_FFFF=1,
213 MAX_RDMA_DIF_CRC_SEED
214 };
215
216 /*
217 * RDMA DIF Error Result Structure
218 */
219 struct rdma_dif_error_result
220 {
221 __le32 error_intervals /* Total number of error intervals in the IO. */;
222 __le32 dif_error_1st_interval /* Number of the first interval that contained error. Set to 0xFFFFFFFF if error occurred in the Runt Block. */;
223 u8 flags;
224 #define RDMA_DIF_ERROR_RESULT_DIF_ERROR_TYPE_CRC_MASK 0x1 /* CRC error occurred. */
225 #define RDMA_DIF_ERROR_RESULT_DIF_ERROR_TYPE_CRC_SHIFT 0
226 #define RDMA_DIF_ERROR_RESULT_DIF_ERROR_TYPE_APP_TAG_MASK 0x1 /* App Tag error occurred. */
227 #define RDMA_DIF_ERROR_RESULT_DIF_ERROR_TYPE_APP_TAG_SHIFT 1
228 #define RDMA_DIF_ERROR_RESULT_DIF_ERROR_TYPE_REF_TAG_MASK 0x1 /* Ref Tag error occurred. */
229 #define RDMA_DIF_ERROR_RESULT_DIF_ERROR_TYPE_REF_TAG_SHIFT 2
230 #define RDMA_DIF_ERROR_RESULT_RESERVED0_MASK 0xF
231 #define RDMA_DIF_ERROR_RESULT_RESERVED0_SHIFT 3
232 #define RDMA_DIF_ERROR_RESULT_TOGGLE_BIT_MASK 0x1 /* Used to indicate the structure is valid. Toggles each time an invalidate region is performed. */
233 #define RDMA_DIF_ERROR_RESULT_TOGGLE_BIT_SHIFT 7
234 u8 reserved1[55] /* Pad to 64 bytes to ensure efficient word line writing. */;
235 };
236
237 /*
238 * DIF IO direction
239 */
240 enum rdma_dif_io_direction_flg
241 {
242 RDMA_DIF_DIR_RX=0,
243 RDMA_DIF_DIR_TX=1,
244 MAX_RDMA_DIF_IO_DIRECTION_FLG
245 };
246
247 /*
248 * RDMA DIF Runt Result Structure
249 */
250 struct rdma_dif_runt_result
251 {
252 __le16 guard_tag /* CRC result of received IO. */;
253 __le16 reserved[3];
254 };
255
256 /*
257 * memory window type enumeration
258 */
259 enum rdma_mw_type
260 {
261 RDMA_MW_TYPE_1,
262 RDMA_MW_TYPE_2A,
263 MAX_RDMA_MW_TYPE
264 };
265
266 struct rdma_rq_sge
267 {
268 struct regpair addr;
269 __le32 length;
270 __le32 flags;
271 #define RDMA_RQ_SGE_L_KEY_MASK 0x3FFFFFF /* key of memory relating to this RQ */
272 #define RDMA_RQ_SGE_L_KEY_SHIFT 0
273 #define RDMA_RQ_SGE_NUM_SGES_MASK 0x7 /* first SGE - number of SGEs in this RQ WQE. Other SGEs - should be set to 0 */
274 #define RDMA_RQ_SGE_NUM_SGES_SHIFT 26
275 #define RDMA_RQ_SGE_RESERVED0_MASK 0x7
276 #define RDMA_RQ_SGE_RESERVED0_SHIFT 29
277 };
278
279 struct rdma_sq_atomic_wqe
280 {
281 __le32 reserved1;
282 __le32 length /* Total data length (8 bytes for Atomic) */;
283 __le32 xrc_srq /* Valid only when XRC is set for the QP */;
284 u8 req_type /* Type of WQE */;
285 u8 flags;
286 #define RDMA_SQ_ATOMIC_WQE_COMP_FLG_MASK 0x1 /* If set, completion will be generated when the WQE is completed */
287 #define RDMA_SQ_ATOMIC_WQE_COMP_FLG_SHIFT 0
288 #define RDMA_SQ_ATOMIC_WQE_RD_FENCE_FLG_MASK 0x1 /* If set, all pending RDMA read or Atomic operations will be completed before start processing this WQE */
289 #define RDMA_SQ_ATOMIC_WQE_RD_FENCE_FLG_SHIFT 1
290 #define RDMA_SQ_ATOMIC_WQE_INV_FENCE_FLG_MASK 0x1 /* If set, all pending operations will be completed before start processing this WQE */
291 #define RDMA_SQ_ATOMIC_WQE_INV_FENCE_FLG_SHIFT 2
292 #define RDMA_SQ_ATOMIC_WQE_SE_FLG_MASK 0x1 /* Dont care for atomic wqe */
293 #define RDMA_SQ_ATOMIC_WQE_SE_FLG_SHIFT 3
294 #define RDMA_SQ_ATOMIC_WQE_INLINE_FLG_MASK 0x1 /* Should be 0 for atomic wqe */
295 #define RDMA_SQ_ATOMIC_WQE_INLINE_FLG_SHIFT 4
296 #define RDMA_SQ_ATOMIC_WQE_DIF_ON_HOST_FLG_MASK 0x1 /* Should be 0 for atomic wqe */
297 #define RDMA_SQ_ATOMIC_WQE_DIF_ON_HOST_FLG_SHIFT 5
298 #define RDMA_SQ_ATOMIC_WQE_RESERVED0_MASK 0x3
299 #define RDMA_SQ_ATOMIC_WQE_RESERVED0_SHIFT 6
300 u8 wqe_size /* Size of WQE in 16B chunks including SGE */;
301 u8 prev_wqe_size /* Previous WQE size in 16B chunks */;
302 struct regpair remote_va /* remote virtual address */;
303 __le32 r_key /* Remote key */;
304 __le32 reserved2;
305 struct regpair cmp_data /* Data to compare in case of ATOMIC_CMP_AND_SWAP */;
306 struct regpair swap_data /* Swap or add data */;
307 };
308
309 /*
310 * First element (16 bytes) of atomic wqe
311 */
312 struct rdma_sq_atomic_wqe_1st
313 {
314 __le32 reserved1;
315 __le32 length /* Total data length (8 bytes for Atomic) */;
316 __le32 xrc_srq /* Valid only when XRC is set for the QP */;
317 u8 req_type /* Type of WQE */;
318 u8 flags;
319 #define RDMA_SQ_ATOMIC_WQE_1ST_COMP_FLG_MASK 0x1 /* If set, completion will be generated when the WQE is completed */
320 #define RDMA_SQ_ATOMIC_WQE_1ST_COMP_FLG_SHIFT 0
321 #define RDMA_SQ_ATOMIC_WQE_1ST_RD_FENCE_FLG_MASK 0x1 /* If set, all pending RDMA read or Atomic operations will be completed before start processing this WQE */
322 #define RDMA_SQ_ATOMIC_WQE_1ST_RD_FENCE_FLG_SHIFT 1
323 #define RDMA_SQ_ATOMIC_WQE_1ST_INV_FENCE_FLG_MASK 0x1 /* If set, all pending operations will be completed before start processing this WQE */
324 #define RDMA_SQ_ATOMIC_WQE_1ST_INV_FENCE_FLG_SHIFT 2
325 #define RDMA_SQ_ATOMIC_WQE_1ST_SE_FLG_MASK 0x1 /* Dont care for atomic wqe */
326 #define RDMA_SQ_ATOMIC_WQE_1ST_SE_FLG_SHIFT 3
327 #define RDMA_SQ_ATOMIC_WQE_1ST_INLINE_FLG_MASK 0x1 /* Should be 0 for atomic wqe */
328 #define RDMA_SQ_ATOMIC_WQE_1ST_INLINE_FLG_SHIFT 4
329 #define RDMA_SQ_ATOMIC_WQE_1ST_RESERVED0_MASK 0x7
330 #define RDMA_SQ_ATOMIC_WQE_1ST_RESERVED0_SHIFT 5
331 u8 wqe_size /* Size of WQE in 16B chunks including all SGEs. Set to number of SGEs + 1. */;
332 u8 prev_wqe_size /* Previous WQE size in 16B chunks */;
333 };
334
335 /*
336 * Second element (16 bytes) of atomic wqe
337 */
338 struct rdma_sq_atomic_wqe_2nd
339 {
340 struct regpair remote_va /* remote virtual address */;
341 __le32 r_key /* Remote key */;
342 __le32 reserved2;
343 };
344
345 /*
346 * Third element (16 bytes) of atomic wqe
347 */
348 struct rdma_sq_atomic_wqe_3rd
349 {
350 struct regpair cmp_data /* Data to compare in case of ATOMIC_CMP_AND_SWAP */;
351 struct regpair swap_data /* Swap or add data */;
352 };
353
354 struct rdma_sq_bind_wqe
355 {
356 struct regpair addr;
357 __le32 l_key;
358 u8 req_type /* Type of WQE */;
359 u8 flags;
360 #define RDMA_SQ_BIND_WQE_COMP_FLG_MASK 0x1 /* If set, completion will be generated when the WQE is completed */
361 #define RDMA_SQ_BIND_WQE_COMP_FLG_SHIFT 0
362 #define RDMA_SQ_BIND_WQE_RD_FENCE_FLG_MASK 0x1 /* If set, all pending RDMA read or Atomic operations will be completed before start processing this WQE */
363 #define RDMA_SQ_BIND_WQE_RD_FENCE_FLG_SHIFT 1
364 #define RDMA_SQ_BIND_WQE_INV_FENCE_FLG_MASK 0x1 /* If set, all pending operations will be completed before start processing this WQE */
365 #define RDMA_SQ_BIND_WQE_INV_FENCE_FLG_SHIFT 2
366 #define RDMA_SQ_BIND_WQE_SE_FLG_MASK 0x1 /* Dont care for bind wqe */
367 #define RDMA_SQ_BIND_WQE_SE_FLG_SHIFT 3
368 #define RDMA_SQ_BIND_WQE_INLINE_FLG_MASK 0x1 /* Should be 0 for bind wqe */
369 #define RDMA_SQ_BIND_WQE_INLINE_FLG_SHIFT 4
370 #define RDMA_SQ_BIND_WQE_RESERVED0_MASK 0x7
371 #define RDMA_SQ_BIND_WQE_RESERVED0_SHIFT 5
372 u8 wqe_size /* Size of WQE in 16B chunks */;
373 u8 prev_wqe_size /* Previous WQE size in 16B chunks */;
374 u8 bind_ctrl;
375 #define RDMA_SQ_BIND_WQE_ZERO_BASED_MASK 0x1 /* zero based indication */
376 #define RDMA_SQ_BIND_WQE_ZERO_BASED_SHIFT 0
377 #define RDMA_SQ_BIND_WQE_MW_TYPE_MASK 0x1 /* (use enum rdma_mw_type) */
378 #define RDMA_SQ_BIND_WQE_MW_TYPE_SHIFT 1
379 #define RDMA_SQ_BIND_WQE_RESERVED1_MASK 0x3F
380 #define RDMA_SQ_BIND_WQE_RESERVED1_SHIFT 2
381 u8 access_ctrl;
382 #define RDMA_SQ_BIND_WQE_REMOTE_READ_MASK 0x1
383 #define RDMA_SQ_BIND_WQE_REMOTE_READ_SHIFT 0
384 #define RDMA_SQ_BIND_WQE_REMOTE_WRITE_MASK 0x1
385 #define RDMA_SQ_BIND_WQE_REMOTE_WRITE_SHIFT 1
386 #define RDMA_SQ_BIND_WQE_ENABLE_ATOMIC_MASK 0x1
387 #define RDMA_SQ_BIND_WQE_ENABLE_ATOMIC_SHIFT 2
388 #define RDMA_SQ_BIND_WQE_LOCAL_READ_MASK 0x1
389 #define RDMA_SQ_BIND_WQE_LOCAL_READ_SHIFT 3
390 #define RDMA_SQ_BIND_WQE_LOCAL_WRITE_MASK 0x1
391 #define RDMA_SQ_BIND_WQE_LOCAL_WRITE_SHIFT 4
392 #define RDMA_SQ_BIND_WQE_RESERVED2_MASK 0x7
393 #define RDMA_SQ_BIND_WQE_RESERVED2_SHIFT 5
394 u8 reserved3;
395 u8 length_hi /* upper 8 bits of the registered MW length */;
396 __le32 length_lo /* lower 32 bits of the registered MW length */;
397 __le32 parent_l_key /* l_key of the parent MR */;
398 __le32 reserved4;
399 };
400
401 /*
402 * First element (16 bytes) of bind wqe
403 */
404 struct rdma_sq_bind_wqe_1st
405 {
406 struct regpair addr;
407 __le32 l_key;
408 u8 req_type /* Type of WQE */;
409 u8 flags;
410 #define RDMA_SQ_BIND_WQE_1ST_COMP_FLG_MASK 0x1 /* If set, completion will be generated when the WQE is completed */
411 #define RDMA_SQ_BIND_WQE_1ST_COMP_FLG_SHIFT 0
412 #define RDMA_SQ_BIND_WQE_1ST_RD_FENCE_FLG_MASK 0x1 /* If set, all pending RDMA read or Atomic operations will be completed before start processing this WQE */
413 #define RDMA_SQ_BIND_WQE_1ST_RD_FENCE_FLG_SHIFT 1
414 #define RDMA_SQ_BIND_WQE_1ST_INV_FENCE_FLG_MASK 0x1 /* If set, all pending operations will be completed before start processing this WQE */
415 #define RDMA_SQ_BIND_WQE_1ST_INV_FENCE_FLG_SHIFT 2
416 #define RDMA_SQ_BIND_WQE_1ST_SE_FLG_MASK 0x1 /* Dont care for bind wqe */
417 #define RDMA_SQ_BIND_WQE_1ST_SE_FLG_SHIFT 3
418 #define RDMA_SQ_BIND_WQE_1ST_INLINE_FLG_MASK 0x1 /* Should be 0 for bind wqe */
419 #define RDMA_SQ_BIND_WQE_1ST_INLINE_FLG_SHIFT 4
420 #define RDMA_SQ_BIND_WQE_1ST_RESERVED0_MASK 0x7
421 #define RDMA_SQ_BIND_WQE_1ST_RESERVED0_SHIFT 5
422 u8 wqe_size /* Size of WQE in 16B chunks */;
423 u8 prev_wqe_size /* Previous WQE size in 16B chunks */;
424 };
425
426 /*
427 * Second element (16 bytes) of bind wqe
428 */
429 struct rdma_sq_bind_wqe_2nd
430 {
431 u8 bind_ctrl;
432 #define RDMA_SQ_BIND_WQE_2ND_ZERO_BASED_MASK 0x1 /* zero based indication */
433 #define RDMA_SQ_BIND_WQE_2ND_ZERO_BASED_SHIFT 0
434 #define RDMA_SQ_BIND_WQE_2ND_MW_TYPE_MASK 0x1 /* (use enum rdma_mw_type) */
435 #define RDMA_SQ_BIND_WQE_2ND_MW_TYPE_SHIFT 1
436 #define RDMA_SQ_BIND_WQE_2ND_RESERVED1_MASK 0x3F
437 #define RDMA_SQ_BIND_WQE_2ND_RESERVED1_SHIFT 2
438 u8 access_ctrl;
439 #define RDMA_SQ_BIND_WQE_2ND_REMOTE_READ_MASK 0x1
440 #define RDMA_SQ_BIND_WQE_2ND_REMOTE_READ_SHIFT 0
441 #define RDMA_SQ_BIND_WQE_2ND_REMOTE_WRITE_MASK 0x1
442 #define RDMA_SQ_BIND_WQE_2ND_REMOTE_WRITE_SHIFT 1
443 #define RDMA_SQ_BIND_WQE_2ND_ENABLE_ATOMIC_MASK 0x1
444 #define RDMA_SQ_BIND_WQE_2ND_ENABLE_ATOMIC_SHIFT 2
445 #define RDMA_SQ_BIND_WQE_2ND_LOCAL_READ_MASK 0x1
446 #define RDMA_SQ_BIND_WQE_2ND_LOCAL_READ_SHIFT 3
447 #define RDMA_SQ_BIND_WQE_2ND_LOCAL_WRITE_MASK 0x1
448 #define RDMA_SQ_BIND_WQE_2ND_LOCAL_WRITE_SHIFT 4
449 #define RDMA_SQ_BIND_WQE_2ND_RESERVED2_MASK 0x7
450 #define RDMA_SQ_BIND_WQE_2ND_RESERVED2_SHIFT 5
451 u8 reserved3;
452 u8 length_hi /* upper 8 bits of the registered MW length */;
453 __le32 length_lo /* lower 32 bits of the registered MW length */;
454 __le32 parent_l_key /* l_key of the parent MR */;
455 __le32 reserved4;
456 };
457
458 /*
459 * Structure with only the SQ WQE common fields. Size is of one SQ element (16B)
460 */
461 struct rdma_sq_common_wqe
462 {
463 __le32 reserved1[3];
464 u8 req_type /* Type of WQE */;
465 u8 flags;
466 #define RDMA_SQ_COMMON_WQE_COMP_FLG_MASK 0x1 /* If set, completion will be generated when the WQE is completed */
467 #define RDMA_SQ_COMMON_WQE_COMP_FLG_SHIFT 0
468 #define RDMA_SQ_COMMON_WQE_RD_FENCE_FLG_MASK 0x1 /* If set, all pending RDMA read or Atomic operations will be completed before start processing this WQE */
469 #define RDMA_SQ_COMMON_WQE_RD_FENCE_FLG_SHIFT 1
470 #define RDMA_SQ_COMMON_WQE_INV_FENCE_FLG_MASK 0x1 /* If set, all pending operations will be completed before start processing this WQE */
471 #define RDMA_SQ_COMMON_WQE_INV_FENCE_FLG_SHIFT 2
472 #define RDMA_SQ_COMMON_WQE_SE_FLG_MASK 0x1 /* If set, signal the responder to generate a solicited event on this WQE (only relevant in SENDs and RDMA write with Imm) */
473 #define RDMA_SQ_COMMON_WQE_SE_FLG_SHIFT 3
474 #define RDMA_SQ_COMMON_WQE_INLINE_FLG_MASK 0x1 /* if set, indicates inline data is following this WQE instead of SGEs (only relevant in SENDs and RDMA writes) */
475 #define RDMA_SQ_COMMON_WQE_INLINE_FLG_SHIFT 4
476 #define RDMA_SQ_COMMON_WQE_RESERVED0_MASK 0x7
477 #define RDMA_SQ_COMMON_WQE_RESERVED0_SHIFT 5
478 u8 wqe_size /* Size of WQE in 16B chunks including all SGEs or inline data. In case there are SGEs: set to number of SGEs + 1. In case of inline data: set to the whole number of 16B which contain the inline data + 1. */;
479 u8 prev_wqe_size /* Previous WQE size in 16B chunks */;
480 };
481
482 struct rdma_sq_fmr_wqe
483 {
484 struct regpair addr;
485 __le32 l_key;
486 u8 req_type /* Type of WQE */;
487 u8 flags;
488 #define RDMA_SQ_FMR_WQE_COMP_FLG_MASK 0x1 /* If set, completion will be generated when the WQE is completed */
489 #define RDMA_SQ_FMR_WQE_COMP_FLG_SHIFT 0
490 #define RDMA_SQ_FMR_WQE_RD_FENCE_FLG_MASK 0x1 /* If set, all pending RDMA read or Atomic operations will be completed before start processing this WQE */
491 #define RDMA_SQ_FMR_WQE_RD_FENCE_FLG_SHIFT 1
492 #define RDMA_SQ_FMR_WQE_INV_FENCE_FLG_MASK 0x1 /* If set, all pending operations will be completed before start processing this WQE */
493 #define RDMA_SQ_FMR_WQE_INV_FENCE_FLG_SHIFT 2
494 #define RDMA_SQ_FMR_WQE_SE_FLG_MASK 0x1 /* Dont care for FMR wqe */
495 #define RDMA_SQ_FMR_WQE_SE_FLG_SHIFT 3
496 #define RDMA_SQ_FMR_WQE_INLINE_FLG_MASK 0x1 /* Should be 0 for FMR wqe */
497 #define RDMA_SQ_FMR_WQE_INLINE_FLG_SHIFT 4
498 #define RDMA_SQ_FMR_WQE_DIF_ON_HOST_FLG_MASK 0x1 /* If set, indicated host memory of this WQE is DIF protected. */
499 #define RDMA_SQ_FMR_WQE_DIF_ON_HOST_FLG_SHIFT 5
500 #define RDMA_SQ_FMR_WQE_RESERVED0_MASK 0x3
501 #define RDMA_SQ_FMR_WQE_RESERVED0_SHIFT 6
502 u8 wqe_size /* Size of WQE in 16B chunks */;
503 u8 prev_wqe_size /* Previous WQE size in 16B chunks */;
504 u8 fmr_ctrl;
505 #define RDMA_SQ_FMR_WQE_PAGE_SIZE_LOG_MASK 0x1F /* 0 is 4k, 1 is 8k... */
506 #define RDMA_SQ_FMR_WQE_PAGE_SIZE_LOG_SHIFT 0
507 #define RDMA_SQ_FMR_WQE_ZERO_BASED_MASK 0x1 /* zero based indication */
508 #define RDMA_SQ_FMR_WQE_ZERO_BASED_SHIFT 5
509 #define RDMA_SQ_FMR_WQE_BIND_EN_MASK 0x1 /* indication whether bind is enabled for this MR */
510 #define RDMA_SQ_FMR_WQE_BIND_EN_SHIFT 6
511 #define RDMA_SQ_FMR_WQE_RESERVED1_MASK 0x1
512 #define RDMA_SQ_FMR_WQE_RESERVED1_SHIFT 7
513 u8 access_ctrl;
514 #define RDMA_SQ_FMR_WQE_REMOTE_READ_MASK 0x1
515 #define RDMA_SQ_FMR_WQE_REMOTE_READ_SHIFT 0
516 #define RDMA_SQ_FMR_WQE_REMOTE_WRITE_MASK 0x1
517 #define RDMA_SQ_FMR_WQE_REMOTE_WRITE_SHIFT 1
518 #define RDMA_SQ_FMR_WQE_ENABLE_ATOMIC_MASK 0x1
519 #define RDMA_SQ_FMR_WQE_ENABLE_ATOMIC_SHIFT 2
520 #define RDMA_SQ_FMR_WQE_LOCAL_READ_MASK 0x1
521 #define RDMA_SQ_FMR_WQE_LOCAL_READ_SHIFT 3
522 #define RDMA_SQ_FMR_WQE_LOCAL_WRITE_MASK 0x1
523 #define RDMA_SQ_FMR_WQE_LOCAL_WRITE_SHIFT 4
524 #define RDMA_SQ_FMR_WQE_RESERVED2_MASK 0x7
525 #define RDMA_SQ_FMR_WQE_RESERVED2_SHIFT 5
526 u8 reserved3;
527 u8 length_hi /* upper 8 bits of the registered MR length */;
528 __le32 length_lo /* lower 32 bits of the registered MR length. In case of DIF the length is specified including the DIF guards. */;
529 struct regpair pbl_addr /* Address of PBL */;
530 __le32 dif_base_ref_tag /* Ref tag of the first DIF Block. */;
531 __le16 dif_app_tag /* App tag of all DIF Blocks. */;
532 __le16 dif_app_tag_mask /* Bitmask for verifying dif_app_tag. */;
533 __le16 dif_runt_crc_value /* In TX IO, in case the runt_valid_flg is set, this value is used to validate the last Block in the IO. */;
534 __le16 dif_flags;
535 #define RDMA_SQ_FMR_WQE_DIF_IO_DIRECTION_FLG_MASK 0x1 /* 0=RX, 1=TX (use enum rdma_dif_io_direction_flg) */
536 #define RDMA_SQ_FMR_WQE_DIF_IO_DIRECTION_FLG_SHIFT 0
537 #define RDMA_SQ_FMR_WQE_DIF_BLOCK_SIZE_MASK 0x1 /* DIF block size. 0=512B 1=4096B (use enum rdma_dif_block_size) */
538 #define RDMA_SQ_FMR_WQE_DIF_BLOCK_SIZE_SHIFT 1
539 #define RDMA_SQ_FMR_WQE_DIF_RUNT_VALID_FLG_MASK 0x1 /* In TX IO, indicates the runt_value field is valid. In RX IO, indicates the calculated runt value is to be placed on host buffer. */
540 #define RDMA_SQ_FMR_WQE_DIF_RUNT_VALID_FLG_SHIFT 2
541 #define RDMA_SQ_FMR_WQE_DIF_VALIDATE_CRC_GUARD_MASK 0x1 /* In TX IO, indicates CRC of each DIF guard tag is checked. */
542 #define RDMA_SQ_FMR_WQE_DIF_VALIDATE_CRC_GUARD_SHIFT 3
543 #define RDMA_SQ_FMR_WQE_DIF_VALIDATE_REF_TAG_MASK 0x1 /* In TX IO, indicates Ref tag of each DIF guard tag is checked. */
544 #define RDMA_SQ_FMR_WQE_DIF_VALIDATE_REF_TAG_SHIFT 4
545 #define RDMA_SQ_FMR_WQE_DIF_VALIDATE_APP_TAG_MASK 0x1 /* In TX IO, indicates App tag of each DIF guard tag is checked. */
546 #define RDMA_SQ_FMR_WQE_DIF_VALIDATE_APP_TAG_SHIFT 5
547 #define RDMA_SQ_FMR_WQE_DIF_CRC_SEED_MASK 0x1 /* DIF CRC Seed to use. 0=0x000 1=0xFFFF (use enum rdma_dif_crc_seed) */
548 #define RDMA_SQ_FMR_WQE_DIF_CRC_SEED_SHIFT 6
549 #define RDMA_SQ_FMR_WQE_DIF_RX_REF_TAG_CONST_MASK 0x1 /* In RX IO, Ref Tag will remain at constant value of dif_base_ref_tag */
550 #define RDMA_SQ_FMR_WQE_DIF_RX_REF_TAG_CONST_SHIFT 7
551 #define RDMA_SQ_FMR_WQE_RESERVED4_MASK 0xFF
552 #define RDMA_SQ_FMR_WQE_RESERVED4_SHIFT 8
553 __le32 Reserved5;
554 };
555
556 /*
557 * First element (16 bytes) of fmr wqe
558 */
559 struct rdma_sq_fmr_wqe_1st
560 {
561 struct regpair addr;
562 __le32 l_key;
563 u8 req_type /* Type of WQE */;
564 u8 flags;
565 #define RDMA_SQ_FMR_WQE_1ST_COMP_FLG_MASK 0x1 /* If set, completion will be generated when the WQE is completed */
566 #define RDMA_SQ_FMR_WQE_1ST_COMP_FLG_SHIFT 0
567 #define RDMA_SQ_FMR_WQE_1ST_RD_FENCE_FLG_MASK 0x1 /* If set, all pending RDMA read or Atomic operations will be completed before start processing this WQE */
568 #define RDMA_SQ_FMR_WQE_1ST_RD_FENCE_FLG_SHIFT 1
569 #define RDMA_SQ_FMR_WQE_1ST_INV_FENCE_FLG_MASK 0x1 /* If set, all pending operations will be completed before start processing this WQE */
570 #define RDMA_SQ_FMR_WQE_1ST_INV_FENCE_FLG_SHIFT 2
571 #define RDMA_SQ_FMR_WQE_1ST_SE_FLG_MASK 0x1 /* Dont care for FMR wqe */
572 #define RDMA_SQ_FMR_WQE_1ST_SE_FLG_SHIFT 3
573 #define RDMA_SQ_FMR_WQE_1ST_INLINE_FLG_MASK 0x1 /* Should be 0 for FMR wqe */
574 #define RDMA_SQ_FMR_WQE_1ST_INLINE_FLG_SHIFT 4
575 #define RDMA_SQ_FMR_WQE_1ST_DIF_ON_HOST_FLG_MASK 0x1 /* If set, indicated host memory of this WQE is DIF protected. */
576 #define RDMA_SQ_FMR_WQE_1ST_DIF_ON_HOST_FLG_SHIFT 5
577 #define RDMA_SQ_FMR_WQE_1ST_RESERVED0_MASK 0x3
578 #define RDMA_SQ_FMR_WQE_1ST_RESERVED0_SHIFT 6
579 u8 wqe_size /* Size of WQE in 16B chunks */;
580 u8 prev_wqe_size /* Previous WQE size in 16B chunks */;
581 };
582
583 /*
584 * Second element (16 bytes) of fmr wqe
585 */
586 struct rdma_sq_fmr_wqe_2nd
587 {
588 u8 fmr_ctrl;
589 #define RDMA_SQ_FMR_WQE_2ND_PAGE_SIZE_LOG_MASK 0x1F /* 0 is 4k, 1 is 8k... */
590 #define RDMA_SQ_FMR_WQE_2ND_PAGE_SIZE_LOG_SHIFT 0
591 #define RDMA_SQ_FMR_WQE_2ND_ZERO_BASED_MASK 0x1 /* zero based indication */
592 #define RDMA_SQ_FMR_WQE_2ND_ZERO_BASED_SHIFT 5
593 #define RDMA_SQ_FMR_WQE_2ND_BIND_EN_MASK 0x1 /* indication whether bind is enabled for this MR */
594 #define RDMA_SQ_FMR_WQE_2ND_BIND_EN_SHIFT 6
595 #define RDMA_SQ_FMR_WQE_2ND_RESERVED1_MASK 0x1
596 #define RDMA_SQ_FMR_WQE_2ND_RESERVED1_SHIFT 7
597 u8 access_ctrl;
598 #define RDMA_SQ_FMR_WQE_2ND_REMOTE_READ_MASK 0x1
599 #define RDMA_SQ_FMR_WQE_2ND_REMOTE_READ_SHIFT 0
600 #define RDMA_SQ_FMR_WQE_2ND_REMOTE_WRITE_MASK 0x1
601 #define RDMA_SQ_FMR_WQE_2ND_REMOTE_WRITE_SHIFT 1
602 #define RDMA_SQ_FMR_WQE_2ND_ENABLE_ATOMIC_MASK 0x1
603 #define RDMA_SQ_FMR_WQE_2ND_ENABLE_ATOMIC_SHIFT 2
604 #define RDMA_SQ_FMR_WQE_2ND_LOCAL_READ_MASK 0x1
605 #define RDMA_SQ_FMR_WQE_2ND_LOCAL_READ_SHIFT 3
606 #define RDMA_SQ_FMR_WQE_2ND_LOCAL_WRITE_MASK 0x1
607 #define RDMA_SQ_FMR_WQE_2ND_LOCAL_WRITE_SHIFT 4
608 #define RDMA_SQ_FMR_WQE_2ND_RESERVED2_MASK 0x7
609 #define RDMA_SQ_FMR_WQE_2ND_RESERVED2_SHIFT 5
610 u8 reserved3;
611 u8 length_hi /* upper 8 bits of the registered MR length */;
612 __le32 length_lo /* lower 32 bits of the registered MR length. */;
613 struct regpair pbl_addr /* Address of PBL */;
614 };
615
616 /*
617 * Third element (16 bytes) of fmr wqe
618 */
619 struct rdma_sq_fmr_wqe_3rd
620 {
621 __le32 dif_base_ref_tag /* Ref tag of the first DIF Block. */;
622 __le16 dif_app_tag /* App tag of all DIF Blocks. */;
623 __le16 dif_app_tag_mask /* Bitmask for verifying dif_app_tag. */;
624 __le16 dif_runt_crc_value /* In TX IO, in case the runt_valid_flg is set, this value is used to validate the last Block in the IO. */;
625 __le16 dif_flags;
626 #define RDMA_SQ_FMR_WQE_3RD_DIF_IO_DIRECTION_FLG_MASK 0x1 /* 0=RX, 1=TX (use enum rdma_dif_io_direction_flg) */
627 #define RDMA_SQ_FMR_WQE_3RD_DIF_IO_DIRECTION_FLG_SHIFT 0
628 #define RDMA_SQ_FMR_WQE_3RD_DIF_BLOCK_SIZE_MASK 0x1 /* DIF block size. 0=512B 1=4096B (use enum rdma_dif_block_size) */
629 #define RDMA_SQ_FMR_WQE_3RD_DIF_BLOCK_SIZE_SHIFT 1
630 #define RDMA_SQ_FMR_WQE_3RD_DIF_RUNT_VALID_FLG_MASK 0x1 /* In TX IO, indicates the runt_value field is valid. In RX IO, indicates the calculated runt value is to be placed on host buffer. */
631 #define RDMA_SQ_FMR_WQE_3RD_DIF_RUNT_VALID_FLG_SHIFT 2
632 #define RDMA_SQ_FMR_WQE_3RD_DIF_VALIDATE_CRC_GUARD_MASK 0x1 /* In TX IO, indicates CRC of each DIF guard tag is checked. */
633 #define RDMA_SQ_FMR_WQE_3RD_DIF_VALIDATE_CRC_GUARD_SHIFT 3
634 #define RDMA_SQ_FMR_WQE_3RD_DIF_VALIDATE_REF_TAG_MASK 0x1 /* In TX IO, indicates Ref tag of each DIF guard tag is checked. */
635 #define RDMA_SQ_FMR_WQE_3RD_DIF_VALIDATE_REF_TAG_SHIFT 4
636 #define RDMA_SQ_FMR_WQE_3RD_DIF_VALIDATE_APP_TAG_MASK 0x1 /* In TX IO, indicates App tag of each DIF guard tag is checked. */
637 #define RDMA_SQ_FMR_WQE_3RD_DIF_VALIDATE_APP_TAG_SHIFT 5
638 #define RDMA_SQ_FMR_WQE_3RD_DIF_CRC_SEED_MASK 0x1 /* DIF CRC Seed to use. 0=0x000 1=0xFFFF (use enum rdma_dif_crc_seed) */
639 #define RDMA_SQ_FMR_WQE_3RD_DIF_CRC_SEED_SHIFT 6
640 #define RDMA_SQ_FMR_WQE_3RD_RESERVED4_MASK 0x1FF
641 #define RDMA_SQ_FMR_WQE_3RD_RESERVED4_SHIFT 7
642 __le32 Reserved5;
643 };
644
645 struct rdma_sq_local_inv_wqe
646 {
647 struct regpair reserved;
648 __le32 inv_l_key /* The invalidate local key */;
649 u8 req_type /* Type of WQE */;
650 u8 flags;
651 #define RDMA_SQ_LOCAL_INV_WQE_COMP_FLG_MASK 0x1 /* If set, completion will be generated when the WQE is completed */
652 #define RDMA_SQ_LOCAL_INV_WQE_COMP_FLG_SHIFT 0
653 #define RDMA_SQ_LOCAL_INV_WQE_RD_FENCE_FLG_MASK 0x1 /* If set, all pending RDMA read or Atomic operations will be completed before start processing this WQE */
654 #define RDMA_SQ_LOCAL_INV_WQE_RD_FENCE_FLG_SHIFT 1
655 #define RDMA_SQ_LOCAL_INV_WQE_INV_FENCE_FLG_MASK 0x1 /* If set, all pending operations will be completed before start processing this WQE */
656 #define RDMA_SQ_LOCAL_INV_WQE_INV_FENCE_FLG_SHIFT 2
657 #define RDMA_SQ_LOCAL_INV_WQE_SE_FLG_MASK 0x1 /* Dont care for local invalidate wqe */
658 #define RDMA_SQ_LOCAL_INV_WQE_SE_FLG_SHIFT 3
659 #define RDMA_SQ_LOCAL_INV_WQE_INLINE_FLG_MASK 0x1 /* Should be 0 for local invalidate wqe */
660 #define RDMA_SQ_LOCAL_INV_WQE_INLINE_FLG_SHIFT 4
661 #define RDMA_SQ_LOCAL_INV_WQE_DIF_ON_HOST_FLG_MASK 0x1 /* If set, indicated host memory of this WQE is DIF protected. */
662 #define RDMA_SQ_LOCAL_INV_WQE_DIF_ON_HOST_FLG_SHIFT 5
663 #define RDMA_SQ_LOCAL_INV_WQE_RESERVED0_MASK 0x3
664 #define RDMA_SQ_LOCAL_INV_WQE_RESERVED0_SHIFT 6
665 u8 wqe_size /* Size of WQE in 16B chunks */;
666 u8 prev_wqe_size /* Previous WQE size in 16B chunks */;
667 };
668
669 struct rdma_sq_rdma_wqe
670 {
671 __le32 imm_data /* The immediate data in case of RDMA_WITH_IMM */;
672 __le32 length /* Total data length. If DIF on host is enabled, length does NOT include DIF guards. */;
673 __le32 xrc_srq /* Valid only when XRC is set for the QP */;
674 u8 req_type /* Type of WQE */;
675 u8 flags;
676 #define RDMA_SQ_RDMA_WQE_COMP_FLG_MASK 0x1 /* If set, completion will be generated when the WQE is completed */
677 #define RDMA_SQ_RDMA_WQE_COMP_FLG_SHIFT 0
678 #define RDMA_SQ_RDMA_WQE_RD_FENCE_FLG_MASK 0x1 /* If set, all pending RDMA read or Atomic operations will be completed before start processing this WQE */
679 #define RDMA_SQ_RDMA_WQE_RD_FENCE_FLG_SHIFT 1
680 #define RDMA_SQ_RDMA_WQE_INV_FENCE_FLG_MASK 0x1 /* If set, all pending operations will be completed before start processing this WQE */
681 #define RDMA_SQ_RDMA_WQE_INV_FENCE_FLG_SHIFT 2
682 #define RDMA_SQ_RDMA_WQE_SE_FLG_MASK 0x1 /* If set, signal the responder to generate a solicited event on this WQE */
683 #define RDMA_SQ_RDMA_WQE_SE_FLG_SHIFT 3
684 #define RDMA_SQ_RDMA_WQE_INLINE_FLG_MASK 0x1 /* if set, indicates inline data is following this WQE instead of SGEs. Applicable for RDMA_WR or RDMA_WR_WITH_IMM. Should be 0 for RDMA_RD */
685 #define RDMA_SQ_RDMA_WQE_INLINE_FLG_SHIFT 4
686 #define RDMA_SQ_RDMA_WQE_DIF_ON_HOST_FLG_MASK 0x1 /* If set, indicated host memory of this WQE is DIF protected. */
687 #define RDMA_SQ_RDMA_WQE_DIF_ON_HOST_FLG_SHIFT 5
688 #define RDMA_SQ_RDMA_WQE_READ_INV_FLG_MASK 0x1 /* If set, indicated read with invalidate WQE. iWARP only */
689 #define RDMA_SQ_RDMA_WQE_READ_INV_FLG_SHIFT 6
690 #define RDMA_SQ_RDMA_WQE_RESERVED0_MASK 0x1
691 #define RDMA_SQ_RDMA_WQE_RESERVED0_SHIFT 7
692 u8 wqe_size /* Size of WQE in 16B chunks including all SGEs or inline data. In case there are SGEs: set to number of SGEs + 1. In case of inline data: set to the whole number of 16B which contain the inline data + 1. */;
693 u8 prev_wqe_size /* Previous WQE size in 16B chunks */;
694 struct regpair remote_va /* Remote virtual address */;
695 __le32 r_key /* Remote key */;
696 u8 dif_flags;
697 #define RDMA_SQ_RDMA_WQE_DIF_BLOCK_SIZE_MASK 0x1 /* if dif_on_host_flg set: DIF block size. 0=512B 1=4096B (use enum rdma_dif_block_size) */
698 #define RDMA_SQ_RDMA_WQE_DIF_BLOCK_SIZE_SHIFT 0
699 #define RDMA_SQ_RDMA_WQE_DIF_FIRST_RDMA_IN_IO_FLG_MASK 0x1 /* if dif_on_host_flg set: WQE executes first RDMA on related IO. */
700 #define RDMA_SQ_RDMA_WQE_DIF_FIRST_RDMA_IN_IO_FLG_SHIFT 1
701 #define RDMA_SQ_RDMA_WQE_DIF_LAST_RDMA_IN_IO_FLG_MASK 0x1 /* if dif_on_host_flg set: WQE executes last RDMA on related IO. */
702 #define RDMA_SQ_RDMA_WQE_DIF_LAST_RDMA_IN_IO_FLG_SHIFT 2
703 #define RDMA_SQ_RDMA_WQE_RESERVED1_MASK 0x1F
704 #define RDMA_SQ_RDMA_WQE_RESERVED1_SHIFT 3
705 u8 reserved2[3];
706 };
707
708 /*
709 * First element (16 bytes) of rdma wqe
710 */
711 struct rdma_sq_rdma_wqe_1st
712 {
713 __le32 imm_data /* The immediate data in case of RDMA_WITH_IMM */;
714 __le32 length /* Total data length */;
715 __le32 xrc_srq /* Valid only when XRC is set for the QP */;
716 u8 req_type /* Type of WQE */;
717 u8 flags;
718 #define RDMA_SQ_RDMA_WQE_1ST_COMP_FLG_MASK 0x1 /* If set, completion will be generated when the WQE is completed */
719 #define RDMA_SQ_RDMA_WQE_1ST_COMP_FLG_SHIFT 0
720 #define RDMA_SQ_RDMA_WQE_1ST_RD_FENCE_FLG_MASK 0x1 /* If set, all pending RDMA read or Atomic operations will be completed before start processing this WQE */
721 #define RDMA_SQ_RDMA_WQE_1ST_RD_FENCE_FLG_SHIFT 1
722 #define RDMA_SQ_RDMA_WQE_1ST_INV_FENCE_FLG_MASK 0x1 /* If set, all pending operations will be completed before start processing this WQE */
723 #define RDMA_SQ_RDMA_WQE_1ST_INV_FENCE_FLG_SHIFT 2
724 #define RDMA_SQ_RDMA_WQE_1ST_SE_FLG_MASK 0x1 /* If set, signal the responder to generate a solicited event on this WQE */
725 #define RDMA_SQ_RDMA_WQE_1ST_SE_FLG_SHIFT 3
726 #define RDMA_SQ_RDMA_WQE_1ST_INLINE_FLG_MASK 0x1 /* if set, indicates inline data is following this WQE instead of SGEs. Applicable for RDMA_WR or RDMA_WR_WITH_IMM. Should be 0 for RDMA_RD */
727 #define RDMA_SQ_RDMA_WQE_1ST_INLINE_FLG_SHIFT 4
728 #define RDMA_SQ_RDMA_WQE_1ST_DIF_ON_HOST_FLG_MASK 0x1 /* If set, indicated host memory of this WQE is DIF protected. */
729 #define RDMA_SQ_RDMA_WQE_1ST_DIF_ON_HOST_FLG_SHIFT 5
730 #define RDMA_SQ_RDMA_WQE_1ST_READ_INV_FLG_MASK 0x1 /* If set, indicated read with invalidate WQE. iWARP only */
731 #define RDMA_SQ_RDMA_WQE_1ST_READ_INV_FLG_SHIFT 6
732 #define RDMA_SQ_RDMA_WQE_1ST_RESERVED0_MASK 0x1
733 #define RDMA_SQ_RDMA_WQE_1ST_RESERVED0_SHIFT 7
734 u8 wqe_size /* Size of WQE in 16B chunks including all SGEs or inline data. In case there are SGEs: set to number of SGEs + 1. In case of inline data: set to the whole number of 16B which contain the inline data + 1. */;
735 u8 prev_wqe_size /* Previous WQE size in 16B chunks */;
736 };
737
738 /*
739 * Second element (16 bytes) of rdma wqe
740 */
741 struct rdma_sq_rdma_wqe_2nd
742 {
743 struct regpair remote_va /* Remote virtual address */;
744 __le32 r_key /* Remote key */;
745 u8 dif_flags;
746 #define RDMA_SQ_RDMA_WQE_2ND_DIF_BLOCK_SIZE_MASK 0x1 /* if dif_on_host_flg set: DIF block size. 0=512B 1=4096B (use enum rdma_dif_block_size) */
747 #define RDMA_SQ_RDMA_WQE_2ND_DIF_BLOCK_SIZE_SHIFT 0
748 #define RDMA_SQ_RDMA_WQE_2ND_DIF_FIRST_SEGMENT_FLG_MASK 0x1 /* if dif_on_host_flg set: WQE executes first DIF on related MR. */
749 #define RDMA_SQ_RDMA_WQE_2ND_DIF_FIRST_SEGMENT_FLG_SHIFT 1
750 #define RDMA_SQ_RDMA_WQE_2ND_DIF_LAST_SEGMENT_FLG_MASK 0x1 /* if dif_on_host_flg set: WQE executes last DIF on related MR. */
751 #define RDMA_SQ_RDMA_WQE_2ND_DIF_LAST_SEGMENT_FLG_SHIFT 2
752 #define RDMA_SQ_RDMA_WQE_2ND_RESERVED1_MASK 0x1F
753 #define RDMA_SQ_RDMA_WQE_2ND_RESERVED1_SHIFT 3
754 u8 reserved2[3];
755 };
756
757 /*
758 * SQ WQE req type enumeration
759 */
760 enum rdma_sq_req_type
761 {
762 RDMA_SQ_REQ_TYPE_SEND,
763 RDMA_SQ_REQ_TYPE_SEND_WITH_IMM,
764 RDMA_SQ_REQ_TYPE_SEND_WITH_INVALIDATE,
765 RDMA_SQ_REQ_TYPE_RDMA_WR,
766 RDMA_SQ_REQ_TYPE_RDMA_WR_WITH_IMM,
767 RDMA_SQ_REQ_TYPE_RDMA_RD,
768 RDMA_SQ_REQ_TYPE_ATOMIC_CMP_AND_SWAP,
769 RDMA_SQ_REQ_TYPE_ATOMIC_ADD,
770 RDMA_SQ_REQ_TYPE_LOCAL_INVALIDATE,
771 RDMA_SQ_REQ_TYPE_FAST_MR,
772 RDMA_SQ_REQ_TYPE_BIND,
773 RDMA_SQ_REQ_TYPE_INVALID,
774 MAX_RDMA_SQ_REQ_TYPE
775 };
776
777 struct rdma_sq_send_wqe
778 {
779 __le32 inv_key_or_imm_data /* the r_key to invalidate in case of SEND_WITH_INVALIDATE, or the immediate data in case of SEND_WITH_IMM */;
780 __le32 length /* Total data length */;
781 __le32 xrc_srq /* Valid only when XRC is set for the QP */;
782 u8 req_type /* Type of WQE */;
783 u8 flags;
784 #define RDMA_SQ_SEND_WQE_COMP_FLG_MASK 0x1 /* If set, completion will be generated when the WQE is completed */
785 #define RDMA_SQ_SEND_WQE_COMP_FLG_SHIFT 0
786 #define RDMA_SQ_SEND_WQE_RD_FENCE_FLG_MASK 0x1 /* If set, all pending RDMA read or Atomic operations will be completed before start processing this WQE */
787 #define RDMA_SQ_SEND_WQE_RD_FENCE_FLG_SHIFT 1
788 #define RDMA_SQ_SEND_WQE_INV_FENCE_FLG_MASK 0x1 /* If set, all pending operations will be completed before start processing this WQE */
789 #define RDMA_SQ_SEND_WQE_INV_FENCE_FLG_SHIFT 2
790 #define RDMA_SQ_SEND_WQE_SE_FLG_MASK 0x1 /* If set, signal the responder to generate a solicited event on this WQE */
791 #define RDMA_SQ_SEND_WQE_SE_FLG_SHIFT 3
792 #define RDMA_SQ_SEND_WQE_INLINE_FLG_MASK 0x1 /* if set, indicates inline data is following this WQE instead of SGEs */
793 #define RDMA_SQ_SEND_WQE_INLINE_FLG_SHIFT 4
794 #define RDMA_SQ_SEND_WQE_DIF_ON_HOST_FLG_MASK 0x1 /* Should be 0 for send wqe */
795 #define RDMA_SQ_SEND_WQE_DIF_ON_HOST_FLG_SHIFT 5
796 #define RDMA_SQ_SEND_WQE_RESERVED0_MASK 0x3
797 #define RDMA_SQ_SEND_WQE_RESERVED0_SHIFT 6
798 u8 wqe_size /* Size of WQE in 16B chunks including all SGEs or inline data. In case there are SGEs: set to number of SGEs + 1. In case of inline data: set to the whole number of 16B which contain the inline data + 1. */;
799 u8 prev_wqe_size /* Previous WQE size in 16B chunks */;
800 __le32 reserved1[4];
801 };
802
803 struct rdma_sq_send_wqe_1st
804 {
805 __le32 inv_key_or_imm_data /* the r_key to invalidate in case of SEND_WITH_INVALIDATE, or the immediate data in case of SEND_WITH_IMM */;
806 __le32 length /* Total data length */;
807 __le32 xrc_srq /* Valid only when XRC is set for the QP */;
808 u8 req_type /* Type of WQE */;
809 u8 flags;
810 #define RDMA_SQ_SEND_WQE_1ST_COMP_FLG_MASK 0x1 /* If set, completion will be generated when the WQE is completed */
811 #define RDMA_SQ_SEND_WQE_1ST_COMP_FLG_SHIFT 0
812 #define RDMA_SQ_SEND_WQE_1ST_RD_FENCE_FLG_MASK 0x1 /* If set, all pending RDMA read or Atomic operations will be completed before start processing this WQE */
813 #define RDMA_SQ_SEND_WQE_1ST_RD_FENCE_FLG_SHIFT 1
814 #define RDMA_SQ_SEND_WQE_1ST_INV_FENCE_FLG_MASK 0x1 /* If set, all pending operations will be completed before start processing this WQE */
815 #define RDMA_SQ_SEND_WQE_1ST_INV_FENCE_FLG_SHIFT 2
816 #define RDMA_SQ_SEND_WQE_1ST_SE_FLG_MASK 0x1 /* If set, signal the responder to generate a solicited event on this WQE */
817 #define RDMA_SQ_SEND_WQE_1ST_SE_FLG_SHIFT 3
818 #define RDMA_SQ_SEND_WQE_1ST_INLINE_FLG_MASK 0x1 /* if set, indicates inline data is following this WQE instead of SGEs */
819 #define RDMA_SQ_SEND_WQE_1ST_INLINE_FLG_SHIFT 4
820 #define RDMA_SQ_SEND_WQE_1ST_RESERVED0_MASK 0x7
821 #define RDMA_SQ_SEND_WQE_1ST_RESERVED0_SHIFT 5
822 u8 wqe_size /* Size of WQE in 16B chunks including all SGEs or inline data. In case there are SGEs: set to number of SGEs + 1. In case of inline data: set to the whole number of 16B which contain the inline data + 1. */;
823 u8 prev_wqe_size /* Previous WQE size in 16B chunks */;
824 };
825
826 struct rdma_sq_send_wqe_2st
827 {
828 __le32 reserved1[4];
829 };
830
831 struct rdma_sq_sge
832 {
833 __le32 length /* Total length of the send. If DIF on host is enabled, SGE length includes the DIF guards. */;
834 struct regpair addr;
835 __le32 l_key;
836 };
837
838 struct rdma_srq_wqe_header
839 {
840 struct regpair wr_id;
841 u8 num_sges /* number of SGEs in WQE */;
842 u8 reserved2[7];
843 };
844
845 struct rdma_srq_sge
846 {
847 struct regpair addr;
848 __le32 length;
849 __le32 l_key;
850 };
851
852 /*
853 * rdma srq sge
854 */
855 union rdma_srq_elm
856 {
857 struct rdma_srq_wqe_header header;
858 struct rdma_srq_sge sge;
859 };
860
861 /*
862 * Rdma doorbell data for flags update
863 */
864 struct rdma_pwm_flags_data
865 {
866 __le16 icid /* internal CID */;
867 u8 agg_flags /* aggregative flags */;
868 u8 reserved;
869 };
870
871 /*
872 * Rdma doorbell data for SQ and RQ
873 */
874 struct rdma_pwm_val16_data
875 {
876 __le16 icid /* internal CID */;
877 __le16 value /* aggregated value to update */;
878 };
879
880 union rdma_pwm_val16_data_union
881 {
882 struct rdma_pwm_val16_data as_struct /* Parameters field */;
883 __le32 as_dword;
884 };
885
886 /*
887 * Rdma doorbell data for CQ
888 */
889 struct rdma_pwm_val32_data
890 {
891 __le16 icid /* internal CID */;
892 u8 agg_flags /* bit for every DQ counter flags in CM context that DQ can increment */;
893 u8 params;
894 #define RDMA_PWM_VAL32_DATA_AGG_CMD_MASK 0x3 /* aggregative command to CM (use enum db_agg_cmd_sel) */
895 #define RDMA_PWM_VAL32_DATA_AGG_CMD_SHIFT 0
896 #define RDMA_PWM_VAL32_DATA_BYPASS_EN_MASK 0x1 /* enable QM bypass */
897 #define RDMA_PWM_VAL32_DATA_BYPASS_EN_SHIFT 2
898 #define RDMA_PWM_VAL32_DATA_CONN_TYPE_IS_IWARP_MASK 0x1 /* Connection type is iWARP */
899 #define RDMA_PWM_VAL32_DATA_CONN_TYPE_IS_IWARP_SHIFT 3
900 #define RDMA_PWM_VAL32_DATA_SET_16B_VAL_MASK 0x1 /* Flag indicating 16b variable should be updated. Should be used when conn_type_is_iwarp is used */
901 #define RDMA_PWM_VAL32_DATA_SET_16B_VAL_SHIFT 4
902 #define RDMA_PWM_VAL32_DATA_RESERVED_MASK 0x7
903 #define RDMA_PWM_VAL32_DATA_RESERVED_SHIFT 5
904 __le32 value /* aggregated value to update */;
905 };
906
907 union rdma_pwm_val32_data_union
908 {
909 struct rdma_pwm_val32_data as_struct /* Parameters field */;
910 struct regpair as_repair;
911 };
912
913 #endif /* __RDMA_COMMON__ */
Cache object: b4a56c4155539f2647f8458065dca80c
|