xref: /openbmc/linux/drivers/infiniband/hw/irdma/verbs.h (revision 51cad2872435f79c63b81503d8d1c9f143172489)
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
7b48c24c2SMustafa Ismail 
8b48c24c2SMustafa Ismail #define IRDMA_PKEY_TBL_SZ		1
9b48c24c2SMustafa Ismail #define IRDMA_DEFAULT_PKEY		0xFFFF
10b48c24c2SMustafa Ismail 
11b48c24c2SMustafa Ismail struct irdma_ucontext {
12b48c24c2SMustafa Ismail 	struct ib_ucontext ibucontext;
13b48c24c2SMustafa Ismail 	struct irdma_device *iwdev;
14b48c24c2SMustafa Ismail 	struct rdma_user_mmap_entry *db_mmap_entry;
15b48c24c2SMustafa Ismail 	struct list_head cq_reg_mem_list;
16b48c24c2SMustafa Ismail 	spinlock_t cq_reg_mem_list_lock; /* protect CQ memory list */
17b48c24c2SMustafa Ismail 	struct list_head qp_reg_mem_list;
18b48c24c2SMustafa Ismail 	spinlock_t qp_reg_mem_list_lock; /* protect QP memory list */
19b48c24c2SMustafa Ismail 	int abi_ver;
20b48c24c2SMustafa Ismail 	bool legacy_mode;
21b48c24c2SMustafa Ismail };
22b48c24c2SMustafa Ismail 
23b48c24c2SMustafa Ismail struct irdma_pd {
24b48c24c2SMustafa Ismail 	struct ib_pd ibpd;
25b48c24c2SMustafa Ismail 	struct irdma_sc_pd sc_pd;
26b48c24c2SMustafa Ismail };
27b48c24c2SMustafa Ismail 
28884194efSZhu Yanjun union irdma_sockaddr {
29884194efSZhu Yanjun 	struct sockaddr_in saddr_in;
30884194efSZhu Yanjun 	struct sockaddr_in6 saddr_in6;
31884194efSZhu Yanjun };
32884194efSZhu Yanjun 
33b48c24c2SMustafa Ismail struct irdma_av {
34b48c24c2SMustafa Ismail 	u8 macaddr[16];
35b48c24c2SMustafa Ismail 	struct rdma_ah_attr attrs;
36884194efSZhu Yanjun 	union irdma_sockaddr sgid_addr;
37884194efSZhu Yanjun 	union irdma_sockaddr dgid_addr;
38b48c24c2SMustafa Ismail 	u8 net_type;
39b48c24c2SMustafa Ismail };
40b48c24c2SMustafa Ismail 
41b48c24c2SMustafa Ismail struct irdma_ah {
42b48c24c2SMustafa Ismail 	struct ib_ah ibah;
43b48c24c2SMustafa Ismail 	struct irdma_sc_ah sc_ah;
44b48c24c2SMustafa Ismail 	struct irdma_pd *pd;
45b48c24c2SMustafa Ismail 	struct irdma_av av;
46b48c24c2SMustafa Ismail 	u8 sgid_index;
47b48c24c2SMustafa Ismail 	union ib_gid dgid;
48*51cad287SMustafa Ismail 	struct hlist_node list;
49*51cad287SMustafa Ismail 	refcount_t refcnt;
50*51cad287SMustafa Ismail 	struct irdma_ah *parent_ah; /* AH from cached list */
51b48c24c2SMustafa Ismail };
52b48c24c2SMustafa Ismail 
53b48c24c2SMustafa Ismail struct irdma_hmc_pble {
54b48c24c2SMustafa Ismail 	union {
55b48c24c2SMustafa Ismail 		u32 idx;
56b48c24c2SMustafa Ismail 		dma_addr_t addr;
57b48c24c2SMustafa Ismail 	};
58b48c24c2SMustafa Ismail };
59b48c24c2SMustafa Ismail 
60b48c24c2SMustafa Ismail struct irdma_cq_mr {
61b48c24c2SMustafa Ismail 	struct irdma_hmc_pble cq_pbl;
62b48c24c2SMustafa Ismail 	dma_addr_t shadow;
63b48c24c2SMustafa Ismail 	bool split;
64b48c24c2SMustafa Ismail };
65b48c24c2SMustafa Ismail 
66b48c24c2SMustafa Ismail struct irdma_qp_mr {
67b48c24c2SMustafa Ismail 	struct irdma_hmc_pble sq_pbl;
68b48c24c2SMustafa Ismail 	struct irdma_hmc_pble rq_pbl;
69b48c24c2SMustafa Ismail 	dma_addr_t shadow;
70b48c24c2SMustafa Ismail 	struct page *sq_page;
71b48c24c2SMustafa Ismail };
72b48c24c2SMustafa Ismail 
73b48c24c2SMustafa Ismail struct irdma_cq_buf {
74b48c24c2SMustafa Ismail 	struct irdma_dma_mem kmem_buf;
75b48c24c2SMustafa Ismail 	struct irdma_cq_uk cq_uk;
76b48c24c2SMustafa Ismail 	struct irdma_hw *hw;
77b48c24c2SMustafa Ismail 	struct list_head list;
78b48c24c2SMustafa Ismail 	struct work_struct work;
79b48c24c2SMustafa Ismail };
80b48c24c2SMustafa Ismail 
81b48c24c2SMustafa Ismail struct irdma_pbl {
82b48c24c2SMustafa Ismail 	struct list_head list;
83b48c24c2SMustafa Ismail 	union {
84b48c24c2SMustafa Ismail 		struct irdma_qp_mr qp_mr;
85b48c24c2SMustafa Ismail 		struct irdma_cq_mr cq_mr;
86b48c24c2SMustafa Ismail 	};
87b48c24c2SMustafa Ismail 
88b48c24c2SMustafa Ismail 	bool pbl_allocated:1;
89b48c24c2SMustafa Ismail 	bool on_list:1;
90b48c24c2SMustafa Ismail 	u64 user_base;
91b48c24c2SMustafa Ismail 	struct irdma_pble_alloc pble_alloc;
92b48c24c2SMustafa Ismail 	struct irdma_mr *iwmr;
93b48c24c2SMustafa Ismail };
94b48c24c2SMustafa Ismail 
95b48c24c2SMustafa Ismail struct irdma_mr {
96b48c24c2SMustafa Ismail 	union {
97b48c24c2SMustafa Ismail 		struct ib_mr ibmr;
98b48c24c2SMustafa Ismail 		struct ib_mw ibmw;
99b48c24c2SMustafa Ismail 	};
100b48c24c2SMustafa Ismail 	struct ib_umem *region;
101b48c24c2SMustafa Ismail 	u16 type;
102b48c24c2SMustafa Ismail 	u32 page_cnt;
103b48c24c2SMustafa Ismail 	u64 page_size;
104b48c24c2SMustafa Ismail 	u32 npages;
105b48c24c2SMustafa Ismail 	u32 stag;
106b48c24c2SMustafa Ismail 	u64 len;
107b48c24c2SMustafa Ismail 	u64 pgaddrmem[IRDMA_MAX_SAVED_PHY_PGADDR];
108b48c24c2SMustafa Ismail 	struct irdma_pbl iwpbl;
109b48c24c2SMustafa Ismail };
110b48c24c2SMustafa Ismail 
111b48c24c2SMustafa Ismail struct irdma_cq {
112b48c24c2SMustafa Ismail 	struct ib_cq ibcq;
113b48c24c2SMustafa Ismail 	struct irdma_sc_cq sc_cq;
114b48c24c2SMustafa Ismail 	u16 cq_head;
115b48c24c2SMustafa Ismail 	u16 cq_size;
116b48c24c2SMustafa Ismail 	u16 cq_num;
117b48c24c2SMustafa Ismail 	bool user_mode;
11810467ce0STatyana Nikolova 	bool armed;
11910467ce0STatyana Nikolova 	enum irdma_cmpl_notify last_notify;
120b48c24c2SMustafa Ismail 	u32 polled_cmpls;
121b48c24c2SMustafa Ismail 	u32 cq_mem_size;
122b48c24c2SMustafa Ismail 	struct irdma_dma_mem kmem;
123b48c24c2SMustafa Ismail 	struct irdma_dma_mem kmem_shadow;
124b48c24c2SMustafa Ismail 	spinlock_t lock; /* for poll cq */
125b48c24c2SMustafa Ismail 	struct irdma_pbl *iwpbl;
126b48c24c2SMustafa Ismail 	struct irdma_pbl *iwpbl_shadow;
127b48c24c2SMustafa Ismail 	struct list_head resize_list;
128b48c24c2SMustafa Ismail 	struct irdma_cq_poll_info cur_cqe;
129b48c24c2SMustafa Ismail };
130b48c24c2SMustafa Ismail 
131b48c24c2SMustafa Ismail struct disconn_work {
132b48c24c2SMustafa Ismail 	struct work_struct work;
133b48c24c2SMustafa Ismail 	struct irdma_qp *iwqp;
134b48c24c2SMustafa Ismail };
135b48c24c2SMustafa Ismail 
136b48c24c2SMustafa Ismail struct iw_cm_id;
137b48c24c2SMustafa Ismail 
138b48c24c2SMustafa Ismail struct irdma_qp_kmode {
139b48c24c2SMustafa Ismail 	struct irdma_dma_mem dma_mem;
140b48c24c2SMustafa Ismail 	struct irdma_sq_uk_wr_trk_info *sq_wrid_mem;
141b48c24c2SMustafa Ismail 	u64 *rq_wrid_mem;
142b48c24c2SMustafa Ismail };
143b48c24c2SMustafa Ismail 
144b48c24c2SMustafa Ismail struct irdma_qp {
145b48c24c2SMustafa Ismail 	struct ib_qp ibqp;
146b48c24c2SMustafa Ismail 	struct irdma_sc_qp sc_qp;
147b48c24c2SMustafa Ismail 	struct irdma_device *iwdev;
148b48c24c2SMustafa Ismail 	struct irdma_cq *iwscq;
149b48c24c2SMustafa Ismail 	struct irdma_cq *iwrcq;
150b48c24c2SMustafa Ismail 	struct irdma_pd *iwpd;
151b48c24c2SMustafa Ismail 	struct rdma_user_mmap_entry *push_wqe_mmap_entry;
152b48c24c2SMustafa Ismail 	struct rdma_user_mmap_entry *push_db_mmap_entry;
153b48c24c2SMustafa Ismail 	struct irdma_qp_host_ctx_info ctx_info;
154b48c24c2SMustafa Ismail 	union {
155b48c24c2SMustafa Ismail 		struct irdma_iwarp_offload_info iwarp_info;
156b48c24c2SMustafa Ismail 		struct irdma_roce_offload_info roce_info;
157b48c24c2SMustafa Ismail 	};
158b48c24c2SMustafa Ismail 
159b48c24c2SMustafa Ismail 	union {
160b48c24c2SMustafa Ismail 		struct irdma_tcp_offload_info tcp_info;
161b48c24c2SMustafa Ismail 		struct irdma_udp_offload_info udp_info;
162b48c24c2SMustafa Ismail 	};
163b48c24c2SMustafa Ismail 
164b48c24c2SMustafa Ismail 	struct irdma_ah roce_ah;
165b48c24c2SMustafa Ismail 	struct list_head teardown_entry;
166b48c24c2SMustafa Ismail 	refcount_t refcnt;
167b48c24c2SMustafa Ismail 	struct iw_cm_id *cm_id;
168b48c24c2SMustafa Ismail 	struct irdma_cm_node *cm_node;
169b48c24c2SMustafa Ismail 	struct ib_mr *lsmm_mr;
170b48c24c2SMustafa Ismail 	atomic_t hw_mod_qp_pend;
171b48c24c2SMustafa Ismail 	enum ib_qp_state ibqp_state;
172b48c24c2SMustafa Ismail 	u32 qp_mem_size;
173b48c24c2SMustafa Ismail 	u32 last_aeq;
174b48c24c2SMustafa Ismail 	int max_send_wr;
175b48c24c2SMustafa Ismail 	int max_recv_wr;
176b48c24c2SMustafa Ismail 	atomic_t close_timer_started;
177b48c24c2SMustafa Ismail 	spinlock_t lock; /* serialize posting WRs to SQ/RQ */
178b48c24c2SMustafa Ismail 	struct irdma_qp_context *iwqp_context;
179b48c24c2SMustafa Ismail 	void *pbl_vbase;
180b48c24c2SMustafa Ismail 	dma_addr_t pbl_pbase;
181b48c24c2SMustafa Ismail 	struct page *page;
182b48c24c2SMustafa Ismail 	u8 active_conn : 1;
183b48c24c2SMustafa Ismail 	u8 user_mode : 1;
184b48c24c2SMustafa Ismail 	u8 hte_added : 1;
185b48c24c2SMustafa Ismail 	u8 flush_issued : 1;
186b48c24c2SMustafa Ismail 	u8 sig_all : 1;
187b48c24c2SMustafa Ismail 	u8 pau_mode : 1;
188b48c24c2SMustafa Ismail 	u8 rsvd : 1;
189b48c24c2SMustafa Ismail 	u8 iwarp_state;
190b48c24c2SMustafa Ismail 	u16 term_sq_flush_code;
191b48c24c2SMustafa Ismail 	u16 term_rq_flush_code;
192b48c24c2SMustafa Ismail 	u8 hw_iwarp_state;
193b48c24c2SMustafa Ismail 	u8 hw_tcp_state;
194b48c24c2SMustafa Ismail 	struct irdma_qp_kmode kqp;
195b48c24c2SMustafa Ismail 	struct irdma_dma_mem host_ctx;
196b48c24c2SMustafa Ismail 	struct timer_list terminate_timer;
197b48c24c2SMustafa Ismail 	struct irdma_pbl *iwpbl;
198b48c24c2SMustafa Ismail 	struct irdma_dma_mem q2_ctx_mem;
199b48c24c2SMustafa Ismail 	struct irdma_dma_mem ietf_mem;
200b48c24c2SMustafa Ismail 	struct completion free_qp;
201b48c24c2SMustafa Ismail 	wait_queue_head_t waitq;
202b48c24c2SMustafa Ismail 	wait_queue_head_t mod_qp_waitq;
203b48c24c2SMustafa Ismail 	u8 rts_ae_rcvd;
204b48c24c2SMustafa Ismail };
205b48c24c2SMustafa Ismail 
206b48c24c2SMustafa Ismail enum irdma_mmap_flag {
207b48c24c2SMustafa Ismail 	IRDMA_MMAP_IO_NC,
208b48c24c2SMustafa Ismail 	IRDMA_MMAP_IO_WC,
209b48c24c2SMustafa Ismail };
210b48c24c2SMustafa Ismail 
211b48c24c2SMustafa Ismail struct irdma_user_mmap_entry {
212b48c24c2SMustafa Ismail 	struct rdma_user_mmap_entry rdma_entry;
213b48c24c2SMustafa Ismail 	u64 bar_offset;
214b48c24c2SMustafa Ismail 	u8 mmap_flag;
215b48c24c2SMustafa Ismail };
216b48c24c2SMustafa Ismail 
217b48c24c2SMustafa Ismail static inline u16 irdma_fw_major_ver(struct irdma_sc_dev *dev)
218b48c24c2SMustafa Ismail {
219b48c24c2SMustafa Ismail 	return (u16)FIELD_GET(IRDMA_FW_VER_MAJOR, dev->feature_info[IRDMA_FEATURE_FW_INFO]);
220b48c24c2SMustafa Ismail }
221b48c24c2SMustafa Ismail 
222b48c24c2SMustafa Ismail static inline u16 irdma_fw_minor_ver(struct irdma_sc_dev *dev)
223b48c24c2SMustafa Ismail {
224b48c24c2SMustafa Ismail 	return (u16)FIELD_GET(IRDMA_FW_VER_MINOR, dev->feature_info[IRDMA_FEATURE_FW_INFO]);
225b48c24c2SMustafa Ismail }
226b48c24c2SMustafa Ismail 
227b48c24c2SMustafa Ismail void irdma_mcast_mac(u32 *ip_addr, u8 *mac, bool ipv4);
228b48c24c2SMustafa Ismail int irdma_ib_register_device(struct irdma_device *iwdev);
229b48c24c2SMustafa Ismail void irdma_ib_unregister_device(struct irdma_device *iwdev);
230b48c24c2SMustafa Ismail void irdma_ib_dealloc_device(struct ib_device *ibdev);
231b48c24c2SMustafa Ismail void irdma_ib_qp_event(struct irdma_qp *iwqp, enum irdma_qp_event_type event);
232b48c24c2SMustafa Ismail #endif /* IRDMA_VERBS_H */
233