162306a36Sopenharmony_ci/* SPDX-License-Identifier: (GPL-2.0 WITH Linux-syscall-note) or BSD-3-Clause */ 262306a36Sopenharmony_ci 362306a36Sopenharmony_ci/* Authors: Bernard Metzler <bmt@zurich.ibm.com> */ 462306a36Sopenharmony_ci/* Copyright (c) 2008-2019, IBM Corporation */ 562306a36Sopenharmony_ci 662306a36Sopenharmony_ci#ifndef _SIW_USER_H 762306a36Sopenharmony_ci#define _SIW_USER_H 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci#include <linux/types.h> 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci#define SIW_NODE_DESC_COMMON "Software iWARP stack" 1262306a36Sopenharmony_ci#define SIW_ABI_VERSION 1 1362306a36Sopenharmony_ci#define SIW_MAX_SGE 6 1462306a36Sopenharmony_ci#define SIW_UOBJ_MAX_KEY 0x08FFFF 1562306a36Sopenharmony_ci#define SIW_INVAL_UOBJ_KEY (SIW_UOBJ_MAX_KEY + 1) 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_cistruct siw_uresp_create_cq { 1862306a36Sopenharmony_ci __u32 cq_id; 1962306a36Sopenharmony_ci __u32 num_cqe; 2062306a36Sopenharmony_ci __aligned_u64 cq_key; 2162306a36Sopenharmony_ci}; 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_cistruct siw_uresp_create_qp { 2462306a36Sopenharmony_ci __u32 qp_id; 2562306a36Sopenharmony_ci __u32 num_sqe; 2662306a36Sopenharmony_ci __u32 num_rqe; 2762306a36Sopenharmony_ci __u32 pad; 2862306a36Sopenharmony_ci __aligned_u64 sq_key; 2962306a36Sopenharmony_ci __aligned_u64 rq_key; 3062306a36Sopenharmony_ci}; 3162306a36Sopenharmony_ci 3262306a36Sopenharmony_cistruct siw_ureq_reg_mr { 3362306a36Sopenharmony_ci __u8 stag_key; 3462306a36Sopenharmony_ci __u8 reserved[3]; 3562306a36Sopenharmony_ci __u32 pad; 3662306a36Sopenharmony_ci}; 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_cistruct siw_uresp_reg_mr { 3962306a36Sopenharmony_ci __u32 stag; 4062306a36Sopenharmony_ci __u32 pad; 4162306a36Sopenharmony_ci}; 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_cistruct siw_uresp_create_srq { 4462306a36Sopenharmony_ci __u32 num_rqe; 4562306a36Sopenharmony_ci __u32 pad; 4662306a36Sopenharmony_ci __aligned_u64 srq_key; 4762306a36Sopenharmony_ci}; 4862306a36Sopenharmony_ci 4962306a36Sopenharmony_cistruct siw_uresp_alloc_ctx { 5062306a36Sopenharmony_ci __u32 dev_id; 5162306a36Sopenharmony_ci __u32 pad; 5262306a36Sopenharmony_ci}; 5362306a36Sopenharmony_ci 5462306a36Sopenharmony_cienum siw_opcode { 5562306a36Sopenharmony_ci SIW_OP_WRITE, 5662306a36Sopenharmony_ci SIW_OP_READ, 5762306a36Sopenharmony_ci SIW_OP_READ_LOCAL_INV, 5862306a36Sopenharmony_ci SIW_OP_SEND, 5962306a36Sopenharmony_ci SIW_OP_SEND_WITH_IMM, 6062306a36Sopenharmony_ci SIW_OP_SEND_REMOTE_INV, 6162306a36Sopenharmony_ci 6262306a36Sopenharmony_ci /* Unsupported */ 6362306a36Sopenharmony_ci SIW_OP_FETCH_AND_ADD, 6462306a36Sopenharmony_ci SIW_OP_COMP_AND_SWAP, 6562306a36Sopenharmony_ci 6662306a36Sopenharmony_ci SIW_OP_RECEIVE, 6762306a36Sopenharmony_ci /* provider internal SQE */ 6862306a36Sopenharmony_ci SIW_OP_READ_RESPONSE, 6962306a36Sopenharmony_ci /* 7062306a36Sopenharmony_ci * below opcodes valid for 7162306a36Sopenharmony_ci * in-kernel clients only 7262306a36Sopenharmony_ci */ 7362306a36Sopenharmony_ci SIW_OP_INVAL_STAG, 7462306a36Sopenharmony_ci SIW_OP_REG_MR, 7562306a36Sopenharmony_ci SIW_NUM_OPCODES 7662306a36Sopenharmony_ci}; 7762306a36Sopenharmony_ci 7862306a36Sopenharmony_ci/* Keep it same as ibv_sge to allow for memcpy */ 7962306a36Sopenharmony_cistruct siw_sge { 8062306a36Sopenharmony_ci __aligned_u64 laddr; 8162306a36Sopenharmony_ci __u32 length; 8262306a36Sopenharmony_ci __u32 lkey; 8362306a36Sopenharmony_ci}; 8462306a36Sopenharmony_ci 8562306a36Sopenharmony_ci/* 8662306a36Sopenharmony_ci * Inline data are kept within the work request itself occupying 8762306a36Sopenharmony_ci * the space of sge[1] .. sge[n]. Therefore, inline data cannot be 8862306a36Sopenharmony_ci * supported if SIW_MAX_SGE is below 2 elements. 8962306a36Sopenharmony_ci */ 9062306a36Sopenharmony_ci#define SIW_MAX_INLINE (sizeof(struct siw_sge) * (SIW_MAX_SGE - 1)) 9162306a36Sopenharmony_ci 9262306a36Sopenharmony_ci#if SIW_MAX_SGE < 2 9362306a36Sopenharmony_ci#error "SIW_MAX_SGE must be at least 2" 9462306a36Sopenharmony_ci#endif 9562306a36Sopenharmony_ci 9662306a36Sopenharmony_cienum siw_wqe_flags { 9762306a36Sopenharmony_ci SIW_WQE_VALID = 1, 9862306a36Sopenharmony_ci SIW_WQE_INLINE = (1 << 1), 9962306a36Sopenharmony_ci SIW_WQE_SIGNALLED = (1 << 2), 10062306a36Sopenharmony_ci SIW_WQE_SOLICITED = (1 << 3), 10162306a36Sopenharmony_ci SIW_WQE_READ_FENCE = (1 << 4), 10262306a36Sopenharmony_ci SIW_WQE_REM_INVAL = (1 << 5), 10362306a36Sopenharmony_ci SIW_WQE_COMPLETED = (1 << 6) 10462306a36Sopenharmony_ci}; 10562306a36Sopenharmony_ci 10662306a36Sopenharmony_ci/* Send Queue Element */ 10762306a36Sopenharmony_cistruct siw_sqe { 10862306a36Sopenharmony_ci __aligned_u64 id; 10962306a36Sopenharmony_ci __u16 flags; 11062306a36Sopenharmony_ci __u8 num_sge; 11162306a36Sopenharmony_ci /* Contains enum siw_opcode values */ 11262306a36Sopenharmony_ci __u8 opcode; 11362306a36Sopenharmony_ci __u32 rkey; 11462306a36Sopenharmony_ci union { 11562306a36Sopenharmony_ci __aligned_u64 raddr; 11662306a36Sopenharmony_ci __aligned_u64 base_mr; 11762306a36Sopenharmony_ci }; 11862306a36Sopenharmony_ci union { 11962306a36Sopenharmony_ci struct siw_sge sge[SIW_MAX_SGE]; 12062306a36Sopenharmony_ci __aligned_u64 access; 12162306a36Sopenharmony_ci }; 12262306a36Sopenharmony_ci}; 12362306a36Sopenharmony_ci 12462306a36Sopenharmony_ci/* Receive Queue Element */ 12562306a36Sopenharmony_cistruct siw_rqe { 12662306a36Sopenharmony_ci __aligned_u64 id; 12762306a36Sopenharmony_ci __u16 flags; 12862306a36Sopenharmony_ci __u8 num_sge; 12962306a36Sopenharmony_ci /* 13062306a36Sopenharmony_ci * only used by kernel driver, 13162306a36Sopenharmony_ci * ignored if set by user 13262306a36Sopenharmony_ci */ 13362306a36Sopenharmony_ci __u8 opcode; 13462306a36Sopenharmony_ci __u32 unused; 13562306a36Sopenharmony_ci struct siw_sge sge[SIW_MAX_SGE]; 13662306a36Sopenharmony_ci}; 13762306a36Sopenharmony_ci 13862306a36Sopenharmony_cienum siw_notify_flags { 13962306a36Sopenharmony_ci SIW_NOTIFY_NOT = (0), 14062306a36Sopenharmony_ci SIW_NOTIFY_SOLICITED = (1 << 0), 14162306a36Sopenharmony_ci SIW_NOTIFY_NEXT_COMPLETION = (1 << 1), 14262306a36Sopenharmony_ci SIW_NOTIFY_MISSED_EVENTS = (1 << 2), 14362306a36Sopenharmony_ci SIW_NOTIFY_ALL = SIW_NOTIFY_SOLICITED | SIW_NOTIFY_NEXT_COMPLETION | 14462306a36Sopenharmony_ci SIW_NOTIFY_MISSED_EVENTS 14562306a36Sopenharmony_ci}; 14662306a36Sopenharmony_ci 14762306a36Sopenharmony_cienum siw_wc_status { 14862306a36Sopenharmony_ci SIW_WC_SUCCESS, 14962306a36Sopenharmony_ci SIW_WC_LOC_LEN_ERR, 15062306a36Sopenharmony_ci SIW_WC_LOC_PROT_ERR, 15162306a36Sopenharmony_ci SIW_WC_LOC_QP_OP_ERR, 15262306a36Sopenharmony_ci SIW_WC_WR_FLUSH_ERR, 15362306a36Sopenharmony_ci SIW_WC_BAD_RESP_ERR, 15462306a36Sopenharmony_ci SIW_WC_LOC_ACCESS_ERR, 15562306a36Sopenharmony_ci SIW_WC_REM_ACCESS_ERR, 15662306a36Sopenharmony_ci SIW_WC_REM_INV_REQ_ERR, 15762306a36Sopenharmony_ci SIW_WC_GENERAL_ERR, 15862306a36Sopenharmony_ci SIW_NUM_WC_STATUS 15962306a36Sopenharmony_ci}; 16062306a36Sopenharmony_ci 16162306a36Sopenharmony_cistruct siw_cqe { 16262306a36Sopenharmony_ci __aligned_u64 id; 16362306a36Sopenharmony_ci __u8 flags; 16462306a36Sopenharmony_ci __u8 opcode; 16562306a36Sopenharmony_ci __u16 status; 16662306a36Sopenharmony_ci __u32 bytes; 16762306a36Sopenharmony_ci union { 16862306a36Sopenharmony_ci __aligned_u64 imm_data; 16962306a36Sopenharmony_ci __u32 inval_stag; 17062306a36Sopenharmony_ci }; 17162306a36Sopenharmony_ci /* QP number or QP pointer */ 17262306a36Sopenharmony_ci union { 17362306a36Sopenharmony_ci struct ib_qp *base_qp; 17462306a36Sopenharmony_ci __aligned_u64 qp_id; 17562306a36Sopenharmony_ci }; 17662306a36Sopenharmony_ci}; 17762306a36Sopenharmony_ci 17862306a36Sopenharmony_ci/* 17962306a36Sopenharmony_ci * Shared structure between user and kernel 18062306a36Sopenharmony_ci * to control CQ arming. 18162306a36Sopenharmony_ci */ 18262306a36Sopenharmony_cistruct siw_cq_ctrl { 18362306a36Sopenharmony_ci __u32 flags; 18462306a36Sopenharmony_ci __u32 pad; 18562306a36Sopenharmony_ci}; 18662306a36Sopenharmony_ci#endif 187