1/* QLogic qedr NIC Driver
2 * Copyright (c) 2015-2016 QLogic Corporation
3 *
4 * This software is available to you under a choice of one of two
5 * licenses. You may choose to be licensed under the terms of the GNU
6 * General Public License (GPL) Version 2, available from the file
7 * COPYING in the main directory of this source tree, or the
8 * OpenIB.org BSD license below:
9 *
10 * Redistribution and use in source and binary forms, with or
11 * without modification, are permitted provided that the following
12 * conditions are met:
13 *
14 * - Redistributions of source code must retain the above
15 * copyright notice, this list of conditions and the following
16 * disclaimer.
17 *
18 * - Redistributions in binary form must reproduce the above
19 * copyright notice, this list of conditions and the following
20 * disclaimer in the documentation and /or other materials
21 * provided with the distribution.
22 *
23 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
24 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
25 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
26 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
27 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
28 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
29 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
30 * SOFTWARE.
31 */
32#ifndef __QED_HSI_RDMA__
33#define __QED_HSI_RDMA__
34
35#include <linux/qed/rdma_common.h>
36
37/* rdma completion notification queue element */
38struct rdma_cnqe {
39 struct regpair cq_handle;
40};
41
42struct rdma_cqe_responder {
43 struct regpair srq_wr_id;
44 struct regpair qp_handle;
45 __le32 imm_data_or_inv_r_Key;
46 __le32 length;
47 __le32 imm_data_hi;
48 __le16 rq_cons_or_srq_id;
49 u8 flags;
50#define RDMA_CQE_RESPONDER_TOGGLE_BIT_MASK 0x1
51#define RDMA_CQE_RESPONDER_TOGGLE_BIT_SHIFT 0
52#define RDMA_CQE_RESPONDER_TYPE_MASK 0x3
53#define RDMA_CQE_RESPONDER_TYPE_SHIFT 1
54#define RDMA_CQE_RESPONDER_INV_FLG_MASK 0x1
55#define RDMA_CQE_RESPONDER_INV_FLG_SHIFT 3
56#define RDMA_CQE_RESPONDER_IMM_FLG_MASK 0x1
57#define RDMA_CQE_RESPONDER_IMM_FLG_SHIFT 4
58#define RDMA_CQE_RESPONDER_RDMA_FLG_MASK 0x1
59#define RDMA_CQE_RESPONDER_RDMA_FLG_SHIFT 5
60#define RDMA_CQE_RESPONDER_RESERVED2_MASK 0x3
61#define RDMA_CQE_RESPONDER_RESERVED2_SHIFT 6
62 u8 status;
63};
64
65struct rdma_cqe_requester {
66 __le16 sq_cons;
67 __le16 reserved0;
68 __le32 reserved1;
69 struct regpair qp_handle;
70 struct regpair reserved2;
71 __le32 reserved3;
72 __le16 reserved4;
73 u8 flags;
74#define RDMA_CQE_REQUESTER_TOGGLE_BIT_MASK 0x1
75#define RDMA_CQE_REQUESTER_TOGGLE_BIT_SHIFT 0
76#define RDMA_CQE_REQUESTER_TYPE_MASK 0x3
77#define RDMA_CQE_REQUESTER_TYPE_SHIFT 1
78#define RDMA_CQE_REQUESTER_RESERVED5_MASK 0x1F
79#define RDMA_CQE_REQUESTER_RESERVED5_SHIFT 3
80 u8 status;
81};
82
83struct rdma_cqe_common {
84 struct regpair reserved0;
85 struct regpair qp_handle;
86 __le16 reserved1[7];
87 u8 flags;
88#define RDMA_CQE_COMMON_TOGGLE_BIT_MASK 0x1
89#define RDMA_CQE_COMMON_TOGGLE_BIT_SHIFT 0
90#define RDMA_CQE_COMMON_TYPE_MASK 0x3
91#define RDMA_CQE_COMMON_TYPE_SHIFT 1
92#define RDMA_CQE_COMMON_RESERVED2_MASK 0x1F
93#define RDMA_CQE_COMMON_RESERVED2_SHIFT 3
94 u8 status;
95};
96
97/* rdma completion queue element */
98union rdma_cqe {
99 struct rdma_cqe_responder resp;
100 struct rdma_cqe_requester req;
101 struct rdma_cqe_common cmn;
102};
103
104/* * CQE requester status enumeration */
105enum rdma_cqe_requester_status_enum {
106 RDMA_CQE_REQ_STS_OK,
107 RDMA_CQE_REQ_STS_BAD_RESPONSE_ERR,
108 RDMA_CQE_REQ_STS_LOCAL_LENGTH_ERR,
109 RDMA_CQE_REQ_STS_LOCAL_QP_OPERATION_ERR,
110 RDMA_CQE_REQ_STS_LOCAL_PROTECTION_ERR,
111 RDMA_CQE_REQ_STS_MEMORY_MGT_OPERATION_ERR,
112 RDMA_CQE_REQ_STS_REMOTE_INVALID_REQUEST_ERR,
113 RDMA_CQE_REQ_STS_REMOTE_ACCESS_ERR,
114 RDMA_CQE_REQ_STS_REMOTE_OPERATION_ERR,
115 RDMA_CQE_REQ_STS_RNR_NAK_RETRY_CNT_ERR,
116 RDMA_CQE_REQ_STS_TRANSPORT_RETRY_CNT_ERR,
117 RDMA_CQE_REQ_STS_WORK_REQUEST_FLUSHED_ERR,
118 RDMA_CQE_REQ_STS_XRC_VOILATION_ERR,
119 RDMA_CQE_REQ_STS_SIG_ERR,
120 MAX_RDMA_CQE_REQUESTER_STATUS_ENUM
121};
122
123/* CQE responder status enumeration */
124enum rdma_cqe_responder_status_enum {
125 RDMA_CQE_RESP_STS_OK,
126 RDMA_CQE_RESP_STS_LOCAL_ACCESS_ERR,
127 RDMA_CQE_RESP_STS_LOCAL_LENGTH_ERR,
128 RDMA_CQE_RESP_STS_LOCAL_QP_OPERATION_ERR,
129 RDMA_CQE_RESP_STS_LOCAL_PROTECTION_ERR,
130 RDMA_CQE_RESP_STS_MEMORY_MGT_OPERATION_ERR,
131 RDMA_CQE_RESP_STS_REMOTE_INVALID_REQUEST_ERR,
132 RDMA_CQE_RESP_STS_WORK_REQUEST_FLUSHED_ERR,
133 MAX_RDMA_CQE_RESPONDER_STATUS_ENUM
134};
135
136/* CQE type enumeration */
137enum rdma_cqe_type {
138 RDMA_CQE_TYPE_REQUESTER,
139 RDMA_CQE_TYPE_RESPONDER_RQ,
140 RDMA_CQE_TYPE_RESPONDER_SRQ,
141 RDMA_CQE_TYPE_RESPONDER_XRC_SRQ,
142 RDMA_CQE_TYPE_INVALID,
143 MAX_RDMA_CQE_TYPE
144};
145
146struct rdma_sq_sge {
147 __le32 length;
148 struct regpair addr;
149 __le32 l_key;
150};
151
152struct rdma_rq_sge {
153 struct regpair addr;
154 __le32 length;
155 __le32 flags;
156#define RDMA_RQ_SGE_L_KEY_LO_MASK 0x3FFFFFF
157#define RDMA_RQ_SGE_L_KEY_LO_SHIFT 0
158#define RDMA_RQ_SGE_NUM_SGES_MASK 0x7
159#define RDMA_RQ_SGE_NUM_SGES_SHIFT 26
160#define RDMA_RQ_SGE_L_KEY_HI_MASK 0x7
161#define RDMA_RQ_SGE_L_KEY_HI_SHIFT 29
162};
163
164struct rdma_srq_wqe_header {
165 struct regpair wr_id;
166 u8 num_sges /* number of SGEs in WQE */;
167 u8 reserved2[7];
168};
169
170struct rdma_srq_sge {
171 struct regpair addr;
172 __le32 length;
173 __le32 l_key;
174};
175
176union rdma_srq_elm {
177 struct rdma_srq_wqe_header header;
178 struct rdma_srq_sge sge;
179};
180
181/* Rdma doorbell data for flags update */
182struct rdma_pwm_flags_data {
183 __le16 icid; /* internal CID */
184 u8 agg_flags; /* aggregative flags */
185 u8 reserved;
186};
187
188/* Rdma doorbell data for SQ and RQ */
189struct rdma_pwm_val16_data {
190 __le16 icid;
191 __le16 value;
192};
193
194union rdma_pwm_val16_data_union {
195 struct rdma_pwm_val16_data as_struct;
196 __le32 as_dword;
197};
198
199/* Rdma doorbell data for CQ */
200struct rdma_pwm_val32_data {
201 __le16 icid;
202 u8 agg_flags;
203 u8 params;
204#define RDMA_PWM_VAL32_DATA_AGG_CMD_MASK 0x3
205#define RDMA_PWM_VAL32_DATA_AGG_CMD_SHIFT 0
206#define RDMA_PWM_VAL32_DATA_BYPASS_EN_MASK 0x1
207#define RDMA_PWM_VAL32_DATA_BYPASS_EN_SHIFT 2
208#define RDMA_PWM_VAL32_DATA_CONN_TYPE_IS_IWARP_MASK 0x1
209#define RDMA_PWM_VAL32_DATA_CONN_TYPE_IS_IWARP_SHIFT 3
210#define RDMA_PWM_VAL32_DATA_SET_16B_VAL_MASK 0x1
211#define RDMA_PWM_VAL32_DATA_SET_16B_VAL_SHIFT 4
212#define RDMA_PWM_VAL32_DATA_RESERVED_MASK 0x7
213#define RDMA_PWM_VAL32_DATA_RESERVED_SHIFT 5
214 __le32 value;
215};
216
217/* DIF Block size options */
218enum rdma_dif_block_size {
219 RDMA_DIF_BLOCK_512 = 0,
220 RDMA_DIF_BLOCK_4096 = 1,
221 MAX_RDMA_DIF_BLOCK_SIZE
222};
223
224/* DIF CRC initial value */
225enum rdma_dif_crc_seed {
226 RDMA_DIF_CRC_SEED_0000 = 0,
227 RDMA_DIF_CRC_SEED_FFFF = 1,
228 MAX_RDMA_DIF_CRC_SEED
229};
230
231/* RDMA DIF Error Result Structure */
232struct rdma_dif_error_result {
233 __le32 error_intervals;
234 __le32 dif_error_1st_interval;
235 u8 flags;
236#define RDMA_DIF_ERROR_RESULT_DIF_ERROR_TYPE_CRC_MASK 0x1
237#define RDMA_DIF_ERROR_RESULT_DIF_ERROR_TYPE_CRC_SHIFT 0
238#define RDMA_DIF_ERROR_RESULT_DIF_ERROR_TYPE_APP_TAG_MASK 0x1
239#define RDMA_DIF_ERROR_RESULT_DIF_ERROR_TYPE_APP_TAG_SHIFT 1
240#define RDMA_DIF_ERROR_RESULT_DIF_ERROR_TYPE_REF_TAG_MASK 0x1
241#define RDMA_DIF_ERROR_RESULT_DIF_ERROR_TYPE_REF_TAG_SHIFT 2
242#define RDMA_DIF_ERROR_RESULT_RESERVED0_MASK 0xF
243#define RDMA_DIF_ERROR_RESULT_RESERVED0_SHIFT 3
244#define RDMA_DIF_ERROR_RESULT_TOGGLE_BIT_MASK 0x1
245#define RDMA_DIF_ERROR_RESULT_TOGGLE_BIT_SHIFT 7
246 u8 reserved1[55];
247};
248
249/* DIF IO direction */
250enum rdma_dif_io_direction_flg {
251 RDMA_DIF_DIR_RX = 0,
252 RDMA_DIF_DIR_TX = 1,
253 MAX_RDMA_DIF_IO_DIRECTION_FLG
254};
255
256struct rdma_dif_params {
257 __le32 base_ref_tag;
258 __le16 app_tag;
259 __le16 app_tag_mask;
260 __le16 runt_crc_value;
261 __le16 flags;
262#define RDMA_DIF_PARAMS_IO_DIRECTION_FLG_MASK 0x1
263#define RDMA_DIF_PARAMS_IO_DIRECTION_FLG_SHIFT 0
264#define RDMA_DIF_PARAMS_BLOCK_SIZE_MASK 0x1
265#define RDMA_DIF_PARAMS_BLOCK_SIZE_SHIFT 1
266#define RDMA_DIF_PARAMS_RUNT_VALID_FLG_MASK 0x1
267#define RDMA_DIF_PARAMS_RUNT_VALID_FLG_SHIFT 2
268#define RDMA_DIF_PARAMS_VALIDATE_CRC_GUARD_MASK 0x1
269#define RDMA_DIF_PARAMS_VALIDATE_CRC_GUARD_SHIFT 3
270#define RDMA_DIF_PARAMS_VALIDATE_REF_TAG_MASK 0x1
271#define RDMA_DIF_PARAMS_VALIDATE_REF_TAG_SHIFT 4
272#define RDMA_DIF_PARAMS_VALIDATE_APP_TAG_MASK 0x1
273#define RDMA_DIF_PARAMS_VALIDATE_APP_TAG_SHIFT 5
274#define RDMA_DIF_PARAMS_CRC_SEED_MASK 0x1
275#define RDMA_DIF_PARAMS_CRC_SEED_SHIFT 6
276#define RDMA_DIF_PARAMS_RX_REF_TAG_CONST_MASK 0x1
277#define RDMA_DIF_PARAMS_RX_REF_TAG_CONST_SHIFT 7
278#define RDMA_DIF_PARAMS_BLOCK_GUARD_TYPE_MASK 0x1
279#define RDMA_DIF_PARAMS_BLOCK_GUARD_TYPE_SHIFT 8
280#define RDMA_DIF_PARAMS_APP_ESCAPE_MASK 0x1
281#define RDMA_DIF_PARAMS_APP_ESCAPE_SHIFT 9
282#define RDMA_DIF_PARAMS_REF_ESCAPE_MASK 0x1
283#define RDMA_DIF_PARAMS_REF_ESCAPE_SHIFT 10
284#define RDMA_DIF_PARAMS_RESERVED4_MASK 0x1F
285#define RDMA_DIF_PARAMS_RESERVED4_SHIFT 11
286 __le32 reserved5;
287};
288
289
290struct rdma_sq_atomic_wqe {
291 __le32 reserved1;
292 __le32 length;
293 __le32 xrc_srq;
294 u8 req_type;
295 u8 flags;
296#define RDMA_SQ_ATOMIC_WQE_COMP_FLG_MASK 0x1
297#define RDMA_SQ_ATOMIC_WQE_COMP_FLG_SHIFT 0
298#define RDMA_SQ_ATOMIC_WQE_RD_FENCE_FLG_MASK 0x1
299#define RDMA_SQ_ATOMIC_WQE_RD_FENCE_FLG_SHIFT 1
300#define RDMA_SQ_ATOMIC_WQE_INV_FENCE_FLG_MASK 0x1
301#define RDMA_SQ_ATOMIC_WQE_INV_FENCE_FLG_SHIFT 2
302#define RDMA_SQ_ATOMIC_WQE_SE_FLG_MASK 0x1
303#define RDMA_SQ_ATOMIC_WQE_SE_FLG_SHIFT 3
304#define RDMA_SQ_ATOMIC_WQE_INLINE_FLG_MASK 0x1
305#define RDMA_SQ_ATOMIC_WQE_INLINE_FLG_SHIFT 4
306#define RDMA_SQ_ATOMIC_WQE_DIF_ON_HOST_FLG_MASK 0x1
307#define RDMA_SQ_ATOMIC_WQE_DIF_ON_HOST_FLG_SHIFT 5
308#define RDMA_SQ_ATOMIC_WQE_RESERVED0_MASK 0x3
309#define RDMA_SQ_ATOMIC_WQE_RESERVED0_SHIFT 6
310 u8 wqe_size;
311 u8 prev_wqe_size;
312 struct regpair remote_va;
313 __le32 r_key;
314 __le32 reserved2;
315 struct regpair cmp_data;
316 struct regpair swap_data;
317};
318
319/* First element (16 bytes) of atomic wqe */
320struct rdma_sq_atomic_wqe_1st {
321 __le32 reserved1;
322 __le32 length;
323 __le32 xrc_srq;
324 u8 req_type;
325 u8 flags;
326#define RDMA_SQ_ATOMIC_WQE_1ST_COMP_FLG_MASK 0x1
327#define RDMA_SQ_ATOMIC_WQE_1ST_COMP_FLG_SHIFT 0
328#define RDMA_SQ_ATOMIC_WQE_1ST_RD_FENCE_FLG_MASK 0x1
329#define RDMA_SQ_ATOMIC_WQE_1ST_RD_FENCE_FLG_SHIFT 1
330#define RDMA_SQ_ATOMIC_WQE_1ST_INV_FENCE_FLG_MASK 0x1
331#define RDMA_SQ_ATOMIC_WQE_1ST_INV_FENCE_FLG_SHIFT 2
332#define RDMA_SQ_ATOMIC_WQE_1ST_SE_FLG_MASK 0x1
333#define RDMA_SQ_ATOMIC_WQE_1ST_SE_FLG_SHIFT 3
334#define RDMA_SQ_ATOMIC_WQE_1ST_INLINE_FLG_MASK 0x1
335#define RDMA_SQ_ATOMIC_WQE_1ST_INLINE_FLG_SHIFT 4
336#define RDMA_SQ_ATOMIC_WQE_1ST_RESERVED0_MASK 0x7
337#define RDMA_SQ_ATOMIC_WQE_1ST_RESERVED0_SHIFT 5
338 u8 wqe_size;
339 u8 prev_wqe_size;
340};
341
342/* Second element (16 bytes) of atomic wqe */
343struct rdma_sq_atomic_wqe_2nd {
344 struct regpair remote_va;
345 __le32 r_key;
346 __le32 reserved2;
347};
348
349/* Third element (16 bytes) of atomic wqe */
350struct rdma_sq_atomic_wqe_3rd {
351 struct regpair cmp_data;
352 struct regpair swap_data;
353};
354
355struct rdma_sq_bind_wqe {
356 struct regpair addr;
357 __le32 l_key;
358 u8 req_type;
359 u8 flags;
360#define RDMA_SQ_BIND_WQE_COMP_FLG_MASK 0x1
361#define RDMA_SQ_BIND_WQE_COMP_FLG_SHIFT 0
362#define RDMA_SQ_BIND_WQE_RD_FENCE_FLG_MASK 0x1
363#define RDMA_SQ_BIND_WQE_RD_FENCE_FLG_SHIFT 1
364#define RDMA_SQ_BIND_WQE_INV_FENCE_FLG_MASK 0x1
365#define RDMA_SQ_BIND_WQE_INV_FENCE_FLG_SHIFT 2
366#define RDMA_SQ_BIND_WQE_SE_FLG_MASK 0x1
367#define RDMA_SQ_BIND_WQE_SE_FLG_SHIFT 3
368#define RDMA_SQ_BIND_WQE_INLINE_FLG_MASK 0x1
369#define RDMA_SQ_BIND_WQE_INLINE_FLG_SHIFT 4
370#define RDMA_SQ_BIND_WQE_DIF_ON_HOST_FLG_MASK 0x1
371#define RDMA_SQ_BIND_WQE_DIF_ON_HOST_FLG_SHIFT 5
372#define RDMA_SQ_BIND_WQE_RESERVED0_MASK 0x3
373#define RDMA_SQ_BIND_WQE_RESERVED0_SHIFT 6
374 u8 wqe_size;
375 u8 prev_wqe_size;
376 u8 bind_ctrl;
377#define RDMA_SQ_BIND_WQE_ZERO_BASED_MASK 0x1
378#define RDMA_SQ_BIND_WQE_ZERO_BASED_SHIFT 0
379#define RDMA_SQ_BIND_WQE_RESERVED1_MASK 0x7F
380#define RDMA_SQ_BIND_WQE_RESERVED1_SHIFT 1
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;
396 __le32 length_lo;
397 __le32 parent_l_key;
398 __le32 reserved4;
399 struct rdma_dif_params dif_params;
400};
401
402/* First element (16 bytes) of bind wqe */
403struct rdma_sq_bind_wqe_1st {
404 struct regpair addr;
405 __le32 l_key;
406 u8 req_type;
407 u8 flags;
408#define RDMA_SQ_BIND_WQE_1ST_COMP_FLG_MASK 0x1
409#define RDMA_SQ_BIND_WQE_1ST_COMP_FLG_SHIFT 0
410#define RDMA_SQ_BIND_WQE_1ST_RD_FENCE_FLG_MASK 0x1
411#define RDMA_SQ_BIND_WQE_1ST_RD_FENCE_FLG_SHIFT 1
412#define RDMA_SQ_BIND_WQE_1ST_INV_FENCE_FLG_MASK 0x1
413#define RDMA_SQ_BIND_WQE_1ST_INV_FENCE_FLG_SHIFT 2
414#define RDMA_SQ_BIND_WQE_1ST_SE_FLG_MASK 0x1
415#define RDMA_SQ_BIND_WQE_1ST_SE_FLG_SHIFT 3
416#define RDMA_SQ_BIND_WQE_1ST_INLINE_FLG_MASK 0x1
417#define RDMA_SQ_BIND_WQE_1ST_INLINE_FLG_SHIFT 4
418#define RDMA_SQ_BIND_WQE_1ST_RESERVED0_MASK 0x7
419#define RDMA_SQ_BIND_WQE_1ST_RESERVED0_SHIFT 5
420 u8 wqe_size;
421 u8 prev_wqe_size;
422};
423
424/* Second element (16 bytes) of bind wqe */
425struct rdma_sq_bind_wqe_2nd {
426 u8 bind_ctrl;
427#define RDMA_SQ_BIND_WQE_2ND_ZERO_BASED_MASK 0x1
428#define RDMA_SQ_BIND_WQE_2ND_ZERO_BASED_SHIFT 0
429#define RDMA_SQ_BIND_WQE_2ND_RESERVED1_MASK 0x7F
430#define RDMA_SQ_BIND_WQE_2ND_RESERVED1_SHIFT 1
431 u8 access_ctrl;
432#define RDMA_SQ_BIND_WQE_2ND_REMOTE_READ_MASK 0x1
433#define RDMA_SQ_BIND_WQE_2ND_REMOTE_READ_SHIFT 0
434#define RDMA_SQ_BIND_WQE_2ND_REMOTE_WRITE_MASK 0x1
435#define RDMA_SQ_BIND_WQE_2ND_REMOTE_WRITE_SHIFT 1
436#define RDMA_SQ_BIND_WQE_2ND_ENABLE_ATOMIC_MASK 0x1
437#define RDMA_SQ_BIND_WQE_2ND_ENABLE_ATOMIC_SHIFT 2
438#define RDMA_SQ_BIND_WQE_2ND_LOCAL_READ_MASK 0x1
439#define RDMA_SQ_BIND_WQE_2ND_LOCAL_READ_SHIFT 3
440#define RDMA_SQ_BIND_WQE_2ND_LOCAL_WRITE_MASK 0x1
441#define RDMA_SQ_BIND_WQE_2ND_LOCAL_WRITE_SHIFT 4
442#define RDMA_SQ_BIND_WQE_2ND_RESERVED2_MASK 0x7
443#define RDMA_SQ_BIND_WQE_2ND_RESERVED2_SHIFT 5
444 u8 reserved3;
445 u8 length_hi;
446 __le32 length_lo;
447 __le32 parent_l_key;
448 __le32 reserved4;
449};
450
451/* Third element (16 bytes) of bind wqe */
452struct rdma_sq_bind_wqe_3rd {
453 struct rdma_dif_params dif_params;
454};
455
456/* Structure with only the SQ WQE common
457 * fields. Size is of one SQ element (16B)
458 */
459struct rdma_sq_common_wqe {
460 __le32 reserved1[3];
461 u8 req_type;
462 u8 flags;
463#define RDMA_SQ_COMMON_WQE_COMP_FLG_MASK 0x1
464#define RDMA_SQ_COMMON_WQE_COMP_FLG_SHIFT 0
465#define RDMA_SQ_COMMON_WQE_RD_FENCE_FLG_MASK 0x1
466#define RDMA_SQ_COMMON_WQE_RD_FENCE_FLG_SHIFT 1
467#define RDMA_SQ_COMMON_WQE_INV_FENCE_FLG_MASK 0x1
468#define RDMA_SQ_COMMON_WQE_INV_FENCE_FLG_SHIFT 2
469#define RDMA_SQ_COMMON_WQE_SE_FLG_MASK 0x1
470#define RDMA_SQ_COMMON_WQE_SE_FLG_SHIFT 3
471#define RDMA_SQ_COMMON_WQE_INLINE_FLG_MASK 0x1
472#define RDMA_SQ_COMMON_WQE_INLINE_FLG_SHIFT 4
473#define RDMA_SQ_COMMON_WQE_RESERVED0_MASK 0x7
474#define RDMA_SQ_COMMON_WQE_RESERVED0_SHIFT 5
475 u8 wqe_size;
476 u8 prev_wqe_size;
477};
478
479struct rdma_sq_fmr_wqe {
480 struct regpair addr;
481 __le32 l_key;
482 u8 req_type;
483 u8 flags;
484#define RDMA_SQ_FMR_WQE_COMP_FLG_MASK 0x1
485#define RDMA_SQ_FMR_WQE_COMP_FLG_SHIFT 0
486#define RDMA_SQ_FMR_WQE_RD_FENCE_FLG_MASK 0x1
487#define RDMA_SQ_FMR_WQE_RD_FENCE_FLG_SHIFT 1
488#define RDMA_SQ_FMR_WQE_INV_FENCE_FLG_MASK 0x1
489#define RDMA_SQ_FMR_WQE_INV_FENCE_FLG_SHIFT 2
490#define RDMA_SQ_FMR_WQE_SE_FLG_MASK 0x1
491#define RDMA_SQ_FMR_WQE_SE_FLG_SHIFT 3
492#define RDMA_SQ_FMR_WQE_INLINE_FLG_MASK 0x1
493#define RDMA_SQ_FMR_WQE_INLINE_FLG_SHIFT 4
494#define RDMA_SQ_FMR_WQE_DIF_ON_HOST_FLG_MASK 0x1
495#define RDMA_SQ_FMR_WQE_DIF_ON_HOST_FLG_SHIFT 5
496#define RDMA_SQ_FMR_WQE_RESERVED0_MASK 0x3
497#define RDMA_SQ_FMR_WQE_RESERVED0_SHIFT 6
498 u8 wqe_size;
499 u8 prev_wqe_size;
500 u8 fmr_ctrl;
501#define RDMA_SQ_FMR_WQE_PAGE_SIZE_LOG_MASK 0x1F
502#define RDMA_SQ_FMR_WQE_PAGE_SIZE_LOG_SHIFT 0
503#define RDMA_SQ_FMR_WQE_ZERO_BASED_MASK 0x1
504#define RDMA_SQ_FMR_WQE_ZERO_BASED_SHIFT 5
505#define RDMA_SQ_FMR_WQE_BIND_EN_MASK 0x1
506#define RDMA_SQ_FMR_WQE_BIND_EN_SHIFT 6
507#define RDMA_SQ_FMR_WQE_RESERVED1_MASK 0x1
508#define RDMA_SQ_FMR_WQE_RESERVED1_SHIFT 7
509 u8 access_ctrl;
510#define RDMA_SQ_FMR_WQE_REMOTE_READ_MASK 0x1
511#define RDMA_SQ_FMR_WQE_REMOTE_READ_SHIFT 0
512#define RDMA_SQ_FMR_WQE_REMOTE_WRITE_MASK 0x1
513#define RDMA_SQ_FMR_WQE_REMOTE_WRITE_SHIFT 1
514#define RDMA_SQ_FMR_WQE_ENABLE_ATOMIC_MASK 0x1
515#define RDMA_SQ_FMR_WQE_ENABLE_ATOMIC_SHIFT 2
516#define RDMA_SQ_FMR_WQE_LOCAL_READ_MASK 0x1
517#define RDMA_SQ_FMR_WQE_LOCAL_READ_SHIFT 3
518#define RDMA_SQ_FMR_WQE_LOCAL_WRITE_MASK 0x1
519#define RDMA_SQ_FMR_WQE_LOCAL_WRITE_SHIFT 4
520#define RDMA_SQ_FMR_WQE_RESERVED2_MASK 0x7
521#define RDMA_SQ_FMR_WQE_RESERVED2_SHIFT 5
522 u8 reserved3;
523 u8 length_hi;
524 __le32 length_lo;
525 struct regpair pbl_addr;
526};
527
528/* First element (16 bytes) of fmr wqe */
529struct rdma_sq_fmr_wqe_1st {
530 struct regpair addr;
531 __le32 l_key;
532 u8 req_type;
533 u8 flags;
534#define RDMA_SQ_FMR_WQE_1ST_COMP_FLG_MASK 0x1
535#define RDMA_SQ_FMR_WQE_1ST_COMP_FLG_SHIFT 0
536#define RDMA_SQ_FMR_WQE_1ST_RD_FENCE_FLG_MASK 0x1
537#define RDMA_SQ_FMR_WQE_1ST_RD_FENCE_FLG_SHIFT 1
538#define RDMA_SQ_FMR_WQE_1ST_INV_FENCE_FLG_MASK 0x1
539#define RDMA_SQ_FMR_WQE_1ST_INV_FENCE_FLG_SHIFT 2
540#define RDMA_SQ_FMR_WQE_1ST_SE_FLG_MASK 0x1
541#define RDMA_SQ_FMR_WQE_1ST_SE_FLG_SHIFT 3
542#define RDMA_SQ_FMR_WQE_1ST_INLINE_FLG_MASK 0x1
543#define RDMA_SQ_FMR_WQE_1ST_INLINE_FLG_SHIFT 4
544#define RDMA_SQ_FMR_WQE_1ST_DIF_ON_HOST_FLG_MASK 0x1
545#define RDMA_SQ_FMR_WQE_1ST_DIF_ON_HOST_FLG_SHIFT 5
546#define RDMA_SQ_FMR_WQE_1ST_RESERVED0_MASK 0x3
547#define RDMA_SQ_FMR_WQE_1ST_RESERVED0_SHIFT 6
548 u8 wqe_size;
549 u8 prev_wqe_size;
550};
551
552/* Second element (16 bytes) of fmr wqe */
553struct rdma_sq_fmr_wqe_2nd {
554 u8 fmr_ctrl;
555#define RDMA_SQ_FMR_WQE_2ND_PAGE_SIZE_LOG_MASK 0x1F
556#define RDMA_SQ_FMR_WQE_2ND_PAGE_SIZE_LOG_SHIFT 0
557#define RDMA_SQ_FMR_WQE_2ND_ZERO_BASED_MASK 0x1
558#define RDMA_SQ_FMR_WQE_2ND_ZERO_BASED_SHIFT 5
559#define RDMA_SQ_FMR_WQE_2ND_BIND_EN_MASK 0x1
560#define RDMA_SQ_FMR_WQE_2ND_BIND_EN_SHIFT 6
561#define RDMA_SQ_FMR_WQE_2ND_RESERVED1_MASK 0x1
562#define RDMA_SQ_FMR_WQE_2ND_RESERVED1_SHIFT 7
563 u8 access_ctrl;
564#define RDMA_SQ_FMR_WQE_2ND_REMOTE_READ_MASK 0x1
565#define RDMA_SQ_FMR_WQE_2ND_REMOTE_READ_SHIFT 0
566#define RDMA_SQ_FMR_WQE_2ND_REMOTE_WRITE_MASK 0x1
567#define RDMA_SQ_FMR_WQE_2ND_REMOTE_WRITE_SHIFT 1
568#define RDMA_SQ_FMR_WQE_2ND_ENABLE_ATOMIC_MASK 0x1
569#define RDMA_SQ_FMR_WQE_2ND_ENABLE_ATOMIC_SHIFT 2
570#define RDMA_SQ_FMR_WQE_2ND_LOCAL_READ_MASK 0x1
571#define RDMA_SQ_FMR_WQE_2ND_LOCAL_READ_SHIFT 3
572#define RDMA_SQ_FMR_WQE_2ND_LOCAL_WRITE_MASK 0x1
573#define RDMA_SQ_FMR_WQE_2ND_LOCAL_WRITE_SHIFT 4
574#define RDMA_SQ_FMR_WQE_2ND_RESERVED2_MASK 0x7
575#define RDMA_SQ_FMR_WQE_2ND_RESERVED2_SHIFT 5
576 u8 reserved3;
577 u8 length_hi;
578 __le32 length_lo;
579 struct regpair pbl_addr;
580};
581
582
583struct rdma_sq_local_inv_wqe {
584 struct regpair reserved;
585 __le32 inv_l_key;
586 u8 req_type;
587 u8 flags;
588#define RDMA_SQ_LOCAL_INV_WQE_COMP_FLG_MASK 0x1
589#define RDMA_SQ_LOCAL_INV_WQE_COMP_FLG_SHIFT 0
590#define RDMA_SQ_LOCAL_INV_WQE_RD_FENCE_FLG_MASK 0x1
591#define RDMA_SQ_LOCAL_INV_WQE_RD_FENCE_FLG_SHIFT 1
592#define RDMA_SQ_LOCAL_INV_WQE_INV_FENCE_FLG_MASK 0x1
593#define RDMA_SQ_LOCAL_INV_WQE_INV_FENCE_FLG_SHIFT 2
594#define RDMA_SQ_LOCAL_INV_WQE_SE_FLG_MASK 0x1
595#define RDMA_SQ_LOCAL_INV_WQE_SE_FLG_SHIFT 3
596#define RDMA_SQ_LOCAL_INV_WQE_INLINE_FLG_MASK 0x1
597#define RDMA_SQ_LOCAL_INV_WQE_INLINE_FLG_SHIFT 4
598#define RDMA_SQ_LOCAL_INV_WQE_DIF_ON_HOST_FLG_MASK 0x1
599#define RDMA_SQ_LOCAL_INV_WQE_DIF_ON_HOST_FLG_SHIFT 5
600#define RDMA_SQ_LOCAL_INV_WQE_RESERVED0_MASK 0x3
601#define RDMA_SQ_LOCAL_INV_WQE_RESERVED0_SHIFT 6
602 u8 wqe_size;
603 u8 prev_wqe_size;
604};
605
606struct rdma_sq_rdma_wqe {
607 __le32 imm_data;
608 __le32 length;
609 __le32 xrc_srq;
610 u8 req_type;
611 u8 flags;
612#define RDMA_SQ_RDMA_WQE_COMP_FLG_MASK 0x1
613#define RDMA_SQ_RDMA_WQE_COMP_FLG_SHIFT 0
614#define RDMA_SQ_RDMA_WQE_RD_FENCE_FLG_MASK 0x1
615#define RDMA_SQ_RDMA_WQE_RD_FENCE_FLG_SHIFT 1
616#define RDMA_SQ_RDMA_WQE_INV_FENCE_FLG_MASK 0x1
617#define RDMA_SQ_RDMA_WQE_INV_FENCE_FLG_SHIFT 2
618#define RDMA_SQ_RDMA_WQE_SE_FLG_MASK 0x1
619#define RDMA_SQ_RDMA_WQE_SE_FLG_SHIFT 3
620#define RDMA_SQ_RDMA_WQE_INLINE_FLG_MASK 0x1
621#define RDMA_SQ_RDMA_WQE_INLINE_FLG_SHIFT 4
622#define RDMA_SQ_RDMA_WQE_DIF_ON_HOST_FLG_MASK 0x1
623#define RDMA_SQ_RDMA_WQE_DIF_ON_HOST_FLG_SHIFT 5
624#define RDMA_SQ_RDMA_WQE_READ_INV_FLG_MASK 0x1
625#define RDMA_SQ_RDMA_WQE_READ_INV_FLG_SHIFT 6
626#define RDMA_SQ_RDMA_WQE_RESERVED1_MASK 0x1
627#define RDMA_SQ_RDMA_WQE_RESERVED1_SHIFT 7
628 u8 wqe_size;
629 u8 prev_wqe_size;
630 struct regpair remote_va;
631 __le32 r_key;
632 u8 dif_flags;
633#define RDMA_SQ_RDMA_WQE_DIF_BLOCK_SIZE_MASK 0x1
634#define RDMA_SQ_RDMA_WQE_DIF_BLOCK_SIZE_SHIFT 0
635#define RDMA_SQ_RDMA_WQE_RESERVED2_MASK 0x7F
636#define RDMA_SQ_RDMA_WQE_RESERVED2_SHIFT 1
637 u8 reserved3[3];
638};
639
640/* First element (16 bytes) of rdma wqe */
641struct rdma_sq_rdma_wqe_1st {
642 __le32 imm_data;
643 __le32 length;
644 __le32 xrc_srq;
645 u8 req_type;
646 u8 flags;
647#define RDMA_SQ_RDMA_WQE_1ST_COMP_FLG_MASK 0x1
648#define RDMA_SQ_RDMA_WQE_1ST_COMP_FLG_SHIFT 0
649#define RDMA_SQ_RDMA_WQE_1ST_RD_FENCE_FLG_MASK 0x1
650#define RDMA_SQ_RDMA_WQE_1ST_RD_FENCE_FLG_SHIFT 1
651#define RDMA_SQ_RDMA_WQE_1ST_INV_FENCE_FLG_MASK 0x1
652#define RDMA_SQ_RDMA_WQE_1ST_INV_FENCE_FLG_SHIFT 2
653#define RDMA_SQ_RDMA_WQE_1ST_SE_FLG_MASK 0x1
654#define RDMA_SQ_RDMA_WQE_1ST_SE_FLG_SHIFT 3
655#define RDMA_SQ_RDMA_WQE_1ST_INLINE_FLG_MASK 0x1
656#define RDMA_SQ_RDMA_WQE_1ST_INLINE_FLG_SHIFT 4
657#define RDMA_SQ_RDMA_WQE_1ST_DIF_ON_HOST_FLG_MASK 0x1
658#define RDMA_SQ_RDMA_WQE_1ST_DIF_ON_HOST_FLG_SHIFT 5
659#define RDMA_SQ_RDMA_WQE_1ST_READ_INV_FLG_MASK 0x1
660#define RDMA_SQ_RDMA_WQE_1ST_READ_INV_FLG_SHIFT 6
661#define RDMA_SQ_RDMA_WQE_1ST_RESERVED0_MASK 0x1
662#define RDMA_SQ_RDMA_WQE_1ST_RESERVED0_SHIFT 7
663 u8 wqe_size;
664 u8 prev_wqe_size;
665};
666
667/* Second element (16 bytes) of rdma wqe */
668struct rdma_sq_rdma_wqe_2nd {
669 struct regpair remote_va;
670 __le32 r_key;
671 u8 dif_flags;
672#define RDMA_SQ_RDMA_WQE_2ND_DIF_BLOCK_SIZE_MASK 0x1
673#define RDMA_SQ_RDMA_WQE_2ND_DIF_BLOCK_SIZE_SHIFT 0
674#define RDMA_SQ_RDMA_WQE_2ND_DIF_FIRST_SEGMENT_FLG_MASK 0x1
675#define RDMA_SQ_RDMA_WQE_2ND_DIF_FIRST_SEGMENT_FLG_SHIFT 1
676#define RDMA_SQ_RDMA_WQE_2ND_DIF_LAST_SEGMENT_FLG_MASK 0x1
677#define RDMA_SQ_RDMA_WQE_2ND_DIF_LAST_SEGMENT_FLG_SHIFT 2
678#define RDMA_SQ_RDMA_WQE_2ND_RESERVED1_MASK 0x1F
679#define RDMA_SQ_RDMA_WQE_2ND_RESERVED1_SHIFT 3
680 u8 reserved2[3];
681};
682
683/* SQ WQE req type enumeration */
684enum rdma_sq_req_type {
685 RDMA_SQ_REQ_TYPE_SEND,
686 RDMA_SQ_REQ_TYPE_SEND_WITH_IMM,
687 RDMA_SQ_REQ_TYPE_SEND_WITH_INVALIDATE,
688 RDMA_SQ_REQ_TYPE_RDMA_WR,
689 RDMA_SQ_REQ_TYPE_RDMA_WR_WITH_IMM,
690 RDMA_SQ_REQ_TYPE_RDMA_RD,
691 RDMA_SQ_REQ_TYPE_ATOMIC_CMP_AND_SWAP,
692 RDMA_SQ_REQ_TYPE_ATOMIC_ADD,
693 RDMA_SQ_REQ_TYPE_LOCAL_INVALIDATE,
694 RDMA_SQ_REQ_TYPE_FAST_MR,
695 RDMA_SQ_REQ_TYPE_BIND,
696 RDMA_SQ_REQ_TYPE_INVALID,
697 MAX_RDMA_SQ_REQ_TYPE
698};
699
700struct rdma_sq_send_wqe {
701 __le32 inv_key_or_imm_data;
702 __le32 length;
703 __le32 xrc_srq;
704 u8 req_type;
705 u8 flags;
706#define RDMA_SQ_SEND_WQE_COMP_FLG_MASK 0x1
707#define RDMA_SQ_SEND_WQE_COMP_FLG_SHIFT 0
708#define RDMA_SQ_SEND_WQE_RD_FENCE_FLG_MASK 0x1
709#define RDMA_SQ_SEND_WQE_RD_FENCE_FLG_SHIFT 1
710#define RDMA_SQ_SEND_WQE_INV_FENCE_FLG_MASK 0x1
711#define RDMA_SQ_SEND_WQE_INV_FENCE_FLG_SHIFT 2
712#define RDMA_SQ_SEND_WQE_SE_FLG_MASK 0x1
713#define RDMA_SQ_SEND_WQE_SE_FLG_SHIFT 3
714#define RDMA_SQ_SEND_WQE_INLINE_FLG_MASK 0x1
715#define RDMA_SQ_SEND_WQE_INLINE_FLG_SHIFT 4
716#define RDMA_SQ_SEND_WQE_DIF_ON_HOST_FLG_MASK 0x1
717#define RDMA_SQ_SEND_WQE_DIF_ON_HOST_FLG_SHIFT 5
718#define RDMA_SQ_SEND_WQE_RESERVED0_MASK 0x3
719#define RDMA_SQ_SEND_WQE_RESERVED0_SHIFT 6
720 u8 wqe_size;
721 u8 prev_wqe_size;
722 __le32 reserved1[4];
723};
724
725struct rdma_sq_send_wqe_1st {
726 __le32 inv_key_or_imm_data;
727 __le32 length;
728 __le32 xrc_srq;
729 u8 req_type;
730 u8 flags;
731#define RDMA_SQ_SEND_WQE_1ST_COMP_FLG_MASK 0x1
732#define RDMA_SQ_SEND_WQE_1ST_COMP_FLG_SHIFT 0
733#define RDMA_SQ_SEND_WQE_1ST_RD_FENCE_FLG_MASK 0x1
734#define RDMA_SQ_SEND_WQE_1ST_RD_FENCE_FLG_SHIFT 1
735#define RDMA_SQ_SEND_WQE_1ST_INV_FENCE_FLG_MASK 0x1
736#define RDMA_SQ_SEND_WQE_1ST_INV_FENCE_FLG_SHIFT 2
737#define RDMA_SQ_SEND_WQE_1ST_SE_FLG_MASK 0x1
738#define RDMA_SQ_SEND_WQE_1ST_SE_FLG_SHIFT 3
739#define RDMA_SQ_SEND_WQE_1ST_INLINE_FLG_MASK 0x1
740#define RDMA_SQ_SEND_WQE_1ST_INLINE_FLG_SHIFT 4
741#define RDMA_SQ_SEND_WQE_1ST_RESERVED0_MASK 0x7
742#define RDMA_SQ_SEND_WQE_1ST_RESERVED0_SHIFT 5
743 u8 wqe_size;
744 u8 prev_wqe_size;
745};
746
747struct rdma_sq_send_wqe_2st {
748 __le32 reserved1[4];
749};
750
751#endif /* __QED_HSI_RDMA__ */
752

source code of linux/drivers/infiniband/hw/qedr/qedr_hsi_rdma.h