xref: /OK3568_Linux_fs/kernel/drivers/infiniband/hw/i40iw/i40iw_user.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*******************************************************************************
2*4882a593Smuzhiyun *
3*4882a593Smuzhiyun * Copyright (c) 2015-2016 Intel Corporation.  All rights reserved.
4*4882a593Smuzhiyun *
5*4882a593Smuzhiyun * This software is available to you under a choice of one of two
6*4882a593Smuzhiyun * licenses.  You may choose to be licensed under the terms of the GNU
7*4882a593Smuzhiyun * General Public License (GPL) Version 2, available from the file
8*4882a593Smuzhiyun * COPYING in the main directory of this source tree, or the
9*4882a593Smuzhiyun * OpenFabrics.org BSD license below:
10*4882a593Smuzhiyun *
11*4882a593Smuzhiyun *   Redistribution and use in source and binary forms, with or
12*4882a593Smuzhiyun *   without modification, are permitted provided that the following
13*4882a593Smuzhiyun *   conditions are met:
14*4882a593Smuzhiyun *
15*4882a593Smuzhiyun *    - Redistributions of source code must retain the above
16*4882a593Smuzhiyun *	copyright notice, this list of conditions and the following
17*4882a593Smuzhiyun *	disclaimer.
18*4882a593Smuzhiyun *
19*4882a593Smuzhiyun *    - Redistributions in binary form must reproduce the above
20*4882a593Smuzhiyun *	copyright notice, this list of conditions and the following
21*4882a593Smuzhiyun *	disclaimer in the documentation and/or other materials
22*4882a593Smuzhiyun *	provided with the distribution.
23*4882a593Smuzhiyun *
24*4882a593Smuzhiyun * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
25*4882a593Smuzhiyun * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
26*4882a593Smuzhiyun * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
27*4882a593Smuzhiyun * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
28*4882a593Smuzhiyun * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
29*4882a593Smuzhiyun * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
30*4882a593Smuzhiyun * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
31*4882a593Smuzhiyun * SOFTWARE.
32*4882a593Smuzhiyun *
33*4882a593Smuzhiyun *******************************************************************************/
34*4882a593Smuzhiyun 
35*4882a593Smuzhiyun #ifndef I40IW_USER_H
36*4882a593Smuzhiyun #define I40IW_USER_H
37*4882a593Smuzhiyun 
38*4882a593Smuzhiyun enum i40iw_device_capabilities_const {
39*4882a593Smuzhiyun 	I40IW_WQE_SIZE =			4,
40*4882a593Smuzhiyun 	I40IW_CQP_WQE_SIZE =			8,
41*4882a593Smuzhiyun 	I40IW_CQE_SIZE =			4,
42*4882a593Smuzhiyun 	I40IW_EXTENDED_CQE_SIZE =		8,
43*4882a593Smuzhiyun 	I40IW_AEQE_SIZE =			2,
44*4882a593Smuzhiyun 	I40IW_CEQE_SIZE =			1,
45*4882a593Smuzhiyun 	I40IW_CQP_CTX_SIZE =			8,
46*4882a593Smuzhiyun 	I40IW_SHADOW_AREA_SIZE =		8,
47*4882a593Smuzhiyun 	I40IW_CEQ_MAX_COUNT =			256,
48*4882a593Smuzhiyun 	I40IW_QUERY_FPM_BUF_SIZE =		128,
49*4882a593Smuzhiyun 	I40IW_COMMIT_FPM_BUF_SIZE =		128,
50*4882a593Smuzhiyun 	I40IW_MIN_IW_QP_ID =			1,
51*4882a593Smuzhiyun 	I40IW_MAX_IW_QP_ID =			262143,
52*4882a593Smuzhiyun 	I40IW_MIN_CEQID =			0,
53*4882a593Smuzhiyun 	I40IW_MAX_CEQID =			256,
54*4882a593Smuzhiyun 	I40IW_MIN_CQID =			0,
55*4882a593Smuzhiyun 	I40IW_MAX_CQID =			131071,
56*4882a593Smuzhiyun 	I40IW_MIN_AEQ_ENTRIES =			1,
57*4882a593Smuzhiyun 	I40IW_MAX_AEQ_ENTRIES =			524287,
58*4882a593Smuzhiyun 	I40IW_MIN_CEQ_ENTRIES =			1,
59*4882a593Smuzhiyun 	I40IW_MAX_CEQ_ENTRIES =			131071,
60*4882a593Smuzhiyun 	I40IW_MIN_CQ_SIZE =			1,
61*4882a593Smuzhiyun 	I40IW_MAX_CQ_SIZE =			1048575,
62*4882a593Smuzhiyun 	I40IW_DB_ID_ZERO =			0,
63*4882a593Smuzhiyun 	I40IW_MAX_WQ_FRAGMENT_COUNT =		3,
64*4882a593Smuzhiyun 	I40IW_MAX_SGE_RD =			1,
65*4882a593Smuzhiyun 	I40IW_MAX_OUTBOUND_MESSAGE_SIZE =	2147483647,
66*4882a593Smuzhiyun 	I40IW_MAX_INBOUND_MESSAGE_SIZE =	2147483647,
67*4882a593Smuzhiyun 	I40IW_MAX_PUSH_PAGE_COUNT =		4096,
68*4882a593Smuzhiyun 	I40IW_MAX_PE_ENABLED_VF_COUNT =		32,
69*4882a593Smuzhiyun 	I40IW_MAX_VF_FPM_ID =			47,
70*4882a593Smuzhiyun 	I40IW_MAX_VF_PER_PF =			127,
71*4882a593Smuzhiyun 	I40IW_MAX_SQ_PAYLOAD_SIZE =		2145386496,
72*4882a593Smuzhiyun 	I40IW_MAX_INLINE_DATA_SIZE =		48,
73*4882a593Smuzhiyun 	I40IW_MAX_PUSHMODE_INLINE_DATA_SIZE =	48,
74*4882a593Smuzhiyun 	I40IW_MAX_IRD_SIZE =			64,
75*4882a593Smuzhiyun 	I40IW_MAX_ORD_SIZE =			127,
76*4882a593Smuzhiyun 	I40IW_MAX_WQ_ENTRIES =			2048,
77*4882a593Smuzhiyun 	I40IW_Q2_BUFFER_SIZE =			(248 + 100),
78*4882a593Smuzhiyun 	I40IW_MAX_WQE_SIZE_RQ =			128,
79*4882a593Smuzhiyun 	I40IW_QP_CTX_SIZE =			248,
80*4882a593Smuzhiyun 	I40IW_MAX_PDS = 			32768
81*4882a593Smuzhiyun };
82*4882a593Smuzhiyun 
83*4882a593Smuzhiyun #define i40iw_handle void *
84*4882a593Smuzhiyun #define i40iw_adapter_handle i40iw_handle
85*4882a593Smuzhiyun #define i40iw_qp_handle i40iw_handle
86*4882a593Smuzhiyun #define i40iw_cq_handle i40iw_handle
87*4882a593Smuzhiyun #define i40iw_srq_handle i40iw_handle
88*4882a593Smuzhiyun #define i40iw_pd_id i40iw_handle
89*4882a593Smuzhiyun #define i40iw_stag_handle i40iw_handle
90*4882a593Smuzhiyun #define i40iw_stag_index u32
91*4882a593Smuzhiyun #define i40iw_stag u32
92*4882a593Smuzhiyun #define i40iw_stag_key u8
93*4882a593Smuzhiyun 
94*4882a593Smuzhiyun #define i40iw_tagged_offset u64
95*4882a593Smuzhiyun #define i40iw_access_privileges u32
96*4882a593Smuzhiyun #define i40iw_physical_fragment u64
97*4882a593Smuzhiyun #define i40iw_address_list u64 *
98*4882a593Smuzhiyun 
99*4882a593Smuzhiyun #define	I40IW_MAX_MR_SIZE	0x10000000000L
100*4882a593Smuzhiyun #define	I40IW_MAX_RQ_WQE_SHIFT	2
101*4882a593Smuzhiyun 
102*4882a593Smuzhiyun struct i40iw_qp_uk;
103*4882a593Smuzhiyun struct i40iw_cq_uk;
104*4882a593Smuzhiyun struct i40iw_srq_uk;
105*4882a593Smuzhiyun struct i40iw_qp_uk_init_info;
106*4882a593Smuzhiyun struct i40iw_cq_uk_init_info;
107*4882a593Smuzhiyun struct i40iw_srq_uk_init_info;
108*4882a593Smuzhiyun 
109*4882a593Smuzhiyun struct i40iw_sge {
110*4882a593Smuzhiyun 	i40iw_tagged_offset tag_off;
111*4882a593Smuzhiyun 	u32 len;
112*4882a593Smuzhiyun 	i40iw_stag stag;
113*4882a593Smuzhiyun };
114*4882a593Smuzhiyun 
115*4882a593Smuzhiyun #define i40iw_sgl struct i40iw_sge *
116*4882a593Smuzhiyun 
117*4882a593Smuzhiyun struct i40iw_ring {
118*4882a593Smuzhiyun 	u32 head;
119*4882a593Smuzhiyun 	u32 tail;
120*4882a593Smuzhiyun 	u32 size;
121*4882a593Smuzhiyun };
122*4882a593Smuzhiyun 
123*4882a593Smuzhiyun struct i40iw_cqe {
124*4882a593Smuzhiyun 	u64 buf[I40IW_CQE_SIZE];
125*4882a593Smuzhiyun };
126*4882a593Smuzhiyun 
127*4882a593Smuzhiyun struct i40iw_extended_cqe {
128*4882a593Smuzhiyun 	u64 buf[I40IW_EXTENDED_CQE_SIZE];
129*4882a593Smuzhiyun };
130*4882a593Smuzhiyun 
131*4882a593Smuzhiyun struct i40iw_wqe {
132*4882a593Smuzhiyun 	u64 buf[I40IW_WQE_SIZE];
133*4882a593Smuzhiyun };
134*4882a593Smuzhiyun 
135*4882a593Smuzhiyun struct i40iw_qp_uk_ops;
136*4882a593Smuzhiyun 
137*4882a593Smuzhiyun enum i40iw_addressing_type {
138*4882a593Smuzhiyun 	I40IW_ADDR_TYPE_ZERO_BASED = 0,
139*4882a593Smuzhiyun 	I40IW_ADDR_TYPE_VA_BASED = 1,
140*4882a593Smuzhiyun };
141*4882a593Smuzhiyun 
142*4882a593Smuzhiyun #define I40IW_ACCESS_FLAGS_LOCALREAD		0x01
143*4882a593Smuzhiyun #define I40IW_ACCESS_FLAGS_LOCALWRITE		0x02
144*4882a593Smuzhiyun #define I40IW_ACCESS_FLAGS_REMOTEREAD_ONLY	0x04
145*4882a593Smuzhiyun #define I40IW_ACCESS_FLAGS_REMOTEREAD		0x05
146*4882a593Smuzhiyun #define I40IW_ACCESS_FLAGS_REMOTEWRITE_ONLY	0x08
147*4882a593Smuzhiyun #define I40IW_ACCESS_FLAGS_REMOTEWRITE		0x0a
148*4882a593Smuzhiyun #define I40IW_ACCESS_FLAGS_BIND_WINDOW		0x10
149*4882a593Smuzhiyun #define I40IW_ACCESS_FLAGS_ALL			0x1F
150*4882a593Smuzhiyun 
151*4882a593Smuzhiyun #define I40IW_OP_TYPE_RDMA_WRITE	0
152*4882a593Smuzhiyun #define I40IW_OP_TYPE_RDMA_READ		1
153*4882a593Smuzhiyun #define I40IW_OP_TYPE_SEND		3
154*4882a593Smuzhiyun #define I40IW_OP_TYPE_SEND_INV		4
155*4882a593Smuzhiyun #define I40IW_OP_TYPE_SEND_SOL		5
156*4882a593Smuzhiyun #define I40IW_OP_TYPE_SEND_SOL_INV	6
157*4882a593Smuzhiyun #define I40IW_OP_TYPE_REC		7
158*4882a593Smuzhiyun #define I40IW_OP_TYPE_BIND_MW		8
159*4882a593Smuzhiyun #define I40IW_OP_TYPE_FAST_REG_NSMR	9
160*4882a593Smuzhiyun #define I40IW_OP_TYPE_INV_STAG		10
161*4882a593Smuzhiyun #define I40IW_OP_TYPE_RDMA_READ_INV_STAG 11
162*4882a593Smuzhiyun #define I40IW_OP_TYPE_NOP		12
163*4882a593Smuzhiyun 
164*4882a593Smuzhiyun enum i40iw_completion_status {
165*4882a593Smuzhiyun 	I40IW_COMPL_STATUS_SUCCESS = 0,
166*4882a593Smuzhiyun 	I40IW_COMPL_STATUS_FLUSHED,
167*4882a593Smuzhiyun 	I40IW_COMPL_STATUS_INVALID_WQE,
168*4882a593Smuzhiyun 	I40IW_COMPL_STATUS_QP_CATASTROPHIC,
169*4882a593Smuzhiyun 	I40IW_COMPL_STATUS_REMOTE_TERMINATION,
170*4882a593Smuzhiyun 	I40IW_COMPL_STATUS_INVALID_STAG,
171*4882a593Smuzhiyun 	I40IW_COMPL_STATUS_BASE_BOUND_VIOLATION,
172*4882a593Smuzhiyun 	I40IW_COMPL_STATUS_ACCESS_VIOLATION,
173*4882a593Smuzhiyun 	I40IW_COMPL_STATUS_INVALID_PD_ID,
174*4882a593Smuzhiyun 	I40IW_COMPL_STATUS_WRAP_ERROR,
175*4882a593Smuzhiyun 	I40IW_COMPL_STATUS_STAG_INVALID_PDID,
176*4882a593Smuzhiyun 	I40IW_COMPL_STATUS_RDMA_READ_ZERO_ORD,
177*4882a593Smuzhiyun 	I40IW_COMPL_STATUS_QP_NOT_PRIVLEDGED,
178*4882a593Smuzhiyun 	I40IW_COMPL_STATUS_STAG_NOT_INVALID,
179*4882a593Smuzhiyun 	I40IW_COMPL_STATUS_INVALID_PHYS_BUFFER_SIZE,
180*4882a593Smuzhiyun 	I40IW_COMPL_STATUS_INVALID_PHYS_BUFFER_ENTRY,
181*4882a593Smuzhiyun 	I40IW_COMPL_STATUS_INVALID_FBO,
182*4882a593Smuzhiyun 	I40IW_COMPL_STATUS_INVALID_LENGTH,
183*4882a593Smuzhiyun 	I40IW_COMPL_STATUS_INVALID_ACCESS,
184*4882a593Smuzhiyun 	I40IW_COMPL_STATUS_PHYS_BUFFER_LIST_TOO_LONG,
185*4882a593Smuzhiyun 	I40IW_COMPL_STATUS_INVALID_VIRT_ADDRESS,
186*4882a593Smuzhiyun 	I40IW_COMPL_STATUS_INVALID_REGION,
187*4882a593Smuzhiyun 	I40IW_COMPL_STATUS_INVALID_WINDOW,
188*4882a593Smuzhiyun 	I40IW_COMPL_STATUS_INVALID_TOTAL_LENGTH
189*4882a593Smuzhiyun };
190*4882a593Smuzhiyun 
191*4882a593Smuzhiyun enum i40iw_completion_notify {
192*4882a593Smuzhiyun 	IW_CQ_COMPL_EVENT = 0,
193*4882a593Smuzhiyun 	IW_CQ_COMPL_SOLICITED = 1
194*4882a593Smuzhiyun };
195*4882a593Smuzhiyun 
196*4882a593Smuzhiyun struct i40iw_post_send {
197*4882a593Smuzhiyun 	i40iw_sgl sg_list;
198*4882a593Smuzhiyun 	u32 num_sges;
199*4882a593Smuzhiyun };
200*4882a593Smuzhiyun 
201*4882a593Smuzhiyun struct i40iw_post_inline_send {
202*4882a593Smuzhiyun 	void *data;
203*4882a593Smuzhiyun 	u32 len;
204*4882a593Smuzhiyun };
205*4882a593Smuzhiyun 
206*4882a593Smuzhiyun struct i40iw_rdma_write {
207*4882a593Smuzhiyun 	i40iw_sgl lo_sg_list;
208*4882a593Smuzhiyun 	u32 num_lo_sges;
209*4882a593Smuzhiyun 	struct i40iw_sge rem_addr;
210*4882a593Smuzhiyun };
211*4882a593Smuzhiyun 
212*4882a593Smuzhiyun struct i40iw_inline_rdma_write {
213*4882a593Smuzhiyun 	void *data;
214*4882a593Smuzhiyun 	u32 len;
215*4882a593Smuzhiyun 	struct i40iw_sge rem_addr;
216*4882a593Smuzhiyun };
217*4882a593Smuzhiyun 
218*4882a593Smuzhiyun struct i40iw_rdma_read {
219*4882a593Smuzhiyun 	struct i40iw_sge lo_addr;
220*4882a593Smuzhiyun 	struct i40iw_sge rem_addr;
221*4882a593Smuzhiyun };
222*4882a593Smuzhiyun 
223*4882a593Smuzhiyun struct i40iw_bind_window {
224*4882a593Smuzhiyun 	i40iw_stag mr_stag;
225*4882a593Smuzhiyun 	u64 bind_length;
226*4882a593Smuzhiyun 	void *va;
227*4882a593Smuzhiyun 	enum i40iw_addressing_type addressing_type;
228*4882a593Smuzhiyun 	bool enable_reads;
229*4882a593Smuzhiyun 	bool enable_writes;
230*4882a593Smuzhiyun 	i40iw_stag mw_stag;
231*4882a593Smuzhiyun };
232*4882a593Smuzhiyun 
233*4882a593Smuzhiyun struct i40iw_inv_local_stag {
234*4882a593Smuzhiyun 	i40iw_stag target_stag;
235*4882a593Smuzhiyun };
236*4882a593Smuzhiyun 
237*4882a593Smuzhiyun struct i40iw_post_sq_info {
238*4882a593Smuzhiyun 	u64 wr_id;
239*4882a593Smuzhiyun 	u8 op_type;
240*4882a593Smuzhiyun 	bool signaled;
241*4882a593Smuzhiyun 	bool read_fence;
242*4882a593Smuzhiyun 	bool local_fence;
243*4882a593Smuzhiyun 	bool inline_data;
244*4882a593Smuzhiyun 	bool defer_flag;
245*4882a593Smuzhiyun 	union {
246*4882a593Smuzhiyun 		struct i40iw_post_send send;
247*4882a593Smuzhiyun 		struct i40iw_rdma_write rdma_write;
248*4882a593Smuzhiyun 		struct i40iw_rdma_read rdma_read;
249*4882a593Smuzhiyun 		struct i40iw_rdma_read rdma_read_inv;
250*4882a593Smuzhiyun 		struct i40iw_bind_window bind_window;
251*4882a593Smuzhiyun 		struct i40iw_inv_local_stag inv_local_stag;
252*4882a593Smuzhiyun 		struct i40iw_inline_rdma_write inline_rdma_write;
253*4882a593Smuzhiyun 		struct i40iw_post_inline_send inline_send;
254*4882a593Smuzhiyun 	} op;
255*4882a593Smuzhiyun };
256*4882a593Smuzhiyun 
257*4882a593Smuzhiyun struct i40iw_post_rq_info {
258*4882a593Smuzhiyun 	u64 wr_id;
259*4882a593Smuzhiyun 	i40iw_sgl sg_list;
260*4882a593Smuzhiyun 	u32 num_sges;
261*4882a593Smuzhiyun };
262*4882a593Smuzhiyun 
263*4882a593Smuzhiyun struct i40iw_cq_poll_info {
264*4882a593Smuzhiyun 	u64 wr_id;
265*4882a593Smuzhiyun 	i40iw_qp_handle qp_handle;
266*4882a593Smuzhiyun 	u32 bytes_xfered;
267*4882a593Smuzhiyun 	u32 tcp_seq_num;
268*4882a593Smuzhiyun 	u32 qp_id;
269*4882a593Smuzhiyun 	i40iw_stag inv_stag;
270*4882a593Smuzhiyun 	enum i40iw_completion_status comp_status;
271*4882a593Smuzhiyun 	u16 major_err;
272*4882a593Smuzhiyun 	u16 minor_err;
273*4882a593Smuzhiyun 	u8 op_type;
274*4882a593Smuzhiyun 	bool stag_invalid_set;
275*4882a593Smuzhiyun 	bool push_dropped;
276*4882a593Smuzhiyun 	bool error;
277*4882a593Smuzhiyun 	bool is_srq;
278*4882a593Smuzhiyun 	bool solicited_event;
279*4882a593Smuzhiyun };
280*4882a593Smuzhiyun 
281*4882a593Smuzhiyun struct i40iw_qp_uk_ops {
282*4882a593Smuzhiyun 	void (*iw_qp_post_wr)(struct i40iw_qp_uk *);
283*4882a593Smuzhiyun 	void (*iw_qp_ring_push_db)(struct i40iw_qp_uk *, u32);
284*4882a593Smuzhiyun 	enum i40iw_status_code (*iw_rdma_write)(struct i40iw_qp_uk *,
285*4882a593Smuzhiyun 						struct i40iw_post_sq_info *, bool);
286*4882a593Smuzhiyun 	enum i40iw_status_code (*iw_rdma_read)(struct i40iw_qp_uk *,
287*4882a593Smuzhiyun 					       struct i40iw_post_sq_info *, bool, bool);
288*4882a593Smuzhiyun 	enum i40iw_status_code (*iw_send)(struct i40iw_qp_uk *,
289*4882a593Smuzhiyun 					  struct i40iw_post_sq_info *, u32, bool);
290*4882a593Smuzhiyun 	enum i40iw_status_code (*iw_inline_rdma_write)(struct i40iw_qp_uk *,
291*4882a593Smuzhiyun 						       struct i40iw_post_sq_info *, bool);
292*4882a593Smuzhiyun 	enum i40iw_status_code (*iw_inline_send)(struct i40iw_qp_uk *,
293*4882a593Smuzhiyun 						 struct i40iw_post_sq_info *, u32, bool);
294*4882a593Smuzhiyun 	enum i40iw_status_code (*iw_stag_local_invalidate)(struct i40iw_qp_uk *,
295*4882a593Smuzhiyun 							   struct i40iw_post_sq_info *, bool);
296*4882a593Smuzhiyun 	enum i40iw_status_code (*iw_mw_bind)(struct i40iw_qp_uk *,
297*4882a593Smuzhiyun 					     struct i40iw_post_sq_info *, bool);
298*4882a593Smuzhiyun 	enum i40iw_status_code (*iw_post_receive)(struct i40iw_qp_uk *,
299*4882a593Smuzhiyun 						  struct i40iw_post_rq_info *);
300*4882a593Smuzhiyun 	enum i40iw_status_code (*iw_post_nop)(struct i40iw_qp_uk *, u64, bool, bool);
301*4882a593Smuzhiyun };
302*4882a593Smuzhiyun 
303*4882a593Smuzhiyun struct i40iw_cq_ops {
304*4882a593Smuzhiyun 	void (*iw_cq_request_notification)(struct i40iw_cq_uk *,
305*4882a593Smuzhiyun 					   enum i40iw_completion_notify);
306*4882a593Smuzhiyun 	enum i40iw_status_code (*iw_cq_poll_completion)(struct i40iw_cq_uk *,
307*4882a593Smuzhiyun 							struct i40iw_cq_poll_info *);
308*4882a593Smuzhiyun 	enum i40iw_status_code (*iw_cq_post_entries)(struct i40iw_cq_uk *, u8 count);
309*4882a593Smuzhiyun 	void (*iw_cq_clean)(void *, struct i40iw_cq_uk *);
310*4882a593Smuzhiyun };
311*4882a593Smuzhiyun 
312*4882a593Smuzhiyun struct i40iw_dev_uk;
313*4882a593Smuzhiyun 
314*4882a593Smuzhiyun struct i40iw_device_uk_ops {
315*4882a593Smuzhiyun 	enum i40iw_status_code (*iwarp_cq_uk_init)(struct i40iw_cq_uk *,
316*4882a593Smuzhiyun 						   struct i40iw_cq_uk_init_info *);
317*4882a593Smuzhiyun 	enum i40iw_status_code (*iwarp_qp_uk_init)(struct i40iw_qp_uk *,
318*4882a593Smuzhiyun 						   struct i40iw_qp_uk_init_info *);
319*4882a593Smuzhiyun };
320*4882a593Smuzhiyun 
321*4882a593Smuzhiyun struct i40iw_dev_uk {
322*4882a593Smuzhiyun 	struct i40iw_device_uk_ops ops_uk;
323*4882a593Smuzhiyun };
324*4882a593Smuzhiyun 
325*4882a593Smuzhiyun struct i40iw_sq_uk_wr_trk_info {
326*4882a593Smuzhiyun 	u64 wrid;
327*4882a593Smuzhiyun 	u32 wr_len;
328*4882a593Smuzhiyun 	u8 wqe_size;
329*4882a593Smuzhiyun 	u8 reserved[3];
330*4882a593Smuzhiyun };
331*4882a593Smuzhiyun 
332*4882a593Smuzhiyun struct i40iw_qp_quanta {
333*4882a593Smuzhiyun 	u64 elem[I40IW_WQE_SIZE];
334*4882a593Smuzhiyun };
335*4882a593Smuzhiyun 
336*4882a593Smuzhiyun struct i40iw_qp_uk {
337*4882a593Smuzhiyun 	struct i40iw_qp_quanta *sq_base;
338*4882a593Smuzhiyun 	struct i40iw_qp_quanta *rq_base;
339*4882a593Smuzhiyun 	u32 __iomem *wqe_alloc_reg;
340*4882a593Smuzhiyun 	struct i40iw_sq_uk_wr_trk_info *sq_wrtrk_array;
341*4882a593Smuzhiyun 	u64 *rq_wrid_array;
342*4882a593Smuzhiyun 	u64 *shadow_area;
343*4882a593Smuzhiyun 	u32 *push_db;
344*4882a593Smuzhiyun 	u64 *push_wqe;
345*4882a593Smuzhiyun 	struct i40iw_ring sq_ring;
346*4882a593Smuzhiyun 	struct i40iw_ring rq_ring;
347*4882a593Smuzhiyun 	struct i40iw_ring initial_ring;
348*4882a593Smuzhiyun 	u32 qp_id;
349*4882a593Smuzhiyun 	u32 sq_size;
350*4882a593Smuzhiyun 	u32 rq_size;
351*4882a593Smuzhiyun 	u32 max_sq_frag_cnt;
352*4882a593Smuzhiyun 	u32 max_rq_frag_cnt;
353*4882a593Smuzhiyun 	struct i40iw_qp_uk_ops ops;
354*4882a593Smuzhiyun 	bool use_srq;
355*4882a593Smuzhiyun 	u8 swqe_polarity;
356*4882a593Smuzhiyun 	u8 swqe_polarity_deferred;
357*4882a593Smuzhiyun 	u8 rwqe_polarity;
358*4882a593Smuzhiyun 	u8 rq_wqe_size;
359*4882a593Smuzhiyun 	u8 rq_wqe_size_multiplier;
360*4882a593Smuzhiyun 	bool first_sq_wq;
361*4882a593Smuzhiyun 	bool deferred_flag;
362*4882a593Smuzhiyun };
363*4882a593Smuzhiyun 
364*4882a593Smuzhiyun struct i40iw_cq_uk {
365*4882a593Smuzhiyun 	struct i40iw_cqe *cq_base;
366*4882a593Smuzhiyun 	u32 __iomem *cqe_alloc_reg;
367*4882a593Smuzhiyun 	u64 *shadow_area;
368*4882a593Smuzhiyun 	u32 cq_id;
369*4882a593Smuzhiyun 	u32 cq_size;
370*4882a593Smuzhiyun 	struct i40iw_ring cq_ring;
371*4882a593Smuzhiyun 	u8 polarity;
372*4882a593Smuzhiyun 	bool avoid_mem_cflct;
373*4882a593Smuzhiyun 
374*4882a593Smuzhiyun 	struct i40iw_cq_ops ops;
375*4882a593Smuzhiyun };
376*4882a593Smuzhiyun 
377*4882a593Smuzhiyun struct i40iw_qp_uk_init_info {
378*4882a593Smuzhiyun 	struct i40iw_qp_quanta *sq;
379*4882a593Smuzhiyun 	struct i40iw_qp_quanta *rq;
380*4882a593Smuzhiyun 	u32 __iomem *wqe_alloc_reg;
381*4882a593Smuzhiyun 	u64 *shadow_area;
382*4882a593Smuzhiyun 	struct i40iw_sq_uk_wr_trk_info *sq_wrtrk_array;
383*4882a593Smuzhiyun 	u64 *rq_wrid_array;
384*4882a593Smuzhiyun 	u32 *push_db;
385*4882a593Smuzhiyun 	u64 *push_wqe;
386*4882a593Smuzhiyun 	u32 qp_id;
387*4882a593Smuzhiyun 	u32 sq_size;
388*4882a593Smuzhiyun 	u32 rq_size;
389*4882a593Smuzhiyun 	u32 max_sq_frag_cnt;
390*4882a593Smuzhiyun 	u32 max_rq_frag_cnt;
391*4882a593Smuzhiyun 	u32 max_inline_data;
392*4882a593Smuzhiyun 	int abi_ver;
393*4882a593Smuzhiyun };
394*4882a593Smuzhiyun 
395*4882a593Smuzhiyun struct i40iw_cq_uk_init_info {
396*4882a593Smuzhiyun 	u32 __iomem *cqe_alloc_reg;
397*4882a593Smuzhiyun 	struct i40iw_cqe *cq_base;
398*4882a593Smuzhiyun 	u64 *shadow_area;
399*4882a593Smuzhiyun 	u32 cq_size;
400*4882a593Smuzhiyun 	u32 cq_id;
401*4882a593Smuzhiyun 	bool avoid_mem_cflct;
402*4882a593Smuzhiyun };
403*4882a593Smuzhiyun 
404*4882a593Smuzhiyun void i40iw_device_init_uk(struct i40iw_dev_uk *dev);
405*4882a593Smuzhiyun 
406*4882a593Smuzhiyun void i40iw_qp_post_wr(struct i40iw_qp_uk *qp);
407*4882a593Smuzhiyun u64 *i40iw_qp_get_next_send_wqe(struct i40iw_qp_uk *qp, u32 *wqe_idx,
408*4882a593Smuzhiyun 				u8 wqe_size,
409*4882a593Smuzhiyun 				u32 total_size,
410*4882a593Smuzhiyun 				u64 wr_id
411*4882a593Smuzhiyun 				);
412*4882a593Smuzhiyun u64 *i40iw_qp_get_next_recv_wqe(struct i40iw_qp_uk *qp, u32 *wqe_idx);
413*4882a593Smuzhiyun u64 *i40iw_qp_get_next_srq_wqe(struct i40iw_srq_uk *srq, u32 *wqe_idx);
414*4882a593Smuzhiyun 
415*4882a593Smuzhiyun enum i40iw_status_code i40iw_cq_uk_init(struct i40iw_cq_uk *cq,
416*4882a593Smuzhiyun 					struct i40iw_cq_uk_init_info *info);
417*4882a593Smuzhiyun enum i40iw_status_code i40iw_qp_uk_init(struct i40iw_qp_uk *qp,
418*4882a593Smuzhiyun 					struct i40iw_qp_uk_init_info *info);
419*4882a593Smuzhiyun 
420*4882a593Smuzhiyun void i40iw_clean_cq(void *queue, struct i40iw_cq_uk *cq);
421*4882a593Smuzhiyun enum i40iw_status_code i40iw_nop(struct i40iw_qp_uk *qp, u64 wr_id,
422*4882a593Smuzhiyun 				 bool signaled, bool post_sq);
423*4882a593Smuzhiyun enum i40iw_status_code i40iw_fragcnt_to_wqesize_sq(u32 frag_cnt, u8 *wqe_size);
424*4882a593Smuzhiyun enum i40iw_status_code i40iw_fragcnt_to_wqesize_rq(u32 frag_cnt, u8 *wqe_size);
425*4882a593Smuzhiyun enum i40iw_status_code i40iw_inline_data_size_to_wqesize(u32 data_size,
426*4882a593Smuzhiyun 							 u8 *wqe_size);
427*4882a593Smuzhiyun void i40iw_get_wqe_shift(u32 sge, u32 inline_data, u8 *shift);
428*4882a593Smuzhiyun enum i40iw_status_code i40iw_get_sqdepth(u32 sq_size, u8 shift, u32 *sqdepth);
429*4882a593Smuzhiyun enum i40iw_status_code i40iw_get_rqdepth(u32 rq_size, u8 shift, u32 *rqdepth);
430*4882a593Smuzhiyun #endif
431