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