xref: /illumos-gate/usr/src/uts/common/sys/ib/ibtl/ibvti.h (revision 4f364e7c95ee7fd9d5bbeddc1940e92405bb0e72)
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  * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
23  */
24 
25 #ifndef	_SYS_IB_IBTL_IBVTI_H
26 #define	_SYS_IB_IBTL_IBVTI_H
27 
28 /*
29  * ibvti.h
30  *
31  * This file contains private verbs level transport interface extensions.
32  */
33 #include <sys/ib/ibtl/ibti_common.h>
34 #include <sys/ib/ibtl/ibtl_ci_types.h>
35 
36 #ifdef __cplusplus
37 extern "C" {
38 #endif
39 
40 #define	IBT_CM_NO_QP		IBT_CM_NO_CHAN		/* ibt_cm_reason_t */
41 
42 #define	IBT_CM_SREP_QPN_VALID	IBT_CM_SREP_CHAN_VALID	/* ibt_sidr_status_t */
43 #define	IBT_CM_SREP_NO_QP	IBT_CM_SREP_NO_CHAN	/* ibt_sidr_status_t */
44 
45 #define	IBT_OCHAN_CM_RETRY	IBT_OCHAN_OPAQUE1 /* ibt_chan_open_flags_t */
46 #define	IBT_OCHAN_STARTING_PSN	IBT_OCHAN_OPAQUE2 /* ibt_chan_open_flags_t */
47 #define	IBT_OCHAN_LOCAL_CM_TM	IBT_OCHAN_OPAQUE3 /* ibt_chan_open_flags_t */
48 #define	IBT_OCHAN_REMOTE_CM_TM	IBT_OCHAN_OPAQUE4 /* ibt_chan_open_flags_t */
49 #define	IBT_OCHAN_RDC_EXISTS	IBT_OCHAN_OPAQUE5 /* ibt_chan_open_flags_t */
50 #define	IBT_OCHAN_OFUV		IBT_OCHAN_OPAQUE6 /* ibt_chan_open_flags_t */
51 
52 #define	oc_cm_retry_cnt		oc_opaque1	/* ibt_chan_open_args_t */
53 						/* The number of times the */
54 						/* CM will retry its MADs */
55 						/* when IBT_OCHAN_CM_RETRY */
56 						/* is set */
57 #define	oc_starting_psn		oc_opaque2	/* ibt_chan_open_args_t */
58 						/* use oc_starting_psn when */
59 						/* IBT_OCHAN_STARTING_PSN is */
60 						/* set */
61 
62 #define	oc_local_cm_time	oc_opaque3	/* ibt_chan_open_args_t */
63 						/* The maximum time in */
64 						/* microseconds that local */
65 						/* client takes to  respond */
66 						/* for a CM callback */
67 
68 #define	oc_remote_cm_time	oc_opaque4	/* ibt_chan_open_args_t */
69 						/* The maximum time in */
70 						/* microseconds that remote */
71 						/* node takes to  respond */
72 						/* for a CM MAD */
73 
74 #define	cm_eec_hdl		cm_opaque	/* ibt_cm_event_t */
75 
76 #define	req_remote_eecn		req_opaque1	/* ibt_cm_req_rcv_t */
77 #define	req_local_eecn		req_opaque2	/* ibt_cm_req_rcv_t */
78 
79 #define	IBT_CM_RDC_EXISTS	0x4		/* ibt_cm_flags_t */
80 
81 #define	ai_dlid			ai_opaque1	/* Local dest, or router LID */
82 #define	ai_src_path		ai_opaque2	/* Source path bits */
83 
84 
85 /*
86  * Note that variables of type ibt_qp_hdl_t (really ibt_channel_hdl_t)
87  * can be used in some of the IBTI interfaces, e.g., ibt_open_rc_channel().
88  */
89 #define	ibt_qp_hdl_t		ibt_channel_hdl_t
90 
91 
92 /*
93  * FUNCTION PROTOTYPES.
94  */
95 /*
96  * ibt_alloc_ah()
97  *	Allocates and returns an address handle (ibt_ah_hdl_t).
98  */
99 ibt_status_t ibt_alloc_ah(ibt_hca_hdl_t hca_hdl, ibt_ah_flags_t flags,
100     ibt_pd_hdl_t pd, ibt_adds_vect_t *adds_vectp, ibt_ah_hdl_t *ah_p);
101 
102 /*
103  * ibt_free_ah()
104  *	Release/de-allocate the specified handle.
105  */
106 ibt_status_t ibt_free_ah(ibt_hca_hdl_t hca_hdl, ibt_ah_hdl_t ah);
107 
108 /*
109  * ibt_query_ah
110  *	Obtain the address vector information for the specified address handle.
111  */
112 ibt_status_t ibt_query_ah(ibt_hca_hdl_t hca_hdl, ibt_ah_hdl_t ah,
113     ibt_pd_hdl_t *pd_p, ibt_adds_vect_t *adds_vectp);
114 
115 /*
116  * ibt_modify_ah
117  *	Modify the address vector information for the specified address handle.
118  */
119 ibt_status_t ibt_modify_ah(ibt_hca_hdl_t hca_hdl, ibt_ah_hdl_t ah,
120     ibt_adds_vect_t *adds_vectp);
121 
122 
123 /*
124  * ibt_alloc_qp()
125  *	Allocate a QP with specified attributes.
126  *
127  * Note:
128  *	QPs allocated by ibt_alloc_qp are in the RESET state.  The client
129  *	needs to transition an RC QP into the INIT state if it is going to
130  *	use ibt_open_rc_channel to establish the connection.
131  *	The client needs to transition an UD QP into the RTS state.
132  */
133 ibt_status_t ibt_alloc_qp(ibt_hca_hdl_t hca_hdl, ibt_qp_type_t type,
134     ibt_qp_alloc_attr_t *qp_attr, ibt_chan_sizes_t *queue_sizes_p,
135     ib_qpn_t *qpn_p, ibt_qp_hdl_t *ibt_qp_p);
136 
137 /*
138  * ibt_alloc_special_qp()
139  *	Allocate a special QP with specified attributes.
140  *
141  * Note:
142  *	QPs allocated by ibt_alloc_special_qp are in the RESET state.
143  *	The client needs to transition an UD QP into the RTS state.
144  */
145 ibt_status_t ibt_alloc_special_qp(ibt_hca_hdl_t hca_hdl, uint8_t port,
146     ibt_sqp_type_t type, ibt_qp_alloc_attr_t *qp_attr,
147     ibt_chan_sizes_t *queue_sizes_p, ibt_qp_hdl_t *ibt_qp_p);
148 
149 /*
150  * ibt_flush_qp()
151  *	Transition a QP into error state to flush all outstanding
152  *	work requests. Must be called before calling ibt_free_qp().
153  *	Use ibt_close_rc_channel for RC QPs that have been opened
154  *	successfully.
155  */
156 ibt_status_t ibt_flush_qp(ibt_qp_hdl_t ibt_qp);
157 
158 /*
159  * ibt_initialize_qp()
160  *	Transition a QP from RESET state into a usable state.
161  *	An RC QP is transitioned into the INIT state, ready for
162  *	a call to ibt_open_rc_channel().  A UD QP is transitioned
163  *	all the way to the RTS state.
164  */
165 ibt_status_t ibt_initialize_qp(ibt_qp_hdl_t ibt_qp,
166     ibt_qp_info_t *modify_attrp);
167 
168 
169 /*
170  * ibt_free_qp()
171  *	De-allocate or free the resources associated with an existing QP.
172  */
173 ibt_status_t ibt_free_qp(ibt_qp_hdl_t ibt_qp);
174 
175 
176 /*
177  * ibt_query_qp()
178  *	Query the attributes of an existing QP.
179  */
180 ibt_status_t ibt_query_qp(ibt_qp_hdl_t ibt_qp, ibt_qp_query_attr_t *qp_attrp);
181 
182 
183 /*
184  * ibt_modify_qp()
185  *	Modify the attributes of an existing QP.
186  */
187 ibt_status_t ibt_modify_qp(ibt_qp_hdl_t ibt_qp, ibt_cep_modify_flags_t flags,
188     ibt_qp_info_t *qp_attr, ibt_queue_sizes_t *actual_sz);
189 
190 /*
191  * ibt_set_qp_private(), ibt_get_qp_private()
192  *	Set/Get the client private data.
193  */
194 void ibt_set_qp_private(ibt_qp_hdl_t ibt_qp, void *clnt_private);
195 void *ibt_get_qp_private(ibt_qp_hdl_t ibt_qp);
196 
197 
198 /*
199  * ibt_qp_to_hca_guid
200  *      A helper function to retrieve HCA GUID for the specified QP.
201  */
202 ib_guid_t ibt_qp_to_hca_guid(ibt_qp_hdl_t ibt_qp);
203 
204 
205 /*
206  * ibt_recover_ud_qp()
207  *      Recover an UD QP which has transitioned to SQ Error state. The
208  *      ibt_recover_ud_qp() transitions the QP from SQ Error state to
209  *	Ready-To-Send QP state.
210  *
211  *      If a work request posted to a UD QP's send queue completes with
212  *      an error (see ibt_wc_status_t), the QP gets transitioned to SQ
213  *      Error state. In order to reuse this QP, ibt_recover_ud_qp() can
214  *      be used to recover the QP to a usable (Ready-to-Send) state.
215  */
216 ibt_status_t ibt_recover_ud_qp(ibt_qp_hdl_t ibt_qp);
217 
218 
219 /*
220  * Datagram Domain Functions
221  */
222 
223 /*
224  * ibt_ud_get_dqpn
225  *	Finds the destination QPN at the specified destination that the
226  *	specified service can be reached on. The IBTF CM initiates the
227  *	service ID resolution protocol (SIDR) to determine a destination QPN.
228  */
229 ibt_status_t ibt_ud_get_dqpn(ibt_ud_dest_attr_t *attr,
230     ibt_execution_mode_t mode, ibt_ud_returns_t *returns);
231 
232 /*
233  * ibt_get_module_failure()
234  *
235  *	Used to obtain a special IBTF failure code for IB module specific
236  *	failures, i.e. failures other than those defined in ibt_status_t.
237  */
238 ibt_status_t ibt_get_module_failure(ibt_failure_type_t type, uint64_t ena);
239 
240 ibt_status_t ibt_ofuvcm_get_req_data(void *, ibt_ofuvcm_req_data_t *);
241 
242 ibt_status_t ibt_ofuvcm_proceed(ibt_cm_event_type_t, void *,
243     ibt_cm_status_t, ibt_cm_proceed_reply_t *, void *,
244     ibt_priv_data_len_t);
245 
246 #ifdef __cplusplus
247 }
248 #endif
249 
250 #endif /* _SYS_IB_IBTL_IBVTI_H */
251