/* * Copyright (c) 2018-2019 Cavium, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * $FreeBSD$ * */ #ifndef __QLNXR_ROCE_H__ #define __QLNXR_ROCE_H__ /* * roce completion notification queue element */ struct roce_cnqe { struct regpair cq_handle; }; struct roce_cqe_responder { struct regpair srq_wr_id; struct regpair qp_handle; __le32 imm_data_or_inv_r_Key; __le32 length; __le32 reserved0; __le16 rq_cons; u8 flags; #define ROCE_CQE_RESPONDER_TOGGLE_BIT_MASK 0x1 #define ROCE_CQE_RESPONDER_TOGGLE_BIT_SHIFT 0 #define ROCE_CQE_RESPONDER_TYPE_MASK 0x3 #define ROCE_CQE_RESPONDER_TYPE_SHIFT 1 #define ROCE_CQE_RESPONDER_INV_FLG_MASK 0x1 #define ROCE_CQE_RESPONDER_INV_FLG_SHIFT 3 #define ROCE_CQE_RESPONDER_IMM_FLG_MASK 0x1 #define ROCE_CQE_RESPONDER_IMM_FLG_SHIFT 4 #define ROCE_CQE_RESPONDER_RDMA_FLG_MASK 0x1 #define ROCE_CQE_RESPONDER_RDMA_FLG_SHIFT 5 #define ROCE_CQE_RESPONDER_RESERVED2_MASK 0x3 #define ROCE_CQE_RESPONDER_RESERVED2_SHIFT 6 u8 status; }; struct roce_cqe_requester { __le16 sq_cons; __le16 reserved0; __le32 reserved1; struct regpair qp_handle; struct regpair reserved2; __le32 reserved3; __le16 reserved4; u8 flags; #define ROCE_CQE_REQUESTER_TOGGLE_BIT_MASK 0x1 #define ROCE_CQE_REQUESTER_TOGGLE_BIT_SHIFT 0 #define ROCE_CQE_REQUESTER_TYPE_MASK 0x3 #define ROCE_CQE_REQUESTER_TYPE_SHIFT 1 #define ROCE_CQE_REQUESTER_RESERVED5_MASK 0x1F #define ROCE_CQE_REQUESTER_RESERVED5_SHIFT 3 u8 status; }; struct roce_cqe_common { struct regpair reserved0; struct regpair qp_handle; __le16 reserved1[7]; u8 flags; #define ROCE_CQE_COMMON_TOGGLE_BIT_MASK 0x1 #define ROCE_CQE_COMMON_TOGGLE_BIT_SHIFT 0 #define ROCE_CQE_COMMON_TYPE_MASK 0x3 #define ROCE_CQE_COMMON_TYPE_SHIFT 1 #define ROCE_CQE_COMMON_RESERVED2_MASK 0x1F #define ROCE_CQE_COMMON_RESERVED2_SHIFT 3 u8 status; }; /* * roce completion queue element */ union roce_cqe { struct roce_cqe_responder resp; struct roce_cqe_requester req; struct roce_cqe_common cmn; }; /* * CQE requester status enumeration */ enum roce_cqe_requester_status_enum { ROCE_CQE_REQ_STS_OK, ROCE_CQE_REQ_STS_BAD_RESPONSE_ERR, ROCE_CQE_REQ_STS_LOCAL_LENGTH_ERR, ROCE_CQE_REQ_STS_LOCAL_QP_OPERATION_ERR, ROCE_CQE_REQ_STS_LOCAL_PROTECTION_ERR, ROCE_CQE_REQ_STS_MEMORY_MGT_OPERATION_ERR, ROCE_CQE_REQ_STS_REMOTE_INVALID_REQUEST_ERR, ROCE_CQE_REQ_STS_REMOTE_ACCESS_ERR, ROCE_CQE_REQ_STS_REMOTE_OPERATION_ERR, ROCE_CQE_REQ_STS_RNR_NAK_RETRY_CNT_ERR, ROCE_CQE_REQ_STS_TRANSPORT_RETRY_CNT_ERR, ROCE_CQE_REQ_STS_WORK_REQUEST_FLUSHED_ERR, MAX_ROCE_CQE_REQUESTER_STATUS_ENUM }; /* * CQE responder status enumeration */ enum roce_cqe_responder_status_enum { ROCE_CQE_RESP_STS_OK, ROCE_CQE_RESP_STS_LOCAL_ACCESS_ERR, ROCE_CQE_RESP_STS_LOCAL_LENGTH_ERR, ROCE_CQE_RESP_STS_LOCAL_QP_OPERATION_ERR, ROCE_CQE_RESP_STS_LOCAL_PROTECTION_ERR, ROCE_CQE_RESP_STS_MEMORY_MGT_OPERATION_ERR, ROCE_CQE_RESP_STS_REMOTE_INVALID_REQUEST_ERR, ROCE_CQE_RESP_STS_WORK_REQUEST_FLUSHED_ERR, MAX_ROCE_CQE_RESPONDER_STATUS_ENUM }; /* * CQE type enumeration */ enum roce_cqe_type { ROCE_CQE_TYPE_REQUESTER, ROCE_CQE_TYPE_RESPONDER_RQ, ROCE_CQE_TYPE_RESPONDER_SRQ, ROCE_CQE_TYPE_INVALID, MAX_ROCE_CQE_TYPE }; /* * memory window type enumeration */ enum roce_mw_type { ROCE_MW_TYPE_1, ROCE_MW_TYPE_2A, MAX_ROCE_MW_TYPE }; struct roce_rq_sge { struct regpair addr; __le32 length; __le32 flags; #define ROCE_RQ_SGE_L_KEY_MASK 0x3FFFFFF #define ROCE_RQ_SGE_L_KEY_SHIFT 0 #define ROCE_RQ_SGE_NUM_SGES_MASK 0x7 #define ROCE_RQ_SGE_NUM_SGES_SHIFT 26 #define ROCE_RQ_SGE_RESERVED0_MASK 0x7 #define ROCE_RQ_SGE_RESERVED0_SHIFT 29 }; struct roce_sq_atomic_wqe { struct regpair remote_va; __le32 xrc_srq; u8 req_type; u8 flags; #define ROCE_SQ_ATOMIC_WQE_COMP_FLG_MASK 0x1 #define ROCE_SQ_ATOMIC_WQE_COMP_FLG_SHIFT 0 #define ROCE_SQ_ATOMIC_WQE_RD_FENCE_FLG_MASK 0x1 #define ROCE_SQ_ATOMIC_WQE_RD_FENCE_FLG_SHIFT 1 #define ROCE_SQ_ATOMIC_WQE_INV_FENCE_FLG_MASK 0x1 #define ROCE_SQ_ATOMIC_WQE_INV_FENCE_FLG_SHIFT 2 #define ROCE_SQ_ATOMIC_WQE_SE_FLG_MASK 0x1 #define ROCE_SQ_ATOMIC_WQE_SE_FLG_SHIFT 3 #define ROCE_SQ_ATOMIC_WQE_INLINE_FLG_MASK 0x1 #define ROCE_SQ_ATOMIC_WQE_INLINE_FLG_SHIFT 4 #define ROCE_SQ_ATOMIC_WQE_RESERVED0_MASK 0x7 #define ROCE_SQ_ATOMIC_WQE_RESERVED0_SHIFT 5 u8 reserved1; u8 prev_wqe_size; struct regpair swap_data; __le32 r_key; __le32 reserved2; struct regpair cmp_data; struct regpair reserved3; }; /* * First element (16 bytes) of atomic wqe */ struct roce_sq_atomic_wqe_1st { struct regpair remote_va; __le32 xrc_srq; u8 req_type; u8 flags; #define ROCE_SQ_ATOMIC_WQE_1ST_COMP_FLG_MASK 0x1 #define ROCE_SQ_ATOMIC_WQE_1ST_COMP_FLG_SHIFT 0 #define ROCE_SQ_ATOMIC_WQE_1ST_RD_FENCE_FLG_MASK 0x1 #define ROCE_SQ_ATOMIC_WQE_1ST_RD_FENCE_FLG_SHIFT 1 #define ROCE_SQ_ATOMIC_WQE_1ST_INV_FENCE_FLG_MASK 0x1 #define ROCE_SQ_ATOMIC_WQE_1ST_INV_FENCE_FLG_SHIFT 2 #define ROCE_SQ_ATOMIC_WQE_1ST_SE_FLG_MASK 0x1 #define ROCE_SQ_ATOMIC_WQE_1ST_SE_FLG_SHIFT 3 #define ROCE_SQ_ATOMIC_WQE_1ST_INLINE_FLG_MASK 0x1 #define ROCE_SQ_ATOMIC_WQE_1ST_INLINE_FLG_SHIFT 4 #define ROCE_SQ_ATOMIC_WQE_1ST_RESERVED0_MASK 0x7 #define ROCE_SQ_ATOMIC_WQE_1ST_RESERVED0_SHIFT 5 u8 reserved1; u8 prev_wqe_size; }; /* * Second element (16 bytes) of atomic wqe */ struct roce_sq_atomic_wqe_2nd { struct regpair swap_data; __le32 r_key; __le32 reserved2; }; /* * Third element (16 bytes) of atomic wqe */ struct roce_sq_atomic_wqe_3rd { struct regpair cmp_data; struct regpair reserved3; }; struct roce_sq_bind_wqe { struct regpair addr; __le32 l_key; u8 req_type; u8 flags; #define ROCE_SQ_BIND_WQE_COMP_FLG_MASK 0x1 #define ROCE_SQ_BIND_WQE_COMP_FLG_SHIFT 0 #define ROCE_SQ_BIND_WQE_RD_FENCE_FLG_MASK 0x1 #define ROCE_SQ_BIND_WQE_RD_FENCE_FLG_SHIFT 1 #define ROCE_SQ_BIND_WQE_INV_FENCE_FLG_MASK 0x1 #define ROCE_SQ_BIND_WQE_INV_FENCE_FLG_SHIFT 2 #define ROCE_SQ_BIND_WQE_SE_FLG_MASK 0x1 #define ROCE_SQ_BIND_WQE_SE_FLG_SHIFT 3 #define ROCE_SQ_BIND_WQE_INLINE_FLG_MASK 0x1 #define ROCE_SQ_BIND_WQE_INLINE_FLG_SHIFT 4 #define ROCE_SQ_BIND_WQE_RESERVED0_MASK 0x7 #define ROCE_SQ_BIND_WQE_RESERVED0_SHIFT 5 u8 access_ctrl; #define ROCE_SQ_BIND_WQE_REMOTE_READ_MASK 0x1 #define ROCE_SQ_BIND_WQE_REMOTE_READ_SHIFT 0 #define ROCE_SQ_BIND_WQE_REMOTE_WRITE_MASK 0x1 #define ROCE_SQ_BIND_WQE_REMOTE_WRITE_SHIFT 1 #define ROCE_SQ_BIND_WQE_ENABLE_ATOMIC_MASK 0x1 #define ROCE_SQ_BIND_WQE_ENABLE_ATOMIC_SHIFT 2 #define ROCE_SQ_BIND_WQE_LOCAL_READ_MASK 0x1 #define ROCE_SQ_BIND_WQE_LOCAL_READ_SHIFT 3 #define ROCE_SQ_BIND_WQE_LOCAL_WRITE_MASK 0x1 #define ROCE_SQ_BIND_WQE_LOCAL_WRITE_SHIFT 4 #define ROCE_SQ_BIND_WQE_RESERVED1_MASK 0x7 #define ROCE_SQ_BIND_WQE_RESERVED1_SHIFT 5 u8 prev_wqe_size; u8 bind_ctrl; #define ROCE_SQ_BIND_WQE_ZERO_BASED_MASK 0x1 #define ROCE_SQ_BIND_WQE_ZERO_BASED_SHIFT 0 #define ROCE_SQ_BIND_WQE_MW_TYPE_MASK 0x1 #define ROCE_SQ_BIND_WQE_MW_TYPE_SHIFT 1 #define ROCE_SQ_BIND_WQE_RESERVED2_MASK 0x3F #define ROCE_SQ_BIND_WQE_RESERVED2_SHIFT 2 u8 reserved3[2]; u8 length_hi; __le32 length_lo; __le32 parent_l_key; __le32 reserved6; }; /* * First element (16 bytes) of bind wqe */ struct roce_sq_bind_wqe_1st { struct regpair addr; __le32 l_key; u8 req_type; u8 flags; #define ROCE_SQ_BIND_WQE_1ST_COMP_FLG_MASK 0x1 #define ROCE_SQ_BIND_WQE_1ST_COMP_FLG_SHIFT 0 #define ROCE_SQ_BIND_WQE_1ST_RD_FENCE_FLG_MASK 0x1 #define ROCE_SQ_BIND_WQE_1ST_RD_FENCE_FLG_SHIFT 1 #define ROCE_SQ_BIND_WQE_1ST_INV_FENCE_FLG_MASK 0x1 #define ROCE_SQ_BIND_WQE_1ST_INV_FENCE_FLG_SHIFT 2 #define ROCE_SQ_BIND_WQE_1ST_SE_FLG_MASK 0x1 #define ROCE_SQ_BIND_WQE_1ST_SE_FLG_SHIFT 3 #define ROCE_SQ_BIND_WQE_1ST_INLINE_FLG_MASK 0x1 #define ROCE_SQ_BIND_WQE_1ST_INLINE_FLG_SHIFT 4 #define ROCE_SQ_BIND_WQE_1ST_RESERVED0_MASK 0x7 #define ROCE_SQ_BIND_WQE_1ST_RESERVED0_SHIFT 5 u8 access_ctrl; #define ROCE_SQ_BIND_WQE_1ST_REMOTE_READ_MASK 0x1 #define ROCE_SQ_BIND_WQE_1ST_REMOTE_READ_SHIFT 0 #define ROCE_SQ_BIND_WQE_1ST_REMOTE_WRITE_MASK 0x1 #define ROCE_SQ_BIND_WQE_1ST_REMOTE_WRITE_SHIFT 1 #define ROCE_SQ_BIND_WQE_1ST_ENABLE_ATOMIC_MASK 0x1 #define ROCE_SQ_BIND_WQE_1ST_ENABLE_ATOMIC_SHIFT 2 #define ROCE_SQ_BIND_WQE_1ST_LOCAL_READ_MASK 0x1 #define ROCE_SQ_BIND_WQE_1ST_LOCAL_READ_SHIFT 3 #define ROCE_SQ_BIND_WQE_1ST_LOCAL_WRITE_MASK 0x1 #define ROCE_SQ_BIND_WQE_1ST_LOCAL_WRITE_SHIFT 4 #define ROCE_SQ_BIND_WQE_1ST_RESERVED1_MASK 0x7 #define ROCE_SQ_BIND_WQE_1ST_RESERVED1_SHIFT 5 u8 prev_wqe_size; }; /* * Second element (16 bytes) of bind wqe */ struct roce_sq_bind_wqe_2nd { u8 bind_ctrl; #define ROCE_SQ_BIND_WQE_2ND_ZERO_BASED_MASK 0x1 #define ROCE_SQ_BIND_WQE_2ND_ZERO_BASED_SHIFT 0 #define ROCE_SQ_BIND_WQE_2ND_MW_TYPE_MASK 0x1 #define ROCE_SQ_BIND_WQE_2ND_MW_TYPE_SHIFT 1 #define ROCE_SQ_BIND_WQE_2ND_RESERVED2_MASK 0x3F #define ROCE_SQ_BIND_WQE_2ND_RESERVED2_SHIFT 2 u8 reserved3[2]; u8 length_hi; __le32 length_lo; __le32 parent_l_key; __le32 reserved6; }; /* * Structure with only the SQ WQE common fields. Size is of one SQ element (16B) */ struct roce_sq_common_wqe { __le32 reserved1[3]; u8 req_type; u8 flags; #define ROCE_SQ_COMMON_WQE_COMP_FLG_MASK 0x1 #define ROCE_SQ_COMMON_WQE_COMP_FLG_SHIFT 0 #define ROCE_SQ_COMMON_WQE_RD_FENCE_FLG_MASK 0x1 #define ROCE_SQ_COMMON_WQE_RD_FENCE_FLG_SHIFT 1 #define ROCE_SQ_COMMON_WQE_INV_FENCE_FLG_MASK 0x1 #define ROCE_SQ_COMMON_WQE_INV_FENCE_FLG_SHIFT 2 #define ROCE_SQ_COMMON_WQE_SE_FLG_MASK 0x1 #define ROCE_SQ_COMMON_WQE_SE_FLG_SHIFT 3 #define ROCE_SQ_COMMON_WQE_INLINE_FLG_MASK 0x1 #define ROCE_SQ_COMMON_WQE_INLINE_FLG_SHIFT 4 #define ROCE_SQ_COMMON_WQE_RESERVED0_MASK 0x7 #define ROCE_SQ_COMMON_WQE_RESERVED0_SHIFT 5 u8 reserved2; u8 prev_wqe_size; }; struct roce_sq_fmr_wqe { struct regpair addr; __le32 l_key; u8 req_type; u8 flags; #define ROCE_SQ_FMR_WQE_COMP_FLG_MASK 0x1 #define ROCE_SQ_FMR_WQE_COMP_FLG_SHIFT 0 #define ROCE_SQ_FMR_WQE_RD_FENCE_FLG_MASK 0x1 #define ROCE_SQ_FMR_WQE_RD_FENCE_FLG_SHIFT 1 #define ROCE_SQ_FMR_WQE_INV_FENCE_FLG_MASK 0x1 #define ROCE_SQ_FMR_WQE_INV_FENCE_FLG_SHIFT 2 #define ROCE_SQ_FMR_WQE_SE_FLG_MASK 0x1 #define ROCE_SQ_FMR_WQE_SE_FLG_SHIFT 3 #define ROCE_SQ_FMR_WQE_INLINE_FLG_MASK 0x1 #define ROCE_SQ_FMR_WQE_INLINE_FLG_SHIFT 4 #define ROCE_SQ_FMR_WQE_RESERVED0_MASK 0x7 #define ROCE_SQ_FMR_WQE_RESERVED0_SHIFT 5 u8 access_ctrl; #define ROCE_SQ_FMR_WQE_REMOTE_READ_MASK 0x1 #define ROCE_SQ_FMR_WQE_REMOTE_READ_SHIFT 0 #define ROCE_SQ_FMR_WQE_REMOTE_WRITE_MASK 0x1 #define ROCE_SQ_FMR_WQE_REMOTE_WRITE_SHIFT 1 #define ROCE_SQ_FMR_WQE_ENABLE_ATOMIC_MASK 0x1 #define ROCE_SQ_FMR_WQE_ENABLE_ATOMIC_SHIFT 2 #define ROCE_SQ_FMR_WQE_LOCAL_READ_MASK 0x1 #define ROCE_SQ_FMR_WQE_LOCAL_READ_SHIFT 3 #define ROCE_SQ_FMR_WQE_LOCAL_WRITE_MASK 0x1 #define ROCE_SQ_FMR_WQE_LOCAL_WRITE_SHIFT 4 #define ROCE_SQ_FMR_WQE_RESERVED1_MASK 0x7 #define ROCE_SQ_FMR_WQE_RESERVED1_SHIFT 5 u8 prev_wqe_size; u8 fmr_ctrl; #define ROCE_SQ_FMR_WQE_PAGE_SIZE_LOG_MASK 0x1F #define ROCE_SQ_FMR_WQE_PAGE_SIZE_LOG_SHIFT 0 #define ROCE_SQ_FMR_WQE_ZERO_BASED_MASK 0x1 #define ROCE_SQ_FMR_WQE_ZERO_BASED_SHIFT 5 #define ROCE_SQ_FMR_WQE_BIND_EN_MASK 0x1 #define ROCE_SQ_FMR_WQE_BIND_EN_SHIFT 6 #define ROCE_SQ_FMR_WQE_RESERVED2_MASK 0x1 #define ROCE_SQ_FMR_WQE_RESERVED2_SHIFT 7 u8 reserved3[2]; u8 length_hi; __le32 length_lo; struct regpair pbl_addr; }; /* * First element (16 bytes) of fmr wqe */ struct roce_sq_fmr_wqe_1st { struct regpair addr; __le32 l_key; u8 req_type; u8 flags; #define ROCE_SQ_FMR_WQE_1ST_COMP_FLG_MASK 0x1 #define ROCE_SQ_FMR_WQE_1ST_COMP_FLG_SHIFT 0 #define ROCE_SQ_FMR_WQE_1ST_RD_FENCE_FLG_MASK 0x1 #define ROCE_SQ_FMR_WQE_1ST_RD_FENCE_FLG_SHIFT 1 #define ROCE_SQ_FMR_WQE_1ST_INV_FENCE_FLG_MASK 0x1 #define ROCE_SQ_FMR_WQE_1ST_INV_FENCE_FLG_SHIFT 2 #define ROCE_SQ_FMR_WQE_1ST_SE_FLG_MASK 0x1 #define ROCE_SQ_FMR_WQE_1ST_SE_FLG_SHIFT 3 #define ROCE_SQ_FMR_WQE_1ST_INLINE_FLG_MASK 0x1 #define ROCE_SQ_FMR_WQE_1ST_INLINE_FLG_SHIFT 4 #define ROCE_SQ_FMR_WQE_1ST_RESERVED0_MASK 0x7 #define ROCE_SQ_FMR_WQE_1ST_RESERVED0_SHIFT 5 u8 access_ctrl; #define ROCE_SQ_FMR_WQE_1ST_REMOTE_READ_MASK 0x1 #define ROCE_SQ_FMR_WQE_1ST_REMOTE_READ_SHIFT 0 #define ROCE_SQ_FMR_WQE_1ST_REMOTE_WRITE_MASK 0x1 #define ROCE_SQ_FMR_WQE_1ST_REMOTE_WRITE_SHIFT 1 #define ROCE_SQ_FMR_WQE_1ST_ENABLE_ATOMIC_MASK 0x1 #define ROCE_SQ_FMR_WQE_1ST_ENABLE_ATOMIC_SHIFT 2 #define ROCE_SQ_FMR_WQE_1ST_LOCAL_READ_MASK 0x1 #define ROCE_SQ_FMR_WQE_1ST_LOCAL_READ_SHIFT 3 #define ROCE_SQ_FMR_WQE_1ST_LOCAL_WRITE_MASK 0x1 #define ROCE_SQ_FMR_WQE_1ST_LOCAL_WRITE_SHIFT 4 #define ROCE_SQ_FMR_WQE_1ST_RESERVED1_MASK 0x7 #define ROCE_SQ_FMR_WQE_1ST_RESERVED1_SHIFT 5 u8 prev_wqe_size; }; /* * Second element (16 bytes) of fmr wqe */ struct roce_sq_fmr_wqe_2nd { u8 fmr_ctrl; #define ROCE_SQ_FMR_WQE_2ND_PAGE_SIZE_LOG_MASK 0x1F #define ROCE_SQ_FMR_WQE_2ND_PAGE_SIZE_LOG_SHIFT 0 #define ROCE_SQ_FMR_WQE_2ND_ZERO_BASED_MASK 0x1 #define ROCE_SQ_FMR_WQE_2ND_ZERO_BASED_SHIFT 5 #define ROCE_SQ_FMR_WQE_2ND_BIND_EN_MASK 0x1 #define ROCE_SQ_FMR_WQE_2ND_BIND_EN_SHIFT 6 #define ROCE_SQ_FMR_WQE_2ND_RESERVED2_MASK 0x1 #define ROCE_SQ_FMR_WQE_2ND_RESERVED2_SHIFT 7 u8 reserved3[2]; u8 length_hi; __le32 length_lo; struct regpair pbl_addr; }; struct roce_sq_local_inv_wqe { struct regpair reserved; __le32 inv_l_key; u8 req_type; u8 flags; #define ROCE_SQ_LOCAL_INV_WQE_COMP_FLG_MASK 0x1 #define ROCE_SQ_LOCAL_INV_WQE_COMP_FLG_SHIFT 0 #define ROCE_SQ_LOCAL_INV_WQE_RD_FENCE_FLG_MASK 0x1 #define ROCE_SQ_LOCAL_INV_WQE_RD_FENCE_FLG_SHIFT 1 #define ROCE_SQ_LOCAL_INV_WQE_INV_FENCE_FLG_MASK 0x1 #define ROCE_SQ_LOCAL_INV_WQE_INV_FENCE_FLG_SHIFT 2 #define ROCE_SQ_LOCAL_INV_WQE_SE_FLG_MASK 0x1 #define ROCE_SQ_LOCAL_INV_WQE_SE_FLG_SHIFT 3 #define ROCE_SQ_LOCAL_INV_WQE_INLINE_FLG_MASK 0x1 #define ROCE_SQ_LOCAL_INV_WQE_INLINE_FLG_SHIFT 4 #define ROCE_SQ_LOCAL_INV_WQE_RESERVED0_MASK 0x7 #define ROCE_SQ_LOCAL_INV_WQE_RESERVED0_SHIFT 5 u8 reserved1; u8 prev_wqe_size; }; struct roce_sq_rdma_wqe { __le32 imm_data; __le32 length; __le32 xrc_srq; u8 req_type; u8 flags; #define ROCE_SQ_RDMA_WQE_COMP_FLG_MASK 0x1 #define ROCE_SQ_RDMA_WQE_COMP_FLG_SHIFT 0 #define ROCE_SQ_RDMA_WQE_RD_FENCE_FLG_MASK 0x1 #define ROCE_SQ_RDMA_WQE_RD_FENCE_FLG_SHIFT 1 #define ROCE_SQ_RDMA_WQE_INV_FENCE_FLG_MASK 0x1 #define ROCE_SQ_RDMA_WQE_INV_FENCE_FLG_SHIFT 2 #define ROCE_SQ_RDMA_WQE_SE_FLG_MASK 0x1 #define ROCE_SQ_RDMA_WQE_SE_FLG_SHIFT 3 #define ROCE_SQ_RDMA_WQE_INLINE_FLG_MASK 0x1 #define ROCE_SQ_RDMA_WQE_INLINE_FLG_SHIFT 4 #define ROCE_SQ_RDMA_WQE_RESERVED0_MASK 0x7 #define ROCE_SQ_RDMA_WQE_RESERVED0_SHIFT 5 u8 wqe_size; u8 prev_wqe_size; struct regpair remote_va; __le32 r_key; __le32 reserved1; }; /* * First element (16 bytes) of rdma wqe */ struct roce_sq_rdma_wqe_1st { __le32 imm_data; __le32 length; __le32 xrc_srq; u8 req_type; u8 flags; #define ROCE_SQ_RDMA_WQE_1ST_COMP_FLG_MASK 0x1 #define ROCE_SQ_RDMA_WQE_1ST_COMP_FLG_SHIFT 0 #define ROCE_SQ_RDMA_WQE_1ST_RD_FENCE_FLG_MASK 0x1 #define ROCE_SQ_RDMA_WQE_1ST_RD_FENCE_FLG_SHIFT 1 #define ROCE_SQ_RDMA_WQE_1ST_INV_FENCE_FLG_MASK 0x1 #define ROCE_SQ_RDMA_WQE_1ST_INV_FENCE_FLG_SHIFT 2 #define ROCE_SQ_RDMA_WQE_1ST_SE_FLG_MASK 0x1 #define ROCE_SQ_RDMA_WQE_1ST_SE_FLG_SHIFT 3 #define ROCE_SQ_RDMA_WQE_1ST_INLINE_FLG_MASK 0x1 #define ROCE_SQ_RDMA_WQE_1ST_INLINE_FLG_SHIFT 4 #define ROCE_SQ_RDMA_WQE_1ST_RESERVED0_MASK 0x7 #define ROCE_SQ_RDMA_WQE_1ST_RESERVED0_SHIFT 5 u8 wqe_size; u8 prev_wqe_size; }; /* * Second element (16 bytes) of rdma wqe */ struct roce_sq_rdma_wqe_2nd { struct regpair remote_va; __le32 r_key; __le32 reserved1; }; /* * SQ WQE req type enumeration */ enum roce_sq_req_type { ROCE_SQ_REQ_TYPE_SEND, ROCE_SQ_REQ_TYPE_SEND_WITH_IMM, ROCE_SQ_REQ_TYPE_SEND_WITH_INVALIDATE, ROCE_SQ_REQ_TYPE_RDMA_WR, ROCE_SQ_REQ_TYPE_RDMA_WR_WITH_IMM, ROCE_SQ_REQ_TYPE_RDMA_RD, ROCE_SQ_REQ_TYPE_ATOMIC_CMP_AND_SWAP, ROCE_SQ_REQ_TYPE_ATOMIC_ADD, ROCE_SQ_REQ_TYPE_LOCAL_INVALIDATE, ROCE_SQ_REQ_TYPE_FAST_MR, ROCE_SQ_REQ_TYPE_BIND, ROCE_SQ_REQ_TYPE_INVALID, MAX_ROCE_SQ_REQ_TYPE }; struct roce_sq_send_wqe { __le32 inv_key_or_imm_data; __le32 length; __le32 xrc_srq; u8 req_type; u8 flags; #define ROCE_SQ_SEND_WQE_COMP_FLG_MASK 0x1 #define ROCE_SQ_SEND_WQE_COMP_FLG_SHIFT 0 #define ROCE_SQ_SEND_WQE_RD_FENCE_FLG_MASK 0x1 #define ROCE_SQ_SEND_WQE_RD_FENCE_FLG_SHIFT 1 #define ROCE_SQ_SEND_WQE_INV_FENCE_FLG_MASK 0x1 #define ROCE_SQ_SEND_WQE_INV_FENCE_FLG_SHIFT 2 #define ROCE_SQ_SEND_WQE_SE_FLG_MASK 0x1 #define ROCE_SQ_SEND_WQE_SE_FLG_SHIFT 3 #define ROCE_SQ_SEND_WQE_INLINE_FLG_MASK 0x1 #define ROCE_SQ_SEND_WQE_INLINE_FLG_SHIFT 4 #define ROCE_SQ_SEND_WQE_RESERVED0_MASK 0x7 #define ROCE_SQ_SEND_WQE_RESERVED0_SHIFT 5 u8 wqe_size; u8 prev_wqe_size; }; struct roce_sq_sge { __le32 length; struct regpair addr; __le32 l_key; }; struct roce_srq_prod { __le16 prod; }; struct roce_srq_sge { struct regpair addr; __le32 length; __le32 l_key; struct regpair wr_id; u8 flags; #define ROCE_SRQ_SGE_NUM_SGES_MASK 0x3 #define ROCE_SRQ_SGE_NUM_SGES_SHIFT 0 #define ROCE_SRQ_SGE_RESERVED0_MASK 0x3F #define ROCE_SRQ_SGE_RESERVED0_SHIFT 2 u8 reserved1; __le16 reserved2; __le32 reserved3; }; /* * RoCE doorbell data for SQ and RQ */ struct roce_pwm_val16_data { __le16 icid; __le16 prod_val; }; union roce_pwm_val16_data_union { struct roce_pwm_val16_data as_struct; __le32 as_dword; }; /* * RoCE doorbell data for CQ */ struct roce_pwm_val32_data { __le16 icid; u8 agg_flags; u8 params; #define ROCE_PWM_VAL32_DATA_AGG_CMD_MASK 0x3 #define ROCE_PWM_VAL32_DATA_AGG_CMD_SHIFT 0 #define ROCE_PWM_VAL32_DATA_BYPASS_EN_MASK 0x1 #define ROCE_PWM_VAL32_DATA_BYPASS_EN_SHIFT 2 #define ROCE_PWM_VAL32_DATA_RESERVED_MASK 0x1F #define ROCE_PWM_VAL32_DATA_RESERVED_SHIFT 3 __le32 cq_cons_val; }; union roce_pwm_val32_data_union { struct roce_pwm_val32_data as_struct; struct regpair as_repair; }; #endif /* __QLNXR_ROCE_H__ */