/* * Copyright (C) 2008-2013 Emulex. All rights reserved. * This software is available to you under a choice of one of two * licenses. You may choose to be licensed under the terms of the GNU * General Public License (GPL) Version 2, available from the file * COPYING in the main directory of this source tree, or the * BSD license below: * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * - Redistributions of source code must retain the above * copyright notice, this list of conditions and the following * disclaimer. * * - 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 HOLDER 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. */ #ifndef __OCRDMA_ABI_H__ #define __OCRDMA_ABI_H__ #include #include #include #include #define OCRDMA_ABI_VERSION 2 DECLARE_DRV_CMD(uocrdma_get_context, IB_USER_VERBS_CMD_GET_CONTEXT, empty, ocrdma_alloc_ucontext_resp); DECLARE_DRV_CMD(uocrdma_alloc_pd, IB_USER_VERBS_CMD_ALLOC_PD, ocrdma_alloc_pd_ureq, ocrdma_alloc_pd_uresp); DECLARE_DRV_CMD(uocrdma_create_cq, IB_USER_VERBS_CMD_CREATE_CQ, ocrdma_create_cq_ureq, ocrdma_create_cq_uresp); DECLARE_DRV_CMD(uocrdma_reg_mr, IB_USER_VERBS_CMD_REG_MR, empty, empty); DECLARE_DRV_CMD(uocrdma_create_qp, IB_USER_VERBS_CMD_CREATE_QP, ocrdma_create_qp_ureq, ocrdma_create_qp_uresp); DECLARE_DRV_CMD(uocrdma_create_srq, IB_USER_VERBS_CMD_CREATE_SRQ, empty, ocrdma_create_srq_uresp); #define Bit(_b) (1 << (_b)) #define OCRDMA_MAX_QP 2048 enum { OCRDMA_DB_RQ_OFFSET = 0xE0, OCRDMA_DB_SQ_OFFSET = 0x60, OCRDMA_DB_SRQ_OFFSET = OCRDMA_DB_RQ_OFFSET, OCRDMA_DB_CQ_OFFSET = 0x120 }; #define OCRDMA_DB_CQ_RING_ID_MASK 0x3FF /* bits 0 - 9 */ #define OCRDMA_DB_CQ_RING_ID_EXT_MASK 0x0C00 /* bits 10-11 of qid placing at 12-11 */ #define OCRDMA_DB_CQ_RING_ID_EXT_MASK_SHIFT 0x1 /* qid #2 msbits placing at 12-11 */ #define OCRDMA_DB_CQ_NUM_POPPED_SHIFT (16) /* bits 16 - 28 */ /* Rearm bit */ #define OCRDMA_DB_CQ_REARM_SHIFT (29) /* bit 29 */ /* solicited bit */ #define OCRDMA_DB_CQ_SOLICIT_SHIFT (31) /* bit 31 */ enum OCRDMA_CQE_STATUS { OCRDMA_CQE_SUCCESS = 0, OCRDMA_CQE_LOC_LEN_ERR = 1, OCRDMA_CQE_LOC_QP_OP_ERR = 2, OCRDMA_CQE_LOC_EEC_OP_ERR = 3, OCRDMA_CQE_LOC_PROT_ERR = 4, OCRDMA_CQE_WR_FLUSH_ERR = 5, OCRDMA_CQE_MW_BIND_ERR = 6, OCRDMA_CQE_BAD_RESP_ERR = 7, OCRDMA_CQE_LOC_ACCESS_ERR = 8, OCRDMA_CQE_REM_INV_REQ_ERR = 9, OCRDMA_CQE_REM_ACCESS_ERR = 0xa, OCRDMA_CQE_REM_OP_ERR = 0xb, OCRDMA_CQE_RETRY_EXC_ERR = 0xc, OCRDMA_CQE_RNR_RETRY_EXC_ERR = 0xd, OCRDMA_CQE_LOC_RDD_VIOL_ERR = 0xe, OCRDMA_CQE_REM_INV_RD_REQ_ERR = 0xf, OCRDMA_CQE_REM_ABORT_ERR = 0x10, OCRDMA_CQE_INV_EECN_ERR = 0x11, OCRDMA_CQE_INV_EEC_STATE_ERR = 0x12, OCRDMA_CQE_FATAL_ERR = 0x13, OCRDMA_CQE_RESP_TIMEOUT_ERR = 0x14, OCRDMA_CQE_GENERAL_ERR }; enum { /* w0 */ OCRDMA_CQE_WQEIDX_SHIFT = 0, OCRDMA_CQE_WQEIDX_MASK = 0xFFFF, /* w1 */ OCRDMA_CQE_UD_XFER_LEN_SHIFT = 16, OCRDMA_CQE_PKEY_SHIFT = 0, OCRDMA_CQE_PKEY_MASK = 0xFFFF, /* w2 */ OCRDMA_CQE_QPN_SHIFT = 0, OCRDMA_CQE_QPN_MASK = 0x0000FFFF, OCRDMA_CQE_BUFTAG_SHIFT = 16, OCRDMA_CQE_BUFTAG_MASK = 0xFFFF << OCRDMA_CQE_BUFTAG_SHIFT, /* w3 */ OCRDMA_CQE_UD_STATUS_SHIFT = 24, OCRDMA_CQE_UD_STATUS_MASK = 0x7 << OCRDMA_CQE_UD_STATUS_SHIFT, OCRDMA_CQE_STATUS_SHIFT = 16, OCRDMA_CQE_STATUS_MASK = (0xFF << OCRDMA_CQE_STATUS_SHIFT), OCRDMA_CQE_VALID = Bit(31), OCRDMA_CQE_INVALIDATE = Bit(30), OCRDMA_CQE_QTYPE = Bit(29), OCRDMA_CQE_IMM = Bit(28), OCRDMA_CQE_WRITE_IMM = Bit(27), OCRDMA_CQE_QTYPE_SQ = 0, OCRDMA_CQE_QTYPE_RQ = 1, OCRDMA_CQE_SRCQP_MASK = 0xFFFFFF }; struct ocrdma_cqe { union { /* w0 to w2 */ struct { __le32 wqeidx; __le32 bytes_xfered; __le32 qpn; } wq; struct { __le32 lkey_immdt; __le32 rxlen; __le32 buftag_qpn; } rq; struct { __le32 lkey_immdt; __le32 rxlen_pkey; __le32 buftag_qpn; } ud; struct { __le32 word_0; __le32 word_1; __le32 qpn; } cmn; }; __le32 flags_status_srcqpn; /* w3 */ } __attribute__ ((packed)); struct ocrdma_sge { uint32_t addr_hi; uint32_t addr_lo; uint32_t lrkey; uint32_t len; } __attribute__ ((packed)); enum { OCRDMA_WQE_OPCODE_SHIFT = 0, OCRDMA_WQE_OPCODE_MASK = 0x0000001F, OCRDMA_WQE_FLAGS_SHIFT = 5, OCRDMA_WQE_TYPE_SHIFT = 16, OCRDMA_WQE_TYPE_MASK = 0x00030000, OCRDMA_WQE_SIZE_SHIFT = 18, OCRDMA_WQE_SIZE_MASK = 0xFF, OCRDMA_WQE_NXT_WQE_SIZE_SHIFT = 25, OCRDMA_WQE_LKEY_FLAGS_SHIFT = 0, OCRDMA_WQE_LKEY_FLAGS_MASK = 0xF }; enum { OCRDMA_FLAG_SIG = 0x1, OCRDMA_FLAG_INV = 0x2, OCRDMA_FLAG_FENCE_L = 0x4, OCRDMA_FLAG_FENCE_R = 0x8, OCRDMA_FLAG_SOLICIT = 0x10, OCRDMA_FLAG_IMM = 0x20, OCRDMA_FLAG_AH_VLAN_PR = 0x40, /* Stag flags */ OCRDMA_LKEY_FLAG_LOCAL_WR = 0x1, OCRDMA_LKEY_FLAG_REMOTE_RD = 0x2, OCRDMA_LKEY_FLAG_REMOTE_WR = 0x4, OCRDMA_LKEY_FLAG_VATO = 0x8 }; enum { OCRDMA_TYPE_INLINE = 0x0, OCRDMA_TYPE_LKEY = 0x1 }; #define OCRDMA_CQE_QTYPE_RQ 1 #define OCRDMA_CQE_QTYPE_SQ 0 enum OCRDMA_WQE_OPCODE { OCRDMA_WRITE = 0x06, OCRDMA_READ = 0x0C, OCRDMA_RESV0 = 0x02, OCRDMA_SEND = 0x00, OCRDMA_BIND_MW = 0x08, OCRDMA_RESV1 = 0x0A, OCRDMA_LKEY_INV = 0x15, }; #define OCRDMA_WQE_STRIDE 8 #define OCRDMA_WQE_ALIGN_BYTES 16 /* header WQE for all the SQ and RQ operations */ struct ocrdma_hdr_wqe { uint32_t cw; union { uint32_t rsvd_tag; uint32_t rsvd_stag_flags; }; union { uint32_t immdt; uint32_t lkey; }; uint32_t total_len; } __attribute__ ((packed)); struct ocrdma_hdr_wqe_le { __le32 cw; union { __le32 rsvd_tag; __le32 rsvd_stag_flags; }; union { __le32 immdt; __le32 lkey; }; __le32 total_len; } __attribute__ ((packed)); struct ocrdma_ewqe_atomic { uint32_t ra_hi; uint32_t ra_lo; uint32_t rkey; uint32_t rlen; uint32_t swap_add_hi; uint32_t swap_add_lo; uint32_t compare_hi; uint32_t compare_lo; struct ocrdma_sge sge; } __attribute__ ((packed)); struct ocrdma_ewqe_ud_hdr { uint32_t rsvd_dest_qpn; uint32_t qkey; uint32_t rsvd_ahid; uint32_t hdr_type; } __attribute__ ((packed)); #endif /* __OCRDMA_ABI_H__ */