xref: /linux/drivers/infiniband/hw/ionic/ionic_ibdev.h (revision f3bdbd42702c6b10ebe627828c76ef51c68e4355)
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 
7*f3bdbd42SAbhijit Gangurde #include <rdma/ib_umem.h>
88d765af5SAbhijit Gangurde #include <rdma/ib_verbs.h>
9*f3bdbd42SAbhijit Gangurde 
108d765af5SAbhijit Gangurde #include <ionic_api.h>
11*f3bdbd42SAbhijit Gangurde #include <ionic_regs.h>
12*f3bdbd42SAbhijit Gangurde 
13*f3bdbd42SAbhijit Gangurde #include "ionic_fw.h"
14*f3bdbd42SAbhijit Gangurde #include "ionic_queue.h"
15*f3bdbd42SAbhijit Gangurde #include "ionic_res.h"
168d765af5SAbhijit Gangurde 
178d765af5SAbhijit Gangurde #include "ionic_lif_cfg.h"
188d765af5SAbhijit Gangurde 
19*f3bdbd42SAbhijit Gangurde /* Config knobs */
20*f3bdbd42SAbhijit Gangurde #define IONIC_EQ_DEPTH 511
21*f3bdbd42SAbhijit Gangurde #define IONIC_EQ_COUNT 32
22*f3bdbd42SAbhijit Gangurde #define IONIC_AQ_DEPTH 63
23*f3bdbd42SAbhijit Gangurde #define IONIC_AQ_COUNT 4
24*f3bdbd42SAbhijit Gangurde #define IONIC_EQ_ISR_BUDGET 10
25*f3bdbd42SAbhijit Gangurde #define IONIC_EQ_WORK_BUDGET 1000
26*f3bdbd42SAbhijit Gangurde #define IONIC_MAX_PD 1024
27*f3bdbd42SAbhijit Gangurde 
28*f3bdbd42SAbhijit Gangurde #define IONIC_CQ_GRACE 100
29*f3bdbd42SAbhijit Gangurde 
30*f3bdbd42SAbhijit Gangurde struct ionic_aq;
31*f3bdbd42SAbhijit Gangurde struct ionic_cq;
32*f3bdbd42SAbhijit Gangurde struct ionic_eq;
33*f3bdbd42SAbhijit Gangurde struct ionic_vcq;
34*f3bdbd42SAbhijit Gangurde 
35*f3bdbd42SAbhijit Gangurde enum ionic_admin_state {
36*f3bdbd42SAbhijit Gangurde 	IONIC_ADMIN_ACTIVE, /* submitting admin commands to queue */
37*f3bdbd42SAbhijit Gangurde 	IONIC_ADMIN_PAUSED, /* not submitting, but may complete normally */
38*f3bdbd42SAbhijit Gangurde 	IONIC_ADMIN_KILLED, /* not submitting, locally completed */
39*f3bdbd42SAbhijit Gangurde };
40*f3bdbd42SAbhijit Gangurde 
41*f3bdbd42SAbhijit Gangurde enum ionic_admin_flags {
42*f3bdbd42SAbhijit Gangurde 	IONIC_ADMIN_F_BUSYWAIT  = BIT(0),	/* Don't sleep */
43*f3bdbd42SAbhijit Gangurde 	IONIC_ADMIN_F_TEARDOWN  = BIT(1),	/* In destroy path */
44*f3bdbd42SAbhijit Gangurde 	IONIC_ADMIN_F_INTERRUPT = BIT(2),	/* Interruptible w/timeout */
45*f3bdbd42SAbhijit Gangurde };
46*f3bdbd42SAbhijit Gangurde 
47*f3bdbd42SAbhijit Gangurde struct ionic_qdesc {
48*f3bdbd42SAbhijit Gangurde 	__aligned_u64 addr;
49*f3bdbd42SAbhijit Gangurde 	__u32 size;
50*f3bdbd42SAbhijit Gangurde 	__u16 mask;
51*f3bdbd42SAbhijit Gangurde 	__u8 depth_log2;
52*f3bdbd42SAbhijit Gangurde 	__u8 stride_log2;
53*f3bdbd42SAbhijit Gangurde };
54*f3bdbd42SAbhijit Gangurde 
55*f3bdbd42SAbhijit Gangurde enum ionic_mmap_flag {
56*f3bdbd42SAbhijit Gangurde 	IONIC_MMAP_WC = BIT(0),
57*f3bdbd42SAbhijit Gangurde };
58*f3bdbd42SAbhijit Gangurde 
59*f3bdbd42SAbhijit Gangurde struct ionic_mmap_entry {
60*f3bdbd42SAbhijit Gangurde 	struct rdma_user_mmap_entry rdma_entry;
61*f3bdbd42SAbhijit Gangurde 	unsigned long size;
62*f3bdbd42SAbhijit Gangurde 	unsigned long pfn;
63*f3bdbd42SAbhijit Gangurde 	u8 mmap_flags;
64*f3bdbd42SAbhijit Gangurde };
65*f3bdbd42SAbhijit Gangurde 
668d765af5SAbhijit Gangurde struct ionic_ibdev {
678d765af5SAbhijit Gangurde 	struct ib_device	ibdev;
688d765af5SAbhijit Gangurde 
698d765af5SAbhijit Gangurde 	struct ionic_lif_cfg	lif_cfg;
70*f3bdbd42SAbhijit Gangurde 
71*f3bdbd42SAbhijit Gangurde 	struct xarray		qp_tbl;
72*f3bdbd42SAbhijit Gangurde 	struct xarray		cq_tbl;
73*f3bdbd42SAbhijit Gangurde 
74*f3bdbd42SAbhijit Gangurde 	struct ionic_resid_bits	inuse_dbid;
75*f3bdbd42SAbhijit Gangurde 	struct ionic_resid_bits	inuse_pdid;
76*f3bdbd42SAbhijit Gangurde 	struct ionic_resid_bits	inuse_ahid;
77*f3bdbd42SAbhijit Gangurde 	struct ionic_resid_bits	inuse_mrid;
78*f3bdbd42SAbhijit Gangurde 	struct ionic_resid_bits	inuse_qpid;
79*f3bdbd42SAbhijit Gangurde 	struct ionic_resid_bits	inuse_cqid;
80*f3bdbd42SAbhijit Gangurde 
81*f3bdbd42SAbhijit Gangurde 	u8			half_cqid_udma_shift;
82*f3bdbd42SAbhijit Gangurde 	u8			half_qpid_udma_shift;
83*f3bdbd42SAbhijit Gangurde 	u8			next_qpid_udma_idx;
84*f3bdbd42SAbhijit Gangurde 	u8			next_mrkey;
85*f3bdbd42SAbhijit Gangurde 
86*f3bdbd42SAbhijit Gangurde 	struct work_struct	reset_work;
87*f3bdbd42SAbhijit Gangurde 	bool			reset_posted;
88*f3bdbd42SAbhijit Gangurde 	u32			reset_cnt;
89*f3bdbd42SAbhijit Gangurde 
90*f3bdbd42SAbhijit Gangurde 	struct delayed_work	admin_dwork;
91*f3bdbd42SAbhijit Gangurde 	struct ionic_aq		**aq_vec;
92*f3bdbd42SAbhijit Gangurde 	atomic_t		admin_state;
93*f3bdbd42SAbhijit Gangurde 
94*f3bdbd42SAbhijit Gangurde 	struct ionic_eq		**eq_vec;
958d765af5SAbhijit Gangurde };
968d765af5SAbhijit Gangurde 
97*f3bdbd42SAbhijit Gangurde struct ionic_eq {
98*f3bdbd42SAbhijit Gangurde 	struct ionic_ibdev	*dev;
99*f3bdbd42SAbhijit Gangurde 
100*f3bdbd42SAbhijit Gangurde 	u32			eqid;
101*f3bdbd42SAbhijit Gangurde 	u32			intr;
102*f3bdbd42SAbhijit Gangurde 
103*f3bdbd42SAbhijit Gangurde 	struct ionic_queue	q;
104*f3bdbd42SAbhijit Gangurde 
105*f3bdbd42SAbhijit Gangurde 	bool			armed;
106*f3bdbd42SAbhijit Gangurde 	bool			enable;
107*f3bdbd42SAbhijit Gangurde 
108*f3bdbd42SAbhijit Gangurde 	struct work_struct	work;
109*f3bdbd42SAbhijit Gangurde 
110*f3bdbd42SAbhijit Gangurde 	int			irq;
111*f3bdbd42SAbhijit Gangurde 	char			name[32];
112*f3bdbd42SAbhijit Gangurde };
113*f3bdbd42SAbhijit Gangurde 
114*f3bdbd42SAbhijit Gangurde struct ionic_admin_wr {
115*f3bdbd42SAbhijit Gangurde 	struct completion		work;
116*f3bdbd42SAbhijit Gangurde 	struct list_head		aq_ent;
117*f3bdbd42SAbhijit Gangurde 	struct ionic_v1_admin_wqe	wqe;
118*f3bdbd42SAbhijit Gangurde 	struct ionic_v1_cqe		cqe;
119*f3bdbd42SAbhijit Gangurde 	struct ionic_aq			*aq;
120*f3bdbd42SAbhijit Gangurde 	int				status;
121*f3bdbd42SAbhijit Gangurde };
122*f3bdbd42SAbhijit Gangurde 
123*f3bdbd42SAbhijit Gangurde struct ionic_admin_wr_q {
124*f3bdbd42SAbhijit Gangurde 	struct ionic_admin_wr	*wr;
125*f3bdbd42SAbhijit Gangurde 	int			wqe_strides;
126*f3bdbd42SAbhijit Gangurde };
127*f3bdbd42SAbhijit Gangurde 
128*f3bdbd42SAbhijit Gangurde struct ionic_aq {
129*f3bdbd42SAbhijit Gangurde 	struct ionic_ibdev	*dev;
130*f3bdbd42SAbhijit Gangurde 	struct ionic_vcq	*vcq;
131*f3bdbd42SAbhijit Gangurde 
132*f3bdbd42SAbhijit Gangurde 	struct work_struct	work;
133*f3bdbd42SAbhijit Gangurde 
134*f3bdbd42SAbhijit Gangurde 	atomic_t		admin_state;
135*f3bdbd42SAbhijit Gangurde 	unsigned long		stamp;
136*f3bdbd42SAbhijit Gangurde 	bool			armed;
137*f3bdbd42SAbhijit Gangurde 
138*f3bdbd42SAbhijit Gangurde 	u32			aqid;
139*f3bdbd42SAbhijit Gangurde 	u32			cqid;
140*f3bdbd42SAbhijit Gangurde 
141*f3bdbd42SAbhijit Gangurde 	spinlock_t		lock; /* for posting */
142*f3bdbd42SAbhijit Gangurde 	struct ionic_queue	q;
143*f3bdbd42SAbhijit Gangurde 	struct ionic_admin_wr_q	*q_wr;
144*f3bdbd42SAbhijit Gangurde 	struct list_head	wr_prod;
145*f3bdbd42SAbhijit Gangurde 	struct list_head	wr_post;
146*f3bdbd42SAbhijit Gangurde };
147*f3bdbd42SAbhijit Gangurde 
148*f3bdbd42SAbhijit Gangurde struct ionic_ctx {
149*f3bdbd42SAbhijit Gangurde 	struct ib_ucontext	ibctx;
150*f3bdbd42SAbhijit Gangurde 	u32			dbid;
151*f3bdbd42SAbhijit Gangurde 	struct rdma_user_mmap_entry	*mmap_dbell;
152*f3bdbd42SAbhijit Gangurde };
153*f3bdbd42SAbhijit Gangurde 
154*f3bdbd42SAbhijit Gangurde struct ionic_tbl_buf {
155*f3bdbd42SAbhijit Gangurde 	u32		tbl_limit;
156*f3bdbd42SAbhijit Gangurde 	u32		tbl_pages;
157*f3bdbd42SAbhijit Gangurde 	size_t		tbl_size;
158*f3bdbd42SAbhijit Gangurde 	__le64		*tbl_buf;
159*f3bdbd42SAbhijit Gangurde 	dma_addr_t	tbl_dma;
160*f3bdbd42SAbhijit Gangurde 	u8		page_size_log2;
161*f3bdbd42SAbhijit Gangurde };
162*f3bdbd42SAbhijit Gangurde 
163*f3bdbd42SAbhijit Gangurde struct ionic_cq {
164*f3bdbd42SAbhijit Gangurde 	struct ionic_vcq	*vcq;
165*f3bdbd42SAbhijit Gangurde 
166*f3bdbd42SAbhijit Gangurde 	u32			cqid;
167*f3bdbd42SAbhijit Gangurde 	u32			eqid;
168*f3bdbd42SAbhijit Gangurde 
169*f3bdbd42SAbhijit Gangurde 	spinlock_t		lock; /* for polling */
170*f3bdbd42SAbhijit Gangurde 	struct list_head	poll_sq;
171*f3bdbd42SAbhijit Gangurde 	bool			flush;
172*f3bdbd42SAbhijit Gangurde 	struct list_head	flush_sq;
173*f3bdbd42SAbhijit Gangurde 	struct list_head	flush_rq;
174*f3bdbd42SAbhijit Gangurde 	struct list_head	ibkill_flush_ent;
175*f3bdbd42SAbhijit Gangurde 
176*f3bdbd42SAbhijit Gangurde 	struct ionic_queue	q;
177*f3bdbd42SAbhijit Gangurde 	bool			color;
178*f3bdbd42SAbhijit Gangurde 	int			credit;
179*f3bdbd42SAbhijit Gangurde 	u16			arm_any_prod;
180*f3bdbd42SAbhijit Gangurde 	u16			arm_sol_prod;
181*f3bdbd42SAbhijit Gangurde 
182*f3bdbd42SAbhijit Gangurde 	struct kref		cq_kref;
183*f3bdbd42SAbhijit Gangurde 	struct completion	cq_rel_comp;
184*f3bdbd42SAbhijit Gangurde 
185*f3bdbd42SAbhijit Gangurde 	/* infrequently accessed, keep at end */
186*f3bdbd42SAbhijit Gangurde 	struct ib_umem		*umem;
187*f3bdbd42SAbhijit Gangurde };
188*f3bdbd42SAbhijit Gangurde 
189*f3bdbd42SAbhijit Gangurde struct ionic_vcq {
190*f3bdbd42SAbhijit Gangurde 	struct ib_cq		ibcq;
191*f3bdbd42SAbhijit Gangurde 	struct ionic_cq		cq[2];
192*f3bdbd42SAbhijit Gangurde 	u8			udma_mask;
193*f3bdbd42SAbhijit Gangurde 	u8			poll_idx;
194*f3bdbd42SAbhijit Gangurde };
195*f3bdbd42SAbhijit Gangurde 
196*f3bdbd42SAbhijit Gangurde static inline struct ionic_ibdev *to_ionic_ibdev(struct ib_device *ibdev)
197*f3bdbd42SAbhijit Gangurde {
198*f3bdbd42SAbhijit Gangurde 	return container_of(ibdev, struct ionic_ibdev, ibdev);
199*f3bdbd42SAbhijit Gangurde }
200*f3bdbd42SAbhijit Gangurde 
201*f3bdbd42SAbhijit Gangurde static inline void ionic_cq_complete(struct kref *kref)
202*f3bdbd42SAbhijit Gangurde {
203*f3bdbd42SAbhijit Gangurde 	struct ionic_cq *cq = container_of(kref, struct ionic_cq, cq_kref);
204*f3bdbd42SAbhijit Gangurde 
205*f3bdbd42SAbhijit Gangurde 	complete(&cq->cq_rel_comp);
206*f3bdbd42SAbhijit Gangurde }
207*f3bdbd42SAbhijit Gangurde 
208*f3bdbd42SAbhijit Gangurde /* ionic_admin.c */
209*f3bdbd42SAbhijit Gangurde extern struct workqueue_struct *ionic_evt_workq;
210*f3bdbd42SAbhijit Gangurde void ionic_admin_post(struct ionic_ibdev *dev, struct ionic_admin_wr *wr);
211*f3bdbd42SAbhijit Gangurde int ionic_admin_wait(struct ionic_ibdev *dev, struct ionic_admin_wr *wr,
212*f3bdbd42SAbhijit Gangurde 		     enum ionic_admin_flags);
213*f3bdbd42SAbhijit Gangurde 
214*f3bdbd42SAbhijit Gangurde int ionic_rdma_reset_devcmd(struct ionic_ibdev *dev);
215*f3bdbd42SAbhijit Gangurde 
216*f3bdbd42SAbhijit Gangurde int ionic_create_rdma_admin(struct ionic_ibdev *dev);
217*f3bdbd42SAbhijit Gangurde void ionic_destroy_rdma_admin(struct ionic_ibdev *dev);
218*f3bdbd42SAbhijit Gangurde void ionic_kill_rdma_admin(struct ionic_ibdev *dev, bool fatal_path);
219*f3bdbd42SAbhijit Gangurde 
220*f3bdbd42SAbhijit Gangurde /* ionic_controlpath.c */
221*f3bdbd42SAbhijit Gangurde int ionic_create_cq_common(struct ionic_vcq *vcq,
222*f3bdbd42SAbhijit Gangurde 			   struct ionic_tbl_buf *buf,
223*f3bdbd42SAbhijit Gangurde 			   const struct ib_cq_init_attr *attr,
224*f3bdbd42SAbhijit Gangurde 			   struct ionic_ctx *ctx,
225*f3bdbd42SAbhijit Gangurde 			   struct ib_udata *udata,
226*f3bdbd42SAbhijit Gangurde 			   struct ionic_qdesc *req_cq,
227*f3bdbd42SAbhijit Gangurde 			   __u32 *resp_cqid,
228*f3bdbd42SAbhijit Gangurde 			   int udma_idx);
229*f3bdbd42SAbhijit Gangurde void ionic_destroy_cq_common(struct ionic_ibdev *dev, struct ionic_cq *cq);
230*f3bdbd42SAbhijit Gangurde 
231*f3bdbd42SAbhijit Gangurde /* ionic_pgtbl.c */
232*f3bdbd42SAbhijit Gangurde int ionic_pgtbl_page(struct ionic_tbl_buf *buf, u64 dma);
233*f3bdbd42SAbhijit Gangurde int ionic_pgtbl_init(struct ionic_ibdev *dev,
234*f3bdbd42SAbhijit Gangurde 		     struct ionic_tbl_buf *buf,
235*f3bdbd42SAbhijit Gangurde 		     struct ib_umem *umem,
236*f3bdbd42SAbhijit Gangurde 		     dma_addr_t dma,
237*f3bdbd42SAbhijit Gangurde 		     int limit,
238*f3bdbd42SAbhijit Gangurde 		     u64 page_size);
239*f3bdbd42SAbhijit Gangurde void ionic_pgtbl_unbuf(struct ionic_ibdev *dev, struct ionic_tbl_buf *buf);
2408d765af5SAbhijit Gangurde #endif /* _IONIC_IBDEV_H_ */
241