xref: /linux/drivers/infiniband/hw/ionic/ionic_ibdev.h (revision e8521822c733c6deab0f339843cd37cd62c12795)
18d765af5SAbhijit Gangurde /* SPDX-License-Identifier: GPL-2.0 */
28d765af5SAbhijit Gangurde /* Copyright (C) 2018-2025, Advanced Micro Devices, Inc. */
38d765af5SAbhijit Gangurde 
48d765af5SAbhijit Gangurde #ifndef _IONIC_IBDEV_H_
58d765af5SAbhijit Gangurde #define _IONIC_IBDEV_H_
68d765af5SAbhijit Gangurde 
7f3bdbd42SAbhijit Gangurde #include <rdma/ib_umem.h>
88d765af5SAbhijit Gangurde #include <rdma/ib_verbs.h>
9*e8521822SAbhijit Gangurde #include <rdma/ib_pack.h>
10*e8521822SAbhijit Gangurde #include <rdma/uverbs_ioctl.h>
11f3bdbd42SAbhijit Gangurde 
12*e8521822SAbhijit Gangurde #include <rdma/ionic-abi.h>
138d765af5SAbhijit Gangurde #include <ionic_api.h>
14f3bdbd42SAbhijit Gangurde #include <ionic_regs.h>
15f3bdbd42SAbhijit Gangurde 
16f3bdbd42SAbhijit Gangurde #include "ionic_fw.h"
17f3bdbd42SAbhijit Gangurde #include "ionic_queue.h"
18f3bdbd42SAbhijit Gangurde #include "ionic_res.h"
198d765af5SAbhijit Gangurde 
208d765af5SAbhijit Gangurde #include "ionic_lif_cfg.h"
218d765af5SAbhijit Gangurde 
22f3bdbd42SAbhijit Gangurde /* Config knobs */
23f3bdbd42SAbhijit Gangurde #define IONIC_EQ_DEPTH 511
24f3bdbd42SAbhijit Gangurde #define IONIC_EQ_COUNT 32
25f3bdbd42SAbhijit Gangurde #define IONIC_AQ_DEPTH 63
26f3bdbd42SAbhijit Gangurde #define IONIC_AQ_COUNT 4
27f3bdbd42SAbhijit Gangurde #define IONIC_EQ_ISR_BUDGET 10
28f3bdbd42SAbhijit Gangurde #define IONIC_EQ_WORK_BUDGET 1000
29f3bdbd42SAbhijit Gangurde #define IONIC_MAX_PD 1024
30*e8521822SAbhijit Gangurde #define IONIC_SPEC_HIGH 8
31*e8521822SAbhijit Gangurde #define IONIC_SQCMB_ORDER 5
32*e8521822SAbhijit Gangurde #define IONIC_RQCMB_ORDER 0
33*e8521822SAbhijit Gangurde 
34*e8521822SAbhijit Gangurde #define IONIC_META_LAST		((void *)1ul)
35*e8521822SAbhijit Gangurde #define IONIC_META_POSTED	((void *)2ul)
36f3bdbd42SAbhijit Gangurde 
37f3bdbd42SAbhijit Gangurde #define IONIC_CQ_GRACE 100
38f3bdbd42SAbhijit Gangurde 
39*e8521822SAbhijit Gangurde #define IONIC_ROCE_UDP_SPORT	28272
40*e8521822SAbhijit Gangurde #define IONIC_DMA_LKEY		0
41*e8521822SAbhijit Gangurde #define IONIC_DMA_RKEY		IONIC_DMA_LKEY
42*e8521822SAbhijit Gangurde 
43*e8521822SAbhijit Gangurde #define IONIC_CMB_SUPPORTED \
44*e8521822SAbhijit Gangurde 	(IONIC_CMB_ENABLE | IONIC_CMB_REQUIRE | IONIC_CMB_EXPDB | \
45*e8521822SAbhijit Gangurde 	 IONIC_CMB_WC | IONIC_CMB_UC)
46*e8521822SAbhijit Gangurde 
47*e8521822SAbhijit Gangurde /* resource is not reserved on the device, indicated in tbl_order */
48*e8521822SAbhijit Gangurde #define IONIC_RES_INVALID	-1
49*e8521822SAbhijit Gangurde 
50f3bdbd42SAbhijit Gangurde struct ionic_aq;
51f3bdbd42SAbhijit Gangurde struct ionic_cq;
52f3bdbd42SAbhijit Gangurde struct ionic_eq;
53f3bdbd42SAbhijit Gangurde struct ionic_vcq;
54f3bdbd42SAbhijit Gangurde 
55f3bdbd42SAbhijit Gangurde enum ionic_admin_state {
56f3bdbd42SAbhijit Gangurde 	IONIC_ADMIN_ACTIVE, /* submitting admin commands to queue */
57f3bdbd42SAbhijit Gangurde 	IONIC_ADMIN_PAUSED, /* not submitting, but may complete normally */
58f3bdbd42SAbhijit Gangurde 	IONIC_ADMIN_KILLED, /* not submitting, locally completed */
59f3bdbd42SAbhijit Gangurde };
60f3bdbd42SAbhijit Gangurde 
61f3bdbd42SAbhijit Gangurde enum ionic_admin_flags {
62f3bdbd42SAbhijit Gangurde 	IONIC_ADMIN_F_BUSYWAIT  = BIT(0),	/* Don't sleep */
63f3bdbd42SAbhijit Gangurde 	IONIC_ADMIN_F_TEARDOWN  = BIT(1),	/* In destroy path */
64f3bdbd42SAbhijit Gangurde 	IONIC_ADMIN_F_INTERRUPT = BIT(2),	/* Interruptible w/timeout */
65f3bdbd42SAbhijit Gangurde };
66f3bdbd42SAbhijit Gangurde 
67f3bdbd42SAbhijit Gangurde enum ionic_mmap_flag {
68f3bdbd42SAbhijit Gangurde 	IONIC_MMAP_WC = BIT(0),
69f3bdbd42SAbhijit Gangurde };
70f3bdbd42SAbhijit Gangurde 
71f3bdbd42SAbhijit Gangurde struct ionic_mmap_entry {
72f3bdbd42SAbhijit Gangurde 	struct rdma_user_mmap_entry rdma_entry;
73f3bdbd42SAbhijit Gangurde 	unsigned long size;
74f3bdbd42SAbhijit Gangurde 	unsigned long pfn;
75f3bdbd42SAbhijit Gangurde 	u8 mmap_flags;
76f3bdbd42SAbhijit Gangurde };
77f3bdbd42SAbhijit Gangurde 
788d765af5SAbhijit Gangurde struct ionic_ibdev {
798d765af5SAbhijit Gangurde 	struct ib_device	ibdev;
808d765af5SAbhijit Gangurde 
818d765af5SAbhijit Gangurde 	struct ionic_lif_cfg	lif_cfg;
82f3bdbd42SAbhijit Gangurde 
83f3bdbd42SAbhijit Gangurde 	struct xarray		qp_tbl;
84f3bdbd42SAbhijit Gangurde 	struct xarray		cq_tbl;
85f3bdbd42SAbhijit Gangurde 
86f3bdbd42SAbhijit Gangurde 	struct ionic_resid_bits	inuse_dbid;
87f3bdbd42SAbhijit Gangurde 	struct ionic_resid_bits	inuse_pdid;
88f3bdbd42SAbhijit Gangurde 	struct ionic_resid_bits	inuse_ahid;
89f3bdbd42SAbhijit Gangurde 	struct ionic_resid_bits	inuse_mrid;
90f3bdbd42SAbhijit Gangurde 	struct ionic_resid_bits	inuse_qpid;
91f3bdbd42SAbhijit Gangurde 	struct ionic_resid_bits	inuse_cqid;
92f3bdbd42SAbhijit Gangurde 
93f3bdbd42SAbhijit Gangurde 	u8			half_cqid_udma_shift;
94f3bdbd42SAbhijit Gangurde 	u8			half_qpid_udma_shift;
95f3bdbd42SAbhijit Gangurde 	u8			next_qpid_udma_idx;
96f3bdbd42SAbhijit Gangurde 	u8			next_mrkey;
97f3bdbd42SAbhijit Gangurde 
98f3bdbd42SAbhijit Gangurde 	struct work_struct	reset_work;
99f3bdbd42SAbhijit Gangurde 	bool			reset_posted;
100f3bdbd42SAbhijit Gangurde 	u32			reset_cnt;
101f3bdbd42SAbhijit Gangurde 
102f3bdbd42SAbhijit Gangurde 	struct delayed_work	admin_dwork;
103f3bdbd42SAbhijit Gangurde 	struct ionic_aq		**aq_vec;
104f3bdbd42SAbhijit Gangurde 	atomic_t		admin_state;
105f3bdbd42SAbhijit Gangurde 
106f3bdbd42SAbhijit Gangurde 	struct ionic_eq		**eq_vec;
1078d765af5SAbhijit Gangurde };
1088d765af5SAbhijit Gangurde 
109f3bdbd42SAbhijit Gangurde struct ionic_eq {
110f3bdbd42SAbhijit Gangurde 	struct ionic_ibdev	*dev;
111f3bdbd42SAbhijit Gangurde 
112f3bdbd42SAbhijit Gangurde 	u32			eqid;
113f3bdbd42SAbhijit Gangurde 	u32			intr;
114f3bdbd42SAbhijit Gangurde 
115f3bdbd42SAbhijit Gangurde 	struct ionic_queue	q;
116f3bdbd42SAbhijit Gangurde 
117f3bdbd42SAbhijit Gangurde 	bool			armed;
118f3bdbd42SAbhijit Gangurde 	bool			enable;
119f3bdbd42SAbhijit Gangurde 
120f3bdbd42SAbhijit Gangurde 	struct work_struct	work;
121f3bdbd42SAbhijit Gangurde 
122f3bdbd42SAbhijit Gangurde 	int			irq;
123f3bdbd42SAbhijit Gangurde 	char			name[32];
124f3bdbd42SAbhijit Gangurde };
125f3bdbd42SAbhijit Gangurde 
126f3bdbd42SAbhijit Gangurde struct ionic_admin_wr {
127f3bdbd42SAbhijit Gangurde 	struct completion		work;
128f3bdbd42SAbhijit Gangurde 	struct list_head		aq_ent;
129f3bdbd42SAbhijit Gangurde 	struct ionic_v1_admin_wqe	wqe;
130f3bdbd42SAbhijit Gangurde 	struct ionic_v1_cqe		cqe;
131f3bdbd42SAbhijit Gangurde 	struct ionic_aq			*aq;
132f3bdbd42SAbhijit Gangurde 	int				status;
133f3bdbd42SAbhijit Gangurde };
134f3bdbd42SAbhijit Gangurde 
135f3bdbd42SAbhijit Gangurde struct ionic_admin_wr_q {
136f3bdbd42SAbhijit Gangurde 	struct ionic_admin_wr	*wr;
137f3bdbd42SAbhijit Gangurde 	int			wqe_strides;
138f3bdbd42SAbhijit Gangurde };
139f3bdbd42SAbhijit Gangurde 
140f3bdbd42SAbhijit Gangurde struct ionic_aq {
141f3bdbd42SAbhijit Gangurde 	struct ionic_ibdev	*dev;
142f3bdbd42SAbhijit Gangurde 	struct ionic_vcq	*vcq;
143f3bdbd42SAbhijit Gangurde 
144f3bdbd42SAbhijit Gangurde 	struct work_struct	work;
145f3bdbd42SAbhijit Gangurde 
146f3bdbd42SAbhijit Gangurde 	atomic_t		admin_state;
147f3bdbd42SAbhijit Gangurde 	unsigned long		stamp;
148f3bdbd42SAbhijit Gangurde 	bool			armed;
149f3bdbd42SAbhijit Gangurde 
150f3bdbd42SAbhijit Gangurde 	u32			aqid;
151f3bdbd42SAbhijit Gangurde 	u32			cqid;
152f3bdbd42SAbhijit Gangurde 
153f3bdbd42SAbhijit Gangurde 	spinlock_t		lock; /* for posting */
154f3bdbd42SAbhijit Gangurde 	struct ionic_queue	q;
155f3bdbd42SAbhijit Gangurde 	struct ionic_admin_wr_q	*q_wr;
156f3bdbd42SAbhijit Gangurde 	struct list_head	wr_prod;
157f3bdbd42SAbhijit Gangurde 	struct list_head	wr_post;
158f3bdbd42SAbhijit Gangurde };
159f3bdbd42SAbhijit Gangurde 
160f3bdbd42SAbhijit Gangurde struct ionic_ctx {
161f3bdbd42SAbhijit Gangurde 	struct ib_ucontext	ibctx;
162f3bdbd42SAbhijit Gangurde 	u32			dbid;
163f3bdbd42SAbhijit Gangurde 	struct rdma_user_mmap_entry	*mmap_dbell;
164f3bdbd42SAbhijit Gangurde };
165f3bdbd42SAbhijit Gangurde 
166f3bdbd42SAbhijit Gangurde struct ionic_tbl_buf {
167f3bdbd42SAbhijit Gangurde 	u32		tbl_limit;
168f3bdbd42SAbhijit Gangurde 	u32		tbl_pages;
169f3bdbd42SAbhijit Gangurde 	size_t		tbl_size;
170f3bdbd42SAbhijit Gangurde 	__le64		*tbl_buf;
171f3bdbd42SAbhijit Gangurde 	dma_addr_t	tbl_dma;
172f3bdbd42SAbhijit Gangurde 	u8		page_size_log2;
173f3bdbd42SAbhijit Gangurde };
174f3bdbd42SAbhijit Gangurde 
175*e8521822SAbhijit Gangurde struct ionic_pd {
176*e8521822SAbhijit Gangurde 	struct ib_pd		ibpd;
177*e8521822SAbhijit Gangurde 
178*e8521822SAbhijit Gangurde 	u32			pdid;
179*e8521822SAbhijit Gangurde 	u32			flags;
180*e8521822SAbhijit Gangurde };
181*e8521822SAbhijit Gangurde 
182f3bdbd42SAbhijit Gangurde struct ionic_cq {
183f3bdbd42SAbhijit Gangurde 	struct ionic_vcq	*vcq;
184f3bdbd42SAbhijit Gangurde 
185f3bdbd42SAbhijit Gangurde 	u32			cqid;
186f3bdbd42SAbhijit Gangurde 	u32			eqid;
187f3bdbd42SAbhijit Gangurde 
188f3bdbd42SAbhijit Gangurde 	spinlock_t		lock; /* for polling */
189f3bdbd42SAbhijit Gangurde 	struct list_head	poll_sq;
190f3bdbd42SAbhijit Gangurde 	bool			flush;
191f3bdbd42SAbhijit Gangurde 	struct list_head	flush_sq;
192f3bdbd42SAbhijit Gangurde 	struct list_head	flush_rq;
193f3bdbd42SAbhijit Gangurde 	struct list_head	ibkill_flush_ent;
194f3bdbd42SAbhijit Gangurde 
195f3bdbd42SAbhijit Gangurde 	struct ionic_queue	q;
196f3bdbd42SAbhijit Gangurde 	bool			color;
197f3bdbd42SAbhijit Gangurde 	int			credit;
198f3bdbd42SAbhijit Gangurde 	u16			arm_any_prod;
199f3bdbd42SAbhijit Gangurde 	u16			arm_sol_prod;
200f3bdbd42SAbhijit Gangurde 
201f3bdbd42SAbhijit Gangurde 	struct kref		cq_kref;
202f3bdbd42SAbhijit Gangurde 	struct completion	cq_rel_comp;
203f3bdbd42SAbhijit Gangurde 
204f3bdbd42SAbhijit Gangurde 	/* infrequently accessed, keep at end */
205f3bdbd42SAbhijit Gangurde 	struct ib_umem		*umem;
206f3bdbd42SAbhijit Gangurde };
207f3bdbd42SAbhijit Gangurde 
208f3bdbd42SAbhijit Gangurde struct ionic_vcq {
209f3bdbd42SAbhijit Gangurde 	struct ib_cq		ibcq;
210f3bdbd42SAbhijit Gangurde 	struct ionic_cq		cq[2];
211f3bdbd42SAbhijit Gangurde 	u8			udma_mask;
212f3bdbd42SAbhijit Gangurde 	u8			poll_idx;
213f3bdbd42SAbhijit Gangurde };
214f3bdbd42SAbhijit Gangurde 
215*e8521822SAbhijit Gangurde struct ionic_sq_meta {
216*e8521822SAbhijit Gangurde 	u64			wrid;
217*e8521822SAbhijit Gangurde 	u32			len;
218*e8521822SAbhijit Gangurde 	u16			seq;
219*e8521822SAbhijit Gangurde 	u8			ibop;
220*e8521822SAbhijit Gangurde 	u8			ibsts;
221*e8521822SAbhijit Gangurde 	u8			remote:1;
222*e8521822SAbhijit Gangurde 	u8			signal:1;
223*e8521822SAbhijit Gangurde 	u8			local_comp:1;
224*e8521822SAbhijit Gangurde };
225*e8521822SAbhijit Gangurde 
226*e8521822SAbhijit Gangurde struct ionic_rq_meta {
227*e8521822SAbhijit Gangurde 	struct ionic_rq_meta	*next;
228*e8521822SAbhijit Gangurde 	u64			wrid;
229*e8521822SAbhijit Gangurde };
230*e8521822SAbhijit Gangurde 
231*e8521822SAbhijit Gangurde struct ionic_qp {
232*e8521822SAbhijit Gangurde 	struct ib_qp		ibqp;
233*e8521822SAbhijit Gangurde 	enum ib_qp_state	state;
234*e8521822SAbhijit Gangurde 
235*e8521822SAbhijit Gangurde 	u32			qpid;
236*e8521822SAbhijit Gangurde 	u32			ahid;
237*e8521822SAbhijit Gangurde 	u32			sq_cqid;
238*e8521822SAbhijit Gangurde 	u32			rq_cqid;
239*e8521822SAbhijit Gangurde 	u8			udma_idx;
240*e8521822SAbhijit Gangurde 	u8			has_ah:1;
241*e8521822SAbhijit Gangurde 	u8			has_sq:1;
242*e8521822SAbhijit Gangurde 	u8			has_rq:1;
243*e8521822SAbhijit Gangurde 	u8			sig_all:1;
244*e8521822SAbhijit Gangurde 
245*e8521822SAbhijit Gangurde 	struct list_head	qp_list_counter;
246*e8521822SAbhijit Gangurde 
247*e8521822SAbhijit Gangurde 	struct list_head	cq_poll_sq;
248*e8521822SAbhijit Gangurde 	struct list_head	cq_flush_sq;
249*e8521822SAbhijit Gangurde 	struct list_head	cq_flush_rq;
250*e8521822SAbhijit Gangurde 	struct list_head	ibkill_flush_ent;
251*e8521822SAbhijit Gangurde 
252*e8521822SAbhijit Gangurde 	spinlock_t		sq_lock; /* for posting and polling */
253*e8521822SAbhijit Gangurde 	struct ionic_queue	sq;
254*e8521822SAbhijit Gangurde 	struct ionic_sq_meta	*sq_meta;
255*e8521822SAbhijit Gangurde 	u16			*sq_msn_idx;
256*e8521822SAbhijit Gangurde 	int			sq_spec;
257*e8521822SAbhijit Gangurde 	u16			sq_old_prod;
258*e8521822SAbhijit Gangurde 	u16			sq_msn_prod;
259*e8521822SAbhijit Gangurde 	u16			sq_msn_cons;
260*e8521822SAbhijit Gangurde 	u8			sq_cmb;
261*e8521822SAbhijit Gangurde 	bool			sq_flush;
262*e8521822SAbhijit Gangurde 	bool			sq_flush_rcvd;
263*e8521822SAbhijit Gangurde 
264*e8521822SAbhijit Gangurde 	spinlock_t		rq_lock; /* for posting and polling */
265*e8521822SAbhijit Gangurde 	struct ionic_queue	rq;
266*e8521822SAbhijit Gangurde 	struct ionic_rq_meta	*rq_meta;
267*e8521822SAbhijit Gangurde 	struct ionic_rq_meta	*rq_meta_head;
268*e8521822SAbhijit Gangurde 	int			rq_spec;
269*e8521822SAbhijit Gangurde 	u16			rq_old_prod;
270*e8521822SAbhijit Gangurde 	u8			rq_cmb;
271*e8521822SAbhijit Gangurde 	bool			rq_flush;
272*e8521822SAbhijit Gangurde 
273*e8521822SAbhijit Gangurde 	struct kref		qp_kref;
274*e8521822SAbhijit Gangurde 	struct completion	qp_rel_comp;
275*e8521822SAbhijit Gangurde 
276*e8521822SAbhijit Gangurde 	/* infrequently accessed, keep at end */
277*e8521822SAbhijit Gangurde 	int			sgid_index;
278*e8521822SAbhijit Gangurde 	int			sq_cmb_order;
279*e8521822SAbhijit Gangurde 	u32			sq_cmb_pgid;
280*e8521822SAbhijit Gangurde 	phys_addr_t		sq_cmb_addr;
281*e8521822SAbhijit Gangurde 	struct rdma_user_mmap_entry *mmap_sq_cmb;
282*e8521822SAbhijit Gangurde 
283*e8521822SAbhijit Gangurde 	struct ib_umem		*sq_umem;
284*e8521822SAbhijit Gangurde 
285*e8521822SAbhijit Gangurde 	int			rq_cmb_order;
286*e8521822SAbhijit Gangurde 	u32			rq_cmb_pgid;
287*e8521822SAbhijit Gangurde 	phys_addr_t		rq_cmb_addr;
288*e8521822SAbhijit Gangurde 	struct rdma_user_mmap_entry *mmap_rq_cmb;
289*e8521822SAbhijit Gangurde 
290*e8521822SAbhijit Gangurde 	struct ib_umem		*rq_umem;
291*e8521822SAbhijit Gangurde 
292*e8521822SAbhijit Gangurde 	int			dcqcn_profile;
293*e8521822SAbhijit Gangurde 
294*e8521822SAbhijit Gangurde 	struct ib_ud_header	*hdr;
295*e8521822SAbhijit Gangurde };
296*e8521822SAbhijit Gangurde 
297*e8521822SAbhijit Gangurde struct ionic_ah {
298*e8521822SAbhijit Gangurde 	struct ib_ah		ibah;
299*e8521822SAbhijit Gangurde 	u32			ahid;
300*e8521822SAbhijit Gangurde 	int			sgid_index;
301*e8521822SAbhijit Gangurde 	struct ib_ud_header	hdr;
302*e8521822SAbhijit Gangurde };
303*e8521822SAbhijit Gangurde 
304*e8521822SAbhijit Gangurde struct ionic_mr {
305*e8521822SAbhijit Gangurde 	union {
306*e8521822SAbhijit Gangurde 		struct ib_mr	ibmr;
307*e8521822SAbhijit Gangurde 		struct ib_mw	ibmw;
308*e8521822SAbhijit Gangurde 	};
309*e8521822SAbhijit Gangurde 
310*e8521822SAbhijit Gangurde 	u32			mrid;
311*e8521822SAbhijit Gangurde 	int			flags;
312*e8521822SAbhijit Gangurde 
313*e8521822SAbhijit Gangurde 	struct ib_umem		*umem;
314*e8521822SAbhijit Gangurde 	struct ionic_tbl_buf	buf;
315*e8521822SAbhijit Gangurde 	bool			created;
316*e8521822SAbhijit Gangurde };
317*e8521822SAbhijit Gangurde 
318f3bdbd42SAbhijit Gangurde static inline struct ionic_ibdev *to_ionic_ibdev(struct ib_device *ibdev)
319f3bdbd42SAbhijit Gangurde {
320f3bdbd42SAbhijit Gangurde 	return container_of(ibdev, struct ionic_ibdev, ibdev);
321f3bdbd42SAbhijit Gangurde }
322f3bdbd42SAbhijit Gangurde 
323*e8521822SAbhijit Gangurde static inline struct ionic_ctx *to_ionic_ctx(struct ib_ucontext *ibctx)
324*e8521822SAbhijit Gangurde {
325*e8521822SAbhijit Gangurde 	return container_of(ibctx, struct ionic_ctx, ibctx);
326*e8521822SAbhijit Gangurde }
327*e8521822SAbhijit Gangurde 
328*e8521822SAbhijit Gangurde static inline struct ionic_ctx *to_ionic_ctx_uobj(struct ib_uobject *uobj)
329*e8521822SAbhijit Gangurde {
330*e8521822SAbhijit Gangurde 	if (!uobj)
331*e8521822SAbhijit Gangurde 		return NULL;
332*e8521822SAbhijit Gangurde 
333*e8521822SAbhijit Gangurde 	if (!uobj->context)
334*e8521822SAbhijit Gangurde 		return NULL;
335*e8521822SAbhijit Gangurde 
336*e8521822SAbhijit Gangurde 	return to_ionic_ctx(uobj->context);
337*e8521822SAbhijit Gangurde }
338*e8521822SAbhijit Gangurde 
339*e8521822SAbhijit Gangurde static inline struct ionic_pd *to_ionic_pd(struct ib_pd *ibpd)
340*e8521822SAbhijit Gangurde {
341*e8521822SAbhijit Gangurde 	return container_of(ibpd, struct ionic_pd, ibpd);
342*e8521822SAbhijit Gangurde }
343*e8521822SAbhijit Gangurde 
344*e8521822SAbhijit Gangurde static inline struct ionic_mr *to_ionic_mr(struct ib_mr *ibmr)
345*e8521822SAbhijit Gangurde {
346*e8521822SAbhijit Gangurde 	return container_of(ibmr, struct ionic_mr, ibmr);
347*e8521822SAbhijit Gangurde }
348*e8521822SAbhijit Gangurde 
349*e8521822SAbhijit Gangurde static inline struct ionic_mr *to_ionic_mw(struct ib_mw *ibmw)
350*e8521822SAbhijit Gangurde {
351*e8521822SAbhijit Gangurde 	return container_of(ibmw, struct ionic_mr, ibmw);
352*e8521822SAbhijit Gangurde }
353*e8521822SAbhijit Gangurde 
354*e8521822SAbhijit Gangurde static inline struct ionic_vcq *to_ionic_vcq(struct ib_cq *ibcq)
355*e8521822SAbhijit Gangurde {
356*e8521822SAbhijit Gangurde 	return container_of(ibcq, struct ionic_vcq, ibcq);
357*e8521822SAbhijit Gangurde }
358*e8521822SAbhijit Gangurde 
359*e8521822SAbhijit Gangurde static inline struct ionic_cq *to_ionic_vcq_cq(struct ib_cq *ibcq,
360*e8521822SAbhijit Gangurde 					       uint8_t udma_idx)
361*e8521822SAbhijit Gangurde {
362*e8521822SAbhijit Gangurde 	return &to_ionic_vcq(ibcq)->cq[udma_idx];
363*e8521822SAbhijit Gangurde }
364*e8521822SAbhijit Gangurde 
365*e8521822SAbhijit Gangurde static inline struct ionic_qp *to_ionic_qp(struct ib_qp *ibqp)
366*e8521822SAbhijit Gangurde {
367*e8521822SAbhijit Gangurde 	return container_of(ibqp, struct ionic_qp, ibqp);
368*e8521822SAbhijit Gangurde }
369*e8521822SAbhijit Gangurde 
370*e8521822SAbhijit Gangurde static inline struct ionic_ah *to_ionic_ah(struct ib_ah *ibah)
371*e8521822SAbhijit Gangurde {
372*e8521822SAbhijit Gangurde 	return container_of(ibah, struct ionic_ah, ibah);
373*e8521822SAbhijit Gangurde }
374*e8521822SAbhijit Gangurde 
375*e8521822SAbhijit Gangurde static inline u32 ionic_ctx_dbid(struct ionic_ibdev *dev,
376*e8521822SAbhijit Gangurde 				 struct ionic_ctx *ctx)
377*e8521822SAbhijit Gangurde {
378*e8521822SAbhijit Gangurde 	if (!ctx)
379*e8521822SAbhijit Gangurde 		return dev->lif_cfg.dbid;
380*e8521822SAbhijit Gangurde 
381*e8521822SAbhijit Gangurde 	return ctx->dbid;
382*e8521822SAbhijit Gangurde }
383*e8521822SAbhijit Gangurde 
384*e8521822SAbhijit Gangurde static inline u32 ionic_obj_dbid(struct ionic_ibdev *dev,
385*e8521822SAbhijit Gangurde 				 struct ib_uobject *uobj)
386*e8521822SAbhijit Gangurde {
387*e8521822SAbhijit Gangurde 	return ionic_ctx_dbid(dev, to_ionic_ctx_uobj(uobj));
388*e8521822SAbhijit Gangurde }
389*e8521822SAbhijit Gangurde 
390*e8521822SAbhijit Gangurde static inline void ionic_qp_complete(struct kref *kref)
391*e8521822SAbhijit Gangurde {
392*e8521822SAbhijit Gangurde 	struct ionic_qp *qp = container_of(kref, struct ionic_qp, qp_kref);
393*e8521822SAbhijit Gangurde 
394*e8521822SAbhijit Gangurde 	complete(&qp->qp_rel_comp);
395*e8521822SAbhijit Gangurde }
396*e8521822SAbhijit Gangurde 
397f3bdbd42SAbhijit Gangurde static inline void ionic_cq_complete(struct kref *kref)
398f3bdbd42SAbhijit Gangurde {
399f3bdbd42SAbhijit Gangurde 	struct ionic_cq *cq = container_of(kref, struct ionic_cq, cq_kref);
400f3bdbd42SAbhijit Gangurde 
401f3bdbd42SAbhijit Gangurde 	complete(&cq->cq_rel_comp);
402f3bdbd42SAbhijit Gangurde }
403f3bdbd42SAbhijit Gangurde 
404f3bdbd42SAbhijit Gangurde /* ionic_admin.c */
405f3bdbd42SAbhijit Gangurde extern struct workqueue_struct *ionic_evt_workq;
406f3bdbd42SAbhijit Gangurde void ionic_admin_post(struct ionic_ibdev *dev, struct ionic_admin_wr *wr);
407f3bdbd42SAbhijit Gangurde int ionic_admin_wait(struct ionic_ibdev *dev, struct ionic_admin_wr *wr,
408f3bdbd42SAbhijit Gangurde 		     enum ionic_admin_flags);
409f3bdbd42SAbhijit Gangurde 
410f3bdbd42SAbhijit Gangurde int ionic_rdma_reset_devcmd(struct ionic_ibdev *dev);
411f3bdbd42SAbhijit Gangurde 
412f3bdbd42SAbhijit Gangurde int ionic_create_rdma_admin(struct ionic_ibdev *dev);
413f3bdbd42SAbhijit Gangurde void ionic_destroy_rdma_admin(struct ionic_ibdev *dev);
414f3bdbd42SAbhijit Gangurde void ionic_kill_rdma_admin(struct ionic_ibdev *dev, bool fatal_path);
415f3bdbd42SAbhijit Gangurde 
416f3bdbd42SAbhijit Gangurde /* ionic_controlpath.c */
417f3bdbd42SAbhijit Gangurde int ionic_create_cq_common(struct ionic_vcq *vcq,
418f3bdbd42SAbhijit Gangurde 			   struct ionic_tbl_buf *buf,
419f3bdbd42SAbhijit Gangurde 			   const struct ib_cq_init_attr *attr,
420f3bdbd42SAbhijit Gangurde 			   struct ionic_ctx *ctx,
421f3bdbd42SAbhijit Gangurde 			   struct ib_udata *udata,
422f3bdbd42SAbhijit Gangurde 			   struct ionic_qdesc *req_cq,
423f3bdbd42SAbhijit Gangurde 			   __u32 *resp_cqid,
424f3bdbd42SAbhijit Gangurde 			   int udma_idx);
425f3bdbd42SAbhijit Gangurde void ionic_destroy_cq_common(struct ionic_ibdev *dev, struct ionic_cq *cq);
426*e8521822SAbhijit Gangurde void ionic_flush_qp(struct ionic_ibdev *dev, struct ionic_qp *qp);
427*e8521822SAbhijit Gangurde void ionic_notify_flush_cq(struct ionic_cq *cq);
428*e8521822SAbhijit Gangurde 
429*e8521822SAbhijit Gangurde int ionic_alloc_ucontext(struct ib_ucontext *ibctx, struct ib_udata *udata);
430*e8521822SAbhijit Gangurde void ionic_dealloc_ucontext(struct ib_ucontext *ibctx);
431*e8521822SAbhijit Gangurde int ionic_mmap(struct ib_ucontext *ibctx, struct vm_area_struct *vma);
432*e8521822SAbhijit Gangurde void ionic_mmap_free(struct rdma_user_mmap_entry *rdma_entry);
433*e8521822SAbhijit Gangurde int ionic_alloc_pd(struct ib_pd *ibpd, struct ib_udata *udata);
434*e8521822SAbhijit Gangurde int ionic_dealloc_pd(struct ib_pd *ibpd, struct ib_udata *udata);
435*e8521822SAbhijit Gangurde int ionic_create_ah(struct ib_ah *ibah, struct rdma_ah_init_attr *init_attr,
436*e8521822SAbhijit Gangurde 		    struct ib_udata *udata);
437*e8521822SAbhijit Gangurde int ionic_query_ah(struct ib_ah *ibah, struct rdma_ah_attr *ah_attr);
438*e8521822SAbhijit Gangurde int ionic_destroy_ah(struct ib_ah *ibah, u32 flags);
439*e8521822SAbhijit Gangurde struct ib_mr *ionic_get_dma_mr(struct ib_pd *ibpd, int access);
440*e8521822SAbhijit Gangurde struct ib_mr *ionic_reg_user_mr(struct ib_pd *ibpd, u64 start, u64 length,
441*e8521822SAbhijit Gangurde 				u64 addr, int access, struct ib_dmah *dmah,
442*e8521822SAbhijit Gangurde 				struct ib_udata *udata);
443*e8521822SAbhijit Gangurde struct ib_mr *ionic_reg_user_mr_dmabuf(struct ib_pd *ibpd, u64 offset,
444*e8521822SAbhijit Gangurde 				       u64 length, u64 addr, int fd, int access,
445*e8521822SAbhijit Gangurde 					   struct ib_dmah *dmah,
446*e8521822SAbhijit Gangurde 				       struct uverbs_attr_bundle *attrs);
447*e8521822SAbhijit Gangurde int ionic_dereg_mr(struct ib_mr *ibmr, struct ib_udata *udata);
448*e8521822SAbhijit Gangurde struct ib_mr *ionic_alloc_mr(struct ib_pd *ibpd, enum ib_mr_type type,
449*e8521822SAbhijit Gangurde 			     u32 max_sg);
450*e8521822SAbhijit Gangurde int ionic_map_mr_sg(struct ib_mr *ibmr, struct scatterlist *sg, int sg_nents,
451*e8521822SAbhijit Gangurde 		    unsigned int *sg_offset);
452*e8521822SAbhijit Gangurde int ionic_alloc_mw(struct ib_mw *ibmw, struct ib_udata *udata);
453*e8521822SAbhijit Gangurde int ionic_dealloc_mw(struct ib_mw *ibmw);
454*e8521822SAbhijit Gangurde int ionic_create_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr *attr,
455*e8521822SAbhijit Gangurde 		    struct uverbs_attr_bundle *attrs);
456*e8521822SAbhijit Gangurde int ionic_destroy_cq(struct ib_cq *ibcq, struct ib_udata *udata);
457*e8521822SAbhijit Gangurde int ionic_create_qp(struct ib_qp *ibqp, struct ib_qp_init_attr *attr,
458*e8521822SAbhijit Gangurde 		    struct ib_udata *udata);
459*e8521822SAbhijit Gangurde int ionic_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr, int mask,
460*e8521822SAbhijit Gangurde 		    struct ib_udata *udata);
461*e8521822SAbhijit Gangurde int ionic_query_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr, int mask,
462*e8521822SAbhijit Gangurde 		   struct ib_qp_init_attr *init_attr);
463*e8521822SAbhijit Gangurde int ionic_destroy_qp(struct ib_qp *ibqp, struct ib_udata *udata);
464f3bdbd42SAbhijit Gangurde 
465f3bdbd42SAbhijit Gangurde /* ionic_pgtbl.c */
466*e8521822SAbhijit Gangurde __le64 ionic_pgtbl_dma(struct ionic_tbl_buf *buf, u64 va);
467f3bdbd42SAbhijit Gangurde int ionic_pgtbl_page(struct ionic_tbl_buf *buf, u64 dma);
468f3bdbd42SAbhijit Gangurde int ionic_pgtbl_init(struct ionic_ibdev *dev,
469f3bdbd42SAbhijit Gangurde 		     struct ionic_tbl_buf *buf,
470f3bdbd42SAbhijit Gangurde 		     struct ib_umem *umem,
471f3bdbd42SAbhijit Gangurde 		     dma_addr_t dma,
472f3bdbd42SAbhijit Gangurde 		     int limit,
473f3bdbd42SAbhijit Gangurde 		     u64 page_size);
474f3bdbd42SAbhijit Gangurde void ionic_pgtbl_unbuf(struct ionic_ibdev *dev, struct ionic_tbl_buf *buf);
4758d765af5SAbhijit Gangurde #endif /* _IONIC_IBDEV_H_ */
476