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 29f3bdbd42SAbhijit Gangurde #define IONIC_MAX_PD 1024 30e8521822SAbhijit Gangurde #define IONIC_SPEC_HIGH 8 31e8521822SAbhijit Gangurde #define IONIC_SQCMB_ORDER 5 32e8521822SAbhijit Gangurde #define IONIC_RQCMB_ORDER 0 33e8521822SAbhijit Gangurde 34e8521822SAbhijit Gangurde #define IONIC_META_LAST ((void *)1ul) 35e8521822SAbhijit Gangurde #define IONIC_META_POSTED ((void *)2ul) 36f3bdbd42SAbhijit Gangurde 37f3bdbd42SAbhijit Gangurde #define IONIC_CQ_GRACE 100 38f3bdbd42SAbhijit Gangurde 39e8521822SAbhijit Gangurde #define IONIC_ROCE_UDP_SPORT 28272 40e8521822SAbhijit Gangurde #define IONIC_DMA_LKEY 0 41e8521822SAbhijit Gangurde #define IONIC_DMA_RKEY IONIC_DMA_LKEY 42e8521822SAbhijit Gangurde 43e8521822SAbhijit Gangurde #define IONIC_CMB_SUPPORTED \ 44e8521822SAbhijit Gangurde (IONIC_CMB_ENABLE | IONIC_CMB_REQUIRE | IONIC_CMB_EXPDB | \ 45e8521822SAbhijit Gangurde IONIC_CMB_WC | IONIC_CMB_UC) 46e8521822SAbhijit Gangurde 47e8521822SAbhijit Gangurde /* resource is not reserved on the device, indicated in tbl_order */ 48e8521822SAbhijit Gangurde #define IONIC_RES_INVALID -1 49e8521822SAbhijit 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 175e8521822SAbhijit Gangurde struct ionic_pd { 176e8521822SAbhijit Gangurde struct ib_pd ibpd; 177e8521822SAbhijit Gangurde 178e8521822SAbhijit Gangurde u32 pdid; 179e8521822SAbhijit Gangurde u32 flags; 180e8521822SAbhijit Gangurde }; 181e8521822SAbhijit 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 215e8521822SAbhijit Gangurde struct ionic_sq_meta { 216e8521822SAbhijit Gangurde u64 wrid; 217e8521822SAbhijit Gangurde u32 len; 218e8521822SAbhijit Gangurde u16 seq; 219e8521822SAbhijit Gangurde u8 ibop; 220e8521822SAbhijit Gangurde u8 ibsts; 221e8521822SAbhijit Gangurde u8 remote:1; 222e8521822SAbhijit Gangurde u8 signal:1; 223e8521822SAbhijit Gangurde u8 local_comp:1; 224e8521822SAbhijit Gangurde }; 225e8521822SAbhijit Gangurde 226e8521822SAbhijit Gangurde struct ionic_rq_meta { 227e8521822SAbhijit Gangurde struct ionic_rq_meta *next; 228e8521822SAbhijit Gangurde u64 wrid; 229e8521822SAbhijit Gangurde }; 230e8521822SAbhijit Gangurde 231e8521822SAbhijit Gangurde struct ionic_qp { 232e8521822SAbhijit Gangurde struct ib_qp ibqp; 233e8521822SAbhijit Gangurde enum ib_qp_state state; 234e8521822SAbhijit Gangurde 235e8521822SAbhijit Gangurde u32 qpid; 236e8521822SAbhijit Gangurde u32 ahid; 237e8521822SAbhijit Gangurde u32 sq_cqid; 238e8521822SAbhijit Gangurde u32 rq_cqid; 239e8521822SAbhijit Gangurde u8 udma_idx; 240e8521822SAbhijit Gangurde u8 has_ah:1; 241e8521822SAbhijit Gangurde u8 has_sq:1; 242e8521822SAbhijit Gangurde u8 has_rq:1; 243e8521822SAbhijit Gangurde u8 sig_all:1; 244e8521822SAbhijit Gangurde 245e8521822SAbhijit Gangurde struct list_head qp_list_counter; 246e8521822SAbhijit Gangurde 247e8521822SAbhijit Gangurde struct list_head cq_poll_sq; 248e8521822SAbhijit Gangurde struct list_head cq_flush_sq; 249e8521822SAbhijit Gangurde struct list_head cq_flush_rq; 250e8521822SAbhijit Gangurde struct list_head ibkill_flush_ent; 251e8521822SAbhijit Gangurde 252e8521822SAbhijit Gangurde spinlock_t sq_lock; /* for posting and polling */ 253e8521822SAbhijit Gangurde struct ionic_queue sq; 254e8521822SAbhijit Gangurde struct ionic_sq_meta *sq_meta; 255e8521822SAbhijit Gangurde u16 *sq_msn_idx; 256e8521822SAbhijit Gangurde int sq_spec; 257e8521822SAbhijit Gangurde u16 sq_old_prod; 258e8521822SAbhijit Gangurde u16 sq_msn_prod; 259e8521822SAbhijit Gangurde u16 sq_msn_cons; 260e8521822SAbhijit Gangurde u8 sq_cmb; 261e8521822SAbhijit Gangurde bool sq_flush; 262e8521822SAbhijit Gangurde bool sq_flush_rcvd; 263e8521822SAbhijit Gangurde 264e8521822SAbhijit Gangurde spinlock_t rq_lock; /* for posting and polling */ 265e8521822SAbhijit Gangurde struct ionic_queue rq; 266e8521822SAbhijit Gangurde struct ionic_rq_meta *rq_meta; 267e8521822SAbhijit Gangurde struct ionic_rq_meta *rq_meta_head; 268e8521822SAbhijit Gangurde int rq_spec; 269e8521822SAbhijit Gangurde u16 rq_old_prod; 270e8521822SAbhijit Gangurde u8 rq_cmb; 271e8521822SAbhijit Gangurde bool rq_flush; 272e8521822SAbhijit Gangurde 273e8521822SAbhijit Gangurde struct kref qp_kref; 274e8521822SAbhijit Gangurde struct completion qp_rel_comp; 275e8521822SAbhijit Gangurde 276e8521822SAbhijit Gangurde /* infrequently accessed, keep at end */ 277e8521822SAbhijit Gangurde int sgid_index; 278e8521822SAbhijit Gangurde int sq_cmb_order; 279e8521822SAbhijit Gangurde u32 sq_cmb_pgid; 280e8521822SAbhijit Gangurde phys_addr_t sq_cmb_addr; 281e8521822SAbhijit Gangurde struct rdma_user_mmap_entry *mmap_sq_cmb; 282e8521822SAbhijit Gangurde 283e8521822SAbhijit Gangurde struct ib_umem *sq_umem; 284e8521822SAbhijit Gangurde 285e8521822SAbhijit Gangurde int rq_cmb_order; 286e8521822SAbhijit Gangurde u32 rq_cmb_pgid; 287e8521822SAbhijit Gangurde phys_addr_t rq_cmb_addr; 288e8521822SAbhijit Gangurde struct rdma_user_mmap_entry *mmap_rq_cmb; 289e8521822SAbhijit Gangurde 290e8521822SAbhijit Gangurde struct ib_umem *rq_umem; 291e8521822SAbhijit Gangurde 292e8521822SAbhijit Gangurde int dcqcn_profile; 293e8521822SAbhijit Gangurde 294e8521822SAbhijit Gangurde struct ib_ud_header *hdr; 295e8521822SAbhijit Gangurde }; 296e8521822SAbhijit Gangurde 297e8521822SAbhijit Gangurde struct ionic_ah { 298e8521822SAbhijit Gangurde struct ib_ah ibah; 299e8521822SAbhijit Gangurde u32 ahid; 300e8521822SAbhijit Gangurde int sgid_index; 301e8521822SAbhijit Gangurde struct ib_ud_header hdr; 302e8521822SAbhijit Gangurde }; 303e8521822SAbhijit Gangurde 304e8521822SAbhijit Gangurde struct ionic_mr { 305e8521822SAbhijit Gangurde union { 306e8521822SAbhijit Gangurde struct ib_mr ibmr; 307e8521822SAbhijit Gangurde struct ib_mw ibmw; 308e8521822SAbhijit Gangurde }; 309e8521822SAbhijit Gangurde 310e8521822SAbhijit Gangurde u32 mrid; 311e8521822SAbhijit Gangurde int flags; 312e8521822SAbhijit Gangurde 313e8521822SAbhijit Gangurde struct ib_umem *umem; 314e8521822SAbhijit Gangurde struct ionic_tbl_buf buf; 315e8521822SAbhijit Gangurde bool created; 316e8521822SAbhijit Gangurde }; 317e8521822SAbhijit 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 323e8521822SAbhijit Gangurde static inline struct ionic_ctx *to_ionic_ctx(struct ib_ucontext *ibctx) 324e8521822SAbhijit Gangurde { 325e8521822SAbhijit Gangurde return container_of(ibctx, struct ionic_ctx, ibctx); 326e8521822SAbhijit Gangurde } 327e8521822SAbhijit Gangurde 328e8521822SAbhijit Gangurde static inline struct ionic_ctx *to_ionic_ctx_uobj(struct ib_uobject *uobj) 329e8521822SAbhijit Gangurde { 330e8521822SAbhijit Gangurde if (!uobj) 331e8521822SAbhijit Gangurde return NULL; 332e8521822SAbhijit Gangurde 333e8521822SAbhijit Gangurde if (!uobj->context) 334e8521822SAbhijit Gangurde return NULL; 335e8521822SAbhijit Gangurde 336e8521822SAbhijit Gangurde return to_ionic_ctx(uobj->context); 337e8521822SAbhijit Gangurde } 338e8521822SAbhijit Gangurde 339e8521822SAbhijit Gangurde static inline struct ionic_pd *to_ionic_pd(struct ib_pd *ibpd) 340e8521822SAbhijit Gangurde { 341e8521822SAbhijit Gangurde return container_of(ibpd, struct ionic_pd, ibpd); 342e8521822SAbhijit Gangurde } 343e8521822SAbhijit Gangurde 344e8521822SAbhijit Gangurde static inline struct ionic_mr *to_ionic_mr(struct ib_mr *ibmr) 345e8521822SAbhijit Gangurde { 346e8521822SAbhijit Gangurde return container_of(ibmr, struct ionic_mr, ibmr); 347e8521822SAbhijit Gangurde } 348e8521822SAbhijit Gangurde 349e8521822SAbhijit Gangurde static inline struct ionic_mr *to_ionic_mw(struct ib_mw *ibmw) 350e8521822SAbhijit Gangurde { 351e8521822SAbhijit Gangurde return container_of(ibmw, struct ionic_mr, ibmw); 352e8521822SAbhijit Gangurde } 353e8521822SAbhijit Gangurde 354e8521822SAbhijit Gangurde static inline struct ionic_vcq *to_ionic_vcq(struct ib_cq *ibcq) 355e8521822SAbhijit Gangurde { 356e8521822SAbhijit Gangurde return container_of(ibcq, struct ionic_vcq, ibcq); 357e8521822SAbhijit Gangurde } 358e8521822SAbhijit Gangurde 359e8521822SAbhijit Gangurde static inline struct ionic_cq *to_ionic_vcq_cq(struct ib_cq *ibcq, 360e8521822SAbhijit Gangurde uint8_t udma_idx) 361e8521822SAbhijit Gangurde { 362e8521822SAbhijit Gangurde return &to_ionic_vcq(ibcq)->cq[udma_idx]; 363e8521822SAbhijit Gangurde } 364e8521822SAbhijit Gangurde 365e8521822SAbhijit Gangurde static inline struct ionic_qp *to_ionic_qp(struct ib_qp *ibqp) 366e8521822SAbhijit Gangurde { 367e8521822SAbhijit Gangurde return container_of(ibqp, struct ionic_qp, ibqp); 368e8521822SAbhijit Gangurde } 369e8521822SAbhijit Gangurde 370e8521822SAbhijit Gangurde static inline struct ionic_ah *to_ionic_ah(struct ib_ah *ibah) 371e8521822SAbhijit Gangurde { 372e8521822SAbhijit Gangurde return container_of(ibah, struct ionic_ah, ibah); 373e8521822SAbhijit Gangurde } 374e8521822SAbhijit Gangurde 375e8521822SAbhijit Gangurde static inline u32 ionic_ctx_dbid(struct ionic_ibdev *dev, 376e8521822SAbhijit Gangurde struct ionic_ctx *ctx) 377e8521822SAbhijit Gangurde { 378e8521822SAbhijit Gangurde if (!ctx) 379e8521822SAbhijit Gangurde return dev->lif_cfg.dbid; 380e8521822SAbhijit Gangurde 381e8521822SAbhijit Gangurde return ctx->dbid; 382e8521822SAbhijit Gangurde } 383e8521822SAbhijit Gangurde 384e8521822SAbhijit Gangurde static inline u32 ionic_obj_dbid(struct ionic_ibdev *dev, 385e8521822SAbhijit Gangurde struct ib_uobject *uobj) 386e8521822SAbhijit Gangurde { 387e8521822SAbhijit Gangurde return ionic_ctx_dbid(dev, to_ionic_ctx_uobj(uobj)); 388e8521822SAbhijit Gangurde } 389e8521822SAbhijit Gangurde 390*b83c6205SAbhijit Gangurde static inline bool ionic_ibop_is_local(enum ib_wr_opcode op) 391*b83c6205SAbhijit Gangurde { 392*b83c6205SAbhijit Gangurde return op == IB_WR_LOCAL_INV || op == IB_WR_REG_MR; 393*b83c6205SAbhijit Gangurde } 394*b83c6205SAbhijit Gangurde 395e8521822SAbhijit Gangurde static inline void ionic_qp_complete(struct kref *kref) 396e8521822SAbhijit Gangurde { 397e8521822SAbhijit Gangurde struct ionic_qp *qp = container_of(kref, struct ionic_qp, qp_kref); 398e8521822SAbhijit Gangurde 399e8521822SAbhijit Gangurde complete(&qp->qp_rel_comp); 400e8521822SAbhijit Gangurde } 401e8521822SAbhijit Gangurde 402f3bdbd42SAbhijit Gangurde static inline void ionic_cq_complete(struct kref *kref) 403f3bdbd42SAbhijit Gangurde { 404f3bdbd42SAbhijit Gangurde struct ionic_cq *cq = container_of(kref, struct ionic_cq, cq_kref); 405f3bdbd42SAbhijit Gangurde 406f3bdbd42SAbhijit Gangurde complete(&cq->cq_rel_comp); 407f3bdbd42SAbhijit Gangurde } 408f3bdbd42SAbhijit Gangurde 409f3bdbd42SAbhijit Gangurde /* ionic_admin.c */ 410f3bdbd42SAbhijit Gangurde extern struct workqueue_struct *ionic_evt_workq; 411f3bdbd42SAbhijit Gangurde void ionic_admin_post(struct ionic_ibdev *dev, struct ionic_admin_wr *wr); 412f3bdbd42SAbhijit Gangurde int ionic_admin_wait(struct ionic_ibdev *dev, struct ionic_admin_wr *wr, 413f3bdbd42SAbhijit Gangurde enum ionic_admin_flags); 414f3bdbd42SAbhijit Gangurde 415f3bdbd42SAbhijit Gangurde int ionic_rdma_reset_devcmd(struct ionic_ibdev *dev); 416f3bdbd42SAbhijit Gangurde 417f3bdbd42SAbhijit Gangurde int ionic_create_rdma_admin(struct ionic_ibdev *dev); 418f3bdbd42SAbhijit Gangurde void ionic_destroy_rdma_admin(struct ionic_ibdev *dev); 419f3bdbd42SAbhijit Gangurde void ionic_kill_rdma_admin(struct ionic_ibdev *dev, bool fatal_path); 420f3bdbd42SAbhijit Gangurde 421f3bdbd42SAbhijit Gangurde /* ionic_controlpath.c */ 422f3bdbd42SAbhijit Gangurde int ionic_create_cq_common(struct ionic_vcq *vcq, 423f3bdbd42SAbhijit Gangurde struct ionic_tbl_buf *buf, 424f3bdbd42SAbhijit Gangurde const struct ib_cq_init_attr *attr, 425f3bdbd42SAbhijit Gangurde struct ionic_ctx *ctx, 426f3bdbd42SAbhijit Gangurde struct ib_udata *udata, 427f3bdbd42SAbhijit Gangurde struct ionic_qdesc *req_cq, 428f3bdbd42SAbhijit Gangurde __u32 *resp_cqid, 429f3bdbd42SAbhijit Gangurde int udma_idx); 430f3bdbd42SAbhijit Gangurde void ionic_destroy_cq_common(struct ionic_ibdev *dev, struct ionic_cq *cq); 431e8521822SAbhijit Gangurde void ionic_flush_qp(struct ionic_ibdev *dev, struct ionic_qp *qp); 432e8521822SAbhijit Gangurde void ionic_notify_flush_cq(struct ionic_cq *cq); 433e8521822SAbhijit Gangurde 434e8521822SAbhijit Gangurde int ionic_alloc_ucontext(struct ib_ucontext *ibctx, struct ib_udata *udata); 435e8521822SAbhijit Gangurde void ionic_dealloc_ucontext(struct ib_ucontext *ibctx); 436e8521822SAbhijit Gangurde int ionic_mmap(struct ib_ucontext *ibctx, struct vm_area_struct *vma); 437e8521822SAbhijit Gangurde void ionic_mmap_free(struct rdma_user_mmap_entry *rdma_entry); 438e8521822SAbhijit Gangurde int ionic_alloc_pd(struct ib_pd *ibpd, struct ib_udata *udata); 439e8521822SAbhijit Gangurde int ionic_dealloc_pd(struct ib_pd *ibpd, struct ib_udata *udata); 440e8521822SAbhijit Gangurde int ionic_create_ah(struct ib_ah *ibah, struct rdma_ah_init_attr *init_attr, 441e8521822SAbhijit Gangurde struct ib_udata *udata); 442e8521822SAbhijit Gangurde int ionic_query_ah(struct ib_ah *ibah, struct rdma_ah_attr *ah_attr); 443e8521822SAbhijit Gangurde int ionic_destroy_ah(struct ib_ah *ibah, u32 flags); 444e8521822SAbhijit Gangurde struct ib_mr *ionic_get_dma_mr(struct ib_pd *ibpd, int access); 445e8521822SAbhijit Gangurde struct ib_mr *ionic_reg_user_mr(struct ib_pd *ibpd, u64 start, u64 length, 446e8521822SAbhijit Gangurde u64 addr, int access, struct ib_dmah *dmah, 447e8521822SAbhijit Gangurde struct ib_udata *udata); 448e8521822SAbhijit Gangurde struct ib_mr *ionic_reg_user_mr_dmabuf(struct ib_pd *ibpd, u64 offset, 449e8521822SAbhijit Gangurde u64 length, u64 addr, int fd, int access, 450e8521822SAbhijit Gangurde struct ib_dmah *dmah, 451e8521822SAbhijit Gangurde struct uverbs_attr_bundle *attrs); 452e8521822SAbhijit Gangurde int ionic_dereg_mr(struct ib_mr *ibmr, struct ib_udata *udata); 453e8521822SAbhijit Gangurde struct ib_mr *ionic_alloc_mr(struct ib_pd *ibpd, enum ib_mr_type type, 454e8521822SAbhijit Gangurde u32 max_sg); 455e8521822SAbhijit Gangurde int ionic_map_mr_sg(struct ib_mr *ibmr, struct scatterlist *sg, int sg_nents, 456e8521822SAbhijit Gangurde unsigned int *sg_offset); 457e8521822SAbhijit Gangurde int ionic_alloc_mw(struct ib_mw *ibmw, struct ib_udata *udata); 458e8521822SAbhijit Gangurde int ionic_dealloc_mw(struct ib_mw *ibmw); 459e8521822SAbhijit Gangurde int ionic_create_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr *attr, 460e8521822SAbhijit Gangurde struct uverbs_attr_bundle *attrs); 461e8521822SAbhijit Gangurde int ionic_destroy_cq(struct ib_cq *ibcq, struct ib_udata *udata); 462e8521822SAbhijit Gangurde int ionic_create_qp(struct ib_qp *ibqp, struct ib_qp_init_attr *attr, 463e8521822SAbhijit Gangurde struct ib_udata *udata); 464e8521822SAbhijit Gangurde int ionic_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr, int mask, 465e8521822SAbhijit Gangurde struct ib_udata *udata); 466e8521822SAbhijit Gangurde int ionic_query_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr, int mask, 467e8521822SAbhijit Gangurde struct ib_qp_init_attr *init_attr); 468e8521822SAbhijit Gangurde int ionic_destroy_qp(struct ib_qp *ibqp, struct ib_udata *udata); 469f3bdbd42SAbhijit Gangurde 470*b83c6205SAbhijit Gangurde /* ionic_datapath.c */ 471*b83c6205SAbhijit Gangurde int ionic_post_send(struct ib_qp *ibqp, const struct ib_send_wr *wr, 472*b83c6205SAbhijit Gangurde const struct ib_send_wr **bad); 473*b83c6205SAbhijit Gangurde int ionic_post_recv(struct ib_qp *ibqp, const struct ib_recv_wr *wr, 474*b83c6205SAbhijit Gangurde const struct ib_recv_wr **bad); 475*b83c6205SAbhijit Gangurde int ionic_poll_cq(struct ib_cq *ibcq, int nwc, struct ib_wc *wc); 476*b83c6205SAbhijit Gangurde int ionic_req_notify_cq(struct ib_cq *ibcq, enum ib_cq_notify_flags flags); 477*b83c6205SAbhijit Gangurde 478f3bdbd42SAbhijit Gangurde /* ionic_pgtbl.c */ 479e8521822SAbhijit Gangurde __le64 ionic_pgtbl_dma(struct ionic_tbl_buf *buf, u64 va); 480*b83c6205SAbhijit Gangurde __be64 ionic_pgtbl_off(struct ionic_tbl_buf *buf, u64 va); 481f3bdbd42SAbhijit Gangurde int ionic_pgtbl_page(struct ionic_tbl_buf *buf, u64 dma); 482f3bdbd42SAbhijit Gangurde int ionic_pgtbl_init(struct ionic_ibdev *dev, 483f3bdbd42SAbhijit Gangurde struct ionic_tbl_buf *buf, 484f3bdbd42SAbhijit Gangurde struct ib_umem *umem, 485f3bdbd42SAbhijit Gangurde dma_addr_t dma, 486f3bdbd42SAbhijit Gangurde int limit, 487f3bdbd42SAbhijit Gangurde u64 page_size); 488f3bdbd42SAbhijit Gangurde void ionic_pgtbl_unbuf(struct ionic_ibdev *dev, struct ionic_tbl_buf *buf); 4898d765af5SAbhijit Gangurde #endif /* _IONIC_IBDEV_H_ */ 490