Back to home page

OSCL-LXR

 
 

    


0001 /* QLogic qedr NIC Driver
0002  * Copyright (c) 2015-2016  QLogic Corporation
0003  *
0004  * This software is available to you under a choice of one of two
0005  * licenses.  You may choose to be licensed under the terms of the GNU
0006  * General Public License (GPL) Version 2, available from the file
0007  * COPYING in the main directory of this source tree, or the
0008  * OpenIB.org BSD license below:
0009  *
0010  *     Redistribution and use in source and binary forms, with or
0011  *     without modification, are permitted provided that the following
0012  *     conditions are met:
0013  *
0014  *      - Redistributions of source code must retain the above
0015  *        copyright notice, this list of conditions and the following
0016  *        disclaimer.
0017  *
0018  *      - Redistributions in binary form must reproduce the above
0019  *        copyright notice, this list of conditions and the following
0020  *        disclaimer in the documentation and /or other materials
0021  *        provided with the distribution.
0022  *
0023  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
0024  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
0025  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
0026  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
0027  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
0028  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
0029  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
0030  * SOFTWARE.
0031  */
0032 #ifndef __QED_HSI_RDMA__
0033 #define __QED_HSI_RDMA__
0034 
0035 #include <linux/qed/rdma_common.h>
0036 
0037 /* rdma completion notification queue element */
0038 struct rdma_cnqe {
0039     struct regpair  cq_handle;
0040 };
0041 
0042 struct rdma_cqe_responder {
0043     struct regpair srq_wr_id;
0044     struct regpair qp_handle;
0045     __le32 imm_data_or_inv_r_Key;
0046     __le32 length;
0047     __le32 imm_data_hi;
0048     __le16 rq_cons_or_srq_id;
0049     u8 flags;
0050 #define RDMA_CQE_RESPONDER_TOGGLE_BIT_MASK  0x1
0051 #define RDMA_CQE_RESPONDER_TOGGLE_BIT_SHIFT 0
0052 #define RDMA_CQE_RESPONDER_TYPE_MASK        0x3
0053 #define RDMA_CQE_RESPONDER_TYPE_SHIFT       1
0054 #define RDMA_CQE_RESPONDER_INV_FLG_MASK     0x1
0055 #define RDMA_CQE_RESPONDER_INV_FLG_SHIFT    3
0056 #define RDMA_CQE_RESPONDER_IMM_FLG_MASK     0x1
0057 #define RDMA_CQE_RESPONDER_IMM_FLG_SHIFT    4
0058 #define RDMA_CQE_RESPONDER_RDMA_FLG_MASK    0x1
0059 #define RDMA_CQE_RESPONDER_RDMA_FLG_SHIFT   5
0060 #define RDMA_CQE_RESPONDER_RESERVED2_MASK   0x3
0061 #define RDMA_CQE_RESPONDER_RESERVED2_SHIFT  6
0062     u8 status;
0063 };
0064 
0065 struct rdma_cqe_requester {
0066     __le16 sq_cons;
0067     __le16 reserved0;
0068     __le32 reserved1;
0069     struct regpair qp_handle;
0070     struct regpair reserved2;
0071     __le32 reserved3;
0072     __le16 reserved4;
0073     u8 flags;
0074 #define RDMA_CQE_REQUESTER_TOGGLE_BIT_MASK  0x1
0075 #define RDMA_CQE_REQUESTER_TOGGLE_BIT_SHIFT 0
0076 #define RDMA_CQE_REQUESTER_TYPE_MASK        0x3
0077 #define RDMA_CQE_REQUESTER_TYPE_SHIFT       1
0078 #define RDMA_CQE_REQUESTER_RESERVED5_MASK   0x1F
0079 #define RDMA_CQE_REQUESTER_RESERVED5_SHIFT  3
0080     u8 status;
0081 };
0082 
0083 struct rdma_cqe_common {
0084     struct regpair reserved0;
0085     struct regpair qp_handle;
0086     __le16 reserved1[7];
0087     u8 flags;
0088 #define RDMA_CQE_COMMON_TOGGLE_BIT_MASK  0x1
0089 #define RDMA_CQE_COMMON_TOGGLE_BIT_SHIFT 0
0090 #define RDMA_CQE_COMMON_TYPE_MASK        0x3
0091 #define RDMA_CQE_COMMON_TYPE_SHIFT       1
0092 #define RDMA_CQE_COMMON_RESERVED2_MASK   0x1F
0093 #define RDMA_CQE_COMMON_RESERVED2_SHIFT  3
0094     u8 status;
0095 };
0096 
0097 /* rdma completion queue element */
0098 union rdma_cqe {
0099     struct rdma_cqe_responder resp;
0100     struct rdma_cqe_requester req;
0101     struct rdma_cqe_common cmn;
0102 };
0103 
0104 /* * CQE requester status enumeration */
0105 enum rdma_cqe_requester_status_enum {
0106     RDMA_CQE_REQ_STS_OK,
0107     RDMA_CQE_REQ_STS_BAD_RESPONSE_ERR,
0108     RDMA_CQE_REQ_STS_LOCAL_LENGTH_ERR,
0109     RDMA_CQE_REQ_STS_LOCAL_QP_OPERATION_ERR,
0110     RDMA_CQE_REQ_STS_LOCAL_PROTECTION_ERR,
0111     RDMA_CQE_REQ_STS_MEMORY_MGT_OPERATION_ERR,
0112     RDMA_CQE_REQ_STS_REMOTE_INVALID_REQUEST_ERR,
0113     RDMA_CQE_REQ_STS_REMOTE_ACCESS_ERR,
0114     RDMA_CQE_REQ_STS_REMOTE_OPERATION_ERR,
0115     RDMA_CQE_REQ_STS_RNR_NAK_RETRY_CNT_ERR,
0116     RDMA_CQE_REQ_STS_TRANSPORT_RETRY_CNT_ERR,
0117     RDMA_CQE_REQ_STS_WORK_REQUEST_FLUSHED_ERR,
0118     RDMA_CQE_REQ_STS_XRC_VOILATION_ERR,
0119     RDMA_CQE_REQ_STS_SIG_ERR,
0120     MAX_RDMA_CQE_REQUESTER_STATUS_ENUM
0121 };
0122 
0123 /* CQE responder status enumeration */
0124 enum rdma_cqe_responder_status_enum {
0125     RDMA_CQE_RESP_STS_OK,
0126     RDMA_CQE_RESP_STS_LOCAL_ACCESS_ERR,
0127     RDMA_CQE_RESP_STS_LOCAL_LENGTH_ERR,
0128     RDMA_CQE_RESP_STS_LOCAL_QP_OPERATION_ERR,
0129     RDMA_CQE_RESP_STS_LOCAL_PROTECTION_ERR,
0130     RDMA_CQE_RESP_STS_MEMORY_MGT_OPERATION_ERR,
0131     RDMA_CQE_RESP_STS_REMOTE_INVALID_REQUEST_ERR,
0132     RDMA_CQE_RESP_STS_WORK_REQUEST_FLUSHED_ERR,
0133     MAX_RDMA_CQE_RESPONDER_STATUS_ENUM
0134 };
0135 
0136 /* CQE type enumeration */
0137 enum rdma_cqe_type {
0138     RDMA_CQE_TYPE_REQUESTER,
0139     RDMA_CQE_TYPE_RESPONDER_RQ,
0140     RDMA_CQE_TYPE_RESPONDER_SRQ,
0141     RDMA_CQE_TYPE_RESPONDER_XRC_SRQ,
0142     RDMA_CQE_TYPE_INVALID,
0143     MAX_RDMA_CQE_TYPE
0144 };
0145 
0146 struct rdma_sq_sge {
0147     __le32 length;
0148     struct regpair  addr;
0149     __le32 l_key;
0150 };
0151 
0152 struct rdma_rq_sge {
0153     struct regpair addr;
0154     __le32 length;
0155     __le32 flags;
0156 #define RDMA_RQ_SGE_L_KEY_LO_MASK   0x3FFFFFF
0157 #define RDMA_RQ_SGE_L_KEY_LO_SHIFT  0
0158 #define RDMA_RQ_SGE_NUM_SGES_MASK   0x7
0159 #define RDMA_RQ_SGE_NUM_SGES_SHIFT  26
0160 #define RDMA_RQ_SGE_L_KEY_HI_MASK   0x7
0161 #define RDMA_RQ_SGE_L_KEY_HI_SHIFT  29
0162 };
0163 
0164 struct rdma_srq_wqe_header {
0165     struct regpair wr_id;
0166     u8 num_sges /* number of SGEs in WQE */;
0167     u8 reserved2[7];
0168 };
0169 
0170 struct rdma_srq_sge {
0171     struct regpair addr;
0172     __le32 length;
0173     __le32 l_key;
0174 };
0175 
0176 union rdma_srq_elm {
0177     struct rdma_srq_wqe_header header;
0178     struct rdma_srq_sge sge;
0179 };
0180 
0181 /* Rdma doorbell data for flags update */
0182 struct rdma_pwm_flags_data {
0183     __le16 icid; /* internal CID */
0184     u8 agg_flags; /* aggregative flags */
0185     u8 reserved;
0186 };
0187 
0188 /* Rdma doorbell data for SQ and RQ */
0189 struct rdma_pwm_val16_data {
0190     __le16 icid;
0191     __le16 value;
0192 };
0193 
0194 union rdma_pwm_val16_data_union {
0195     struct rdma_pwm_val16_data as_struct;
0196     __le32 as_dword;
0197 };
0198 
0199 /* Rdma doorbell data for CQ */
0200 struct rdma_pwm_val32_data {
0201     __le16 icid;
0202     u8 agg_flags;
0203     u8 params;
0204 #define RDMA_PWM_VAL32_DATA_AGG_CMD_MASK        0x3
0205 #define RDMA_PWM_VAL32_DATA_AGG_CMD_SHIFT       0
0206 #define RDMA_PWM_VAL32_DATA_BYPASS_EN_MASK      0x1
0207 #define RDMA_PWM_VAL32_DATA_BYPASS_EN_SHIFT     2
0208 #define RDMA_PWM_VAL32_DATA_CONN_TYPE_IS_IWARP_MASK 0x1
0209 #define RDMA_PWM_VAL32_DATA_CONN_TYPE_IS_IWARP_SHIFT    3
0210 #define RDMA_PWM_VAL32_DATA_SET_16B_VAL_MASK        0x1
0211 #define RDMA_PWM_VAL32_DATA_SET_16B_VAL_SHIFT       4
0212 #define RDMA_PWM_VAL32_DATA_RESERVED_MASK       0x7
0213 #define RDMA_PWM_VAL32_DATA_RESERVED_SHIFT      5
0214     __le32 value;
0215 };
0216 
0217 /* DIF Block size options */
0218 enum rdma_dif_block_size {
0219     RDMA_DIF_BLOCK_512 = 0,
0220     RDMA_DIF_BLOCK_4096 = 1,
0221     MAX_RDMA_DIF_BLOCK_SIZE
0222 };
0223 
0224 /* DIF CRC initial value */
0225 enum rdma_dif_crc_seed {
0226     RDMA_DIF_CRC_SEED_0000 = 0,
0227     RDMA_DIF_CRC_SEED_FFFF = 1,
0228     MAX_RDMA_DIF_CRC_SEED
0229 };
0230 
0231 /* RDMA DIF Error Result Structure */
0232 struct rdma_dif_error_result {
0233     __le32 error_intervals;
0234     __le32 dif_error_1st_interval;
0235     u8 flags;
0236 #define RDMA_DIF_ERROR_RESULT_DIF_ERROR_TYPE_CRC_MASK      0x1
0237 #define RDMA_DIF_ERROR_RESULT_DIF_ERROR_TYPE_CRC_SHIFT     0
0238 #define RDMA_DIF_ERROR_RESULT_DIF_ERROR_TYPE_APP_TAG_MASK  0x1
0239 #define RDMA_DIF_ERROR_RESULT_DIF_ERROR_TYPE_APP_TAG_SHIFT 1
0240 #define RDMA_DIF_ERROR_RESULT_DIF_ERROR_TYPE_REF_TAG_MASK  0x1
0241 #define RDMA_DIF_ERROR_RESULT_DIF_ERROR_TYPE_REF_TAG_SHIFT 2
0242 #define RDMA_DIF_ERROR_RESULT_RESERVED0_MASK               0xF
0243 #define RDMA_DIF_ERROR_RESULT_RESERVED0_SHIFT              3
0244 #define RDMA_DIF_ERROR_RESULT_TOGGLE_BIT_MASK              0x1
0245 #define RDMA_DIF_ERROR_RESULT_TOGGLE_BIT_SHIFT             7
0246     u8 reserved1[55];
0247 };
0248 
0249 /* DIF IO direction */
0250 enum rdma_dif_io_direction_flg {
0251     RDMA_DIF_DIR_RX = 0,
0252     RDMA_DIF_DIR_TX = 1,
0253     MAX_RDMA_DIF_IO_DIRECTION_FLG
0254 };
0255 
0256 struct rdma_dif_params {
0257     __le32 base_ref_tag;
0258     __le16 app_tag;
0259     __le16 app_tag_mask;
0260     __le16 runt_crc_value;
0261     __le16 flags;
0262 #define RDMA_DIF_PARAMS_IO_DIRECTION_FLG_MASK    0x1
0263 #define RDMA_DIF_PARAMS_IO_DIRECTION_FLG_SHIFT   0
0264 #define RDMA_DIF_PARAMS_BLOCK_SIZE_MASK          0x1
0265 #define RDMA_DIF_PARAMS_BLOCK_SIZE_SHIFT         1
0266 #define RDMA_DIF_PARAMS_RUNT_VALID_FLG_MASK      0x1
0267 #define RDMA_DIF_PARAMS_RUNT_VALID_FLG_SHIFT     2
0268 #define RDMA_DIF_PARAMS_VALIDATE_CRC_GUARD_MASK  0x1
0269 #define RDMA_DIF_PARAMS_VALIDATE_CRC_GUARD_SHIFT 3
0270 #define RDMA_DIF_PARAMS_VALIDATE_REF_TAG_MASK    0x1
0271 #define RDMA_DIF_PARAMS_VALIDATE_REF_TAG_SHIFT   4
0272 #define RDMA_DIF_PARAMS_VALIDATE_APP_TAG_MASK    0x1
0273 #define RDMA_DIF_PARAMS_VALIDATE_APP_TAG_SHIFT   5
0274 #define RDMA_DIF_PARAMS_CRC_SEED_MASK            0x1
0275 #define RDMA_DIF_PARAMS_CRC_SEED_SHIFT           6
0276 #define RDMA_DIF_PARAMS_RX_REF_TAG_CONST_MASK    0x1
0277 #define RDMA_DIF_PARAMS_RX_REF_TAG_CONST_SHIFT   7
0278 #define RDMA_DIF_PARAMS_BLOCK_GUARD_TYPE_MASK    0x1
0279 #define RDMA_DIF_PARAMS_BLOCK_GUARD_TYPE_SHIFT   8
0280 #define RDMA_DIF_PARAMS_APP_ESCAPE_MASK          0x1
0281 #define RDMA_DIF_PARAMS_APP_ESCAPE_SHIFT         9
0282 #define RDMA_DIF_PARAMS_REF_ESCAPE_MASK          0x1
0283 #define RDMA_DIF_PARAMS_REF_ESCAPE_SHIFT         10
0284 #define RDMA_DIF_PARAMS_RESERVED4_MASK           0x1F
0285 #define RDMA_DIF_PARAMS_RESERVED4_SHIFT          11
0286     __le32 reserved5;
0287 };
0288 
0289 
0290 struct rdma_sq_atomic_wqe {
0291     __le32 reserved1;
0292     __le32 length;
0293     __le32 xrc_srq;
0294     u8 req_type;
0295     u8 flags;
0296 #define RDMA_SQ_ATOMIC_WQE_COMP_FLG_MASK         0x1
0297 #define RDMA_SQ_ATOMIC_WQE_COMP_FLG_SHIFT        0
0298 #define RDMA_SQ_ATOMIC_WQE_RD_FENCE_FLG_MASK     0x1
0299 #define RDMA_SQ_ATOMIC_WQE_RD_FENCE_FLG_SHIFT    1
0300 #define RDMA_SQ_ATOMIC_WQE_INV_FENCE_FLG_MASK    0x1
0301 #define RDMA_SQ_ATOMIC_WQE_INV_FENCE_FLG_SHIFT   2
0302 #define RDMA_SQ_ATOMIC_WQE_SE_FLG_MASK           0x1
0303 #define RDMA_SQ_ATOMIC_WQE_SE_FLG_SHIFT          3
0304 #define RDMA_SQ_ATOMIC_WQE_INLINE_FLG_MASK       0x1
0305 #define RDMA_SQ_ATOMIC_WQE_INLINE_FLG_SHIFT      4
0306 #define RDMA_SQ_ATOMIC_WQE_DIF_ON_HOST_FLG_MASK  0x1
0307 #define RDMA_SQ_ATOMIC_WQE_DIF_ON_HOST_FLG_SHIFT 5
0308 #define RDMA_SQ_ATOMIC_WQE_RESERVED0_MASK        0x3
0309 #define RDMA_SQ_ATOMIC_WQE_RESERVED0_SHIFT       6
0310     u8 wqe_size;
0311     u8 prev_wqe_size;
0312     struct regpair remote_va;
0313     __le32 r_key;
0314     __le32 reserved2;
0315     struct regpair cmp_data;
0316     struct regpair swap_data;
0317 };
0318 
0319 /* First element (16 bytes) of atomic wqe */
0320 struct rdma_sq_atomic_wqe_1st {
0321     __le32 reserved1;
0322     __le32 length;
0323     __le32 xrc_srq;
0324     u8 req_type;
0325     u8 flags;
0326 #define RDMA_SQ_ATOMIC_WQE_1ST_COMP_FLG_MASK       0x1
0327 #define RDMA_SQ_ATOMIC_WQE_1ST_COMP_FLG_SHIFT      0
0328 #define RDMA_SQ_ATOMIC_WQE_1ST_RD_FENCE_FLG_MASK   0x1
0329 #define RDMA_SQ_ATOMIC_WQE_1ST_RD_FENCE_FLG_SHIFT  1
0330 #define RDMA_SQ_ATOMIC_WQE_1ST_INV_FENCE_FLG_MASK  0x1
0331 #define RDMA_SQ_ATOMIC_WQE_1ST_INV_FENCE_FLG_SHIFT 2
0332 #define RDMA_SQ_ATOMIC_WQE_1ST_SE_FLG_MASK         0x1
0333 #define RDMA_SQ_ATOMIC_WQE_1ST_SE_FLG_SHIFT        3
0334 #define RDMA_SQ_ATOMIC_WQE_1ST_INLINE_FLG_MASK     0x1
0335 #define RDMA_SQ_ATOMIC_WQE_1ST_INLINE_FLG_SHIFT    4
0336 #define RDMA_SQ_ATOMIC_WQE_1ST_RESERVED0_MASK      0x7
0337 #define RDMA_SQ_ATOMIC_WQE_1ST_RESERVED0_SHIFT     5
0338     u8 wqe_size;
0339     u8 prev_wqe_size;
0340 };
0341 
0342 /* Second element (16 bytes) of atomic wqe */
0343 struct rdma_sq_atomic_wqe_2nd {
0344     struct regpair remote_va;
0345     __le32 r_key;
0346     __le32 reserved2;
0347 };
0348 
0349 /* Third element (16 bytes) of atomic wqe */
0350 struct rdma_sq_atomic_wqe_3rd {
0351     struct regpair cmp_data;
0352     struct regpair swap_data;
0353 };
0354 
0355 struct rdma_sq_bind_wqe {
0356     struct regpair addr;
0357     __le32 l_key;
0358     u8 req_type;
0359     u8 flags;
0360 #define RDMA_SQ_BIND_WQE_COMP_FLG_MASK       0x1
0361 #define RDMA_SQ_BIND_WQE_COMP_FLG_SHIFT      0
0362 #define RDMA_SQ_BIND_WQE_RD_FENCE_FLG_MASK   0x1
0363 #define RDMA_SQ_BIND_WQE_RD_FENCE_FLG_SHIFT  1
0364 #define RDMA_SQ_BIND_WQE_INV_FENCE_FLG_MASK  0x1
0365 #define RDMA_SQ_BIND_WQE_INV_FENCE_FLG_SHIFT 2
0366 #define RDMA_SQ_BIND_WQE_SE_FLG_MASK         0x1
0367 #define RDMA_SQ_BIND_WQE_SE_FLG_SHIFT        3
0368 #define RDMA_SQ_BIND_WQE_INLINE_FLG_MASK     0x1
0369 #define RDMA_SQ_BIND_WQE_INLINE_FLG_SHIFT    4
0370 #define RDMA_SQ_BIND_WQE_DIF_ON_HOST_FLG_MASK  0x1
0371 #define RDMA_SQ_BIND_WQE_DIF_ON_HOST_FLG_SHIFT 5
0372 #define RDMA_SQ_BIND_WQE_RESERVED0_MASK      0x3
0373 #define RDMA_SQ_BIND_WQE_RESERVED0_SHIFT     6
0374     u8 wqe_size;
0375     u8 prev_wqe_size;
0376     u8 bind_ctrl;
0377 #define RDMA_SQ_BIND_WQE_ZERO_BASED_MASK     0x1
0378 #define RDMA_SQ_BIND_WQE_ZERO_BASED_SHIFT    0
0379 #define RDMA_SQ_BIND_WQE_RESERVED1_MASK        0x7F
0380 #define RDMA_SQ_BIND_WQE_RESERVED1_SHIFT       1
0381     u8 access_ctrl;
0382 #define RDMA_SQ_BIND_WQE_REMOTE_READ_MASK    0x1
0383 #define RDMA_SQ_BIND_WQE_REMOTE_READ_SHIFT   0
0384 #define RDMA_SQ_BIND_WQE_REMOTE_WRITE_MASK   0x1
0385 #define RDMA_SQ_BIND_WQE_REMOTE_WRITE_SHIFT  1
0386 #define RDMA_SQ_BIND_WQE_ENABLE_ATOMIC_MASK  0x1
0387 #define RDMA_SQ_BIND_WQE_ENABLE_ATOMIC_SHIFT 2
0388 #define RDMA_SQ_BIND_WQE_LOCAL_READ_MASK     0x1
0389 #define RDMA_SQ_BIND_WQE_LOCAL_READ_SHIFT    3
0390 #define RDMA_SQ_BIND_WQE_LOCAL_WRITE_MASK    0x1
0391 #define RDMA_SQ_BIND_WQE_LOCAL_WRITE_SHIFT   4
0392 #define RDMA_SQ_BIND_WQE_RESERVED2_MASK      0x7
0393 #define RDMA_SQ_BIND_WQE_RESERVED2_SHIFT     5
0394     u8 reserved3;
0395     u8 length_hi;
0396     __le32 length_lo;
0397     __le32 parent_l_key;
0398     __le32 reserved4;
0399     struct rdma_dif_params dif_params;
0400 };
0401 
0402 /* First element (16 bytes) of bind wqe */
0403 struct rdma_sq_bind_wqe_1st {
0404     struct regpair addr;
0405     __le32 l_key;
0406     u8 req_type;
0407     u8 flags;
0408 #define RDMA_SQ_BIND_WQE_1ST_COMP_FLG_MASK       0x1
0409 #define RDMA_SQ_BIND_WQE_1ST_COMP_FLG_SHIFT      0
0410 #define RDMA_SQ_BIND_WQE_1ST_RD_FENCE_FLG_MASK   0x1
0411 #define RDMA_SQ_BIND_WQE_1ST_RD_FENCE_FLG_SHIFT  1
0412 #define RDMA_SQ_BIND_WQE_1ST_INV_FENCE_FLG_MASK  0x1
0413 #define RDMA_SQ_BIND_WQE_1ST_INV_FENCE_FLG_SHIFT 2
0414 #define RDMA_SQ_BIND_WQE_1ST_SE_FLG_MASK         0x1
0415 #define RDMA_SQ_BIND_WQE_1ST_SE_FLG_SHIFT        3
0416 #define RDMA_SQ_BIND_WQE_1ST_INLINE_FLG_MASK     0x1
0417 #define RDMA_SQ_BIND_WQE_1ST_INLINE_FLG_SHIFT    4
0418 #define RDMA_SQ_BIND_WQE_1ST_RESERVED0_MASK      0x7
0419 #define RDMA_SQ_BIND_WQE_1ST_RESERVED0_SHIFT     5
0420     u8 wqe_size;
0421     u8 prev_wqe_size;
0422 };
0423 
0424 /* Second element (16 bytes) of bind wqe */
0425 struct rdma_sq_bind_wqe_2nd {
0426     u8 bind_ctrl;
0427 #define RDMA_SQ_BIND_WQE_2ND_ZERO_BASED_MASK     0x1
0428 #define RDMA_SQ_BIND_WQE_2ND_ZERO_BASED_SHIFT    0
0429 #define RDMA_SQ_BIND_WQE_2ND_RESERVED1_MASK      0x7F
0430 #define RDMA_SQ_BIND_WQE_2ND_RESERVED1_SHIFT     1
0431     u8 access_ctrl;
0432 #define RDMA_SQ_BIND_WQE_2ND_REMOTE_READ_MASK    0x1
0433 #define RDMA_SQ_BIND_WQE_2ND_REMOTE_READ_SHIFT   0
0434 #define RDMA_SQ_BIND_WQE_2ND_REMOTE_WRITE_MASK   0x1
0435 #define RDMA_SQ_BIND_WQE_2ND_REMOTE_WRITE_SHIFT  1
0436 #define RDMA_SQ_BIND_WQE_2ND_ENABLE_ATOMIC_MASK  0x1
0437 #define RDMA_SQ_BIND_WQE_2ND_ENABLE_ATOMIC_SHIFT 2
0438 #define RDMA_SQ_BIND_WQE_2ND_LOCAL_READ_MASK     0x1
0439 #define RDMA_SQ_BIND_WQE_2ND_LOCAL_READ_SHIFT    3
0440 #define RDMA_SQ_BIND_WQE_2ND_LOCAL_WRITE_MASK    0x1
0441 #define RDMA_SQ_BIND_WQE_2ND_LOCAL_WRITE_SHIFT   4
0442 #define RDMA_SQ_BIND_WQE_2ND_RESERVED2_MASK      0x7
0443 #define RDMA_SQ_BIND_WQE_2ND_RESERVED2_SHIFT     5
0444     u8 reserved3;
0445     u8 length_hi;
0446     __le32 length_lo;
0447     __le32 parent_l_key;
0448     __le32 reserved4;
0449 };
0450 
0451 /* Third element (16 bytes) of bind wqe */
0452 struct rdma_sq_bind_wqe_3rd {
0453     struct rdma_dif_params dif_params;
0454 };
0455 
0456 /* Structure with only the SQ WQE common
0457  * fields. Size is of one SQ element (16B)
0458  */
0459 struct rdma_sq_common_wqe {
0460     __le32 reserved1[3];
0461     u8 req_type;
0462     u8 flags;
0463 #define RDMA_SQ_COMMON_WQE_COMP_FLG_MASK       0x1
0464 #define RDMA_SQ_COMMON_WQE_COMP_FLG_SHIFT      0
0465 #define RDMA_SQ_COMMON_WQE_RD_FENCE_FLG_MASK   0x1
0466 #define RDMA_SQ_COMMON_WQE_RD_FENCE_FLG_SHIFT  1
0467 #define RDMA_SQ_COMMON_WQE_INV_FENCE_FLG_MASK  0x1
0468 #define RDMA_SQ_COMMON_WQE_INV_FENCE_FLG_SHIFT 2
0469 #define RDMA_SQ_COMMON_WQE_SE_FLG_MASK         0x1
0470 #define RDMA_SQ_COMMON_WQE_SE_FLG_SHIFT        3
0471 #define RDMA_SQ_COMMON_WQE_INLINE_FLG_MASK     0x1
0472 #define RDMA_SQ_COMMON_WQE_INLINE_FLG_SHIFT    4
0473 #define RDMA_SQ_COMMON_WQE_RESERVED0_MASK      0x7
0474 #define RDMA_SQ_COMMON_WQE_RESERVED0_SHIFT     5
0475     u8 wqe_size;
0476     u8 prev_wqe_size;
0477 };
0478 
0479 struct rdma_sq_fmr_wqe {
0480     struct regpair addr;
0481     __le32 l_key;
0482     u8 req_type;
0483     u8 flags;
0484 #define RDMA_SQ_FMR_WQE_COMP_FLG_MASK                0x1
0485 #define RDMA_SQ_FMR_WQE_COMP_FLG_SHIFT               0
0486 #define RDMA_SQ_FMR_WQE_RD_FENCE_FLG_MASK            0x1
0487 #define RDMA_SQ_FMR_WQE_RD_FENCE_FLG_SHIFT           1
0488 #define RDMA_SQ_FMR_WQE_INV_FENCE_FLG_MASK           0x1
0489 #define RDMA_SQ_FMR_WQE_INV_FENCE_FLG_SHIFT          2
0490 #define RDMA_SQ_FMR_WQE_SE_FLG_MASK                  0x1
0491 #define RDMA_SQ_FMR_WQE_SE_FLG_SHIFT                 3
0492 #define RDMA_SQ_FMR_WQE_INLINE_FLG_MASK              0x1
0493 #define RDMA_SQ_FMR_WQE_INLINE_FLG_SHIFT             4
0494 #define RDMA_SQ_FMR_WQE_DIF_ON_HOST_FLG_MASK         0x1
0495 #define RDMA_SQ_FMR_WQE_DIF_ON_HOST_FLG_SHIFT        5
0496 #define RDMA_SQ_FMR_WQE_RESERVED0_MASK               0x3
0497 #define RDMA_SQ_FMR_WQE_RESERVED0_SHIFT              6
0498     u8 wqe_size;
0499     u8 prev_wqe_size;
0500     u8 fmr_ctrl;
0501 #define RDMA_SQ_FMR_WQE_PAGE_SIZE_LOG_MASK           0x1F
0502 #define RDMA_SQ_FMR_WQE_PAGE_SIZE_LOG_SHIFT          0
0503 #define RDMA_SQ_FMR_WQE_ZERO_BASED_MASK              0x1
0504 #define RDMA_SQ_FMR_WQE_ZERO_BASED_SHIFT             5
0505 #define RDMA_SQ_FMR_WQE_BIND_EN_MASK                 0x1
0506 #define RDMA_SQ_FMR_WQE_BIND_EN_SHIFT                6
0507 #define RDMA_SQ_FMR_WQE_RESERVED1_MASK               0x1
0508 #define RDMA_SQ_FMR_WQE_RESERVED1_SHIFT              7
0509     u8 access_ctrl;
0510 #define RDMA_SQ_FMR_WQE_REMOTE_READ_MASK             0x1
0511 #define RDMA_SQ_FMR_WQE_REMOTE_READ_SHIFT            0
0512 #define RDMA_SQ_FMR_WQE_REMOTE_WRITE_MASK            0x1
0513 #define RDMA_SQ_FMR_WQE_REMOTE_WRITE_SHIFT           1
0514 #define RDMA_SQ_FMR_WQE_ENABLE_ATOMIC_MASK           0x1
0515 #define RDMA_SQ_FMR_WQE_ENABLE_ATOMIC_SHIFT          2
0516 #define RDMA_SQ_FMR_WQE_LOCAL_READ_MASK              0x1
0517 #define RDMA_SQ_FMR_WQE_LOCAL_READ_SHIFT             3
0518 #define RDMA_SQ_FMR_WQE_LOCAL_WRITE_MASK             0x1
0519 #define RDMA_SQ_FMR_WQE_LOCAL_WRITE_SHIFT            4
0520 #define RDMA_SQ_FMR_WQE_RESERVED2_MASK               0x7
0521 #define RDMA_SQ_FMR_WQE_RESERVED2_SHIFT              5
0522     u8 reserved3;
0523     u8 length_hi;
0524     __le32 length_lo;
0525     struct regpair pbl_addr;
0526 };
0527 
0528 /* First element (16 bytes) of fmr wqe */
0529 struct rdma_sq_fmr_wqe_1st {
0530     struct regpair addr;
0531     __le32 l_key;
0532     u8 req_type;
0533     u8 flags;
0534 #define RDMA_SQ_FMR_WQE_1ST_COMP_FLG_MASK         0x1
0535 #define RDMA_SQ_FMR_WQE_1ST_COMP_FLG_SHIFT        0
0536 #define RDMA_SQ_FMR_WQE_1ST_RD_FENCE_FLG_MASK     0x1
0537 #define RDMA_SQ_FMR_WQE_1ST_RD_FENCE_FLG_SHIFT    1
0538 #define RDMA_SQ_FMR_WQE_1ST_INV_FENCE_FLG_MASK    0x1
0539 #define RDMA_SQ_FMR_WQE_1ST_INV_FENCE_FLG_SHIFT   2
0540 #define RDMA_SQ_FMR_WQE_1ST_SE_FLG_MASK           0x1
0541 #define RDMA_SQ_FMR_WQE_1ST_SE_FLG_SHIFT          3
0542 #define RDMA_SQ_FMR_WQE_1ST_INLINE_FLG_MASK       0x1
0543 #define RDMA_SQ_FMR_WQE_1ST_INLINE_FLG_SHIFT      4
0544 #define RDMA_SQ_FMR_WQE_1ST_DIF_ON_HOST_FLG_MASK  0x1
0545 #define RDMA_SQ_FMR_WQE_1ST_DIF_ON_HOST_FLG_SHIFT 5
0546 #define RDMA_SQ_FMR_WQE_1ST_RESERVED0_MASK        0x3
0547 #define RDMA_SQ_FMR_WQE_1ST_RESERVED0_SHIFT       6
0548     u8 wqe_size;
0549     u8 prev_wqe_size;
0550 };
0551 
0552 /* Second element (16 bytes) of fmr wqe */
0553 struct rdma_sq_fmr_wqe_2nd {
0554     u8 fmr_ctrl;
0555 #define RDMA_SQ_FMR_WQE_2ND_PAGE_SIZE_LOG_MASK  0x1F
0556 #define RDMA_SQ_FMR_WQE_2ND_PAGE_SIZE_LOG_SHIFT 0
0557 #define RDMA_SQ_FMR_WQE_2ND_ZERO_BASED_MASK     0x1
0558 #define RDMA_SQ_FMR_WQE_2ND_ZERO_BASED_SHIFT    5
0559 #define RDMA_SQ_FMR_WQE_2ND_BIND_EN_MASK        0x1
0560 #define RDMA_SQ_FMR_WQE_2ND_BIND_EN_SHIFT       6
0561 #define RDMA_SQ_FMR_WQE_2ND_RESERVED1_MASK      0x1
0562 #define RDMA_SQ_FMR_WQE_2ND_RESERVED1_SHIFT     7
0563     u8 access_ctrl;
0564 #define RDMA_SQ_FMR_WQE_2ND_REMOTE_READ_MASK    0x1
0565 #define RDMA_SQ_FMR_WQE_2ND_REMOTE_READ_SHIFT   0
0566 #define RDMA_SQ_FMR_WQE_2ND_REMOTE_WRITE_MASK   0x1
0567 #define RDMA_SQ_FMR_WQE_2ND_REMOTE_WRITE_SHIFT  1
0568 #define RDMA_SQ_FMR_WQE_2ND_ENABLE_ATOMIC_MASK  0x1
0569 #define RDMA_SQ_FMR_WQE_2ND_ENABLE_ATOMIC_SHIFT 2
0570 #define RDMA_SQ_FMR_WQE_2ND_LOCAL_READ_MASK     0x1
0571 #define RDMA_SQ_FMR_WQE_2ND_LOCAL_READ_SHIFT    3
0572 #define RDMA_SQ_FMR_WQE_2ND_LOCAL_WRITE_MASK    0x1
0573 #define RDMA_SQ_FMR_WQE_2ND_LOCAL_WRITE_SHIFT   4
0574 #define RDMA_SQ_FMR_WQE_2ND_RESERVED2_MASK      0x7
0575 #define RDMA_SQ_FMR_WQE_2ND_RESERVED2_SHIFT     5
0576     u8 reserved3;
0577     u8 length_hi;
0578     __le32 length_lo;
0579     struct regpair pbl_addr;
0580 };
0581 
0582 
0583 struct rdma_sq_local_inv_wqe {
0584     struct regpair reserved;
0585     __le32 inv_l_key;
0586     u8 req_type;
0587     u8 flags;
0588 #define RDMA_SQ_LOCAL_INV_WQE_COMP_FLG_MASK         0x1
0589 #define RDMA_SQ_LOCAL_INV_WQE_COMP_FLG_SHIFT        0
0590 #define RDMA_SQ_LOCAL_INV_WQE_RD_FENCE_FLG_MASK     0x1
0591 #define RDMA_SQ_LOCAL_INV_WQE_RD_FENCE_FLG_SHIFT    1
0592 #define RDMA_SQ_LOCAL_INV_WQE_INV_FENCE_FLG_MASK    0x1
0593 #define RDMA_SQ_LOCAL_INV_WQE_INV_FENCE_FLG_SHIFT   2
0594 #define RDMA_SQ_LOCAL_INV_WQE_SE_FLG_MASK           0x1
0595 #define RDMA_SQ_LOCAL_INV_WQE_SE_FLG_SHIFT          3
0596 #define RDMA_SQ_LOCAL_INV_WQE_INLINE_FLG_MASK       0x1
0597 #define RDMA_SQ_LOCAL_INV_WQE_INLINE_FLG_SHIFT      4
0598 #define RDMA_SQ_LOCAL_INV_WQE_DIF_ON_HOST_FLG_MASK  0x1
0599 #define RDMA_SQ_LOCAL_INV_WQE_DIF_ON_HOST_FLG_SHIFT 5
0600 #define RDMA_SQ_LOCAL_INV_WQE_RESERVED0_MASK        0x3
0601 #define RDMA_SQ_LOCAL_INV_WQE_RESERVED0_SHIFT       6
0602     u8 wqe_size;
0603     u8 prev_wqe_size;
0604 };
0605 
0606 struct rdma_sq_rdma_wqe {
0607     __le32 imm_data;
0608     __le32 length;
0609     __le32 xrc_srq;
0610     u8 req_type;
0611     u8 flags;
0612 #define RDMA_SQ_RDMA_WQE_COMP_FLG_MASK      0x1
0613 #define RDMA_SQ_RDMA_WQE_COMP_FLG_SHIFT     0
0614 #define RDMA_SQ_RDMA_WQE_RD_FENCE_FLG_MASK  0x1
0615 #define RDMA_SQ_RDMA_WQE_RD_FENCE_FLG_SHIFT 1
0616 #define RDMA_SQ_RDMA_WQE_INV_FENCE_FLG_MASK 0x1
0617 #define RDMA_SQ_RDMA_WQE_INV_FENCE_FLG_SHIFT    2
0618 #define RDMA_SQ_RDMA_WQE_SE_FLG_MASK        0x1
0619 #define RDMA_SQ_RDMA_WQE_SE_FLG_SHIFT       3
0620 #define RDMA_SQ_RDMA_WQE_INLINE_FLG_MASK    0x1
0621 #define RDMA_SQ_RDMA_WQE_INLINE_FLG_SHIFT   4
0622 #define RDMA_SQ_RDMA_WQE_DIF_ON_HOST_FLG_MASK   0x1
0623 #define RDMA_SQ_RDMA_WQE_DIF_ON_HOST_FLG_SHIFT  5
0624 #define RDMA_SQ_RDMA_WQE_READ_INV_FLG_MASK  0x1
0625 #define RDMA_SQ_RDMA_WQE_READ_INV_FLG_SHIFT 6
0626 #define RDMA_SQ_RDMA_WQE_RESERVED1_MASK        0x1
0627 #define RDMA_SQ_RDMA_WQE_RESERVED1_SHIFT       7
0628     u8 wqe_size;
0629     u8 prev_wqe_size;
0630     struct regpair remote_va;
0631     __le32 r_key;
0632     u8 dif_flags;
0633 #define RDMA_SQ_RDMA_WQE_DIF_BLOCK_SIZE_MASK            0x1
0634 #define RDMA_SQ_RDMA_WQE_DIF_BLOCK_SIZE_SHIFT           0
0635 #define RDMA_SQ_RDMA_WQE_RESERVED2_MASK        0x7F
0636 #define RDMA_SQ_RDMA_WQE_RESERVED2_SHIFT       1
0637     u8 reserved3[3];
0638 };
0639 
0640 /* First element (16 bytes) of rdma wqe */
0641 struct rdma_sq_rdma_wqe_1st {
0642     __le32 imm_data;
0643     __le32 length;
0644     __le32 xrc_srq;
0645     u8 req_type;
0646     u8 flags;
0647 #define RDMA_SQ_RDMA_WQE_1ST_COMP_FLG_MASK         0x1
0648 #define RDMA_SQ_RDMA_WQE_1ST_COMP_FLG_SHIFT        0
0649 #define RDMA_SQ_RDMA_WQE_1ST_RD_FENCE_FLG_MASK     0x1
0650 #define RDMA_SQ_RDMA_WQE_1ST_RD_FENCE_FLG_SHIFT    1
0651 #define RDMA_SQ_RDMA_WQE_1ST_INV_FENCE_FLG_MASK    0x1
0652 #define RDMA_SQ_RDMA_WQE_1ST_INV_FENCE_FLG_SHIFT   2
0653 #define RDMA_SQ_RDMA_WQE_1ST_SE_FLG_MASK           0x1
0654 #define RDMA_SQ_RDMA_WQE_1ST_SE_FLG_SHIFT          3
0655 #define RDMA_SQ_RDMA_WQE_1ST_INLINE_FLG_MASK       0x1
0656 #define RDMA_SQ_RDMA_WQE_1ST_INLINE_FLG_SHIFT      4
0657 #define RDMA_SQ_RDMA_WQE_1ST_DIF_ON_HOST_FLG_MASK  0x1
0658 #define RDMA_SQ_RDMA_WQE_1ST_DIF_ON_HOST_FLG_SHIFT 5
0659 #define RDMA_SQ_RDMA_WQE_1ST_READ_INV_FLG_MASK     0x1
0660 #define RDMA_SQ_RDMA_WQE_1ST_READ_INV_FLG_SHIFT    6
0661 #define RDMA_SQ_RDMA_WQE_1ST_RESERVED0_MASK        0x1
0662 #define RDMA_SQ_RDMA_WQE_1ST_RESERVED0_SHIFT       7
0663     u8 wqe_size;
0664     u8 prev_wqe_size;
0665 };
0666 
0667 /* Second element (16 bytes) of rdma wqe */
0668 struct rdma_sq_rdma_wqe_2nd {
0669     struct regpair remote_va;
0670     __le32 r_key;
0671     u8 dif_flags;
0672 #define RDMA_SQ_RDMA_WQE_2ND_DIF_BLOCK_SIZE_MASK         0x1
0673 #define RDMA_SQ_RDMA_WQE_2ND_DIF_BLOCK_SIZE_SHIFT        0
0674 #define RDMA_SQ_RDMA_WQE_2ND_DIF_FIRST_SEGMENT_FLG_MASK  0x1
0675 #define RDMA_SQ_RDMA_WQE_2ND_DIF_FIRST_SEGMENT_FLG_SHIFT 1
0676 #define RDMA_SQ_RDMA_WQE_2ND_DIF_LAST_SEGMENT_FLG_MASK   0x1
0677 #define RDMA_SQ_RDMA_WQE_2ND_DIF_LAST_SEGMENT_FLG_SHIFT  2
0678 #define RDMA_SQ_RDMA_WQE_2ND_RESERVED1_MASK              0x1F
0679 #define RDMA_SQ_RDMA_WQE_2ND_RESERVED1_SHIFT             3
0680     u8 reserved2[3];
0681 };
0682 
0683 /* SQ WQE req type enumeration */
0684 enum rdma_sq_req_type {
0685     RDMA_SQ_REQ_TYPE_SEND,
0686     RDMA_SQ_REQ_TYPE_SEND_WITH_IMM,
0687     RDMA_SQ_REQ_TYPE_SEND_WITH_INVALIDATE,
0688     RDMA_SQ_REQ_TYPE_RDMA_WR,
0689     RDMA_SQ_REQ_TYPE_RDMA_WR_WITH_IMM,
0690     RDMA_SQ_REQ_TYPE_RDMA_RD,
0691     RDMA_SQ_REQ_TYPE_ATOMIC_CMP_AND_SWAP,
0692     RDMA_SQ_REQ_TYPE_ATOMIC_ADD,
0693     RDMA_SQ_REQ_TYPE_LOCAL_INVALIDATE,
0694     RDMA_SQ_REQ_TYPE_FAST_MR,
0695     RDMA_SQ_REQ_TYPE_BIND,
0696     RDMA_SQ_REQ_TYPE_INVALID,
0697     MAX_RDMA_SQ_REQ_TYPE
0698 };
0699 
0700 struct rdma_sq_send_wqe {
0701     __le32 inv_key_or_imm_data;
0702     __le32 length;
0703     __le32 xrc_srq;
0704     u8 req_type;
0705     u8 flags;
0706 #define RDMA_SQ_SEND_WQE_COMP_FLG_MASK         0x1
0707 #define RDMA_SQ_SEND_WQE_COMP_FLG_SHIFT        0
0708 #define RDMA_SQ_SEND_WQE_RD_FENCE_FLG_MASK     0x1
0709 #define RDMA_SQ_SEND_WQE_RD_FENCE_FLG_SHIFT    1
0710 #define RDMA_SQ_SEND_WQE_INV_FENCE_FLG_MASK    0x1
0711 #define RDMA_SQ_SEND_WQE_INV_FENCE_FLG_SHIFT   2
0712 #define RDMA_SQ_SEND_WQE_SE_FLG_MASK           0x1
0713 #define RDMA_SQ_SEND_WQE_SE_FLG_SHIFT          3
0714 #define RDMA_SQ_SEND_WQE_INLINE_FLG_MASK       0x1
0715 #define RDMA_SQ_SEND_WQE_INLINE_FLG_SHIFT      4
0716 #define RDMA_SQ_SEND_WQE_DIF_ON_HOST_FLG_MASK  0x1
0717 #define RDMA_SQ_SEND_WQE_DIF_ON_HOST_FLG_SHIFT 5
0718 #define RDMA_SQ_SEND_WQE_RESERVED0_MASK        0x3
0719 #define RDMA_SQ_SEND_WQE_RESERVED0_SHIFT       6
0720     u8 wqe_size;
0721     u8 prev_wqe_size;
0722     __le32 reserved1[4];
0723 };
0724 
0725 struct rdma_sq_send_wqe_1st {
0726     __le32 inv_key_or_imm_data;
0727     __le32 length;
0728     __le32 xrc_srq;
0729     u8 req_type;
0730     u8 flags;
0731 #define RDMA_SQ_SEND_WQE_1ST_COMP_FLG_MASK       0x1
0732 #define RDMA_SQ_SEND_WQE_1ST_COMP_FLG_SHIFT      0
0733 #define RDMA_SQ_SEND_WQE_1ST_RD_FENCE_FLG_MASK   0x1
0734 #define RDMA_SQ_SEND_WQE_1ST_RD_FENCE_FLG_SHIFT  1
0735 #define RDMA_SQ_SEND_WQE_1ST_INV_FENCE_FLG_MASK  0x1
0736 #define RDMA_SQ_SEND_WQE_1ST_INV_FENCE_FLG_SHIFT 2
0737 #define RDMA_SQ_SEND_WQE_1ST_SE_FLG_MASK         0x1
0738 #define RDMA_SQ_SEND_WQE_1ST_SE_FLG_SHIFT        3
0739 #define RDMA_SQ_SEND_WQE_1ST_INLINE_FLG_MASK     0x1
0740 #define RDMA_SQ_SEND_WQE_1ST_INLINE_FLG_SHIFT    4
0741 #define RDMA_SQ_SEND_WQE_1ST_RESERVED0_MASK      0x7
0742 #define RDMA_SQ_SEND_WQE_1ST_RESERVED0_SHIFT     5
0743     u8 wqe_size;
0744     u8 prev_wqe_size;
0745 };
0746 
0747 struct rdma_sq_send_wqe_2st {
0748     __le32 reserved1[4];
0749 };
0750 
0751 #endif /* __QED_HSI_RDMA__ */