1*c39526b7SPramod Gunjikar /*
2*c39526b7SPramod Gunjikar  * CDDL HEADER START
3*c39526b7SPramod Gunjikar  *
4*c39526b7SPramod Gunjikar  * The contents of this file are subject to the terms of the
5*c39526b7SPramod Gunjikar  * Common Development and Distribution License (the "License").
6*c39526b7SPramod Gunjikar  * You may not use this file except in compliance with the License.
7*c39526b7SPramod Gunjikar  *
8*c39526b7SPramod Gunjikar  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*c39526b7SPramod Gunjikar  * or http://www.opensolaris.org/os/licensing.
10*c39526b7SPramod Gunjikar  * See the License for the specific language governing permissions
11*c39526b7SPramod Gunjikar  * and limitations under the License.
12*c39526b7SPramod Gunjikar  *
13*c39526b7SPramod Gunjikar  * When distributing Covered Code, include this CDDL HEADER in each
14*c39526b7SPramod Gunjikar  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*c39526b7SPramod Gunjikar  * If applicable, add the following below this CDDL HEADER, with the
16*c39526b7SPramod Gunjikar  * fields enclosed by brackets "[]" replaced with your own identifying
17*c39526b7SPramod Gunjikar  * information: Portions Copyright [yyyy] [name of copyright owner]
18*c39526b7SPramod Gunjikar  *
19*c39526b7SPramod Gunjikar  * CDDL HEADER END
20*c39526b7SPramod Gunjikar  */
21*c39526b7SPramod Gunjikar 
22*c39526b7SPramod Gunjikar /*
23*c39526b7SPramod Gunjikar  * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
24*c39526b7SPramod Gunjikar  */
25*c39526b7SPramod Gunjikar 
26*c39526b7SPramod Gunjikar /*
27*c39526b7SPramod Gunjikar  * This header file contains definations for utility routines
28*c39526b7SPramod Gunjikar  * which can be used by all Solaris OFUV related kernel drivers
29*c39526b7SPramod Gunjikar  * and misc modules. The kernel modules using these APIs, should
30*c39526b7SPramod Gunjikar  * load sol_ofs using :
31*c39526b7SPramod Gunjikar  *	ld -r -N misc/sol_ofs
32*c39526b7SPramod Gunjikar  *
33*c39526b7SPramod Gunjikar  * The APIs defined are :
34*c39526b7SPramod Gunjikar  *	1. User Objects
35*c39526b7SPramod Gunjikar  *	2. Linked Lists
36*c39526b7SPramod Gunjikar  *	3. Debug Routines
37*c39526b7SPramod Gunjikar  */
38*c39526b7SPramod Gunjikar #ifndef	_SYS_IB_CLIENTS_OF_SOL_OFS_SOL_OFS_COMMON_H
39*c39526b7SPramod Gunjikar #define	_SYS_IB_CLIENTS_OF_SOL_OFS_SOL_OFS_COMMON_H
40*c39526b7SPramod Gunjikar 
41*c39526b7SPramod Gunjikar #ifdef __cplusplus
42*c39526b7SPramod Gunjikar extern "C" {
43*c39526b7SPramod Gunjikar #endif
44*c39526b7SPramod Gunjikar 
45*c39526b7SPramod Gunjikar #include <sys/types.h>
46*c39526b7SPramod Gunjikar #include <sys/ksynch.h>
47*c39526b7SPramod Gunjikar 
48*c39526b7SPramod Gunjikar /*
49*c39526b7SPramod Gunjikar  * User Objects functions and structures.
50*c39526b7SPramod Gunjikar  */
51*c39526b7SPramod Gunjikar typedef enum {
52*c39526b7SPramod Gunjikar 	/* User objects for sol_uverbs driver */
53*c39526b7SPramod Gunjikar 	SOL_UVERBS_UCTXT_UOBJ_TYPE	= 0,
54*c39526b7SPramod Gunjikar 	SOL_UVERBS_UPD_UOBJ_TYPE,
55*c39526b7SPramod Gunjikar 	SOL_UVERBS_UAH_UOBJ_TYPE,
56*c39526b7SPramod Gunjikar 	SOL_UVERBS_UMR_UOBJ_TYPE,
57*c39526b7SPramod Gunjikar 	SOL_UVERBS_UCQ_UOBJ_TYPE,
58*c39526b7SPramod Gunjikar 	SOL_UVERBS_USRQ_UOBJ_TYPE,
59*c39526b7SPramod Gunjikar 	SOL_UVERBS_UQP_UOBJ_TYPE,
60*c39526b7SPramod Gunjikar 	SOL_UVERBS_UFILE_UOBJ_TYPE,
61*c39526b7SPramod Gunjikar 
62*c39526b7SPramod Gunjikar 	/* User Objects for sol_ucma driver */
63*c39526b7SPramod Gunjikar 	SOL_UCMA_EVT_FILE_TYPE,
64*c39526b7SPramod Gunjikar 	SOL_UCMA_CM_ID_TYPE,
65*c39526b7SPramod Gunjikar 	SOL_UCMA_MCAST_TYPE
66*c39526b7SPramod Gunjikar } sol_ofs_uobj_type_t;
67*c39526b7SPramod Gunjikar 
68*c39526b7SPramod Gunjikar typedef struct {
69*c39526b7SPramod Gunjikar 	uint64_t		uo_user_handle;
70*c39526b7SPramod Gunjikar 	sol_ofs_uobj_type_t	uo_type;
71*c39526b7SPramod Gunjikar 	krwlock_t		uo_lock;
72*c39526b7SPramod Gunjikar 	uint32_t		uo_id;
73*c39526b7SPramod Gunjikar 	kmutex_t		uo_reflock;
74*c39526b7SPramod Gunjikar 	uint32_t		uo_refcnt;
75*c39526b7SPramod Gunjikar 	uint32_t		uo_live;
76*c39526b7SPramod Gunjikar 	size_t			uo_uobj_sz;
77*c39526b7SPramod Gunjikar } sol_ofs_uobj_t;
78*c39526b7SPramod Gunjikar 
79*c39526b7SPramod Gunjikar /*
80*c39526b7SPramod Gunjikar  * Objects are maintained in tables that allow an easy table ID to User Object
81*c39526b7SPramod Gunjikar  * mapping and can grow as resources are created.
82*c39526b7SPramod Gunjikar  */
83*c39526b7SPramod Gunjikar #define	SOL_OFS_UO_BLKSZ	16
84*c39526b7SPramod Gunjikar 
85*c39526b7SPramod Gunjikar typedef struct {
86*c39526b7SPramod Gunjikar 	int		ofs_uo_blk_avail;
87*c39526b7SPramod Gunjikar 	sol_ofs_uobj_t	*ofs_uoblk_blks[SOL_OFS_UO_BLKSZ];
88*c39526b7SPramod Gunjikar } sol_ofs_uobj_blk_t;
89*c39526b7SPramod Gunjikar 
90*c39526b7SPramod Gunjikar typedef struct {
91*c39526b7SPramod Gunjikar 	krwlock_t		uobj_tbl_lock;
92*c39526b7SPramod Gunjikar 	int			uobj_tbl_used_blks;
93*c39526b7SPramod Gunjikar 	uint_t			uobj_tbl_num_blks;
94*c39526b7SPramod Gunjikar 	size_t			uobj_tbl_uo_sz;
95*c39526b7SPramod Gunjikar 	int			uobj_tbl_uo_cnt;
96*c39526b7SPramod Gunjikar 	sol_ofs_uobj_blk_t	**uobj_tbl_uo_root;
97*c39526b7SPramod Gunjikar } sol_ofs_uobj_table_t;
98*c39526b7SPramod Gunjikar 
99*c39526b7SPramod Gunjikar /* User object table management routines */
100*c39526b7SPramod Gunjikar void sol_ofs_uobj_tbl_init(sol_ofs_uobj_table_t *, size_t);
101*c39526b7SPramod Gunjikar void sol_ofs_uobj_tbl_fini(sol_ofs_uobj_table_t *);
102*c39526b7SPramod Gunjikar 
103*c39526b7SPramod Gunjikar void sol_ofs_uobj_init(sol_ofs_uobj_t *, uint64_t, sol_ofs_uobj_type_t);
104*c39526b7SPramod Gunjikar void sol_ofs_uobj_ref(sol_ofs_uobj_t *);
105*c39526b7SPramod Gunjikar void sol_ofs_uobj_deref(sol_ofs_uobj_t *,
106*c39526b7SPramod Gunjikar void (*free_func)(sol_ofs_uobj_t *));
107*c39526b7SPramod Gunjikar void sol_ofs_uobj_put(sol_ofs_uobj_t *);
108*c39526b7SPramod Gunjikar void sol_ofs_uobj_free(sol_ofs_uobj_t *uobj);
109*c39526b7SPramod Gunjikar 
110*c39526b7SPramod Gunjikar int sol_ofs_uobj_add(sol_ofs_uobj_table_t *, sol_ofs_uobj_t *);
111*c39526b7SPramod Gunjikar sol_ofs_uobj_t	*sol_ofs_uobj_remove(sol_ofs_uobj_table_t *,
112*c39526b7SPramod Gunjikar     sol_ofs_uobj_t *);
113*c39526b7SPramod Gunjikar sol_ofs_uobj_t	*sol_ofs_uobj_get_read(sol_ofs_uobj_table_t *, uint32_t);
114*c39526b7SPramod Gunjikar sol_ofs_uobj_t	*sol_ofs_uobj_get_write(sol_ofs_uobj_table_t *, uint32_t);
115*c39526b7SPramod Gunjikar 
116*c39526b7SPramod Gunjikar /*
117*c39526b7SPramod Gunjikar  * Generic linked list management functions
118*c39526b7SPramod Gunjikar  */
119*c39526b7SPramod Gunjikar typedef uchar_t		bool;
120*c39526b7SPramod Gunjikar #define	FALSE		0
121*c39526b7SPramod Gunjikar #define	TRUE		1
122*c39526b7SPramod Gunjikar #define	INVALID_HANDLE	0xFFFFFFFF
123*c39526b7SPramod Gunjikar #define	MAX_HASH_SIZE	1024
124*c39526b7SPramod Gunjikar 
125*c39526b7SPramod Gunjikar /*
126*c39526b7SPramod Gunjikar  * Simple doubly linked list for opaque addresses.  Protection must occur
127*c39526b7SPramod Gunjikar  * outside of the list.  These behavior very much like the linux kernel
128*c39526b7SPramod Gunjikar  * lists, hence the familiar look of the API; but note there are
129*c39526b7SPramod Gunjikar  * some signficant differences, mainly the list header is not embedded
130*c39526b7SPramod Gunjikar  * in the element, so the container (typeof) constructs are not required.
131*c39526b7SPramod Gunjikar  */
132*c39526b7SPramod Gunjikar typedef struct llist_head {
133*c39526b7SPramod Gunjikar 	struct llist_head	*prv;
134*c39526b7SPramod Gunjikar 	struct llist_head	*nxt;
135*c39526b7SPramod Gunjikar 	void			*ptr;
136*c39526b7SPramod Gunjikar } llist_head_t;
137*c39526b7SPramod Gunjikar 
138*c39526b7SPramod Gunjikar 
139*c39526b7SPramod Gunjikar #define	LLIST_HEAD_INIT(x) { &(x), &(x), NULL }
140*c39526b7SPramod Gunjikar 
llist_head_init(llist_head_t * list,void * ptr)141*c39526b7SPramod Gunjikar static inline void llist_head_init(llist_head_t *list, void *ptr)
142*c39526b7SPramod Gunjikar {
143*c39526b7SPramod Gunjikar 	list->prv = list->nxt = list;
144*c39526b7SPramod Gunjikar 	list->ptr = ptr;
145*c39526b7SPramod Gunjikar }
146*c39526b7SPramod Gunjikar 
__llist_add(llist_head_t * new,llist_head_t * prv,llist_head_t * nxt)147*c39526b7SPramod Gunjikar static inline void __llist_add(llist_head_t  *new, llist_head_t  *prv,
148*c39526b7SPramod Gunjikar 							llist_head_t  *nxt)
149*c39526b7SPramod Gunjikar {
150*c39526b7SPramod Gunjikar 	nxt->prv   = new;
151*c39526b7SPramod Gunjikar 	new->nxt   = nxt;
152*c39526b7SPramod Gunjikar 	new->prv   = prv;
153*c39526b7SPramod Gunjikar 	prv->nxt   = new;
154*c39526b7SPramod Gunjikar }
llist_add(llist_head_t * new,llist_head_t * head)155*c39526b7SPramod Gunjikar static inline void llist_add(llist_head_t *new, llist_head_t *head)
156*c39526b7SPramod Gunjikar {
157*c39526b7SPramod Gunjikar 	__llist_add(new, head, head->nxt);
158*c39526b7SPramod Gunjikar }
159*c39526b7SPramod Gunjikar 
llist_add_tail(llist_head_t * new,llist_head_t * head)160*c39526b7SPramod Gunjikar static inline void llist_add_tail(llist_head_t *new, llist_head_t *head)
161*c39526b7SPramod Gunjikar {
162*c39526b7SPramod Gunjikar 	__llist_add(new, head->prv, head);
163*c39526b7SPramod Gunjikar }
164*c39526b7SPramod Gunjikar 
llist_del(llist_head_t * entry)165*c39526b7SPramod Gunjikar static inline void llist_del(llist_head_t *entry)
166*c39526b7SPramod Gunjikar {
167*c39526b7SPramod Gunjikar 	entry->nxt->prv = entry->prv;
168*c39526b7SPramod Gunjikar 	entry->prv->nxt = entry->nxt;
169*c39526b7SPramod Gunjikar }
170*c39526b7SPramod Gunjikar 
llist_is_last(llist_head_t * list,llist_head_t * head)171*c39526b7SPramod Gunjikar static inline int llist_is_last(llist_head_t *list, llist_head_t *head)
172*c39526b7SPramod Gunjikar {
173*c39526b7SPramod Gunjikar 	return (list->nxt == head);
174*c39526b7SPramod Gunjikar }
175*c39526b7SPramod Gunjikar 
llist_empty(llist_head_t * head)176*c39526b7SPramod Gunjikar static inline int llist_empty(llist_head_t *head)
177*c39526b7SPramod Gunjikar {
178*c39526b7SPramod Gunjikar 	return (head->nxt == head);
179*c39526b7SPramod Gunjikar }
180*c39526b7SPramod Gunjikar 
181*c39526b7SPramod Gunjikar #define	list_for_each(_pos, _head)                 \
182*c39526b7SPramod Gunjikar 	for (_pos = (_head)->nxt; _pos != (_head); _pos = _pos->nxt)
183*c39526b7SPramod Gunjikar #define	list_for_each_safe(_pos, n, _head) \
184*c39526b7SPramod Gunjikar 	for (_pos = (_head)->nxt, n = _pos->nxt; _pos != (_head); \
185*c39526b7SPramod Gunjikar 		_pos = n, n = _pos->nxt)
186*c39526b7SPramod Gunjikar 
187*c39526b7SPramod Gunjikar /*
188*c39526b7SPramod Gunjikar  * Doubly linked per user context IB resource list definitions
189*c39526b7SPramod Gunjikar  * Protection must occur * outside of the list.
190*c39526b7SPramod Gunjikar  */
191*c39526b7SPramod Gunjikar typedef struct genlist_entry_s {
192*c39526b7SPramod Gunjikar 	uintptr_t		data;
193*c39526b7SPramod Gunjikar 	void			*data_context;
194*c39526b7SPramod Gunjikar 	struct genlist_entry_s	*next;
195*c39526b7SPramod Gunjikar 	struct genlist_entry_s	*prev;
196*c39526b7SPramod Gunjikar } genlist_entry_t;
197*c39526b7SPramod Gunjikar 
198*c39526b7SPramod Gunjikar typedef struct genlist_s {
199*c39526b7SPramod Gunjikar 	uint32_t	count;
200*c39526b7SPramod Gunjikar 	genlist_entry_t	*head;
201*c39526b7SPramod Gunjikar 	genlist_entry_t	*tail;
202*c39526b7SPramod Gunjikar } genlist_t;
203*c39526b7SPramod Gunjikar 
204*c39526b7SPramod Gunjikar 
205*c39526b7SPramod Gunjikar genlist_entry_t *add_genlist(genlist_t *list, uintptr_t data,
206*c39526b7SPramod Gunjikar     void *data_context);
207*c39526b7SPramod Gunjikar 
208*c39526b7SPramod Gunjikar #define	genlist_for_each(_pos, _head)	\
209*c39526b7SPramod Gunjikar 	for (_pos = (_head)->head; _pos; _pos = _pos->next)
210*c39526b7SPramod Gunjikar 
211*c39526b7SPramod Gunjikar void delete_genlist(genlist_t *list, genlist_entry_t *entry);
212*c39526b7SPramod Gunjikar 
213*c39526b7SPramod Gunjikar genlist_entry_t *remove_genlist_head(genlist_t *list);
214*c39526b7SPramod Gunjikar 
215*c39526b7SPramod Gunjikar void insert_genlist_tail(genlist_t *list, genlist_entry_t *entry);
216*c39526b7SPramod Gunjikar 
217*c39526b7SPramod Gunjikar void flush_genlist(genlist_t *list);
218*c39526b7SPramod Gunjikar 
219*c39526b7SPramod Gunjikar bool genlist_empty(genlist_t *list);
220*c39526b7SPramod Gunjikar 
init_genlist(genlist_t * list)221*c39526b7SPramod Gunjikar static inline void init_genlist(genlist_t *list)
222*c39526b7SPramod Gunjikar {
223*c39526b7SPramod Gunjikar 	list->head = list->tail = NULL;
224*c39526b7SPramod Gunjikar 	list->count = 0;
225*c39526b7SPramod Gunjikar }
226*c39526b7SPramod Gunjikar 
227*c39526b7SPramod Gunjikar 
228*c39526b7SPramod Gunjikar /*
229*c39526b7SPramod Gunjikar  * Debug printfs defines
230*c39526b7SPramod Gunjikar  */
231*c39526b7SPramod Gunjikar void sol_ofs_dprintf_l5(char *name, char *fmt, ...);
232*c39526b7SPramod Gunjikar void sol_ofs_dprintf_l4(char *name, char *fmt, ...);
233*c39526b7SPramod Gunjikar void sol_ofs_dprintf_l3(char *name, char *fmt, ...);
234*c39526b7SPramod Gunjikar void sol_ofs_dprintf_l2(char *name, char *fmt, ...);
235*c39526b7SPramod Gunjikar void sol_ofs_dprintf_l1(char *name, char *fmt, ...);
236*c39526b7SPramod Gunjikar void sol_ofs_dprintf_l0(char *name, char *fmt, ...);
237*c39526b7SPramod Gunjikar 
238*c39526b7SPramod Gunjikar #define	SOL_OFS_DPRINTF_L5	sol_ofs_dprintf_l5
239*c39526b7SPramod Gunjikar #define	SOL_OFS_DPRINTF_L4	sol_ofs_dprintf_l4
240*c39526b7SPramod Gunjikar #define	SOL_OFS_DPRINTF_L3	sol_ofs_dprintf_l3
241*c39526b7SPramod Gunjikar #define	SOL_OFS_DPRINTF_L2	sol_ofs_dprintf_l2
242*c39526b7SPramod Gunjikar #define	SOL_OFS_DPRINTF_L1	sol_ofs_dprintf_l1
243*c39526b7SPramod Gunjikar #define	SOL_OFS_DPRINTF_L0	sol_ofs_dprintf_l0
244*c39526b7SPramod Gunjikar 
245*c39526b7SPramod Gunjikar /* Misc */
246*c39526b7SPramod Gunjikar #define	SOL_OFS_DRV_NAME_LEN	64
247*c39526b7SPramod Gunjikar 
248*c39526b7SPramod Gunjikar #ifdef __cplusplus
249*c39526b7SPramod Gunjikar }
250*c39526b7SPramod Gunjikar #endif
251*c39526b7SPramod Gunjikar 
252*c39526b7SPramod Gunjikar #endif /* _SYS_IB_CLIENTS_OF_SOL_OFS_SOL_OFS_COMMON_H */
253