xref: /freebsd/contrib/ofed/libmlx5/mlx5.h (revision 87181516ef48be852d5e5fee53c6e0dbfc62f21e)
1*d6b92ffaSHans Petter Selasky /*
2*d6b92ffaSHans Petter Selasky  * Copyright (c) 2012 Mellanox Technologies, Inc.  All rights reserved.
3*d6b92ffaSHans Petter Selasky  *
4*d6b92ffaSHans Petter Selasky  * This software is available to you under a choice of one of two
5*d6b92ffaSHans Petter Selasky  * licenses.  You may choose to be licensed under the terms of the GNU
6*d6b92ffaSHans Petter Selasky  * General Public License (GPL) Version 2, available from the file
7*d6b92ffaSHans Petter Selasky  * COPYING in the main directory of this source tree, or the
8*d6b92ffaSHans Petter Selasky  * OpenIB.org BSD license below:
9*d6b92ffaSHans Petter Selasky  *
10*d6b92ffaSHans Petter Selasky  *     Redistribution and use in source and binary forms, with or
11*d6b92ffaSHans Petter Selasky  *     without modification, are permitted provided that the following
12*d6b92ffaSHans Petter Selasky  *     conditions are met:
13*d6b92ffaSHans Petter Selasky  *
14*d6b92ffaSHans Petter Selasky  *      - Redistributions of source code must retain the above
15*d6b92ffaSHans Petter Selasky  *        copyright notice, this list of conditions and the following
16*d6b92ffaSHans Petter Selasky  *        disclaimer.
17*d6b92ffaSHans Petter Selasky  *
18*d6b92ffaSHans Petter Selasky  *      - Redistributions in binary form must reproduce the above
19*d6b92ffaSHans Petter Selasky  *        copyright notice, this list of conditions and the following
20*d6b92ffaSHans Petter Selasky  *        disclaimer in the documentation and/or other materials
21*d6b92ffaSHans Petter Selasky  *        provided with the distribution.
22*d6b92ffaSHans Petter Selasky  *
23*d6b92ffaSHans Petter Selasky  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
24*d6b92ffaSHans Petter Selasky  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
25*d6b92ffaSHans Petter Selasky  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
26*d6b92ffaSHans Petter Selasky  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
27*d6b92ffaSHans Petter Selasky  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
28*d6b92ffaSHans Petter Selasky  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
29*d6b92ffaSHans Petter Selasky  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
30*d6b92ffaSHans Petter Selasky  * SOFTWARE.
31*d6b92ffaSHans Petter Selasky  */
32*d6b92ffaSHans Petter Selasky 
33*d6b92ffaSHans Petter Selasky #ifndef MLX5_H
34*d6b92ffaSHans Petter Selasky #define MLX5_H
35*d6b92ffaSHans Petter Selasky 
36*d6b92ffaSHans Petter Selasky #include <stddef.h>
37*d6b92ffaSHans Petter Selasky #include <stdio.h>
38*d6b92ffaSHans Petter Selasky #include <stdatomic.h>
39*d6b92ffaSHans Petter Selasky #include <stdbool.h>
40*d6b92ffaSHans Petter Selasky 
41*d6b92ffaSHans Petter Selasky #include <sys/queue.h>
42*d6b92ffaSHans Petter Selasky 
43*d6b92ffaSHans Petter Selasky #include <infiniband/driver.h>
44*d6b92ffaSHans Petter Selasky #include <infiniband/udma_barrier.h>
45*d6b92ffaSHans Petter Selasky #include "mlx5-abi.h"
46*d6b92ffaSHans Petter Selasky #include "bitmap.h"
47*d6b92ffaSHans Petter Selasky #include "mlx5dv.h"
48*d6b92ffaSHans Petter Selasky 
49*d6b92ffaSHans Petter Selasky #define PFX		"mlx5: "
50*d6b92ffaSHans Petter Selasky 
51*d6b92ffaSHans Petter Selasky 
52*d6b92ffaSHans Petter Selasky enum {
53*d6b92ffaSHans Petter Selasky 	MLX5_IB_MMAP_CMD_SHIFT	= 8,
54*d6b92ffaSHans Petter Selasky 	MLX5_IB_MMAP_CMD_MASK	= 0xff,
55*d6b92ffaSHans Petter Selasky };
56*d6b92ffaSHans Petter Selasky 
57*d6b92ffaSHans Petter Selasky enum {
58*d6b92ffaSHans Petter Selasky 	MLX5_MMAP_GET_REGULAR_PAGES_CMD    = 0,
59*d6b92ffaSHans Petter Selasky 	MLX5_MMAP_GET_CONTIGUOUS_PAGES_CMD = 1,
60*d6b92ffaSHans Petter Selasky 	MLX5_MMAP_GET_CORE_CLOCK_CMD    = 5
61*d6b92ffaSHans Petter Selasky };
62*d6b92ffaSHans Petter Selasky 
63*d6b92ffaSHans Petter Selasky enum {
64*d6b92ffaSHans Petter Selasky 	MLX5_CQE_VERSION_V0	= 0,
65*d6b92ffaSHans Petter Selasky 	MLX5_CQE_VERSION_V1	= 1,
66*d6b92ffaSHans Petter Selasky };
67*d6b92ffaSHans Petter Selasky 
68*d6b92ffaSHans Petter Selasky enum {
69*d6b92ffaSHans Petter Selasky 	MLX5_ADAPTER_PAGE_SIZE		= 4096,
70*d6b92ffaSHans Petter Selasky };
71*d6b92ffaSHans Petter Selasky 
72*d6b92ffaSHans Petter Selasky #define MLX5_CQ_PREFIX "MLX_CQ"
73*d6b92ffaSHans Petter Selasky #define MLX5_QP_PREFIX "MLX_QP"
74*d6b92ffaSHans Petter Selasky #define MLX5_MR_PREFIX "MLX_MR"
75*d6b92ffaSHans Petter Selasky #define MLX5_RWQ_PREFIX "MLX_RWQ"
76*d6b92ffaSHans Petter Selasky #define MLX5_MAX_LOG2_CONTIG_BLOCK_SIZE 23
77*d6b92ffaSHans Petter Selasky #define MLX5_MIN_LOG2_CONTIG_BLOCK_SIZE 12
78*d6b92ffaSHans Petter Selasky 
79*d6b92ffaSHans Petter Selasky enum {
80*d6b92ffaSHans Petter Selasky 	MLX5_DBG_QP		= 1 << 0,
81*d6b92ffaSHans Petter Selasky 	MLX5_DBG_CQ		= 1 << 1,
82*d6b92ffaSHans Petter Selasky 	MLX5_DBG_QP_SEND	= 1 << 2,
83*d6b92ffaSHans Petter Selasky 	MLX5_DBG_QP_SEND_ERR	= 1 << 3,
84*d6b92ffaSHans Petter Selasky 	MLX5_DBG_CQ_CQE		= 1 << 4,
85*d6b92ffaSHans Petter Selasky 	MLX5_DBG_CONTIG		= 1 << 5,
86*d6b92ffaSHans Petter Selasky };
87*d6b92ffaSHans Petter Selasky 
88*d6b92ffaSHans Petter Selasky extern uint32_t mlx5_debug_mask;
89*d6b92ffaSHans Petter Selasky extern int mlx5_freeze_on_error_cqe;
90*d6b92ffaSHans Petter Selasky 
91*d6b92ffaSHans Petter Selasky #ifdef MLX5_DEBUG
92*d6b92ffaSHans Petter Selasky #define mlx5_dbg(fp, mask, format, arg...)				\
93*d6b92ffaSHans Petter Selasky do {									\
94*d6b92ffaSHans Petter Selasky 	if (mask & mlx5_debug_mask)					\
95*d6b92ffaSHans Petter Selasky 		fprintf(fp, "%s:%d: " format, __func__, __LINE__, ##arg);	\
96*d6b92ffaSHans Petter Selasky } while (0)
97*d6b92ffaSHans Petter Selasky 
98*d6b92ffaSHans Petter Selasky #else
99*d6b92ffaSHans Petter Selasky static inline void mlx5_dbg(FILE *fp, uint32_t mask, const char *fmt, ...)
100*d6b92ffaSHans Petter Selasky 	__attribute__((format(printf, 3, 4)));
mlx5_dbg(FILE * fp,uint32_t mask,const char * fmt,...)101*d6b92ffaSHans Petter Selasky static inline void mlx5_dbg(FILE *fp, uint32_t mask, const char *fmt, ...)
102*d6b92ffaSHans Petter Selasky {
103*d6b92ffaSHans Petter Selasky }
104*d6b92ffaSHans Petter Selasky #endif
105*d6b92ffaSHans Petter Selasky 
106*d6b92ffaSHans Petter Selasky enum {
107*d6b92ffaSHans Petter Selasky 	MLX5_STAT_RATE_OFFSET		= 5
108*d6b92ffaSHans Petter Selasky };
109*d6b92ffaSHans Petter Selasky 
110*d6b92ffaSHans Petter Selasky enum {
111*d6b92ffaSHans Petter Selasky 	MLX5_QP_TABLE_SHIFT		= 12,
112*d6b92ffaSHans Petter Selasky 	MLX5_QP_TABLE_MASK		= (1 << MLX5_QP_TABLE_SHIFT) - 1,
113*d6b92ffaSHans Petter Selasky 	MLX5_QP_TABLE_SIZE		= 1 << (24 - MLX5_QP_TABLE_SHIFT),
114*d6b92ffaSHans Petter Selasky };
115*d6b92ffaSHans Petter Selasky 
116*d6b92ffaSHans Petter Selasky enum {
117*d6b92ffaSHans Petter Selasky 	MLX5_UIDX_TABLE_SHIFT		= 12,
118*d6b92ffaSHans Petter Selasky 	MLX5_UIDX_TABLE_MASK		= (1 << MLX5_UIDX_TABLE_SHIFT) - 1,
119*d6b92ffaSHans Petter Selasky 	MLX5_UIDX_TABLE_SIZE		= 1 << (24 - MLX5_UIDX_TABLE_SHIFT),
120*d6b92ffaSHans Petter Selasky };
121*d6b92ffaSHans Petter Selasky 
122*d6b92ffaSHans Petter Selasky enum {
123*d6b92ffaSHans Petter Selasky 	MLX5_SRQ_TABLE_SHIFT		= 12,
124*d6b92ffaSHans Petter Selasky 	MLX5_SRQ_TABLE_MASK		= (1 << MLX5_SRQ_TABLE_SHIFT) - 1,
125*d6b92ffaSHans Petter Selasky 	MLX5_SRQ_TABLE_SIZE		= 1 << (24 - MLX5_SRQ_TABLE_SHIFT),
126*d6b92ffaSHans Petter Selasky };
127*d6b92ffaSHans Petter Selasky 
128*d6b92ffaSHans Petter Selasky enum {
129*d6b92ffaSHans Petter Selasky 	MLX5_BF_OFFSET	= 0x800
130*d6b92ffaSHans Petter Selasky };
131*d6b92ffaSHans Petter Selasky 
132*d6b92ffaSHans Petter Selasky enum {
133*d6b92ffaSHans Petter Selasky 	MLX5_RECV_OPCODE_RDMA_WRITE_IMM	= 0x00,
134*d6b92ffaSHans Petter Selasky 	MLX5_RECV_OPCODE_SEND		= 0x01,
135*d6b92ffaSHans Petter Selasky 	MLX5_RECV_OPCODE_SEND_IMM	= 0x02,
136*d6b92ffaSHans Petter Selasky 	MLX5_RECV_OPCODE_SEND_INVAL	= 0x03,
137*d6b92ffaSHans Petter Selasky 
138*d6b92ffaSHans Petter Selasky 	MLX5_CQE_OPCODE_ERROR		= 0x1e,
139*d6b92ffaSHans Petter Selasky 	MLX5_CQE_OPCODE_RESIZE		= 0x16,
140*d6b92ffaSHans Petter Selasky };
141*d6b92ffaSHans Petter Selasky 
142*d6b92ffaSHans Petter Selasky enum {
143*d6b92ffaSHans Petter Selasky 	MLX5_SRQ_FLAG_SIGNATURE		= 1 << 0,
144*d6b92ffaSHans Petter Selasky };
145*d6b92ffaSHans Petter Selasky 
146*d6b92ffaSHans Petter Selasky enum {
147*d6b92ffaSHans Petter Selasky 	MLX5_MAX_PORTS_NUM = 2,
148*d6b92ffaSHans Petter Selasky };
149*d6b92ffaSHans Petter Selasky 
150*d6b92ffaSHans Petter Selasky enum {
151*d6b92ffaSHans Petter Selasky 	MLX5_CSUM_SUPPORT_RAW_OVER_ETH  = (1 <<  0),
152*d6b92ffaSHans Petter Selasky 	/*
153*d6b92ffaSHans Petter Selasky 	 * Only report rx checksum when the validation
154*d6b92ffaSHans Petter Selasky 	 * is valid.
155*d6b92ffaSHans Petter Selasky 	 */
156*d6b92ffaSHans Petter Selasky 	MLX5_RX_CSUM_VALID              = (1 << 16),
157*d6b92ffaSHans Petter Selasky };
158*d6b92ffaSHans Petter Selasky 
159*d6b92ffaSHans Petter Selasky enum mlx5_alloc_type {
160*d6b92ffaSHans Petter Selasky 	MLX5_ALLOC_TYPE_ANON,
161*d6b92ffaSHans Petter Selasky 	MLX5_ALLOC_TYPE_HUGE,
162*d6b92ffaSHans Petter Selasky 	MLX5_ALLOC_TYPE_CONTIG,
163*d6b92ffaSHans Petter Selasky 	MLX5_ALLOC_TYPE_PREFER_HUGE,
164*d6b92ffaSHans Petter Selasky 	MLX5_ALLOC_TYPE_PREFER_CONTIG,
165*d6b92ffaSHans Petter Selasky 	MLX5_ALLOC_TYPE_ALL
166*d6b92ffaSHans Petter Selasky };
167*d6b92ffaSHans Petter Selasky 
168*d6b92ffaSHans Petter Selasky enum mlx5_rsc_type {
169*d6b92ffaSHans Petter Selasky 	MLX5_RSC_TYPE_QP,
170*d6b92ffaSHans Petter Selasky 	MLX5_RSC_TYPE_XSRQ,
171*d6b92ffaSHans Petter Selasky 	MLX5_RSC_TYPE_SRQ,
172*d6b92ffaSHans Petter Selasky 	MLX5_RSC_TYPE_RWQ,
173*d6b92ffaSHans Petter Selasky 	MLX5_RSC_TYPE_INVAL,
174*d6b92ffaSHans Petter Selasky };
175*d6b92ffaSHans Petter Selasky 
176*d6b92ffaSHans Petter Selasky enum {
177*d6b92ffaSHans Petter Selasky 	MLX5_USER_CMDS_SUPP_UHW_QUERY_DEVICE = 1 << 0,
178*d6b92ffaSHans Petter Selasky 	MLX5_USER_CMDS_SUPP_UHW_CREATE_AH    = 1 << 1,
179*d6b92ffaSHans Petter Selasky };
180*d6b92ffaSHans Petter Selasky 
181*d6b92ffaSHans Petter Selasky enum mlx5_vendor_cap_flags {
182*d6b92ffaSHans Petter Selasky 	MLX5_VENDOR_CAP_FLAGS_MPW		= 1 << 0,
183*d6b92ffaSHans Petter Selasky };
184*d6b92ffaSHans Petter Selasky 
185*d6b92ffaSHans Petter Selasky enum {
186*d6b92ffaSHans Petter Selasky 	MLX5_FLOW_TAG_MASK	= 0x000fffff,
187*d6b92ffaSHans Petter Selasky };
188*d6b92ffaSHans Petter Selasky 
189*d6b92ffaSHans Petter Selasky struct mlx5_resource {
190*d6b92ffaSHans Petter Selasky 	enum mlx5_rsc_type	type;
191*d6b92ffaSHans Petter Selasky 	uint32_t		rsn;
192*d6b92ffaSHans Petter Selasky };
193*d6b92ffaSHans Petter Selasky 
194*d6b92ffaSHans Petter Selasky struct mlx5_device {
195*d6b92ffaSHans Petter Selasky 	struct verbs_device	verbs_dev;
196*d6b92ffaSHans Petter Selasky 	int			page_size;
197*d6b92ffaSHans Petter Selasky 	int			driver_abi_ver;
198*d6b92ffaSHans Petter Selasky };
199*d6b92ffaSHans Petter Selasky 
200*d6b92ffaSHans Petter Selasky struct mlx5_db_page;
201*d6b92ffaSHans Petter Selasky 
202*d6b92ffaSHans Petter Selasky struct mlx5_spinlock {
203*d6b92ffaSHans Petter Selasky 	pthread_spinlock_t		lock;
204*d6b92ffaSHans Petter Selasky 	int				in_use;
205*d6b92ffaSHans Petter Selasky };
206*d6b92ffaSHans Petter Selasky 
207*d6b92ffaSHans Petter Selasky struct mlx5_hugetlb_mem;
208*d6b92ffaSHans Petter Selasky 
209*d6b92ffaSHans Petter Selasky struct mlx5_context {
210*d6b92ffaSHans Petter Selasky 	struct ibv_context		ibv_ctx;
211*d6b92ffaSHans Petter Selasky 	int				max_num_qps;
212*d6b92ffaSHans Petter Selasky 	int				bf_reg_size;
213*d6b92ffaSHans Petter Selasky 	int				tot_uuars;
214*d6b92ffaSHans Petter Selasky 	int				low_lat_uuars;
215*d6b92ffaSHans Petter Selasky 	int				num_uars_per_page;
216*d6b92ffaSHans Petter Selasky 	int				bf_regs_per_page;
217*d6b92ffaSHans Petter Selasky 	int				num_bf_regs;
218*d6b92ffaSHans Petter Selasky 	int				prefer_bf;
219*d6b92ffaSHans Petter Selasky 	int				shut_up_bf;
220*d6b92ffaSHans Petter Selasky 	struct {
221*d6b92ffaSHans Petter Selasky 		struct mlx5_qp        **table;
222*d6b92ffaSHans Petter Selasky 		int			refcnt;
223*d6b92ffaSHans Petter Selasky 	}				qp_table[MLX5_QP_TABLE_SIZE];
224*d6b92ffaSHans Petter Selasky 	pthread_mutex_t			qp_table_mutex;
225*d6b92ffaSHans Petter Selasky 
226*d6b92ffaSHans Petter Selasky 	struct {
227*d6b92ffaSHans Petter Selasky 		struct mlx5_srq	      **table;
228*d6b92ffaSHans Petter Selasky 		int			refcnt;
229*d6b92ffaSHans Petter Selasky 	}				srq_table[MLX5_SRQ_TABLE_SIZE];
230*d6b92ffaSHans Petter Selasky 	pthread_mutex_t			srq_table_mutex;
231*d6b92ffaSHans Petter Selasky 
232*d6b92ffaSHans Petter Selasky 	struct {
233*d6b92ffaSHans Petter Selasky 		struct mlx5_resource  **table;
234*d6b92ffaSHans Petter Selasky 		int                     refcnt;
235*d6b92ffaSHans Petter Selasky 	}				uidx_table[MLX5_UIDX_TABLE_SIZE];
236*d6b92ffaSHans Petter Selasky 	pthread_mutex_t                 uidx_table_mutex;
237*d6b92ffaSHans Petter Selasky 
238*d6b92ffaSHans Petter Selasky 	void			       *uar[MLX5_MAX_UARS];
239*d6b92ffaSHans Petter Selasky 	struct mlx5_spinlock		lock32;
240*d6b92ffaSHans Petter Selasky 	struct mlx5_db_page	       *db_list;
241*d6b92ffaSHans Petter Selasky 	pthread_mutex_t			db_list_mutex;
242*d6b92ffaSHans Petter Selasky 	int				cache_line_size;
243*d6b92ffaSHans Petter Selasky 	int				max_sq_desc_sz;
244*d6b92ffaSHans Petter Selasky 	int				max_rq_desc_sz;
245*d6b92ffaSHans Petter Selasky 	int				max_send_wqebb;
246*d6b92ffaSHans Petter Selasky 	int				max_recv_wr;
247*d6b92ffaSHans Petter Selasky 	unsigned			max_srq_recv_wr;
248*d6b92ffaSHans Petter Selasky 	int				num_ports;
249*d6b92ffaSHans Petter Selasky 	int				stall_enable;
250*d6b92ffaSHans Petter Selasky 	int				stall_adaptive_enable;
251*d6b92ffaSHans Petter Selasky 	int				stall_cycles;
252*d6b92ffaSHans Petter Selasky 	struct mlx5_bf		       *bfs;
253*d6b92ffaSHans Petter Selasky 	FILE			       *dbg_fp;
254*d6b92ffaSHans Petter Selasky 	char				hostname[40];
255*d6b92ffaSHans Petter Selasky 	struct mlx5_spinlock            hugetlb_lock;
256*d6b92ffaSHans Petter Selasky 	TAILQ_HEAD(,mlx5_hugetlb_mem)	hugetlb_list;
257*d6b92ffaSHans Petter Selasky 	int				cqe_version;
258*d6b92ffaSHans Petter Selasky 	uint8_t				cached_link_layer[MLX5_MAX_PORTS_NUM];
259*d6b92ffaSHans Petter Selasky 	int				cached_device_cap_flags;
260*d6b92ffaSHans Petter Selasky 	enum ibv_atomic_cap		atomic_cap;
261*d6b92ffaSHans Petter Selasky 	struct {
262*d6b92ffaSHans Petter Selasky 		uint64_t                offset;
263*d6b92ffaSHans Petter Selasky 		uint64_t                mask;
264*d6b92ffaSHans Petter Selasky 	} core_clock;
265*d6b92ffaSHans Petter Selasky 	void			       *hca_core_clock;
266*d6b92ffaSHans Petter Selasky 	struct ibv_tso_caps		cached_tso_caps;
267*d6b92ffaSHans Petter Selasky 	int				cmds_supp_uhw;
268*d6b92ffaSHans Petter Selasky 	uint32_t			uar_size;
269*d6b92ffaSHans Petter Selasky 	uint64_t			vendor_cap_flags; /* Use enum mlx5_vendor_cap_flags */
270*d6b92ffaSHans Petter Selasky 	struct mlx5dv_cqe_comp_caps	cqe_comp_caps;
271*d6b92ffaSHans Petter Selasky };
272*d6b92ffaSHans Petter Selasky 
273*d6b92ffaSHans Petter Selasky struct mlx5_bitmap {
274*d6b92ffaSHans Petter Selasky 	uint32_t		last;
275*d6b92ffaSHans Petter Selasky 	uint32_t		top;
276*d6b92ffaSHans Petter Selasky 	uint32_t		max;
277*d6b92ffaSHans Petter Selasky 	uint32_t		avail;
278*d6b92ffaSHans Petter Selasky 	uint32_t		mask;
279*d6b92ffaSHans Petter Selasky 	unsigned long	       *table;
280*d6b92ffaSHans Petter Selasky };
281*d6b92ffaSHans Petter Selasky 
282*d6b92ffaSHans Petter Selasky struct mlx5_hugetlb_mem {
283*d6b92ffaSHans Petter Selasky 	int			shmid;
284*d6b92ffaSHans Petter Selasky 	void		       *shmaddr;
285*d6b92ffaSHans Petter Selasky 	struct mlx5_bitmap	bitmap;
286*d6b92ffaSHans Petter Selasky 	TAILQ_ENTRY(mlx5_hugetlb_mem) entry;
287*d6b92ffaSHans Petter Selasky };
288*d6b92ffaSHans Petter Selasky 
289*d6b92ffaSHans Petter Selasky struct mlx5_buf {
290*d6b92ffaSHans Petter Selasky 	void			       *buf;
291*d6b92ffaSHans Petter Selasky 	size_t				length;
292*d6b92ffaSHans Petter Selasky 	int                             base;
293*d6b92ffaSHans Petter Selasky 	struct mlx5_hugetlb_mem	       *hmem;
294*d6b92ffaSHans Petter Selasky 	enum mlx5_alloc_type		type;
295*d6b92ffaSHans Petter Selasky };
296*d6b92ffaSHans Petter Selasky 
297*d6b92ffaSHans Petter Selasky struct mlx5_pd {
298*d6b92ffaSHans Petter Selasky 	struct ibv_pd			ibv_pd;
299*d6b92ffaSHans Petter Selasky 	uint32_t			pdn;
300*d6b92ffaSHans Petter Selasky };
301*d6b92ffaSHans Petter Selasky 
302*d6b92ffaSHans Petter Selasky enum {
303*d6b92ffaSHans Petter Selasky 	MLX5_CQ_SET_CI	= 0,
304*d6b92ffaSHans Petter Selasky 	MLX5_CQ_ARM_DB	= 1,
305*d6b92ffaSHans Petter Selasky };
306*d6b92ffaSHans Petter Selasky 
307*d6b92ffaSHans Petter Selasky enum {
308*d6b92ffaSHans Petter Selasky 	MLX5_CQ_FLAGS_RX_CSUM_VALID = 1 << 0,
309*d6b92ffaSHans Petter Selasky 	MLX5_CQ_FLAGS_EMPTY_DURING_POLL = 1 << 1,
310*d6b92ffaSHans Petter Selasky 	MLX5_CQ_FLAGS_FOUND_CQES = 1 << 2,
311*d6b92ffaSHans Petter Selasky 	MLX5_CQ_FLAGS_EXTENDED = 1 << 3,
312*d6b92ffaSHans Petter Selasky 	MLX5_CQ_FLAGS_SINGLE_THREADED = 1 << 4,
313*d6b92ffaSHans Petter Selasky 	MLX5_CQ_FLAGS_DV_OWNED = 1 << 5,
314*d6b92ffaSHans Petter Selasky };
315*d6b92ffaSHans Petter Selasky 
316*d6b92ffaSHans Petter Selasky struct mlx5_cq {
317*d6b92ffaSHans Petter Selasky 	/* ibv_cq should always be subset of ibv_cq_ex */
318*d6b92ffaSHans Petter Selasky 	struct ibv_cq_ex		ibv_cq;
319*d6b92ffaSHans Petter Selasky 	struct mlx5_buf			buf_a;
320*d6b92ffaSHans Petter Selasky 	struct mlx5_buf			buf_b;
321*d6b92ffaSHans Petter Selasky 	struct mlx5_buf		       *active_buf;
322*d6b92ffaSHans Petter Selasky 	struct mlx5_buf		       *resize_buf;
323*d6b92ffaSHans Petter Selasky 	int				resize_cqes;
324*d6b92ffaSHans Petter Selasky 	int				active_cqes;
325*d6b92ffaSHans Petter Selasky 	struct mlx5_spinlock		lock;
326*d6b92ffaSHans Petter Selasky 	uint32_t			cqn;
327*d6b92ffaSHans Petter Selasky 	uint32_t			cons_index;
328*d6b92ffaSHans Petter Selasky 	uint32_t		       *dbrec;
329*d6b92ffaSHans Petter Selasky 	int				arm_sn;
330*d6b92ffaSHans Petter Selasky 	int				cqe_sz;
331*d6b92ffaSHans Petter Selasky 	int				resize_cqe_sz;
332*d6b92ffaSHans Petter Selasky 	int				stall_next_poll;
333*d6b92ffaSHans Petter Selasky 	int				stall_enable;
334*d6b92ffaSHans Petter Selasky 	uint64_t			stall_last_count;
335*d6b92ffaSHans Petter Selasky 	int				stall_adaptive_enable;
336*d6b92ffaSHans Petter Selasky 	int				stall_cycles;
337*d6b92ffaSHans Petter Selasky 	struct mlx5_resource		*cur_rsc;
338*d6b92ffaSHans Petter Selasky 	struct mlx5_srq			*cur_srq;
339*d6b92ffaSHans Petter Selasky 	struct mlx5_cqe64		*cqe64;
340*d6b92ffaSHans Petter Selasky 	uint32_t			flags;
341*d6b92ffaSHans Petter Selasky 	int			umr_opcode;
342*d6b92ffaSHans Petter Selasky };
343*d6b92ffaSHans Petter Selasky 
344*d6b92ffaSHans Petter Selasky struct mlx5_srq {
345*d6b92ffaSHans Petter Selasky 	struct mlx5_resource            rsc;  /* This struct must be first */
346*d6b92ffaSHans Petter Selasky 	struct verbs_srq		vsrq;
347*d6b92ffaSHans Petter Selasky 	struct mlx5_buf			buf;
348*d6b92ffaSHans Petter Selasky 	struct mlx5_spinlock		lock;
349*d6b92ffaSHans Petter Selasky 	uint64_t		       *wrid;
350*d6b92ffaSHans Petter Selasky 	uint32_t			srqn;
351*d6b92ffaSHans Petter Selasky 	int				max;
352*d6b92ffaSHans Petter Selasky 	int				max_gs;
353*d6b92ffaSHans Petter Selasky 	int				wqe_shift;
354*d6b92ffaSHans Petter Selasky 	int				head;
355*d6b92ffaSHans Petter Selasky 	int				tail;
356*d6b92ffaSHans Petter Selasky 	uint32_t		       *db;
357*d6b92ffaSHans Petter Selasky 	uint16_t			counter;
358*d6b92ffaSHans Petter Selasky 	int				wq_sig;
359*d6b92ffaSHans Petter Selasky };
360*d6b92ffaSHans Petter Selasky 
361*d6b92ffaSHans Petter Selasky struct wr_list {
362*d6b92ffaSHans Petter Selasky 	uint16_t	opcode;
363*d6b92ffaSHans Petter Selasky 	uint16_t	next;
364*d6b92ffaSHans Petter Selasky };
365*d6b92ffaSHans Petter Selasky 
366*d6b92ffaSHans Petter Selasky struct mlx5_wq {
367*d6b92ffaSHans Petter Selasky 	uint64_t		       *wrid;
368*d6b92ffaSHans Petter Selasky 	unsigned		       *wqe_head;
369*d6b92ffaSHans Petter Selasky 	struct mlx5_spinlock		lock;
370*d6b92ffaSHans Petter Selasky 	unsigned			wqe_cnt;
371*d6b92ffaSHans Petter Selasky 	unsigned			max_post;
372*d6b92ffaSHans Petter Selasky 	unsigned			head;
373*d6b92ffaSHans Petter Selasky 	unsigned			tail;
374*d6b92ffaSHans Petter Selasky 	unsigned			cur_post;
375*d6b92ffaSHans Petter Selasky 	int				max_gs;
376*d6b92ffaSHans Petter Selasky 	int				wqe_shift;
377*d6b92ffaSHans Petter Selasky 	int				offset;
378*d6b92ffaSHans Petter Selasky 	void			       *qend;
379*d6b92ffaSHans Petter Selasky 	uint32_t			*wr_data;
380*d6b92ffaSHans Petter Selasky };
381*d6b92ffaSHans Petter Selasky 
382*d6b92ffaSHans Petter Selasky struct mlx5_bf {
383*d6b92ffaSHans Petter Selasky 	void			       *reg;
384*d6b92ffaSHans Petter Selasky 	int				need_lock;
385*d6b92ffaSHans Petter Selasky 	struct mlx5_spinlock		lock;
386*d6b92ffaSHans Petter Selasky 	unsigned			offset;
387*d6b92ffaSHans Petter Selasky 	unsigned			buf_size;
388*d6b92ffaSHans Petter Selasky 	unsigned			uuarn;
389*d6b92ffaSHans Petter Selasky };
390*d6b92ffaSHans Petter Selasky 
391*d6b92ffaSHans Petter Selasky struct mlx5_mr {
392*d6b92ffaSHans Petter Selasky 	struct ibv_mr			ibv_mr;
393*d6b92ffaSHans Petter Selasky 	struct mlx5_buf			buf;
394*d6b92ffaSHans Petter Selasky 	uint32_t			alloc_flags;
395*d6b92ffaSHans Petter Selasky };
396*d6b92ffaSHans Petter Selasky 
397*d6b92ffaSHans Petter Selasky struct mlx5_qp {
398*d6b92ffaSHans Petter Selasky 	struct mlx5_resource            rsc; /* This struct must be first */
399*d6b92ffaSHans Petter Selasky 	struct verbs_qp			verbs_qp;
400*d6b92ffaSHans Petter Selasky 	struct ibv_qp		       *ibv_qp;
401*d6b92ffaSHans Petter Selasky 	struct mlx5_buf                 buf;
402*d6b92ffaSHans Petter Selasky 	void				*sq_start;
403*d6b92ffaSHans Petter Selasky 	int                             max_inline_data;
404*d6b92ffaSHans Petter Selasky 	int                             buf_size;
405*d6b92ffaSHans Petter Selasky 	/* For Raw Packet QP, use different buffers for the SQ and RQ */
406*d6b92ffaSHans Petter Selasky 	struct mlx5_buf                 sq_buf;
407*d6b92ffaSHans Petter Selasky 	int				sq_buf_size;
408*d6b92ffaSHans Petter Selasky 	struct mlx5_bf		       *bf;
409*d6b92ffaSHans Petter Selasky 
410*d6b92ffaSHans Petter Selasky 	uint8_t				fm_cache;
411*d6b92ffaSHans Petter Selasky 	uint8_t	                        sq_signal_bits;
412*d6b92ffaSHans Petter Selasky 	struct mlx5_wq                  sq;
413*d6b92ffaSHans Petter Selasky 
414*d6b92ffaSHans Petter Selasky 	uint32_t                       *db;
415*d6b92ffaSHans Petter Selasky 	struct mlx5_wq                  rq;
416*d6b92ffaSHans Petter Selasky 	int                             wq_sig;
417*d6b92ffaSHans Petter Selasky 	uint32_t			qp_cap_cache;
418*d6b92ffaSHans Petter Selasky 	int				atomics_enabled;
419*d6b92ffaSHans Petter Selasky 	uint32_t			max_tso;
420*d6b92ffaSHans Petter Selasky 	uint16_t			max_tso_header;
421*d6b92ffaSHans Petter Selasky 	int                             rss_qp;
422*d6b92ffaSHans Petter Selasky };
423*d6b92ffaSHans Petter Selasky 
424*d6b92ffaSHans Petter Selasky struct mlx5_ah {
425*d6b92ffaSHans Petter Selasky 	struct ibv_ah			ibv_ah;
426*d6b92ffaSHans Petter Selasky 	struct mlx5_wqe_av		av;
427*d6b92ffaSHans Petter Selasky 	bool				kern_ah;
428*d6b92ffaSHans Petter Selasky };
429*d6b92ffaSHans Petter Selasky 
430*d6b92ffaSHans Petter Selasky struct mlx5_rwq {
431*d6b92ffaSHans Petter Selasky 	struct mlx5_resource rsc;
432*d6b92ffaSHans Petter Selasky 	struct ibv_wq wq;
433*d6b92ffaSHans Petter Selasky 	struct mlx5_buf buf;
434*d6b92ffaSHans Petter Selasky 	int buf_size;
435*d6b92ffaSHans Petter Selasky 	struct mlx5_wq rq;
436*d6b92ffaSHans Petter Selasky 	uint32_t *db;
437*d6b92ffaSHans Petter Selasky 	void	*pbuff;
438*d6b92ffaSHans Petter Selasky 	uint32_t	*recv_db;
439*d6b92ffaSHans Petter Selasky 	int wq_sig;
440*d6b92ffaSHans Petter Selasky };
441*d6b92ffaSHans Petter Selasky 
mlx5_ilog2(int n)442*d6b92ffaSHans Petter Selasky static inline int mlx5_ilog2(int n)
443*d6b92ffaSHans Petter Selasky {
444*d6b92ffaSHans Petter Selasky 	int t;
445*d6b92ffaSHans Petter Selasky 
446*d6b92ffaSHans Petter Selasky 	if (n <= 0)
447*d6b92ffaSHans Petter Selasky 		return -1;
448*d6b92ffaSHans Petter Selasky 
449*d6b92ffaSHans Petter Selasky 	t = 0;
450*d6b92ffaSHans Petter Selasky 	while ((1 << t) < n)
451*d6b92ffaSHans Petter Selasky 		++t;
452*d6b92ffaSHans Petter Selasky 
453*d6b92ffaSHans Petter Selasky 	return t;
454*d6b92ffaSHans Petter Selasky }
455*d6b92ffaSHans Petter Selasky 
456*d6b92ffaSHans Petter Selasky extern int mlx5_stall_num_loop;
457*d6b92ffaSHans Petter Selasky extern int mlx5_stall_cq_poll_min;
458*d6b92ffaSHans Petter Selasky extern int mlx5_stall_cq_poll_max;
459*d6b92ffaSHans Petter Selasky extern int mlx5_stall_cq_inc_step;
460*d6b92ffaSHans Petter Selasky extern int mlx5_stall_cq_dec_step;
461*d6b92ffaSHans Petter Selasky extern int mlx5_single_threaded;
462*d6b92ffaSHans Petter Selasky 
DIV_ROUND_UP(unsigned n,unsigned d)463*d6b92ffaSHans Petter Selasky static inline unsigned DIV_ROUND_UP(unsigned n, unsigned d)
464*d6b92ffaSHans Petter Selasky {
465*d6b92ffaSHans Petter Selasky 	return (n + d - 1u) / d;
466*d6b92ffaSHans Petter Selasky }
467*d6b92ffaSHans Petter Selasky 
align(unsigned long val,unsigned long align)468*d6b92ffaSHans Petter Selasky static inline unsigned long align(unsigned long val, unsigned long align)
469*d6b92ffaSHans Petter Selasky {
470*d6b92ffaSHans Petter Selasky 	return (val + align - 1) & ~(align - 1);
471*d6b92ffaSHans Petter Selasky }
472*d6b92ffaSHans Petter Selasky 
473*d6b92ffaSHans Petter Selasky #define to_mxxx(xxx, type)						\
474*d6b92ffaSHans Petter Selasky 	((struct mlx5_##type *)					\
475*d6b92ffaSHans Petter Selasky 	 ((void *) ib##xxx - offsetof(struct mlx5_##type, ibv_##xxx)))
476*d6b92ffaSHans Petter Selasky 
to_mdev(struct ibv_device * ibdev)477*d6b92ffaSHans Petter Selasky static inline struct mlx5_device *to_mdev(struct ibv_device *ibdev)
478*d6b92ffaSHans Petter Selasky {
479*d6b92ffaSHans Petter Selasky 	struct mlx5_device *ret;
480*d6b92ffaSHans Petter Selasky 
481*d6b92ffaSHans Petter Selasky 	ret = (void *)ibdev - offsetof(struct mlx5_device, verbs_dev);
482*d6b92ffaSHans Petter Selasky 	return ret;
483*d6b92ffaSHans Petter Selasky }
484*d6b92ffaSHans Petter Selasky 
to_mctx(struct ibv_context * ibctx)485*d6b92ffaSHans Petter Selasky static inline struct mlx5_context *to_mctx(struct ibv_context *ibctx)
486*d6b92ffaSHans Petter Selasky {
487*d6b92ffaSHans Petter Selasky 	return to_mxxx(ctx, context);
488*d6b92ffaSHans Petter Selasky }
489*d6b92ffaSHans Petter Selasky 
to_mpd(struct ibv_pd * ibpd)490*d6b92ffaSHans Petter Selasky static inline struct mlx5_pd *to_mpd(struct ibv_pd *ibpd)
491*d6b92ffaSHans Petter Selasky {
492*d6b92ffaSHans Petter Selasky 	return to_mxxx(pd, pd);
493*d6b92ffaSHans Petter Selasky }
494*d6b92ffaSHans Petter Selasky 
to_mcq(struct ibv_cq * ibcq)495*d6b92ffaSHans Petter Selasky static inline struct mlx5_cq *to_mcq(struct ibv_cq *ibcq)
496*d6b92ffaSHans Petter Selasky {
497*d6b92ffaSHans Petter Selasky 	return to_mxxx(cq, cq);
498*d6b92ffaSHans Petter Selasky }
499*d6b92ffaSHans Petter Selasky 
to_msrq(struct ibv_srq * ibsrq)500*d6b92ffaSHans Petter Selasky static inline struct mlx5_srq *to_msrq(struct ibv_srq *ibsrq)
501*d6b92ffaSHans Petter Selasky {
502*d6b92ffaSHans Petter Selasky 	struct verbs_srq *vsrq = (struct verbs_srq *)ibsrq;
503*d6b92ffaSHans Petter Selasky 
504*d6b92ffaSHans Petter Selasky 	return container_of(vsrq, struct mlx5_srq, vsrq);
505*d6b92ffaSHans Petter Selasky }
506*d6b92ffaSHans Petter Selasky 
to_mqp(struct ibv_qp * ibqp)507*d6b92ffaSHans Petter Selasky static inline struct mlx5_qp *to_mqp(struct ibv_qp *ibqp)
508*d6b92ffaSHans Petter Selasky {
509*d6b92ffaSHans Petter Selasky 	struct verbs_qp *vqp = (struct verbs_qp *)ibqp;
510*d6b92ffaSHans Petter Selasky 
511*d6b92ffaSHans Petter Selasky 	return container_of(vqp, struct mlx5_qp, verbs_qp);
512*d6b92ffaSHans Petter Selasky }
513*d6b92ffaSHans Petter Selasky 
to_mrwq(struct ibv_wq * ibwq)514*d6b92ffaSHans Petter Selasky static inline struct mlx5_rwq *to_mrwq(struct ibv_wq *ibwq)
515*d6b92ffaSHans Petter Selasky {
516*d6b92ffaSHans Petter Selasky 	return container_of(ibwq, struct mlx5_rwq, wq);
517*d6b92ffaSHans Petter Selasky }
518*d6b92ffaSHans Petter Selasky 
to_mmr(struct ibv_mr * ibmr)519*d6b92ffaSHans Petter Selasky static inline struct mlx5_mr *to_mmr(struct ibv_mr *ibmr)
520*d6b92ffaSHans Petter Selasky {
521*d6b92ffaSHans Petter Selasky 	return to_mxxx(mr, mr);
522*d6b92ffaSHans Petter Selasky }
523*d6b92ffaSHans Petter Selasky 
to_mah(struct ibv_ah * ibah)524*d6b92ffaSHans Petter Selasky static inline struct mlx5_ah *to_mah(struct ibv_ah *ibah)
525*d6b92ffaSHans Petter Selasky {
526*d6b92ffaSHans Petter Selasky 	return to_mxxx(ah, ah);
527*d6b92ffaSHans Petter Selasky }
528*d6b92ffaSHans Petter Selasky 
max_int(int a,int b)529*d6b92ffaSHans Petter Selasky static inline int max_int(int a, int b)
530*d6b92ffaSHans Petter Selasky {
531*d6b92ffaSHans Petter Selasky 	return a > b ? a : b;
532*d6b92ffaSHans Petter Selasky }
533*d6b92ffaSHans Petter Selasky 
rsc_to_mqp(struct mlx5_resource * rsc)534*d6b92ffaSHans Petter Selasky static inline struct mlx5_qp *rsc_to_mqp(struct mlx5_resource *rsc)
535*d6b92ffaSHans Petter Selasky {
536*d6b92ffaSHans Petter Selasky 	return (struct mlx5_qp *)rsc;
537*d6b92ffaSHans Petter Selasky }
538*d6b92ffaSHans Petter Selasky 
rsc_to_msrq(struct mlx5_resource * rsc)539*d6b92ffaSHans Petter Selasky static inline struct mlx5_srq *rsc_to_msrq(struct mlx5_resource *rsc)
540*d6b92ffaSHans Petter Selasky {
541*d6b92ffaSHans Petter Selasky 	return (struct mlx5_srq *)rsc;
542*d6b92ffaSHans Petter Selasky }
543*d6b92ffaSHans Petter Selasky 
rsc_to_mrwq(struct mlx5_resource * rsc)544*d6b92ffaSHans Petter Selasky static inline struct mlx5_rwq *rsc_to_mrwq(struct mlx5_resource *rsc)
545*d6b92ffaSHans Petter Selasky {
546*d6b92ffaSHans Petter Selasky 	return (struct mlx5_rwq *)rsc;
547*d6b92ffaSHans Petter Selasky }
548*d6b92ffaSHans Petter Selasky 
549*d6b92ffaSHans Petter Selasky int mlx5_alloc_buf(struct mlx5_buf *buf, size_t size, int page_size);
550*d6b92ffaSHans Petter Selasky void mlx5_free_buf(struct mlx5_buf *buf);
551*d6b92ffaSHans Petter Selasky int mlx5_alloc_buf_contig(struct mlx5_context *mctx, struct mlx5_buf *buf,
552*d6b92ffaSHans Petter Selasky 			  size_t size, int page_size, const char *component);
553*d6b92ffaSHans Petter Selasky void mlx5_free_buf_contig(struct mlx5_context *mctx, struct mlx5_buf *buf);
554*d6b92ffaSHans Petter Selasky int mlx5_alloc_prefered_buf(struct mlx5_context *mctx,
555*d6b92ffaSHans Petter Selasky 			    struct mlx5_buf *buf,
556*d6b92ffaSHans Petter Selasky 			    size_t size, int page_size,
557*d6b92ffaSHans Petter Selasky 			    enum mlx5_alloc_type alloc_type,
558*d6b92ffaSHans Petter Selasky 			    const char *component);
559*d6b92ffaSHans Petter Selasky int mlx5_free_actual_buf(struct mlx5_context *ctx, struct mlx5_buf *buf);
560*d6b92ffaSHans Petter Selasky void mlx5_get_alloc_type(const char *component,
561*d6b92ffaSHans Petter Selasky 			 enum mlx5_alloc_type *alloc_type,
562*d6b92ffaSHans Petter Selasky 			 enum mlx5_alloc_type default_alloc_type);
563*d6b92ffaSHans Petter Selasky int mlx5_use_huge(const char *key);
564*d6b92ffaSHans Petter Selasky 
565*d6b92ffaSHans Petter Selasky uint32_t *mlx5_alloc_dbrec(struct mlx5_context *context);
566*d6b92ffaSHans Petter Selasky void mlx5_free_db(struct mlx5_context *context, uint32_t *db);
567*d6b92ffaSHans Petter Selasky 
568*d6b92ffaSHans Petter Selasky int mlx5_query_device(struct ibv_context *context,
569*d6b92ffaSHans Petter Selasky 		       struct ibv_device_attr *attr);
570*d6b92ffaSHans Petter Selasky int mlx5_query_device_ex(struct ibv_context *context,
571*d6b92ffaSHans Petter Selasky 			 const struct ibv_query_device_ex_input *input,
572*d6b92ffaSHans Petter Selasky 			 struct ibv_device_attr_ex *attr,
573*d6b92ffaSHans Petter Selasky 			 size_t attr_size);
574*d6b92ffaSHans Petter Selasky int mlx5_query_rt_values(struct ibv_context *context,
575*d6b92ffaSHans Petter Selasky 			 struct ibv_values_ex *values);
576*d6b92ffaSHans Petter Selasky struct ibv_qp *mlx5_create_qp_ex(struct ibv_context *context,
577*d6b92ffaSHans Petter Selasky 				 struct ibv_qp_init_attr_ex *attr);
578*d6b92ffaSHans Petter Selasky int mlx5_query_port(struct ibv_context *context, uint8_t port,
579*d6b92ffaSHans Petter Selasky 		     struct ibv_port_attr *attr);
580*d6b92ffaSHans Petter Selasky 
581*d6b92ffaSHans Petter Selasky struct ibv_pd *mlx5_alloc_pd(struct ibv_context *context);
582*d6b92ffaSHans Petter Selasky int mlx5_free_pd(struct ibv_pd *pd);
583*d6b92ffaSHans Petter Selasky 
584*d6b92ffaSHans Petter Selasky struct ibv_mr *mlx5_reg_mr(struct ibv_pd *pd, void *addr,
585*d6b92ffaSHans Petter Selasky 			   size_t length, int access);
586*d6b92ffaSHans Petter Selasky int mlx5_rereg_mr(struct ibv_mr *mr, int flags, struct ibv_pd *pd, void *addr,
587*d6b92ffaSHans Petter Selasky 		  size_t length, int access);
588*d6b92ffaSHans Petter Selasky int mlx5_dereg_mr(struct ibv_mr *mr);
589*d6b92ffaSHans Petter Selasky struct ibv_mw *mlx5_alloc_mw(struct ibv_pd *pd, enum ibv_mw_type);
590*d6b92ffaSHans Petter Selasky int mlx5_dealloc_mw(struct ibv_mw *mw);
591*d6b92ffaSHans Petter Selasky int mlx5_bind_mw(struct ibv_qp *qp, struct ibv_mw *mw,
592*d6b92ffaSHans Petter Selasky 		 struct ibv_mw_bind *mw_bind);
593*d6b92ffaSHans Petter Selasky 
594*d6b92ffaSHans Petter Selasky struct ibv_cq *mlx5_create_cq(struct ibv_context *context, int cqe,
595*d6b92ffaSHans Petter Selasky 			       struct ibv_comp_channel *channel,
596*d6b92ffaSHans Petter Selasky 			       int comp_vector);
597*d6b92ffaSHans Petter Selasky struct ibv_cq_ex *mlx5_create_cq_ex(struct ibv_context *context,
598*d6b92ffaSHans Petter Selasky 				    struct ibv_cq_init_attr_ex *cq_attr);
599*d6b92ffaSHans Petter Selasky void mlx5_cq_fill_pfns(struct mlx5_cq *cq, const struct ibv_cq_init_attr_ex *cq_attr);
600*d6b92ffaSHans Petter Selasky int mlx5_alloc_cq_buf(struct mlx5_context *mctx, struct mlx5_cq *cq,
601*d6b92ffaSHans Petter Selasky 		      struct mlx5_buf *buf, int nent, int cqe_sz);
602*d6b92ffaSHans Petter Selasky int mlx5_free_cq_buf(struct mlx5_context *ctx, struct mlx5_buf *buf);
603*d6b92ffaSHans Petter Selasky int mlx5_resize_cq(struct ibv_cq *cq, int cqe);
604*d6b92ffaSHans Petter Selasky int mlx5_destroy_cq(struct ibv_cq *cq);
605*d6b92ffaSHans Petter Selasky int mlx5_poll_cq(struct ibv_cq *cq, int ne, struct ibv_wc *wc);
606*d6b92ffaSHans Petter Selasky int mlx5_poll_cq_v1(struct ibv_cq *cq, int ne, struct ibv_wc *wc);
607*d6b92ffaSHans Petter Selasky int mlx5_arm_cq(struct ibv_cq *cq, int solicited);
608*d6b92ffaSHans Petter Selasky void mlx5_cq_event(struct ibv_cq *cq);
609*d6b92ffaSHans Petter Selasky void __mlx5_cq_clean(struct mlx5_cq *cq, uint32_t qpn, struct mlx5_srq *srq);
610*d6b92ffaSHans Petter Selasky void mlx5_cq_clean(struct mlx5_cq *cq, uint32_t qpn, struct mlx5_srq *srq);
611*d6b92ffaSHans Petter Selasky void mlx5_cq_resize_copy_cqes(struct mlx5_cq *cq);
612*d6b92ffaSHans Petter Selasky 
613*d6b92ffaSHans Petter Selasky struct ibv_srq *mlx5_create_srq(struct ibv_pd *pd,
614*d6b92ffaSHans Petter Selasky 				 struct ibv_srq_init_attr *attr);
615*d6b92ffaSHans Petter Selasky int mlx5_modify_srq(struct ibv_srq *srq, struct ibv_srq_attr *attr,
616*d6b92ffaSHans Petter Selasky 		    int mask);
617*d6b92ffaSHans Petter Selasky int mlx5_query_srq(struct ibv_srq *srq,
618*d6b92ffaSHans Petter Selasky 			   struct ibv_srq_attr *attr);
619*d6b92ffaSHans Petter Selasky int mlx5_destroy_srq(struct ibv_srq *srq);
620*d6b92ffaSHans Petter Selasky int mlx5_alloc_srq_buf(struct ibv_context *context, struct mlx5_srq *srq);
621*d6b92ffaSHans Petter Selasky void mlx5_free_srq_wqe(struct mlx5_srq *srq, int ind);
622*d6b92ffaSHans Petter Selasky int mlx5_post_srq_recv(struct ibv_srq *ibsrq,
623*d6b92ffaSHans Petter Selasky 		       struct ibv_recv_wr *wr,
624*d6b92ffaSHans Petter Selasky 		       struct ibv_recv_wr **bad_wr);
625*d6b92ffaSHans Petter Selasky 
626*d6b92ffaSHans Petter Selasky struct ibv_qp *mlx5_create_qp(struct ibv_pd *pd, struct ibv_qp_init_attr *attr);
627*d6b92ffaSHans Petter Selasky int mlx5_query_qp(struct ibv_qp *qp, struct ibv_qp_attr *attr,
628*d6b92ffaSHans Petter Selasky 		  int attr_mask,
629*d6b92ffaSHans Petter Selasky 		  struct ibv_qp_init_attr *init_attr);
630*d6b92ffaSHans Petter Selasky int mlx5_modify_qp(struct ibv_qp *qp, struct ibv_qp_attr *attr,
631*d6b92ffaSHans Petter Selasky 		   int attr_mask);
632*d6b92ffaSHans Petter Selasky int mlx5_destroy_qp(struct ibv_qp *qp);
633*d6b92ffaSHans Petter Selasky void mlx5_init_qp_indices(struct mlx5_qp *qp);
634*d6b92ffaSHans Petter Selasky void mlx5_init_rwq_indices(struct mlx5_rwq *rwq);
635*d6b92ffaSHans Petter Selasky int mlx5_post_send(struct ibv_qp *ibqp, struct ibv_send_wr *wr,
636*d6b92ffaSHans Petter Selasky 			  struct ibv_send_wr **bad_wr);
637*d6b92ffaSHans Petter Selasky int mlx5_post_recv(struct ibv_qp *ibqp, struct ibv_recv_wr *wr,
638*d6b92ffaSHans Petter Selasky 			  struct ibv_recv_wr **bad_wr);
639*d6b92ffaSHans Petter Selasky int mlx5_post_wq_recv(struct ibv_wq *ibwq, struct ibv_recv_wr *wr,
640*d6b92ffaSHans Petter Selasky 		      struct ibv_recv_wr **bad_wr);
641*d6b92ffaSHans Petter Selasky void mlx5_calc_sq_wqe_size(struct ibv_qp_cap *cap, enum ibv_qp_type type,
642*d6b92ffaSHans Petter Selasky 			   struct mlx5_qp *qp);
643*d6b92ffaSHans Petter Selasky void mlx5_set_sq_sizes(struct mlx5_qp *qp, struct ibv_qp_cap *cap,
644*d6b92ffaSHans Petter Selasky 		       enum ibv_qp_type type);
645*d6b92ffaSHans Petter Selasky struct mlx5_qp *mlx5_find_qp(struct mlx5_context *ctx, uint32_t qpn);
646*d6b92ffaSHans Petter Selasky int mlx5_store_qp(struct mlx5_context *ctx, uint32_t qpn, struct mlx5_qp *qp);
647*d6b92ffaSHans Petter Selasky void mlx5_clear_qp(struct mlx5_context *ctx, uint32_t qpn);
648*d6b92ffaSHans Petter Selasky int32_t mlx5_store_uidx(struct mlx5_context *ctx, void *rsc);
649*d6b92ffaSHans Petter Selasky void mlx5_clear_uidx(struct mlx5_context *ctx, uint32_t uidx);
650*d6b92ffaSHans Petter Selasky struct mlx5_srq *mlx5_find_srq(struct mlx5_context *ctx, uint32_t srqn);
651*d6b92ffaSHans Petter Selasky int mlx5_store_srq(struct mlx5_context *ctx, uint32_t srqn,
652*d6b92ffaSHans Petter Selasky 		   struct mlx5_srq *srq);
653*d6b92ffaSHans Petter Selasky void mlx5_clear_srq(struct mlx5_context *ctx, uint32_t srqn);
654*d6b92ffaSHans Petter Selasky struct ibv_ah *mlx5_create_ah(struct ibv_pd *pd, struct ibv_ah_attr *attr);
655*d6b92ffaSHans Petter Selasky int mlx5_destroy_ah(struct ibv_ah *ah);
656*d6b92ffaSHans Petter Selasky int mlx5_alloc_av(struct mlx5_pd *pd, struct ibv_ah_attr *attr,
657*d6b92ffaSHans Petter Selasky 		   struct mlx5_ah *ah);
658*d6b92ffaSHans Petter Selasky void mlx5_free_av(struct mlx5_ah *ah);
659*d6b92ffaSHans Petter Selasky int mlx5_attach_mcast(struct ibv_qp *qp, const union ibv_gid *gid, uint16_t lid);
660*d6b92ffaSHans Petter Selasky int mlx5_detach_mcast(struct ibv_qp *qp, const union ibv_gid *gid, uint16_t lid);
661*d6b92ffaSHans Petter Selasky int mlx5_round_up_power_of_two(long long sz);
662*d6b92ffaSHans Petter Selasky void *mlx5_get_atomic_laddr(struct mlx5_qp *qp, uint16_t idx, int *byte_count);
663*d6b92ffaSHans Petter Selasky void *mlx5_get_send_wqe(struct mlx5_qp *qp, int n);
664*d6b92ffaSHans Petter Selasky int mlx5_copy_to_recv_wqe(struct mlx5_qp *qp, int idx, void *buf, int size);
665*d6b92ffaSHans Petter Selasky int mlx5_copy_to_send_wqe(struct mlx5_qp *qp, int idx, void *buf, int size);
666*d6b92ffaSHans Petter Selasky int mlx5_copy_to_recv_srq(struct mlx5_srq *srq, int idx, void *buf, int size);
667*d6b92ffaSHans Petter Selasky struct ibv_xrcd *mlx5_open_xrcd(struct ibv_context *context,
668*d6b92ffaSHans Petter Selasky 				struct ibv_xrcd_init_attr *xrcd_init_attr);
669*d6b92ffaSHans Petter Selasky int mlx5_get_srq_num(struct ibv_srq *srq, uint32_t *srq_num);
670*d6b92ffaSHans Petter Selasky int mlx5_close_xrcd(struct ibv_xrcd *ib_xrcd);
671*d6b92ffaSHans Petter Selasky struct ibv_wq *mlx5_create_wq(struct ibv_context *context,
672*d6b92ffaSHans Petter Selasky 			      struct ibv_wq_init_attr *attr);
673*d6b92ffaSHans Petter Selasky int mlx5_modify_wq(struct ibv_wq *wq, struct ibv_wq_attr *attr);
674*d6b92ffaSHans Petter Selasky int mlx5_destroy_wq(struct ibv_wq *wq);
675*d6b92ffaSHans Petter Selasky struct ibv_rwq_ind_table *mlx5_create_rwq_ind_table(struct ibv_context *context,
676*d6b92ffaSHans Petter Selasky 						    struct ibv_rwq_ind_table_init_attr *init_attr);
677*d6b92ffaSHans Petter Selasky int mlx5_destroy_rwq_ind_table(struct ibv_rwq_ind_table *rwq_ind_table);
678*d6b92ffaSHans Petter Selasky struct ibv_srq *mlx5_create_srq_ex(struct ibv_context *context,
679*d6b92ffaSHans Petter Selasky 				   struct ibv_srq_init_attr_ex *attr);
680*d6b92ffaSHans Petter Selasky 
mlx5_find_uidx(struct mlx5_context * ctx,uint32_t uidx)681*d6b92ffaSHans Petter Selasky static inline void *mlx5_find_uidx(struct mlx5_context *ctx, uint32_t uidx)
682*d6b92ffaSHans Petter Selasky {
683*d6b92ffaSHans Petter Selasky 	int tind = uidx >> MLX5_UIDX_TABLE_SHIFT;
684*d6b92ffaSHans Petter Selasky 
685*d6b92ffaSHans Petter Selasky 	if (likely(ctx->uidx_table[tind].refcnt))
686*d6b92ffaSHans Petter Selasky 		return ctx->uidx_table[tind].table[uidx & MLX5_UIDX_TABLE_MASK];
687*d6b92ffaSHans Petter Selasky 
688*d6b92ffaSHans Petter Selasky 	return NULL;
689*d6b92ffaSHans Petter Selasky }
690*d6b92ffaSHans Petter Selasky 
mlx5_spin_lock(struct mlx5_spinlock * lock)691*d6b92ffaSHans Petter Selasky static inline int mlx5_spin_lock(struct mlx5_spinlock *lock)
692*d6b92ffaSHans Petter Selasky {
693*d6b92ffaSHans Petter Selasky 	if (!mlx5_single_threaded)
694*d6b92ffaSHans Petter Selasky 		return pthread_spin_lock(&lock->lock);
695*d6b92ffaSHans Petter Selasky 
696*d6b92ffaSHans Petter Selasky 	if (unlikely(lock->in_use)) {
697*d6b92ffaSHans Petter Selasky 		fprintf(stderr, "*** ERROR: multithreading vilation ***\n"
698*d6b92ffaSHans Petter Selasky 			"You are running a multithreaded application but\n"
699*d6b92ffaSHans Petter Selasky 			"you set MLX5_SINGLE_THREADED=1. Please unset it.\n");
700*d6b92ffaSHans Petter Selasky 		abort();
701*d6b92ffaSHans Petter Selasky 	} else {
702*d6b92ffaSHans Petter Selasky 		lock->in_use = 1;
703*d6b92ffaSHans Petter Selasky 		/*
704*d6b92ffaSHans Petter Selasky 		 * This fence is not at all correct, but it increases the
705*d6b92ffaSHans Petter Selasky 		 * chance that in_use is detected by another thread without
706*d6b92ffaSHans Petter Selasky 		 * much runtime cost. */
707*d6b92ffaSHans Petter Selasky 		atomic_thread_fence(memory_order_acq_rel);
708*d6b92ffaSHans Petter Selasky 	}
709*d6b92ffaSHans Petter Selasky 
710*d6b92ffaSHans Petter Selasky 	return 0;
711*d6b92ffaSHans Petter Selasky }
712*d6b92ffaSHans Petter Selasky 
mlx5_spin_unlock(struct mlx5_spinlock * lock)713*d6b92ffaSHans Petter Selasky static inline int mlx5_spin_unlock(struct mlx5_spinlock *lock)
714*d6b92ffaSHans Petter Selasky {
715*d6b92ffaSHans Petter Selasky 	if (!mlx5_single_threaded)
716*d6b92ffaSHans Petter Selasky 		return pthread_spin_unlock(&lock->lock);
717*d6b92ffaSHans Petter Selasky 
718*d6b92ffaSHans Petter Selasky 	lock->in_use = 0;
719*d6b92ffaSHans Petter Selasky 
720*d6b92ffaSHans Petter Selasky 	return 0;
721*d6b92ffaSHans Petter Selasky }
722*d6b92ffaSHans Petter Selasky 
mlx5_spinlock_init(struct mlx5_spinlock * lock)723*d6b92ffaSHans Petter Selasky static inline int mlx5_spinlock_init(struct mlx5_spinlock *lock)
724*d6b92ffaSHans Petter Selasky {
725*d6b92ffaSHans Petter Selasky 	lock->in_use = 0;
726*d6b92ffaSHans Petter Selasky 	return pthread_spin_init(&lock->lock, PTHREAD_PROCESS_PRIVATE);
727*d6b92ffaSHans Petter Selasky }
728*d6b92ffaSHans Petter Selasky 
mlx5_spinlock_destroy(struct mlx5_spinlock * lock)729*d6b92ffaSHans Petter Selasky static inline int mlx5_spinlock_destroy(struct mlx5_spinlock *lock)
730*d6b92ffaSHans Petter Selasky {
731*d6b92ffaSHans Petter Selasky 	return pthread_spin_destroy(&lock->lock);
732*d6b92ffaSHans Petter Selasky }
733*d6b92ffaSHans Petter Selasky 
set_command(int command,off_t * offset)734*d6b92ffaSHans Petter Selasky static inline void set_command(int command, off_t *offset)
735*d6b92ffaSHans Petter Selasky {
736*d6b92ffaSHans Petter Selasky 	*offset |= (command << MLX5_IB_MMAP_CMD_SHIFT);
737*d6b92ffaSHans Petter Selasky }
738*d6b92ffaSHans Petter Selasky 
set_arg(int arg,off_t * offset)739*d6b92ffaSHans Petter Selasky static inline void set_arg(int arg, off_t *offset)
740*d6b92ffaSHans Petter Selasky {
741*d6b92ffaSHans Petter Selasky 	*offset |= arg;
742*d6b92ffaSHans Petter Selasky }
743*d6b92ffaSHans Petter Selasky 
set_order(int order,off_t * offset)744*d6b92ffaSHans Petter Selasky static inline void set_order(int order, off_t *offset)
745*d6b92ffaSHans Petter Selasky {
746*d6b92ffaSHans Petter Selasky 	set_arg(order, offset);
747*d6b92ffaSHans Petter Selasky }
748*d6b92ffaSHans Petter Selasky 
set_index(int index,off_t * offset)749*d6b92ffaSHans Petter Selasky static inline void set_index(int index, off_t *offset)
750*d6b92ffaSHans Petter Selasky {
751*d6b92ffaSHans Petter Selasky 	set_arg(index, offset);
752*d6b92ffaSHans Petter Selasky }
753*d6b92ffaSHans Petter Selasky 
calc_sig(void * wqe,int size)754*d6b92ffaSHans Petter Selasky static inline uint8_t calc_sig(void *wqe, int size)
755*d6b92ffaSHans Petter Selasky {
756*d6b92ffaSHans Petter Selasky 	int i;
757*d6b92ffaSHans Petter Selasky 	uint8_t *p = wqe;
758*d6b92ffaSHans Petter Selasky 	uint8_t res = 0;
759*d6b92ffaSHans Petter Selasky 
760*d6b92ffaSHans Petter Selasky 	for (i = 0; i < size; ++i)
761*d6b92ffaSHans Petter Selasky 		res ^= p[i];
762*d6b92ffaSHans Petter Selasky 
763*d6b92ffaSHans Petter Selasky 	return ~res;
764*d6b92ffaSHans Petter Selasky }
765*d6b92ffaSHans Petter Selasky 
766*d6b92ffaSHans Petter Selasky #endif /* MLX5_H */
767