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