ibti_common.h revision 8580:85b678a652f5
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 2009 Sun Microsystems, Inc.  All rights reserved.
23 * Use is subject to license terms.
24 */
25
26#ifndef	_SYS_IB_IBTL_IBTI_COMMON_H
27#define	_SYS_IB_IBTL_IBTI_COMMON_H
28
29/*
30 * ibti_common.h
31 *
32 * This file contains the shared/common transport data types and function
33 * prototypes.
34 */
35#include <sys/ib/ibtl/ibtl_types.h>
36#include <sys/ib/ibtl/ibti_cm.h>
37#include <sys/isa_defs.h>
38#include <sys/byteorder.h>
39
40#ifdef __cplusplus
41extern "C" {
42#endif
43
44/*
45 * Max number of paths that can be requested in an ibt_get_paths() call,
46 * if IBT_PATH_PERF or IBT_PATH_AVAIL flag (ibt_path_flags_t) is set.
47 */
48#define	IBT_MAX_SPECIAL_PATHS	2
49
50/*
51 * The name of DDI Event, generated when the properties of IOC device
52 * node properties were modified.
53 */
54#define	IB_PROP_UPDATE_EVENT	"SUNW,IB:IB_PROP_UPDATE"
55
56
57/* Transport Interface version */
58typedef enum ibt_version_e {
59	IBTI_V1 = 1,
60	IBTI_V2 = 2,		/* FMR Support */
61	IBTI_V3 = 3,
62	IBTI_V_CURR = IBTI_V3
63} ibt_version_t;
64
65/*
66 * Driver class type. Identifies a type of client driver so that
67 * "IBTF Policy" decisions can be made on a driver class basis.
68 * The last class should always be IBT_CLNT_NUM, and any new classes added
69 * must be defined before IBT_CLNT_NUM. The class values must be above 0.
70 * Any class values below or equal to 0 shall be invalid
71 */
72typedef enum ibt_clnt_class_e {
73	IBT_STORAGE_DEV = 0x1,	/* SCSI, FC, etc.. */
74	IBT_NETWORK_DEV,	/* Network driver with associated client H/W */
75	IBT_GENERIC_DEV,	/* Generic client H/W device driver */
76	IBT_NETWORK,		/* Network driver with no associated */
77				/* client H/W, e.g., IPoIB */
78	IBT_GENERIC,		/* A generic IB driver not */
79				/* associated with client H/W */
80	IBT_USER,		/* A user application IBT interface driver */
81	IBT_IBMA,		/* The IBMA Module */
82	IBT_CM,			/* The CM Module */
83	IBT_DM,			/* The DM Module */
84	IBT_CLASS_NUM		/* Place holder for class count */
85} ibt_clnt_class_t;
86
87#define	IBT_TEST_DEV	999	/* Place holder for modules that test IBTL */
88
89#define	IBT_CLNT_DEVICE_CLASS(class)	((class) == IBT_STORAGE_DEV || \
90					(class) == IBT_NETWORK_DEV || \
91					(class) == IBT_GENERIC_DEV)
92
93#define	IBT_CLNT_GENERAL_CLASS(class)	((class) == IBT_NETWORK || \
94					(class) == IBT_GENERIC || \
95					(class) == IBT_USER)
96
97#define	IBT_CLNT_MGMT_CLASS(class)	((class) == IBT_IBMA || \
98					(class) == IBT_CM || \
99					(class) == IBT_DM || \
100					(class) == IBT_TEST_DEV)
101/*
102 * Event record & status returns for asynchronous events and errors.
103 */
104typedef struct ibt_async_event_s {
105	uint64_t		ev_fma_ena;		/* FMA Error data */
106	ibt_channel_hdl_t	ev_chan_hdl;		/* Channel handle */
107	ibt_cq_hdl_t		ev_cq_hdl;		/* CQ handle */
108	ib_guid_t		ev_hca_guid;		/* HCA node GUID */
109	ibt_srq_hdl_t		ev_srq_hdl;		/* SRQ handle */
110	ibt_port_change_t	ev_port_flags;		/* Port Change flags */
111	uint8_t			ev_port;		/* HCA port */
112} ibt_async_event_t;
113
114/*
115 * IBT Client Callback function typedefs.
116 *
117 * ibt_async_handler_t
118 *	Pointer to an async event/error handler function.  This function is
119 *	called when an async event/error is detected on a HCA that is being
120 *	used by the IBT client driver that registered the function.
121 */
122typedef void (*ibt_async_handler_t)(void *clnt_private,
123    ibt_hca_hdl_t hca_hdl, ibt_async_code_t code, ibt_async_event_t *event);
124
125/*
126 * IBT Client Memory Error Callback function typedefs.
127 *
128 * ibt_memory_handler_t
129 *	Pointer to an memory event/error handler function.
130 */
131typedef void (*ibt_memory_handler_t)(void *clnt_private,
132    ibt_hca_hdl_t hca_hdl, ibt_mem_code_t code, ibt_mem_data_t *data);
133
134/*
135 * Define a client module information structure. All clients MUST
136 * define a global of type ibt_clnt_modinfo_t. A pointer to this global
137 * is passed into the IBTF by a client when calling ibt_attach().
138 * This struct must persist during the life of the client.
139 *
140 * The client's mi_async_handler is called when an async event/error is
141 * detected on a HCA that is being used by this client.
142 */
143typedef struct ibt_clnt_modinfo_s {
144	ibt_version_t		mi_ibt_version;		/* TI version */
145	ibt_clnt_class_t	mi_clnt_class;		/* Type of client */
146	ibt_async_handler_t	mi_async_handler;	/* Async Handler */
147	ibt_memory_handler_t	mi_reserved;		/* Memory handler */
148	char			*mi_clnt_name;		/* Client Name. */
149} ibt_clnt_modinfo_t;
150
151
152/*
153 * Definitions for use with ibt_register_subnet_notices()
154 */
155typedef enum ibt_subnet_event_code_e {
156	IBT_SM_EVENT_MCG_CREATED = 1,
157	IBT_SM_EVENT_MCG_DELETED = 2,
158	IBT_SM_EVENT_AVAILABLE	 = 3,
159	IBT_SM_EVENT_UNAVAILABLE = 4,
160	IBT_SM_EVENT_GID_AVAIL	 = 5,
161	IBT_SM_EVENT_GID_UNAVAIL = 6
162} ibt_subnet_event_code_t;
163
164typedef struct ibt_subnet_event_s {
165	ib_gid_t sm_notice_gid;
166} ibt_subnet_event_t;
167
168typedef void (*ibt_sm_notice_handler_t)(void *private, ib_gid_t gid,
169    ibt_subnet_event_code_t code, ibt_subnet_event_t *event);
170
171
172/*
173 * MTU Request type.
174 */
175typedef struct ibt_mtu_req_s {
176	ib_mtu_t	r_mtu;		/* Requested MTU */
177	ibt_selector_t	r_selector;	/* Qualifier for r_mtu */
178} ibt_mtu_req_t;
179
180
181/*
182 * Qflags, used by ibt_resize_queues().
183 */
184typedef enum ibt_qflags_e {
185	IBT_SEND_Q	= 1 << 0,	/* Op applies to the Send Q */
186	IBT_RECV_Q	= 1 << 1	/* Op applies to the Recv Q */
187} ibt_qflags_t;
188
189/*
190 * CQ priorities
191 * The IBTF will attempt to implement a coarse 3 level priority scheme
192 * (IBT_CQ_LOW, IBT_CQ_MEDIUM, IBT_CQ_HIGH) based on the class of client
193 * driver. The requested priority is not guaranteed. If a CI implementation
194 * has the ability to implement priority CQs, then the IBTF will take advantage
195 * of that when calling the CI to create a CQ by passing a priority indicator
196 * to the CI.
197 */
198typedef enum ibt_cq_priority_e {
199	IBT_CQ_DEFAULT		= 0x0,
200	IBT_CQ_LOW		= 0x1,
201	IBT_CQ_MEDIUM		= 0x2,
202	IBT_CQ_HIGH		= 0x3,
203	IBT_CQ_OPAQUE_1		= 0x4,
204	IBT_CQ_OPAQUE_2		= 0x5,
205	IBT_CQ_OPAQUE_3		= 0x6,
206	IBT_CQ_OPAQUE_4		= 0x7,
207	IBT_CQ_OPAQUE_5		= 0x8,
208	IBT_CQ_OPAQUE_6		= 0x9,
209	IBT_CQ_OPAQUE_7		= 0xA,
210	IBT_CQ_OPAQUE_8		= 0xB,
211	IBT_CQ_OPAQUE_9		= 0xC,
212	IBT_CQ_OPAQUE_10	= 0xD,
213	IBT_CQ_OPAQUE_11	= 0xE,
214	IBT_CQ_OPAQUE_12	= 0xF,
215	IBT_CQ_OPAQUE_13	= 0x10,
216	IBT_CQ_OPAQUE_14	= 0x11,
217	IBT_CQ_OPAQUE_15	= 0x12,
218	IBT_CQ_OPAQUE_16	= 0x13
219} ibt_cq_priority_t;
220
221/*
222 * Attributes when creating a Completion Queue Scheduling Handle.
223 */
224typedef struct ibt_cq_sched_attr_s {
225	ibt_cq_sched_flags_t	cqs_flags;
226	ibt_cq_priority_t	cqs_priority;
227	uint_t			cqs_load;
228	ibt_sched_hdl_t		cqs_affinity_hdl;
229} ibt_cq_sched_attr_t;
230
231
232/*
233 * ibt_cq_handler_t
234 *	Pointer to a work request completion handler function.  This function
235 *	is called when a WR completes on a CQ that is being used by the IBTF
236 *	client driver that registered the function.
237 */
238typedef void (*ibt_cq_handler_t)(ibt_cq_hdl_t ibt_cq, void *arg);
239
240/* default CQ handler ID */
241#define	IBT_CQ_HID_DEFAULT	(1)
242
243/*
244 * Service Data and flags.
245 *	(IBTA Spec Release 1.1, Vol-1 Ref: 15.2.5.14.4)
246 *
247 * The ServiceData8.1 (sb_data8[0]) through ServiceData64.2 (sb_data64[1])
248 * components together constitutes a 64-byte area in which any data may be
249 * placed. It is intended to be a convenient way for a service to provide its
250 * clients with some initial data.
251 *
252 * In addition, this 64-byte area is formally divided into a total of 30
253 * components, 16 8-bit (uint8_t) components, then 8 16-bit (uint16_t)
254 * components, then 6 32-bit (uint32_t) components, then 2 64-bit (uint64_t)
255 * components,  thereby assigning ComponentMask bits (ibt_srv_data_flags_t) to
256 * variously-sized segments of the data. All data are in host endian format.
257 * This allows query operations (ibt_get_paths()) to be used which match
258 * parts of the Service Data, making it possible, for example, for
259 * service-specific parts of the ServiceData to serve as a binary-coded
260 * extension to the ServiceName for purposes of lookup.
261 */
262typedef enum ibt_srv_data_flags_e {
263	IBT_NO_SDATA	= 0,
264
265	IBT_SDATA8_0	= (1 << 0),
266	IBT_SDATA8_1	= (1 << 1),
267	IBT_SDATA8_2	= (1 << 2),
268	IBT_SDATA8_3	= (1 << 3),
269	IBT_SDATA8_4	= (1 << 4),
270	IBT_SDATA8_5	= (1 << 5),
271	IBT_SDATA8_6	= (1 << 6),
272	IBT_SDATA8_7	= (1 << 7),
273	IBT_SDATA8_8	= (1 << 8),
274	IBT_SDATA8_9	= (1 << 9),
275	IBT_SDATA8_10	= (1 << 10),
276	IBT_SDATA8_11	= (1 << 11),
277	IBT_SDATA8_12	= (1 << 12),
278	IBT_SDATA8_13	= (1 << 13),
279	IBT_SDATA8_14	= (1 << 14),
280	IBT_SDATA8_15	= (1 << 15),
281
282	IBT_SDATA16_0	= (1 << 16),
283	IBT_SDATA16_1	= (1 << 17),
284	IBT_SDATA16_2	= (1 << 18),
285	IBT_SDATA16_3	= (1 << 19),
286	IBT_SDATA16_4	= (1 << 20),
287	IBT_SDATA16_5	= (1 << 21),
288	IBT_SDATA16_6	= (1 << 22),
289	IBT_SDATA16_7	= (1 << 23),
290
291	IBT_SDATA32_0	= (1 << 24),
292	IBT_SDATA32_1	= (1 << 25),
293	IBT_SDATA32_2	= (1 << 26),
294	IBT_SDATA32_3	= (1 << 27),
295
296	IBT_SDATA64_0	= (1 << 28),
297	IBT_SDATA64_1	= (1 << 29),
298
299	IBT_SDATA_ALL	= 0x3FFFFFFF
300} ibt_srv_data_flags_t;
301
302typedef struct ibt_srv_data_s {
303	uint8_t		s_data8[16];	/* 8-bit service data fields. */
304	uint16_t	s_data16[8];	/* 16-bit service data fields. */
305	uint32_t	s_data32[4];	/* 32-bit service data fields. */
306	uint64_t	s_data64[2];	/* 64-bit service data fields. */
307} ibt_srv_data_t;
308
309/*
310 * Path flags, used in ibt_get_paths()
311 */
312typedef enum ibt_path_flags_e {
313	IBT_PATH_NO_FLAGS	= 0,
314	IBT_PATH_APM		= 1 << 0,	/* APM is desired. */
315	IBT_PATH_AVAIL		= 1 << 2,
316	IBT_PATH_PERF		= 1 << 3,
317	IBT_PATH_MULTI_SVC_DEST	= 1 << 4,	/* Multiple ServiceRecords */
318	IBT_PATH_HOP		= 1 << 5,	/* pa_hop is specified. */
319	IBT_PATH_PKEY		= 1 << 6	/* pa_pkey is specified. */
320} ibt_path_flags_t;
321
322/*
323 * Path attributes.
324 *
325 * The ibt_path_attr_t structure is used to specify required attributes in a
326 * path from the requesting (source) node to a specified destination node.
327 * Attributes that are don't care should be set to NULL or '0'.
328 * A destination must be specified, where a destination can be defined as
329 * one of the following:
330 *
331 *	o Service Name
332 *	o Service ID (SID)
333 *	o Array of DGIDs.
334 *	o Service Name and Array of DGIDs.
335 */
336typedef struct ibt_path_attr_s {
337	ib_gid_t		*pa_dgids;	/* Array of DGIDs */
338	ib_gid_t		pa_sgid;
339	ib_guid_t		pa_hca_guid;
340	char			*pa_sname;	/* ASCII Service name  */
341						/* NULL Terminated */
342	ib_svc_id_t		pa_sid;		/* Service ID */
343	ibt_srv_data_flags_t	pa_sd_flags;	/* Service Data flags. */
344	ibt_srv_data_t		pa_sdata;	/* Service Data */
345	uint8_t			pa_hca_port_num;
346	uint8_t			pa_num_dgids;	/* size of pa_dgids array */
347	uint8_t			pa_sl:4;
348	ibt_mtu_req_t		pa_mtu;
349	ibt_srate_req_t		pa_srate;
350	ibt_pkt_lt_req_t	pa_pkt_lt;	/* Packet Life Time Request */
351	uint_t			pa_flow:20;
352	uint8_t			pa_hop;		/* IBT_PATH_HOP */
353	uint8_t			pa_tclass;
354	ib_pkey_t		pa_pkey;	/* IBT_PATH_PKEY */
355} ibt_path_attr_t;
356
357/*
358 * Path Information.
359 *
360 * The ibt_get_paths() performs SA Path record lookups to select a path(s) to
361 * a given destination(s), details of selected path(s) are returned in this
362 * structure.
363 *
364 * The ibt_path_info_t contains all the attributes of the best path(s), as
365 * as determined by IBTL, to the specified destination(s), including the
366 * local HCA and HCA port to use to access the fabric.
367 *
368 * The Service ID (pi_sid) and Service Data (pi_sdata) are returned only for
369 * lookups based on Service ID or/and Service Name.
370 */
371typedef struct ibt_path_info_s {
372	ib_guid_t	pi_hca_guid;		/* Local HCA GUID; 0 implies */
373						/* this record is invalid */
374	ib_svc_id_t	pi_sid;			/* Service ID */
375	ibt_srv_data_t	pi_sdata;		/* Service Data */
376
377	ibt_cep_path_t	pi_prim_cep_path;	/* Contains CEP adds info */
378	ibt_cep_path_t	pi_alt_cep_path;	/* RC & UC Only, valid if */
379						/* cep_hca_port_num is not */
380						/* '0' */
381	ib_mtu_t	pi_path_mtu;		/* Common path MTU */
382	ib_time_t	pi_prim_pkt_lt;
383	ib_time_t	pi_alt_pkt_lt;
384} ibt_path_info_t;
385
386/*
387 * Optional Alternate Path attributes.
388 *
389 * The ibt_alt_path_attr_t structure is used to specify additional optional
390 * attributes when requesting an alternate path for an existing channel.
391 *
392 * Attributes that are don't care should be set to NULL or '0'.
393 */
394typedef struct ibt_alt_path_attr_s {
395	ib_gid_t		apa_sgid;
396	ib_gid_t		apa_dgid;
397	ibt_srate_req_t		apa_srate;
398	ibt_pkt_lt_req_t	apa_pkt_lt;	/* Packet Life Time Request */
399	uint_t			apa_flow:20;
400	uint8_t			apa_sl:4;
401	uint8_t			apa_hop;
402	uint8_t			apa_tclass;
403} ibt_alt_path_attr_t;
404
405/*
406 * Path Information for Alternate Path - input to ibt_set_alt_path().
407 */
408typedef struct ibt_alt_path_info_s {
409	ibt_cep_path_t	ap_alt_cep_path;	/* RC & UC Only, valid if */
410						/* cep_hca_port_num is not */
411						/* '0' */
412	ib_time_t	ap_alt_pkt_lt;
413} ibt_alt_path_info_t;
414
415/*
416 * Open Channel flags, Used in ibt_open_rc_channel call
417 */
418typedef enum ibt_chan_open_flags_e {
419	IBT_OCHAN_NO_FLAGS		= 0,
420	IBT_OCHAN_REDIRECTED		= 1 << 0,
421	IBT_OCHAN_PORT_REDIRECTED	= 1 << 1,
422	IBT_OCHAN_DUP			= 1 << 2,
423	IBT_OCHAN_PORT_FIXED		= 1 << 3,
424	IBT_OCHAN_OPAQUE1		= 1 << 4,
425	IBT_OCHAN_OPAQUE2		= 1 << 5,
426	IBT_OCHAN_OPAQUE3		= 1 << 6,
427	IBT_OCHAN_OPAQUE4		= 1 << 7,
428	IBT_OCHAN_OPAQUE5		= 1 << 8
429} ibt_chan_open_flags_t;
430
431/*
432 * Arguments for ibt_open_rc_channel().
433 *
434 * oc_priv_data should be NULL or point to a buffer allocated by the caller,
435 * the size of which should be in oc_priv_data_len, where oc_priv_data_len <=
436 * IBT_REQ_PRIV_DATA_SZ.
437 *
438 * When ibt_open_rc_channel returns with ibt_cm_reason_t of
439 * IBT_CM_REDIRECT_PORT, the client can re-issue ibt_open_rc_channel setting
440 * new fields as follows:
441 *
442 * Set (ibt_chan_args_t)->oc_cm_cep_path  =
443 *    original (ibt_chan_open_args_t)->oc_path->pi_prim_cep_path.
444 * Set (ibt_chan_args_t)->oc_cm_pkt_lt  =
445 *    original (ibt_chan_open_args_t)->oc_prim_pkt_lt.
446 * Update (ibt_chan_args_t)->oc_path based on path information returned
447 * from ibt_get_paths using the gid in the return data below:
448 * 	(ibt_rc_returns_t)->rc_arej_info.ari_redirect_info.ari_gid.
449 * Set flags to IBT_OCHAN_PORT_REDIRECTED.
450 *
451 * Note : oc_cm_path is not used for any other scenario, and must be set for
452 * IBT_OCHAN_PORT_REDIRECTED.
453 *
454 * When ibt_open_rc_channel returns with ibt_cm_reason_t of
455 * IBT_CM_REDIRECT_CM, the client can re-issue ibt_open_rc_channel setting
456 * new fields as follows:
457 *
458 * Update (ibt_chan_args_t)->oc_path based on path information returned
459 * from ibt_get_paths using the return data in
460 * (ibt_rc_returns_t)->rc_arej_info.ari_redirect_info.
461 *
462 * Set (ibt_chan_args_t)->oc_cm_redirect_info =
463 *    Returned (ibt_rc_returns_t)->rc_arej_info.ari_redirect_info.
464 * Set flags to IBT_OCHAN_REDIRECTED.
465 *
466 * Note:
467 *
468 * IBT_OCHAN_PORT_REDIRECTED flag cannot be used to specify a remote CM MAD
469 * address, that is on a different subnet than the RC connection itself.
470 *
471 * Not specified attributes should be set to "NULL" or "0".
472 */
473typedef struct ibt_chan_open_args_s {
474	ibt_path_info_t 	*oc_path;	/* Primary & Alternate */
475	ibt_cm_handler_t 	oc_cm_handler;	/* cm_handler - required */
476	void			*oc_cm_clnt_private;	/* First argument to */
477							/* cm_handler */
478	ibt_rnr_retry_cnt_t	oc_path_rnr_retry_cnt;
479	uint8_t			oc_path_retry_cnt:3;
480	uint8_t			oc_rdma_ra_out;
481	uint8_t			oc_rdma_ra_in;
482	ibt_priv_data_len_t	oc_priv_data_len;	/* Number of bytes of */
483							/* REQ Private data */
484	void			*oc_priv_data;		/* REQ private data */
485	ibt_channel_hdl_t	oc_dup_channel; 	/* IBT_OCHAN_DUP */
486	ibt_redirect_info_t	*oc_cm_redirect_info;	/* Redirect params */
487							/* for port and CM */
488							/* redirection */
489	ibt_cep_path_t		*oc_cm_cep_path;	/* Optional Path for */
490							/* CM MADs on */
491							/* port redirection */
492	ib_time_t		oc_cm_pkt_lt;		/* Pkt life time for */
493							/* CM MADs */
494	uint32_t		oc_opaque1:4;
495	uint32_t		oc_opaque2:24;
496	uint32_t		oc_opaque3;
497	uint32_t		oc_opaque4;
498} ibt_chan_open_args_t;
499
500
501/*
502 * Define an optional RC return arguments structure. This contains return
503 * parameters from ibt_open_rc_channel() when called in BLOCKING mode.
504 *
505 * rc_priv_data should be NULL or point to a buffer allocated by the caller,
506 * the size of which should be in rc_priv_data_len, where rc_priv_data_len <=
507 * IBT_REP_PRIV_DATA_SZ.
508 */
509typedef struct ibt_rc_returns_s {
510	uint8_t			rc_rdma_ra_in;	/* Arbitrated resp resources */
511	uint8_t			rc_rdma_ra_out;	/* Arbitrated initiator depth */
512	ibt_arej_info_t		rc_arej_info;
513	ibt_cm_reason_t		rc_status;
514	uint8_t			rc_failover_status;	/* Failover status */
515	ibt_priv_data_len_t	rc_priv_data_len;
516	void			*rc_priv_data;
517} ibt_rc_returns_t;
518
519/*
520 * Define a callback function that can be used in Non-Blocking calls to
521 * ibt_recycle_rc().
522 */
523
524typedef	void	(*ibt_recycle_handler_t)(ibt_status_t ibt_status, void *arg);
525
526/*
527 * Define an optional return arguments structure from ibt_set_alt_path()
528 * This contains return parameters, when called in BLOCKING mode.
529 *
530 * ap_priv_data should be NULL or point to a buffer allocated by the caller,
531 * the size of which should be in ap_priv_data_len, where ap_priv_data_len <=
532 * IBT_APR_PRIV_DATA_SZ.
533 * The private data from APR is returned in ap_priv_data.
534 * The caller specifies amount of APR private data to be returned in
535 * ap_priv_data_len.
536 */
537typedef struct ibt_ap_returns_s {
538	ibt_ap_status_t		ap_status;
539	boolean_t		ap_arej_info_valid;
540	ibt_arej_info_t		ap_arej_info;	/* Only valid if redirect */
541	ibt_priv_data_len_t	ap_priv_data_len;
542	void			*ap_priv_data;
543} ibt_ap_returns_t;
544
545/*
546 * UD remote destination attributes.
547 *
548 * ud_sid, ud_addr, ud_pkt_lt and ud_pkey_ix must be specified.
549 * These values can be as returned in an ibt_path_info_t struct from an
550 * ibt_get_paths() call.
551 *
552 * ud_priv_data should be NULL or point to a buffer allocated by the caller,
553 * the size of which is in ud_priv_data_len, where ud_priv_data_len <=
554 * IBT_SIDR_REQ_PRIV_DATA_SZ.
555 */
556typedef struct ibt_ud_dest_attr_s {
557	ib_svc_id_t		ud_sid;		/* Service ID */
558	ibt_adds_vect_t		*ud_addr;	/* Address Info */
559	uint16_t		ud_pkey_ix;	/* Pkey Index */
560	ib_time_t		ud_pkt_lt;
561	ibt_cm_ud_handler_t	ud_cm_handler;	/* An optional CM UD event */
562						/* which must be NULL */
563						/* if not specified. */
564	void			*ud_cm_private; /* First arg to ud_cm_handler */
565	ibt_priv_data_len_t	ud_priv_data_len;
566	void			*ud_priv_data;	/* SIDR REQ private data */
567} ibt_ud_dest_attr_t;
568
569/*
570 * Define an optional UD return arguments structure.
571 *
572 * ud_priv_data should be NULL or point to a buffer allocated by the caller,
573 * the size of which should be in ud_priv_data_len, where ud_priv_data_len <=
574 * IBT_SIDR_REP_PRIV_DATA_SZ.
575 */
576typedef struct ibt_ud_returns_s {
577	ibt_sidr_status_t	ud_status;
578	ibt_redirect_info_t	ud_redirect;
579	ib_qpn_t		ud_dqpn;	/* Returned destination QPN */
580	ib_qkey_t		ud_qkey;	/* Q_Key for destination QPN */
581	ibt_priv_data_len_t	ud_priv_data_len;
582	void			*ud_priv_data;
583} ibt_ud_returns_t;
584
585/*
586 * Multicast group attributes
587 * Not specified attributes should be set to "NULL" or "0".
588 * Used by ibt_join_mcg()/ibt_query_mcg().
589 *
590 * mc_qkey, mc_pkey, mc_flow, mc_tclass, mc_sl, mc_join_state are required for
591 * create - ibt_join_mcg().
592 */
593typedef struct ibt_mcg_attr_s {
594	ib_gid_t		mc_mgid;	/* MGID */
595	ib_gid_t		mc_pgid;	/* SGID of the end port being */
596						/* added to the MCG. */
597	ib_qkey_t		mc_qkey;	/* Q_Key */
598	ib_pkey_t		mc_pkey;	/* Partition key for this MCG */
599	ibt_mtu_req_t		mc_mtu_req;	/* MTU */
600	ibt_srate_req_t		mc_rate_req;	/* Static rate */
601	ibt_pkt_lt_req_t	mc_pkt_lt_req;	/* Packet Life Time Request */
602	uint_t			mc_flow:20;	/* FlowLabel. */
603	uint8_t			mc_hop;		/* HopLimit */
604	uint8_t			mc_tclass;	/* Traffic Class. */
605	uint8_t			mc_sl:4;	/* Service Level */
606	uint8_t			mc_scope:4,	/* Multicast Address Scope */
607				mc_join_state:4; /* FULL For create */
608	ib_lid_t		mc_opaque1;
609} ibt_mcg_attr_t;
610
611/*
612 * Multicast group attributes.
613 * returned by ibt_join_mcg()/ibt_query_mcg().
614 */
615typedef struct ibt_mcg_info_s {
616	ibt_adds_vect_t		mc_adds_vect;   /* Address information */
617	ib_mtu_t		mc_mtu;		/* MTU */
618	ib_qkey_t		mc_qkey;	/* Q_Key */
619	uint16_t		mc_pkey_ix;	/* Pkey Index */
620	uint8_t			mc_scope:4;	/* Multicast Address Scope */
621	clock_t			mc_opaque2;
622} ibt_mcg_info_t;
623
624/*
625 * Define a callback function that can be used in Non-Blocking calls to
626 * ibt_join_mcg().
627 */
628typedef void (*ibt_mcg_handler_t)(void *arg, ibt_status_t retval,
629    ibt_mcg_info_t *mcg_info_p);
630
631
632/*
633 * Service Flags - sd_flags
634 *
635 *    IBT_SRV_PEER_TYPE_SID	Peer-to-peer Service IDs.
636 */
637
638typedef enum ibt_service_flags_e {
639	IBT_SRV_NO_FLAGS	= 0x0,
640	IBT_SRV_PEER_TYPE_SID	= 0x1
641} ibt_service_flags_t;
642
643/*
644 * Define a Service ID Registration structure.
645 */
646typedef struct ibt_srv_desc_s {
647	ibt_cm_ud_handler_t	sd_ud_handler;	/* UD Service Handler */
648	ibt_cm_handler_t	sd_handler;	/* Non-UD Service Handler */
649	ibt_service_flags_t	sd_flags;	/* Flags */
650} ibt_srv_desc_t;
651
652/*
653 * Flag to indicate ibt_bind_service() to or NOT-to clean-up Stale matching
654 * Local Service Records with SA prior to binding the new request.
655 */
656#define	IBT_SBIND_NO_FLAGS	0
657#define	IBT_SBIND_NO_CLEANUP	1
658
659/*
660 * Define a Service ID Binding structure (data for service records).
661 */
662typedef struct ibt_srv_bind_s {
663	uint64_t	sb_key[2];	/* Service Key */
664	char		*sb_name;	/* Service Name (up to 63 chars) */
665	uint32_t	sb_lease;	/* Service Lease period (in seconds) */
666	ib_pkey_t	sb_pkey;	/* Service P_Key */
667	ibt_srv_data_t	sb_data;	/* Service Data */
668	uint_t		sb_flag;	/* indicates to/not-to clean-up stale */
669					/* matching local service records. */
670} ibt_srv_bind_t;
671
672/*
673 * ibt_cm_delay() flags.
674 *
675 * Refer to InfiniBand Architecture Release Volume 1 Rev 1.0a:
676 * Section 12.6.6 MRA
677 */
678typedef enum ibt_cmdelay_flags_e {
679	IBT_CM_DELAY_REQ	= 0,
680	IBT_CM_DELAY_REP	= 1,
681	IBT_CM_DELAY_LAP	= 2
682} ibt_cmdelay_flags_t;
683
684/*
685 * The payload for DDI events passed on IB_PROP_UPDATE_EVENT.
686 * This is passed as the bus nexus data to event_handler(9e).
687 */
688typedef struct ibt_prop_update_payload_s {
689	union {
690		struct {
691			uint32_t	srv_updated:1;
692			uint32_t	gid_updated:1;
693		} _ib_prop_update_struct;
694		uint32_t	prop_updated;
695	} _ib_prop_update_union;
696	ibt_status_t		ib_reprobe_status;
697
698#define	ib_srv_prop_updated	\
699    _ib_prop_update_union._ib_prop_update_struct.srv_updated
700#define	ib_gid_prop_updated	\
701    _ib_prop_update_union._ib_prop_update_struct.gid_updated
702#define	ib_prop_updated		\
703    _ib_prop_update_union.prop_updated
704} ibt_prop_update_payload_t;
705
706
707/*
708 * FUNCTION PROTOTYPES.
709 */
710
711/*
712 * ibt_attach() and ibt_detach():
713 *	These are the calls into IBTF used during client driver attach() and
714 *	detach().
715 *
716 *	The IBTF returns an ibt_clnt_hdl_t to the client. This handle is used
717 *	to identify this client device in all subsequent calls into the IBTF.
718 *
719 *	The ibt_detach() routine is called from a client driver's detach()
720 *	routine to deregister itself from the IBTF.
721 */
722ibt_status_t ibt_attach(ibt_clnt_modinfo_t *mod_infop, dev_info_t *arg,
723    void *clnt_private, ibt_clnt_hdl_t *ibt_hdl_p);
724
725ibt_status_t ibt_detach(ibt_clnt_hdl_t ibt_hdl);
726
727/*
728 * HCA FUNCTIONS
729 */
730
731/*
732 * ibt_get_hca_list()
733 *	Returns the number of HCAs in a system and their node GUIDS.
734 *
735 *	If hca_list_p is not NULL then the memory for the array of GUIDs is
736 *	allocated by the IBTF and should be freed by the caller using
737 *	ibt_free_hca_list(). If hca_list_p is NULL then no memory is allocated
738 *	by ibt_get_hca_list and only the number of HCAs in a system is returned.
739 *
740 *	It is assumed that the caller can block in kmem_alloc.
741 *
742 * ibt_free_hca_list()
743 *	Free the memory allocated by ibt_get_hca_list().
744 */
745uint_t ibt_get_hca_list(ib_guid_t **hca_list_p);
746
747void ibt_free_hca_list(ib_guid_t *hca_list, uint_t entries);
748
749/*
750 * ibt_open_hca()	- Open/Close a HCA. HCA can only be opened/closed
751 * ibt_close_hca()	  once. ibt_open_hca() takes a client's ibt handle
752 *			  and a GUID and returns a unique IBT client HCA
753 *			  handle.
754 *
755 * These routines can not be called from interrupt context.
756 */
757ibt_status_t ibt_open_hca(ibt_clnt_hdl_t ibt_hdl, ib_guid_t hca_guid,
758    ibt_hca_hdl_t *hca_hdl);
759
760ibt_status_t ibt_close_hca(ibt_hca_hdl_t hca_hdl);
761
762
763/*
764 * ibt_query_hca()
765 * ibt_query_hca_byguid()
766 * 	Returns the static attributes of the specified HCA
767 */
768ibt_status_t ibt_query_hca(ibt_hca_hdl_t hca_hdl, ibt_hca_attr_t *hca_attrs);
769
770ibt_status_t ibt_query_hca_byguid(ib_guid_t hca_guid,
771    ibt_hca_attr_t *hca_attrs);
772
773
774/*
775 * ibt_query_hca_ports()
776 * ibt_query_hca_ports_byguid()
777 *	Returns HCA port/ports attributes for the specified HCA port/ports.
778 *	ibt_query_hca_ports() allocates the memory required for the
779 *	ibt_hca_portinfo_t struct as well as the memory required for the SGID
780 *	and P_Key tables contained within that struct.
781 *
782 * ibt_free_portinfo()
783 *	Frees the memory allocated for a specified ibt_hca_portinfo_t struct.
784 */
785ibt_status_t ibt_query_hca_ports(ibt_hca_hdl_t hca_hdl, uint8_t port,
786    ibt_hca_portinfo_t **port_info_p, uint_t *ports_p, uint_t *size_p);
787
788ibt_status_t ibt_query_hca_ports_byguid(ib_guid_t hca_guid, uint8_t port,
789    ibt_hca_portinfo_t **port_info_p, uint_t *ports_p, uint_t *size_p);
790
791void ibt_free_portinfo(ibt_hca_portinfo_t *port_info, uint_t size);
792
793/*
794 * ibt_set_hca_private()	- Set/get the client private data.
795 * ibt_get_hca_private()
796 */
797void ibt_set_hca_private(ibt_hca_hdl_t hca_hdl, void *clnt_private);
798void *ibt_get_hca_private(ibt_hca_hdl_t hca_hdl);
799
800/*
801 * ibt_hca_handle_to_guid()
802 *	A helper function to retrieve HCA GUID for the specified handle.
803 *	Returns HCA GUID on which the specified Channel is allocated. Valid
804 *	if it is non-NULL on return.
805 */
806ib_guid_t ibt_hca_handle_to_guid(ibt_hca_hdl_t hca);
807
808/*
809 * ibt_hca_guid_to_handle()
810 *	A helper function to retrieve a hca handle from a HCA GUID.
811 */
812ibt_status_t ibt_hca_guid_to_handle(ibt_clnt_hdl_t ibt_hdl, ib_guid_t hca_guid,
813    ibt_hca_hdl_t *hca_hdl);
814
815/*
816 * CONNECTION ESTABLISHMENT/TEAR DOWN FUNCTIONS.
817 */
818
819/*
820 * ibt_get_paths
821 *	Finds the best path to a specified destination (as determined by the
822 *	IBTL) that satisfies the requirements specified in an ibt_path_attr_t
823 *	struct.
824 */
825ibt_status_t ibt_get_paths(ibt_clnt_hdl_t ibt_hdl, ibt_path_flags_t flags,
826    ibt_path_attr_t *attr, uint8_t max_paths, ibt_path_info_t *paths,
827    uint8_t *num_paths_p);
828
829
830/*
831 * Callback function that can be used in ibt_aget_paths(), a Non-Blocking
832 * version of ibt_get_paths().
833 */
834typedef void (*ibt_path_handler_t)(void *arg, ibt_status_t retval,
835    ibt_path_info_t *paths, uint8_t num_paths);
836
837/*
838 * Find path(s) to a given destination or service asynchronously.
839 * ibt_aget_paths() is a Non-Blocking version of ibt_get_paths().
840 */
841ibt_status_t ibt_aget_paths(ibt_clnt_hdl_t ibt_hdl, ibt_path_flags_t flags,
842    ibt_path_attr_t *attr, uint8_t max_paths, ibt_path_handler_t func,
843    void  *arg);
844
845/*
846 * ibt_get_alt_path
847 *	Finds the best alternate path to a specified channel (as determined by
848 *	the IBTL) that satisfies the requirements specified in an
849 *	ibt_alt_path_attr_t struct.  The specified channel must have been
850 *	previously opened successfully using ibt_open_rc_channel.
851 */
852ibt_status_t ibt_get_alt_path(ibt_channel_hdl_t chan, ibt_path_flags_t flags,
853    ibt_alt_path_attr_t *attr, ibt_alt_path_info_t *alt_path);
854
855/*
856 * ibt_open_rc_channel
857 * 	ibt_open_rc_channel() opens a previously allocated RC communication
858 *	channel. The IBTL initiates the channel establishment protocol.
859 */
860ibt_status_t ibt_open_rc_channel(ibt_channel_hdl_t rc_chan,
861    ibt_chan_open_flags_t flags, ibt_execution_mode_t mode,
862    ibt_chan_open_args_t *args, ibt_rc_returns_t *returns);
863
864/*
865 * ibt_close_rc_channel
866 *	Close the specified channel. Outstanding work requests are flushed
867 *	so that the client can do the associated clean up. After that, the
868 *	client will usually deregister the previously registered memory,
869 *	then free the channel by calling ibt_free_rc_channel().
870 *
871 *	This function will reuse CM event Handler provided in
872 *	ibt_open_rc_channel().
873 */
874ibt_status_t ibt_close_rc_channel(ibt_channel_hdl_t rc_chan,
875    ibt_execution_mode_t mode, void *priv_data,
876    ibt_priv_data_len_t priv_data_len, uint8_t *ret_status,
877    void *ret_priv_data, ibt_priv_data_len_t *ret_priv_data_len_p);
878
879/*
880 * ibt_prime_close_rc_channel
881 *
882 *	Allocates resources required for a close rc channel operation.
883 *	Calling ibt_prime_close_rc_channel() allows a channel to be
884 *	subsequently closed in interrupt context.
885 *
886 *	A call is first made to ibt_prime_close_rc_channel in non-interrupt
887 *	context, followed by ibt_close_rc_channel in non-blocking mode from
888 *	interrupt context
889 *
890 *	ibt_prime_close_rc_channel() can only be called on a previously opened
891 *	channel.
892 */
893ibt_status_t ibt_prime_close_rc_channel(ibt_channel_hdl_t rc_chan);
894
895/*
896 * ibt_recycle_rc
897 *
898 *      Recycle a RC channel which has transitioned to Error state. The
899 *      ibt_recycle_rc() function transitions the channel from Error
900 *      state (IBT_STATE_ERROR) to the state ready for use by
901 *      ibt_open_rc_channel. Basically, this function is very similar to
902 *      ibt_alloc_rc_channel, but reuses an existing RC channel.
903 *
904 * Clients are allowed to make resource clean up/free calls in the CM handler
905 *
906 * Client(s) must not invoke blocking version (ie., func specified as NULL) of
907 * ibt_recycle_rc from cm callback for IBT_CM_EVENT_CONN_CLOSED
908 *
909 * Clients are strongly advised not to issue blocking calls from  func, as this
910 * would block the CM threads, and could delay or block other client connections
911 * and ibtl related API invocations.
912 */
913ibt_status_t ibt_recycle_rc(ibt_channel_hdl_t rc_chan, ibt_cep_flags_t control,
914    uint8_t hca_port_num, ibt_recycle_handler_t func, void *arg);
915
916/*
917 * ibt_recycle_ud
918 *
919 *      Recycle a UD channel which has transitioned to Error state. The
920 *      ibt_recycle_ud() function transitions the channel from Error
921 *      state (IBT_STATE_ERROR) to a usable state (IBT_STATE_RTS).
922 *      Basically, this function is very similar to ibt_alloc_ud_channel,
923 *	but reuses an existing UD channel.
924 */
925ibt_status_t ibt_recycle_ud(ibt_channel_hdl_t ud_chan, uint8_t hca_port_num,
926    uint16_t pkey_ix, ib_qkey_t qkey);
927
928/*
929 * MODIFY CHANNEL ATTRIBUTE FUNCTIONs.
930 */
931
932/*
933 * ibt_pause_sendq
934 * ibt_unpause_sendq
935 *	Place the send queue of the specified channel into the send queue
936 *	drained state.
937 *	Applicable for both RC and UD channels.
938 */
939ibt_status_t ibt_pause_sendq(ibt_channel_hdl_t chan,
940    ibt_cep_modify_flags_t modify_flags);
941
942ibt_status_t ibt_unpause_sendq(ibt_channel_hdl_t chan);
943
944/*
945 * ibt_resize_queues()
946 *	Resize the SendQ/RecvQ sizes of a channel.
947 *
948 *	Applicable for both RC and UD channels.
949 */
950ibt_status_t ibt_resize_queues(ibt_channel_hdl_t chan, ibt_qflags_t flags,
951    ibt_queue_sizes_t *request_sz, ibt_queue_sizes_t *actual_sz);
952
953/*
954 * ibt_query_queues()
955 *
956 *	Query the SendQ/RecvQ sizes of a channel.
957 *	Applicable for both RC and UD channels.
958 */
959ibt_status_t ibt_query_queues(ibt_channel_hdl_t chan,
960    ibt_queue_sizes_t *actual_sz);
961
962/*
963 * ibt_modify_rdma
964 *	Enable/disable RDMA operations.
965 *
966 *	Applicable for RC channels only.
967 */
968ibt_status_t ibt_modify_rdma(ibt_channel_hdl_t rc_chan,
969    ibt_cep_modify_flags_t modify_flags, ibt_cep_flags_t flags);
970
971
972/*
973 * ibt_set_rdma_resource
974 *	Change the number of resources to be used for incoming and outgoing
975 *	RDMA reads & Atomics.
976 */
977ibt_status_t ibt_set_rdma_resource(ibt_channel_hdl_t rc_chan,
978    ibt_cep_modify_flags_t modify_flags, uint8_t rdma_ra_out,
979    uint8_t rdma_ra_in);
980
981/*
982 * ibt_change_port
983 *	Change the primary physical port of an RC channel. (This is done only
984 *	if HCA supports this capability).  Can only be called on a paused
985 *	channel.
986 *	Applicable for RC channels only.
987 */
988ibt_status_t ibt_change_port(ibt_channel_hdl_t rc_chan, uint8_t port_num);
989
990
991/*
992 * SERVICE REGISTRATION FUNCTIONS
993 */
994
995/*
996 * ibt_register_service()
997 * ibt_deregister_service()
998 *	Register/deregister a Service (range of Service IDs) with the IBTF.
999 *
1000 * ibt_bind_service()
1001 * ibt_unbind_service()
1002 * ibt_unbind_all_services()
1003 *	Bind a Service to a given port (GID), and optionally create
1004 *	service record(s) with the SA for ibt_get_paths() to find.
1005 */
1006ibt_status_t ibt_register_service(ibt_clnt_hdl_t ibt_hdl,
1007    ibt_srv_desc_t *service, ib_svc_id_t sid, int num_sids,
1008    ibt_srv_hdl_t *srv_hdl_p, ib_svc_id_t *ret_sid_p);
1009
1010ibt_status_t ibt_deregister_service(ibt_clnt_hdl_t ibt_hdl,
1011    ibt_srv_hdl_t srv_hdl);
1012
1013ibt_status_t ibt_bind_service(ibt_srv_hdl_t srv_hdl, ib_gid_t gid,
1014    ibt_srv_bind_t *srv_bind, void *cm_private, ibt_sbind_hdl_t *sb_hdl_p);
1015
1016ibt_status_t ibt_unbind_service(ibt_srv_hdl_t srv_hdl, ibt_sbind_hdl_t sb_hdl);
1017ibt_status_t ibt_unbind_all_services(ibt_srv_hdl_t srv_hdl);
1018
1019/*
1020 * ibt_cm_delay
1021 *	A client CM handler/srv_handler function can call this function to
1022 *	extend its response time to a CM event.
1023 *	Applicable for RC channels only.
1024 */
1025ibt_status_t ibt_cm_delay(ibt_cmdelay_flags_t flags, void *cm_session_id,
1026    clock_t service_time, void *priv_data, ibt_priv_data_len_t priv_data_len);
1027
1028/*
1029 * ibt_cm_proceed
1030 *
1031 * An IBT client calls ibt_cm_proceed() to proceed with a connection that
1032 * previously deferred by the client returning IBT_CM_DEFER on a CM handler
1033 * callback. CM events that can be deferred and continued with ibt_cm_proceed()
1034 * are REQ_RCV, REP_RCV, LAP_RCV, and DREQ_RCV.
1035 *
1036 * NOTE :
1037 *
1038 * Typically CM completes processing of a client's CM handler return, with
1039 * IBT_CM_DEFER status, before  processing of the corresponding ibt_cm_proceed()
1040 * is started. However a race exists where by CM may not have completed the
1041 * client's handler return processing when ibt_cm_proceed() is called by a
1042 * client. In this case ibt_cm_proceed() will block until processing of the
1043 * client's CM handler return is complete.
1044 *
1045 * A client that returns IBT_CM_DEFER from the cm handler must
1046 * subsequently make a call to ibt_cm_proceed(). It is illegal to call
1047 * ibt_cm_proceed() on a channel that has not had the connection
1048 * establishment deferred.
1049 *
1050 * Client cannot call ibt_cm_proceed from the cm handler.
1051 */
1052ibt_status_t ibt_cm_proceed(ibt_cm_event_type_t event, void *session_id,
1053    ibt_cm_status_t status, ibt_cm_proceed_reply_t *cm_event_data,
1054    void *priv_data, ibt_priv_data_len_t priv_data_len);
1055
1056/*
1057 * ibt_cm_ud_proceed
1058 *
1059 * An IBT client calls ibt_cm_ud_proceed() to proceed with an
1060 * IBT_CM_UD_EVENT_SIDR_REQ  UD event that was previously deferred by the
1061 * client returning IBT_CM_DEFER on a CM UD handler callback.
1062 * NOTE :
1063 *
1064 * Typically CM completes processing of a client's CM handler return, with
1065 * IBT_CM_DEFER status, before  processing of the corresponding
1066 * ibt_cm_ud_proceed() is started. However a race exists where by CM may not
1067 * have completed the client's handler return processing when
1068 * ibt_cm_ud_proceed() is called by a client. In this case ibt_cm_ud_proceed()
1069 * will block until processing of the client's CM handler return is complete.
1070 *
1071 * A client that returns IBT_CM_DEFER from the cm handler must
1072 * subsequently make a call to ibt_cm_ud_proceed(). It is illegal to call
1073 * ibt_cm_ud_proceed() on a channel that has not had the connection
1074 * establishment deferred.
1075 *
1076 * Client cannot call ibt_cm_ud_proceed from the cm handler.
1077 */
1078ibt_status_t ibt_cm_ud_proceed(void *session_id, ibt_channel_hdl_t ud_channel,
1079    ibt_cm_status_t status, ibt_redirect_info_t *redirect_infop,
1080    void *priv_data, ibt_priv_data_len_t priv_data_len);
1081
1082
1083/*
1084 * COMPLETION QUEUES.
1085 *
1086 * ibt_alloc_cq_sched()
1087 *	Reserve CQ scheduling class resources
1088 *
1089 * ibt_free_cq_sched()
1090 *	Free CQ scheduling class resources
1091 */
1092ibt_status_t ibt_alloc_cq_sched(ibt_hca_hdl_t hca_hdl,
1093    ibt_cq_sched_attr_t *attr, ibt_sched_hdl_t *sched_hdl_p);
1094
1095ibt_status_t ibt_free_cq_sched(ibt_hca_hdl_t hca_hdl,
1096    ibt_sched_hdl_t sched_hdl, uint_t load);
1097
1098/*
1099 * ibt_alloc_cq()
1100 *	Allocate a completion queue.
1101 */
1102ibt_status_t ibt_alloc_cq(ibt_hca_hdl_t hca_hdl, ibt_cq_attr_t *cq_attr,
1103    ibt_cq_hdl_t *ibt_cq_p, uint_t *real_size);
1104
1105/*
1106 * ibt_free_cq()
1107 *	Free allocated CQ resources.
1108 */
1109ibt_status_t ibt_free_cq(ibt_cq_hdl_t ibt_cq);
1110
1111
1112/*
1113 * ibt_enable_cq_notify()
1114 *	Enable notification requests on the specified CQ.
1115 *	Applicable for both RC and UD channels.
1116 *
1117 *	Completion notifications are disabled by setting the completion
1118 *	handler to NULL by calling ibt_set_cq_handler().
1119 */
1120ibt_status_t ibt_enable_cq_notify(ibt_cq_hdl_t ibt_cq,
1121    ibt_cq_notify_flags_t notify_type);
1122
1123/*
1124 * ibt_set_cq_handler()
1125 *	Register a work request completion handler with the IBTF.
1126 *	Applicable for both RC and UD channels.
1127 *
1128 *	Completion notifications are disabled by setting the completion
1129 *	handler to NULL. When setting the handler to NULL, no additional
1130 *	calls to the CQ handler will be initiated.
1131 *
1132 *	This function does not otherwise change the state of previous
1133 *	calls to ibt_enable_cq_notify().
1134 */
1135void ibt_set_cq_handler(ibt_cq_hdl_t ibt_cq,
1136    ibt_cq_handler_t completion_handler, void *arg);
1137
1138/*
1139 * ibt_poll_cq()
1140 *	Poll the specified CQ for the completion of work requests (WRs).
1141 *	If the CQ contains completed WRs, up to num_wc of them are returned.
1142 *	Applicable for both RC and UD channels.
1143 */
1144ibt_status_t ibt_poll_cq(ibt_cq_hdl_t ibt_cq, ibt_wc_t *work_completions,
1145    uint_t num_wc, uint_t *num_polled);
1146
1147/*
1148 * ibt_query_cq()
1149 *	Return the total number of entries in the CQ.
1150 */
1151ibt_status_t ibt_query_cq(ibt_cq_hdl_t ibt_cq, uint_t *entries,
1152    uint_t *count_p, uint_t *usec_p, ibt_cq_handler_id_t *hid_p);
1153
1154/*
1155 * ibt_resize_cq()
1156 *	Change the size of a CQ.
1157 */
1158ibt_status_t ibt_resize_cq(ibt_cq_hdl_t ibt_cq, uint_t new_sz, uint_t *real_sz);
1159
1160/*
1161 * ibt_modify_cq()
1162 *	Change the interrupt moderation values of a CQ.
1163 *	"count" is number of completions before interrupting.
1164 *	"usec" is the number of microseconds before interrupting.
1165 */
1166ibt_status_t ibt_modify_cq(ibt_cq_hdl_t ibt_cq, uint_t count, uint_t usec,
1167    ibt_cq_handler_id_t hid);
1168
1169/*
1170 * ibt_set_cq_private()
1171 * ibt_get_cq_private()
1172 *	Set/get the client private data.
1173 */
1174void ibt_set_cq_private(ibt_cq_hdl_t ibt_cq, void *clnt_private);
1175void *ibt_get_cq_private(ibt_cq_hdl_t ibt_cq);
1176
1177
1178/*
1179 * Memory Management Functions.
1180 *	Applicable for both RC and UD channels.
1181 *
1182 * ibt_register_mr()
1183 * 	Prepares a virtually addressed memory region for use by a HCA. A
1184 *	description of the registered memory suitable for use in Work Requests
1185 *	(WRs) is returned in the ibt_mr_desc_t parameter.
1186 *
1187 * ibt_register_buf()
1188 * 	Prepares a memory region described by a buf(9S) struct for use by a
1189 *	HCA. A description of the registered memory suitable for use in
1190 *	Work Requests (WRs) is returned in the ibt_mr_desc_t parameter.
1191 *
1192 * ibt_query_mr()
1193 *	Retrieves information about a specified memory region.
1194 *
1195 * ibt_deregister_mr()
1196 *	Remove a memory region from a HCA translation table, and free all
1197 *	resources associated with the memory region.
1198 *
1199 * ibt_reregister_mr()
1200 * ibt_reregister_buf()
1201 *	Modify the attributes of an existing memory region.
1202 *
1203 * ibt_register_shared_mr()
1204 *	Given an existing memory region, a new memory region associated with
1205 *	the same physical locations is created.
1206 *
1207 * ibt_sync_mr()
1208 *	Sync a memory region for either RDMA reads or RDMA writes
1209 *
1210 * ibt_alloc_mw()
1211 *	Allocate a memory window.
1212 *
1213 * ibt_query_mw()
1214 *	Retrieves information about a specified memory window.
1215 *
1216 * ibt_free_mw()
1217 *	De-allocate the Memory Window.
1218 */
1219ibt_status_t ibt_register_mr(ibt_hca_hdl_t hca_hdl, ibt_pd_hdl_t pd,
1220    ibt_mr_attr_t *mem_attr, ibt_mr_hdl_t *mr_hdl_p, ibt_mr_desc_t *mem_desc);
1221
1222ibt_status_t ibt_register_buf(ibt_hca_hdl_t hca_hdl, ibt_pd_hdl_t pd,
1223    ibt_smr_attr_t *mem_bpattr, struct buf *bp, ibt_mr_hdl_t *mr_hdl_p,
1224    ibt_mr_desc_t *mem_desc);
1225
1226ibt_status_t ibt_query_mr(ibt_hca_hdl_t hca_hdl, ibt_mr_hdl_t mr_hdl,
1227    ibt_mr_query_attr_t *attr);
1228
1229ibt_status_t ibt_deregister_mr(ibt_hca_hdl_t hca_hdl, ibt_mr_hdl_t mr_hdl);
1230
1231ibt_status_t ibt_reregister_mr(ibt_hca_hdl_t hca_hdl, ibt_mr_hdl_t mr_hdl,
1232    ibt_pd_hdl_t pd, ibt_mr_attr_t *mem_attr, ibt_mr_hdl_t *mr_hdl_p,
1233    ibt_mr_desc_t *mem_desc);
1234
1235ibt_status_t ibt_reregister_buf(ibt_hca_hdl_t hca_hdl, ibt_mr_hdl_t mr_hdl,
1236    ibt_pd_hdl_t pd, ibt_smr_attr_t *mem_bpattr, struct buf *bp,
1237    ibt_mr_hdl_t *mr_hdl_p, ibt_mr_desc_t *mem_desc);
1238
1239ibt_status_t ibt_register_shared_mr(ibt_hca_hdl_t hca_hdl, ibt_mr_hdl_t mr_hdl,
1240    ibt_pd_hdl_t pd, ibt_smr_attr_t *mem_sattr, ibt_mr_hdl_t *mr_hdl_p,
1241    ibt_mr_desc_t *mem_desc);
1242
1243ibt_status_t ibt_sync_mr(ibt_hca_hdl_t hca_hdl, ibt_mr_sync_t *mr_segments,
1244    size_t num_segments);
1245
1246ibt_status_t ibt_alloc_mw(ibt_hca_hdl_t hca_hdl, ibt_pd_hdl_t pd,
1247    ibt_mw_flags_t flags, ibt_mw_hdl_t *mw_hdl_p, ibt_rkey_t *rkey);
1248
1249ibt_status_t ibt_query_mw(ibt_hca_hdl_t hca_hdl, ibt_mw_hdl_t mw_hdl,
1250    ibt_mw_query_attr_t *mw_attr_p);
1251
1252ibt_status_t ibt_free_mw(ibt_hca_hdl_t hca_hdl, ibt_mw_hdl_t mw_hdl);
1253
1254/*
1255 * ibt_alloc_lkey()
1256 * 	Allocates physical buffer list resources for use in memory
1257 *	registrations.
1258 *
1259 *	Applicable for both RC and UD channels.
1260 */
1261ibt_status_t ibt_alloc_lkey(ibt_hca_hdl_t hca_hdl, ibt_pd_hdl_t pd,
1262    ibt_lkey_flags_t flags, uint_t phys_buf_list_sz, ibt_mr_hdl_t *mr_p,
1263    ibt_pmr_desc_t *mem_desc_p);
1264
1265
1266/*
1267 * Physical Memory Management Functions.
1268 *	Applicable for both RC and UD channels.
1269 *
1270 * ibt_register_phys_mr()
1271 *	Prepares a physically addressed memory region for use by a HCA.
1272 *
1273 * ibt_reregister_phys_mr()
1274 *	Modify the attributes of an existing memory region.
1275 */
1276ibt_status_t ibt_register_phys_mr(ibt_hca_hdl_t hca_hdl, ibt_pd_hdl_t pd,
1277    ibt_pmr_attr_t *mem_pattr, ibt_mr_hdl_t *mr_hdl_p,
1278    ibt_pmr_desc_t *mem_desc_p);
1279
1280ibt_status_t ibt_reregister_phys_mr(ibt_hca_hdl_t hca_hdl, ibt_mr_hdl_t mr_hdl,
1281    ibt_pd_hdl_t pd, ibt_pmr_attr_t *mem_pattr, ibt_mr_hdl_t *mr_hdl_p,
1282    ibt_pmr_desc_t *mem_desc_p);
1283
1284
1285/*
1286 * Address Translation.
1287 */
1288
1289/*
1290 * ibt_map_mem_area()
1291 *	Translate a kernel virtual address range into HCA physical addresses.
1292 *	A set of physical addresses, that can be used with "Reserved L_Key",
1293 *	register physical,  and "Fast Registration Work Request" operations
1294 *	is returned.
1295 */
1296ibt_status_t ibt_map_mem_area(ibt_hca_hdl_t hca_hdl, ibt_va_attr_t *va_attrs,
1297    uint_t paddr_list_len, ibt_phys_buf_t *paddr_list_p, uint_t *num_paddr_p,
1298    size_t *paddr_bufsz_p, ib_memlen_t *paddr_offset_p, ibt_ma_hdl_t *ma_hdl_p);
1299
1300/*
1301 * ibt_unmap_mem_area()
1302 *	Un pin physical pages pinned during an ibt_map_mem_area() call.
1303 */
1304ibt_status_t ibt_unmap_mem_area(ibt_hca_hdl_t hca_hdl, ibt_ma_hdl_t ma_hdl);
1305
1306/* ibt_map_mem_iov() */
1307ibt_status_t ibt_map_mem_iov(ibt_hca_hdl_t hca_hdl,
1308    ibt_iov_attr_t *iov_attr, ibt_all_wr_t *wr, ibt_mi_hdl_t *mi_hdl);
1309
1310/* ibt_unmap_mem_iov() */
1311ibt_status_t ibt_unmap_mem_iov(ibt_hca_hdl_t hca_hdl, ibt_mi_hdl_t mi_hdl);
1312
1313/*
1314 * Work Request Functions
1315 *	Applicable for RC and UD channels.
1316 *
1317 * ibt_post_send()
1318 *	Post send work requests to the specified channel.
1319 *
1320 * ibt_post_recv()
1321 * ibt_post_srq()
1322 *	Post receive work requests to the specified channel.
1323 */
1324ibt_status_t ibt_post_send(ibt_channel_hdl_t chan, ibt_send_wr_t *wr_list,
1325    uint_t num_wr, uint_t *posted);
1326
1327ibt_status_t ibt_post_recv(ibt_channel_hdl_t chan, ibt_recv_wr_t *wr_list,
1328    uint_t num_wr, uint_t *posted);
1329
1330ibt_status_t ibt_post_srq(ibt_srq_hdl_t srq, ibt_recv_wr_t *wr_list,
1331    uint_t num_wr, uint_t *posted);
1332
1333
1334/*
1335 * Alternate Path Migration Functions.
1336 *	Applicable for RC channels only.
1337 *
1338 *
1339 * ibt_get_alt_path()
1340 *	Finds the best alternate path to a specified channel (as determined by
1341 *	the IBTL) that satisfies the requirements specified in an
1342 *	ibt_alt_path_attr_t struct.  The specified channel must have been
1343 *	previously opened successfully using ibt_open_rc_channel.
1344 *	This function also ensures that the service being accessed by the
1345 *	channel is available at the selected alternate port.
1346 *
1347 *	Note: The apa_dgid must be on the same destination channel adapter,
1348 *	if specified.
1349 *
1350 *
1351 * ibt_set_alt_path()
1352 *	Load the specified alternate path. Causes the CM to send an LAP message
1353 *	to the remote node. If successful, the local channel is updated with
1354 *	the new alternate path and the channel migration state is set to REARM.
1355 *	Can only be called on a previously opened RC channel. The channel must
1356 *	be either in RTS or paused state.
1357 *
1358 *
1359 * ibt_migrate_path()
1360 *	Force the CI to use the alternate path. The alternate path becomes
1361 *	the primary path. A new alternate path should be loaded and enabled.
1362 */
1363ibt_status_t ibt_get_alt_path(ibt_channel_hdl_t rc_chan, ibt_path_flags_t flags,
1364    ibt_alt_path_attr_t *attr, ibt_alt_path_info_t *alt_pathp);
1365
1366ibt_status_t ibt_set_alt_path(ibt_channel_hdl_t rc_chan,
1367    ibt_execution_mode_t mode, ibt_alt_path_info_t *alt_pinfo, void *priv_data,
1368    ibt_priv_data_len_t priv_data_len, ibt_ap_returns_t *ret_args);
1369
1370ibt_status_t ibt_migrate_path(ibt_channel_hdl_t rc_chan);
1371
1372
1373/*
1374 * Multicast group Functions.
1375 *	Applicable for UD channels only.
1376 */
1377
1378/*
1379 * ibt_attach_mcg()
1380 *	Attaches a UD channel to the specified multicast group. On successful
1381 *	completion, this channel will be provided with a copy of every
1382 *	multicast message addressed to the group specified by the MGID
1383 *	(mcg_info->mc_adds_vect.av_dgid) and received on the HCA port with
1384 *	which the channel is associated.
1385 */
1386ibt_status_t ibt_attach_mcg(ibt_channel_hdl_t ud_chan,
1387    ibt_mcg_info_t *mcg_info);
1388
1389/*
1390 * ibt_detach_mcg()
1391 *	Detach the specified UD channel from the specified multicast group.
1392 */
1393ibt_status_t ibt_detach_mcg(ibt_channel_hdl_t ud_chan,
1394    ibt_mcg_info_t *mcg_info);
1395
1396/*
1397 * ibt_join_mcg()
1398 *	Join a multicast group.  The first full member "join" causes the MCG
1399 *	to be created.
1400 */
1401ibt_status_t ibt_join_mcg(ib_gid_t rgid, ibt_mcg_attr_t *mcg_attr,
1402    ibt_mcg_info_t *mcg_info_p,  ibt_mcg_handler_t func, void  *arg);
1403
1404/*
1405 * ibt_leave_mcg()
1406 *	The port associated with the port GID shall be removed from the
1407 *	multicast group specified by MGID (mc_gid) or from all the multicast
1408 *	groups of which it is a member if the MGID (mc_gid) is not specified
1409 *	(i.e. mc_gid.mgid_prefix must have 8-bits of 11111111 at the start of
1410 *	the GID to identify this as being a multicast GID).
1411 *
1412 *	The last full member to leave causes the destruction of the Multicast
1413 *	Group.
1414 */
1415ibt_status_t ibt_leave_mcg(ib_gid_t rgid, ib_gid_t mc_gid, ib_gid_t port_gid,
1416    uint8_t mc_join_state);
1417
1418/*
1419 * ibt_query_mcg()
1420 *	Request information on multicast groups that match the parameters
1421 *	specified in mcg_attr. Information on each multicast group is returned
1422 *	to the caller in the form of an array of ibt_mcg_info_t.
1423 *	ibt_query_mcg() allocates the memory for this array and returns a
1424 *	pointer to the array (mcgs_p) and the number of entries in the array
1425 *	(entries_p). This memory should be freed by the client using
1426 *	ibt_free_mcg_info().
1427 */
1428ibt_status_t ibt_query_mcg(ib_gid_t rgid, ibt_mcg_attr_t *mcg_attr,
1429    uint_t mcgs_max_num, ibt_mcg_info_t **mcgs_info_p, uint_t *entries_p);
1430
1431/*
1432 * ibt_free_mcg_info()
1433 *	Free the memory allocated by successful ibt_query_mcg()
1434 */
1435void ibt_free_mcg_info(ibt_mcg_info_t *mcgs_info, uint_t entries);
1436
1437
1438/*
1439 * ibt_register_subnet_notices()
1440 *	Register a handler to be called for subnet notifications.
1441 */
1442void ibt_register_subnet_notices(ibt_clnt_hdl_t ibt_hdl,
1443    ibt_sm_notice_handler_t sm_notice_handler, void *private);
1444
1445
1446/*
1447 * Protection Domain Functions.
1448 *
1449 * ibt_alloc_pd()
1450 * ibt_free_pd()
1451 * 	Allocate/Release a protection domain
1452 */
1453ibt_status_t ibt_alloc_pd(ibt_hca_hdl_t hca_hdl, ibt_pd_flags_t flags,
1454    ibt_pd_hdl_t *pd);
1455ibt_status_t ibt_free_pd(ibt_hca_hdl_t hca_hdl, ibt_pd_hdl_t pd);
1456
1457/*
1458 * P_Key to P_Key Index conversion Functions.
1459 *
1460 * ibt_pkey2index_byguid
1461 * ibt_pkey2index	Convert a P_Key into a P_Key index.
1462 *
1463 * ibt_index2pkey_byguid
1464 * ibt_index2pkey	Convert a P_Key Index into a P_Key.
1465 */
1466ibt_status_t ibt_pkey2index(ibt_hca_hdl_t hca_hdl, uint8_t port_num,
1467    ib_pkey_t pkey, uint16_t *pkey_ix);
1468
1469ibt_status_t ibt_index2pkey(ibt_hca_hdl_t hca_hdl, uint8_t port_num,
1470    uint16_t pkey_ix, ib_pkey_t *pkey);
1471
1472ibt_status_t ibt_pkey2index_byguid(ib_guid_t hca_guid, uint8_t port_num,
1473    ib_pkey_t pkey, uint16_t *pkey_ix);
1474
1475ibt_status_t ibt_index2pkey_byguid(ib_guid_t hca_guid, uint8_t port_num,
1476    uint16_t pkey_ix, ib_pkey_t *pkey);
1477
1478/*
1479 *  ibt_ci_data_in()
1480 *
1481 *  Pass CI specific userland data for CI objects to the CI.
1482 */
1483ibt_status_t ibt_ci_data_in(ibt_hca_hdl_t hca, ibt_ci_data_flags_t flags,
1484    ibt_object_type_t object, void *ibt_object_handle, void *data_p,
1485    size_t data_sz);
1486
1487/*
1488 *  ibt_ci_data_out()
1489 *
1490 *  Obtain CI specific userland data for CI objects.
1491 */
1492ibt_status_t ibt_ci_data_out(ibt_hca_hdl_t hca, ibt_ci_data_flags_t flags,
1493    ibt_object_type_t object, void *ibt_object_handle, void *data_p,
1494    size_t data_sz);
1495
1496
1497/*
1498 * Node Information.
1499 */
1500
1501/* Node type : n_node_type */
1502#define	IBT_NODE_TYPE_CHANNEL_ADAPTER	1	/* HCA or TCA */
1503#define	IBT_NODE_TYPE_SWITCH		2
1504#define	IBT_NODE_TYPE_ROUTER		3
1505
1506typedef struct ibt_node_info_s {
1507	ib_guid_t	n_sys_img_guid;	/* System Image GUID */
1508	ib_guid_t	n_node_guid;	/* Node GUID */
1509	ib_guid_t	n_port_guid;	/* Port GUID */
1510	uint16_t	n_dev_id;	/* Device ID */
1511	uint32_t	n_revision;	/* Device Revision */
1512	uint32_t	n_vendor_id:24;	/* Device Vendor ID */
1513	uint8_t		n_num_ports;	/* Number of ports on this node. */
1514	uint8_t		n_port_num;	/* Port number. */
1515	uint8_t		n_node_type;	/* Node type */
1516	char		n_description[64]; /* NULL terminated ASCII string */
1517} ibt_node_info_t;
1518
1519
1520/*
1521 * ibt_gid_to_node_info()
1522 *	Retrieve node information for the specified GID.
1523 */
1524ibt_status_t ibt_gid_to_node_info(ib_gid_t gid, ibt_node_info_t *node_info_p);
1525
1526/*
1527 * ibt_reprobe_dev
1528 *	Reprobe properties for IOC device node.
1529 */
1530ibt_status_t	ibt_reprobe_dev(dev_info_t *dip);
1531
1532/*
1533 * ibt_get_companion_port_gids()
1534 *
1535 *	Get list of GID's available on a companion port(s) of the specified
1536 *	GID or list of GIDs available on a specified Node GUID/System Image
1537 *	GUID.
1538 */
1539ibt_status_t ibt_get_companion_port_gids(ib_gid_t gid, ib_guid_t hca_guid,
1540    ib_guid_t sysimg_guid, ib_gid_t **gids_p, uint_t *num_gids_p);
1541
1542/*
1543 * SHARED RECEIVE QUEUE
1544 */
1545
1546
1547/*
1548 * ibt_alloc_srq()
1549 *	Allocate a shared receive queue.
1550 */
1551ibt_status_t ibt_alloc_srq(ibt_hca_hdl_t hca_hdl, ibt_srq_flags_t flags,
1552    ibt_pd_hdl_t pd, ibt_srq_sizes_t *sizes, ibt_srq_hdl_t *ibt_srq_p,
1553    ibt_srq_sizes_t *real_size_p);
1554
1555/*
1556 * ibt_free_srq()
1557 *	Free allocated SRQ resources.
1558 */
1559ibt_status_t ibt_free_srq(ibt_srq_hdl_t ibt_srq);
1560
1561/*
1562 * ibt_query_srq()
1563 *	Query a shared receive queue.
1564 */
1565ibt_status_t ibt_query_srq(ibt_srq_hdl_t ibt_srq, ibt_pd_hdl_t *pd_p,
1566    ibt_srq_sizes_t *sizes_p, uint_t *limit_p);
1567
1568/*
1569 * ibt_modify_srq()
1570 *	Modify a shared receive queue.
1571 */
1572ibt_status_t ibt_modify_srq(ibt_srq_hdl_t ibt_srq, ibt_srq_modify_flags_t flags,
1573    uint_t size, uint_t limit, uint_t *real_size_p);
1574
1575/*
1576 * ibt_set_srq_private()
1577 * ibt_get_srq_private()
1578 *	Set/get the SRQ client private data.
1579 */
1580void ibt_set_srq_private(ibt_srq_hdl_t ibt_srq, void *clnt_private);
1581void *ibt_get_srq_private(ibt_srq_hdl_t ibt_srq);
1582
1583/*
1584 * ibt_check_failure()
1585 * 	Function to test for special case failures
1586 */
1587ibt_failure_type_t ibt_check_failure(ibt_status_t status, uint64_t *reserved_p);
1588
1589
1590/*
1591 * ibt_hw_is_present() returns 0 when there is no IB hardware actively
1592 * running.  This is primarily useful for modules like rpcmod which needs a
1593 * quick check to decide whether or not it should try to use InfiniBand.
1594 */
1595int ibt_hw_is_present();
1596
1597/*
1598 * Fast Memory Registration (FMR).
1599 *
1600 * ibt_create_fmr_pool
1601 *	Not fast-path.
1602 *	ibt_create_fmr_pool() verifies that the HCA supports FMR and allocates
1603 *	and initializes an "FMR pool".  This pool contains state specific to
1604 *	this registration, including the watermark setting to determine when
1605 *	to sync, and the total number of FMR regions available within this pool.
1606 *
1607 * ibt_destroy_fmr_pool
1608 *	ibt_destroy_fmr_pool() deallocates all of the FMR regions in a specific
1609 *	pool.  All state and information regarding the pool are destroyed and
1610 *	returned as free space once again.  No more use of FMR regions in this
1611 *	pool are possible without a subsequent call to ibt_create_fmr_pool().
1612 *
1613 * ibt_flush_fmr_pool
1614 *	ibt_flush_fmr_pool forces a flush to occur.  At the client's request,
1615 *	any unmapped FMR regions (See 'ibt_deregister_mr())') are returned to
1616 *	a free state.  This function allows for an asynchronous cleanup of
1617 *	formerly used FMR regions.  Sync operation is also performed internally
1618 *	by HCA driver, when 'watermark' settings for the number of free FMR
1619 *	regions left in the "pool" is reached.
1620 *
1621 * ibt_register_physical_fmr
1622 *	ibt_register_physical_fmr() assigns a "free" entry from the FMR Pool.
1623 *	It first consults the "FMR cache" to see if this is a duplicate memory
1624 *	registration to something already in use.  If not, then a free entry
1625 *	in the "pool" is marked used.
1626 *
1627 * ibt_deregister_fmr
1628 *	The ibt_deregister_fmr un-maps the resources reserved from the FMR
1629 *	pool by ibt_register_physical_fmr().   The ibt_deregister_fmr() will
1630 *	mark the region as free in the FMR Pool.
1631 */
1632ibt_status_t ibt_create_fmr_pool(ibt_hca_hdl_t hca_hdl, ibt_pd_hdl_t pd,
1633    ibt_fmr_pool_attr_t *fmr_params, ibt_fmr_pool_hdl_t *fmr_pool_p);
1634
1635ibt_status_t ibt_destroy_fmr_pool(ibt_hca_hdl_t hca_hdl,
1636    ibt_fmr_pool_hdl_t fmr_pool);
1637
1638ibt_status_t ibt_flush_fmr_pool(ibt_hca_hdl_t hca_hdl,
1639    ibt_fmr_pool_hdl_t fmr_pool);
1640
1641ibt_status_t ibt_register_physical_fmr(ibt_hca_hdl_t hca_hdl,
1642    ibt_fmr_pool_hdl_t fmr_pool, ibt_pmr_attr_t *mem_pattr,
1643    ibt_mr_hdl_t *mr_hdl_p, ibt_pmr_desc_t *mem_desc_p);
1644
1645ibt_status_t ibt_deregister_fmr(ibt_hca_hdl_t hca, ibt_mr_hdl_t mr_hdl);
1646
1647/*
1648 * IP SUPPORT
1649 */
1650
1651/*
1652 * IP get_paths
1653 * Returns an array (or single) of paths and source IP addresses. In the
1654 * simplest form just the destination IP address is specified, and one path
1655 * is requested, then one ibt_path_info_t struct and one source IP.
1656 *
1657 * More than one path can be requested to a single destination, in which case
1658 * the requested number of ibt_path_info_t's are returned, and the same
1659 * number of SRC IP address, with the first SRC IP address corrosponding
1660 * to the first ibt_path_info_t, etc.
1661 *
1662 * Restrictions on the source end point can be specified, in the form of a
1663 * source IP address (this implicitly defines the HCA, HCA port and Pkey)
1664 * HCA, HCA port, and sgid (implicitly defines HCA and HCA port).
1665 * Combinations are allowed but they  must be consistent.
1666 *
1667 * Path attributes can also be specified, these can also affect local HCA
1668 * selection.
1669 *
1670 * ibt_get_ip_paths()  internally does (among other things):
1671 *
1672 *   o ibt_get_list_of_ibd_ipaddr_and_macaddr( OUT list_ipaddr_macaddr)
1673 *
1674 *   o extract_pkey_and_sgid(IN list_ipaddr_macaddr, OUT list_pkey_and_sgid)
1675 *
1676 *   o map_dst_ip_addr(IN dst_ip_addr, OUT dst_pkey, OUT dgid) - See Note
1677 *
1678 *   o filter_by_pkey(IN list_pkey_and_sgid, IN dst_pkey, OUT list_of_sgid)
1679 *
1680 *   o do_multipath_query(IN list_of_sgid, IN dst_pkey, IN dgid, OUT path_list)
1681 *
1682 *   o pick_a_good_path(IN path_list, OUT the_path)
1683 *
1684 *   o find_matching_src_ip(IN the_path, IN list_ipaddr_macaddr, OUT src_ip)
1685 *
1686 * The ibd instance which got the ARP response is only on one P_Key
1687 * knowing the ibd instance (or which IPonIB MCG) got the ARP response
1688 * determins the P_Key associated with a dgid. If the proposedi "ip2mac()"
1689 * API is used to get an IP to GID translations, then returned 'sockaddr_dl'
1690 * contains the interface name and index.
1691 *
1692 *
1693 * Example:
1694 *   ip_path_attr.ipa_dst_ip = dst_ip_addr;
1695 *   ip_path_attr.ipa_ndst = 1;
1696 *   ip_path_attr.ipa_max_paths = 1;
1697 *
1698 *   status = ibt_get_ip_paths(clnt_hdl, flags, &ip_path_attr, &paths,
1699 *      &num_paths_p, &src_ip);
1700 *
1701 *   sid = ibt_get_ip_sid(protocol_num, dst_port);
1702 *   path_info->sid = sid;
1703 *
1704 *   ip_cm_info.src_addr = src_ip;
1705 *   ip_cm_info.dst_addr = dst_ip_addr;
1706 *   ip_cm_info.src_port = src_port
1707 *
1708 *   ibt_format_ip_private_data(ip_cm_info, priv_data_len, &priv_data);
1709 *   ibt_open_rc_channel(chan, private_data);
1710 */
1711typedef struct ibt_ip_path_attr_s {
1712	ibt_ip_addr_t		*ipa_dst_ip;		/* Required */
1713	ibt_ip_addr_t		ipa_src_ip;		/* Optional */
1714	ib_guid_t		ipa_hca_guid;		/* Optional */
1715	uint8_t			ipa_hca_port_num;	/* Optional */
1716	uint8_t			ipa_max_paths;		/* Required */
1717	uint8_t			ipa_ndst;		/* Required */
1718	uint8_t			ipa_sl:4;		/* Optional */
1719	ibt_mtu_req_t		ipa_mtu;		/* Optional */
1720	ibt_srate_req_t		ipa_srate;		/* Optional */
1721	ibt_pkt_lt_req_t	ipa_pkt_lt;		/* Optional */
1722	uint_t			ipa_flow:20;		/* Optional */
1723	uint8_t			ipa_hop;		/* Optional */
1724	uint8_t			ipa_tclass;		/* Optional */
1725} ibt_ip_path_attr_t;
1726
1727/*
1728 * Path SRC IP addresses
1729 */
1730typedef struct ibt_path_ip_src_s {
1731	ibt_ip_addr_t	ip_primary;
1732	ibt_ip_addr_t	ip_alternate;
1733} ibt_path_ip_src_t;
1734
1735
1736ibt_status_t ibt_get_ip_paths(ibt_clnt_hdl_t ibt_hdl, ibt_path_flags_t flags,
1737    ibt_ip_path_attr_t *attr, ibt_path_info_t *paths_p, uint8_t *num_paths_p,
1738    ibt_path_ip_src_t *src_ip_p);
1739
1740ibt_status_t ibt_get_src_ip(ib_gid_t gid, ib_pkey_t pkey,
1741    ibt_ip_addr_t *src_ip);
1742
1743/*
1744 * Callback function that can be used in ibt_aget_ip_paths(), a Non-Blocking
1745 * version of ibt_get_ip_paths().
1746 */
1747typedef void (*ibt_ip_path_handler_t)(void *arg, ibt_status_t retval,
1748    ibt_path_info_t *paths_p, uint8_t num_paths, ibt_path_ip_src_t *src_ip_p);
1749
1750/*
1751 * Find path(s) to a given destination or service asynchronously.
1752 * ibt_aget_ip_paths() is a Non-Blocking version of ibt_get_ip_paths().
1753 */
1754ibt_status_t ibt_aget_ip_paths(ibt_clnt_hdl_t ibt_hdl, ibt_path_flags_t flags,
1755    ibt_ip_path_attr_t *attr, ibt_ip_path_handler_t func, void  *arg);
1756
1757/*
1758 * IP RDMA protocol functions
1759 */
1760
1761/*
1762 * IBTF manages the port number space for non well known ports. If a ULP
1763 * is not using TCP/UDP and a well known port, then ibt_get_ip_sid() returns
1764 * an sid based on the IP protocol number '0' (reserved) and an IBTF assigned
1765 * port number.  ibt_release_ip_sid() should be used to release the hold
1766 * of SID created by ibt_get_ip_sid().
1767 */
1768ib_svc_id_t ibt_get_ip_sid(uint8_t protocol_num, in_port_t dst_port);
1769ibt_status_t ibt_release_ip_sid(ib_svc_id_t sid);
1770
1771uint8_t ibt_get_ip_protocol_num(ib_svc_id_t sid);
1772in_port_t ibt_get_ip_dst_port(ib_svc_id_t sid);
1773
1774/*
1775 * Functions to format/extract the RDMA IP CM private data
1776 */
1777typedef struct ibt_ip_cm_info_s {
1778	ibt_ip_addr_t	src_addr;
1779	ibt_ip_addr_t	dst_addr;
1780	in_port_t	src_port;
1781} ibt_ip_cm_info_t;
1782
1783/*
1784 * If a ULP is using IP addressing as defined by the RDMA IP CM Service IBTA
1785 * Annex 11, then it must always allocate a private data buffer for use in
1786 * the ibt_open_rc_channel(9F) call. The minimum size of the buffer is
1787 * IBT_IP_HDR_PRIV_DATA_SZ, if the ULP has no ULP specific private data.
1788 * This allows ibt_format_ip_private_data() to place the RDMA IP CM service
1789 * hello message in the private data of the REQ. If the ULP has some ULP
1790 * specific private data then it should allocate a buffer big enough to
1791 * contain that data plus an additional IBT_IP_HDR_PRIV_DATA_SZ bytes.
1792 * The ULP should place its  ULP specific private data at offset
1793 * IBT_IP_HDR_PRIV_DATA_SZ in the allocated buffer before calling
1794 * ibt_format_ip_private_data().
1795 */
1796ibt_status_t ibt_format_ip_private_data(ibt_ip_cm_info_t *ip_cm_info,
1797    ibt_priv_data_len_t priv_data_len, void *priv_data_p);
1798ibt_status_t ibt_get_ip_data(ibt_priv_data_len_t priv_data_len,
1799    void *priv_data, ibt_ip_cm_info_t *ip_info_p);
1800
1801/*
1802 * The ibt_alt_ip_path_attr_t structure is used to specify additional optional
1803 * attributes when requesting an alternate path for an existing channel.
1804 *
1805 * Attributes that are don't care should be set to NULL or '0'.
1806 */
1807typedef struct ibt_alt_ip_path_attr_s {
1808	ibt_ip_addr_t		apa_dst_ip;
1809	ibt_ip_addr_t		apa_src_ip;
1810	ibt_srate_req_t		apa_srate;
1811	ibt_pkt_lt_req_t	apa_pkt_lt;	/* Packet Life Time Request */
1812	uint_t			apa_flow:20;
1813	uint8_t			apa_sl:4;
1814	uint8_t			apa_hop;
1815	uint8_t			apa_tclass;
1816} ibt_alt_ip_path_attr_t;
1817
1818ibt_status_t ibt_get_ip_alt_path(ibt_channel_hdl_t rc_chan,
1819    ibt_path_flags_t flags, ibt_alt_ip_path_attr_t *attr,
1820    ibt_alt_path_info_t *alt_path);
1821
1822/*
1823 * CONTRACT PRIVATE ONLY INTERFACES
1824 *
1825 * DO NOT USE THE FOLLOWING FUNCTIONS WITHOUT SIGNING THE CONTRACT
1826 * WITH IBTF GROUP.
1827 */
1828
1829/* Define an Address Record structure (data for ATS service records). */
1830typedef struct ibt_ar_s {
1831	ib_gid_t	ar_gid;		/* GID of local HCA port */
1832	ib_pkey_t	ar_pkey;	/* P_Key valid on port of ar_gid */
1833	uint8_t		ar_data[16];	/* Data affiliated with GID/P_Key */
1834} ibt_ar_t;
1835
1836/*
1837 * ibt_register_ar()
1838 * ibt_deregister_ar()
1839 *	Register/deregister an Address Record with the SA.
1840 * ibt_query_ar()
1841 *	Query the SA for Address Records matching either GID/P_Key or Data.
1842 */
1843ibt_status_t ibt_register_ar(ibt_clnt_hdl_t ibt_hdl, ibt_ar_t *arp);
1844
1845ibt_status_t ibt_deregister_ar(ibt_clnt_hdl_t ibt_hdl, ibt_ar_t *arp);
1846
1847ibt_status_t ibt_query_ar(ib_gid_t *sgid, ibt_ar_t *queryp, ibt_ar_t *resultp);
1848
1849
1850/*
1851 * ibt_modify_system_image()
1852 * ibt_modify_system_image_byguid()
1853 *	Modify specified HCA's system image GUID.
1854 */
1855ibt_status_t ibt_modify_system_image(ibt_hca_hdl_t hca_hdl, ib_guid_t sys_guid);
1856
1857ibt_status_t ibt_modify_system_image_byguid(ib_guid_t hca_guid,
1858    ib_guid_t sys_guid);
1859
1860
1861/*
1862 * ibt_modify_port()
1863 * ibt_modify_port_byguid()
1864 *	Modify the specified port, or all ports attribute(s).
1865 */
1866ibt_status_t ibt_modify_port(ibt_hca_hdl_t hca_hdl, uint8_t port,
1867    ibt_port_modify_flags_t flags, uint8_t init_type);
1868
1869ibt_status_t ibt_modify_port_byguid(ib_guid_t hca_guid, uint8_t port,
1870    ibt_port_modify_flags_t flags, uint8_t init_type);
1871
1872
1873/*
1874 * ibt_get_port_state()
1875 * ibt_get_port_state_byguid()
1876 *	Return the most commonly requested attributes of an HCA port.
1877 *	If the link state is not IBT_PORT_ACTIVE, the other returned values
1878 *	are undefined.
1879 */
1880ibt_status_t ibt_get_port_state(ibt_hca_hdl_t hca_hdl, uint8_t port,
1881    ib_gid_t *sgid_p, ib_lid_t *base_lid_p);
1882
1883ibt_status_t ibt_get_port_state_byguid(ib_guid_t hca_guid, uint8_t port,
1884    ib_gid_t *sgid_p, ib_lid_t *base_lid_p);
1885
1886/*
1887 * ibt_alloc_io_mem()
1888 * ibt_free_io_mem()
1889 *	Allocate and deallocate dma-able memory.
1890 */
1891ibt_status_t ibt_alloc_io_mem(ibt_hca_hdl_t, size_t, ibt_mr_flags_t,
1892    caddr_t *, ibt_mem_alloc_hdl_t *);
1893
1894ibt_status_t ibt_free_io_mem(ibt_hca_hdl_t, ibt_mem_alloc_hdl_t);
1895
1896#ifdef __cplusplus
1897}
1898#endif
1899
1900#endif /* _SYS_IB_IBTL_IBTI_COMMON_H */
1901