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