1c39526b7SPramod Gunjikar /*
2c39526b7SPramod Gunjikar  * CDDL HEADER START
3c39526b7SPramod Gunjikar  *
4c39526b7SPramod Gunjikar  * The contents of this file are subject to the terms of the
5c39526b7SPramod Gunjikar  * Common Development and Distribution License (the "License").
6c39526b7SPramod Gunjikar  * You may not use this file except in compliance with the License.
7c39526b7SPramod Gunjikar  *
8c39526b7SPramod Gunjikar  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9c39526b7SPramod Gunjikar  * or http://www.opensolaris.org/os/licensing.
10c39526b7SPramod Gunjikar  * See the License for the specific language governing permissions
11c39526b7SPramod Gunjikar  * and limitations under the License.
12c39526b7SPramod Gunjikar  *
13c39526b7SPramod Gunjikar  * When distributing Covered Code, include this CDDL HEADER in each
14c39526b7SPramod Gunjikar  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15c39526b7SPramod Gunjikar  * If applicable, add the following below this CDDL HEADER, with the
16c39526b7SPramod Gunjikar  * fields enclosed by brackets "[]" replaced with your own identifying
17c39526b7SPramod Gunjikar  * information: Portions Copyright [yyyy] [name of copyright owner]
18c39526b7SPramod Gunjikar  *
19c39526b7SPramod Gunjikar  * CDDL HEADER END
20c39526b7SPramod Gunjikar  */
21c39526b7SPramod Gunjikar 
22c39526b7SPramod Gunjikar /*
23c39526b7SPramod Gunjikar  * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
24c39526b7SPramod Gunjikar  */
25c39526b7SPramod Gunjikar 
26c39526b7SPramod Gunjikar #ifndef _SYS_IB_CLIENTS_OF_SOL_UVERBS_SOL_UVERBS_H
27c39526b7SPramod Gunjikar #define	_SYS_IB_CLIENTS_OF_SOL_UVERBS_SOL_UVERBS_H
28c39526b7SPramod Gunjikar 
29c39526b7SPramod Gunjikar #ifdef __cplusplus
30c39526b7SPramod Gunjikar extern "C" {
31c39526b7SPramod Gunjikar #endif
32c39526b7SPramod Gunjikar 
33c39526b7SPramod Gunjikar /*
34c39526b7SPramod Gunjikar  *
35c39526b7SPramod Gunjikar  * NAME: sol_uverbs.h
36c39526b7SPramod Gunjikar  *
37c39526b7SPramod Gunjikar  * DESC: Solaris OFED User Verbs Kernel Agent header file.
38c39526b7SPramod Gunjikar  *
39c39526b7SPramod Gunjikar  */
40c39526b7SPramod Gunjikar #include <sys/ib/clients/of/ofed_kernel.h>
41c39526b7SPramod Gunjikar #include <sys/ib/clients/of/rdma/ib_user_verbs.h>
42c39526b7SPramod Gunjikar #include <sys/ib/clients/of/sol_uverbs/sol_uverbs_hca.h>
43c39526b7SPramod Gunjikar #include <sys/ib/clients/of/sol_ofs/sol_ofs_common.h>
44c39526b7SPramod Gunjikar #include <sys/ib/clients/of/sol_uverbs/sol_uverbs2ucma.h>
45c39526b7SPramod Gunjikar 
46c39526b7SPramod Gunjikar /*
47c39526b7SPramod Gunjikar  * Definitions
48c39526b7SPramod Gunjikar  */
49c39526b7SPramod Gunjikar #define	SOL_UVERBS_DRIVER_MAX_HCA_MINOR	(16)
50c39526b7SPramod Gunjikar #define	SOL_UVERBS_DRIVER_EVENT_MINOR	(17)
51c39526b7SPramod Gunjikar #define	SOL_UVERBS_DRIVER_MAX_MINOR	(18)
52c39526b7SPramod Gunjikar 
53c39526b7SPramod Gunjikar 
54c39526b7SPramod Gunjikar /*
55c39526b7SPramod Gunjikar  * Structures
56c39526b7SPramod Gunjikar  */
57c39526b7SPramod Gunjikar 
58c39526b7SPramod Gunjikar /*
59c39526b7SPramod Gunjikar  * Kernel User Verbs Events.
60c39526b7SPramod Gunjikar  *
61c39526b7SPramod Gunjikar  * User verbs kernel events (asynchronous and completion) representation.
62c39526b7SPramod Gunjikar  * IBT events are mapped back to OFA events.
63c39526b7SPramod Gunjikar  */
64c39526b7SPramod Gunjikar typedef struct uverbs_event {
65c39526b7SPramod Gunjikar 
66c39526b7SPramod Gunjikar 	union {
67c39526b7SPramod Gunjikar 		struct ib_uverbs_async_event_desc	async;
68c39526b7SPramod Gunjikar 		struct ib_uverbs_comp_event_desc	comp;
69c39526b7SPramod Gunjikar 	} ev_desc;
70c39526b7SPramod Gunjikar 
71c39526b7SPramod Gunjikar 	llist_head_t	ev_list;
72c39526b7SPramod Gunjikar 	llist_head_t	ev_obj_list;
73c39526b7SPramod Gunjikar 	uint32_t	*ev_counter;
74c39526b7SPramod Gunjikar } uverbs_event_t;
75c39526b7SPramod Gunjikar 
76c39526b7SPramod Gunjikar 
77c39526b7SPramod Gunjikar /*
78c39526b7SPramod Gunjikar  * Module Context.
79c39526b7SPramod Gunjikar  *
80c39526b7SPramod Gunjikar  * There is a single module context which maintains the list
81c39526b7SPramod Gunjikar  * of HCA's retrieved from IBT. A user process indicates the
82c39526b7SPramod Gunjikar  * target HCA open via the uverbs unique minor device number
83c39526b7SPramod Gunjikar  * associated with the HCA.
84c39526b7SPramod Gunjikar  */
85c39526b7SPramod Gunjikar typedef struct {
86c39526b7SPramod Gunjikar 	kmutex_t		lock;
87c39526b7SPramod Gunjikar 	dev_info_t		*dip;
88c39526b7SPramod Gunjikar 
89c39526b7SPramod Gunjikar 	/*
90c39526b7SPramod Gunjikar 	 * Underlying IBT HCA Info
91c39526b7SPramod Gunjikar 	 */
92c39526b7SPramod Gunjikar 
93c39526b7SPramod Gunjikar 	ibt_clnt_modinfo_t	clnt_modinfo;
94c39526b7SPramod Gunjikar 	ibt_clnt_hdl_t		clnt_hdl;
95c39526b7SPramod Gunjikar 	uint32_t		hca_count;
96c39526b7SPramod Gunjikar 	ib_guid_t		*hca_guid_list;
97c39526b7SPramod Gunjikar 	sol_uverbs_hca_t	*hcas;
98c39526b7SPramod Gunjikar 
99c39526b7SPramod Gunjikar 	/*
100c39526b7SPramod Gunjikar 	 * Support user asyncrhonous and completion event delivery via
101c39526b7SPramod Gunjikar 	 * user event filesystem.
102c39526b7SPramod Gunjikar 	 */
103c39526b7SPramod Gunjikar 	dev_t			dev;
104c39526b7SPramod Gunjikar } uverbs_module_context_t;
105c39526b7SPramod Gunjikar 
106c39526b7SPramod Gunjikar /*
107c39526b7SPramod Gunjikar  * User Event File.
108c39526b7SPramod Gunjikar  *
109c39526b7SPramod Gunjikar  * Used for delivery of asynchronous and synchronous events to the user.
110c39526b7SPramod Gunjikar  * An asynchronous event file is created during the allocation of
111c39526b7SPramod Gunjikar  * a user verbs consumer context, a completion event file is created
112c39526b7SPramod Gunjikar  * when the user verbs consumer creates a completion channel.
113c39526b7SPramod Gunjikar  */
114c39526b7SPramod Gunjikar typedef struct uverbs_ufile_uobj {
115c39526b7SPramod Gunjikar 	sol_ofs_uobj_t			uobj;
116c39526b7SPramod Gunjikar 	kmutex_t			lock;
117c39526b7SPramod Gunjikar 	int				ref;
118c39526b7SPramod Gunjikar 	kcondvar_t			poll_wait;
119*2c76d751SPatrick Mooney 	pollhead_t			poll_head;
120c39526b7SPramod Gunjikar 	struct uverbs_uctxt_uobj	*uctxt;
121c39526b7SPramod Gunjikar 	int				is_async;
122c39526b7SPramod Gunjikar 	llist_head_t			event_list;
123c39526b7SPramod Gunjikar 	sol_uverbs_cq_ctrl_t		ufile_notify_enabled;
124c39526b7SPramod Gunjikar 	uint32_t			ufile_cq_cnt;
125c39526b7SPramod Gunjikar } uverbs_ufile_uobj_t;
126c39526b7SPramod Gunjikar 
127c39526b7SPramod Gunjikar /*
128c39526b7SPramod Gunjikar  * Type of user context -
129c39526b7SPramod Gunjikar  */
130c39526b7SPramod Gunjikar #define		SOL_UVERBS_UCTXT_VERBS		0x001
131c39526b7SPramod Gunjikar #define		SOL_UVERBS_UCTXT_EVENT		0x100
132c39526b7SPramod Gunjikar #define		SOL_UVERBS_UCTXT_ASYNC		0x101
133c39526b7SPramod Gunjikar #define		SOL_UVERBS_UCTXT_COMPL		0x110
134c39526b7SPramod Gunjikar 
135c39526b7SPramod Gunjikar /*
136c39526b7SPramod Gunjikar  * User Context.
137c39526b7SPramod Gunjikar  *
138c39526b7SPramod Gunjikar  * A user context is created when a user process opens a specific minor
139c39526b7SPramod Gunjikar  * device.  The context maintains a list of resources created by this
140c39526b7SPramod Gunjikar  * user that allows the resources to be cleaned up on user close.
141c39526b7SPramod Gunjikar  */
142c39526b7SPramod Gunjikar typedef struct uverbs_uctxt_uobj {
143c39526b7SPramod Gunjikar 	sol_ofs_uobj_t		uobj;
144c39526b7SPramod Gunjikar 	kmutex_t		lock;
145c39526b7SPramod Gunjikar 	uverbs_module_context_t	*mod_ctxt;
146c39526b7SPramod Gunjikar 	sol_uverbs_hca_t	*hca;		/* short cut to specific hca */
147c39526b7SPramod Gunjikar 
148c39526b7SPramod Gunjikar 	/*
149c39526b7SPramod Gunjikar 	 * List of user resource objects created by this context.  The
150c39526b7SPramod Gunjikar 	 * objects themselves live in the associated object table, and
151c39526b7SPramod Gunjikar 	 * the code should use the table to access and use resources.
152c39526b7SPramod Gunjikar 	 * Any objects that remain in these list will be destroyed at
153c39526b7SPramod Gunjikar 	 * user close to free the associated resources.
154c39526b7SPramod Gunjikar 	 *
155c39526b7SPramod Gunjikar 	 * The user context "lock" should be held when invoking
156c39526b7SPramod Gunjikar 	 * routines to manipulate the lists.
157c39526b7SPramod Gunjikar 	 */
158c39526b7SPramod Gunjikar 	genlist_t		pd_list;
159c39526b7SPramod Gunjikar 	genlist_t		mr_list;
160c39526b7SPramod Gunjikar 	genlist_t		cq_list;
161c39526b7SPramod Gunjikar 	genlist_t		qp_list;
162c39526b7SPramod Gunjikar 	genlist_t		srq_list;
163c39526b7SPramod Gunjikar 	genlist_t		ah_list;
164c39526b7SPramod Gunjikar 
165c39526b7SPramod Gunjikar 	/*
166c39526b7SPramod Gunjikar 	 * Event filesystem interfaces for IB asyncrhonous events
167c39526b7SPramod Gunjikar 	 * and completion events.
168c39526b7SPramod Gunjikar 	 */
169c39526b7SPramod Gunjikar 	uverbs_ufile_uobj_t    *comp_evfile;
170c39526b7SPramod Gunjikar 	uverbs_ufile_uobj_t    *async_evfile;
171c39526b7SPramod Gunjikar 
172c39526b7SPramod Gunjikar 	/*
173c39526b7SPramod Gunjikar 	 * User context can be created for :
174c39526b7SPramod Gunjikar 	 *	1. All Verbs API
175c39526b7SPramod Gunjikar 	 *	2. For getting a file for async events.
176c39526b7SPramod Gunjikar 	 *	3. For getting a file for completion events.
177c39526b7SPramod Gunjikar 	 * For (1) - pointers to (2) & (3) will be updated. For (2) and (3)
178c39526b7SPramod Gunjikar 	 * pointer to (1) will be maintained.
179c39526b7SPramod Gunjikar 	 */
180c39526b7SPramod Gunjikar 	uint16_t		uctxt_type;
181c39526b7SPramod Gunjikar 	uint32_t		uctxt_verbs_id;
182c39526b7SPramod Gunjikar 	uint32_t		uctxt_async_id;
183c39526b7SPramod Gunjikar 	uint32_t		uctxt_comp_id;
184c39526b7SPramod Gunjikar 	uint8_t			uctxt_free_pending;
185c39526b7SPramod Gunjikar } uverbs_uctxt_uobj_t;
186c39526b7SPramod Gunjikar 
187c39526b7SPramod Gunjikar /*
188c39526b7SPramod Gunjikar  * User PD objects created at PD allocation
189c39526b7SPramod Gunjikar  */
190c39526b7SPramod Gunjikar typedef struct uverbs_upd_uobj {
191c39526b7SPramod Gunjikar 	sol_ofs_uobj_t		uobj;
192c39526b7SPramod Gunjikar 	ibt_pd_hdl_t		pd;
193c39526b7SPramod Gunjikar 	genlist_entry_t		*list_entry;	/* per user ctx list entry */
194c39526b7SPramod Gunjikar 	uint32_t		active_qp_cnt;
195c39526b7SPramod Gunjikar 	uint8_t			free_pending;
196c39526b7SPramod Gunjikar } uverbs_upd_uobj_t;
197c39526b7SPramod Gunjikar 
198c39526b7SPramod Gunjikar /*
199c39526b7SPramod Gunjikar  * User MR objects created at MR registration
200c39526b7SPramod Gunjikar  */
201c39526b7SPramod Gunjikar typedef struct uverbs_umr_uobj {
202c39526b7SPramod Gunjikar 	sol_ofs_uobj_t	uobj;
203c39526b7SPramod Gunjikar 	ibt_mr_hdl_t	mr;
204c39526b7SPramod Gunjikar 	genlist_entry_t	*list_entry;	/* per user ctx list entry */
205c39526b7SPramod Gunjikar } uverbs_umr_uobj_t;
206c39526b7SPramod Gunjikar 
207c39526b7SPramod Gunjikar /*
208c39526b7SPramod Gunjikar  * User CQ objects created at CQ allocation
209c39526b7SPramod Gunjikar  */
210c39526b7SPramod Gunjikar typedef struct uverbs_ucq_uobj {
211c39526b7SPramod Gunjikar 	sol_ofs_uobj_t		uobj;
212c39526b7SPramod Gunjikar 	ibt_cq_hdl_t		cq;
213c39526b7SPramod Gunjikar 	genlist_entry_t		*list_entry;	/* per user ctx list entry */
214c39526b7SPramod Gunjikar 	uverbs_uctxt_uobj_t	*uctxt;
215c39526b7SPramod Gunjikar 	uverbs_ufile_uobj_t	*comp_chan;
216c39526b7SPramod Gunjikar 	uint32_t		comp_events_reported;
217c39526b7SPramod Gunjikar 	uint32_t		async_events_reported;
218c39526b7SPramod Gunjikar 	llist_head_t		async_list;
219c39526b7SPramod Gunjikar 	llist_head_t		comp_list;
220c39526b7SPramod Gunjikar 	uint32_t		active_qp_cnt;
221c39526b7SPramod Gunjikar 	uint8_t			free_pending;
222c39526b7SPramod Gunjikar } uverbs_ucq_uobj_t;
223c39526b7SPramod Gunjikar 
224c39526b7SPramod Gunjikar /*
225c39526b7SPramod Gunjikar  * User Shared Receive CQ objects created at SRQ allocation
226c39526b7SPramod Gunjikar  */
227c39526b7SPramod Gunjikar typedef struct uverbs_usrq_uobj {
228c39526b7SPramod Gunjikar 	sol_ofs_uobj_t		uobj;
229c39526b7SPramod Gunjikar 	ibt_srq_hdl_t		srq;
230c39526b7SPramod Gunjikar 	genlist_entry_t		*list_entry;	/* per user ctx list entry */
231c39526b7SPramod Gunjikar 	uverbs_uctxt_uobj_t	*uctxt;
232c39526b7SPramod Gunjikar 	uint32_t		async_events_reported;
233c39526b7SPramod Gunjikar 	llist_head_t		async_list;
234c39526b7SPramod Gunjikar 	uint32_t		active_qp_cnt;
235c39526b7SPramod Gunjikar 	uint8_t			free_pending;
236c39526b7SPramod Gunjikar } uverbs_usrq_uobj_t;
237c39526b7SPramod Gunjikar 
238c39526b7SPramod Gunjikar /*
239c39526b7SPramod Gunjikar  * User address handle objects created at AH allocation
240c39526b7SPramod Gunjikar  */
241c39526b7SPramod Gunjikar typedef struct uverbs_uah_uobj {
242c39526b7SPramod Gunjikar 	sol_ofs_uobj_t	uobj;
243c39526b7SPramod Gunjikar 	ibt_ah_hdl_t	ah;
244c39526b7SPramod Gunjikar 	genlist_entry_t	*list_entry;	/* per user ctx list entry */
245c39526b7SPramod Gunjikar } uverbs_uah_uobj_t;
246c39526b7SPramod Gunjikar 
247c39526b7SPramod Gunjikar /*
248c39526b7SPramod Gunjikar  * User QP objects created at QP allocation
249c39526b7SPramod Gunjikar  */
250c39526b7SPramod Gunjikar #define	SOL_UVERBS_UQP_RCQ_VALID	0x01
251c39526b7SPramod Gunjikar #define	SOL_UVERBS_UQP_SRQ_VALID	0x02
252c39526b7SPramod Gunjikar 
253c39526b7SPramod Gunjikar typedef struct uverbs_uqp_uobj {
254c39526b7SPramod Gunjikar 	sol_ofs_uobj_t			uobj;
255c39526b7SPramod Gunjikar 	ibt_qp_hdl_t			qp;
256c39526b7SPramod Gunjikar 	genlist_entry_t			*list_entry;	/* per uctx list */
257c39526b7SPramod Gunjikar 	uint32_t			max_inline_data;
258c39526b7SPramod Gunjikar 	uverbs_uctxt_uobj_t		*uctxt;
259c39526b7SPramod Gunjikar 	uint32_t			qp_num;		/* 24 bits valid */
260c39526b7SPramod Gunjikar 	uint32_t			disable_qp_mod;
261c39526b7SPramod Gunjikar 	enum ib_qp_type			ofa_qp_type;
262c39526b7SPramod Gunjikar 	llist_head_t			mcast_list;
263c39526b7SPramod Gunjikar 	llist_head_t			async_list;
264c39526b7SPramod Gunjikar 	uint32_t			async_events_reported;
265c39526b7SPramod Gunjikar 	uverbs_ucq_uobj_t		*uqp_rcq;
266c39526b7SPramod Gunjikar 	uverbs_ucq_uobj_t		*uqp_scq;
267c39526b7SPramod Gunjikar 
268c39526b7SPramod Gunjikar 	uint32_t			uqp_pd_hdl;
269c39526b7SPramod Gunjikar 	uint32_t			uqp_scq_hdl;
270c39526b7SPramod Gunjikar 	uint32_t			uqp_rcq_hdl;
271c39526b7SPramod Gunjikar 	uint32_t			uqp_srq_hdl;
272c39526b7SPramod Gunjikar 	uint8_t				uqp_rcq_srq_valid;
273c39526b7SPramod Gunjikar 
274c39526b7SPramod Gunjikar 	sol_uverbs_qp_free_state_t	uqp_free_state;
275c39526b7SPramod Gunjikar } uverbs_uqp_uobj_t;
276c39526b7SPramod Gunjikar 
277c39526b7SPramod Gunjikar extern sol_ofs_uobj_table_t uverbs_uctxt_uo_tbl;
278c39526b7SPramod Gunjikar extern sol_ofs_uobj_table_t uverbs_upd_uo_tbl;
279c39526b7SPramod Gunjikar extern sol_ofs_uobj_table_t uverbs_uah_uo_tbl;
280c39526b7SPramod Gunjikar extern sol_ofs_uobj_table_t uverbs_umr_uo_tbl;
281c39526b7SPramod Gunjikar extern sol_ofs_uobj_table_t uverbs_ucq_uo_tbl;
282c39526b7SPramod Gunjikar extern sol_ofs_uobj_table_t uverbs_usrq_uo_tbl;
283c39526b7SPramod Gunjikar extern sol_ofs_uobj_table_t uverbs_uqp_uo_tbl;
284c39526b7SPramod Gunjikar extern sol_ofs_uobj_table_t uverbs_ufile_uo_tbl;
285c39526b7SPramod Gunjikar 
286c39526b7SPramod Gunjikar /*
287c39526b7SPramod Gunjikar  * The following structure is used currently to pass data back to
288c39526b7SPramod Gunjikar  * libmthca on user allocation context.  This should be passed opaquely
289c39526b7SPramod Gunjikar  * to maintain a true hal, we'll look for a generic way to get this information
290c39526b7SPramod Gunjikar  * and deliver it opaquely post EA-1.
291c39526b7SPramod Gunjikar  */
292c39526b7SPramod Gunjikar struct mthca_alloc_ucontext_resp {
293c39526b7SPramod Gunjikar 	uint32_t	qp_tab_size;
294c39526b7SPramod Gunjikar 	uint32_t	uarc_size;
295c39526b7SPramod Gunjikar };
296c39526b7SPramod Gunjikar 
297c39526b7SPramod Gunjikar struct ib_udata {
298c39526b7SPramod Gunjikar 	void	*inbuf;
299c39526b7SPramod Gunjikar 	void	*outbuf;
300c39526b7SPramod Gunjikar 	size_t	inlen;
301c39526b7SPramod Gunjikar 	size_t	outlen;
302c39526b7SPramod Gunjikar };
303c39526b7SPramod Gunjikar 
304c39526b7SPramod Gunjikar int sol_uverbs_dummy_command(uverbs_uctxt_uobj_t *uctxt, char *buf,
305c39526b7SPramod Gunjikar     int in_len, int out_len);
306c39526b7SPramod Gunjikar int sol_uverbs_get_context(uverbs_uctxt_uobj_t *uctxt, char *buf, int in_len,
307c39526b7SPramod Gunjikar     int out_len);
308c39526b7SPramod Gunjikar int sol_uverbs_alloc_pd(uverbs_uctxt_uobj_t *uctxt, char *buf, int in_len,
309c39526b7SPramod Gunjikar     int out_len);
310c39526b7SPramod Gunjikar int sol_uverbs_dealloc_pd(uverbs_uctxt_uobj_t *uctxt, char *buf, int in_len,
311c39526b7SPramod Gunjikar     int out_len);
312c39526b7SPramod Gunjikar int sol_uverbs_create_ah(uverbs_uctxt_uobj_t *uctxt, char *buf, int in_len,
313c39526b7SPramod Gunjikar     int out_len);
314c39526b7SPramod Gunjikar int sol_uverbs_destroy_ah(uverbs_uctxt_uobj_t *uctxt, char *buf, int in_len,
315c39526b7SPramod Gunjikar     int out_len);
316c39526b7SPramod Gunjikar int sol_uverbs_query_device(uverbs_uctxt_uobj_t *uctxt, char *buf, int in_len,
317c39526b7SPramod Gunjikar     int out_len);
318c39526b7SPramod Gunjikar int sol_uverbs_query_port(uverbs_uctxt_uobj_t *uctxt, char *buf, int in_len,
319c39526b7SPramod Gunjikar     int out_len);
320c39526b7SPramod Gunjikar int sol_uverbs_query_gid(uverbs_uctxt_uobj_t *uctxt, char *buf, int in_len,
321c39526b7SPramod Gunjikar     int out_len);
322c39526b7SPramod Gunjikar int sol_uverbs_query_pkey(uverbs_uctxt_uobj_t *uctxt, char *buf, int in_len,
323c39526b7SPramod Gunjikar     int out_len);
324c39526b7SPramod Gunjikar int sol_uverbs_reg_mr(uverbs_uctxt_uobj_t *uctxt, char *buf, int in_len,
325c39526b7SPramod Gunjikar     int out_len);
326c39526b7SPramod Gunjikar int sol_uverbs_dereg_mr(uverbs_uctxt_uobj_t *uctxt, char *buf, int in_len,
327c39526b7SPramod Gunjikar     int out_len);
328c39526b7SPramod Gunjikar int sol_uverbs_create_comp_channel(uverbs_uctxt_uobj_t *uctxt, char *buf,
329c39526b7SPramod Gunjikar     int in_len, int out_len);
330c39526b7SPramod Gunjikar 
331c39526b7SPramod Gunjikar uint32_t
332c39526b7SPramod Gunjikar sol_uverbs_ibt_to_of_device_cap_flags(ibt_hca_flags_t flags,
333c39526b7SPramod Gunjikar     ibt_hca_flags2_t flags2);
334c39526b7SPramod Gunjikar 
335c39526b7SPramod Gunjikar uint64_t
336c39526b7SPramod Gunjikar sol_uverbs_ibt_to_of_page_sz(ibt_page_sizes_t page_szs);
337c39526b7SPramod Gunjikar 
338c39526b7SPramod Gunjikar int sol_uverbs_ibt_to_kernel_status(ibt_status_t  status);
339c39526b7SPramod Gunjikar uint32_t sol_uverbs_qpnum2uqpid(uint32_t qp_num);
340c39526b7SPramod Gunjikar 
341c39526b7SPramod Gunjikar int uverbs_upd_free(uverbs_upd_uobj_t *, uverbs_uctxt_uobj_t *);
342c39526b7SPramod Gunjikar int uverbs_uqp_free(uverbs_uqp_uobj_t *, uverbs_uctxt_uobj_t *);
343c39526b7SPramod Gunjikar int uverbs_usrq_free(uverbs_usrq_uobj_t *, uverbs_uctxt_uobj_t *);
344c39526b7SPramod Gunjikar int uverbs_ucq_free(uverbs_ucq_uobj_t *, uverbs_uctxt_uobj_t *);
345c39526b7SPramod Gunjikar 
346c39526b7SPramod Gunjikar /*
347c39526b7SPramod Gunjikar  * The following helpers simply provide easy access for acquiring and locking
348c39526b7SPramod Gunjikar  * User Objects.
349c39526b7SPramod Gunjikar  */
350c39526b7SPramod Gunjikar static inline uverbs_uctxt_uobj_t *
uverbs_uobj_get_uctxt_read(uint32_t id)351c39526b7SPramod Gunjikar uverbs_uobj_get_uctxt_read(uint32_t id)
352c39526b7SPramod Gunjikar {
353c39526b7SPramod Gunjikar 	return (uverbs_uctxt_uobj_t *)
354c39526b7SPramod Gunjikar 	    sol_ofs_uobj_get_read(&uverbs_uctxt_uo_tbl, id);
355c39526b7SPramod Gunjikar }
356c39526b7SPramod Gunjikar static inline uverbs_uctxt_uobj_t *
uverbs_uobj_get_uctxt_write(uint32_t id)357c39526b7SPramod Gunjikar uverbs_uobj_get_uctxt_write(uint32_t id)
358c39526b7SPramod Gunjikar {
359c39526b7SPramod Gunjikar 	return (uverbs_uctxt_uobj_t *)
360c39526b7SPramod Gunjikar 	    sol_ofs_uobj_get_write(&uverbs_uctxt_uo_tbl, id);
361c39526b7SPramod Gunjikar }
362c39526b7SPramod Gunjikar static inline uverbs_upd_uobj_t *
uverbs_uobj_get_upd_read(uint32_t id)363c39526b7SPramod Gunjikar uverbs_uobj_get_upd_read(uint32_t id)
364c39526b7SPramod Gunjikar {
365c39526b7SPramod Gunjikar 	return (uverbs_upd_uobj_t *)
366c39526b7SPramod Gunjikar 	    sol_ofs_uobj_get_read(&uverbs_upd_uo_tbl, id);
367c39526b7SPramod Gunjikar }
368c39526b7SPramod Gunjikar static inline uverbs_upd_uobj_t *
uverbs_uobj_get_upd_write(uint32_t id)369c39526b7SPramod Gunjikar uverbs_uobj_get_upd_write(uint32_t id)
370c39526b7SPramod Gunjikar {
371c39526b7SPramod Gunjikar 	return (uverbs_upd_uobj_t *)
372c39526b7SPramod Gunjikar 	    sol_ofs_uobj_get_write(&uverbs_upd_uo_tbl, id);
373c39526b7SPramod Gunjikar }
374c39526b7SPramod Gunjikar static inline uverbs_umr_uobj_t *
uverbs_uobj_get_umr_read(uint32_t id)375c39526b7SPramod Gunjikar uverbs_uobj_get_umr_read(uint32_t id)
376c39526b7SPramod Gunjikar {
377c39526b7SPramod Gunjikar 	return (uverbs_umr_uobj_t *)
378c39526b7SPramod Gunjikar 	    sol_ofs_uobj_get_read(&uverbs_umr_uo_tbl, id);
379c39526b7SPramod Gunjikar }
380c39526b7SPramod Gunjikar static inline uverbs_umr_uobj_t *
uverbs_uobj_get_umr_write(uint32_t id)381c39526b7SPramod Gunjikar uverbs_uobj_get_umr_write(uint32_t id)
382c39526b7SPramod Gunjikar {
383c39526b7SPramod Gunjikar 	return (uverbs_umr_uobj_t *)
384c39526b7SPramod Gunjikar 	    sol_ofs_uobj_get_write(&uverbs_umr_uo_tbl, id);
385c39526b7SPramod Gunjikar }
386c39526b7SPramod Gunjikar static inline uverbs_ucq_uobj_t *
uverbs_uobj_get_ucq_read(uint32_t id)387c39526b7SPramod Gunjikar uverbs_uobj_get_ucq_read(uint32_t id)
388c39526b7SPramod Gunjikar {
389c39526b7SPramod Gunjikar 	return (uverbs_ucq_uobj_t *)
390c39526b7SPramod Gunjikar 	    sol_ofs_uobj_get_read(&uverbs_ucq_uo_tbl, id);
391c39526b7SPramod Gunjikar }
392c39526b7SPramod Gunjikar static inline uverbs_ucq_uobj_t *
uverbs_uobj_get_ucq_write(uint32_t id)393c39526b7SPramod Gunjikar uverbs_uobj_get_ucq_write(uint32_t id)
394c39526b7SPramod Gunjikar {
395c39526b7SPramod Gunjikar 	return (uverbs_ucq_uobj_t *)
396c39526b7SPramod Gunjikar 	    sol_ofs_uobj_get_write(&uverbs_ucq_uo_tbl, (int)id);
397c39526b7SPramod Gunjikar }
398c39526b7SPramod Gunjikar static inline uverbs_usrq_uobj_t *
uverbs_uobj_get_usrq_read(uint32_t id)399c39526b7SPramod Gunjikar uverbs_uobj_get_usrq_read(uint32_t id)
400c39526b7SPramod Gunjikar {
401c39526b7SPramod Gunjikar 	return (uverbs_usrq_uobj_t *)
402c39526b7SPramod Gunjikar 	    sol_ofs_uobj_get_read(&uverbs_usrq_uo_tbl, id);
403c39526b7SPramod Gunjikar }
404c39526b7SPramod Gunjikar static inline uverbs_usrq_uobj_t *
uverbs_uobj_get_usrq_write(uint32_t id)405c39526b7SPramod Gunjikar uverbs_uobj_get_usrq_write(uint32_t id)
406c39526b7SPramod Gunjikar {
407c39526b7SPramod Gunjikar 	return (uverbs_usrq_uobj_t *)
408c39526b7SPramod Gunjikar 	    sol_ofs_uobj_get_write(&uverbs_usrq_uo_tbl, id);
409c39526b7SPramod Gunjikar }
410c39526b7SPramod Gunjikar static inline uverbs_uah_uobj_t *
uverbs_uobj_get_uah_read(uint32_t id)411c39526b7SPramod Gunjikar uverbs_uobj_get_uah_read(uint32_t id)
412c39526b7SPramod Gunjikar {
413c39526b7SPramod Gunjikar 	return (uverbs_uah_uobj_t *)
414c39526b7SPramod Gunjikar 	    sol_ofs_uobj_get_read(&uverbs_uah_uo_tbl, id);
415c39526b7SPramod Gunjikar }
416c39526b7SPramod Gunjikar static inline uverbs_uah_uobj_t *
uverbs_uobj_get_uah_write(uint32_t id)417c39526b7SPramod Gunjikar uverbs_uobj_get_uah_write(uint32_t id)
418c39526b7SPramod Gunjikar {
419c39526b7SPramod Gunjikar 	return (uverbs_uah_uobj_t *)
420c39526b7SPramod Gunjikar 	    sol_ofs_uobj_get_write(&uverbs_uah_uo_tbl, id);
421c39526b7SPramod Gunjikar }
422c39526b7SPramod Gunjikar static inline uverbs_uqp_uobj_t *
uverbs_uobj_get_uqp_read(uint32_t id)423c39526b7SPramod Gunjikar uverbs_uobj_get_uqp_read(uint32_t id)
424c39526b7SPramod Gunjikar {
425c39526b7SPramod Gunjikar 	return (uverbs_uqp_uobj_t *)
426c39526b7SPramod Gunjikar 	    sol_ofs_uobj_get_read(&uverbs_uqp_uo_tbl, id);
427c39526b7SPramod Gunjikar }
428c39526b7SPramod Gunjikar static inline uverbs_uqp_uobj_t *
uverbs_uobj_get_uqp_write(uint32_t id)429c39526b7SPramod Gunjikar uverbs_uobj_get_uqp_write(uint32_t id)
430c39526b7SPramod Gunjikar {
431c39526b7SPramod Gunjikar 	return (uverbs_uqp_uobj_t *)
432c39526b7SPramod Gunjikar 	    sol_ofs_uobj_get_write(&uverbs_uqp_uo_tbl, id);
433c39526b7SPramod Gunjikar }
434c39526b7SPramod Gunjikar 
435c39526b7SPramod Gunjikar #ifdef __cplusplus
436c39526b7SPramod Gunjikar }
437c39526b7SPramod Gunjikar #endif
438c39526b7SPramod Gunjikar #endif /* _SYS_IB_CLIENTS_OF_SOL_UVERBS_SOL_UVERBS_H */
439