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