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