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