1d9c52522SMasahiro Yamada /* SPDX-License-Identifier: (GPL-2.0 WITH Linux-syscall-note) or BSD-3-Clause */ 2303ae1cdSBernard Metzler 3303ae1cdSBernard Metzler /* Authors: Bernard Metzler <bmt@zurich.ibm.com> */ 4303ae1cdSBernard Metzler /* Copyright (c) 2008-2019, IBM Corporation */ 5303ae1cdSBernard Metzler 6303ae1cdSBernard Metzler #ifndef _SIW_USER_H 7303ae1cdSBernard Metzler #define _SIW_USER_H 8303ae1cdSBernard Metzler 9303ae1cdSBernard Metzler #include <linux/types.h> 10303ae1cdSBernard Metzler 11303ae1cdSBernard Metzler #define SIW_NODE_DESC_COMMON "Software iWARP stack" 12303ae1cdSBernard Metzler #define SIW_ABI_VERSION 1 13303ae1cdSBernard Metzler #define SIW_MAX_SGE 6 14303ae1cdSBernard Metzler #define SIW_UOBJ_MAX_KEY 0x08FFFF 15303ae1cdSBernard Metzler #define SIW_INVAL_UOBJ_KEY (SIW_UOBJ_MAX_KEY + 1) 16303ae1cdSBernard Metzler 17303ae1cdSBernard Metzler struct siw_uresp_create_cq { 18303ae1cdSBernard Metzler __u32 cq_id; 19303ae1cdSBernard Metzler __u32 num_cqe; 20303ae1cdSBernard Metzler __aligned_u64 cq_key; 21303ae1cdSBernard Metzler }; 22303ae1cdSBernard Metzler 23303ae1cdSBernard Metzler struct siw_uresp_create_qp { 24303ae1cdSBernard Metzler __u32 qp_id; 25303ae1cdSBernard Metzler __u32 num_sqe; 26303ae1cdSBernard Metzler __u32 num_rqe; 27303ae1cdSBernard Metzler __u32 pad; 28303ae1cdSBernard Metzler __aligned_u64 sq_key; 29303ae1cdSBernard Metzler __aligned_u64 rq_key; 30303ae1cdSBernard Metzler }; 31303ae1cdSBernard Metzler 32303ae1cdSBernard Metzler struct siw_ureq_reg_mr { 33303ae1cdSBernard Metzler __u8 stag_key; 34303ae1cdSBernard Metzler __u8 reserved[3]; 35303ae1cdSBernard Metzler __u32 pad; 36303ae1cdSBernard Metzler }; 37303ae1cdSBernard Metzler 38303ae1cdSBernard Metzler struct siw_uresp_reg_mr { 39303ae1cdSBernard Metzler __u32 stag; 40303ae1cdSBernard Metzler __u32 pad; 41303ae1cdSBernard Metzler }; 42303ae1cdSBernard Metzler 43303ae1cdSBernard Metzler struct siw_uresp_create_srq { 44303ae1cdSBernard Metzler __u32 num_rqe; 45303ae1cdSBernard Metzler __u32 pad; 46303ae1cdSBernard Metzler __aligned_u64 srq_key; 47303ae1cdSBernard Metzler }; 48303ae1cdSBernard Metzler 49303ae1cdSBernard Metzler struct siw_uresp_alloc_ctx { 50303ae1cdSBernard Metzler __u32 dev_id; 51303ae1cdSBernard Metzler __u32 pad; 52303ae1cdSBernard Metzler }; 53303ae1cdSBernard Metzler 54303ae1cdSBernard Metzler enum siw_opcode { 55303ae1cdSBernard Metzler SIW_OP_WRITE, 56303ae1cdSBernard Metzler SIW_OP_READ, 57303ae1cdSBernard Metzler SIW_OP_READ_LOCAL_INV, 58303ae1cdSBernard Metzler SIW_OP_SEND, 59303ae1cdSBernard Metzler SIW_OP_SEND_WITH_IMM, 60303ae1cdSBernard Metzler SIW_OP_SEND_REMOTE_INV, 61303ae1cdSBernard Metzler 62303ae1cdSBernard Metzler /* Unsupported */ 63303ae1cdSBernard Metzler SIW_OP_FETCH_AND_ADD, 64303ae1cdSBernard Metzler SIW_OP_COMP_AND_SWAP, 65303ae1cdSBernard Metzler 66303ae1cdSBernard Metzler SIW_OP_RECEIVE, 67303ae1cdSBernard Metzler /* provider internal SQE */ 68303ae1cdSBernard Metzler SIW_OP_READ_RESPONSE, 69303ae1cdSBernard Metzler /* 70303ae1cdSBernard Metzler * below opcodes valid for 71303ae1cdSBernard Metzler * in-kernel clients only 72303ae1cdSBernard Metzler */ 73303ae1cdSBernard Metzler SIW_OP_INVAL_STAG, 74303ae1cdSBernard Metzler SIW_OP_REG_MR, 75303ae1cdSBernard Metzler SIW_NUM_OPCODES 76303ae1cdSBernard Metzler }; 77303ae1cdSBernard Metzler 78303ae1cdSBernard Metzler /* Keep it same as ibv_sge to allow for memcpy */ 79303ae1cdSBernard Metzler struct siw_sge { 80303ae1cdSBernard Metzler __aligned_u64 laddr; 81303ae1cdSBernard Metzler __u32 length; 82303ae1cdSBernard Metzler __u32 lkey; 83303ae1cdSBernard Metzler }; 84303ae1cdSBernard Metzler 85303ae1cdSBernard Metzler /* 86303ae1cdSBernard Metzler * Inline data are kept within the work request itself occupying 87303ae1cdSBernard Metzler * the space of sge[1] .. sge[n]. Therefore, inline data cannot be 88303ae1cdSBernard Metzler * supported if SIW_MAX_SGE is below 2 elements. 89303ae1cdSBernard Metzler */ 90303ae1cdSBernard Metzler #define SIW_MAX_INLINE (sizeof(struct siw_sge) * (SIW_MAX_SGE - 1)) 91303ae1cdSBernard Metzler 92303ae1cdSBernard Metzler #if SIW_MAX_SGE < 2 93303ae1cdSBernard Metzler #error "SIW_MAX_SGE must be at least 2" 94303ae1cdSBernard Metzler #endif 95303ae1cdSBernard Metzler 96303ae1cdSBernard Metzler enum siw_wqe_flags { 97303ae1cdSBernard Metzler SIW_WQE_VALID = 1, 98303ae1cdSBernard Metzler SIW_WQE_INLINE = (1 << 1), 99303ae1cdSBernard Metzler SIW_WQE_SIGNALLED = (1 << 2), 100303ae1cdSBernard Metzler SIW_WQE_SOLICITED = (1 << 3), 101303ae1cdSBernard Metzler SIW_WQE_READ_FENCE = (1 << 4), 102303ae1cdSBernard Metzler SIW_WQE_REM_INVAL = (1 << 5), 103303ae1cdSBernard Metzler SIW_WQE_COMPLETED = (1 << 6) 104303ae1cdSBernard Metzler }; 105303ae1cdSBernard Metzler 106303ae1cdSBernard Metzler /* Send Queue Element */ 107303ae1cdSBernard Metzler struct siw_sqe { 108303ae1cdSBernard Metzler __aligned_u64 id; 109303ae1cdSBernard Metzler __u16 flags; 110303ae1cdSBernard Metzler __u8 num_sge; 111303ae1cdSBernard Metzler /* Contains enum siw_opcode values */ 112303ae1cdSBernard Metzler __u8 opcode; 113303ae1cdSBernard Metzler __u32 rkey; 114303ae1cdSBernard Metzler union { 115303ae1cdSBernard Metzler __aligned_u64 raddr; 116303ae1cdSBernard Metzler __aligned_u64 base_mr; 117303ae1cdSBernard Metzler }; 118303ae1cdSBernard Metzler union { 119303ae1cdSBernard Metzler struct siw_sge sge[SIW_MAX_SGE]; 120303ae1cdSBernard Metzler __aligned_u64 access; 121303ae1cdSBernard Metzler }; 122303ae1cdSBernard Metzler }; 123303ae1cdSBernard Metzler 124303ae1cdSBernard Metzler /* Receive Queue Element */ 125303ae1cdSBernard Metzler struct siw_rqe { 126303ae1cdSBernard Metzler __aligned_u64 id; 127303ae1cdSBernard Metzler __u16 flags; 128303ae1cdSBernard Metzler __u8 num_sge; 129303ae1cdSBernard Metzler /* 130303ae1cdSBernard Metzler * only used by kernel driver, 131303ae1cdSBernard Metzler * ignored if set by user 132303ae1cdSBernard Metzler */ 133303ae1cdSBernard Metzler __u8 opcode; 134303ae1cdSBernard Metzler __u32 unused; 135303ae1cdSBernard Metzler struct siw_sge sge[SIW_MAX_SGE]; 136303ae1cdSBernard Metzler }; 137303ae1cdSBernard Metzler 138303ae1cdSBernard Metzler enum siw_notify_flags { 139303ae1cdSBernard Metzler SIW_NOTIFY_NOT = (0), 140303ae1cdSBernard Metzler SIW_NOTIFY_SOLICITED = (1 << 0), 141303ae1cdSBernard Metzler SIW_NOTIFY_NEXT_COMPLETION = (1 << 1), 142303ae1cdSBernard Metzler SIW_NOTIFY_MISSED_EVENTS = (1 << 2), 143303ae1cdSBernard Metzler SIW_NOTIFY_ALL = SIW_NOTIFY_SOLICITED | SIW_NOTIFY_NEXT_COMPLETION | 144303ae1cdSBernard Metzler SIW_NOTIFY_MISSED_EVENTS 145303ae1cdSBernard Metzler }; 146303ae1cdSBernard Metzler 147303ae1cdSBernard Metzler enum siw_wc_status { 148303ae1cdSBernard Metzler SIW_WC_SUCCESS, 149303ae1cdSBernard Metzler SIW_WC_LOC_LEN_ERR, 150303ae1cdSBernard Metzler SIW_WC_LOC_PROT_ERR, 151303ae1cdSBernard Metzler SIW_WC_LOC_QP_OP_ERR, 152303ae1cdSBernard Metzler SIW_WC_WR_FLUSH_ERR, 153303ae1cdSBernard Metzler SIW_WC_BAD_RESP_ERR, 154303ae1cdSBernard Metzler SIW_WC_LOC_ACCESS_ERR, 155303ae1cdSBernard Metzler SIW_WC_REM_ACCESS_ERR, 156303ae1cdSBernard Metzler SIW_WC_REM_INV_REQ_ERR, 157303ae1cdSBernard Metzler SIW_WC_GENERAL_ERR, 158303ae1cdSBernard Metzler SIW_NUM_WC_STATUS 159303ae1cdSBernard Metzler }; 160303ae1cdSBernard Metzler 161303ae1cdSBernard Metzler struct siw_cqe { 162303ae1cdSBernard Metzler __aligned_u64 id; 163303ae1cdSBernard Metzler __u8 flags; 164303ae1cdSBernard Metzler __u8 opcode; 165303ae1cdSBernard Metzler __u16 status; 166303ae1cdSBernard Metzler __u32 bytes; 167303ae1cdSBernard Metzler union { 168303ae1cdSBernard Metzler __aligned_u64 imm_data; 169303ae1cdSBernard Metzler __u32 inval_stag; 170303ae1cdSBernard Metzler }; 171303ae1cdSBernard Metzler /* QP number or QP pointer */ 172303ae1cdSBernard Metzler union { 173303ae1cdSBernard Metzler struct ib_qp *base_qp; 174303ae1cdSBernard Metzler __aligned_u64 qp_id; 175303ae1cdSBernard Metzler }; 176303ae1cdSBernard Metzler }; 177303ae1cdSBernard Metzler 178303ae1cdSBernard Metzler /* 179303ae1cdSBernard Metzler * Shared structure between user and kernel 180303ae1cdSBernard Metzler * to control CQ arming. 181303ae1cdSBernard Metzler */ 182303ae1cdSBernard Metzler struct siw_cq_ctrl { 183*2c8ccb37SBernard Metzler __u32 flags; 184*2c8ccb37SBernard Metzler __u32 pad; 185303ae1cdSBernard Metzler }; 186303ae1cdSBernard Metzler #endif 187