xref: /OK3568_Linux_fs/kernel/drivers/infiniband/hw/bnxt_re/qplib_fp.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * Broadcom NetXtreme-E RoCE driver.
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  * Copyright (c) 2016 - 2017, Broadcom. All rights reserved.  The term
5*4882a593Smuzhiyun  * Broadcom refers to Broadcom Limited and/or its subsidiaries.
6*4882a593Smuzhiyun  *
7*4882a593Smuzhiyun  * This software is available to you under a choice of one of two
8*4882a593Smuzhiyun  * licenses.  You may choose to be licensed under the terms of the GNU
9*4882a593Smuzhiyun  * General Public License (GPL) Version 2, available from the file
10*4882a593Smuzhiyun  * COPYING in the main directory of this source tree, or the
11*4882a593Smuzhiyun  * BSD license below:
12*4882a593Smuzhiyun  *
13*4882a593Smuzhiyun  * Redistribution and use in source and binary forms, with or without
14*4882a593Smuzhiyun  * modification, are permitted provided that the following conditions
15*4882a593Smuzhiyun  * are met:
16*4882a593Smuzhiyun  *
17*4882a593Smuzhiyun  * 1. Redistributions of source code must retain the above copyright
18*4882a593Smuzhiyun  *    notice, this list of conditions and the following disclaimer.
19*4882a593Smuzhiyun  * 2. Redistributions in binary form must reproduce the above copyright
20*4882a593Smuzhiyun  *    notice, this list of conditions and the following disclaimer in
21*4882a593Smuzhiyun  *    the documentation and/or other materials provided with the
22*4882a593Smuzhiyun  *    distribution.
23*4882a593Smuzhiyun  *
24*4882a593Smuzhiyun  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS''
25*4882a593Smuzhiyun  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
26*4882a593Smuzhiyun  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
27*4882a593Smuzhiyun  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS
28*4882a593Smuzhiyun  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
29*4882a593Smuzhiyun  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
30*4882a593Smuzhiyun  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
31*4882a593Smuzhiyun  * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
32*4882a593Smuzhiyun  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
33*4882a593Smuzhiyun  * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
34*4882a593Smuzhiyun  * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
35*4882a593Smuzhiyun  *
36*4882a593Smuzhiyun  * Description: Fast Path Operators (header)
37*4882a593Smuzhiyun  */
38*4882a593Smuzhiyun 
39*4882a593Smuzhiyun #ifndef __BNXT_QPLIB_FP_H__
40*4882a593Smuzhiyun #define __BNXT_QPLIB_FP_H__
41*4882a593Smuzhiyun 
42*4882a593Smuzhiyun /* Few helper structures temporarily defined here
43*4882a593Smuzhiyun  * should get rid of these when roce_hsi.h is updated
44*4882a593Smuzhiyun  * in original code base
45*4882a593Smuzhiyun  */
46*4882a593Smuzhiyun struct sq_ud_ext_hdr {
47*4882a593Smuzhiyun 	__le32 dst_qp;
48*4882a593Smuzhiyun 	__le32 avid;
49*4882a593Smuzhiyun 	__le64 rsvd;
50*4882a593Smuzhiyun };
51*4882a593Smuzhiyun 
52*4882a593Smuzhiyun struct sq_raw_ext_hdr {
53*4882a593Smuzhiyun 	__le32 cfa_meta;
54*4882a593Smuzhiyun 	__le32 rsvd0;
55*4882a593Smuzhiyun 	__le64 rsvd1;
56*4882a593Smuzhiyun };
57*4882a593Smuzhiyun 
58*4882a593Smuzhiyun struct sq_rdma_ext_hdr {
59*4882a593Smuzhiyun 	__le64 remote_va;
60*4882a593Smuzhiyun 	__le32 remote_key;
61*4882a593Smuzhiyun 	__le32 rsvd;
62*4882a593Smuzhiyun };
63*4882a593Smuzhiyun 
64*4882a593Smuzhiyun struct sq_atomic_ext_hdr {
65*4882a593Smuzhiyun 	__le64 swap_data;
66*4882a593Smuzhiyun 	__le64 cmp_data;
67*4882a593Smuzhiyun };
68*4882a593Smuzhiyun 
69*4882a593Smuzhiyun struct sq_fr_pmr_ext_hdr {
70*4882a593Smuzhiyun 	__le64 pblptr;
71*4882a593Smuzhiyun 	__le64 va;
72*4882a593Smuzhiyun };
73*4882a593Smuzhiyun 
74*4882a593Smuzhiyun struct sq_bind_ext_hdr {
75*4882a593Smuzhiyun 	__le64 va;
76*4882a593Smuzhiyun 	__le32 length_lo;
77*4882a593Smuzhiyun 	__le32 length_hi;
78*4882a593Smuzhiyun };
79*4882a593Smuzhiyun 
80*4882a593Smuzhiyun struct rq_ext_hdr {
81*4882a593Smuzhiyun 	__le64 rsvd1;
82*4882a593Smuzhiyun 	__le64 rsvd2;
83*4882a593Smuzhiyun };
84*4882a593Smuzhiyun 
85*4882a593Smuzhiyun /* Helper structures end */
86*4882a593Smuzhiyun 
87*4882a593Smuzhiyun struct bnxt_qplib_srq {
88*4882a593Smuzhiyun 	struct bnxt_qplib_pd		*pd;
89*4882a593Smuzhiyun 	struct bnxt_qplib_dpi		*dpi;
90*4882a593Smuzhiyun 	struct bnxt_qplib_db_info	dbinfo;
91*4882a593Smuzhiyun 	u64				srq_handle;
92*4882a593Smuzhiyun 	u32				id;
93*4882a593Smuzhiyun 	u16				wqe_size;
94*4882a593Smuzhiyun 	u32				max_wqe;
95*4882a593Smuzhiyun 	u32				max_sge;
96*4882a593Smuzhiyun 	u32				threshold;
97*4882a593Smuzhiyun 	bool				arm_req;
98*4882a593Smuzhiyun 	struct bnxt_qplib_cq		*cq;
99*4882a593Smuzhiyun 	struct bnxt_qplib_hwq		hwq;
100*4882a593Smuzhiyun 	struct bnxt_qplib_swq		*swq;
101*4882a593Smuzhiyun 	int				start_idx;
102*4882a593Smuzhiyun 	int				last_idx;
103*4882a593Smuzhiyun 	struct bnxt_qplib_sg_info	sg_info;
104*4882a593Smuzhiyun 	u16				eventq_hw_ring_id;
105*4882a593Smuzhiyun 	spinlock_t			lock; /* protect SRQE link list */
106*4882a593Smuzhiyun };
107*4882a593Smuzhiyun 
108*4882a593Smuzhiyun struct bnxt_qplib_sge {
109*4882a593Smuzhiyun 	u64				addr;
110*4882a593Smuzhiyun 	u32				lkey;
111*4882a593Smuzhiyun 	u32				size;
112*4882a593Smuzhiyun };
113*4882a593Smuzhiyun 
114*4882a593Smuzhiyun #define BNXT_QPLIB_QP_MAX_SGL	6
115*4882a593Smuzhiyun struct bnxt_qplib_swq {
116*4882a593Smuzhiyun 	u64				wr_id;
117*4882a593Smuzhiyun 	int				next_idx;
118*4882a593Smuzhiyun 	u8				type;
119*4882a593Smuzhiyun 	u8				flags;
120*4882a593Smuzhiyun 	u32				start_psn;
121*4882a593Smuzhiyun 	u32				next_psn;
122*4882a593Smuzhiyun 	u32				slot_idx;
123*4882a593Smuzhiyun 	u8				slots;
124*4882a593Smuzhiyun 	struct sq_psn_search		*psn_search;
125*4882a593Smuzhiyun 	struct sq_psn_search_ext	*psn_ext;
126*4882a593Smuzhiyun };
127*4882a593Smuzhiyun 
128*4882a593Smuzhiyun struct bnxt_qplib_swqe {
129*4882a593Smuzhiyun 	/* General */
130*4882a593Smuzhiyun #define	BNXT_QPLIB_FENCE_WRID	0x46454E43	/* "FENC" */
131*4882a593Smuzhiyun 	u64				wr_id;
132*4882a593Smuzhiyun 	u8				reqs_type;
133*4882a593Smuzhiyun 	u8				type;
134*4882a593Smuzhiyun #define BNXT_QPLIB_SWQE_TYPE_SEND			0
135*4882a593Smuzhiyun #define BNXT_QPLIB_SWQE_TYPE_SEND_WITH_IMM		1
136*4882a593Smuzhiyun #define BNXT_QPLIB_SWQE_TYPE_SEND_WITH_INV		2
137*4882a593Smuzhiyun #define BNXT_QPLIB_SWQE_TYPE_RDMA_WRITE			4
138*4882a593Smuzhiyun #define BNXT_QPLIB_SWQE_TYPE_RDMA_WRITE_WITH_IMM	5
139*4882a593Smuzhiyun #define BNXT_QPLIB_SWQE_TYPE_RDMA_READ			6
140*4882a593Smuzhiyun #define BNXT_QPLIB_SWQE_TYPE_ATOMIC_CMP_AND_SWP		8
141*4882a593Smuzhiyun #define BNXT_QPLIB_SWQE_TYPE_ATOMIC_FETCH_AND_ADD	11
142*4882a593Smuzhiyun #define BNXT_QPLIB_SWQE_TYPE_LOCAL_INV			12
143*4882a593Smuzhiyun #define BNXT_QPLIB_SWQE_TYPE_FAST_REG_MR		13
144*4882a593Smuzhiyun #define BNXT_QPLIB_SWQE_TYPE_REG_MR			13
145*4882a593Smuzhiyun #define BNXT_QPLIB_SWQE_TYPE_BIND_MW			14
146*4882a593Smuzhiyun #define BNXT_QPLIB_SWQE_TYPE_RECV			128
147*4882a593Smuzhiyun #define BNXT_QPLIB_SWQE_TYPE_RECV_RDMA_IMM		129
148*4882a593Smuzhiyun 	u8				flags;
149*4882a593Smuzhiyun #define BNXT_QPLIB_SWQE_FLAGS_SIGNAL_COMP		BIT(0)
150*4882a593Smuzhiyun #define BNXT_QPLIB_SWQE_FLAGS_RD_ATOMIC_FENCE		BIT(1)
151*4882a593Smuzhiyun #define BNXT_QPLIB_SWQE_FLAGS_UC_FENCE			BIT(2)
152*4882a593Smuzhiyun #define BNXT_QPLIB_SWQE_FLAGS_SOLICIT_EVENT		BIT(3)
153*4882a593Smuzhiyun #define BNXT_QPLIB_SWQE_FLAGS_INLINE			BIT(4)
154*4882a593Smuzhiyun 	struct bnxt_qplib_sge		sg_list[BNXT_QPLIB_QP_MAX_SGL];
155*4882a593Smuzhiyun 	int				num_sge;
156*4882a593Smuzhiyun 	/* Max inline data is 96 bytes */
157*4882a593Smuzhiyun 	u32				inline_len;
158*4882a593Smuzhiyun #define BNXT_QPLIB_SWQE_MAX_INLINE_LENGTH		96
159*4882a593Smuzhiyun 	u8		inline_data[BNXT_QPLIB_SWQE_MAX_INLINE_LENGTH];
160*4882a593Smuzhiyun 
161*4882a593Smuzhiyun 	union {
162*4882a593Smuzhiyun 		/* Send, with imm, inval key */
163*4882a593Smuzhiyun 		struct {
164*4882a593Smuzhiyun 			union {
165*4882a593Smuzhiyun 				__be32	imm_data;
166*4882a593Smuzhiyun 				u32	inv_key;
167*4882a593Smuzhiyun 			};
168*4882a593Smuzhiyun 			u32		q_key;
169*4882a593Smuzhiyun 			u32		dst_qp;
170*4882a593Smuzhiyun 			u16		avid;
171*4882a593Smuzhiyun 		} send;
172*4882a593Smuzhiyun 
173*4882a593Smuzhiyun 		/* Send Raw Ethernet and QP1 */
174*4882a593Smuzhiyun 		struct {
175*4882a593Smuzhiyun 			u16		lflags;
176*4882a593Smuzhiyun 			u16		cfa_action;
177*4882a593Smuzhiyun 			u32		cfa_meta;
178*4882a593Smuzhiyun 		} rawqp1;
179*4882a593Smuzhiyun 
180*4882a593Smuzhiyun 		/* RDMA write, with imm, read */
181*4882a593Smuzhiyun 		struct {
182*4882a593Smuzhiyun 			union {
183*4882a593Smuzhiyun 				__be32	imm_data;
184*4882a593Smuzhiyun 				u32	inv_key;
185*4882a593Smuzhiyun 			};
186*4882a593Smuzhiyun 			u64		remote_va;
187*4882a593Smuzhiyun 			u32		r_key;
188*4882a593Smuzhiyun 		} rdma;
189*4882a593Smuzhiyun 
190*4882a593Smuzhiyun 		/* Atomic cmp/swap, fetch/add */
191*4882a593Smuzhiyun 		struct {
192*4882a593Smuzhiyun 			u64		remote_va;
193*4882a593Smuzhiyun 			u32		r_key;
194*4882a593Smuzhiyun 			u64		swap_data;
195*4882a593Smuzhiyun 			u64		cmp_data;
196*4882a593Smuzhiyun 		} atomic;
197*4882a593Smuzhiyun 
198*4882a593Smuzhiyun 		/* Local Invalidate */
199*4882a593Smuzhiyun 		struct {
200*4882a593Smuzhiyun 			u32		inv_l_key;
201*4882a593Smuzhiyun 		} local_inv;
202*4882a593Smuzhiyun 
203*4882a593Smuzhiyun 		/* FR-PMR */
204*4882a593Smuzhiyun 		struct {
205*4882a593Smuzhiyun 			u8		access_cntl;
206*4882a593Smuzhiyun 			u8		pg_sz_log;
207*4882a593Smuzhiyun 			bool		zero_based;
208*4882a593Smuzhiyun 			u32		l_key;
209*4882a593Smuzhiyun 			u32		length;
210*4882a593Smuzhiyun 			u8		pbl_pg_sz_log;
211*4882a593Smuzhiyun #define BNXT_QPLIB_SWQE_PAGE_SIZE_4K			0
212*4882a593Smuzhiyun #define BNXT_QPLIB_SWQE_PAGE_SIZE_8K			1
213*4882a593Smuzhiyun #define BNXT_QPLIB_SWQE_PAGE_SIZE_64K			4
214*4882a593Smuzhiyun #define BNXT_QPLIB_SWQE_PAGE_SIZE_256K			6
215*4882a593Smuzhiyun #define BNXT_QPLIB_SWQE_PAGE_SIZE_1M			8
216*4882a593Smuzhiyun #define BNXT_QPLIB_SWQE_PAGE_SIZE_2M			9
217*4882a593Smuzhiyun #define BNXT_QPLIB_SWQE_PAGE_SIZE_4M			10
218*4882a593Smuzhiyun #define BNXT_QPLIB_SWQE_PAGE_SIZE_1G			18
219*4882a593Smuzhiyun 			u8		levels;
220*4882a593Smuzhiyun #define PAGE_SHIFT_4K	12
221*4882a593Smuzhiyun 			__le64		*pbl_ptr;
222*4882a593Smuzhiyun 			dma_addr_t	pbl_dma_ptr;
223*4882a593Smuzhiyun 			u64		*page_list;
224*4882a593Smuzhiyun 			u16		page_list_len;
225*4882a593Smuzhiyun 			u64		va;
226*4882a593Smuzhiyun 		} frmr;
227*4882a593Smuzhiyun 
228*4882a593Smuzhiyun 		/* Bind */
229*4882a593Smuzhiyun 		struct {
230*4882a593Smuzhiyun 			u8		access_cntl;
231*4882a593Smuzhiyun #define BNXT_QPLIB_BIND_SWQE_ACCESS_LOCAL_WRITE		BIT(0)
232*4882a593Smuzhiyun #define BNXT_QPLIB_BIND_SWQE_ACCESS_REMOTE_READ		BIT(1)
233*4882a593Smuzhiyun #define BNXT_QPLIB_BIND_SWQE_ACCESS_REMOTE_WRITE	BIT(2)
234*4882a593Smuzhiyun #define BNXT_QPLIB_BIND_SWQE_ACCESS_REMOTE_ATOMIC	BIT(3)
235*4882a593Smuzhiyun #define BNXT_QPLIB_BIND_SWQE_ACCESS_WINDOW_BIND		BIT(4)
236*4882a593Smuzhiyun 			bool		zero_based;
237*4882a593Smuzhiyun 			u8		mw_type;
238*4882a593Smuzhiyun 			u32		parent_l_key;
239*4882a593Smuzhiyun 			u32		r_key;
240*4882a593Smuzhiyun 			u64		va;
241*4882a593Smuzhiyun 			u32		length;
242*4882a593Smuzhiyun 		} bind;
243*4882a593Smuzhiyun 	};
244*4882a593Smuzhiyun };
245*4882a593Smuzhiyun 
246*4882a593Smuzhiyun struct bnxt_qplib_q {
247*4882a593Smuzhiyun 	struct bnxt_qplib_hwq		hwq;
248*4882a593Smuzhiyun 	struct bnxt_qplib_swq		*swq;
249*4882a593Smuzhiyun 	struct bnxt_qplib_db_info	dbinfo;
250*4882a593Smuzhiyun 	struct bnxt_qplib_sg_info	sg_info;
251*4882a593Smuzhiyun 	u32				max_wqe;
252*4882a593Smuzhiyun 	u16				wqe_size;
253*4882a593Smuzhiyun 	u16				q_full_delta;
254*4882a593Smuzhiyun 	u16				max_sge;
255*4882a593Smuzhiyun 	u32				psn;
256*4882a593Smuzhiyun 	bool				condition;
257*4882a593Smuzhiyun 	bool				single;
258*4882a593Smuzhiyun 	bool				send_phantom;
259*4882a593Smuzhiyun 	u32				phantom_wqe_cnt;
260*4882a593Smuzhiyun 	u32				phantom_cqe_cnt;
261*4882a593Smuzhiyun 	u32				next_cq_cons;
262*4882a593Smuzhiyun 	bool				flushed;
263*4882a593Smuzhiyun 	u32				swq_start;
264*4882a593Smuzhiyun 	u32				swq_last;
265*4882a593Smuzhiyun };
266*4882a593Smuzhiyun 
267*4882a593Smuzhiyun struct bnxt_qplib_qp {
268*4882a593Smuzhiyun 	struct bnxt_qplib_pd		*pd;
269*4882a593Smuzhiyun 	struct bnxt_qplib_dpi		*dpi;
270*4882a593Smuzhiyun 	struct bnxt_qplib_chip_ctx	*cctx;
271*4882a593Smuzhiyun 	u64				qp_handle;
272*4882a593Smuzhiyun #define BNXT_QPLIB_QP_ID_INVALID        0xFFFFFFFF
273*4882a593Smuzhiyun 	u32				id;
274*4882a593Smuzhiyun 	u8				type;
275*4882a593Smuzhiyun 	u8				sig_type;
276*4882a593Smuzhiyun 	u8				wqe_mode;
277*4882a593Smuzhiyun 	u8				state;
278*4882a593Smuzhiyun 	u8				cur_qp_state;
279*4882a593Smuzhiyun 	u64				modify_flags;
280*4882a593Smuzhiyun 	u32				max_inline_data;
281*4882a593Smuzhiyun 	u32				mtu;
282*4882a593Smuzhiyun 	u8				path_mtu;
283*4882a593Smuzhiyun 	bool				en_sqd_async_notify;
284*4882a593Smuzhiyun 	u16				pkey_index;
285*4882a593Smuzhiyun 	u32				qkey;
286*4882a593Smuzhiyun 	u32				dest_qp_id;
287*4882a593Smuzhiyun 	u8				access;
288*4882a593Smuzhiyun 	u8				timeout;
289*4882a593Smuzhiyun 	u8				retry_cnt;
290*4882a593Smuzhiyun 	u8				rnr_retry;
291*4882a593Smuzhiyun 	u64				wqe_cnt;
292*4882a593Smuzhiyun 	u32				min_rnr_timer;
293*4882a593Smuzhiyun 	u32				max_rd_atomic;
294*4882a593Smuzhiyun 	u32				max_dest_rd_atomic;
295*4882a593Smuzhiyun 	u32				dest_qpn;
296*4882a593Smuzhiyun 	u8				smac[6];
297*4882a593Smuzhiyun 	u16				vlan_id;
298*4882a593Smuzhiyun 	u8				nw_type;
299*4882a593Smuzhiyun 	struct bnxt_qplib_ah		ah;
300*4882a593Smuzhiyun 
301*4882a593Smuzhiyun #define BTH_PSN_MASK			((1 << 24) - 1)
302*4882a593Smuzhiyun 	/* SQ */
303*4882a593Smuzhiyun 	struct bnxt_qplib_q		sq;
304*4882a593Smuzhiyun 	/* RQ */
305*4882a593Smuzhiyun 	struct bnxt_qplib_q		rq;
306*4882a593Smuzhiyun 	/* SRQ */
307*4882a593Smuzhiyun 	struct bnxt_qplib_srq		*srq;
308*4882a593Smuzhiyun 	/* CQ */
309*4882a593Smuzhiyun 	struct bnxt_qplib_cq		*scq;
310*4882a593Smuzhiyun 	struct bnxt_qplib_cq		*rcq;
311*4882a593Smuzhiyun 	/* IRRQ and ORRQ */
312*4882a593Smuzhiyun 	struct bnxt_qplib_hwq		irrq;
313*4882a593Smuzhiyun 	struct bnxt_qplib_hwq		orrq;
314*4882a593Smuzhiyun 	/* Header buffer for QP1 */
315*4882a593Smuzhiyun 	int				sq_hdr_buf_size;
316*4882a593Smuzhiyun 	int				rq_hdr_buf_size;
317*4882a593Smuzhiyun /*
318*4882a593Smuzhiyun  * Buffer space for ETH(14), IP or GRH(40), UDP header(8)
319*4882a593Smuzhiyun  * and ib_bth + ib_deth (20).
320*4882a593Smuzhiyun  * Max required is 82 when RoCE V2 is enabled
321*4882a593Smuzhiyun  */
322*4882a593Smuzhiyun #define BNXT_QPLIB_MAX_QP1_SQ_HDR_SIZE_V2	86
323*4882a593Smuzhiyun 	/* Ethernet header	=  14 */
324*4882a593Smuzhiyun 	/* ib_grh		=  40 (provided by MAD) */
325*4882a593Smuzhiyun 	/* ib_bth + ib_deth	=  20 */
326*4882a593Smuzhiyun 	/* MAD			= 256 (provided by MAD) */
327*4882a593Smuzhiyun 	/* iCRC			=   4 */
328*4882a593Smuzhiyun #define BNXT_QPLIB_MAX_QP1_RQ_ETH_HDR_SIZE	14
329*4882a593Smuzhiyun #define BNXT_QPLIB_MAX_QP1_RQ_HDR_SIZE_V2	512
330*4882a593Smuzhiyun #define BNXT_QPLIB_MAX_GRH_HDR_SIZE_IPV4	20
331*4882a593Smuzhiyun #define BNXT_QPLIB_MAX_GRH_HDR_SIZE_IPV6	40
332*4882a593Smuzhiyun #define BNXT_QPLIB_MAX_QP1_RQ_BDETH_HDR_SIZE	20
333*4882a593Smuzhiyun 	void				*sq_hdr_buf;
334*4882a593Smuzhiyun 	dma_addr_t			sq_hdr_buf_map;
335*4882a593Smuzhiyun 	void				*rq_hdr_buf;
336*4882a593Smuzhiyun 	dma_addr_t			rq_hdr_buf_map;
337*4882a593Smuzhiyun 	struct list_head		sq_flush;
338*4882a593Smuzhiyun 	struct list_head		rq_flush;
339*4882a593Smuzhiyun };
340*4882a593Smuzhiyun 
341*4882a593Smuzhiyun #define BNXT_QPLIB_MAX_CQE_ENTRY_SIZE	sizeof(struct cq_base)
342*4882a593Smuzhiyun 
343*4882a593Smuzhiyun #define CQE_CNT_PER_PG		(PAGE_SIZE / BNXT_QPLIB_MAX_CQE_ENTRY_SIZE)
344*4882a593Smuzhiyun #define CQE_MAX_IDX_PER_PG	(CQE_CNT_PER_PG - 1)
345*4882a593Smuzhiyun #define CQE_PG(x)		(((x) & ~CQE_MAX_IDX_PER_PG) / CQE_CNT_PER_PG)
346*4882a593Smuzhiyun #define CQE_IDX(x)		((x) & CQE_MAX_IDX_PER_PG)
347*4882a593Smuzhiyun 
348*4882a593Smuzhiyun #define ROCE_CQE_CMP_V			0
349*4882a593Smuzhiyun #define CQE_CMP_VALID(hdr, raw_cons, cp_bit)			\
350*4882a593Smuzhiyun 	(!!((hdr)->cqe_type_toggle & CQ_BASE_TOGGLE) ==		\
351*4882a593Smuzhiyun 	   !((raw_cons) & (cp_bit)))
352*4882a593Smuzhiyun 
bnxt_qplib_queue_full(struct bnxt_qplib_q * que,u8 slots)353*4882a593Smuzhiyun static inline bool bnxt_qplib_queue_full(struct bnxt_qplib_q *que,
354*4882a593Smuzhiyun 					 u8 slots)
355*4882a593Smuzhiyun {
356*4882a593Smuzhiyun 	struct bnxt_qplib_hwq *hwq;
357*4882a593Smuzhiyun 	int avail;
358*4882a593Smuzhiyun 
359*4882a593Smuzhiyun 	hwq = &que->hwq;
360*4882a593Smuzhiyun 	/* False full is possible, retrying post-send makes sense */
361*4882a593Smuzhiyun 	avail = hwq->cons - hwq->prod;
362*4882a593Smuzhiyun 	if (hwq->cons <= hwq->prod)
363*4882a593Smuzhiyun 		avail += hwq->depth;
364*4882a593Smuzhiyun 	return avail <= slots;
365*4882a593Smuzhiyun }
366*4882a593Smuzhiyun 
367*4882a593Smuzhiyun struct bnxt_qplib_cqe {
368*4882a593Smuzhiyun 	u8				status;
369*4882a593Smuzhiyun 	u8				type;
370*4882a593Smuzhiyun 	u8				opcode;
371*4882a593Smuzhiyun 	u32				length;
372*4882a593Smuzhiyun 	u16				cfa_meta;
373*4882a593Smuzhiyun 	u64				wr_id;
374*4882a593Smuzhiyun 	union {
375*4882a593Smuzhiyun 		__be32			immdata;
376*4882a593Smuzhiyun 		u32			invrkey;
377*4882a593Smuzhiyun 	};
378*4882a593Smuzhiyun 	u64				qp_handle;
379*4882a593Smuzhiyun 	u64				mr_handle;
380*4882a593Smuzhiyun 	u16				flags;
381*4882a593Smuzhiyun 	u8				smac[6];
382*4882a593Smuzhiyun 	u32				src_qp;
383*4882a593Smuzhiyun 	u16				raweth_qp1_flags;
384*4882a593Smuzhiyun 	u16				raweth_qp1_errors;
385*4882a593Smuzhiyun 	u16				raweth_qp1_cfa_code;
386*4882a593Smuzhiyun 	u32				raweth_qp1_flags2;
387*4882a593Smuzhiyun 	u32				raweth_qp1_metadata;
388*4882a593Smuzhiyun 	u8				raweth_qp1_payload_offset;
389*4882a593Smuzhiyun 	u16				pkey_index;
390*4882a593Smuzhiyun };
391*4882a593Smuzhiyun 
392*4882a593Smuzhiyun #define BNXT_QPLIB_QUEUE_START_PERIOD		0x01
393*4882a593Smuzhiyun struct bnxt_qplib_cq {
394*4882a593Smuzhiyun 	struct bnxt_qplib_dpi		*dpi;
395*4882a593Smuzhiyun 	struct bnxt_qplib_db_info	dbinfo;
396*4882a593Smuzhiyun 	u32				max_wqe;
397*4882a593Smuzhiyun 	u32				id;
398*4882a593Smuzhiyun 	u16				count;
399*4882a593Smuzhiyun 	u16				period;
400*4882a593Smuzhiyun 	struct bnxt_qplib_hwq		hwq;
401*4882a593Smuzhiyun 	u32				cnq_hw_ring_id;
402*4882a593Smuzhiyun 	struct bnxt_qplib_nq		*nq;
403*4882a593Smuzhiyun 	bool				resize_in_progress;
404*4882a593Smuzhiyun 	struct bnxt_qplib_sg_info	sg_info;
405*4882a593Smuzhiyun 	u64				cq_handle;
406*4882a593Smuzhiyun 
407*4882a593Smuzhiyun #define CQ_RESIZE_WAIT_TIME_MS		500
408*4882a593Smuzhiyun 	unsigned long			flags;
409*4882a593Smuzhiyun #define CQ_FLAGS_RESIZE_IN_PROG		1
410*4882a593Smuzhiyun 	wait_queue_head_t		waitq;
411*4882a593Smuzhiyun 	struct list_head		sqf_head, rqf_head;
412*4882a593Smuzhiyun 	atomic_t			arm_state;
413*4882a593Smuzhiyun 	spinlock_t			compl_lock; /* synch CQ handlers */
414*4882a593Smuzhiyun /* Locking Notes:
415*4882a593Smuzhiyun  * QP can move to error state from modify_qp, async error event or error
416*4882a593Smuzhiyun  * CQE as part of poll_cq. When QP is moved to error state, it gets added
417*4882a593Smuzhiyun  * to two flush lists, one each for SQ and RQ.
418*4882a593Smuzhiyun  * Each flush list is protected by qplib_cq->flush_lock. Both scq and rcq
419*4882a593Smuzhiyun  * flush_locks should be acquired when QP is moved to error. The control path
420*4882a593Smuzhiyun  * operations(modify_qp and async error events) are synchronized with poll_cq
421*4882a593Smuzhiyun  * using upper level CQ locks (bnxt_re_cq->cq_lock) of both SCQ and RCQ.
422*4882a593Smuzhiyun  * The qplib_cq->flush_lock is required to synchronize two instances of poll_cq
423*4882a593Smuzhiyun  * of the same QP while manipulating the flush list.
424*4882a593Smuzhiyun  */
425*4882a593Smuzhiyun 	spinlock_t			flush_lock; /* QP flush management */
426*4882a593Smuzhiyun 	u16				cnq_events;
427*4882a593Smuzhiyun };
428*4882a593Smuzhiyun 
429*4882a593Smuzhiyun #define BNXT_QPLIB_MAX_IRRQE_ENTRY_SIZE	sizeof(struct xrrq_irrq)
430*4882a593Smuzhiyun #define BNXT_QPLIB_MAX_ORRQE_ENTRY_SIZE	sizeof(struct xrrq_orrq)
431*4882a593Smuzhiyun #define IRD_LIMIT_TO_IRRQ_SLOTS(x)	(2 * (x) + 2)
432*4882a593Smuzhiyun #define IRRQ_SLOTS_TO_IRD_LIMIT(s)	(((s) >> 1) - 1)
433*4882a593Smuzhiyun #define ORD_LIMIT_TO_ORRQ_SLOTS(x)	((x) + 1)
434*4882a593Smuzhiyun #define ORRQ_SLOTS_TO_ORD_LIMIT(s)	((s) - 1)
435*4882a593Smuzhiyun 
436*4882a593Smuzhiyun #define BNXT_QPLIB_MAX_NQE_ENTRY_SIZE	sizeof(struct nq_base)
437*4882a593Smuzhiyun 
438*4882a593Smuzhiyun #define NQE_CNT_PER_PG		(PAGE_SIZE / BNXT_QPLIB_MAX_NQE_ENTRY_SIZE)
439*4882a593Smuzhiyun #define NQE_MAX_IDX_PER_PG	(NQE_CNT_PER_PG - 1)
440*4882a593Smuzhiyun #define NQE_PG(x)		(((x) & ~NQE_MAX_IDX_PER_PG) / NQE_CNT_PER_PG)
441*4882a593Smuzhiyun #define NQE_IDX(x)		((x) & NQE_MAX_IDX_PER_PG)
442*4882a593Smuzhiyun 
443*4882a593Smuzhiyun #define NQE_CMP_VALID(hdr, raw_cons, cp_bit)			\
444*4882a593Smuzhiyun 	(!!(le32_to_cpu((hdr)->info63_v[0]) & NQ_BASE_V) ==	\
445*4882a593Smuzhiyun 	   !((raw_cons) & (cp_bit)))
446*4882a593Smuzhiyun 
447*4882a593Smuzhiyun #define BNXT_QPLIB_NQE_MAX_CNT		(128 * 1024)
448*4882a593Smuzhiyun 
449*4882a593Smuzhiyun #define NQ_CONS_PCI_BAR_REGION		2
450*4882a593Smuzhiyun #define NQ_DB_KEY_CP			(0x2 << CMPL_DOORBELL_KEY_SFT)
451*4882a593Smuzhiyun #define NQ_DB_IDX_VALID			CMPL_DOORBELL_IDX_VALID
452*4882a593Smuzhiyun #define NQ_DB_IRQ_DIS			CMPL_DOORBELL_MASK
453*4882a593Smuzhiyun #define NQ_DB_CP_FLAGS_REARM		(NQ_DB_KEY_CP |		\
454*4882a593Smuzhiyun 					 NQ_DB_IDX_VALID)
455*4882a593Smuzhiyun #define NQ_DB_CP_FLAGS			(NQ_DB_KEY_CP    |	\
456*4882a593Smuzhiyun 					 NQ_DB_IDX_VALID |	\
457*4882a593Smuzhiyun 					 NQ_DB_IRQ_DIS)
458*4882a593Smuzhiyun 
459*4882a593Smuzhiyun struct bnxt_qplib_nq_db {
460*4882a593Smuzhiyun 	struct bnxt_qplib_reg_desc	reg;
461*4882a593Smuzhiyun 	struct bnxt_qplib_db_info	dbinfo;
462*4882a593Smuzhiyun };
463*4882a593Smuzhiyun 
464*4882a593Smuzhiyun typedef int (*cqn_handler_t)(struct bnxt_qplib_nq *nq,
465*4882a593Smuzhiyun 		struct bnxt_qplib_cq *cq);
466*4882a593Smuzhiyun typedef int (*srqn_handler_t)(struct bnxt_qplib_nq *nq,
467*4882a593Smuzhiyun 		struct bnxt_qplib_srq *srq, u8 event);
468*4882a593Smuzhiyun 
469*4882a593Smuzhiyun struct bnxt_qplib_nq {
470*4882a593Smuzhiyun 	struct pci_dev			*pdev;
471*4882a593Smuzhiyun 	struct bnxt_qplib_res		*res;
472*4882a593Smuzhiyun 	char				name[32];
473*4882a593Smuzhiyun 	struct bnxt_qplib_hwq		hwq;
474*4882a593Smuzhiyun 	struct bnxt_qplib_nq_db		nq_db;
475*4882a593Smuzhiyun 	u16				ring_id;
476*4882a593Smuzhiyun 	int				msix_vec;
477*4882a593Smuzhiyun 	cpumask_t			mask;
478*4882a593Smuzhiyun 	struct tasklet_struct		nq_tasklet;
479*4882a593Smuzhiyun 	bool				requested;
480*4882a593Smuzhiyun 	int				budget;
481*4882a593Smuzhiyun 
482*4882a593Smuzhiyun 	cqn_handler_t			cqn_handler;
483*4882a593Smuzhiyun 	srqn_handler_t			srqn_handler;
484*4882a593Smuzhiyun 	struct workqueue_struct		*cqn_wq;
485*4882a593Smuzhiyun };
486*4882a593Smuzhiyun 
487*4882a593Smuzhiyun struct bnxt_qplib_nq_work {
488*4882a593Smuzhiyun 	struct work_struct      work;
489*4882a593Smuzhiyun 	struct bnxt_qplib_nq    *nq;
490*4882a593Smuzhiyun 	struct bnxt_qplib_cq    *cq;
491*4882a593Smuzhiyun };
492*4882a593Smuzhiyun 
493*4882a593Smuzhiyun void bnxt_qplib_nq_stop_irq(struct bnxt_qplib_nq *nq, bool kill);
494*4882a593Smuzhiyun void bnxt_qplib_disable_nq(struct bnxt_qplib_nq *nq);
495*4882a593Smuzhiyun int bnxt_qplib_nq_start_irq(struct bnxt_qplib_nq *nq, int nq_indx,
496*4882a593Smuzhiyun 			    int msix_vector, bool need_init);
497*4882a593Smuzhiyun int bnxt_qplib_enable_nq(struct pci_dev *pdev, struct bnxt_qplib_nq *nq,
498*4882a593Smuzhiyun 			 int nq_idx, int msix_vector, int bar_reg_offset,
499*4882a593Smuzhiyun 			 cqn_handler_t cqn_handler,
500*4882a593Smuzhiyun 			 srqn_handler_t srq_handler);
501*4882a593Smuzhiyun int bnxt_qplib_create_srq(struct bnxt_qplib_res *res,
502*4882a593Smuzhiyun 			  struct bnxt_qplib_srq *srq);
503*4882a593Smuzhiyun int bnxt_qplib_modify_srq(struct bnxt_qplib_res *res,
504*4882a593Smuzhiyun 			  struct bnxt_qplib_srq *srq);
505*4882a593Smuzhiyun int bnxt_qplib_query_srq(struct bnxt_qplib_res *res,
506*4882a593Smuzhiyun 			 struct bnxt_qplib_srq *srq);
507*4882a593Smuzhiyun void bnxt_qplib_destroy_srq(struct bnxt_qplib_res *res,
508*4882a593Smuzhiyun 			    struct bnxt_qplib_srq *srq);
509*4882a593Smuzhiyun int bnxt_qplib_post_srq_recv(struct bnxt_qplib_srq *srq,
510*4882a593Smuzhiyun 			     struct bnxt_qplib_swqe *wqe);
511*4882a593Smuzhiyun int bnxt_qplib_create_qp1(struct bnxt_qplib_res *res, struct bnxt_qplib_qp *qp);
512*4882a593Smuzhiyun int bnxt_qplib_create_qp(struct bnxt_qplib_res *res, struct bnxt_qplib_qp *qp);
513*4882a593Smuzhiyun int bnxt_qplib_modify_qp(struct bnxt_qplib_res *res, struct bnxt_qplib_qp *qp);
514*4882a593Smuzhiyun int bnxt_qplib_query_qp(struct bnxt_qplib_res *res, struct bnxt_qplib_qp *qp);
515*4882a593Smuzhiyun int bnxt_qplib_destroy_qp(struct bnxt_qplib_res *res, struct bnxt_qplib_qp *qp);
516*4882a593Smuzhiyun void bnxt_qplib_clean_qp(struct bnxt_qplib_qp *qp);
517*4882a593Smuzhiyun void bnxt_qplib_free_qp_res(struct bnxt_qplib_res *res,
518*4882a593Smuzhiyun 			    struct bnxt_qplib_qp *qp);
519*4882a593Smuzhiyun void *bnxt_qplib_get_qp1_sq_buf(struct bnxt_qplib_qp *qp,
520*4882a593Smuzhiyun 				struct bnxt_qplib_sge *sge);
521*4882a593Smuzhiyun void *bnxt_qplib_get_qp1_rq_buf(struct bnxt_qplib_qp *qp,
522*4882a593Smuzhiyun 				struct bnxt_qplib_sge *sge);
523*4882a593Smuzhiyun u32 bnxt_qplib_get_rq_prod_index(struct bnxt_qplib_qp *qp);
524*4882a593Smuzhiyun dma_addr_t bnxt_qplib_get_qp_buf_from_index(struct bnxt_qplib_qp *qp,
525*4882a593Smuzhiyun 					    u32 index);
526*4882a593Smuzhiyun void bnxt_qplib_post_send_db(struct bnxt_qplib_qp *qp);
527*4882a593Smuzhiyun int bnxt_qplib_post_send(struct bnxt_qplib_qp *qp,
528*4882a593Smuzhiyun 			 struct bnxt_qplib_swqe *wqe);
529*4882a593Smuzhiyun void bnxt_qplib_post_recv_db(struct bnxt_qplib_qp *qp);
530*4882a593Smuzhiyun int bnxt_qplib_post_recv(struct bnxt_qplib_qp *qp,
531*4882a593Smuzhiyun 			 struct bnxt_qplib_swqe *wqe);
532*4882a593Smuzhiyun int bnxt_qplib_create_cq(struct bnxt_qplib_res *res, struct bnxt_qplib_cq *cq);
533*4882a593Smuzhiyun int bnxt_qplib_destroy_cq(struct bnxt_qplib_res *res, struct bnxt_qplib_cq *cq);
534*4882a593Smuzhiyun int bnxt_qplib_poll_cq(struct bnxt_qplib_cq *cq, struct bnxt_qplib_cqe *cqe,
535*4882a593Smuzhiyun 		       int num, struct bnxt_qplib_qp **qp);
536*4882a593Smuzhiyun bool bnxt_qplib_is_cq_empty(struct bnxt_qplib_cq *cq);
537*4882a593Smuzhiyun void bnxt_qplib_req_notify_cq(struct bnxt_qplib_cq *cq, u32 arm_type);
538*4882a593Smuzhiyun void bnxt_qplib_free_nq(struct bnxt_qplib_nq *nq);
539*4882a593Smuzhiyun int bnxt_qplib_alloc_nq(struct bnxt_qplib_res *res, struct bnxt_qplib_nq *nq);
540*4882a593Smuzhiyun void bnxt_qplib_add_flush_qp(struct bnxt_qplib_qp *qp);
541*4882a593Smuzhiyun void bnxt_qplib_acquire_cq_locks(struct bnxt_qplib_qp *qp,
542*4882a593Smuzhiyun 				 unsigned long *flags);
543*4882a593Smuzhiyun void bnxt_qplib_release_cq_locks(struct bnxt_qplib_qp *qp,
544*4882a593Smuzhiyun 				 unsigned long *flags);
545*4882a593Smuzhiyun int bnxt_qplib_process_flush_list(struct bnxt_qplib_cq *cq,
546*4882a593Smuzhiyun 				  struct bnxt_qplib_cqe *cqe,
547*4882a593Smuzhiyun 				  int num_cqes);
548*4882a593Smuzhiyun void bnxt_qplib_flush_cqn_wq(struct bnxt_qplib_qp *qp);
549*4882a593Smuzhiyun 
bnxt_qplib_get_swqe(struct bnxt_qplib_q * que,u32 * swq_idx)550*4882a593Smuzhiyun static inline void *bnxt_qplib_get_swqe(struct bnxt_qplib_q *que, u32 *swq_idx)
551*4882a593Smuzhiyun {
552*4882a593Smuzhiyun 	u32 idx;
553*4882a593Smuzhiyun 
554*4882a593Smuzhiyun 	idx = que->swq_start;
555*4882a593Smuzhiyun 	if (swq_idx)
556*4882a593Smuzhiyun 		*swq_idx = idx;
557*4882a593Smuzhiyun 	return &que->swq[idx];
558*4882a593Smuzhiyun }
559*4882a593Smuzhiyun 
bnxt_qplib_swq_mod_start(struct bnxt_qplib_q * que,u32 idx)560*4882a593Smuzhiyun static inline void bnxt_qplib_swq_mod_start(struct bnxt_qplib_q *que, u32 idx)
561*4882a593Smuzhiyun {
562*4882a593Smuzhiyun 	que->swq_start = que->swq[idx].next_idx;
563*4882a593Smuzhiyun }
564*4882a593Smuzhiyun 
bnxt_qplib_get_depth(struct bnxt_qplib_q * que)565*4882a593Smuzhiyun static inline u32 bnxt_qplib_get_depth(struct bnxt_qplib_q *que)
566*4882a593Smuzhiyun {
567*4882a593Smuzhiyun 	return (que->wqe_size * que->max_wqe) / sizeof(struct sq_sge);
568*4882a593Smuzhiyun }
569*4882a593Smuzhiyun 
bnxt_qplib_set_sq_size(struct bnxt_qplib_q * que,u8 wqe_mode)570*4882a593Smuzhiyun static inline u32 bnxt_qplib_set_sq_size(struct bnxt_qplib_q *que, u8 wqe_mode)
571*4882a593Smuzhiyun {
572*4882a593Smuzhiyun 	return (wqe_mode == BNXT_QPLIB_WQE_MODE_STATIC) ?
573*4882a593Smuzhiyun 		que->max_wqe : bnxt_qplib_get_depth(que);
574*4882a593Smuzhiyun }
575*4882a593Smuzhiyun 
bnxt_qplib_set_sq_max_slot(u8 wqe_mode)576*4882a593Smuzhiyun static inline u32 bnxt_qplib_set_sq_max_slot(u8 wqe_mode)
577*4882a593Smuzhiyun {
578*4882a593Smuzhiyun 	return (wqe_mode == BNXT_QPLIB_WQE_MODE_STATIC) ?
579*4882a593Smuzhiyun 		sizeof(struct sq_send) / sizeof(struct sq_sge) : 1;
580*4882a593Smuzhiyun }
581*4882a593Smuzhiyun 
bnxt_qplib_set_rq_max_slot(u32 wqe_size)582*4882a593Smuzhiyun static inline u32 bnxt_qplib_set_rq_max_slot(u32 wqe_size)
583*4882a593Smuzhiyun {
584*4882a593Smuzhiyun 	return (wqe_size / sizeof(struct sq_sge));
585*4882a593Smuzhiyun }
586*4882a593Smuzhiyun 
__xlate_qfd(u16 delta,u16 wqe_bytes)587*4882a593Smuzhiyun static inline u16 __xlate_qfd(u16 delta, u16 wqe_bytes)
588*4882a593Smuzhiyun {
589*4882a593Smuzhiyun 	/* For Cu/Wh delta = 128, stride = 16, wqe_bytes = 128
590*4882a593Smuzhiyun 	 * For Gen-p5 B/C mode delta = 0, stride = 16, wqe_bytes = 128.
591*4882a593Smuzhiyun 	 * For Gen-p5 delta = 0, stride = 16, 32 <= wqe_bytes <= 512.
592*4882a593Smuzhiyun 	 * when 8916 is disabled.
593*4882a593Smuzhiyun 	 */
594*4882a593Smuzhiyun 	return (delta * wqe_bytes) / sizeof(struct sq_sge);
595*4882a593Smuzhiyun }
596*4882a593Smuzhiyun 
bnxt_qplib_calc_ilsize(struct bnxt_qplib_swqe * wqe,u16 max)597*4882a593Smuzhiyun static inline u16 bnxt_qplib_calc_ilsize(struct bnxt_qplib_swqe *wqe, u16 max)
598*4882a593Smuzhiyun {
599*4882a593Smuzhiyun 	u16 size = 0;
600*4882a593Smuzhiyun 	int indx;
601*4882a593Smuzhiyun 
602*4882a593Smuzhiyun 	for (indx = 0; indx < wqe->num_sge; indx++)
603*4882a593Smuzhiyun 		size += wqe->sg_list[indx].size;
604*4882a593Smuzhiyun 	if (size > max)
605*4882a593Smuzhiyun 		size = max;
606*4882a593Smuzhiyun 
607*4882a593Smuzhiyun 	return size;
608*4882a593Smuzhiyun }
609*4882a593Smuzhiyun #endif /* __BNXT_QPLIB_FP_H__ */
610