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