xref: /OK3568_Linux_fs/kernel/drivers/infiniband/hw/bnxt_re/qplib_res.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: QPLib resource manager (header)
37*4882a593Smuzhiyun  */
38*4882a593Smuzhiyun 
39*4882a593Smuzhiyun #ifndef __BNXT_QPLIB_RES_H__
40*4882a593Smuzhiyun #define __BNXT_QPLIB_RES_H__
41*4882a593Smuzhiyun 
42*4882a593Smuzhiyun extern const struct bnxt_qplib_gid bnxt_qplib_gid_zero;
43*4882a593Smuzhiyun 
44*4882a593Smuzhiyun #define CHIP_NUM_57508		0x1750
45*4882a593Smuzhiyun #define CHIP_NUM_57504		0x1751
46*4882a593Smuzhiyun #define CHIP_NUM_57502		0x1752
47*4882a593Smuzhiyun 
48*4882a593Smuzhiyun enum bnxt_qplib_wqe_mode {
49*4882a593Smuzhiyun 	BNXT_QPLIB_WQE_MODE_STATIC	= 0x00,
50*4882a593Smuzhiyun 	BNXT_QPLIB_WQE_MODE_VARIABLE	= 0x01,
51*4882a593Smuzhiyun 	BNXT_QPLIB_WQE_MODE_INVALID	= 0x02
52*4882a593Smuzhiyun };
53*4882a593Smuzhiyun 
54*4882a593Smuzhiyun struct bnxt_qplib_drv_modes {
55*4882a593Smuzhiyun 	u8	wqe_mode;
56*4882a593Smuzhiyun 	/* Other modes to follow here */
57*4882a593Smuzhiyun };
58*4882a593Smuzhiyun 
59*4882a593Smuzhiyun struct bnxt_qplib_chip_ctx {
60*4882a593Smuzhiyun 	u16	chip_num;
61*4882a593Smuzhiyun 	u8	chip_rev;
62*4882a593Smuzhiyun 	u8	chip_metal;
63*4882a593Smuzhiyun 	u16	hw_stats_size;
64*4882a593Smuzhiyun 	struct bnxt_qplib_drv_modes modes;
65*4882a593Smuzhiyun };
66*4882a593Smuzhiyun 
67*4882a593Smuzhiyun #define PTR_CNT_PER_PG		(PAGE_SIZE / sizeof(void *))
68*4882a593Smuzhiyun #define PTR_MAX_IDX_PER_PG	(PTR_CNT_PER_PG - 1)
69*4882a593Smuzhiyun #define PTR_PG(x)		(((x) & ~PTR_MAX_IDX_PER_PG) / PTR_CNT_PER_PG)
70*4882a593Smuzhiyun #define PTR_IDX(x)		((x) & PTR_MAX_IDX_PER_PG)
71*4882a593Smuzhiyun 
72*4882a593Smuzhiyun #define HWQ_CMP(idx, hwq)	((idx) & ((hwq)->max_elements - 1))
73*4882a593Smuzhiyun 
74*4882a593Smuzhiyun #define HWQ_FREE_SLOTS(hwq)	(hwq->max_elements - \
75*4882a593Smuzhiyun 				((HWQ_CMP(hwq->prod, hwq)\
76*4882a593Smuzhiyun 				- HWQ_CMP(hwq->cons, hwq))\
77*4882a593Smuzhiyun 				& (hwq->max_elements - 1)))
78*4882a593Smuzhiyun enum bnxt_qplib_hwq_type {
79*4882a593Smuzhiyun 	HWQ_TYPE_CTX,
80*4882a593Smuzhiyun 	HWQ_TYPE_QUEUE,
81*4882a593Smuzhiyun 	HWQ_TYPE_L2_CMPL,
82*4882a593Smuzhiyun 	HWQ_TYPE_MR
83*4882a593Smuzhiyun };
84*4882a593Smuzhiyun 
85*4882a593Smuzhiyun #define MAX_PBL_LVL_0_PGS		1
86*4882a593Smuzhiyun #define MAX_PBL_LVL_1_PGS		512
87*4882a593Smuzhiyun #define MAX_PBL_LVL_1_PGS_SHIFT		9
88*4882a593Smuzhiyun #define MAX_PBL_LVL_1_PGS_FOR_LVL_2	256
89*4882a593Smuzhiyun #define MAX_PBL_LVL_2_PGS		(256 * 512)
90*4882a593Smuzhiyun #define MAX_PDL_LVL_SHIFT               9
91*4882a593Smuzhiyun 
92*4882a593Smuzhiyun enum bnxt_qplib_pbl_lvl {
93*4882a593Smuzhiyun 	PBL_LVL_0,
94*4882a593Smuzhiyun 	PBL_LVL_1,
95*4882a593Smuzhiyun 	PBL_LVL_2,
96*4882a593Smuzhiyun 	PBL_LVL_MAX
97*4882a593Smuzhiyun };
98*4882a593Smuzhiyun 
99*4882a593Smuzhiyun #define ROCE_PG_SIZE_4K		(4 * 1024)
100*4882a593Smuzhiyun #define ROCE_PG_SIZE_8K		(8 * 1024)
101*4882a593Smuzhiyun #define ROCE_PG_SIZE_64K	(64 * 1024)
102*4882a593Smuzhiyun #define ROCE_PG_SIZE_2M		(2 * 1024 * 1024)
103*4882a593Smuzhiyun #define ROCE_PG_SIZE_8M		(8 * 1024 * 1024)
104*4882a593Smuzhiyun #define ROCE_PG_SIZE_1G		(1024 * 1024 * 1024)
105*4882a593Smuzhiyun 
106*4882a593Smuzhiyun enum bnxt_qplib_hwrm_pg_size {
107*4882a593Smuzhiyun 	BNXT_QPLIB_HWRM_PG_SIZE_4K	= 0,
108*4882a593Smuzhiyun 	BNXT_QPLIB_HWRM_PG_SIZE_8K	= 1,
109*4882a593Smuzhiyun 	BNXT_QPLIB_HWRM_PG_SIZE_64K	= 2,
110*4882a593Smuzhiyun 	BNXT_QPLIB_HWRM_PG_SIZE_2M	= 3,
111*4882a593Smuzhiyun 	BNXT_QPLIB_HWRM_PG_SIZE_8M	= 4,
112*4882a593Smuzhiyun 	BNXT_QPLIB_HWRM_PG_SIZE_1G	= 5,
113*4882a593Smuzhiyun };
114*4882a593Smuzhiyun 
115*4882a593Smuzhiyun struct bnxt_qplib_reg_desc {
116*4882a593Smuzhiyun 	u8		bar_id;
117*4882a593Smuzhiyun 	resource_size_t	bar_base;
118*4882a593Smuzhiyun 	void __iomem	*bar_reg;
119*4882a593Smuzhiyun 	size_t		len;
120*4882a593Smuzhiyun };
121*4882a593Smuzhiyun 
122*4882a593Smuzhiyun struct bnxt_qplib_pbl {
123*4882a593Smuzhiyun 	u32				pg_count;
124*4882a593Smuzhiyun 	u32				pg_size;
125*4882a593Smuzhiyun 	void				**pg_arr;
126*4882a593Smuzhiyun 	dma_addr_t			*pg_map_arr;
127*4882a593Smuzhiyun };
128*4882a593Smuzhiyun 
129*4882a593Smuzhiyun struct bnxt_qplib_sg_info {
130*4882a593Smuzhiyun 	struct ib_umem			*umem;
131*4882a593Smuzhiyun 	u32				npages;
132*4882a593Smuzhiyun 	u32				pgshft;
133*4882a593Smuzhiyun 	u32				pgsize;
134*4882a593Smuzhiyun 	bool				nopte;
135*4882a593Smuzhiyun };
136*4882a593Smuzhiyun 
137*4882a593Smuzhiyun struct bnxt_qplib_hwq_attr {
138*4882a593Smuzhiyun 	struct bnxt_qplib_res		*res;
139*4882a593Smuzhiyun 	struct bnxt_qplib_sg_info	*sginfo;
140*4882a593Smuzhiyun 	enum bnxt_qplib_hwq_type	type;
141*4882a593Smuzhiyun 	u32				depth;
142*4882a593Smuzhiyun 	u32				stride;
143*4882a593Smuzhiyun 	u32				aux_stride;
144*4882a593Smuzhiyun 	u32				aux_depth;
145*4882a593Smuzhiyun };
146*4882a593Smuzhiyun 
147*4882a593Smuzhiyun struct bnxt_qplib_hwq {
148*4882a593Smuzhiyun 	struct pci_dev			*pdev;
149*4882a593Smuzhiyun 	/* lock to protect qplib_hwq */
150*4882a593Smuzhiyun 	spinlock_t			lock;
151*4882a593Smuzhiyun 	struct bnxt_qplib_pbl		pbl[PBL_LVL_MAX + 1];
152*4882a593Smuzhiyun 	enum bnxt_qplib_pbl_lvl		level;		/* 0, 1, or 2 */
153*4882a593Smuzhiyun 	/* ptr for easy access to the PBL entries */
154*4882a593Smuzhiyun 	void				**pbl_ptr;
155*4882a593Smuzhiyun 	/* ptr for easy access to the dma_addr */
156*4882a593Smuzhiyun 	dma_addr_t			*pbl_dma_ptr;
157*4882a593Smuzhiyun 	u32				max_elements;
158*4882a593Smuzhiyun 	u32				depth;
159*4882a593Smuzhiyun 	u16				element_size;	/* Size of each entry */
160*4882a593Smuzhiyun 	u16				qe_ppg;	/* queue entry per page */
161*4882a593Smuzhiyun 
162*4882a593Smuzhiyun 	u32				prod;		/* raw */
163*4882a593Smuzhiyun 	u32				cons;		/* raw */
164*4882a593Smuzhiyun 	u8				cp_bit;
165*4882a593Smuzhiyun 	u8				is_user;
166*4882a593Smuzhiyun 	u64				*pad_pg;
167*4882a593Smuzhiyun 	u32				pad_stride;
168*4882a593Smuzhiyun 	u32				pad_pgofft;
169*4882a593Smuzhiyun };
170*4882a593Smuzhiyun 
171*4882a593Smuzhiyun struct bnxt_qplib_db_info {
172*4882a593Smuzhiyun 	void __iomem		*db;
173*4882a593Smuzhiyun 	void __iomem		*priv_db;
174*4882a593Smuzhiyun 	struct bnxt_qplib_hwq	*hwq;
175*4882a593Smuzhiyun 	u32			xid;
176*4882a593Smuzhiyun 	u32			max_slot;
177*4882a593Smuzhiyun };
178*4882a593Smuzhiyun 
179*4882a593Smuzhiyun /* Tables */
180*4882a593Smuzhiyun struct bnxt_qplib_pd_tbl {
181*4882a593Smuzhiyun 	unsigned long			*tbl;
182*4882a593Smuzhiyun 	u32				max;
183*4882a593Smuzhiyun };
184*4882a593Smuzhiyun 
185*4882a593Smuzhiyun struct bnxt_qplib_sgid_tbl {
186*4882a593Smuzhiyun 	struct bnxt_qplib_gid_info	*tbl;
187*4882a593Smuzhiyun 	u16				*hw_id;
188*4882a593Smuzhiyun 	u16				max;
189*4882a593Smuzhiyun 	u16				active;
190*4882a593Smuzhiyun 	void				*ctx;
191*4882a593Smuzhiyun 	u8				*vlan;
192*4882a593Smuzhiyun };
193*4882a593Smuzhiyun 
194*4882a593Smuzhiyun struct bnxt_qplib_pkey_tbl {
195*4882a593Smuzhiyun 	u16				*tbl;
196*4882a593Smuzhiyun 	u16				max;
197*4882a593Smuzhiyun 	u16				active;
198*4882a593Smuzhiyun };
199*4882a593Smuzhiyun 
200*4882a593Smuzhiyun struct bnxt_qplib_dpi {
201*4882a593Smuzhiyun 	u32				dpi;
202*4882a593Smuzhiyun 	void __iomem			*dbr;
203*4882a593Smuzhiyun 	u64				umdbr;
204*4882a593Smuzhiyun };
205*4882a593Smuzhiyun 
206*4882a593Smuzhiyun struct bnxt_qplib_dpi_tbl {
207*4882a593Smuzhiyun 	void				**app_tbl;
208*4882a593Smuzhiyun 	unsigned long			*tbl;
209*4882a593Smuzhiyun 	u16				max;
210*4882a593Smuzhiyun 	void __iomem			*dbr_bar_reg_iomem;
211*4882a593Smuzhiyun 	u64				unmapped_dbr;
212*4882a593Smuzhiyun };
213*4882a593Smuzhiyun 
214*4882a593Smuzhiyun struct bnxt_qplib_stats {
215*4882a593Smuzhiyun 	dma_addr_t			dma_map;
216*4882a593Smuzhiyun 	void				*dma;
217*4882a593Smuzhiyun 	u32				size;
218*4882a593Smuzhiyun 	u32				fw_id;
219*4882a593Smuzhiyun };
220*4882a593Smuzhiyun 
221*4882a593Smuzhiyun struct bnxt_qplib_vf_res {
222*4882a593Smuzhiyun 	u32 max_qp_per_vf;
223*4882a593Smuzhiyun 	u32 max_mrw_per_vf;
224*4882a593Smuzhiyun 	u32 max_srq_per_vf;
225*4882a593Smuzhiyun 	u32 max_cq_per_vf;
226*4882a593Smuzhiyun 	u32 max_gid_per_vf;
227*4882a593Smuzhiyun };
228*4882a593Smuzhiyun 
229*4882a593Smuzhiyun #define BNXT_QPLIB_MAX_QP_CTX_ENTRY_SIZE	448
230*4882a593Smuzhiyun #define BNXT_QPLIB_MAX_SRQ_CTX_ENTRY_SIZE	64
231*4882a593Smuzhiyun #define BNXT_QPLIB_MAX_CQ_CTX_ENTRY_SIZE	64
232*4882a593Smuzhiyun #define BNXT_QPLIB_MAX_MRW_CTX_ENTRY_SIZE	128
233*4882a593Smuzhiyun 
234*4882a593Smuzhiyun #define MAX_TQM_ALLOC_REQ               48
235*4882a593Smuzhiyun #define MAX_TQM_ALLOC_BLK_SIZE          8
236*4882a593Smuzhiyun struct bnxt_qplib_tqm_ctx {
237*4882a593Smuzhiyun 	struct bnxt_qplib_hwq           pde;
238*4882a593Smuzhiyun 	u8                              pde_level; /* Original level */
239*4882a593Smuzhiyun 	struct bnxt_qplib_hwq           qtbl[MAX_TQM_ALLOC_REQ];
240*4882a593Smuzhiyun 	u8                              qcount[MAX_TQM_ALLOC_REQ];
241*4882a593Smuzhiyun };
242*4882a593Smuzhiyun 
243*4882a593Smuzhiyun struct bnxt_qplib_ctx {
244*4882a593Smuzhiyun 	u32				qpc_count;
245*4882a593Smuzhiyun 	struct bnxt_qplib_hwq		qpc_tbl;
246*4882a593Smuzhiyun 	u32				mrw_count;
247*4882a593Smuzhiyun 	struct bnxt_qplib_hwq		mrw_tbl;
248*4882a593Smuzhiyun 	u32				srqc_count;
249*4882a593Smuzhiyun 	struct bnxt_qplib_hwq		srqc_tbl;
250*4882a593Smuzhiyun 	u32				cq_count;
251*4882a593Smuzhiyun 	struct bnxt_qplib_hwq		cq_tbl;
252*4882a593Smuzhiyun 	struct bnxt_qplib_hwq		tim_tbl;
253*4882a593Smuzhiyun 	struct bnxt_qplib_tqm_ctx	tqm_ctx;
254*4882a593Smuzhiyun 	struct bnxt_qplib_stats		stats;
255*4882a593Smuzhiyun 	struct bnxt_qplib_vf_res	vf_res;
256*4882a593Smuzhiyun 	u64				hwrm_intf_ver;
257*4882a593Smuzhiyun };
258*4882a593Smuzhiyun 
259*4882a593Smuzhiyun struct bnxt_qplib_res {
260*4882a593Smuzhiyun 	struct pci_dev			*pdev;
261*4882a593Smuzhiyun 	struct bnxt_qplib_chip_ctx	*cctx;
262*4882a593Smuzhiyun 	struct net_device		*netdev;
263*4882a593Smuzhiyun 
264*4882a593Smuzhiyun 	struct bnxt_qplib_rcfw		*rcfw;
265*4882a593Smuzhiyun 	struct bnxt_qplib_pd_tbl	pd_tbl;
266*4882a593Smuzhiyun 	struct bnxt_qplib_sgid_tbl	sgid_tbl;
267*4882a593Smuzhiyun 	struct bnxt_qplib_pkey_tbl	pkey_tbl;
268*4882a593Smuzhiyun 	struct bnxt_qplib_dpi_tbl	dpi_tbl;
269*4882a593Smuzhiyun 	bool				prio;
270*4882a593Smuzhiyun };
271*4882a593Smuzhiyun 
bnxt_qplib_is_chip_gen_p5(struct bnxt_qplib_chip_ctx * cctx)272*4882a593Smuzhiyun static inline bool bnxt_qplib_is_chip_gen_p5(struct bnxt_qplib_chip_ctx *cctx)
273*4882a593Smuzhiyun {
274*4882a593Smuzhiyun 	return (cctx->chip_num == CHIP_NUM_57508 ||
275*4882a593Smuzhiyun 		cctx->chip_num == CHIP_NUM_57504 ||
276*4882a593Smuzhiyun 		cctx->chip_num == CHIP_NUM_57502);
277*4882a593Smuzhiyun }
278*4882a593Smuzhiyun 
bnxt_qplib_get_hwq_type(struct bnxt_qplib_res * res)279*4882a593Smuzhiyun static inline u8 bnxt_qplib_get_hwq_type(struct bnxt_qplib_res *res)
280*4882a593Smuzhiyun {
281*4882a593Smuzhiyun 	return bnxt_qplib_is_chip_gen_p5(res->cctx) ?
282*4882a593Smuzhiyun 					HWQ_TYPE_QUEUE : HWQ_TYPE_L2_CMPL;
283*4882a593Smuzhiyun }
284*4882a593Smuzhiyun 
bnxt_qplib_get_ring_type(struct bnxt_qplib_chip_ctx * cctx)285*4882a593Smuzhiyun static inline u8 bnxt_qplib_get_ring_type(struct bnxt_qplib_chip_ctx *cctx)
286*4882a593Smuzhiyun {
287*4882a593Smuzhiyun 	return bnxt_qplib_is_chip_gen_p5(cctx) ?
288*4882a593Smuzhiyun 	       RING_ALLOC_REQ_RING_TYPE_NQ :
289*4882a593Smuzhiyun 	       RING_ALLOC_REQ_RING_TYPE_ROCE_CMPL;
290*4882a593Smuzhiyun }
291*4882a593Smuzhiyun 
bnxt_qplib_base_pg_size(struct bnxt_qplib_hwq * hwq)292*4882a593Smuzhiyun static inline u8 bnxt_qplib_base_pg_size(struct bnxt_qplib_hwq *hwq)
293*4882a593Smuzhiyun {
294*4882a593Smuzhiyun 	u8 pg_size = BNXT_QPLIB_HWRM_PG_SIZE_4K;
295*4882a593Smuzhiyun 	struct bnxt_qplib_pbl *pbl;
296*4882a593Smuzhiyun 
297*4882a593Smuzhiyun 	pbl = &hwq->pbl[PBL_LVL_0];
298*4882a593Smuzhiyun 	switch (pbl->pg_size) {
299*4882a593Smuzhiyun 	case ROCE_PG_SIZE_4K:
300*4882a593Smuzhiyun 		pg_size = BNXT_QPLIB_HWRM_PG_SIZE_4K;
301*4882a593Smuzhiyun 		break;
302*4882a593Smuzhiyun 	case ROCE_PG_SIZE_8K:
303*4882a593Smuzhiyun 		pg_size = BNXT_QPLIB_HWRM_PG_SIZE_8K;
304*4882a593Smuzhiyun 		break;
305*4882a593Smuzhiyun 	case ROCE_PG_SIZE_64K:
306*4882a593Smuzhiyun 		pg_size = BNXT_QPLIB_HWRM_PG_SIZE_64K;
307*4882a593Smuzhiyun 		break;
308*4882a593Smuzhiyun 	case ROCE_PG_SIZE_2M:
309*4882a593Smuzhiyun 		pg_size = BNXT_QPLIB_HWRM_PG_SIZE_2M;
310*4882a593Smuzhiyun 		break;
311*4882a593Smuzhiyun 	case ROCE_PG_SIZE_8M:
312*4882a593Smuzhiyun 		pg_size = BNXT_QPLIB_HWRM_PG_SIZE_8M;
313*4882a593Smuzhiyun 		break;
314*4882a593Smuzhiyun 	case ROCE_PG_SIZE_1G:
315*4882a593Smuzhiyun 		pg_size = BNXT_QPLIB_HWRM_PG_SIZE_1G;
316*4882a593Smuzhiyun 		break;
317*4882a593Smuzhiyun 	default:
318*4882a593Smuzhiyun 		break;
319*4882a593Smuzhiyun 	}
320*4882a593Smuzhiyun 
321*4882a593Smuzhiyun 	return pg_size;
322*4882a593Smuzhiyun }
323*4882a593Smuzhiyun 
bnxt_qplib_get_qe(struct bnxt_qplib_hwq * hwq,u32 indx,u64 * pg)324*4882a593Smuzhiyun static inline void *bnxt_qplib_get_qe(struct bnxt_qplib_hwq *hwq,
325*4882a593Smuzhiyun 				      u32 indx, u64 *pg)
326*4882a593Smuzhiyun {
327*4882a593Smuzhiyun 	u32 pg_num, pg_idx;
328*4882a593Smuzhiyun 
329*4882a593Smuzhiyun 	pg_num = (indx / hwq->qe_ppg);
330*4882a593Smuzhiyun 	pg_idx = (indx % hwq->qe_ppg);
331*4882a593Smuzhiyun 	if (pg)
332*4882a593Smuzhiyun 		*pg = (u64)&hwq->pbl_ptr[pg_num];
333*4882a593Smuzhiyun 	return (void *)(hwq->pbl_ptr[pg_num] + hwq->element_size * pg_idx);
334*4882a593Smuzhiyun }
335*4882a593Smuzhiyun 
bnxt_qplib_get_prod_qe(struct bnxt_qplib_hwq * hwq,u32 idx)336*4882a593Smuzhiyun static inline void *bnxt_qplib_get_prod_qe(struct bnxt_qplib_hwq *hwq, u32 idx)
337*4882a593Smuzhiyun {
338*4882a593Smuzhiyun 	idx += hwq->prod;
339*4882a593Smuzhiyun 	if (idx >= hwq->depth)
340*4882a593Smuzhiyun 		idx -= hwq->depth;
341*4882a593Smuzhiyun 	return bnxt_qplib_get_qe(hwq, idx, NULL);
342*4882a593Smuzhiyun }
343*4882a593Smuzhiyun 
344*4882a593Smuzhiyun #define to_bnxt_qplib(ptr, type, member)	\
345*4882a593Smuzhiyun 	container_of(ptr, type, member)
346*4882a593Smuzhiyun 
347*4882a593Smuzhiyun struct bnxt_qplib_pd;
348*4882a593Smuzhiyun struct bnxt_qplib_dev_attr;
349*4882a593Smuzhiyun 
350*4882a593Smuzhiyun void bnxt_qplib_free_hwq(struct bnxt_qplib_res *res,
351*4882a593Smuzhiyun 			 struct bnxt_qplib_hwq *hwq);
352*4882a593Smuzhiyun int bnxt_qplib_alloc_init_hwq(struct bnxt_qplib_hwq *hwq,
353*4882a593Smuzhiyun 			      struct bnxt_qplib_hwq_attr *hwq_attr);
354*4882a593Smuzhiyun void bnxt_qplib_get_guid(u8 *dev_addr, u8 *guid);
355*4882a593Smuzhiyun int bnxt_qplib_alloc_pd(struct bnxt_qplib_pd_tbl *pd_tbl,
356*4882a593Smuzhiyun 			struct bnxt_qplib_pd *pd);
357*4882a593Smuzhiyun int bnxt_qplib_dealloc_pd(struct bnxt_qplib_res *res,
358*4882a593Smuzhiyun 			  struct bnxt_qplib_pd_tbl *pd_tbl,
359*4882a593Smuzhiyun 			  struct bnxt_qplib_pd *pd);
360*4882a593Smuzhiyun int bnxt_qplib_alloc_dpi(struct bnxt_qplib_dpi_tbl *dpit,
361*4882a593Smuzhiyun 			 struct bnxt_qplib_dpi     *dpi,
362*4882a593Smuzhiyun 			 void                      *app);
363*4882a593Smuzhiyun int bnxt_qplib_dealloc_dpi(struct bnxt_qplib_res *res,
364*4882a593Smuzhiyun 			   struct bnxt_qplib_dpi_tbl *dpi_tbl,
365*4882a593Smuzhiyun 			   struct bnxt_qplib_dpi *dpi);
366*4882a593Smuzhiyun void bnxt_qplib_cleanup_res(struct bnxt_qplib_res *res);
367*4882a593Smuzhiyun int bnxt_qplib_init_res(struct bnxt_qplib_res *res);
368*4882a593Smuzhiyun void bnxt_qplib_free_res(struct bnxt_qplib_res *res);
369*4882a593Smuzhiyun int bnxt_qplib_alloc_res(struct bnxt_qplib_res *res, struct pci_dev *pdev,
370*4882a593Smuzhiyun 			 struct net_device *netdev,
371*4882a593Smuzhiyun 			 struct bnxt_qplib_dev_attr *dev_attr);
372*4882a593Smuzhiyun void bnxt_qplib_free_ctx(struct bnxt_qplib_res *res,
373*4882a593Smuzhiyun 			 struct bnxt_qplib_ctx *ctx);
374*4882a593Smuzhiyun int bnxt_qplib_alloc_ctx(struct bnxt_qplib_res *res,
375*4882a593Smuzhiyun 			 struct bnxt_qplib_ctx *ctx,
376*4882a593Smuzhiyun 			 bool virt_fn, bool is_p5);
377*4882a593Smuzhiyun 
bnxt_qplib_hwq_incr_prod(struct bnxt_qplib_hwq * hwq,u32 cnt)378*4882a593Smuzhiyun static inline void bnxt_qplib_hwq_incr_prod(struct bnxt_qplib_hwq *hwq, u32 cnt)
379*4882a593Smuzhiyun {
380*4882a593Smuzhiyun 	hwq->prod = (hwq->prod + cnt) % hwq->depth;
381*4882a593Smuzhiyun }
382*4882a593Smuzhiyun 
bnxt_qplib_hwq_incr_cons(struct bnxt_qplib_hwq * hwq,u32 cnt)383*4882a593Smuzhiyun static inline void bnxt_qplib_hwq_incr_cons(struct bnxt_qplib_hwq *hwq,
384*4882a593Smuzhiyun 					    u32 cnt)
385*4882a593Smuzhiyun {
386*4882a593Smuzhiyun 	hwq->cons = (hwq->cons + cnt) % hwq->depth;
387*4882a593Smuzhiyun }
388*4882a593Smuzhiyun 
bnxt_qplib_ring_db32(struct bnxt_qplib_db_info * info,bool arm)389*4882a593Smuzhiyun static inline void bnxt_qplib_ring_db32(struct bnxt_qplib_db_info *info,
390*4882a593Smuzhiyun 					bool arm)
391*4882a593Smuzhiyun {
392*4882a593Smuzhiyun 	u32 key;
393*4882a593Smuzhiyun 
394*4882a593Smuzhiyun 	key = info->hwq->cons & (info->hwq->max_elements - 1);
395*4882a593Smuzhiyun 	key |= (CMPL_DOORBELL_IDX_VALID |
396*4882a593Smuzhiyun 		(CMPL_DOORBELL_KEY_CMPL & CMPL_DOORBELL_KEY_MASK));
397*4882a593Smuzhiyun 	if (!arm)
398*4882a593Smuzhiyun 		key |= CMPL_DOORBELL_MASK;
399*4882a593Smuzhiyun 	writel(key, info->db);
400*4882a593Smuzhiyun }
401*4882a593Smuzhiyun 
bnxt_qplib_ring_db(struct bnxt_qplib_db_info * info,u32 type)402*4882a593Smuzhiyun static inline void bnxt_qplib_ring_db(struct bnxt_qplib_db_info *info,
403*4882a593Smuzhiyun 				      u32 type)
404*4882a593Smuzhiyun {
405*4882a593Smuzhiyun 	u64 key = 0;
406*4882a593Smuzhiyun 
407*4882a593Smuzhiyun 	key = (info->xid & DBC_DBC_XID_MASK) | DBC_DBC_PATH_ROCE | type;
408*4882a593Smuzhiyun 	key <<= 32;
409*4882a593Smuzhiyun 	key |= (info->hwq->cons & (info->hwq->max_elements - 1)) &
410*4882a593Smuzhiyun 		DBC_DBC_INDEX_MASK;
411*4882a593Smuzhiyun 	writeq(key, info->db);
412*4882a593Smuzhiyun }
413*4882a593Smuzhiyun 
bnxt_qplib_ring_prod_db(struct bnxt_qplib_db_info * info,u32 type)414*4882a593Smuzhiyun static inline void bnxt_qplib_ring_prod_db(struct bnxt_qplib_db_info *info,
415*4882a593Smuzhiyun 					   u32 type)
416*4882a593Smuzhiyun {
417*4882a593Smuzhiyun 	u64 key = 0;
418*4882a593Smuzhiyun 
419*4882a593Smuzhiyun 	key = (info->xid & DBC_DBC_XID_MASK) | DBC_DBC_PATH_ROCE | type;
420*4882a593Smuzhiyun 	key <<= 32;
421*4882a593Smuzhiyun 	key |= ((info->hwq->prod / info->max_slot)) & DBC_DBC_INDEX_MASK;
422*4882a593Smuzhiyun 	writeq(key, info->db);
423*4882a593Smuzhiyun }
424*4882a593Smuzhiyun 
bnxt_qplib_armen_db(struct bnxt_qplib_db_info * info,u32 type)425*4882a593Smuzhiyun static inline void bnxt_qplib_armen_db(struct bnxt_qplib_db_info *info,
426*4882a593Smuzhiyun 				       u32 type)
427*4882a593Smuzhiyun {
428*4882a593Smuzhiyun 	u64 key = 0;
429*4882a593Smuzhiyun 
430*4882a593Smuzhiyun 	key = (info->xid & DBC_DBC_XID_MASK) | DBC_DBC_PATH_ROCE | type;
431*4882a593Smuzhiyun 	key <<= 32;
432*4882a593Smuzhiyun 	writeq(key, info->priv_db);
433*4882a593Smuzhiyun }
434*4882a593Smuzhiyun 
bnxt_qplib_srq_arm_db(struct bnxt_qplib_db_info * info,u32 th)435*4882a593Smuzhiyun static inline void bnxt_qplib_srq_arm_db(struct bnxt_qplib_db_info *info,
436*4882a593Smuzhiyun 					 u32 th)
437*4882a593Smuzhiyun {
438*4882a593Smuzhiyun 	u64 key = 0;
439*4882a593Smuzhiyun 
440*4882a593Smuzhiyun 	key = (info->xid & DBC_DBC_XID_MASK) | DBC_DBC_PATH_ROCE | th;
441*4882a593Smuzhiyun 	key <<= 32;
442*4882a593Smuzhiyun 	key |=  th & DBC_DBC_INDEX_MASK;
443*4882a593Smuzhiyun 	writeq(key, info->priv_db);
444*4882a593Smuzhiyun }
445*4882a593Smuzhiyun 
bnxt_qplib_ring_nq_db(struct bnxt_qplib_db_info * info,struct bnxt_qplib_chip_ctx * cctx,bool arm)446*4882a593Smuzhiyun static inline void bnxt_qplib_ring_nq_db(struct bnxt_qplib_db_info *info,
447*4882a593Smuzhiyun 					 struct bnxt_qplib_chip_ctx *cctx,
448*4882a593Smuzhiyun 					 bool arm)
449*4882a593Smuzhiyun {
450*4882a593Smuzhiyun 	u32 type;
451*4882a593Smuzhiyun 
452*4882a593Smuzhiyun 	type = arm ? DBC_DBC_TYPE_NQ_ARM : DBC_DBC_TYPE_NQ;
453*4882a593Smuzhiyun 	if (bnxt_qplib_is_chip_gen_p5(cctx))
454*4882a593Smuzhiyun 		bnxt_qplib_ring_db(info, type);
455*4882a593Smuzhiyun 	else
456*4882a593Smuzhiyun 		bnxt_qplib_ring_db32(info, arm);
457*4882a593Smuzhiyun }
458*4882a593Smuzhiyun #endif /* __BNXT_QPLIB_RES_H__ */
459