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