| /* |
| * 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 <stdint.h> |
| #include <infiniband/kern-abi.h> |
| #include <rdma/ocrdma-abi.h> |
| #include <kernel-abi/ocrdma-abi.h> |
| |
| #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__ */ |