1b48c24c2SMustafa Ismail /* SPDX-License-Identifier: GPL-2.0 or Linux-OpenIB */ 2b48c24c2SMustafa Ismail /* Copyright (c) 2015 - 2021 Intel Corporation */ 3b48c24c2SMustafa Ismail #ifndef IRDMA_VERBS_H 4b48c24c2SMustafa Ismail #define IRDMA_VERBS_H 5b48c24c2SMustafa Ismail 6b48c24c2SMustafa Ismail #define IRDMA_MAX_SAVED_PHY_PGADDR 4 781091d76SMustafa Ismail #define IRDMA_FLUSH_DELAY_MS 20 8b48c24c2SMustafa Ismail 9b48c24c2SMustafa Ismail #define IRDMA_PKEY_TBL_SZ 1 10b48c24c2SMustafa Ismail #define IRDMA_DEFAULT_PKEY 0xFFFF 11b48c24c2SMustafa Ismail 12b48c24c2SMustafa Ismail struct irdma_ucontext { 13b48c24c2SMustafa Ismail struct ib_ucontext ibucontext; 14b48c24c2SMustafa Ismail struct irdma_device *iwdev; 15b48c24c2SMustafa Ismail struct rdma_user_mmap_entry *db_mmap_entry; 16b48c24c2SMustafa Ismail struct list_head cq_reg_mem_list; 17b48c24c2SMustafa Ismail spinlock_t cq_reg_mem_list_lock; /* protect CQ memory list */ 18b48c24c2SMustafa Ismail struct list_head qp_reg_mem_list; 19b48c24c2SMustafa Ismail spinlock_t qp_reg_mem_list_lock; /* protect QP memory list */ 20b48c24c2SMustafa Ismail int abi_ver; 21b48c24c2SMustafa Ismail bool legacy_mode; 22b48c24c2SMustafa Ismail }; 23b48c24c2SMustafa Ismail 24b48c24c2SMustafa Ismail struct irdma_pd { 25b48c24c2SMustafa Ismail struct ib_pd ibpd; 26b48c24c2SMustafa Ismail struct irdma_sc_pd sc_pd; 27b48c24c2SMustafa Ismail }; 28b48c24c2SMustafa Ismail 29884194efSZhu Yanjun union irdma_sockaddr { 30884194efSZhu Yanjun struct sockaddr_in saddr_in; 31884194efSZhu Yanjun struct sockaddr_in6 saddr_in6; 32884194efSZhu Yanjun }; 33884194efSZhu Yanjun 34b48c24c2SMustafa Ismail struct irdma_av { 35b48c24c2SMustafa Ismail u8 macaddr[16]; 36b48c24c2SMustafa Ismail struct rdma_ah_attr attrs; 37884194efSZhu Yanjun union irdma_sockaddr sgid_addr; 38884194efSZhu Yanjun union irdma_sockaddr dgid_addr; 39b48c24c2SMustafa Ismail u8 net_type; 40b48c24c2SMustafa Ismail }; 41b48c24c2SMustafa Ismail 42b48c24c2SMustafa Ismail struct irdma_ah { 43b48c24c2SMustafa Ismail struct ib_ah ibah; 44b48c24c2SMustafa Ismail struct irdma_sc_ah sc_ah; 45b48c24c2SMustafa Ismail struct irdma_pd *pd; 46b48c24c2SMustafa Ismail struct irdma_av av; 47b48c24c2SMustafa Ismail u8 sgid_index; 48b48c24c2SMustafa Ismail union ib_gid dgid; 4951cad287SMustafa Ismail struct hlist_node list; 5051cad287SMustafa Ismail refcount_t refcnt; 5151cad287SMustafa Ismail struct irdma_ah *parent_ah; /* AH from cached list */ 52b48c24c2SMustafa Ismail }; 53b48c24c2SMustafa Ismail 54b48c24c2SMustafa Ismail struct irdma_hmc_pble { 55b48c24c2SMustafa Ismail union { 56b48c24c2SMustafa Ismail u32 idx; 57b48c24c2SMustafa Ismail dma_addr_t addr; 58b48c24c2SMustafa Ismail }; 59b48c24c2SMustafa Ismail }; 60b48c24c2SMustafa Ismail 61b48c24c2SMustafa Ismail struct irdma_cq_mr { 62b48c24c2SMustafa Ismail struct irdma_hmc_pble cq_pbl; 63b48c24c2SMustafa Ismail dma_addr_t shadow; 64b48c24c2SMustafa Ismail bool split; 65b48c24c2SMustafa Ismail }; 66b48c24c2SMustafa Ismail 67b48c24c2SMustafa Ismail struct irdma_qp_mr { 68b48c24c2SMustafa Ismail struct irdma_hmc_pble sq_pbl; 69b48c24c2SMustafa Ismail struct irdma_hmc_pble rq_pbl; 70b48c24c2SMustafa Ismail dma_addr_t shadow; 71b48c24c2SMustafa Ismail struct page *sq_page; 72b48c24c2SMustafa Ismail }; 73b48c24c2SMustafa Ismail 74b48c24c2SMustafa Ismail struct irdma_cq_buf { 75b48c24c2SMustafa Ismail struct irdma_dma_mem kmem_buf; 76b48c24c2SMustafa Ismail struct irdma_cq_uk cq_uk; 77b48c24c2SMustafa Ismail struct irdma_hw *hw; 78b48c24c2SMustafa Ismail struct list_head list; 79b48c24c2SMustafa Ismail struct work_struct work; 80b48c24c2SMustafa Ismail }; 81b48c24c2SMustafa Ismail 82b48c24c2SMustafa Ismail struct irdma_pbl { 83b48c24c2SMustafa Ismail struct list_head list; 84b48c24c2SMustafa Ismail union { 85b48c24c2SMustafa Ismail struct irdma_qp_mr qp_mr; 86b48c24c2SMustafa Ismail struct irdma_cq_mr cq_mr; 87b48c24c2SMustafa Ismail }; 88b48c24c2SMustafa Ismail 89b48c24c2SMustafa Ismail bool pbl_allocated:1; 90b48c24c2SMustafa Ismail bool on_list:1; 91b48c24c2SMustafa Ismail u64 user_base; 92b48c24c2SMustafa Ismail struct irdma_pble_alloc pble_alloc; 93b48c24c2SMustafa Ismail struct irdma_mr *iwmr; 94b48c24c2SMustafa Ismail }; 95b48c24c2SMustafa Ismail 96b48c24c2SMustafa Ismail struct irdma_mr { 97b48c24c2SMustafa Ismail union { 98b48c24c2SMustafa Ismail struct ib_mr ibmr; 99b48c24c2SMustafa Ismail struct ib_mw ibmw; 100b48c24c2SMustafa Ismail }; 101b48c24c2SMustafa Ismail struct ib_umem *region; 102b48c24c2SMustafa Ismail u16 type; 103b48c24c2SMustafa Ismail u32 page_cnt; 104b48c24c2SMustafa Ismail u64 page_size; 105b48c24c2SMustafa Ismail u32 npages; 106b48c24c2SMustafa Ismail u32 stag; 107b48c24c2SMustafa Ismail u64 len; 108b48c24c2SMustafa Ismail u64 pgaddrmem[IRDMA_MAX_SAVED_PHY_PGADDR]; 109b48c24c2SMustafa Ismail struct irdma_pbl iwpbl; 110b48c24c2SMustafa Ismail }; 111b48c24c2SMustafa Ismail 112b48c24c2SMustafa Ismail struct irdma_cq { 113b48c24c2SMustafa Ismail struct ib_cq ibcq; 114b48c24c2SMustafa Ismail struct irdma_sc_cq sc_cq; 115b48c24c2SMustafa Ismail u16 cq_head; 116b48c24c2SMustafa Ismail u16 cq_size; 117b48c24c2SMustafa Ismail u16 cq_num; 118b48c24c2SMustafa Ismail bool user_mode; 11981091d76SMustafa Ismail atomic_t armed; 12010467ce0STatyana Nikolova enum irdma_cmpl_notify last_notify; 121b48c24c2SMustafa Ismail u32 polled_cmpls; 122b48c24c2SMustafa Ismail u32 cq_mem_size; 123b48c24c2SMustafa Ismail struct irdma_dma_mem kmem; 124b48c24c2SMustafa Ismail struct irdma_dma_mem kmem_shadow; 125b48c24c2SMustafa Ismail spinlock_t lock; /* for poll cq */ 126b48c24c2SMustafa Ismail struct irdma_pbl *iwpbl; 127b48c24c2SMustafa Ismail struct irdma_pbl *iwpbl_shadow; 128b48c24c2SMustafa Ismail struct list_head resize_list; 129b48c24c2SMustafa Ismail struct irdma_cq_poll_info cur_cqe; 13081091d76SMustafa Ismail struct list_head cmpl_generated; 13181091d76SMustafa Ismail }; 13281091d76SMustafa Ismail 13381091d76SMustafa Ismail struct irdma_cmpl_gen { 13481091d76SMustafa Ismail struct list_head list; 13581091d76SMustafa Ismail struct irdma_cq_poll_info cpi; 136b48c24c2SMustafa Ismail }; 137b48c24c2SMustafa Ismail 138b48c24c2SMustafa Ismail struct disconn_work { 139b48c24c2SMustafa Ismail struct work_struct work; 140b48c24c2SMustafa Ismail struct irdma_qp *iwqp; 141b48c24c2SMustafa Ismail }; 142b48c24c2SMustafa Ismail 143b48c24c2SMustafa Ismail struct iw_cm_id; 144b48c24c2SMustafa Ismail 145b48c24c2SMustafa Ismail struct irdma_qp_kmode { 146b48c24c2SMustafa Ismail struct irdma_dma_mem dma_mem; 147b48c24c2SMustafa Ismail struct irdma_sq_uk_wr_trk_info *sq_wrid_mem; 148b48c24c2SMustafa Ismail u64 *rq_wrid_mem; 149b48c24c2SMustafa Ismail }; 150b48c24c2SMustafa Ismail 151b48c24c2SMustafa Ismail struct irdma_qp { 152b48c24c2SMustafa Ismail struct ib_qp ibqp; 153b48c24c2SMustafa Ismail struct irdma_sc_qp sc_qp; 154b48c24c2SMustafa Ismail struct irdma_device *iwdev; 155b48c24c2SMustafa Ismail struct irdma_cq *iwscq; 156b48c24c2SMustafa Ismail struct irdma_cq *iwrcq; 157b48c24c2SMustafa Ismail struct irdma_pd *iwpd; 158b48c24c2SMustafa Ismail struct rdma_user_mmap_entry *push_wqe_mmap_entry; 159b48c24c2SMustafa Ismail struct rdma_user_mmap_entry *push_db_mmap_entry; 160b48c24c2SMustafa Ismail struct irdma_qp_host_ctx_info ctx_info; 161b48c24c2SMustafa Ismail union { 162b48c24c2SMustafa Ismail struct irdma_iwarp_offload_info iwarp_info; 163b48c24c2SMustafa Ismail struct irdma_roce_offload_info roce_info; 164b48c24c2SMustafa Ismail }; 165b48c24c2SMustafa Ismail 166b48c24c2SMustafa Ismail union { 167b48c24c2SMustafa Ismail struct irdma_tcp_offload_info tcp_info; 168b48c24c2SMustafa Ismail struct irdma_udp_offload_info udp_info; 169b48c24c2SMustafa Ismail }; 170b48c24c2SMustafa Ismail 171b48c24c2SMustafa Ismail struct irdma_ah roce_ah; 172b48c24c2SMustafa Ismail struct list_head teardown_entry; 173b48c24c2SMustafa Ismail refcount_t refcnt; 174b48c24c2SMustafa Ismail struct iw_cm_id *cm_id; 175b48c24c2SMustafa Ismail struct irdma_cm_node *cm_node; 17681091d76SMustafa Ismail struct delayed_work dwork_flush; 177b48c24c2SMustafa Ismail struct ib_mr *lsmm_mr; 178b48c24c2SMustafa Ismail atomic_t hw_mod_qp_pend; 179b48c24c2SMustafa Ismail enum ib_qp_state ibqp_state; 180b48c24c2SMustafa Ismail u32 qp_mem_size; 181b48c24c2SMustafa Ismail u32 last_aeq; 182b48c24c2SMustafa Ismail int max_send_wr; 183b48c24c2SMustafa Ismail int max_recv_wr; 184b48c24c2SMustafa Ismail atomic_t close_timer_started; 185b48c24c2SMustafa Ismail spinlock_t lock; /* serialize posting WRs to SQ/RQ */ 186b48c24c2SMustafa Ismail struct irdma_qp_context *iwqp_context; 187b48c24c2SMustafa Ismail void *pbl_vbase; 188b48c24c2SMustafa Ismail dma_addr_t pbl_pbase; 189b48c24c2SMustafa Ismail struct page *page; 190b48c24c2SMustafa Ismail u8 active_conn : 1; 191b48c24c2SMustafa Ismail u8 user_mode : 1; 192b48c24c2SMustafa Ismail u8 hte_added : 1; 193b48c24c2SMustafa Ismail u8 flush_issued : 1; 194b48c24c2SMustafa Ismail u8 sig_all : 1; 195b48c24c2SMustafa Ismail u8 pau_mode : 1; 196b48c24c2SMustafa Ismail u8 rsvd : 1; 197b48c24c2SMustafa Ismail u8 iwarp_state; 198b48c24c2SMustafa Ismail u16 term_sq_flush_code; 199b48c24c2SMustafa Ismail u16 term_rq_flush_code; 200b48c24c2SMustafa Ismail u8 hw_iwarp_state; 201b48c24c2SMustafa Ismail u8 hw_tcp_state; 202b48c24c2SMustafa Ismail struct irdma_qp_kmode kqp; 203b48c24c2SMustafa Ismail struct irdma_dma_mem host_ctx; 204b48c24c2SMustafa Ismail struct timer_list terminate_timer; 205b48c24c2SMustafa Ismail struct irdma_pbl *iwpbl; 206b48c24c2SMustafa Ismail struct irdma_dma_mem q2_ctx_mem; 207b48c24c2SMustafa Ismail struct irdma_dma_mem ietf_mem; 208b48c24c2SMustafa Ismail struct completion free_qp; 209b48c24c2SMustafa Ismail wait_queue_head_t waitq; 210b48c24c2SMustafa Ismail wait_queue_head_t mod_qp_waitq; 211b48c24c2SMustafa Ismail u8 rts_ae_rcvd; 212b48c24c2SMustafa Ismail }; 213b48c24c2SMustafa Ismail 214b48c24c2SMustafa Ismail enum irdma_mmap_flag { 215b48c24c2SMustafa Ismail IRDMA_MMAP_IO_NC, 216b48c24c2SMustafa Ismail IRDMA_MMAP_IO_WC, 217b48c24c2SMustafa Ismail }; 218b48c24c2SMustafa Ismail 219b48c24c2SMustafa Ismail struct irdma_user_mmap_entry { 220b48c24c2SMustafa Ismail struct rdma_user_mmap_entry rdma_entry; 221b48c24c2SMustafa Ismail u64 bar_offset; 222b48c24c2SMustafa Ismail u8 mmap_flag; 223b48c24c2SMustafa Ismail }; 224b48c24c2SMustafa Ismail 225b48c24c2SMustafa Ismail static inline u16 irdma_fw_major_ver(struct irdma_sc_dev *dev) 226b48c24c2SMustafa Ismail { 227b48c24c2SMustafa Ismail return (u16)FIELD_GET(IRDMA_FW_VER_MAJOR, dev->feature_info[IRDMA_FEATURE_FW_INFO]); 228b48c24c2SMustafa Ismail } 229b48c24c2SMustafa Ismail 230b48c24c2SMustafa Ismail static inline u16 irdma_fw_minor_ver(struct irdma_sc_dev *dev) 231b48c24c2SMustafa Ismail { 232b48c24c2SMustafa Ismail return (u16)FIELD_GET(IRDMA_FW_VER_MINOR, dev->feature_info[IRDMA_FEATURE_FW_INFO]); 233b48c24c2SMustafa Ismail } 234b48c24c2SMustafa Ismail 235*24419777SMustafa Ismail static inline void set_ib_wc_op_sq(struct irdma_cq_poll_info *cq_poll_info, 236*24419777SMustafa Ismail struct ib_wc *entry) 237*24419777SMustafa Ismail { 238*24419777SMustafa Ismail switch (cq_poll_info->op_type) { 239*24419777SMustafa Ismail case IRDMA_OP_TYPE_RDMA_WRITE: 240*24419777SMustafa Ismail case IRDMA_OP_TYPE_RDMA_WRITE_SOL: 241*24419777SMustafa Ismail entry->opcode = IB_WC_RDMA_WRITE; 242*24419777SMustafa Ismail break; 243*24419777SMustafa Ismail case IRDMA_OP_TYPE_RDMA_READ_INV_STAG: 244*24419777SMustafa Ismail case IRDMA_OP_TYPE_RDMA_READ: 245*24419777SMustafa Ismail entry->opcode = IB_WC_RDMA_READ; 246*24419777SMustafa Ismail break; 247*24419777SMustafa Ismail case IRDMA_OP_TYPE_SEND_SOL: 248*24419777SMustafa Ismail case IRDMA_OP_TYPE_SEND_SOL_INV: 249*24419777SMustafa Ismail case IRDMA_OP_TYPE_SEND_INV: 250*24419777SMustafa Ismail case IRDMA_OP_TYPE_SEND: 251*24419777SMustafa Ismail entry->opcode = IB_WC_SEND; 252*24419777SMustafa Ismail break; 253*24419777SMustafa Ismail case IRDMA_OP_TYPE_FAST_REG_NSMR: 254*24419777SMustafa Ismail entry->opcode = IB_WC_REG_MR; 255*24419777SMustafa Ismail break; 256*24419777SMustafa Ismail case IRDMA_OP_TYPE_INV_STAG: 257*24419777SMustafa Ismail entry->opcode = IB_WC_LOCAL_INV; 258*24419777SMustafa Ismail break; 259*24419777SMustafa Ismail default: 260*24419777SMustafa Ismail entry->status = IB_WC_GENERAL_ERR; 261*24419777SMustafa Ismail } 262*24419777SMustafa Ismail } 263*24419777SMustafa Ismail 264*24419777SMustafa Ismail static inline void set_ib_wc_op_rq(struct irdma_cq_poll_info *cq_poll_info, 265*24419777SMustafa Ismail struct ib_wc *entry, bool send_imm_support) 266*24419777SMustafa Ismail { 267*24419777SMustafa Ismail /** 268*24419777SMustafa Ismail * iWARP does not support sendImm, so the presence of Imm data 269*24419777SMustafa Ismail * must be WriteImm. 270*24419777SMustafa Ismail */ 271*24419777SMustafa Ismail if (!send_imm_support) { 272*24419777SMustafa Ismail entry->opcode = cq_poll_info->imm_valid ? 273*24419777SMustafa Ismail IB_WC_RECV_RDMA_WITH_IMM : 274*24419777SMustafa Ismail IB_WC_RECV; 275*24419777SMustafa Ismail return; 276*24419777SMustafa Ismail } 277*24419777SMustafa Ismail 278*24419777SMustafa Ismail switch (cq_poll_info->op_type) { 279*24419777SMustafa Ismail case IB_OPCODE_RDMA_WRITE_ONLY_WITH_IMMEDIATE: 280*24419777SMustafa Ismail case IB_OPCODE_RDMA_WRITE_LAST_WITH_IMMEDIATE: 281*24419777SMustafa Ismail entry->opcode = IB_WC_RECV_RDMA_WITH_IMM; 282*24419777SMustafa Ismail break; 283*24419777SMustafa Ismail default: 284*24419777SMustafa Ismail entry->opcode = IB_WC_RECV; 285*24419777SMustafa Ismail } 286*24419777SMustafa Ismail } 287*24419777SMustafa Ismail 288b48c24c2SMustafa Ismail void irdma_mcast_mac(u32 *ip_addr, u8 *mac, bool ipv4); 289b48c24c2SMustafa Ismail int irdma_ib_register_device(struct irdma_device *iwdev); 290b48c24c2SMustafa Ismail void irdma_ib_unregister_device(struct irdma_device *iwdev); 291b48c24c2SMustafa Ismail void irdma_ib_dealloc_device(struct ib_device *ibdev); 292b48c24c2SMustafa Ismail void irdma_ib_qp_event(struct irdma_qp *iwqp, enum irdma_qp_event_type event); 29381091d76SMustafa Ismail void irdma_generate_flush_completions(struct irdma_qp *iwqp); 29481091d76SMustafa Ismail void irdma_remove_cmpls_list(struct irdma_cq *iwcq); 29581091d76SMustafa Ismail int irdma_generated_cmpls(struct irdma_cq *iwcq, struct irdma_cq_poll_info *cq_poll_info); 296b48c24c2SMustafa Ismail #endif /* IRDMA_VERBS_H */ 297