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