The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/dev/qlnx/qlnxe/rdma_common.h

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

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

Cache object: b4a56c4155539f2647f8458065dca80c


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.