xref: /OK3568_Linux_fs/kernel/drivers/infiniband/hw/qedr/qedr.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* QLogic qedr NIC Driver
2*4882a593Smuzhiyun  * Copyright (c) 2015-2016  QLogic Corporation
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  * This software is available to you under a choice of one of two
5*4882a593Smuzhiyun  * licenses.  You may choose to be licensed under the terms of the GNU
6*4882a593Smuzhiyun  * General Public License (GPL) Version 2, available from the file
7*4882a593Smuzhiyun  * COPYING in the main directory of this source tree, or the
8*4882a593Smuzhiyun  * OpenIB.org BSD license below:
9*4882a593Smuzhiyun  *
10*4882a593Smuzhiyun  *     Redistribution and use in source and binary forms, with or
11*4882a593Smuzhiyun  *     without modification, are permitted provided that the following
12*4882a593Smuzhiyun  *     conditions are met:
13*4882a593Smuzhiyun  *
14*4882a593Smuzhiyun  *      - Redistributions of source code must retain the above
15*4882a593Smuzhiyun  *        copyright notice, this list of conditions and the following
16*4882a593Smuzhiyun  *        disclaimer.
17*4882a593Smuzhiyun  *
18*4882a593Smuzhiyun  *      - Redistributions in binary form must reproduce the above
19*4882a593Smuzhiyun  *        copyright notice, this list of conditions and the following
20*4882a593Smuzhiyun  *        disclaimer in the documentation and /or other materials
21*4882a593Smuzhiyun  *        provided with the distribution.
22*4882a593Smuzhiyun  *
23*4882a593Smuzhiyun  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
24*4882a593Smuzhiyun  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
25*4882a593Smuzhiyun  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
26*4882a593Smuzhiyun  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
27*4882a593Smuzhiyun  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
28*4882a593Smuzhiyun  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
29*4882a593Smuzhiyun  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
30*4882a593Smuzhiyun  * SOFTWARE.
31*4882a593Smuzhiyun  */
32*4882a593Smuzhiyun #ifndef __QEDR_H__
33*4882a593Smuzhiyun #define __QEDR_H__
34*4882a593Smuzhiyun 
35*4882a593Smuzhiyun #include <linux/pci.h>
36*4882a593Smuzhiyun #include <linux/xarray.h>
37*4882a593Smuzhiyun #include <rdma/ib_addr.h>
38*4882a593Smuzhiyun #include <linux/qed/qed_if.h>
39*4882a593Smuzhiyun #include <linux/qed/qed_chain.h>
40*4882a593Smuzhiyun #include <linux/qed/qed_rdma_if.h>
41*4882a593Smuzhiyun #include <linux/qed/qede_rdma.h>
42*4882a593Smuzhiyun #include <linux/qed/roce_common.h>
43*4882a593Smuzhiyun #include <linux/completion.h>
44*4882a593Smuzhiyun #include "qedr_hsi_rdma.h"
45*4882a593Smuzhiyun 
46*4882a593Smuzhiyun #define QEDR_NODE_DESC "QLogic 579xx RoCE HCA"
47*4882a593Smuzhiyun #define DP_NAME(_dev) dev_name(&(_dev)->ibdev.dev)
48*4882a593Smuzhiyun #define IS_IWARP(_dev) ((_dev)->rdma_type == QED_RDMA_TYPE_IWARP)
49*4882a593Smuzhiyun #define IS_ROCE(_dev) ((_dev)->rdma_type == QED_RDMA_TYPE_ROCE)
50*4882a593Smuzhiyun 
51*4882a593Smuzhiyun #define DP_DEBUG(dev, module, fmt, ...)					\
52*4882a593Smuzhiyun 	pr_debug("(%s) " module ": " fmt,				\
53*4882a593Smuzhiyun 		 DP_NAME(dev) ? DP_NAME(dev) : "", ## __VA_ARGS__)
54*4882a593Smuzhiyun 
55*4882a593Smuzhiyun #define QEDR_MSG_INIT "INIT"
56*4882a593Smuzhiyun #define QEDR_MSG_MISC "MISC"
57*4882a593Smuzhiyun #define QEDR_MSG_CQ   "  CQ"
58*4882a593Smuzhiyun #define QEDR_MSG_MR   "  MR"
59*4882a593Smuzhiyun #define QEDR_MSG_RQ   "  RQ"
60*4882a593Smuzhiyun #define QEDR_MSG_SQ   "  SQ"
61*4882a593Smuzhiyun #define QEDR_MSG_QP   "  QP"
62*4882a593Smuzhiyun #define QEDR_MSG_SRQ  " SRQ"
63*4882a593Smuzhiyun #define QEDR_MSG_GSI  " GSI"
64*4882a593Smuzhiyun #define QEDR_MSG_IWARP  " IW"
65*4882a593Smuzhiyun 
66*4882a593Smuzhiyun #define QEDR_CQ_MAGIC_NUMBER	(0x11223344)
67*4882a593Smuzhiyun 
68*4882a593Smuzhiyun #define FW_PAGE_SIZE		(RDMA_RING_PAGE_SIZE)
69*4882a593Smuzhiyun #define FW_PAGE_SHIFT		(12)
70*4882a593Smuzhiyun 
71*4882a593Smuzhiyun struct qedr_dev;
72*4882a593Smuzhiyun 
73*4882a593Smuzhiyun struct qedr_cnq {
74*4882a593Smuzhiyun 	struct qedr_dev		*dev;
75*4882a593Smuzhiyun 	struct qed_chain	pbl;
76*4882a593Smuzhiyun 	struct qed_sb_info	*sb;
77*4882a593Smuzhiyun 	char			name[32];
78*4882a593Smuzhiyun 	u64			n_comp;
79*4882a593Smuzhiyun 	__le16			*hw_cons_ptr;
80*4882a593Smuzhiyun 	u8			index;
81*4882a593Smuzhiyun };
82*4882a593Smuzhiyun 
83*4882a593Smuzhiyun #define QEDR_MAX_SGID 128
84*4882a593Smuzhiyun 
85*4882a593Smuzhiyun struct qedr_device_attr {
86*4882a593Smuzhiyun 	u32	vendor_id;
87*4882a593Smuzhiyun 	u32	vendor_part_id;
88*4882a593Smuzhiyun 	u32	hw_ver;
89*4882a593Smuzhiyun 	u64	fw_ver;
90*4882a593Smuzhiyun 	u64	node_guid;
91*4882a593Smuzhiyun 	u64	sys_image_guid;
92*4882a593Smuzhiyun 	u8	max_cnq;
93*4882a593Smuzhiyun 	u8	max_sge;
94*4882a593Smuzhiyun 	u16	max_inline;
95*4882a593Smuzhiyun 	u32	max_sqe;
96*4882a593Smuzhiyun 	u32	max_rqe;
97*4882a593Smuzhiyun 	u8	max_qp_resp_rd_atomic_resc;
98*4882a593Smuzhiyun 	u8	max_qp_req_rd_atomic_resc;
99*4882a593Smuzhiyun 	u64	max_dev_resp_rd_atomic_resc;
100*4882a593Smuzhiyun 	u32	max_cq;
101*4882a593Smuzhiyun 	u32	max_qp;
102*4882a593Smuzhiyun 	u32	max_mr;
103*4882a593Smuzhiyun 	u64	max_mr_size;
104*4882a593Smuzhiyun 	u32	max_cqe;
105*4882a593Smuzhiyun 	u32	max_mw;
106*4882a593Smuzhiyun 	u32	max_mr_mw_fmr_pbl;
107*4882a593Smuzhiyun 	u64	max_mr_mw_fmr_size;
108*4882a593Smuzhiyun 	u32	max_pd;
109*4882a593Smuzhiyun 	u32	max_ah;
110*4882a593Smuzhiyun 	u8	max_pkey;
111*4882a593Smuzhiyun 	u32	max_srq;
112*4882a593Smuzhiyun 	u32	max_srq_wr;
113*4882a593Smuzhiyun 	u8	max_srq_sge;
114*4882a593Smuzhiyun 	u8	max_stats_queues;
115*4882a593Smuzhiyun 	u32	dev_caps;
116*4882a593Smuzhiyun 
117*4882a593Smuzhiyun 	u64	page_size_caps;
118*4882a593Smuzhiyun 	u8	dev_ack_delay;
119*4882a593Smuzhiyun 	u32	reserved_lkey;
120*4882a593Smuzhiyun 	u32	bad_pkey_counter;
121*4882a593Smuzhiyun 	struct qed_rdma_events events;
122*4882a593Smuzhiyun };
123*4882a593Smuzhiyun 
124*4882a593Smuzhiyun #define QEDR_ENET_STATE_BIT	(0)
125*4882a593Smuzhiyun 
126*4882a593Smuzhiyun struct qedr_dev {
127*4882a593Smuzhiyun 	struct ib_device	ibdev;
128*4882a593Smuzhiyun 	struct qed_dev		*cdev;
129*4882a593Smuzhiyun 	struct pci_dev		*pdev;
130*4882a593Smuzhiyun 	struct net_device	*ndev;
131*4882a593Smuzhiyun 
132*4882a593Smuzhiyun 	enum ib_atomic_cap	atomic_cap;
133*4882a593Smuzhiyun 
134*4882a593Smuzhiyun 	void *rdma_ctx;
135*4882a593Smuzhiyun 	struct qedr_device_attr attr;
136*4882a593Smuzhiyun 
137*4882a593Smuzhiyun 	const struct qed_rdma_ops *ops;
138*4882a593Smuzhiyun 	struct qed_int_info	int_info;
139*4882a593Smuzhiyun 
140*4882a593Smuzhiyun 	struct qed_sb_info	*sb_array;
141*4882a593Smuzhiyun 	struct qedr_cnq		*cnq_array;
142*4882a593Smuzhiyun 	int			num_cnq;
143*4882a593Smuzhiyun 	int			sb_start;
144*4882a593Smuzhiyun 
145*4882a593Smuzhiyun 	void __iomem		*db_addr;
146*4882a593Smuzhiyun 	u64			db_phys_addr;
147*4882a593Smuzhiyun 	u32			db_size;
148*4882a593Smuzhiyun 	u16			dpi;
149*4882a593Smuzhiyun 
150*4882a593Smuzhiyun 	union ib_gid *sgid_tbl;
151*4882a593Smuzhiyun 
152*4882a593Smuzhiyun 	/* Lock for sgid table */
153*4882a593Smuzhiyun 	spinlock_t sgid_lock;
154*4882a593Smuzhiyun 
155*4882a593Smuzhiyun 	u64			guid;
156*4882a593Smuzhiyun 
157*4882a593Smuzhiyun 	u32			dp_module;
158*4882a593Smuzhiyun 	u8			dp_level;
159*4882a593Smuzhiyun 	u8			num_hwfns;
160*4882a593Smuzhiyun #define QEDR_IS_CMT(dev)        ((dev)->num_hwfns > 1)
161*4882a593Smuzhiyun 	u8			affin_hwfn_idx;
162*4882a593Smuzhiyun 	u8			gsi_ll2_handle;
163*4882a593Smuzhiyun 
164*4882a593Smuzhiyun 	uint			wq_multiplier;
165*4882a593Smuzhiyun 	u8			gsi_ll2_mac_address[ETH_ALEN];
166*4882a593Smuzhiyun 	int			gsi_qp_created;
167*4882a593Smuzhiyun 	struct qedr_cq		*gsi_sqcq;
168*4882a593Smuzhiyun 	struct qedr_cq		*gsi_rqcq;
169*4882a593Smuzhiyun 	struct qedr_qp		*gsi_qp;
170*4882a593Smuzhiyun 	enum qed_rdma_type	rdma_type;
171*4882a593Smuzhiyun 	struct xarray		qps;
172*4882a593Smuzhiyun 	struct xarray		srqs;
173*4882a593Smuzhiyun 	struct workqueue_struct *iwarp_wq;
174*4882a593Smuzhiyun 	u16			iwarp_max_mtu;
175*4882a593Smuzhiyun 
176*4882a593Smuzhiyun 	unsigned long enet_state;
177*4882a593Smuzhiyun 
178*4882a593Smuzhiyun 	u8 user_dpm_enabled;
179*4882a593Smuzhiyun };
180*4882a593Smuzhiyun 
181*4882a593Smuzhiyun #define QEDR_MAX_SQ_PBL			(0x8000)
182*4882a593Smuzhiyun #define QEDR_MAX_SQ_PBL_ENTRIES		(0x10000 / sizeof(void *))
183*4882a593Smuzhiyun #define QEDR_SQE_ELEMENT_SIZE		(sizeof(struct rdma_sq_sge))
184*4882a593Smuzhiyun #define QEDR_MAX_SQE_ELEMENTS_PER_SQE	(ROCE_REQ_MAX_SINGLE_SQ_WQE_SIZE / \
185*4882a593Smuzhiyun 					 QEDR_SQE_ELEMENT_SIZE)
186*4882a593Smuzhiyun #define QEDR_MAX_SQE_ELEMENTS_PER_PAGE	((RDMA_RING_PAGE_SIZE) / \
187*4882a593Smuzhiyun 					 QEDR_SQE_ELEMENT_SIZE)
188*4882a593Smuzhiyun #define QEDR_MAX_SQE			((QEDR_MAX_SQ_PBL_ENTRIES) *\
189*4882a593Smuzhiyun 					 (RDMA_RING_PAGE_SIZE) / \
190*4882a593Smuzhiyun 					 (QEDR_SQE_ELEMENT_SIZE) /\
191*4882a593Smuzhiyun 					 (QEDR_MAX_SQE_ELEMENTS_PER_SQE))
192*4882a593Smuzhiyun /* RQ */
193*4882a593Smuzhiyun #define QEDR_MAX_RQ_PBL			(0x2000)
194*4882a593Smuzhiyun #define QEDR_MAX_RQ_PBL_ENTRIES		(0x10000 / sizeof(void *))
195*4882a593Smuzhiyun #define QEDR_RQE_ELEMENT_SIZE		(sizeof(struct rdma_rq_sge))
196*4882a593Smuzhiyun #define QEDR_MAX_RQE_ELEMENTS_PER_RQE	(RDMA_MAX_SGE_PER_RQ_WQE)
197*4882a593Smuzhiyun #define QEDR_MAX_RQE_ELEMENTS_PER_PAGE	((RDMA_RING_PAGE_SIZE) / \
198*4882a593Smuzhiyun 					 QEDR_RQE_ELEMENT_SIZE)
199*4882a593Smuzhiyun #define QEDR_MAX_RQE			((QEDR_MAX_RQ_PBL_ENTRIES) *\
200*4882a593Smuzhiyun 					 (RDMA_RING_PAGE_SIZE) / \
201*4882a593Smuzhiyun 					 (QEDR_RQE_ELEMENT_SIZE) /\
202*4882a593Smuzhiyun 					 (QEDR_MAX_RQE_ELEMENTS_PER_RQE))
203*4882a593Smuzhiyun 
204*4882a593Smuzhiyun #define QEDR_CQE_SIZE	(sizeof(union rdma_cqe))
205*4882a593Smuzhiyun #define QEDR_MAX_CQE_PBL_SIZE (512 * 1024)
206*4882a593Smuzhiyun #define QEDR_MAX_CQE_PBL_ENTRIES (((QEDR_MAX_CQE_PBL_SIZE) / \
207*4882a593Smuzhiyun 				  sizeof(u64)) - 1)
208*4882a593Smuzhiyun #define QEDR_MAX_CQES ((u32)((QEDR_MAX_CQE_PBL_ENTRIES) * \
209*4882a593Smuzhiyun 			     (QED_CHAIN_PAGE_SIZE) / QEDR_CQE_SIZE))
210*4882a593Smuzhiyun 
211*4882a593Smuzhiyun #define QEDR_ROCE_MAX_CNQ_SIZE		(0x4000)
212*4882a593Smuzhiyun 
213*4882a593Smuzhiyun #define QEDR_MAX_PORT			(1)
214*4882a593Smuzhiyun #define QEDR_PORT			(1)
215*4882a593Smuzhiyun 
216*4882a593Smuzhiyun #define QEDR_UVERBS(CMD_NAME) (1ull << IB_USER_VERBS_CMD_##CMD_NAME)
217*4882a593Smuzhiyun 
218*4882a593Smuzhiyun #define QEDR_ROCE_PKEY_MAX 1
219*4882a593Smuzhiyun #define QEDR_ROCE_PKEY_TABLE_LEN 1
220*4882a593Smuzhiyun #define QEDR_ROCE_PKEY_DEFAULT 0xffff
221*4882a593Smuzhiyun 
222*4882a593Smuzhiyun struct qedr_pbl {
223*4882a593Smuzhiyun 	struct list_head list_entry;
224*4882a593Smuzhiyun 	void *va;
225*4882a593Smuzhiyun 	dma_addr_t pa;
226*4882a593Smuzhiyun };
227*4882a593Smuzhiyun 
228*4882a593Smuzhiyun struct qedr_ucontext {
229*4882a593Smuzhiyun 	struct ib_ucontext ibucontext;
230*4882a593Smuzhiyun 	struct qedr_dev *dev;
231*4882a593Smuzhiyun 	struct qedr_pd *pd;
232*4882a593Smuzhiyun 	void __iomem *dpi_addr;
233*4882a593Smuzhiyun 	struct rdma_user_mmap_entry *db_mmap_entry;
234*4882a593Smuzhiyun 	u64 dpi_phys_addr;
235*4882a593Smuzhiyun 	u32 dpi_size;
236*4882a593Smuzhiyun 	u16 dpi;
237*4882a593Smuzhiyun 	bool db_rec;
238*4882a593Smuzhiyun 	u8 edpm_mode;
239*4882a593Smuzhiyun };
240*4882a593Smuzhiyun 
241*4882a593Smuzhiyun union db_prod32 {
242*4882a593Smuzhiyun 	struct rdma_pwm_val16_data data;
243*4882a593Smuzhiyun 	u32 raw;
244*4882a593Smuzhiyun };
245*4882a593Smuzhiyun 
246*4882a593Smuzhiyun union db_prod64 {
247*4882a593Smuzhiyun 	struct rdma_pwm_val32_data data;
248*4882a593Smuzhiyun 	u64 raw;
249*4882a593Smuzhiyun };
250*4882a593Smuzhiyun 
251*4882a593Smuzhiyun enum qedr_cq_type {
252*4882a593Smuzhiyun 	QEDR_CQ_TYPE_GSI,
253*4882a593Smuzhiyun 	QEDR_CQ_TYPE_KERNEL,
254*4882a593Smuzhiyun 	QEDR_CQ_TYPE_USER,
255*4882a593Smuzhiyun };
256*4882a593Smuzhiyun 
257*4882a593Smuzhiyun struct qedr_pbl_info {
258*4882a593Smuzhiyun 	u32 num_pbls;
259*4882a593Smuzhiyun 	u32 num_pbes;
260*4882a593Smuzhiyun 	u32 pbl_size;
261*4882a593Smuzhiyun 	u32 pbe_size;
262*4882a593Smuzhiyun 	bool two_layered;
263*4882a593Smuzhiyun };
264*4882a593Smuzhiyun 
265*4882a593Smuzhiyun struct qedr_userq {
266*4882a593Smuzhiyun 	struct ib_umem *umem;
267*4882a593Smuzhiyun 	struct qedr_pbl_info pbl_info;
268*4882a593Smuzhiyun 	struct qedr_pbl *pbl_tbl;
269*4882a593Smuzhiyun 	u64 buf_addr;
270*4882a593Smuzhiyun 	size_t buf_len;
271*4882a593Smuzhiyun 
272*4882a593Smuzhiyun 	/* doorbell recovery */
273*4882a593Smuzhiyun 	void __iomem *db_addr;
274*4882a593Smuzhiyun 	struct qedr_user_db_rec *db_rec_data;
275*4882a593Smuzhiyun 	struct rdma_user_mmap_entry *db_mmap_entry;
276*4882a593Smuzhiyun 	void __iomem *db_rec_db2_addr;
277*4882a593Smuzhiyun 	union db_prod32 db_rec_db2_data;
278*4882a593Smuzhiyun };
279*4882a593Smuzhiyun 
280*4882a593Smuzhiyun struct qedr_cq {
281*4882a593Smuzhiyun 	struct ib_cq ibcq;
282*4882a593Smuzhiyun 
283*4882a593Smuzhiyun 	enum qedr_cq_type cq_type;
284*4882a593Smuzhiyun 	u32 sig;
285*4882a593Smuzhiyun 
286*4882a593Smuzhiyun 	u16 icid;
287*4882a593Smuzhiyun 
288*4882a593Smuzhiyun 	/* Lock to protect multiplem CQ's */
289*4882a593Smuzhiyun 	spinlock_t cq_lock;
290*4882a593Smuzhiyun 	u8 arm_flags;
291*4882a593Smuzhiyun 	struct qed_chain pbl;
292*4882a593Smuzhiyun 
293*4882a593Smuzhiyun 	void __iomem *db_addr;
294*4882a593Smuzhiyun 	union db_prod64 db;
295*4882a593Smuzhiyun 
296*4882a593Smuzhiyun 	u8 pbl_toggle;
297*4882a593Smuzhiyun 	union rdma_cqe *latest_cqe;
298*4882a593Smuzhiyun 	union rdma_cqe *toggle_cqe;
299*4882a593Smuzhiyun 
300*4882a593Smuzhiyun 	u32 cq_cons;
301*4882a593Smuzhiyun 
302*4882a593Smuzhiyun 	struct qedr_userq q;
303*4882a593Smuzhiyun 	u8 destroyed;
304*4882a593Smuzhiyun 	u16 cnq_notif;
305*4882a593Smuzhiyun };
306*4882a593Smuzhiyun 
307*4882a593Smuzhiyun struct qedr_pd {
308*4882a593Smuzhiyun 	struct ib_pd ibpd;
309*4882a593Smuzhiyun 	u32 pd_id;
310*4882a593Smuzhiyun 	struct qedr_ucontext *uctx;
311*4882a593Smuzhiyun };
312*4882a593Smuzhiyun 
313*4882a593Smuzhiyun struct qedr_xrcd {
314*4882a593Smuzhiyun 	struct ib_xrcd ibxrcd;
315*4882a593Smuzhiyun 	u16 xrcd_id;
316*4882a593Smuzhiyun };
317*4882a593Smuzhiyun 
318*4882a593Smuzhiyun struct qedr_qp_hwq_info {
319*4882a593Smuzhiyun 	/* WQE Elements */
320*4882a593Smuzhiyun 	struct qed_chain pbl;
321*4882a593Smuzhiyun 	u64 p_phys_addr_tbl;
322*4882a593Smuzhiyun 	u32 max_sges;
323*4882a593Smuzhiyun 
324*4882a593Smuzhiyun 	/* WQE */
325*4882a593Smuzhiyun 	u16 prod;
326*4882a593Smuzhiyun 	u16 cons;
327*4882a593Smuzhiyun 	u16 wqe_cons;
328*4882a593Smuzhiyun 	u16 gsi_cons;
329*4882a593Smuzhiyun 	u16 max_wr;
330*4882a593Smuzhiyun 
331*4882a593Smuzhiyun 	/* DB */
332*4882a593Smuzhiyun 	void __iomem *db;
333*4882a593Smuzhiyun 	union db_prod32 db_data;
334*4882a593Smuzhiyun 
335*4882a593Smuzhiyun 	void __iomem *iwarp_db2;
336*4882a593Smuzhiyun 	union db_prod32 iwarp_db2_data;
337*4882a593Smuzhiyun };
338*4882a593Smuzhiyun 
339*4882a593Smuzhiyun #define QEDR_INC_SW_IDX(p_info, index)					\
340*4882a593Smuzhiyun 	do {								\
341*4882a593Smuzhiyun 		p_info->index = (p_info->index + 1) &			\
342*4882a593Smuzhiyun 				qed_chain_get_capacity(p_info->pbl)	\
343*4882a593Smuzhiyun 	} while (0)
344*4882a593Smuzhiyun 
345*4882a593Smuzhiyun struct qedr_srq_hwq_info {
346*4882a593Smuzhiyun 	u32 max_sges;
347*4882a593Smuzhiyun 	u32 max_wr;
348*4882a593Smuzhiyun 	struct qed_chain pbl;
349*4882a593Smuzhiyun 	u64 p_phys_addr_tbl;
350*4882a593Smuzhiyun 	u32 wqe_prod;
351*4882a593Smuzhiyun 	u32 sge_prod;
352*4882a593Smuzhiyun 	u32 wr_prod_cnt;
353*4882a593Smuzhiyun 	atomic_t wr_cons_cnt;
354*4882a593Smuzhiyun 	u32 num_elems;
355*4882a593Smuzhiyun 
356*4882a593Smuzhiyun 	struct rdma_srq_producers *virt_prod_pair_addr;
357*4882a593Smuzhiyun 	dma_addr_t phy_prod_pair_addr;
358*4882a593Smuzhiyun };
359*4882a593Smuzhiyun 
360*4882a593Smuzhiyun struct qedr_srq {
361*4882a593Smuzhiyun 	struct ib_srq ibsrq;
362*4882a593Smuzhiyun 	struct qedr_dev *dev;
363*4882a593Smuzhiyun 
364*4882a593Smuzhiyun 	struct qedr_userq	usrq;
365*4882a593Smuzhiyun 	struct qedr_srq_hwq_info hw_srq;
366*4882a593Smuzhiyun 	struct ib_umem *prod_umem;
367*4882a593Smuzhiyun 	u16 srq_id;
368*4882a593Smuzhiyun 	u32 srq_limit;
369*4882a593Smuzhiyun 	bool is_xrc;
370*4882a593Smuzhiyun 	/* lock to protect srq recv post */
371*4882a593Smuzhiyun 	spinlock_t lock;
372*4882a593Smuzhiyun };
373*4882a593Smuzhiyun 
374*4882a593Smuzhiyun enum qedr_qp_err_bitmap {
375*4882a593Smuzhiyun 	QEDR_QP_ERR_SQ_FULL = 1,
376*4882a593Smuzhiyun 	QEDR_QP_ERR_RQ_FULL = 2,
377*4882a593Smuzhiyun 	QEDR_QP_ERR_BAD_SR = 4,
378*4882a593Smuzhiyun 	QEDR_QP_ERR_BAD_RR = 8,
379*4882a593Smuzhiyun 	QEDR_QP_ERR_SQ_PBL_FULL = 16,
380*4882a593Smuzhiyun 	QEDR_QP_ERR_RQ_PBL_FULL = 32,
381*4882a593Smuzhiyun };
382*4882a593Smuzhiyun 
383*4882a593Smuzhiyun enum qedr_qp_create_type {
384*4882a593Smuzhiyun 	QEDR_QP_CREATE_NONE,
385*4882a593Smuzhiyun 	QEDR_QP_CREATE_USER,
386*4882a593Smuzhiyun 	QEDR_QP_CREATE_KERNEL,
387*4882a593Smuzhiyun };
388*4882a593Smuzhiyun 
389*4882a593Smuzhiyun enum qedr_iwarp_cm_flags {
390*4882a593Smuzhiyun 	QEDR_IWARP_CM_WAIT_FOR_CONNECT    = BIT(0),
391*4882a593Smuzhiyun 	QEDR_IWARP_CM_WAIT_FOR_DISCONNECT = BIT(1),
392*4882a593Smuzhiyun };
393*4882a593Smuzhiyun 
394*4882a593Smuzhiyun struct qedr_qp {
395*4882a593Smuzhiyun 	struct ib_qp ibqp;	/* must be first */
396*4882a593Smuzhiyun 	struct qedr_dev *dev;
397*4882a593Smuzhiyun 	struct qedr_qp_hwq_info sq;
398*4882a593Smuzhiyun 	struct qedr_qp_hwq_info rq;
399*4882a593Smuzhiyun 
400*4882a593Smuzhiyun 	u32 max_inline_data;
401*4882a593Smuzhiyun 
402*4882a593Smuzhiyun 	/* Lock for QP's */
403*4882a593Smuzhiyun 	spinlock_t q_lock;
404*4882a593Smuzhiyun 	struct qedr_cq *sq_cq;
405*4882a593Smuzhiyun 	struct qedr_cq *rq_cq;
406*4882a593Smuzhiyun 	struct qedr_srq *srq;
407*4882a593Smuzhiyun 	enum qed_roce_qp_state state;
408*4882a593Smuzhiyun 	u32 id;
409*4882a593Smuzhiyun 	struct qedr_pd *pd;
410*4882a593Smuzhiyun 	enum ib_qp_type qp_type;
411*4882a593Smuzhiyun 	enum qedr_qp_create_type create_type;
412*4882a593Smuzhiyun 	struct qed_rdma_qp *qed_qp;
413*4882a593Smuzhiyun 	u32 qp_id;
414*4882a593Smuzhiyun 	u16 icid;
415*4882a593Smuzhiyun 	u16 mtu;
416*4882a593Smuzhiyun 	int sgid_idx;
417*4882a593Smuzhiyun 	u32 rq_psn;
418*4882a593Smuzhiyun 	u32 sq_psn;
419*4882a593Smuzhiyun 	u32 qkey;
420*4882a593Smuzhiyun 	u32 dest_qp_num;
421*4882a593Smuzhiyun 	u8 timeout;
422*4882a593Smuzhiyun 
423*4882a593Smuzhiyun 	/* Relevant to qps created from kernel space only (ULPs) */
424*4882a593Smuzhiyun 	u8 prev_wqe_size;
425*4882a593Smuzhiyun 	u16 wqe_cons;
426*4882a593Smuzhiyun 	u32 err_bitmap;
427*4882a593Smuzhiyun 	bool signaled;
428*4882a593Smuzhiyun 
429*4882a593Smuzhiyun 	/* SQ shadow */
430*4882a593Smuzhiyun 	struct {
431*4882a593Smuzhiyun 		u64 wr_id;
432*4882a593Smuzhiyun 		enum ib_wc_opcode opcode;
433*4882a593Smuzhiyun 		u32 bytes_len;
434*4882a593Smuzhiyun 		u8 wqe_size;
435*4882a593Smuzhiyun 		bool signaled;
436*4882a593Smuzhiyun 		dma_addr_t icrc_mapping;
437*4882a593Smuzhiyun 		u32 *icrc;
438*4882a593Smuzhiyun 		struct qedr_mr *mr;
439*4882a593Smuzhiyun 	} *wqe_wr_id;
440*4882a593Smuzhiyun 
441*4882a593Smuzhiyun 	/* RQ shadow */
442*4882a593Smuzhiyun 	struct {
443*4882a593Smuzhiyun 		u64 wr_id;
444*4882a593Smuzhiyun 		struct ib_sge sg_list[RDMA_MAX_SGE_PER_RQ_WQE];
445*4882a593Smuzhiyun 		u8 wqe_size;
446*4882a593Smuzhiyun 
447*4882a593Smuzhiyun 		u8 smac[ETH_ALEN];
448*4882a593Smuzhiyun 		u16 vlan;
449*4882a593Smuzhiyun 		int rc;
450*4882a593Smuzhiyun 	} *rqe_wr_id;
451*4882a593Smuzhiyun 
452*4882a593Smuzhiyun 	/* Relevant to qps created from user space only (applications) */
453*4882a593Smuzhiyun 	struct qedr_userq usq;
454*4882a593Smuzhiyun 	struct qedr_userq urq;
455*4882a593Smuzhiyun 
456*4882a593Smuzhiyun 	/* synchronization objects used with iwarp ep */
457*4882a593Smuzhiyun 	struct kref refcnt;
458*4882a593Smuzhiyun 	struct completion iwarp_cm_comp;
459*4882a593Smuzhiyun 	unsigned long iwarp_cm_flags; /* enum iwarp_cm_flags */
460*4882a593Smuzhiyun };
461*4882a593Smuzhiyun 
462*4882a593Smuzhiyun struct qedr_ah {
463*4882a593Smuzhiyun 	struct ib_ah ibah;
464*4882a593Smuzhiyun 	struct rdma_ah_attr attr;
465*4882a593Smuzhiyun };
466*4882a593Smuzhiyun 
467*4882a593Smuzhiyun enum qedr_mr_type {
468*4882a593Smuzhiyun 	QEDR_MR_USER,
469*4882a593Smuzhiyun 	QEDR_MR_KERNEL,
470*4882a593Smuzhiyun 	QEDR_MR_DMA,
471*4882a593Smuzhiyun 	QEDR_MR_FRMR,
472*4882a593Smuzhiyun };
473*4882a593Smuzhiyun 
474*4882a593Smuzhiyun struct mr_info {
475*4882a593Smuzhiyun 	struct qedr_pbl *pbl_table;
476*4882a593Smuzhiyun 	struct qedr_pbl_info pbl_info;
477*4882a593Smuzhiyun 	struct list_head free_pbl_list;
478*4882a593Smuzhiyun 	struct list_head inuse_pbl_list;
479*4882a593Smuzhiyun 	u32 completed;
480*4882a593Smuzhiyun 	u32 completed_handled;
481*4882a593Smuzhiyun };
482*4882a593Smuzhiyun 
483*4882a593Smuzhiyun struct qedr_mr {
484*4882a593Smuzhiyun 	struct ib_mr ibmr;
485*4882a593Smuzhiyun 	struct ib_umem *umem;
486*4882a593Smuzhiyun 
487*4882a593Smuzhiyun 	struct qed_rdma_register_tid_in_params hw_mr;
488*4882a593Smuzhiyun 	enum qedr_mr_type type;
489*4882a593Smuzhiyun 
490*4882a593Smuzhiyun 	struct qedr_dev *dev;
491*4882a593Smuzhiyun 	struct mr_info info;
492*4882a593Smuzhiyun 
493*4882a593Smuzhiyun 	u64 *pages;
494*4882a593Smuzhiyun 	u32 npages;
495*4882a593Smuzhiyun };
496*4882a593Smuzhiyun 
497*4882a593Smuzhiyun struct qedr_user_mmap_entry {
498*4882a593Smuzhiyun 	struct rdma_user_mmap_entry rdma_entry;
499*4882a593Smuzhiyun 	struct qedr_dev *dev;
500*4882a593Smuzhiyun 	union {
501*4882a593Smuzhiyun 		u64 io_address;
502*4882a593Smuzhiyun 		void *address;
503*4882a593Smuzhiyun 	};
504*4882a593Smuzhiyun 	size_t length;
505*4882a593Smuzhiyun 	u16 dpi;
506*4882a593Smuzhiyun 	u8 mmap_flag;
507*4882a593Smuzhiyun };
508*4882a593Smuzhiyun 
509*4882a593Smuzhiyun #define SET_FIELD2(value, name, flag) ((value) |= ((flag) << (name ## _SHIFT)))
510*4882a593Smuzhiyun 
511*4882a593Smuzhiyun #define QEDR_RESP_IMM	(RDMA_CQE_RESPONDER_IMM_FLG_MASK << \
512*4882a593Smuzhiyun 			 RDMA_CQE_RESPONDER_IMM_FLG_SHIFT)
513*4882a593Smuzhiyun #define QEDR_RESP_RDMA	(RDMA_CQE_RESPONDER_RDMA_FLG_MASK << \
514*4882a593Smuzhiyun 			 RDMA_CQE_RESPONDER_RDMA_FLG_SHIFT)
515*4882a593Smuzhiyun #define QEDR_RESP_INV	(RDMA_CQE_RESPONDER_INV_FLG_MASK << \
516*4882a593Smuzhiyun 			 RDMA_CQE_RESPONDER_INV_FLG_SHIFT)
517*4882a593Smuzhiyun 
qedr_inc_sw_cons(struct qedr_qp_hwq_info * info)518*4882a593Smuzhiyun static inline void qedr_inc_sw_cons(struct qedr_qp_hwq_info *info)
519*4882a593Smuzhiyun {
520*4882a593Smuzhiyun 	info->cons = (info->cons + 1) % info->max_wr;
521*4882a593Smuzhiyun 	info->wqe_cons++;
522*4882a593Smuzhiyun }
523*4882a593Smuzhiyun 
qedr_inc_sw_prod(struct qedr_qp_hwq_info * info)524*4882a593Smuzhiyun static inline void qedr_inc_sw_prod(struct qedr_qp_hwq_info *info)
525*4882a593Smuzhiyun {
526*4882a593Smuzhiyun 	info->prod = (info->prod + 1) % info->max_wr;
527*4882a593Smuzhiyun }
528*4882a593Smuzhiyun 
qedr_get_dmac(struct qedr_dev * dev,struct rdma_ah_attr * ah_attr,u8 * mac_addr)529*4882a593Smuzhiyun static inline int qedr_get_dmac(struct qedr_dev *dev,
530*4882a593Smuzhiyun 				struct rdma_ah_attr *ah_attr, u8 *mac_addr)
531*4882a593Smuzhiyun {
532*4882a593Smuzhiyun 	union ib_gid zero_sgid = { { 0 } };
533*4882a593Smuzhiyun 	struct in6_addr in6;
534*4882a593Smuzhiyun 	const struct ib_global_route *grh = rdma_ah_read_grh(ah_attr);
535*4882a593Smuzhiyun 	u8 *dmac;
536*4882a593Smuzhiyun 
537*4882a593Smuzhiyun 	if (!memcmp(&grh->dgid, &zero_sgid, sizeof(union ib_gid))) {
538*4882a593Smuzhiyun 		DP_ERR(dev, "Local port GID not supported\n");
539*4882a593Smuzhiyun 		eth_zero_addr(mac_addr);
540*4882a593Smuzhiyun 		return -EINVAL;
541*4882a593Smuzhiyun 	}
542*4882a593Smuzhiyun 
543*4882a593Smuzhiyun 	memcpy(&in6, grh->dgid.raw, sizeof(in6));
544*4882a593Smuzhiyun 	dmac = rdma_ah_retrieve_dmac(ah_attr);
545*4882a593Smuzhiyun 	if (!dmac)
546*4882a593Smuzhiyun 		return -EINVAL;
547*4882a593Smuzhiyun 	ether_addr_copy(mac_addr, dmac);
548*4882a593Smuzhiyun 
549*4882a593Smuzhiyun 	return 0;
550*4882a593Smuzhiyun }
551*4882a593Smuzhiyun 
552*4882a593Smuzhiyun struct qedr_iw_listener {
553*4882a593Smuzhiyun 	struct qedr_dev *dev;
554*4882a593Smuzhiyun 	struct iw_cm_id *cm_id;
555*4882a593Smuzhiyun 	int		backlog;
556*4882a593Smuzhiyun 	void		*qed_handle;
557*4882a593Smuzhiyun };
558*4882a593Smuzhiyun 
559*4882a593Smuzhiyun struct qedr_iw_ep {
560*4882a593Smuzhiyun 	struct qedr_dev	*dev;
561*4882a593Smuzhiyun 	struct iw_cm_id	*cm_id;
562*4882a593Smuzhiyun 	struct qedr_qp	*qp;
563*4882a593Smuzhiyun 	void		*qed_context;
564*4882a593Smuzhiyun 	struct kref	refcnt;
565*4882a593Smuzhiyun };
566*4882a593Smuzhiyun 
567*4882a593Smuzhiyun static inline
get_qedr_ucontext(struct ib_ucontext * ibucontext)568*4882a593Smuzhiyun struct qedr_ucontext *get_qedr_ucontext(struct ib_ucontext *ibucontext)
569*4882a593Smuzhiyun {
570*4882a593Smuzhiyun 	return container_of(ibucontext, struct qedr_ucontext, ibucontext);
571*4882a593Smuzhiyun }
572*4882a593Smuzhiyun 
get_qedr_dev(struct ib_device * ibdev)573*4882a593Smuzhiyun static inline struct qedr_dev *get_qedr_dev(struct ib_device *ibdev)
574*4882a593Smuzhiyun {
575*4882a593Smuzhiyun 	return container_of(ibdev, struct qedr_dev, ibdev);
576*4882a593Smuzhiyun }
577*4882a593Smuzhiyun 
get_qedr_pd(struct ib_pd * ibpd)578*4882a593Smuzhiyun static inline struct qedr_pd *get_qedr_pd(struct ib_pd *ibpd)
579*4882a593Smuzhiyun {
580*4882a593Smuzhiyun 	return container_of(ibpd, struct qedr_pd, ibpd);
581*4882a593Smuzhiyun }
582*4882a593Smuzhiyun 
get_qedr_xrcd(struct ib_xrcd * ibxrcd)583*4882a593Smuzhiyun static inline struct qedr_xrcd *get_qedr_xrcd(struct ib_xrcd *ibxrcd)
584*4882a593Smuzhiyun {
585*4882a593Smuzhiyun 	return container_of(ibxrcd, struct qedr_xrcd, ibxrcd);
586*4882a593Smuzhiyun }
587*4882a593Smuzhiyun 
get_qedr_cq(struct ib_cq * ibcq)588*4882a593Smuzhiyun static inline struct qedr_cq *get_qedr_cq(struct ib_cq *ibcq)
589*4882a593Smuzhiyun {
590*4882a593Smuzhiyun 	return container_of(ibcq, struct qedr_cq, ibcq);
591*4882a593Smuzhiyun }
592*4882a593Smuzhiyun 
get_qedr_qp(struct ib_qp * ibqp)593*4882a593Smuzhiyun static inline struct qedr_qp *get_qedr_qp(struct ib_qp *ibqp)
594*4882a593Smuzhiyun {
595*4882a593Smuzhiyun 	return container_of(ibqp, struct qedr_qp, ibqp);
596*4882a593Smuzhiyun }
597*4882a593Smuzhiyun 
get_qedr_ah(struct ib_ah * ibah)598*4882a593Smuzhiyun static inline struct qedr_ah *get_qedr_ah(struct ib_ah *ibah)
599*4882a593Smuzhiyun {
600*4882a593Smuzhiyun 	return container_of(ibah, struct qedr_ah, ibah);
601*4882a593Smuzhiyun }
602*4882a593Smuzhiyun 
get_qedr_mr(struct ib_mr * ibmr)603*4882a593Smuzhiyun static inline struct qedr_mr *get_qedr_mr(struct ib_mr *ibmr)
604*4882a593Smuzhiyun {
605*4882a593Smuzhiyun 	return container_of(ibmr, struct qedr_mr, ibmr);
606*4882a593Smuzhiyun }
607*4882a593Smuzhiyun 
get_qedr_srq(struct ib_srq * ibsrq)608*4882a593Smuzhiyun static inline struct qedr_srq *get_qedr_srq(struct ib_srq *ibsrq)
609*4882a593Smuzhiyun {
610*4882a593Smuzhiyun 	return container_of(ibsrq, struct qedr_srq, ibsrq);
611*4882a593Smuzhiyun }
612*4882a593Smuzhiyun 
qedr_qp_has_srq(struct qedr_qp * qp)613*4882a593Smuzhiyun static inline bool qedr_qp_has_srq(struct qedr_qp *qp)
614*4882a593Smuzhiyun {
615*4882a593Smuzhiyun 	return qp->srq;
616*4882a593Smuzhiyun }
617*4882a593Smuzhiyun 
qedr_qp_has_sq(struct qedr_qp * qp)618*4882a593Smuzhiyun static inline bool qedr_qp_has_sq(struct qedr_qp *qp)
619*4882a593Smuzhiyun {
620*4882a593Smuzhiyun 	if (qp->qp_type == IB_QPT_GSI || qp->qp_type == IB_QPT_XRC_TGT)
621*4882a593Smuzhiyun 		return 0;
622*4882a593Smuzhiyun 
623*4882a593Smuzhiyun 	return 1;
624*4882a593Smuzhiyun }
625*4882a593Smuzhiyun 
qedr_qp_has_rq(struct qedr_qp * qp)626*4882a593Smuzhiyun static inline bool qedr_qp_has_rq(struct qedr_qp *qp)
627*4882a593Smuzhiyun {
628*4882a593Smuzhiyun 	if (qp->qp_type == IB_QPT_GSI || qp->qp_type == IB_QPT_XRC_INI ||
629*4882a593Smuzhiyun 	    qp->qp_type == IB_QPT_XRC_TGT || qedr_qp_has_srq(qp))
630*4882a593Smuzhiyun 		return 0;
631*4882a593Smuzhiyun 
632*4882a593Smuzhiyun 	return 1;
633*4882a593Smuzhiyun }
634*4882a593Smuzhiyun 
635*4882a593Smuzhiyun static inline struct qedr_user_mmap_entry *
get_qedr_mmap_entry(struct rdma_user_mmap_entry * rdma_entry)636*4882a593Smuzhiyun get_qedr_mmap_entry(struct rdma_user_mmap_entry *rdma_entry)
637*4882a593Smuzhiyun {
638*4882a593Smuzhiyun 	return container_of(rdma_entry, struct qedr_user_mmap_entry,
639*4882a593Smuzhiyun 			    rdma_entry);
640*4882a593Smuzhiyun }
641*4882a593Smuzhiyun #endif
642