xref: /freebsd/sys/dev/qlnx/qlnxr/qlnxr_roce.h (revision 911f0260390e18cf85f3dbf2c719b593efdc1e3c)
1 /*
2  * Copyright (c) 2018-2019 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 __QLNXR_ROCE_H__
32 #define __QLNXR_ROCE_H__
33 
34 /*
35  * roce completion notification queue element
36  */
37 struct roce_cnqe {
38 	struct regpair cq_handle;
39 };
40 
41 struct roce_cqe_responder {
42 	struct regpair srq_wr_id;
43 	struct regpair qp_handle;
44 	__le32 imm_data_or_inv_r_Key;
45 	__le32 length;
46 	__le32 reserved0;
47 	__le16 rq_cons;
48 	u8 flags;
49 #define ROCE_CQE_RESPONDER_TOGGLE_BIT_MASK  0x1
50 #define ROCE_CQE_RESPONDER_TOGGLE_BIT_SHIFT 0
51 #define ROCE_CQE_RESPONDER_TYPE_MASK        0x3
52 #define ROCE_CQE_RESPONDER_TYPE_SHIFT       1
53 #define ROCE_CQE_RESPONDER_INV_FLG_MASK     0x1
54 #define ROCE_CQE_RESPONDER_INV_FLG_SHIFT    3
55 #define ROCE_CQE_RESPONDER_IMM_FLG_MASK     0x1
56 #define ROCE_CQE_RESPONDER_IMM_FLG_SHIFT    4
57 #define ROCE_CQE_RESPONDER_RDMA_FLG_MASK    0x1
58 #define ROCE_CQE_RESPONDER_RDMA_FLG_SHIFT   5
59 #define ROCE_CQE_RESPONDER_RESERVED2_MASK   0x3
60 #define ROCE_CQE_RESPONDER_RESERVED2_SHIFT  6
61 	u8 status;
62 };
63 
64 struct roce_cqe_requester {
65 	__le16 sq_cons;
66 	__le16 reserved0;
67 	__le32 reserved1;
68 	struct regpair qp_handle;
69 	struct regpair reserved2;
70 	__le32 reserved3;
71 	__le16 reserved4;
72 	u8 flags;
73 #define ROCE_CQE_REQUESTER_TOGGLE_BIT_MASK  0x1
74 #define ROCE_CQE_REQUESTER_TOGGLE_BIT_SHIFT 0
75 #define ROCE_CQE_REQUESTER_TYPE_MASK        0x3
76 #define ROCE_CQE_REQUESTER_TYPE_SHIFT       1
77 #define ROCE_CQE_REQUESTER_RESERVED5_MASK   0x1F
78 #define ROCE_CQE_REQUESTER_RESERVED5_SHIFT  3
79 	u8 status;
80 };
81 
82 struct roce_cqe_common {
83 	struct regpair reserved0;
84 	struct regpair qp_handle;
85 	__le16 reserved1[7];
86 	u8 flags;
87 #define ROCE_CQE_COMMON_TOGGLE_BIT_MASK  0x1
88 #define ROCE_CQE_COMMON_TOGGLE_BIT_SHIFT 0
89 #define ROCE_CQE_COMMON_TYPE_MASK        0x3
90 #define ROCE_CQE_COMMON_TYPE_SHIFT       1
91 #define ROCE_CQE_COMMON_RESERVED2_MASK   0x1F
92 #define ROCE_CQE_COMMON_RESERVED2_SHIFT  3
93 	u8 status;
94 };
95 
96 /*
97  * roce completion queue element
98  */
99 union roce_cqe {
100 	struct roce_cqe_responder resp;
101 	struct roce_cqe_requester req;
102 	struct roce_cqe_common cmn;
103 };
104 
105 /*
106  * CQE requester status enumeration
107  */
108 enum roce_cqe_requester_status_enum {
109 	ROCE_CQE_REQ_STS_OK,
110 	ROCE_CQE_REQ_STS_BAD_RESPONSE_ERR,
111 	ROCE_CQE_REQ_STS_LOCAL_LENGTH_ERR,
112 	ROCE_CQE_REQ_STS_LOCAL_QP_OPERATION_ERR,
113 	ROCE_CQE_REQ_STS_LOCAL_PROTECTION_ERR,
114 	ROCE_CQE_REQ_STS_MEMORY_MGT_OPERATION_ERR,
115 	ROCE_CQE_REQ_STS_REMOTE_INVALID_REQUEST_ERR,
116 	ROCE_CQE_REQ_STS_REMOTE_ACCESS_ERR,
117 	ROCE_CQE_REQ_STS_REMOTE_OPERATION_ERR,
118 	ROCE_CQE_REQ_STS_RNR_NAK_RETRY_CNT_ERR,
119 	ROCE_CQE_REQ_STS_TRANSPORT_RETRY_CNT_ERR,
120 	ROCE_CQE_REQ_STS_WORK_REQUEST_FLUSHED_ERR,
121 	MAX_ROCE_CQE_REQUESTER_STATUS_ENUM
122 };
123 
124 /*
125  * CQE responder status enumeration
126  */
127 enum roce_cqe_responder_status_enum {
128 	ROCE_CQE_RESP_STS_OK,
129 	ROCE_CQE_RESP_STS_LOCAL_ACCESS_ERR,
130 	ROCE_CQE_RESP_STS_LOCAL_LENGTH_ERR,
131 	ROCE_CQE_RESP_STS_LOCAL_QP_OPERATION_ERR,
132 	ROCE_CQE_RESP_STS_LOCAL_PROTECTION_ERR,
133 	ROCE_CQE_RESP_STS_MEMORY_MGT_OPERATION_ERR,
134 	ROCE_CQE_RESP_STS_REMOTE_INVALID_REQUEST_ERR,
135 	ROCE_CQE_RESP_STS_WORK_REQUEST_FLUSHED_ERR,
136 	MAX_ROCE_CQE_RESPONDER_STATUS_ENUM
137 };
138 
139 /*
140  * CQE type enumeration
141  */
142 enum roce_cqe_type {
143 	ROCE_CQE_TYPE_REQUESTER,
144 	ROCE_CQE_TYPE_RESPONDER_RQ,
145 	ROCE_CQE_TYPE_RESPONDER_SRQ,
146 	ROCE_CQE_TYPE_INVALID,
147 	MAX_ROCE_CQE_TYPE
148 };
149 
150 /*
151  * memory window type enumeration
152  */
153 enum roce_mw_type {
154 	ROCE_MW_TYPE_1,
155 	ROCE_MW_TYPE_2A,
156 	MAX_ROCE_MW_TYPE
157 };
158 
159 struct roce_rq_sge {
160 	struct regpair addr;
161 	__le32 length;
162 	__le32 flags;
163 #define ROCE_RQ_SGE_L_KEY_MASK      0x3FFFFFF
164 #define ROCE_RQ_SGE_L_KEY_SHIFT     0
165 #define ROCE_RQ_SGE_NUM_SGES_MASK   0x7
166 #define ROCE_RQ_SGE_NUM_SGES_SHIFT  26
167 #define ROCE_RQ_SGE_RESERVED0_MASK  0x7
168 #define ROCE_RQ_SGE_RESERVED0_SHIFT 29
169 };
170 
171 struct roce_sq_atomic_wqe {
172 	struct regpair remote_va;
173 	__le32 xrc_srq;
174 	u8 req_type;
175 	u8 flags;
176 #define ROCE_SQ_ATOMIC_WQE_COMP_FLG_MASK       0x1
177 #define ROCE_SQ_ATOMIC_WQE_COMP_FLG_SHIFT      0
178 #define ROCE_SQ_ATOMIC_WQE_RD_FENCE_FLG_MASK   0x1
179 #define ROCE_SQ_ATOMIC_WQE_RD_FENCE_FLG_SHIFT  1
180 #define ROCE_SQ_ATOMIC_WQE_INV_FENCE_FLG_MASK  0x1
181 #define ROCE_SQ_ATOMIC_WQE_INV_FENCE_FLG_SHIFT 2
182 #define ROCE_SQ_ATOMIC_WQE_SE_FLG_MASK         0x1
183 #define ROCE_SQ_ATOMIC_WQE_SE_FLG_SHIFT        3
184 #define ROCE_SQ_ATOMIC_WQE_INLINE_FLG_MASK     0x1
185 #define ROCE_SQ_ATOMIC_WQE_INLINE_FLG_SHIFT    4
186 #define ROCE_SQ_ATOMIC_WQE_RESERVED0_MASK      0x7
187 #define ROCE_SQ_ATOMIC_WQE_RESERVED0_SHIFT     5
188 	u8 reserved1;
189 	u8 prev_wqe_size;
190 	struct regpair swap_data;
191 	__le32 r_key;
192 	__le32 reserved2;
193 	struct regpair cmp_data;
194 	struct regpair reserved3;
195 };
196 
197 /*
198  * First element (16 bytes) of atomic wqe
199  */
200 struct roce_sq_atomic_wqe_1st {
201 	struct regpair remote_va;
202 	__le32 xrc_srq;
203 	u8 req_type;
204 	u8 flags;
205 #define ROCE_SQ_ATOMIC_WQE_1ST_COMP_FLG_MASK       0x1
206 #define ROCE_SQ_ATOMIC_WQE_1ST_COMP_FLG_SHIFT      0
207 #define ROCE_SQ_ATOMIC_WQE_1ST_RD_FENCE_FLG_MASK   0x1
208 #define ROCE_SQ_ATOMIC_WQE_1ST_RD_FENCE_FLG_SHIFT  1
209 #define ROCE_SQ_ATOMIC_WQE_1ST_INV_FENCE_FLG_MASK  0x1
210 #define ROCE_SQ_ATOMIC_WQE_1ST_INV_FENCE_FLG_SHIFT 2
211 #define ROCE_SQ_ATOMIC_WQE_1ST_SE_FLG_MASK         0x1
212 #define ROCE_SQ_ATOMIC_WQE_1ST_SE_FLG_SHIFT        3
213 #define ROCE_SQ_ATOMIC_WQE_1ST_INLINE_FLG_MASK     0x1
214 #define ROCE_SQ_ATOMIC_WQE_1ST_INLINE_FLG_SHIFT    4
215 #define ROCE_SQ_ATOMIC_WQE_1ST_RESERVED0_MASK      0x7
216 #define ROCE_SQ_ATOMIC_WQE_1ST_RESERVED0_SHIFT     5
217 	u8 reserved1;
218 	u8 prev_wqe_size;
219 };
220 
221 /*
222  * Second element (16 bytes) of atomic wqe
223  */
224 struct roce_sq_atomic_wqe_2nd {
225 	struct regpair swap_data;
226 	__le32 r_key;
227 	__le32 reserved2;
228 };
229 
230 /*
231  * Third element (16 bytes) of atomic wqe
232  */
233 struct roce_sq_atomic_wqe_3rd {
234 	struct regpair cmp_data;
235 	struct regpair reserved3;
236 };
237 
238 struct roce_sq_bind_wqe {
239 	struct regpair addr;
240 	__le32 l_key;
241 	u8 req_type;
242 	u8 flags;
243 #define ROCE_SQ_BIND_WQE_COMP_FLG_MASK       0x1
244 #define ROCE_SQ_BIND_WQE_COMP_FLG_SHIFT      0
245 #define ROCE_SQ_BIND_WQE_RD_FENCE_FLG_MASK   0x1
246 #define ROCE_SQ_BIND_WQE_RD_FENCE_FLG_SHIFT  1
247 #define ROCE_SQ_BIND_WQE_INV_FENCE_FLG_MASK  0x1
248 #define ROCE_SQ_BIND_WQE_INV_FENCE_FLG_SHIFT 2
249 #define ROCE_SQ_BIND_WQE_SE_FLG_MASK         0x1
250 #define ROCE_SQ_BIND_WQE_SE_FLG_SHIFT        3
251 #define ROCE_SQ_BIND_WQE_INLINE_FLG_MASK     0x1
252 #define ROCE_SQ_BIND_WQE_INLINE_FLG_SHIFT    4
253 #define ROCE_SQ_BIND_WQE_RESERVED0_MASK      0x7
254 #define ROCE_SQ_BIND_WQE_RESERVED0_SHIFT     5
255 	u8 access_ctrl;
256 #define ROCE_SQ_BIND_WQE_REMOTE_READ_MASK    0x1
257 #define ROCE_SQ_BIND_WQE_REMOTE_READ_SHIFT   0
258 #define ROCE_SQ_BIND_WQE_REMOTE_WRITE_MASK   0x1
259 #define ROCE_SQ_BIND_WQE_REMOTE_WRITE_SHIFT  1
260 #define ROCE_SQ_BIND_WQE_ENABLE_ATOMIC_MASK  0x1
261 #define ROCE_SQ_BIND_WQE_ENABLE_ATOMIC_SHIFT 2
262 #define ROCE_SQ_BIND_WQE_LOCAL_READ_MASK     0x1
263 #define ROCE_SQ_BIND_WQE_LOCAL_READ_SHIFT    3
264 #define ROCE_SQ_BIND_WQE_LOCAL_WRITE_MASK    0x1
265 #define ROCE_SQ_BIND_WQE_LOCAL_WRITE_SHIFT   4
266 #define ROCE_SQ_BIND_WQE_RESERVED1_MASK      0x7
267 #define ROCE_SQ_BIND_WQE_RESERVED1_SHIFT     5
268 	u8 prev_wqe_size;
269 	u8 bind_ctrl;
270 #define ROCE_SQ_BIND_WQE_ZERO_BASED_MASK     0x1
271 #define ROCE_SQ_BIND_WQE_ZERO_BASED_SHIFT    0
272 #define ROCE_SQ_BIND_WQE_MW_TYPE_MASK        0x1
273 #define ROCE_SQ_BIND_WQE_MW_TYPE_SHIFT       1
274 #define ROCE_SQ_BIND_WQE_RESERVED2_MASK      0x3F
275 #define ROCE_SQ_BIND_WQE_RESERVED2_SHIFT     2
276 	u8 reserved3[2];
277 	u8 length_hi;
278 	__le32 length_lo;
279 	__le32 parent_l_key;
280 	__le32 reserved6;
281 };
282 
283 /*
284  * First element (16 bytes) of bind wqe
285  */
286 struct roce_sq_bind_wqe_1st {
287 	struct regpair addr;
288 	__le32 l_key;
289 	u8 req_type;
290 	u8 flags;
291 #define ROCE_SQ_BIND_WQE_1ST_COMP_FLG_MASK       0x1
292 #define ROCE_SQ_BIND_WQE_1ST_COMP_FLG_SHIFT      0
293 #define ROCE_SQ_BIND_WQE_1ST_RD_FENCE_FLG_MASK   0x1
294 #define ROCE_SQ_BIND_WQE_1ST_RD_FENCE_FLG_SHIFT  1
295 #define ROCE_SQ_BIND_WQE_1ST_INV_FENCE_FLG_MASK  0x1
296 #define ROCE_SQ_BIND_WQE_1ST_INV_FENCE_FLG_SHIFT 2
297 #define ROCE_SQ_BIND_WQE_1ST_SE_FLG_MASK         0x1
298 #define ROCE_SQ_BIND_WQE_1ST_SE_FLG_SHIFT        3
299 #define ROCE_SQ_BIND_WQE_1ST_INLINE_FLG_MASK     0x1
300 #define ROCE_SQ_BIND_WQE_1ST_INLINE_FLG_SHIFT    4
301 #define ROCE_SQ_BIND_WQE_1ST_RESERVED0_MASK      0x7
302 #define ROCE_SQ_BIND_WQE_1ST_RESERVED0_SHIFT     5
303 	u8 access_ctrl;
304 #define ROCE_SQ_BIND_WQE_1ST_REMOTE_READ_MASK    0x1
305 #define ROCE_SQ_BIND_WQE_1ST_REMOTE_READ_SHIFT   0
306 #define ROCE_SQ_BIND_WQE_1ST_REMOTE_WRITE_MASK   0x1
307 #define ROCE_SQ_BIND_WQE_1ST_REMOTE_WRITE_SHIFT  1
308 #define ROCE_SQ_BIND_WQE_1ST_ENABLE_ATOMIC_MASK  0x1
309 #define ROCE_SQ_BIND_WQE_1ST_ENABLE_ATOMIC_SHIFT 2
310 #define ROCE_SQ_BIND_WQE_1ST_LOCAL_READ_MASK     0x1
311 #define ROCE_SQ_BIND_WQE_1ST_LOCAL_READ_SHIFT    3
312 #define ROCE_SQ_BIND_WQE_1ST_LOCAL_WRITE_MASK    0x1
313 #define ROCE_SQ_BIND_WQE_1ST_LOCAL_WRITE_SHIFT   4
314 #define ROCE_SQ_BIND_WQE_1ST_RESERVED1_MASK      0x7
315 #define ROCE_SQ_BIND_WQE_1ST_RESERVED1_SHIFT     5
316 	u8 prev_wqe_size;
317 };
318 
319 /*
320  * Second element (16 bytes) of bind wqe
321  */
322 struct roce_sq_bind_wqe_2nd {
323 	u8 bind_ctrl;
324 #define ROCE_SQ_BIND_WQE_2ND_ZERO_BASED_MASK  0x1
325 #define ROCE_SQ_BIND_WQE_2ND_ZERO_BASED_SHIFT 0
326 #define ROCE_SQ_BIND_WQE_2ND_MW_TYPE_MASK     0x1
327 #define ROCE_SQ_BIND_WQE_2ND_MW_TYPE_SHIFT    1
328 #define ROCE_SQ_BIND_WQE_2ND_RESERVED2_MASK   0x3F
329 #define ROCE_SQ_BIND_WQE_2ND_RESERVED2_SHIFT  2
330 	u8 reserved3[2];
331 	u8 length_hi;
332 	__le32 length_lo;
333 	__le32 parent_l_key;
334 	__le32 reserved6;
335 };
336 
337 /*
338  * Structure with only the SQ WQE common fields. Size is of one SQ element (16B)
339  */
340 struct roce_sq_common_wqe {
341 	__le32 reserved1[3];
342 	u8 req_type;
343 	u8 flags;
344 #define ROCE_SQ_COMMON_WQE_COMP_FLG_MASK       0x1
345 #define ROCE_SQ_COMMON_WQE_COMP_FLG_SHIFT      0
346 #define ROCE_SQ_COMMON_WQE_RD_FENCE_FLG_MASK   0x1
347 #define ROCE_SQ_COMMON_WQE_RD_FENCE_FLG_SHIFT  1
348 #define ROCE_SQ_COMMON_WQE_INV_FENCE_FLG_MASK  0x1
349 #define ROCE_SQ_COMMON_WQE_INV_FENCE_FLG_SHIFT 2
350 #define ROCE_SQ_COMMON_WQE_SE_FLG_MASK         0x1
351 #define ROCE_SQ_COMMON_WQE_SE_FLG_SHIFT        3
352 #define ROCE_SQ_COMMON_WQE_INLINE_FLG_MASK     0x1
353 #define ROCE_SQ_COMMON_WQE_INLINE_FLG_SHIFT    4
354 #define ROCE_SQ_COMMON_WQE_RESERVED0_MASK      0x7
355 #define ROCE_SQ_COMMON_WQE_RESERVED0_SHIFT     5
356 	u8 reserved2;
357 	u8 prev_wqe_size;
358 };
359 
360 struct roce_sq_fmr_wqe {
361 	struct regpair addr;
362 	__le32 l_key;
363 	u8 req_type;
364 	u8 flags;
365 #define ROCE_SQ_FMR_WQE_COMP_FLG_MASK       0x1
366 #define ROCE_SQ_FMR_WQE_COMP_FLG_SHIFT      0
367 #define ROCE_SQ_FMR_WQE_RD_FENCE_FLG_MASK   0x1
368 #define ROCE_SQ_FMR_WQE_RD_FENCE_FLG_SHIFT  1
369 #define ROCE_SQ_FMR_WQE_INV_FENCE_FLG_MASK  0x1
370 #define ROCE_SQ_FMR_WQE_INV_FENCE_FLG_SHIFT 2
371 #define ROCE_SQ_FMR_WQE_SE_FLG_MASK         0x1
372 #define ROCE_SQ_FMR_WQE_SE_FLG_SHIFT        3
373 #define ROCE_SQ_FMR_WQE_INLINE_FLG_MASK     0x1
374 #define ROCE_SQ_FMR_WQE_INLINE_FLG_SHIFT    4
375 #define ROCE_SQ_FMR_WQE_RESERVED0_MASK      0x7
376 #define ROCE_SQ_FMR_WQE_RESERVED0_SHIFT     5
377 	u8 access_ctrl;
378 #define ROCE_SQ_FMR_WQE_REMOTE_READ_MASK    0x1
379 #define ROCE_SQ_FMR_WQE_REMOTE_READ_SHIFT   0
380 #define ROCE_SQ_FMR_WQE_REMOTE_WRITE_MASK   0x1
381 #define ROCE_SQ_FMR_WQE_REMOTE_WRITE_SHIFT  1
382 #define ROCE_SQ_FMR_WQE_ENABLE_ATOMIC_MASK  0x1
383 #define ROCE_SQ_FMR_WQE_ENABLE_ATOMIC_SHIFT 2
384 #define ROCE_SQ_FMR_WQE_LOCAL_READ_MASK     0x1
385 #define ROCE_SQ_FMR_WQE_LOCAL_READ_SHIFT    3
386 #define ROCE_SQ_FMR_WQE_LOCAL_WRITE_MASK    0x1
387 #define ROCE_SQ_FMR_WQE_LOCAL_WRITE_SHIFT   4
388 #define ROCE_SQ_FMR_WQE_RESERVED1_MASK      0x7
389 #define ROCE_SQ_FMR_WQE_RESERVED1_SHIFT     5
390 	u8 prev_wqe_size;
391 	u8 fmr_ctrl;
392 #define ROCE_SQ_FMR_WQE_PAGE_SIZE_LOG_MASK  0x1F
393 #define ROCE_SQ_FMR_WQE_PAGE_SIZE_LOG_SHIFT 0
394 #define ROCE_SQ_FMR_WQE_ZERO_BASED_MASK     0x1
395 #define ROCE_SQ_FMR_WQE_ZERO_BASED_SHIFT    5
396 #define ROCE_SQ_FMR_WQE_BIND_EN_MASK        0x1
397 #define ROCE_SQ_FMR_WQE_BIND_EN_SHIFT       6
398 #define ROCE_SQ_FMR_WQE_RESERVED2_MASK      0x1
399 #define ROCE_SQ_FMR_WQE_RESERVED2_SHIFT     7
400 	u8 reserved3[2];
401 	u8 length_hi;
402 	__le32 length_lo;
403 	struct regpair pbl_addr;
404 };
405 
406 /*
407  * First element (16 bytes) of fmr wqe
408  */
409 struct roce_sq_fmr_wqe_1st {
410 	struct regpair addr;
411 	__le32 l_key;
412 	u8 req_type;
413 	u8 flags;
414 #define ROCE_SQ_FMR_WQE_1ST_COMP_FLG_MASK       0x1
415 #define ROCE_SQ_FMR_WQE_1ST_COMP_FLG_SHIFT      0
416 #define ROCE_SQ_FMR_WQE_1ST_RD_FENCE_FLG_MASK   0x1
417 #define ROCE_SQ_FMR_WQE_1ST_RD_FENCE_FLG_SHIFT  1
418 #define ROCE_SQ_FMR_WQE_1ST_INV_FENCE_FLG_MASK  0x1
419 #define ROCE_SQ_FMR_WQE_1ST_INV_FENCE_FLG_SHIFT 2
420 #define ROCE_SQ_FMR_WQE_1ST_SE_FLG_MASK         0x1
421 #define ROCE_SQ_FMR_WQE_1ST_SE_FLG_SHIFT        3
422 #define ROCE_SQ_FMR_WQE_1ST_INLINE_FLG_MASK     0x1
423 #define ROCE_SQ_FMR_WQE_1ST_INLINE_FLG_SHIFT    4
424 #define ROCE_SQ_FMR_WQE_1ST_RESERVED0_MASK      0x7
425 #define ROCE_SQ_FMR_WQE_1ST_RESERVED0_SHIFT     5
426 	u8 access_ctrl;
427 #define ROCE_SQ_FMR_WQE_1ST_REMOTE_READ_MASK    0x1
428 #define ROCE_SQ_FMR_WQE_1ST_REMOTE_READ_SHIFT   0
429 #define ROCE_SQ_FMR_WQE_1ST_REMOTE_WRITE_MASK   0x1
430 #define ROCE_SQ_FMR_WQE_1ST_REMOTE_WRITE_SHIFT  1
431 #define ROCE_SQ_FMR_WQE_1ST_ENABLE_ATOMIC_MASK  0x1
432 #define ROCE_SQ_FMR_WQE_1ST_ENABLE_ATOMIC_SHIFT 2
433 #define ROCE_SQ_FMR_WQE_1ST_LOCAL_READ_MASK     0x1
434 #define ROCE_SQ_FMR_WQE_1ST_LOCAL_READ_SHIFT    3
435 #define ROCE_SQ_FMR_WQE_1ST_LOCAL_WRITE_MASK    0x1
436 #define ROCE_SQ_FMR_WQE_1ST_LOCAL_WRITE_SHIFT   4
437 #define ROCE_SQ_FMR_WQE_1ST_RESERVED1_MASK      0x7
438 #define ROCE_SQ_FMR_WQE_1ST_RESERVED1_SHIFT     5
439 	u8 prev_wqe_size;
440 };
441 
442 /*
443  * Second element (16 bytes) of fmr wqe
444  */
445 struct roce_sq_fmr_wqe_2nd {
446 	u8 fmr_ctrl;
447 #define ROCE_SQ_FMR_WQE_2ND_PAGE_SIZE_LOG_MASK  0x1F
448 #define ROCE_SQ_FMR_WQE_2ND_PAGE_SIZE_LOG_SHIFT 0
449 #define ROCE_SQ_FMR_WQE_2ND_ZERO_BASED_MASK     0x1
450 #define ROCE_SQ_FMR_WQE_2ND_ZERO_BASED_SHIFT    5
451 #define ROCE_SQ_FMR_WQE_2ND_BIND_EN_MASK        0x1
452 #define ROCE_SQ_FMR_WQE_2ND_BIND_EN_SHIFT       6
453 #define ROCE_SQ_FMR_WQE_2ND_RESERVED2_MASK      0x1
454 #define ROCE_SQ_FMR_WQE_2ND_RESERVED2_SHIFT     7
455 	u8 reserved3[2];
456 	u8 length_hi;
457 	__le32 length_lo;
458 	struct regpair pbl_addr;
459 };
460 
461 struct roce_sq_local_inv_wqe {
462 	struct regpair reserved;
463 	__le32 inv_l_key;
464 	u8 req_type;
465 	u8 flags;
466 #define ROCE_SQ_LOCAL_INV_WQE_COMP_FLG_MASK       0x1
467 #define ROCE_SQ_LOCAL_INV_WQE_COMP_FLG_SHIFT      0
468 #define ROCE_SQ_LOCAL_INV_WQE_RD_FENCE_FLG_MASK   0x1
469 #define ROCE_SQ_LOCAL_INV_WQE_RD_FENCE_FLG_SHIFT  1
470 #define ROCE_SQ_LOCAL_INV_WQE_INV_FENCE_FLG_MASK  0x1
471 #define ROCE_SQ_LOCAL_INV_WQE_INV_FENCE_FLG_SHIFT 2
472 #define ROCE_SQ_LOCAL_INV_WQE_SE_FLG_MASK         0x1
473 #define ROCE_SQ_LOCAL_INV_WQE_SE_FLG_SHIFT        3
474 #define ROCE_SQ_LOCAL_INV_WQE_INLINE_FLG_MASK     0x1
475 #define ROCE_SQ_LOCAL_INV_WQE_INLINE_FLG_SHIFT    4
476 #define ROCE_SQ_LOCAL_INV_WQE_RESERVED0_MASK      0x7
477 #define ROCE_SQ_LOCAL_INV_WQE_RESERVED0_SHIFT     5
478 	u8 reserved1;
479 	u8 prev_wqe_size;
480 };
481 
482 struct roce_sq_rdma_wqe {
483 	__le32 imm_data;
484 	__le32 length;
485 	__le32 xrc_srq;
486 	u8 req_type;
487 	u8 flags;
488 #define ROCE_SQ_RDMA_WQE_COMP_FLG_MASK       0x1
489 #define ROCE_SQ_RDMA_WQE_COMP_FLG_SHIFT      0
490 #define ROCE_SQ_RDMA_WQE_RD_FENCE_FLG_MASK   0x1
491 #define ROCE_SQ_RDMA_WQE_RD_FENCE_FLG_SHIFT  1
492 #define ROCE_SQ_RDMA_WQE_INV_FENCE_FLG_MASK  0x1
493 #define ROCE_SQ_RDMA_WQE_INV_FENCE_FLG_SHIFT 2
494 #define ROCE_SQ_RDMA_WQE_SE_FLG_MASK         0x1
495 #define ROCE_SQ_RDMA_WQE_SE_FLG_SHIFT        3
496 #define ROCE_SQ_RDMA_WQE_INLINE_FLG_MASK     0x1
497 #define ROCE_SQ_RDMA_WQE_INLINE_FLG_SHIFT    4
498 #define ROCE_SQ_RDMA_WQE_RESERVED0_MASK      0x7
499 #define ROCE_SQ_RDMA_WQE_RESERVED0_SHIFT     5
500 	u8 wqe_size;
501 	u8 prev_wqe_size;
502 	struct regpair remote_va;
503 	__le32 r_key;
504 	__le32 reserved1;
505 };
506 
507 /*
508  * First element (16 bytes) of rdma wqe
509  */
510 struct roce_sq_rdma_wqe_1st {
511 	__le32 imm_data;
512 	__le32 length;
513 	__le32 xrc_srq;
514 	u8 req_type;
515 	u8 flags;
516 #define ROCE_SQ_RDMA_WQE_1ST_COMP_FLG_MASK       0x1
517 #define ROCE_SQ_RDMA_WQE_1ST_COMP_FLG_SHIFT      0
518 #define ROCE_SQ_RDMA_WQE_1ST_RD_FENCE_FLG_MASK   0x1
519 #define ROCE_SQ_RDMA_WQE_1ST_RD_FENCE_FLG_SHIFT  1
520 #define ROCE_SQ_RDMA_WQE_1ST_INV_FENCE_FLG_MASK  0x1
521 #define ROCE_SQ_RDMA_WQE_1ST_INV_FENCE_FLG_SHIFT 2
522 #define ROCE_SQ_RDMA_WQE_1ST_SE_FLG_MASK         0x1
523 #define ROCE_SQ_RDMA_WQE_1ST_SE_FLG_SHIFT        3
524 #define ROCE_SQ_RDMA_WQE_1ST_INLINE_FLG_MASK     0x1
525 #define ROCE_SQ_RDMA_WQE_1ST_INLINE_FLG_SHIFT    4
526 #define ROCE_SQ_RDMA_WQE_1ST_RESERVED0_MASK      0x7
527 #define ROCE_SQ_RDMA_WQE_1ST_RESERVED0_SHIFT     5
528 	u8 wqe_size;
529 	u8 prev_wqe_size;
530 };
531 
532 /*
533  * Second element (16 bytes) of rdma wqe
534  */
535 struct roce_sq_rdma_wqe_2nd {
536 	struct regpair remote_va;
537 	__le32 r_key;
538 	__le32 reserved1;
539 };
540 
541 /*
542  * SQ WQE req type enumeration
543  */
544 enum roce_sq_req_type {
545 	ROCE_SQ_REQ_TYPE_SEND,
546 	ROCE_SQ_REQ_TYPE_SEND_WITH_IMM,
547 	ROCE_SQ_REQ_TYPE_SEND_WITH_INVALIDATE,
548 	ROCE_SQ_REQ_TYPE_RDMA_WR,
549 	ROCE_SQ_REQ_TYPE_RDMA_WR_WITH_IMM,
550 	ROCE_SQ_REQ_TYPE_RDMA_RD,
551 	ROCE_SQ_REQ_TYPE_ATOMIC_CMP_AND_SWAP,
552 	ROCE_SQ_REQ_TYPE_ATOMIC_ADD,
553 	ROCE_SQ_REQ_TYPE_LOCAL_INVALIDATE,
554 	ROCE_SQ_REQ_TYPE_FAST_MR,
555 	ROCE_SQ_REQ_TYPE_BIND,
556 	ROCE_SQ_REQ_TYPE_INVALID,
557 	MAX_ROCE_SQ_REQ_TYPE
558 };
559 
560 struct roce_sq_send_wqe {
561 	__le32 inv_key_or_imm_data;
562 	__le32 length;
563 	__le32 xrc_srq;
564 	u8 req_type;
565 	u8 flags;
566 #define ROCE_SQ_SEND_WQE_COMP_FLG_MASK       0x1
567 #define ROCE_SQ_SEND_WQE_COMP_FLG_SHIFT      0
568 #define ROCE_SQ_SEND_WQE_RD_FENCE_FLG_MASK   0x1
569 #define ROCE_SQ_SEND_WQE_RD_FENCE_FLG_SHIFT  1
570 #define ROCE_SQ_SEND_WQE_INV_FENCE_FLG_MASK  0x1
571 #define ROCE_SQ_SEND_WQE_INV_FENCE_FLG_SHIFT 2
572 #define ROCE_SQ_SEND_WQE_SE_FLG_MASK         0x1
573 #define ROCE_SQ_SEND_WQE_SE_FLG_SHIFT        3
574 #define ROCE_SQ_SEND_WQE_INLINE_FLG_MASK     0x1
575 #define ROCE_SQ_SEND_WQE_INLINE_FLG_SHIFT    4
576 #define ROCE_SQ_SEND_WQE_RESERVED0_MASK      0x7
577 #define ROCE_SQ_SEND_WQE_RESERVED0_SHIFT     5
578 	u8 wqe_size;
579 	u8 prev_wqe_size;
580 };
581 
582 struct roce_sq_sge {
583 	__le32 length;
584 	struct regpair addr;
585 	__le32 l_key;
586 };
587 
588 struct roce_srq_prod {
589 	__le16 prod;
590 };
591 
592 struct roce_srq_sge {
593 	struct regpair addr;
594 	__le32 length;
595 	__le32 l_key;
596 	struct regpair wr_id;
597 	u8 flags;
598 #define ROCE_SRQ_SGE_NUM_SGES_MASK   0x3
599 #define ROCE_SRQ_SGE_NUM_SGES_SHIFT  0
600 #define ROCE_SRQ_SGE_RESERVED0_MASK  0x3F
601 #define ROCE_SRQ_SGE_RESERVED0_SHIFT 2
602 	u8 reserved1;
603 	__le16 reserved2;
604 	__le32 reserved3;
605 };
606 
607 /*
608  * RoCE doorbell data for SQ and RQ
609  */
610 struct roce_pwm_val16_data {
611 	__le16 icid;
612 	__le16 prod_val;
613 };
614 
615 union roce_pwm_val16_data_union {
616 	struct roce_pwm_val16_data as_struct;
617 	__le32 as_dword;
618 };
619 
620 /*
621  * RoCE doorbell data for CQ
622  */
623 struct roce_pwm_val32_data {
624 	__le16 icid;
625 	u8 agg_flags;
626 	u8 params;
627 #define ROCE_PWM_VAL32_DATA_AGG_CMD_MASK    0x3
628 #define ROCE_PWM_VAL32_DATA_AGG_CMD_SHIFT   0
629 #define ROCE_PWM_VAL32_DATA_BYPASS_EN_MASK  0x1
630 #define ROCE_PWM_VAL32_DATA_BYPASS_EN_SHIFT 2
631 #define ROCE_PWM_VAL32_DATA_RESERVED_MASK   0x1F
632 #define ROCE_PWM_VAL32_DATA_RESERVED_SHIFT  3
633 	__le32 cq_cons_val;
634 };
635 
636 union roce_pwm_val32_data_union {
637 	struct roce_pwm_val32_data as_struct;
638 	struct regpair as_repair;
639 };
640 
641 #endif /* __QLNXR_ROCE_H__ */
642