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