dmake: do not set MAKEFLAGS=k
[unleashed/tickless.git] / include / sys / ib / ibtl / ibti.h
blob9d8407d39a523141679e4821173cdd5ee9065656
1 /*
2 * CDDL HEADER START
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.
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.
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]
19 * CDDL HEADER END
22 * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
25 #ifndef _SYS_IB_IBTL_IBTI_H
26 #define _SYS_IB_IBTL_IBTI_H
29 * ibti.h
31 * This file contains the IBTI prototypes and associated data structures.
32 * It is the only header file that should be included by IBTI clients.
34 #include <sys/ib/ibtl/ibti_common.h>
36 #ifdef __cplusplus
37 extern "C" {
38 #endif
41 * Allocate channel flags.
43 typedef enum ibt_chan_alloc_flags_e {
44 IBT_ACHAN_NO_FLAGS = 0,
45 IBT_ACHAN_CLONE = (1 << 0),
46 IBT_ACHAN_USER_MAP = (1 << 1),
47 IBT_ACHAN_DEFER_ALLOC = (1 << 2),
48 IBT_ACHAN_USES_SRQ = (1 << 3),
49 IBT_ACHAN_USES_RSS = (1 << 4),
51 /* UD variants for FC support */
52 IBT_ACHAN_USES_RFCI = (1 << 5), /* from RFCI pool */
53 IBT_ACHAN_USES_FCMD = (1 << 6),
54 IBT_ACHAN_USES_FEXCH = (1 << 7) /* from FEXCH pool */
55 } ibt_chan_alloc_flags_t;
59 * Allocate RC channel ibt_alloc_rc_channel() argument.
61 typedef struct ibt_rc_chan_alloc_args_s {
62 ibt_attr_flags_t rc_flags; /* Signal type etc */
63 ibt_cep_flags_t rc_control;
64 uint8_t rc_hca_port_num;
65 ibt_chan_sizes_t rc_sizes;
66 ibt_cq_hdl_t rc_scq; /* Send CQ */
67 ibt_cq_hdl_t rc_rcq; /* Recv CQ */
68 ibt_pd_hdl_t rc_pd; /* PD */
69 ibt_channel_hdl_t rc_clone_chan; /* Optional Clone handle */
70 ibt_srq_hdl_t rc_srq; /* Optional Shared Rcv Queue */
71 } ibt_rc_chan_alloc_args_t;
74 * RC channel query attributes structure.
76 typedef struct ibt_rc_chan_query_attr_s {
77 ib_guid_t rc_hca_guid; /* Local HCA GUID */
78 ibt_cq_hdl_t rc_scq; /* SendCQ handle */
79 ibt_cq_hdl_t rc_rcq; /* RecvCQ handle */
80 ibt_pd_hdl_t rc_pd; /* PD Handle. */
81 ibt_cep_state_t rc_state; /* Channel state */
82 ib_mtu_t rc_path_mtu;
83 uint8_t rc_path_retry_cnt:3;
84 ibt_rnr_retry_cnt_t rc_path_rnr_retry_cnt;
85 ibt_rnr_nak_time_t rc_min_rnr_nak; /* min RNR-NAK timer */
86 ibt_cep_path_t rc_prim_path;
87 ibt_cep_path_t rc_alt_path;
88 ibt_chan_sizes_t rc_chan_sizes; /* Queue/SGL sizes */
89 uint8_t rc_rdma_ra_out; /* max RDMA-Reads/Atomics out */
90 uint8_t rc_rdma_ra_in; /* max RDMA-Reads/Atomics in */
91 ibt_attr_flags_t rc_flags; /* SQ Signaling Type etc */
92 ibt_cep_flags_t rc_control; /* Control Flags */
93 ibt_cep_cmstate_t rc_mig_state;
94 ib_qpn_t rc_qpn; /* Local QPN */
95 ib_qpn_t rc_dst_qpn; /* Destination QPN */
96 ibt_srq_hdl_t rc_srq; /* Optional Shared Rcv Queue */
97 } ibt_rc_chan_query_attr_t;
100 * RC Channel Modify Attributes definition.
102 * It is only possible to modify a channel that has previously been
103 * opened. The channel must either be in operational state (IBT_STATE_RTS)
104 * or paused (IBT_STATE_SQD). If channel is in paused state, then a modify
105 * operation will unpause the channel.
107 * See the ibt_modify_rc_channel() for details of the required corresponding
108 * modify flags.
109 * Not specified attributes should be set to "NULL" or "0".
111 typedef struct ibt_rc_chan_modify_attr_s {
112 ibt_cep_flags_t rc_control; /* Channel Control Flags */
113 uint_t rc_sq_sz; /* Set SQ Max outstanding WRs */
114 uint_t rc_rq_sz; /* Set RQ Max outstanding WRs */
116 ibt_adds_vect_t rc_prim_adds_vect; /* Primary Path Address */
117 ibt_adds_vect_t rc_alt_adds_vect; /* Alternate Path Address */
118 uint8_t rc_path_retry_cnt:3;
119 ibt_rnr_retry_cnt_t rc_path_rnr_retry_cnt;
120 ibt_rnr_nak_time_t rc_min_rnr_nak; /* min RNR-NAK timer */
121 uint8_t rc_prim_port_num; /* Port of Primary Path */
122 uint8_t rc_alt_port_num; /* Port of Alternate Path */
123 uint8_t rc_rdma_ra_out; /* Initiator Depth, Number of */
124 /* RDMA RD's & Atomics */
125 /* outstanding. */
126 uint8_t rc_rdma_ra_in; /* Responder resources for */
127 /* handling incoming RDMA rds */
128 /* and Atomics. */
129 } ibt_rc_chan_modify_attr_t;
132 * UD remote destination query attributes
134 typedef struct ibt_ud_dest_query_attr_s {
135 ibt_hca_hdl_t ud_hca_hdl; /* Local HCA Handle */
136 ib_qpn_t ud_dst_qpn; /* Destination QPN */
137 ib_qkey_t ud_qkey; /* Q_Key */
138 ibt_adds_vect_t ud_addr_vect; /* Address Information */
139 ibt_pd_hdl_t ud_pd;
140 } ibt_ud_dest_query_attr_t;
143 * Allocate UD channel ibt_alloc_ud_channel() arguments; see below at
144 * ibt_alloc_ud_channel() for a description of what's required and optional.
146 typedef struct ibt_ud_chan_alloc_args_s {
147 ibt_attr_flags_t ud_flags; /* Sig type etc */
148 uint8_t ud_hca_port_num;
149 uint16_t ud_pkey_ix; /* P_Key Index */
150 ibt_chan_sizes_t ud_sizes;
151 ib_qkey_t ud_qkey; /* Q_Key */
152 ibt_cq_hdl_t ud_scq; /* Send CQ */
153 ibt_cq_hdl_t ud_rcq; /* Recv CQ */
154 ibt_pd_hdl_t ud_pd; /* PD */
155 ibt_channel_hdl_t ud_clone_chan; /* Optional clone handle */
156 ibt_srq_hdl_t ud_srq; /* Optional Shared Rcv Queue */
157 ibt_rss_attr_t ud_rss;
158 ibt_fc_attr_t ud_fc;
159 } ibt_ud_chan_alloc_args_t;
162 * UD channel query attributes.
164 typedef struct ibt_ud_chan_query_attr_s {
165 ib_qpn_t ud_qpn; /* QPN */
166 ib_guid_t ud_hca_guid; /* Local HCA GUID */
167 ibt_cq_hdl_t ud_scq; /* SendCQ handle. */
168 ibt_cq_hdl_t ud_rcq; /* RecvCQ handle. */
169 ibt_pd_hdl_t ud_pd; /* PD Handle. */
170 uint8_t ud_hca_port_num; /* Local HCA port */
171 ibt_cep_state_t ud_state; /* Channel state */
172 uint16_t ud_pkey_ix; /* P_Key Index */
173 ib_qkey_t ud_qkey; /* Q_Key */
174 ibt_chan_sizes_t ud_chan_sizes; /* Queue/SGL sizes */
175 ibt_attr_flags_t ud_flags; /* Signaling Type etc */
176 ibt_srq_hdl_t ud_srq; /* Optional Shared Rcv Queue */
177 ibt_rss_attr_t ud_rss;
178 ibt_fc_attr_t ud_fc;
179 ibt_fexch_query_attr_t ud_query_fc; /* query only set */
180 } ibt_ud_chan_query_attr_t;
183 * UD Channel Modify Attributes definition.
185 * It is only possible to modify a channel that is either in the operational
186 * state (IBT_STATE_RTS) or paused (IBT_STATE_SQD). If channel is in paused
187 * state, then a modify operation will unpause the channel.
189 * See the ibt_modify_ud_channel() for details of the required corresponding
190 * modify flags.
192 typedef struct ibt_ud_chan_modify_attr_s {
193 uint_t ud_sq_sz; /* Set SQ Max outstanding WRs */
194 uint_t ud_rq_sz; /* Set RQ Max outstanding WRs */
195 ib_qkey_t ud_qkey; /* Set Q_Key */
196 ibt_rss_attr_t ud_rss; /* Set RSS stuff */
197 ibt_fc_attr_t ud_fc;
198 } ibt_ud_chan_modify_attr_t;
202 * FUNCTION PROTOTYPES
206 * CONNECTION ESTABLISHMENT/TEAR DOWN FUNCTIONS.
210 * ibt_alloc_rc_channel
211 * Allocates a RC communication channels that satisfy the specified
212 * channel attributes.
214 ibt_status_t ibt_alloc_rc_channel(ibt_hca_hdl_t hca_hdl,
215 ibt_chan_alloc_flags_t flags, ibt_rc_chan_alloc_args_t *args,
216 ibt_channel_hdl_t *rc_chan_p, ibt_chan_sizes_t *sizes);
219 * ibt_flush_channel
220 * Flush the specified channel. Outstanding work requests are flushed
221 * so that the client can do the associated clean up. After that, the
222 * client will usually deregister the previously registered memory,
223 * then free the channel by calling ibt_free_channel(). RC channels
224 * that have been successfully opened will fail this call, as they
225 * need to instead be handled by ibt_close_rc_channel().
227 ibt_status_t ibt_flush_channel(ibt_channel_hdl_t chan);
230 * ibt_free_channel
231 * Releases the resources associated with the specified channel
233 ibt_status_t ibt_free_channel(ibt_channel_hdl_t chan);
236 * ibt_query_rc_channel
237 * Query an RC channel's attributes. Should only be called on an
238 * opened RC channel. If called on a channel before it is opened,
239 * some channel attributes may change when the channel is opened.
241 ibt_status_t ibt_query_rc_channel(ibt_channel_hdl_t rc_chan,
242 ibt_rc_chan_query_attr_t *chan_attrs);
245 * ibt_modify_rc_channel()
246 * Modifies a previous opened operational or paused RC channel's
247 * attributes.
249 * NOTE:
250 * It is only possible to modify a channel that has previously been opened.
251 * The channel must either be in operational state (IBT_STATE_RTS) or
252 * paused (IBT_STATE_SQD). If channel is in paused state, then a modify
253 * operation will will unpause the channel.
255 ibt_status_t ibt_modify_rc_channel(ibt_channel_hdl_t rc_chan,
256 ibt_cep_modify_flags_t flags, ibt_rc_chan_modify_attr_t *attrs,
257 ibt_queue_sizes_t *actual_sz);
260 * ibt_alloc_ud_channel
261 * Allocate UD channels that satisfy the specified channel attributes.
263 ibt_status_t ibt_alloc_ud_channel(ibt_hca_hdl_t hca_hdl,
264 ibt_chan_alloc_flags_t flags, ibt_ud_chan_alloc_args_t *args,
265 ibt_channel_hdl_t *ud_chan_p, ibt_chan_sizes_t *sizes);
268 * ibt_alloc_ud_channel_range
269 * Allocate a range of UD channels that have consecutive QPNs for RSS.
271 ibt_status_t ibt_alloc_ud_channel_range(ibt_hca_hdl_t hca_hdl,
272 uint_t log2, ibt_chan_alloc_flags_t flags,
273 ibt_ud_chan_alloc_args_t *args, ibt_cq_hdl_t *send_cq_p,
274 ibt_cq_hdl_t *recv_cq_p, ib_qpn_t *base_qpn_p,
275 ibt_channel_hdl_t *ud_chan_p, ibt_chan_sizes_t *sizes);
278 * ibt_query_ud_channel
279 * Query a UD channel's attributes.
281 ibt_status_t ibt_query_ud_channel(ibt_channel_hdl_t ud_chan,
282 ibt_ud_chan_query_attr_t *ud_chan_attrs);
285 * ibt_modify_ud_channel()
286 * Modifies an UD channel's attributes, as specified by a
287 * ibt_cep_modify_flags_t parameter to those specified in the
288 * ibt_ud_chan_modify_attr_t structure.
290 * NOTE:
291 * It is only possible to modify a channel that is either in the
292 * operational state (IBT_STATE_RTS) or paused (IBT_STATE_SQD). If
293 * channel is in paused state, then a modify operation will unpause the
294 * channel.
296 ibt_status_t ibt_modify_ud_channel(ibt_channel_hdl_t ud_chan,
297 ibt_cep_modify_flags_t flags, ibt_ud_chan_modify_attr_t *attrs,
298 ibt_queue_sizes_t *actual_sz);
301 * ibt_recover_ud_channel()
302 * Recover an UD Channel which has transitioned to SQ Error state. The
303 * ibt_recover_ud_channel() transitions the channel from SQ Error state
304 * to Ready-To-Send channel state.
306 * If a work request posted to a UD channel's send queue completes with
307 * an error (see ibt_wc_status_t), the channel gets transitioned to SQ
308 * Error state. In order to reuse this channel, ibt_recover_ud_channel()
309 * can be used to recover the channel to a usable (Ready-to-Send) state.
311 ibt_status_t ibt_recover_ud_channel(ibt_channel_hdl_t ud_chan);
315 * ibt_alloc_ud_dest
316 * Allocate a UD destination handle. This allocates local resources
317 * that will need subsequent modification/initialization before use
318 * (in send work requests). Functions that can be used to do this are
319 * ibt_modify_ud_dest (data supplied by caller), ibt_modify_reply_ud_dest
320 * (data supplied from a successfully completed receive work request),
321 * and ibt_request_ud_dest (data retrieved using SIDR protocol).
323 ibt_status_t ibt_alloc_ud_dest(ibt_hca_hdl_t hca_hdl,
324 ibt_ud_dest_flags_t flags, ibt_pd_hdl_t pd, ibt_ud_dest_hdl_t *ud_dest_p);
327 * ibt_modify_ud_dest
328 * Modify a previously allocated UD destination handle from the
329 * argument data. After the ud_dest has already been made usable,
330 * the adds_vect argument to this function is optional (NULL).
332 ibt_status_t ibt_modify_ud_dest(ibt_ud_dest_hdl_t ud_dest, ib_qkey_t qkey,
333 ib_qpn_t dest_qpn, ibt_adds_vect_t *adds_vect);
336 * ibt_modify_reply_ud_dest
337 * Modify a previously allocated UD destination handle, so that it
338 * can be used to reply to the sender of the datagram contained in the
339 * specified work request completion.
341 ibt_status_t ibt_modify_reply_ud_dest(ibt_channel_hdl_t ud_chan,
342 ibt_ud_dest_hdl_t ud_dest, ib_qkey_t qkey, ibt_wc_t *wc,
343 ib_vaddr_t recv_buf);
346 * ibt_request_ud_dest
347 * Modify a previously allocated UD destination handle based on the
348 * data retrieved by making an SIDR request.
350 ibt_status_t ibt_request_ud_dest(ibt_ud_dest_hdl_t ud_dest,
351 ibt_execution_mode_t mode, ibt_ud_dest_attr_t *dest_attrs,
352 ibt_ud_returns_t *ud_ret_args);
355 * ibt_free_ud_dest
356 * Releases the resources associated with the specified UD destination
357 * handle.
359 ibt_status_t ibt_free_ud_dest(ibt_ud_dest_hdl_t ud_dest);
362 * ibt_query_ud_dest
363 * Query a UD destination's attributes.
365 ibt_status_t ibt_query_ud_dest(ibt_ud_dest_hdl_t ud_dest,
366 ibt_ud_dest_query_attr_t *dest_attrs);
370 * ibt_is_privileged_ud_dest
371 * Determine if a UD destination Handle is a privileged handle.
373 boolean_t ibt_is_privileged_ud_dest(ibt_ud_dest_hdl_t ud_dest);
377 * ibt_update_channel_qkey
379 * ibt_update_channel_qkey() set's the Qkey in the specified channel context
380 * to the Qkey in the specified destination handle. This function can be used
381 * to enable sends to a privileged destination. All posted Send Work Requests
382 * that contain a privileged destination handle now use the Qkey in the
383 * channel context.
385 * ibt_update_channel_qkey() can also be used to enable the caller to receive
386 * from the specified remote destination on the specified channel.
389 ibt_status_t ibt_update_channel_qkey(ibt_channel_hdl_t ud_chan,
390 ibt_ud_dest_hdl_t ud_dest);
394 * ibt_set_chan_private()
395 * ibt_get_chan_private()
396 * Set/get a pointer to client private data.
397 * Applicable for both RC and UD channels.
399 void ibt_set_chan_private(ibt_channel_hdl_t chan, void *clnt_private);
401 void *ibt_get_chan_private(ibt_channel_hdl_t chan);
404 * ibt_channel_to_hca_guid()
406 * A helper function to retrieve HCA GUID for the specified Channel.
408 ib_guid_t ibt_channel_to_hca_guid(ibt_channel_hdl_t chan);
410 #ifdef __cplusplus
412 #endif
414 #endif /* _SYS_IB_IBTL_IBTI_H */