1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 
22 /*
23  * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
24  */
25 
26 #ifndef _SYS_IB_CLIENTS_OF_SOL_UVERBS_SOL_UVERBS_HCA_H
27 #define	_SYS_IB_CLIENTS_OF_SOL_UVERBS_SOL_UVERBS_HCA_H
28 
29 #ifdef __cplusplus
30 extern "C" {
31 #endif
32 
33 /*
34  *
35  * NAME: sol_uverbs_hca.h
36  *
37  * DESC: Solaris OFED hca management utility.
38  *
39  *	This file implements a very thin layer that provides the OFA user kernel
40  *	agents the ability to operate in the same IBT/HCA domain.  That is all
41  *	of the OFA user space kernel agents share the same IBT client handle,
42  *	opened by the sol_uverbs driver.
43  *
44  */
45 
46 #include <sys/ib/ibtl/ibvti.h>
47 
48 /*
49  * Definitions
50  */
51 
52 /*
53  * Structures
54  */
55 
56 /*
57  * HCA Info.
58  *
59  * Each IBT HCA the sol_uverbs driver knows about is maintained in a
60  * a list that points to IBT handles and the client event handler
61  * callbacks.
62  */
63 typedef struct sol_uverbs_hca {
64 	llist_head_t		list;
65 	llist_head_t		event_handler_list;
66 	kmutex_t		event_handler_lock;
67 	llist_head_t		client_data_list;
68 	kmutex_t		client_data_lock;
69 	ibt_clnt_hdl_t		clnt_hdl;
70 	ib_guid_t		guid;
71 	ibt_hca_hdl_t		hdl;
72 	ibt_hca_attr_t		attr;
73 	uint32_t		nports;
74 	ibt_hca_portinfo_t	*ports;
75 	size_t			pinfosz;
76 } sol_uverbs_hca_t;
77 
78 /*
79  * Client structure passed to Solaris User Verbs to provide addtion and
80  * removal callbacks.  The "add" function will be invoked for each
81  * IBT hca in the system when it is available, the "remove" will be
82  * invoked when an IBT hca is no longer available.
83  */
84 typedef struct sol_uverbs_ib_client {
85 	llist_head_t	list;
86 	char		*name;
87 	void		(*add)(sol_uverbs_hca_t *);
88 	void		(*remove)(sol_uverbs_hca_t *);
89 } sol_uverbs_ib_client_t;
90 
91 /*
92  * Event handler structure passed to Solaris User Verbs hca management
93  * to register an asynchronous event handler for an IBT hca.
94  */
95 typedef struct sol_uverbs_ib_event_handler {
96 	llist_head_t		list;
97 	sol_uverbs_hca_t	*hca;
98 	void			(*handler)(struct sol_uverbs_ib_event_handler *,
99 				ibt_hca_hdl_t hca,
100 				ibt_async_code_t code,
101 				ibt_async_event_t *event);
102 } sol_uverbs_ib_event_handler_t;
103 
104 #define	SOL_UVERBS_INIT_IB_EVENT_HANDLER(_struct_ptr,  _hca_ptr, _func_ptr) \
105 	do {							\
106 		(_struct_ptr)->hca	= _hca_ptr;		\
107 		(_struct_ptr)->handler	= _func_ptr;		\
108 		llist_head_init(&(_struct_ptr)->list, 0);	\
109 	} while (0)
110 
111 /*
112  * Control structures for managmenet of common HCA list.
113  */
114 extern kmutex_t		sol_uverbs_hca_lock;
115 extern llist_head_t	sol_uverbs_hca_list;
116 extern llist_head_t	sol_uverbs_client_list;
117 
118 /*
119  * Functions
120  */
121 /*
122  * sol_uverbs HCA list management and helper sol_uverbs nternal functions.
123  */
124 int  sol_uverbs_common_hca_init();
125 void sol_uverbs_common_hca_fini();
126 sol_uverbs_hca_t *sol_uverbs_ibt_hdl_to_hca(ibt_hca_hdl_t hdl);
127 
128 /*
129  * COMMON HCA CLIENT API - See sol_uverbs_hca.c for complete
130  * function description.
131  */
132 
133 /*
134  * Register for client notifications.  The "add" function pointer
135  * in the client structure will be invoked for each hca in the system, the
136  * "remove" function pointer will be invoked as hca's are no longer
137  * available.
138  */
139 int  sol_uverbs_ib_register_client(sol_uverbs_ib_client_t *client);
140 
141 /*
142  * Unregister for client notifications.
143  */
144 void sol_uverbs_ib_unregister_client(sol_uverbs_ib_client_t *client);
145 
146 /*
147  * Mechanism for client to associate private data with each IBT hca.
148  */
149 void *sol_uverbs_ib_get_client_data(sol_uverbs_hca_t *hca,
150 					sol_uverbs_ib_client_t *client);
151 
152 void sol_uverbs_ib_set_client_data(sol_uverbs_hca_t *hca,
153 	sol_uverbs_ib_client_t *client, void *data);
154 
155 /*
156  * Mechanism for client to register/unregister for asynchronous event callbacks.
157  */
158 int
159 sol_uverbs_ib_register_event_handler(sol_uverbs_ib_event_handler_t *handler);
160 
161 int
162 sol_uverbs_ib_unregister_event_handler(sol_uverbs_ib_event_handler_t *handler);
163 
164 /*
165  * HELPER API provided by sol_uverbs, see sol_uverbs_qp.c for complete
166  * descriptions.
167  */
168 
169 /*
170  * Map a user QP id to an IBT QP Handle.
171  */
172 ibt_qp_hdl_t sol_uverbs_uqpid_to_ibt_handle(uint32_t u_qpid);
173 
174 /*
175  * Inform sol_uverbs to igonore requested modify QP calls for the
176  * specific QP.
177  */
178 int sol_uverbs_disable_user_qp_modify(uint32_t u_qpid);
179 int sol_uverbs_enable_user_qp_modify(uint32_t u_qpid);
180 
181 #ifdef __cplusplus
182 }
183 #endif
184 #endif /* _SYS_IB_CLIENTS_OF_SOL_UVERBS_SOL_UVERBS_HCA_H */
185