xref: /freebsd/contrib/ofed/libirdma/irdma_user.h (revision 5b5f7d0e)
1cdcd52d4SBartosz Sobczak /*-
2cdcd52d4SBartosz Sobczak  * SPDX-License-Identifier: GPL-2.0 or Linux-OpenIB
3cdcd52d4SBartosz Sobczak  *
401fbb869SBartosz Sobczak  * Copyright (c) 2015 - 2023 Intel Corporation
5cdcd52d4SBartosz Sobczak  *
6cdcd52d4SBartosz Sobczak  * This software is available to you under a choice of one of two
7cdcd52d4SBartosz Sobczak  * licenses.  You may choose to be licensed under the terms of the GNU
8cdcd52d4SBartosz Sobczak  * General Public License (GPL) Version 2, available from the file
9cdcd52d4SBartosz Sobczak  * COPYING in the main directory of this source tree, or the
10cdcd52d4SBartosz Sobczak  * OpenFabrics.org BSD license below:
11cdcd52d4SBartosz Sobczak  *
12cdcd52d4SBartosz Sobczak  *   Redistribution and use in source and binary forms, with or
13cdcd52d4SBartosz Sobczak  *   without modification, are permitted provided that the following
14cdcd52d4SBartosz Sobczak  *   conditions are met:
15cdcd52d4SBartosz Sobczak  *
16cdcd52d4SBartosz Sobczak  *    - Redistributions of source code must retain the above
17cdcd52d4SBartosz Sobczak  *	copyright notice, this list of conditions and the following
18cdcd52d4SBartosz Sobczak  *	disclaimer.
19cdcd52d4SBartosz Sobczak  *
20cdcd52d4SBartosz Sobczak  *    - Redistributions in binary form must reproduce the above
21cdcd52d4SBartosz Sobczak  *	copyright notice, this list of conditions and the following
22cdcd52d4SBartosz Sobczak  *	disclaimer in the documentation and/or other materials
23cdcd52d4SBartosz Sobczak  *	provided with the distribution.
24cdcd52d4SBartosz Sobczak  *
25cdcd52d4SBartosz Sobczak  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
26cdcd52d4SBartosz Sobczak  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
27cdcd52d4SBartosz Sobczak  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
28cdcd52d4SBartosz Sobczak  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
29cdcd52d4SBartosz Sobczak  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
30cdcd52d4SBartosz Sobczak  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
31cdcd52d4SBartosz Sobczak  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
32cdcd52d4SBartosz Sobczak  * SOFTWARE.
33cdcd52d4SBartosz Sobczak  */
34cdcd52d4SBartosz Sobczak 
35cdcd52d4SBartosz Sobczak #ifndef IRDMA_USER_H
36cdcd52d4SBartosz Sobczak #define IRDMA_USER_H
37cdcd52d4SBartosz Sobczak 
38cdcd52d4SBartosz Sobczak #include "osdep.h"
39cdcd52d4SBartosz Sobczak 
40cdcd52d4SBartosz Sobczak #define irdma_handle void *
41cdcd52d4SBartosz Sobczak #define irdma_adapter_handle irdma_handle
42cdcd52d4SBartosz Sobczak #define irdma_qp_handle irdma_handle
43cdcd52d4SBartosz Sobczak #define irdma_cq_handle irdma_handle
44cdcd52d4SBartosz Sobczak #define irdma_pd_id irdma_handle
45cdcd52d4SBartosz Sobczak #define irdma_stag_handle irdma_handle
46cdcd52d4SBartosz Sobczak #define irdma_stag_index u32
47cdcd52d4SBartosz Sobczak #define irdma_stag u32
48cdcd52d4SBartosz Sobczak #define irdma_stag_key u8
49cdcd52d4SBartosz Sobczak #define irdma_tagged_offset u64
50cdcd52d4SBartosz Sobczak #define irdma_access_privileges u32
51cdcd52d4SBartosz Sobczak #define irdma_physical_fragment u64
52cdcd52d4SBartosz Sobczak #define irdma_address_list u64 *
535b5f7d0eSBartosz Sobczak #define irdma_sgl struct ibv_sge *
54cdcd52d4SBartosz Sobczak 
55cdcd52d4SBartosz Sobczak #define IRDMA_MAX_MR_SIZE	0x200000000000ULL
56cdcd52d4SBartosz Sobczak 
57cdcd52d4SBartosz Sobczak #define IRDMA_ACCESS_FLAGS_LOCALREAD		0x01
58cdcd52d4SBartosz Sobczak #define IRDMA_ACCESS_FLAGS_LOCALWRITE		0x02
59cdcd52d4SBartosz Sobczak #define IRDMA_ACCESS_FLAGS_REMOTEREAD_ONLY	0x04
60cdcd52d4SBartosz Sobczak #define IRDMA_ACCESS_FLAGS_REMOTEREAD		0x05
61cdcd52d4SBartosz Sobczak #define IRDMA_ACCESS_FLAGS_REMOTEWRITE_ONLY	0x08
62cdcd52d4SBartosz Sobczak #define IRDMA_ACCESS_FLAGS_REMOTEWRITE		0x0a
63cdcd52d4SBartosz Sobczak #define IRDMA_ACCESS_FLAGS_BIND_WINDOW		0x10
64cdcd52d4SBartosz Sobczak #define IRDMA_ACCESS_FLAGS_ZERO_BASED		0x20
65cdcd52d4SBartosz Sobczak #define IRDMA_ACCESS_FLAGS_ALL			0x3f
66cdcd52d4SBartosz Sobczak 
67cdcd52d4SBartosz Sobczak #define IRDMA_OP_TYPE_RDMA_WRITE		0x00
68cdcd52d4SBartosz Sobczak #define IRDMA_OP_TYPE_RDMA_READ			0x01
69cdcd52d4SBartosz Sobczak #define IRDMA_OP_TYPE_SEND			0x03
70cdcd52d4SBartosz Sobczak #define IRDMA_OP_TYPE_SEND_INV			0x04
71cdcd52d4SBartosz Sobczak #define IRDMA_OP_TYPE_SEND_SOL			0x05
72cdcd52d4SBartosz Sobczak #define IRDMA_OP_TYPE_SEND_SOL_INV		0x06
73cdcd52d4SBartosz Sobczak #define IRDMA_OP_TYPE_RDMA_WRITE_SOL		0x0d
74cdcd52d4SBartosz Sobczak #define IRDMA_OP_TYPE_BIND_MW			0x08
75cdcd52d4SBartosz Sobczak #define IRDMA_OP_TYPE_FAST_REG_NSMR		0x09
76cdcd52d4SBartosz Sobczak #define IRDMA_OP_TYPE_INV_STAG			0x0a
77cdcd52d4SBartosz Sobczak #define IRDMA_OP_TYPE_RDMA_READ_INV_STAG	0x0b
78cdcd52d4SBartosz Sobczak #define IRDMA_OP_TYPE_NOP			0x0c
79cdcd52d4SBartosz Sobczak #define IRDMA_OP_TYPE_REC	0x3e
80cdcd52d4SBartosz Sobczak #define IRDMA_OP_TYPE_REC_IMM	0x3f
81cdcd52d4SBartosz Sobczak 
82cdcd52d4SBartosz Sobczak #define IRDMA_FLUSH_MAJOR_ERR 1
83cdcd52d4SBartosz Sobczak 
84cdcd52d4SBartosz Sobczak enum irdma_device_caps_const {
85cdcd52d4SBartosz Sobczak 	IRDMA_WQE_SIZE =			4,
86cdcd52d4SBartosz Sobczak 	IRDMA_CQP_WQE_SIZE =			8,
87cdcd52d4SBartosz Sobczak 	IRDMA_CQE_SIZE =			4,
88cdcd52d4SBartosz Sobczak 	IRDMA_EXTENDED_CQE_SIZE =		8,
89cdcd52d4SBartosz Sobczak 	IRDMA_AEQE_SIZE =			2,
90cdcd52d4SBartosz Sobczak 	IRDMA_CEQE_SIZE =			1,
91cdcd52d4SBartosz Sobczak 	IRDMA_CQP_CTX_SIZE =			8,
92cdcd52d4SBartosz Sobczak 	IRDMA_SHADOW_AREA_SIZE =		8,
93cdcd52d4SBartosz Sobczak 	IRDMA_GATHER_STATS_BUF_SIZE =		1024,
94cdcd52d4SBartosz Sobczak 	IRDMA_MIN_IW_QP_ID =			0,
95cdcd52d4SBartosz Sobczak 	IRDMA_QUERY_FPM_BUF_SIZE =		176,
96cdcd52d4SBartosz Sobczak 	IRDMA_COMMIT_FPM_BUF_SIZE =		176,
97cdcd52d4SBartosz Sobczak 	IRDMA_MAX_IW_QP_ID =			262143,
98cdcd52d4SBartosz Sobczak 	IRDMA_MIN_CEQID =			0,
99cdcd52d4SBartosz Sobczak 	IRDMA_MAX_CEQID =			1023,
100cdcd52d4SBartosz Sobczak 	IRDMA_CEQ_MAX_COUNT =			IRDMA_MAX_CEQID + 1,
101cdcd52d4SBartosz Sobczak 	IRDMA_MIN_CQID =			0,
102cdcd52d4SBartosz Sobczak 	IRDMA_MAX_CQID =			524287,
103cdcd52d4SBartosz Sobczak 	IRDMA_MIN_AEQ_ENTRIES =			1,
104cdcd52d4SBartosz Sobczak 	IRDMA_MAX_AEQ_ENTRIES =			524287,
105cdcd52d4SBartosz Sobczak 	IRDMA_MIN_CEQ_ENTRIES =			1,
106cdcd52d4SBartosz Sobczak 	IRDMA_MAX_CEQ_ENTRIES =			262143,
107cdcd52d4SBartosz Sobczak 	IRDMA_MIN_CQ_SIZE =			1,
108cdcd52d4SBartosz Sobczak 	IRDMA_MAX_CQ_SIZE =			1048575,
109cdcd52d4SBartosz Sobczak 	IRDMA_DB_ID_ZERO =			0,
110cdcd52d4SBartosz Sobczak 	/* 64K + 1 */
111cdcd52d4SBartosz Sobczak 	IRDMA_MAX_OUTBOUND_MSG_SIZE =		65537,
112cdcd52d4SBartosz Sobczak 	/* 64K +1 */
113cdcd52d4SBartosz Sobczak 	IRDMA_MAX_INBOUND_MSG_SIZE =		65537,
114cdcd52d4SBartosz Sobczak 	IRDMA_MAX_PE_ENA_VF_COUNT =             32,
115cdcd52d4SBartosz Sobczak 	IRDMA_MAX_VF_FPM_ID =			47,
116cdcd52d4SBartosz Sobczak 	IRDMA_MAX_SQ_PAYLOAD_SIZE =		2145386496,
117cdcd52d4SBartosz Sobczak 	IRDMA_MAX_INLINE_DATA_SIZE =		101,
118cdcd52d4SBartosz Sobczak 	IRDMA_MAX_WQ_ENTRIES =			32768,
119cdcd52d4SBartosz Sobczak 	IRDMA_Q2_BUF_SIZE =			256,
120cdcd52d4SBartosz Sobczak 	IRDMA_QP_CTX_SIZE =			256,
121cdcd52d4SBartosz Sobczak 	IRDMA_MAX_PDS =				262144,
122cdcd52d4SBartosz Sobczak };
123cdcd52d4SBartosz Sobczak 
124cdcd52d4SBartosz Sobczak enum irdma_addressing_type {
125cdcd52d4SBartosz Sobczak 	IRDMA_ADDR_TYPE_ZERO_BASED = 0,
126cdcd52d4SBartosz Sobczak 	IRDMA_ADDR_TYPE_VA_BASED   = 1,
127cdcd52d4SBartosz Sobczak };
128cdcd52d4SBartosz Sobczak 
129cdcd52d4SBartosz Sobczak enum irdma_flush_opcode {
130cdcd52d4SBartosz Sobczak 	FLUSH_INVALID = 0,
131cdcd52d4SBartosz Sobczak 	FLUSH_GENERAL_ERR,
132cdcd52d4SBartosz Sobczak 	FLUSH_PROT_ERR,
133cdcd52d4SBartosz Sobczak 	FLUSH_REM_ACCESS_ERR,
134cdcd52d4SBartosz Sobczak 	FLUSH_LOC_QP_OP_ERR,
135cdcd52d4SBartosz Sobczak 	FLUSH_REM_OP_ERR,
136cdcd52d4SBartosz Sobczak 	FLUSH_LOC_LEN_ERR,
137cdcd52d4SBartosz Sobczak 	FLUSH_FATAL_ERR,
138777e472cSBartosz Sobczak 	FLUSH_RETRY_EXC_ERR,
139cdcd52d4SBartosz Sobczak 	FLUSH_MW_BIND_ERR,
140cdcd52d4SBartosz Sobczak 	FLUSH_REM_INV_REQ_ERR,
1415b5f7d0eSBartosz Sobczak 	FLUSH_RNR_RETRY_EXC_ERR,
142cdcd52d4SBartosz Sobczak };
143cdcd52d4SBartosz Sobczak 
144cdcd52d4SBartosz Sobczak enum irdma_cmpl_status {
145cdcd52d4SBartosz Sobczak 	IRDMA_COMPL_STATUS_SUCCESS = 0,
146cdcd52d4SBartosz Sobczak 	IRDMA_COMPL_STATUS_FLUSHED,
147cdcd52d4SBartosz Sobczak 	IRDMA_COMPL_STATUS_INVALID_WQE,
148cdcd52d4SBartosz Sobczak 	IRDMA_COMPL_STATUS_QP_CATASTROPHIC,
149cdcd52d4SBartosz Sobczak 	IRDMA_COMPL_STATUS_REMOTE_TERMINATION,
150cdcd52d4SBartosz Sobczak 	IRDMA_COMPL_STATUS_INVALID_STAG,
151cdcd52d4SBartosz Sobczak 	IRDMA_COMPL_STATUS_BASE_BOUND_VIOLATION,
152cdcd52d4SBartosz Sobczak 	IRDMA_COMPL_STATUS_ACCESS_VIOLATION,
153cdcd52d4SBartosz Sobczak 	IRDMA_COMPL_STATUS_INVALID_PD_ID,
154cdcd52d4SBartosz Sobczak 	IRDMA_COMPL_STATUS_WRAP_ERROR,
155cdcd52d4SBartosz Sobczak 	IRDMA_COMPL_STATUS_STAG_INVALID_PDID,
156cdcd52d4SBartosz Sobczak 	IRDMA_COMPL_STATUS_RDMA_READ_ZERO_ORD,
157cdcd52d4SBartosz Sobczak 	IRDMA_COMPL_STATUS_QP_NOT_PRIVLEDGED,
158cdcd52d4SBartosz Sobczak 	IRDMA_COMPL_STATUS_STAG_NOT_INVALID,
159cdcd52d4SBartosz Sobczak 	IRDMA_COMPL_STATUS_INVALID_PHYS_BUF_SIZE,
160cdcd52d4SBartosz Sobczak 	IRDMA_COMPL_STATUS_INVALID_PHYS_BUF_ENTRY,
161cdcd52d4SBartosz Sobczak 	IRDMA_COMPL_STATUS_INVALID_FBO,
162cdcd52d4SBartosz Sobczak 	IRDMA_COMPL_STATUS_INVALID_LEN,
163cdcd52d4SBartosz Sobczak 	IRDMA_COMPL_STATUS_INVALID_ACCESS,
164cdcd52d4SBartosz Sobczak 	IRDMA_COMPL_STATUS_PHYS_BUF_LIST_TOO_LONG,
165cdcd52d4SBartosz Sobczak 	IRDMA_COMPL_STATUS_INVALID_VIRT_ADDRESS,
166cdcd52d4SBartosz Sobczak 	IRDMA_COMPL_STATUS_INVALID_REGION,
167cdcd52d4SBartosz Sobczak 	IRDMA_COMPL_STATUS_INVALID_WINDOW,
168cdcd52d4SBartosz Sobczak 	IRDMA_COMPL_STATUS_INVALID_TOTAL_LEN,
169cdcd52d4SBartosz Sobczak 	IRDMA_COMPL_STATUS_UNKNOWN,
170cdcd52d4SBartosz Sobczak };
171cdcd52d4SBartosz Sobczak 
172cdcd52d4SBartosz Sobczak enum irdma_cmpl_notify {
173cdcd52d4SBartosz Sobczak 	IRDMA_CQ_COMPL_EVENT     = 0,
174cdcd52d4SBartosz Sobczak 	IRDMA_CQ_COMPL_SOLICITED = 1,
175cdcd52d4SBartosz Sobczak };
176cdcd52d4SBartosz Sobczak 
177cdcd52d4SBartosz Sobczak enum irdma_qp_caps {
178cdcd52d4SBartosz Sobczak 	IRDMA_WRITE_WITH_IMM = 1,
179cdcd52d4SBartosz Sobczak 	IRDMA_SEND_WITH_IMM  = 2,
180cdcd52d4SBartosz Sobczak 	IRDMA_ROCE	     = 4,
181cdcd52d4SBartosz Sobczak 	IRDMA_PUSH_MODE      = 8,
182cdcd52d4SBartosz Sobczak };
183cdcd52d4SBartosz Sobczak 
184cdcd52d4SBartosz Sobczak struct irdma_qp_uk;
185cdcd52d4SBartosz Sobczak struct irdma_cq_uk;
186cdcd52d4SBartosz Sobczak struct irdma_qp_uk_init_info;
187cdcd52d4SBartosz Sobczak struct irdma_cq_uk_init_info;
188cdcd52d4SBartosz Sobczak 
189cdcd52d4SBartosz Sobczak struct irdma_ring {
190cdcd52d4SBartosz Sobczak 	volatile u32 head;
191777e472cSBartosz Sobczak 	volatile u32 tail;	/* effective tail */
192cdcd52d4SBartosz Sobczak 	u32 size;
193cdcd52d4SBartosz Sobczak };
194cdcd52d4SBartosz Sobczak 
195cdcd52d4SBartosz Sobczak struct irdma_cqe {
196cdcd52d4SBartosz Sobczak 	__le64 buf[IRDMA_CQE_SIZE];
197cdcd52d4SBartosz Sobczak };
198cdcd52d4SBartosz Sobczak 
199cdcd52d4SBartosz Sobczak struct irdma_extended_cqe {
200cdcd52d4SBartosz Sobczak 	__le64 buf[IRDMA_EXTENDED_CQE_SIZE];
201cdcd52d4SBartosz Sobczak };
202cdcd52d4SBartosz Sobczak 
203cdcd52d4SBartosz Sobczak struct irdma_post_send {
204cdcd52d4SBartosz Sobczak 	irdma_sgl sg_list;
205cdcd52d4SBartosz Sobczak 	u32 num_sges;
206cdcd52d4SBartosz Sobczak 	u32 qkey;
207cdcd52d4SBartosz Sobczak 	u32 dest_qp;
208cdcd52d4SBartosz Sobczak 	u32 ah_id;
209cdcd52d4SBartosz Sobczak };
210cdcd52d4SBartosz Sobczak 
211cdcd52d4SBartosz Sobczak struct irdma_post_rq_info {
212cdcd52d4SBartosz Sobczak 	u64 wr_id;
213cdcd52d4SBartosz Sobczak 	irdma_sgl sg_list;
214cdcd52d4SBartosz Sobczak 	u32 num_sges;
215cdcd52d4SBartosz Sobczak };
216cdcd52d4SBartosz Sobczak 
217cdcd52d4SBartosz Sobczak struct irdma_rdma_write {
218cdcd52d4SBartosz Sobczak 	irdma_sgl lo_sg_list;
219cdcd52d4SBartosz Sobczak 	u32 num_lo_sges;
2205b5f7d0eSBartosz Sobczak 	struct ibv_sge rem_addr;
221cdcd52d4SBartosz Sobczak };
222cdcd52d4SBartosz Sobczak 
223cdcd52d4SBartosz Sobczak struct irdma_rdma_read {
224cdcd52d4SBartosz Sobczak 	irdma_sgl lo_sg_list;
225cdcd52d4SBartosz Sobczak 	u32 num_lo_sges;
2265b5f7d0eSBartosz Sobczak 	struct ibv_sge rem_addr;
227cdcd52d4SBartosz Sobczak };
228cdcd52d4SBartosz Sobczak 
229cdcd52d4SBartosz Sobczak struct irdma_bind_window {
230cdcd52d4SBartosz Sobczak 	irdma_stag mr_stag;
231cdcd52d4SBartosz Sobczak 	u64 bind_len;
232cdcd52d4SBartosz Sobczak 	void *va;
233cdcd52d4SBartosz Sobczak 	enum irdma_addressing_type addressing_type;
234cdcd52d4SBartosz Sobczak 	bool ena_reads:1;
235cdcd52d4SBartosz Sobczak 	bool ena_writes:1;
236cdcd52d4SBartosz Sobczak 	irdma_stag mw_stag;
237cdcd52d4SBartosz Sobczak 	bool mem_window_type_1:1;
238cdcd52d4SBartosz Sobczak };
239cdcd52d4SBartosz Sobczak 
240cdcd52d4SBartosz Sobczak struct irdma_inv_local_stag {
241cdcd52d4SBartosz Sobczak 	irdma_stag target_stag;
242cdcd52d4SBartosz Sobczak };
243cdcd52d4SBartosz Sobczak 
244cdcd52d4SBartosz Sobczak struct irdma_post_sq_info {
245cdcd52d4SBartosz Sobczak 	u64 wr_id;
246cdcd52d4SBartosz Sobczak 	u8 op_type;
247cdcd52d4SBartosz Sobczak 	u8 l4len;
248cdcd52d4SBartosz Sobczak 	bool signaled:1;
249cdcd52d4SBartosz Sobczak 	bool read_fence:1;
250cdcd52d4SBartosz Sobczak 	bool local_fence:1;
251cdcd52d4SBartosz Sobczak 	bool inline_data:1;
252cdcd52d4SBartosz Sobczak 	bool imm_data_valid:1;
253cdcd52d4SBartosz Sobczak 	bool push_wqe:1;
254cdcd52d4SBartosz Sobczak 	bool report_rtt:1;
255cdcd52d4SBartosz Sobczak 	bool udp_hdr:1;
256cdcd52d4SBartosz Sobczak 	bool defer_flag:1;
257cdcd52d4SBartosz Sobczak 	u32 imm_data;
258cdcd52d4SBartosz Sobczak 	u32 stag_to_inv;
259cdcd52d4SBartosz Sobczak 	union {
260cdcd52d4SBartosz Sobczak 		struct irdma_post_send send;
261cdcd52d4SBartosz Sobczak 		struct irdma_rdma_write rdma_write;
262cdcd52d4SBartosz Sobczak 		struct irdma_rdma_read rdma_read;
263cdcd52d4SBartosz Sobczak 		struct irdma_bind_window bind_window;
264cdcd52d4SBartosz Sobczak 		struct irdma_inv_local_stag inv_local_stag;
265cdcd52d4SBartosz Sobczak 	} op;
266cdcd52d4SBartosz Sobczak };
267cdcd52d4SBartosz Sobczak 
268cdcd52d4SBartosz Sobczak struct irdma_cq_poll_info {
269cdcd52d4SBartosz Sobczak 	u64 wr_id;
270cdcd52d4SBartosz Sobczak 	irdma_qp_handle qp_handle;
271cdcd52d4SBartosz Sobczak 	u32 bytes_xfered;
272cdcd52d4SBartosz Sobczak 	u32 qp_id;
273cdcd52d4SBartosz Sobczak 	u32 ud_src_qpn;
274cdcd52d4SBartosz Sobczak 	u32 imm_data;
275cdcd52d4SBartosz Sobczak 	irdma_stag inv_stag; /* or L_R_Key */
276cdcd52d4SBartosz Sobczak 	enum irdma_cmpl_status comp_status;
277cdcd52d4SBartosz Sobczak 	u16 major_err;
278cdcd52d4SBartosz Sobczak 	u16 minor_err;
279cdcd52d4SBartosz Sobczak 	u16 ud_vlan;
280cdcd52d4SBartosz Sobczak 	u8 ud_smac[6];
281cdcd52d4SBartosz Sobczak 	u8 op_type;
282777e472cSBartosz Sobczak 	u8 q_type;
283cdcd52d4SBartosz Sobczak 	bool stag_invalid_set:1; /* or L_R_Key set */
284cdcd52d4SBartosz Sobczak 	bool push_dropped:1;
285cdcd52d4SBartosz Sobczak 	bool error:1;
286cdcd52d4SBartosz Sobczak 	bool solicited_event:1;
287cdcd52d4SBartosz Sobczak 	bool ipv4:1;
288cdcd52d4SBartosz Sobczak 	bool ud_vlan_valid:1;
289cdcd52d4SBartosz Sobczak 	bool ud_smac_valid:1;
290cdcd52d4SBartosz Sobczak 	bool imm_valid:1;
291cdcd52d4SBartosz Sobczak 	bool signaled:1;
292777e472cSBartosz Sobczak 	union {
293777e472cSBartosz Sobczak 		u32 tcp_sqn;
294777e472cSBartosz Sobczak 		u32 roce_psn;
295777e472cSBartosz Sobczak 		u32 rtt;
296777e472cSBartosz Sobczak 		u32 raw;
297777e472cSBartosz Sobczak 	} stat;
298777e472cSBartosz Sobczak };
299777e472cSBartosz Sobczak 
300cdcd52d4SBartosz Sobczak int irdma_uk_inline_rdma_write(struct irdma_qp_uk *qp,
301cdcd52d4SBartosz Sobczak 			       struct irdma_post_sq_info *info, bool post_sq);
302cdcd52d4SBartosz Sobczak int irdma_uk_inline_send(struct irdma_qp_uk *qp,
303cdcd52d4SBartosz Sobczak 			 struct irdma_post_sq_info *info, bool post_sq);
304cdcd52d4SBartosz Sobczak int irdma_uk_mw_bind(struct irdma_qp_uk *qp, struct irdma_post_sq_info *info,
305cdcd52d4SBartosz Sobczak 		     bool post_sq);
306cdcd52d4SBartosz Sobczak int irdma_uk_post_nop(struct irdma_qp_uk *qp, u64 wr_id, bool signaled,
307cdcd52d4SBartosz Sobczak 		      bool post_sq);
308cdcd52d4SBartosz Sobczak int irdma_uk_post_receive(struct irdma_qp_uk *qp,
309cdcd52d4SBartosz Sobczak 			  struct irdma_post_rq_info *info);
310cdcd52d4SBartosz Sobczak void irdma_uk_qp_post_wr(struct irdma_qp_uk *qp);
311cdcd52d4SBartosz Sobczak int irdma_uk_rdma_read(struct irdma_qp_uk *qp, struct irdma_post_sq_info *info,
312cdcd52d4SBartosz Sobczak 		       bool inv_stag, bool post_sq);
313cdcd52d4SBartosz Sobczak int irdma_uk_rdma_write(struct irdma_qp_uk *qp, struct irdma_post_sq_info *info,
314cdcd52d4SBartosz Sobczak 			bool post_sq);
315cdcd52d4SBartosz Sobczak int irdma_uk_send(struct irdma_qp_uk *qp, struct irdma_post_sq_info *info,
316cdcd52d4SBartosz Sobczak 		  bool post_sq);
317cdcd52d4SBartosz Sobczak int irdma_uk_stag_local_invalidate(struct irdma_qp_uk *qp,
318cdcd52d4SBartosz Sobczak 				   struct irdma_post_sq_info *info,
319cdcd52d4SBartosz Sobczak 				   bool post_sq);
320cdcd52d4SBartosz Sobczak 
321cdcd52d4SBartosz Sobczak struct irdma_wqe_uk_ops {
3225b5f7d0eSBartosz Sobczak 	void (*iw_copy_inline_data)(u8 *dest, struct ibv_sge *sge_list, u32 num_sges, u8 polarity);
323cdcd52d4SBartosz Sobczak 	u16 (*iw_inline_data_size_to_quanta)(u32 data_size);
3245b5f7d0eSBartosz Sobczak 	void (*iw_set_fragment)(__le64 *wqe, u32 offset, struct ibv_sge *sge,
325cdcd52d4SBartosz Sobczak 				u8 valid);
326cdcd52d4SBartosz Sobczak 	void (*iw_set_mw_bind_wqe)(__le64 *wqe,
327cdcd52d4SBartosz Sobczak 				   struct irdma_bind_window *op_info);
328cdcd52d4SBartosz Sobczak };
329cdcd52d4SBartosz Sobczak 
330cdcd52d4SBartosz Sobczak int irdma_uk_cq_poll_cmpl(struct irdma_cq_uk *cq,
331cdcd52d4SBartosz Sobczak 			  struct irdma_cq_poll_info *info);
332cdcd52d4SBartosz Sobczak void irdma_uk_cq_request_notification(struct irdma_cq_uk *cq,
333cdcd52d4SBartosz Sobczak 				      enum irdma_cmpl_notify cq_notify);
334cdcd52d4SBartosz Sobczak void irdma_uk_cq_resize(struct irdma_cq_uk *cq, void *cq_base, int size);
335cdcd52d4SBartosz Sobczak void irdma_uk_cq_set_resized_cnt(struct irdma_cq_uk *qp, u16 cnt);
336cdcd52d4SBartosz Sobczak int irdma_uk_cq_init(struct irdma_cq_uk *cq,
337cdcd52d4SBartosz Sobczak 		     struct irdma_cq_uk_init_info *info);
338cdcd52d4SBartosz Sobczak int irdma_uk_qp_init(struct irdma_qp_uk *qp,
339cdcd52d4SBartosz Sobczak 		     struct irdma_qp_uk_init_info *info);
340777e472cSBartosz Sobczak int irdma_uk_calc_depth_shift_sq(struct irdma_qp_uk_init_info *ukinfo,
341777e472cSBartosz Sobczak 				 u32 *sq_depth, u8 *sq_shift);
342777e472cSBartosz Sobczak int irdma_uk_calc_depth_shift_rq(struct irdma_qp_uk_init_info *ukinfo,
343777e472cSBartosz Sobczak 				 u32 *rq_depth, u8 *rq_shift);
344cdcd52d4SBartosz Sobczak struct irdma_sq_uk_wr_trk_info {
345cdcd52d4SBartosz Sobczak 	u64 wrid;
346cdcd52d4SBartosz Sobczak 	u32 wr_len;
347cdcd52d4SBartosz Sobczak 	u16 quanta;
348cdcd52d4SBartosz Sobczak 	u8 signaled;
349cdcd52d4SBartosz Sobczak 	u8 reserved[1];
350cdcd52d4SBartosz Sobczak };
351cdcd52d4SBartosz Sobczak 
352cdcd52d4SBartosz Sobczak struct irdma_qp_quanta {
353cdcd52d4SBartosz Sobczak 	__le64 elem[IRDMA_WQE_SIZE];
354cdcd52d4SBartosz Sobczak };
355cdcd52d4SBartosz Sobczak 
356cdcd52d4SBartosz Sobczak struct irdma_qp_uk {
357cdcd52d4SBartosz Sobczak 	struct irdma_qp_quanta *sq_base;
358cdcd52d4SBartosz Sobczak 	struct irdma_qp_quanta *rq_base;
359cdcd52d4SBartosz Sobczak 	struct irdma_uk_attrs *uk_attrs;
360cdcd52d4SBartosz Sobczak 	u32 IOMEM *wqe_alloc_db;
361cdcd52d4SBartosz Sobczak 	struct irdma_sq_uk_wr_trk_info *sq_wrtrk_array;
362cdcd52d4SBartosz Sobczak 	struct irdma_sig_wr_trk_info *sq_sigwrtrk_array;
363cdcd52d4SBartosz Sobczak 	u64 *rq_wrid_array;
364cdcd52d4SBartosz Sobczak 	__le64 *shadow_area;
365cdcd52d4SBartosz Sobczak 	__le32 *push_db;
366cdcd52d4SBartosz Sobczak 	__le64 *push_wqe;
367cdcd52d4SBartosz Sobczak 	struct irdma_ring sq_ring;
368cdcd52d4SBartosz Sobczak 	struct irdma_ring sq_sig_ring;
369cdcd52d4SBartosz Sobczak 	struct irdma_ring rq_ring;
370cdcd52d4SBartosz Sobczak 	struct irdma_ring initial_ring;
371cdcd52d4SBartosz Sobczak 	u32 qp_id;
372cdcd52d4SBartosz Sobczak 	u32 qp_caps;
373cdcd52d4SBartosz Sobczak 	u32 sq_size;
374cdcd52d4SBartosz Sobczak 	u32 rq_size;
375cdcd52d4SBartosz Sobczak 	u32 max_sq_frag_cnt;
376cdcd52d4SBartosz Sobczak 	u32 max_rq_frag_cnt;
377cdcd52d4SBartosz Sobczak 	u32 max_inline_data;
378cdcd52d4SBartosz Sobczak 	u32 last_rx_cmpl_idx;
379cdcd52d4SBartosz Sobczak 	u32 last_tx_cmpl_idx;
380cdcd52d4SBartosz Sobczak 	struct irdma_wqe_uk_ops wqe_ops;
381cdcd52d4SBartosz Sobczak 	u16 conn_wqes;
382cdcd52d4SBartosz Sobczak 	u8 qp_type;
383cdcd52d4SBartosz Sobczak 	u8 swqe_polarity;
384cdcd52d4SBartosz Sobczak 	u8 swqe_polarity_deferred;
385cdcd52d4SBartosz Sobczak 	u8 rwqe_polarity;
386cdcd52d4SBartosz Sobczak 	u8 rq_wqe_size;
387cdcd52d4SBartosz Sobczak 	u8 rq_wqe_size_multiplier;
3885b5f7d0eSBartosz Sobczak 	u8 start_wqe_idx;
389cdcd52d4SBartosz Sobczak 	bool deferred_flag:1;
390cdcd52d4SBartosz Sobczak 	bool push_mode:1; /* whether the last post wqe was pushed */
391cdcd52d4SBartosz Sobczak 	bool push_dropped:1;
392cdcd52d4SBartosz Sobczak 	bool first_sq_wq:1;
393cdcd52d4SBartosz Sobczak 	bool sq_flush_complete:1; /* Indicates flush was seen and SQ was empty after the flush */
394cdcd52d4SBartosz Sobczak 	bool rq_flush_complete:1; /* Indicates flush was seen and RQ was empty after the flush */
395cdcd52d4SBartosz Sobczak 	bool destroy_pending:1; /* Indicates the QP is being destroyed */
396cdcd52d4SBartosz Sobczak 	void *back_qp;
397cdcd52d4SBartosz Sobczak 	pthread_spinlock_t *lock;
398cdcd52d4SBartosz Sobczak 	u8 dbg_rq_flushed;
399cdcd52d4SBartosz Sobczak 	u16 ord_cnt;
400cdcd52d4SBartosz Sobczak 	u8 sq_flush_seen;
401cdcd52d4SBartosz Sobczak 	u8 rq_flush_seen;
402cdcd52d4SBartosz Sobczak 	u8 rd_fence_rate;
403cdcd52d4SBartosz Sobczak };
404cdcd52d4SBartosz Sobczak 
405cdcd52d4SBartosz Sobczak struct irdma_cq_uk {
406cdcd52d4SBartosz Sobczak 	struct irdma_cqe *cq_base;
407cdcd52d4SBartosz Sobczak 	u32 IOMEM *cqe_alloc_db;
408cdcd52d4SBartosz Sobczak 	u32 IOMEM *cq_ack_db;
409cdcd52d4SBartosz Sobczak 	__le64 *shadow_area;
410cdcd52d4SBartosz Sobczak 	u32 cq_id;
411cdcd52d4SBartosz Sobczak 	u32 cq_size;
412cdcd52d4SBartosz Sobczak 	struct irdma_ring cq_ring;
413cdcd52d4SBartosz Sobczak 	u8 polarity;
414cdcd52d4SBartosz Sobczak 	bool avoid_mem_cflct:1;
415cdcd52d4SBartosz Sobczak };
416cdcd52d4SBartosz Sobczak 
417cdcd52d4SBartosz Sobczak struct irdma_qp_uk_init_info {
418cdcd52d4SBartosz Sobczak 	struct irdma_qp_quanta *sq;
419cdcd52d4SBartosz Sobczak 	struct irdma_qp_quanta *rq;
420cdcd52d4SBartosz Sobczak 	struct irdma_uk_attrs *uk_attrs;
421cdcd52d4SBartosz Sobczak 	u32 IOMEM *wqe_alloc_db;
422cdcd52d4SBartosz Sobczak 	__le64 *shadow_area;
423cdcd52d4SBartosz Sobczak 	struct irdma_sq_uk_wr_trk_info *sq_wrtrk_array;
424cdcd52d4SBartosz Sobczak 	struct irdma_sig_wr_trk_info *sq_sigwrtrk_array;
425cdcd52d4SBartosz Sobczak 	u64 *rq_wrid_array;
426cdcd52d4SBartosz Sobczak 	u32 qp_id;
427cdcd52d4SBartosz Sobczak 	u32 qp_caps;
428cdcd52d4SBartosz Sobczak 	u32 sq_size;
429cdcd52d4SBartosz Sobczak 	u32 rq_size;
430cdcd52d4SBartosz Sobczak 	u32 max_sq_frag_cnt;
431cdcd52d4SBartosz Sobczak 	u32 max_rq_frag_cnt;
432cdcd52d4SBartosz Sobczak 	u32 max_inline_data;
433777e472cSBartosz Sobczak 	u32 sq_depth;
434777e472cSBartosz Sobczak 	u32 rq_depth;
435cdcd52d4SBartosz Sobczak 	u8 first_sq_wq;
4365b5f7d0eSBartosz Sobczak 	u8 start_wqe_idx;
437cdcd52d4SBartosz Sobczak 	u8 type;
438777e472cSBartosz Sobczak 	u8 sq_shift;
439777e472cSBartosz Sobczak 	u8 rq_shift;
440cdcd52d4SBartosz Sobczak 	u8 rd_fence_rate;
441cdcd52d4SBartosz Sobczak 	int abi_ver;
442cdcd52d4SBartosz Sobczak 	bool legacy_mode;
443cdcd52d4SBartosz Sobczak };
444cdcd52d4SBartosz Sobczak 
445cdcd52d4SBartosz Sobczak struct irdma_cq_uk_init_info {
446cdcd52d4SBartosz Sobczak 	u32 IOMEM *cqe_alloc_db;
447cdcd52d4SBartosz Sobczak 	u32 IOMEM *cq_ack_db;
448cdcd52d4SBartosz Sobczak 	struct irdma_cqe *cq_base;
449cdcd52d4SBartosz Sobczak 	__le64 *shadow_area;
450cdcd52d4SBartosz Sobczak 	u32 cq_size;
451cdcd52d4SBartosz Sobczak 	u32 cq_id;
452cdcd52d4SBartosz Sobczak 	bool avoid_mem_cflct;
453cdcd52d4SBartosz Sobczak };
454cdcd52d4SBartosz Sobczak 
455cdcd52d4SBartosz Sobczak __le64 *irdma_qp_get_next_send_wqe(struct irdma_qp_uk *qp, u32 *wqe_idx,
456777e472cSBartosz Sobczak 				   u16 *quanta, u32 total_size,
457cdcd52d4SBartosz Sobczak 				   struct irdma_post_sq_info *info);
458cdcd52d4SBartosz Sobczak __le64 *irdma_qp_get_next_recv_wqe(struct irdma_qp_uk *qp, u32 *wqe_idx);
459cdcd52d4SBartosz Sobczak int irdma_uk_clean_cq(void *q, struct irdma_cq_uk *cq);
460cdcd52d4SBartosz Sobczak int irdma_nop(struct irdma_qp_uk *qp, u64 wr_id, bool signaled, bool post_sq);
461cdcd52d4SBartosz Sobczak int irdma_fragcnt_to_quanta_sq(u32 frag_cnt, u16 *quanta);
462cdcd52d4SBartosz Sobczak int irdma_fragcnt_to_wqesize_rq(u32 frag_cnt, u16 *wqe_size);
463cdcd52d4SBartosz Sobczak void irdma_get_wqe_shift(struct irdma_uk_attrs *uk_attrs, u32 sge,
464cdcd52d4SBartosz Sobczak 			 u32 inline_data, u8 *shift);
465777e472cSBartosz Sobczak int irdma_get_sqdepth(struct irdma_uk_attrs *uk_attrs, u32 sq_size, u8 shift, u32 *sqdepth);
466777e472cSBartosz Sobczak int irdma_get_rqdepth(struct irdma_uk_attrs *uk_attrs, u32 rq_size, u8 shift, u32 *rqdepth);
467cdcd52d4SBartosz Sobczak void irdma_qp_push_wqe(struct irdma_qp_uk *qp, __le64 *wqe, u16 quanta,
468cdcd52d4SBartosz Sobczak 		       u32 wqe_idx, bool post_sq);
469cdcd52d4SBartosz Sobczak void irdma_clr_wqes(struct irdma_qp_uk *qp, u32 qp_wqe_idx);
470cdcd52d4SBartosz Sobczak #endif /* IRDMA_USER_H */
471