xref: /openbmc/linux/drivers/infiniband/hw/irdma/verbs.h (revision 24419777e9431137d5923a747f546facb1e49b1f)
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