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