xref: /illumos-gate/usr/src/uts/common/sys/ib/ibtl/ibci.h (revision 03494a98)
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_IBCI_H
27 #define	_SYS_IB_IBTL_IBCI_H
28 
29 /*
30  * ibci.h
31  *
32  * Define the data structures and function prototypes that comprise
33  * the IB Channel API (API for HCA drivers).  All CI handles are opaque
34  * to the IBTF here, real data is accessed in the HCA driver by a
35  * typecast to a driver specific struct.
36  */
37 
38 #include <sys/ib/ibtl/ibtl_types.h>
39 #include <sys/ib/ibtl/ibtl_ci_types.h>
40 #include <sys/modctl.h>
41 
42 
43 #ifdef	__cplusplus
44 extern "C" {
45 #endif
46 
47 /*
48  * Define CI opaque IBTF handles.
49  */
50 typedef	struct	ibtl_qp_s	*ibtl_qp_hdl_t;		/* ibt_alloc_qp() */
51 typedef struct	ibtl_eec_s	*ibtl_eec_hdl_t;	/* ibt_alloc_eec() */
52 
53 /*
54  * Define IBTF opaque CI handles.
55  */
56 typedef struct ibc_hca_s	*ibc_hca_hdl_t; /* HCA/CI Handle */
57 typedef struct ibc_pd_s		*ibc_pd_hdl_t;	/* Protection Domain Handle */
58 typedef	struct ibc_rdd_s	*ibc_rdd_hdl_t;	/* Reliable Datagram Domain */
59 typedef struct ibc_ah_s		*ibc_ah_hdl_t;	/* Address Handle */
60 typedef struct ibc_qp_s		*ibc_qp_hdl_t;	/* Queue Pair Handle */
61 typedef struct ibc_srq_s	*ibc_srq_hdl_t;	/* Shared Receive Queue Hdl */
62 typedef struct ibc_qpn_s	*ibc_qpn_hdl_t;	/* Queue Pair Number Handle */
63 typedef struct ibc_cq_s		*ibc_cq_hdl_t;	/* Completion Queue Handle */
64 typedef struct ibc_eec_s	*ibc_eec_hdl_t; /* End-to-End Context Handle */
65 typedef struct ibc_mem_alloc_s	*ibc_mem_alloc_hdl_t; /* Memory Handle */
66 
67 #define	ibc_fmr_pool_hdl_t	ibt_fmr_pool_hdl_t /* FMR Pool Handle */
68 #define	ibc_mr_hdl_t	ibt_mr_hdl_t	/* Memory Region Handle */
69 #define	ibc_mw_hdl_t	ibt_mw_hdl_t	/* Memory Window Handle */
70 #define	ibc_ma_hdl_t	ibt_ma_hdl_t	/* Memory Area Handle */
71 #define	ibc_mi_hdl_t	ibt_mi_hdl_t	/* Memory IOV Handle */
72 
73 /* Handle used by CI for up calls to IBTF */
74 typedef struct ibtl_hca_devinfo_s *ibc_clnt_hdl_t;	/* ibc_attach() */
75 
76 /*
77  * Fields opaque to TI, but visible to CI
78  */
79 
80 /*
81  * ibt_qp_alloc_attr_t
82  */
83 #define	qp_ibc_scq_hdl	qp_opaque1
84 #define	qp_ibc_rcq_hdl	qp_opaque2
85 #define	qp_ibc_srq_hdl	qp_opaque3
86 
87 
88 /*
89  * ibt_status_t
90  */
91 #define	IBT_HCA_RAWD_CHAN_EXCEEDED	IBT_ERR_OPAQUE1	/* Requested raw QP */
92 							/* exceeds HCA max */
93 							/* limit */
94 #define	IBT_CHAN_RAWD_NOT_SUPPORTED	IBT_ERR_OPAQUE2	/* Raw datagram QPs */
95 							/* not supported */
96 #define	IBT_CHAN_RD_NOT_SUPPORTED	IBT_ERR_OPAQUE3	/* RD not supported */
97 #define	IBT_EEC_HDL_INVALID		IBT_ERR_OPAQUE4	/* Invalid EEC handle */
98 #define	IBT_EEC_STATE_INVALID		IBT_ERR_OPAQUE5	/* Invalid EEC State */
99 #define	IBT_EEC_ATTR_RO			IBT_ERR_OPAQUE6	/* Can't Change EEC */
100 							/* Attribute */
101 #define	IBT_RDD_IN_USE			IBT_ERR_OPAQUE7	/* RDD in Use */
102 #define	IBT_RDD_HDL_INVALID		IBT_ERR_OPAQUE8	/* Invalid RDD */
103 #define	IBT_RNR_NAK_TIMER_INVALID	IBT_ERR_OPAQUE9	/* Invalid RNR NAK */
104 							/* Timer Value */
105 #define	IBT_RDD_NOT_SUPPORTED		IBT_ERR_OPAQUE10
106 
107 
108 /*
109  * ibt_wc_status_t
110  */
111 #define	IBT_WC_LOCAL_EEC_OP_ERR		12	/* Internal consistency error */
112 #define	IBT_WC_LOCAL_RDD_VIOLATION_ERR	30	/* The RDD associated with */
113 						/* the QP does not match */
114 						/* the RDD associated with */
115 						/* the EE Context */
116 #define	IBT_WC_REMOTE_RD_REQ_INVALID	31	/* Detected an invalid */
117 						/* incoming RD message */
118 #define	IBT_WC_EEC_REMOTE_ABORTED	32	/* Requester aborted the */
119 						/* operation */
120 #define	IBT_WC_EEC_NUM_INVALID		33	/* Invalid EEC Number */
121 						/* detected */
122 #define	IBT_WC_EEC_STATE_INVALID	34	/* Invalid EEC state */
123 
124 /*
125  * ibt_async_code_t
126  */
127 #define	IBT_EVENT_PATH_MIGRATED_EEC	IBT_ASYNC_OPAQUE1
128 #define	IBT_ERROR_CATASTROPHIC_EEC	IBT_ASYNC_OPAQUE3
129 #define	IBT_ERROR_PATH_MIGRATE_REQ_EEC	IBT_ASYNC_OPAQUE4
130 
131 /*
132  * ibt_object_type_t
133  */
134 #define	IBT_HDL_EEC	IBT_HDL_OPAQUE1
135 #define	IBT_HDL_RDD	IBT_HDL_OPAQUE2
136 
137 
138 /*
139  * ibt_hca_attr_t
140  */
141 #define	hca_max_rdd		hca_opaque2	/* Max RDDs in HCA */
142 #define	hca_max_eec		hca_opaque3	/* Max EEContexts in HCA */
143 #define	hca_max_rd_sgl		hca_opaque4	/* Max SGL entries per RD WR */
144 #define	hca_max_rdma_in_ee	hca_opaque5	/* Max RDMA Reads/Atomics in */
145 						/* per EEC with HCA as target */
146 #define	hca_max_rdma_out_ee	hca_opaque6	/* Max RDMA Reads/Atomics out */
147 						/* per EE by this HCA */
148 #define	hca_max_ipv6_qp		hca_max_ipv6_chan
149 #define	hca_max_ether_qp	hca_max_ether_chan
150 #define	hca_eec_max_ci_priv_sz	hca_opaque7
151 #define	hca_rdd_max_ci_priv_sz	hca_opaque8
152 #define	hca_max_map_per_fmr	hca_opaque9
153 
154 
155 /*
156  * ibt_wc_t
157  */
158 #define	wc_eecn		wc_detail	/* End-to-End Context RD's only */
159 
160 
161 /* Channel Interface version */
162 typedef enum ibc_version_e {
163 	IBCI_V1		= 1,
164 	IBCI_V2		= 2,		/* FMR Support */
165 	IBCI_V3		= 3
166 } ibc_version_t;
167 
168 
169 typedef enum ibc_free_qp_flags_e {
170 	IBC_FREE_QP_AND_QPN	= 0,	/* free all qp resources */
171 	IBC_FREE_QP_ONLY	= 1	/* OK to free the QP, but the QPN */
172 					/* cannot be reused until a future */
173 					/* call to ibc_release_qpn(qpn_hdl), */
174 					/* where qpn_hdl is a return value */
175 					/* of ibc_free_qp() */
176 } ibc_free_qp_flags_t;
177 
178 /*
179  * RDD alloc flags
180  */
181 typedef enum ibc_rdd_flags_e {
182 	IBT_RDD_NO_FLAGS	= 0,
183 	IBT_RDD_USER_MAP	= (1 << 0),
184 	IBT_RDD_DEFER_ALLOC	= (1 << 1)
185 } ibc_rdd_flags_t;
186 
187 /*
188  * EEC alloc flags
189  */
190 typedef enum ibc_eec_flags_e {
191 	IBT_EEC_NO_FLAGS	= 0,
192 	IBT_EEC_USER_MAP	= (1 << 0),
193 	IBT_EEC_DEFER_ALLOC	= (1 << 1)
194 } ibc_eec_flags_t;
195 
196 
197 /*
198  * Completion Queues
199  *
200  */
201 
202 /*
203  * CQ handler attribute structure.
204  */
205 typedef struct ibc_cq_handler_attr_s {
206 	ibt_cq_handler_id_t	h_id;		/* Valid ID != NULL */
207 	int			h_flags;	/* Flags of ddi_intr_get_cap */
208 	int			h_pri;		/* priority from */
209 						/* ddi_intr_get_pri */
210 	void			*h_bind;	/* unknown intrd stuff */
211 } ibc_cq_handler_attr_t;
212 
213 
214 /*
215  * Event data for asynchronous events and errors. The QP/EEC/CQ/SRQ handle,
216  * or port number associated with the Event/Error is passed as an argument
217  * to the async handler.
218  */
219 typedef struct ibc_async_event_s {
220 	uint64_t	ev_fma_ena;	/* fault management error data */
221 	ibtl_qp_hdl_t	ev_qp_hdl;	/* IBTF QP handle. */
222 	ibtl_eec_hdl_t	ev_eec_hdl;	/* IBTF EEC handle. */
223 	ibt_cq_hdl_t	ev_cq_hdl;	/* IBT CQ handle. */
224 	ibt_srq_hdl_t	ev_srq_hdl;	/* SRQ handle */
225 	ibt_port_change_t ev_port_flags; /* Port Change flags */
226 	uint8_t		ev_port;	/* For PORT UP/DOWN/CHANGE events */
227 } ibc_async_event_t;
228 
229 
230 typedef struct ibc_operations_s {
231 	/* HCA */
232 	ibt_status_t (*ibc_query_hca_ports)(ibc_hca_hdl_t hca, uint8_t port,
233 	    ibt_hca_portinfo_t *info_p);
234 	ibt_status_t (*ibc_modify_ports)(ibc_hca_hdl_t hca, uint8_t port,
235 	    ibt_port_modify_flags_t flags, uint8_t init_type);
236 	ibt_status_t (*ibc_modify_system_image)(ibc_hca_hdl_t hca,
237 	    ib_guid_t sys_guid);
238 
239 	/* Protection Domain */
240 	ibt_status_t (*ibc_alloc_pd)(ibc_hca_hdl_t hca, ibt_pd_flags_t flags,
241 	    ibc_pd_hdl_t *pd_p);
242 	ibt_status_t (*ibc_free_pd)(ibc_hca_hdl_t hca, ibc_pd_hdl_t pd);
243 
244 	/* Reliable Datagram Domain */
245 	ibt_status_t (*ibc_alloc_rdd)(ibc_hca_hdl_t hca, ibc_rdd_flags_t flags,
246 	    ibc_rdd_hdl_t *rdd_p);
247 	ibt_status_t (*ibc_free_rdd)(ibc_hca_hdl_t hca, ibc_rdd_hdl_t rdd);
248 
249 	/* Address Handle */
250 	ibt_status_t (*ibc_alloc_ah)(ibc_hca_hdl_t hca, ibt_ah_flags_t flags,
251 	    ibc_pd_hdl_t pd, ibt_adds_vect_t *attr_p, ibc_ah_hdl_t *ah_p);
252 	ibt_status_t (*ibc_free_ah)(ibc_hca_hdl_t hca, ibc_ah_hdl_t ah);
253 	ibt_status_t (*ibc_query_ah)(ibc_hca_hdl_t hca, ibc_ah_hdl_t ah,
254 	    ibc_pd_hdl_t *pd_p, ibt_adds_vect_t *attr_p);
255 	ibt_status_t (*ibc_modify_ah)(ibc_hca_hdl_t hca, ibc_ah_hdl_t ah,
256 	    ibt_adds_vect_t *attr_p);
257 
258 	/* Queue Pair */
259 	ibt_status_t (*ibc_alloc_qp)(ibc_hca_hdl_t hca, ibtl_qp_hdl_t ibtl_qp,
260 	    ibt_qp_type_t type, ibt_qp_alloc_attr_t *attr_p,
261 	    ibt_chan_sizes_t *queue_sizes_p, ib_qpn_t *qpn, ibc_qp_hdl_t *qp_p);
262 	ibt_status_t (*ibc_alloc_special_qp)(ibc_hca_hdl_t hca, uint8_t port,
263 	    ibtl_qp_hdl_t ibt_qp, ibt_sqp_type_t type,
264 	    ibt_qp_alloc_attr_t *attr_p, ibt_chan_sizes_t *queue_sizes_p,
265 	    ibc_qp_hdl_t *qp_p);
266 	ibt_status_t (*ibc_alloc_qp_range)(ibc_hca_hdl_t hca, uint_t log2,
267 	    ibtl_qp_hdl_t *ibtl_qp_p, ibt_qp_type_t type,
268 	    ibt_qp_alloc_attr_t *attr_p, ibt_chan_sizes_t *queue_sizes_p,
269 	    ibc_cq_hdl_t *send_cq_p, ibc_cq_hdl_t *recv_cq_p,
270 	    ib_qpn_t *qpn_p, ibc_qp_hdl_t *qp_p);
271 	ibt_status_t (*ibc_free_qp)(ibc_hca_hdl_t hca, ibc_qp_hdl_t qp,
272 	    ibc_free_qp_flags_t free_qp_flags, ibc_qpn_hdl_t *qpnh_p);
273 	ibt_status_t (*ibc_release_qpn)(ibc_hca_hdl_t hca, ibc_qpn_hdl_t qpnh);
274 	ibt_status_t (*ibc_query_qp)(ibc_hca_hdl_t hca, ibc_qp_hdl_t qp,
275 	    ibt_qp_query_attr_t *attr_p);
276 	ibt_status_t (*ibc_modify_qp)(ibc_hca_hdl_t hca, ibc_qp_hdl_t qp,
277 	    ibt_cep_modify_flags_t flags, ibt_qp_info_t *info_p,
278 	    ibt_queue_sizes_t *actual_sz);
279 
280 	/* Completion Queues */
281 	ibt_status_t (*ibc_alloc_cq)(ibc_hca_hdl_t hca, ibt_cq_hdl_t ibt_cq,
282 	    ibt_cq_attr_t *attr_p, ibc_cq_hdl_t *cq_p, uint_t *actual_size);
283 	ibt_status_t (*ibc_free_cq)(ibc_hca_hdl_t hca, ibc_cq_hdl_t cq);
284 	ibt_status_t (*ibc_query_cq)(ibc_hca_hdl_t hca, ibc_cq_hdl_t cq,
285 	    uint_t *entries, uint_t *count_p, uint_t *usec_p,
286 	    ibt_cq_handler_id_t *hid_p);
287 	ibt_status_t (*ibc_resize_cq)(ibc_hca_hdl_t hca, ibc_cq_hdl_t cq,
288 	    uint_t size, uint_t *actual_size);
289 	ibt_status_t (*ibc_modify_cq)(ibc_hca_hdl_t hca, ibc_cq_hdl_t cq,
290 	    uint_t count, uint_t usec, ibt_cq_handler_id_t hid);
291 	ibt_status_t (*ibc_alloc_cq_sched)(ibc_hca_hdl_t hca,
292 	    ibt_cq_sched_flags_t flags, ibc_cq_handler_attr_t *handler_attrs_p);
293 	ibt_status_t (*ibc_free_cq_sched)(ibc_hca_hdl_t hca,
294 	    ibt_cq_handler_id_t id);
295 
296 	/* EE Context */
297 	ibt_status_t (*ibc_alloc_eec)(ibc_hca_hdl_t hca, ibc_eec_flags_t flags,
298 	    ibtl_eec_hdl_t ibtl_eec, ibc_rdd_hdl_t rdd, ibc_eec_hdl_t *eec_p);
299 	ibt_status_t (*ibc_free_eec)(ibc_hca_hdl_t hca, ibc_eec_hdl_t eec);
300 	ibt_status_t (*ibc_query_eec)(ibc_hca_hdl_t hca, ibc_eec_hdl_t eec,
301 	    ibt_eec_query_attr_t *attr_p);
302 	ibt_status_t (*ibc_modify_eec)(ibc_hca_hdl_t hca, ibc_eec_hdl_t eec,
303 	    ibt_cep_modify_flags_t flags, ibt_eec_info_t *info_p);
304 
305 	/* Memory Registration */
306 	ibt_status_t (*ibc_register_mr)(ibc_hca_hdl_t hca, ibc_pd_hdl_t pd,
307 	    ibt_mr_attr_t *attr_p, void *ibtl_reserved, ibc_mr_hdl_t *mr_p,
308 	    ibt_mr_desc_t *mem_desc);
309 	ibt_status_t (*ibc_register_buf)(ibc_hca_hdl_t hca, ibc_pd_hdl_t pd,
310 	    ibt_smr_attr_t *attrp, struct buf *buf, void *ibtl_reserved,
311 	    ibc_mr_hdl_t *mr_hdl_p, ibt_mr_desc_t *mem_desc);
312 	ibt_status_t (*ibc_register_shared_mr)(ibc_hca_hdl_t hca,
313 	    ibc_mr_hdl_t mr, ibc_pd_hdl_t pd, ibt_smr_attr_t *attr_p,
314 	    void *ibtl_reserved, ibc_mr_hdl_t *mr_p, ibt_mr_desc_t *mem_desc);
315 	ibt_status_t (*ibc_deregister_mr)(ibc_hca_hdl_t hca, ibc_mr_hdl_t mr);
316 	ibt_status_t (*ibc_query_mr)(ibc_hca_hdl_t hca, ibc_mr_hdl_t mr,
317 	    ibt_mr_query_attr_t *info_p);
318 	ibt_status_t (*ibc_reregister_mr)(ibc_hca_hdl_t hca, ibc_mr_hdl_t mr,
319 	    ibc_pd_hdl_t pd, ibt_mr_attr_t *attr_p, void *ibtl_reserved,
320 	    ibc_mr_hdl_t *mr_p, ibt_mr_desc_t *mem_desc);
321 	ibt_status_t (*ibc_reregister_buf)(ibc_hca_hdl_t hca, ibc_mr_hdl_t mr,
322 	    ibc_pd_hdl_t pd, ibt_smr_attr_t *attrp, struct buf *buf,
323 	    void *ibtl_reserved, ibc_mr_hdl_t *mr_p, ibt_mr_desc_t *mem_desc);
324 	ibt_status_t (*ibc_sync_mr)(ibc_hca_hdl_t hca,
325 	    ibt_mr_sync_t *mr_segments, size_t	num_segments);
326 
327 	/* Memory Window */
328 	ibt_status_t (*ibc_alloc_mw)(ibc_hca_hdl_t hca, ibc_pd_hdl_t pd,
329 	    ibt_mw_flags_t flags, ibc_mw_hdl_t *mw_p, ibt_rkey_t *rkey_p);
330 	ibt_status_t (*ibc_free_mw)(ibc_hca_hdl_t hca, ibc_mw_hdl_t mw);
331 	ibt_status_t (*ibc_query_mw)(ibc_hca_hdl_t hca, ibc_mw_hdl_t mw,
332 	    ibt_mw_query_attr_t *mw_attr_p);
333 
334 	/* Multicast Group */
335 	ibt_status_t (*ibc_attach_mcg)(ibc_hca_hdl_t hca, ibc_qp_hdl_t qp,
336 	    ib_gid_t gid, ib_lid_t lid);
337 	ibt_status_t (*ibc_detach_mcg)(ibc_hca_hdl_t hca, ibc_qp_hdl_t qp,
338 	    ib_gid_t gid, ib_lid_t lid);
339 
340 	/* WR processing */
341 	ibt_status_t (*ibc_post_send)(ibc_hca_hdl_t hca, ibc_qp_hdl_t qp,
342 	    ibt_send_wr_t *wr_p, uint_t num_wr, uint_t *num_posted);
343 	ibt_status_t (*ibc_post_recv)(ibc_hca_hdl_t hca, ibc_qp_hdl_t qp,
344 	    ibt_recv_wr_t *wr_p, uint_t num_wr, uint_t *num_posted);
345 	ibt_status_t (*ibc_poll_cq)(ibc_hca_hdl_t hca, ibc_cq_hdl_t cq,
346 	    ibt_wc_t *wc_p, uint_t num_wc, uint_t *num_polled);
347 	ibt_status_t (*ibc_notify_cq)(ibc_hca_hdl_t hca, ibc_cq_hdl_t cq,
348 	    ibt_cq_notify_flags_t flags);
349 
350 	/* CI Object Private Data */
351 	ibt_status_t (*ibc_ci_data_in)(ibc_hca_hdl_t hca,
352 	    ibt_ci_data_flags_t flags, ibt_object_type_t object,
353 	    void *ibc_object_handle, void *data_p, size_t data_sz);
354 	ibt_status_t (*ibc_ci_data_out)(ibc_hca_hdl_t hca,
355 	    ibt_ci_data_flags_t flags, ibt_object_type_t object,
356 	    void *ibc_object_handle, void *data_p, size_t data_sz);
357 
358 	/* Shared Receive Queues */
359 	ibt_status_t (*ibc_alloc_srq)(ibc_hca_hdl_t hca, ibt_srq_flags_t flags,
360 	    ibt_srq_hdl_t ibt_srq, ibc_pd_hdl_t pd, ibt_srq_sizes_t *sizes,
361 	    ibc_srq_hdl_t *ibc_srq_p, ibt_srq_sizes_t *real_size_p);
362 	ibt_status_t (*ibc_free_srq)(ibc_hca_hdl_t hca, ibc_srq_hdl_t srq);
363 	ibt_status_t (*ibc_query_srq)(ibc_hca_hdl_t hca, ibc_srq_hdl_t srq,
364 	    ibc_pd_hdl_t *pd_p, ibt_srq_sizes_t *sizes_p, uint_t *limit);
365 	ibt_status_t (*ibc_modify_srq)(ibc_hca_hdl_t hca, ibc_srq_hdl_t srq,
366 	    ibt_srq_modify_flags_t flags, uint_t size, uint_t limit,
367 	    uint_t *real_size_p);
368 	ibt_status_t (*ibc_post_srq)(ibc_hca_hdl_t hca, ibc_srq_hdl_t srq,
369 	    ibt_recv_wr_t *wr, uint_t num_wr, uint_t *num_posted_p);
370 
371 	/* Address translation */
372 	ibt_status_t (*ibc_map_mem_area)(ibc_hca_hdl_t hca_hdl,
373 	    ibt_va_attr_t *va_attrs, void *ibtl_reserved,
374 	    uint_t paddr_list_len, ibt_phys_buf_t *paddr_list_p,
375 	    uint_t *num_paddr_p, size_t *paddr_bufsz_p,
376 	    ib_memlen_t *paddr_offset_p, ibc_ma_hdl_t *ma_hdl_p);
377 	ibt_status_t (*ibc_unmap_mem_area)(ibc_hca_hdl_t hca_hdl,
378 	    ibc_ma_hdl_t ma_hdl);
379 	ibt_status_t (*ibc_map_mem_iov)(ibc_hca_hdl_t hca_hdl,
380 	    ibt_iov_attr_t *iov_attr, ibt_all_wr_t *wr,
381 	    ibc_mi_hdl_t *mi_hdl);
382 	ibt_status_t (*ibc_unmap_mem_iov)(ibc_hca_hdl_t hca_hdl,
383 	    ibc_mi_hdl_t mi_hdl);
384 
385 	/* Allocate L_Key */
386 	ibt_status_t (*ibc_alloc_lkey)(ibc_hca_hdl_t hca_hdl, ibc_pd_hdl_t pd,
387 	    ibt_lkey_flags_t flags, uint_t phys_buf_list_sz,
388 	    ibc_mr_hdl_t *mr_p, ibt_pmr_desc_t *mem_desc_p);
389 
390 	/* Physical Register Memory Region */
391 	ibt_status_t (*ibc_register_physical_mr)(ibc_hca_hdl_t hca,
392 	    ibc_pd_hdl_t pd, ibt_pmr_attr_t *mem_pattr, void *ibtl_reserved,
393 	    ibc_mr_hdl_t *mr_p, ibt_pmr_desc_t *mem_desc_p);
394 	ibt_status_t (*ibc_reregister_physical_mr)(ibc_hca_hdl_t hca,
395 	    ibc_mr_hdl_t mr, ibc_pd_hdl_t pd, ibt_pmr_attr_t *mem_pattr,
396 	    void *ibtl_reserved, ibc_mr_hdl_t *mr_p,
397 	    ibt_pmr_desc_t *mem_desc_p);
398 
399 	/* Fast Memory Registration (FMR) */
400 	ibt_status_t (*ibc_create_fmr_pool)(ibc_hca_hdl_t hca, ibc_pd_hdl_t pd,
401 	    ibt_fmr_pool_attr_t *fmr_params, ibc_fmr_pool_hdl_t *fmr_pool_p);
402 	ibt_status_t (*ibc_destroy_fmr_pool)(ibc_hca_hdl_t hca,
403 	    ibc_fmr_pool_hdl_t fmr_pool);
404 	ibt_status_t (*ibc_flush_fmr_pool)(ibc_hca_hdl_t hca,
405 	    ibc_fmr_pool_hdl_t fmr_pool);
406 	ibt_status_t (*ibc_register_physical_fmr)(ibc_hca_hdl_t hca,
407 	    ibc_fmr_pool_hdl_t fmr_pool, ibt_pmr_attr_t *mem_pattr,
408 	    void *ibtl_reserved, ibc_mr_hdl_t *mr_hdl_p,
409 	    ibt_pmr_desc_t *mem_desc_p);
410 	ibt_status_t (*ibc_deregister_fmr)(ibc_hca_hdl_t hca, ibc_mr_hdl_t mr);
411 
412 	/* IO memory management */
413 	ibt_status_t (*ibc_alloc_io_mem)(ibc_hca_hdl_t hca_hdl, size_t size,
414 	    ibt_mr_flags_t mr_flag, caddr_t *kaddrp,
415 	    ibc_mem_alloc_hdl_t *mem_alloc_hdl);
416 	ibt_status_t (*ibc_free_io_mem)(ibc_hca_hdl_t hca_hdl,
417 	    ibc_mem_alloc_hdl_t mem_alloc_hdl);
418 
419 	/* Extended RC (XRC) */
420 	ibt_status_t (*ibc_alloc_xrc_domain)();
421 	ibt_status_t (*ibc_free_xrc_domain)();
422 	ibt_status_t (*ibc_alloc_xrc_srq)();
423 	ibt_status_t (*ibc_free_xrc_srq)();
424 	ibt_status_t (*ibc_query_xrc_srq)();
425 	ibt_status_t (*ibc_modify_xrc_srq)();
426 	ibt_status_t (*ibc_alloc_xrc_tgt_qp)();
427 	ibt_status_t (*ibc_free_xrc_tgt_qp)();
428 	ibt_status_t (*ibc_query_xrc_tgt_qp)();
429 	ibt_status_t (*ibc_modify_xrc_tgt_qp)();
430 } ibc_operations_t;
431 
432 
433 /*
434  * The ibc_hca_info_s structure is used for HCA drivers to communicate its
435  * HCA specific information to IBTF when it attaches a device via ibc_attach().
436  *
437  * IBTF assumes that the structures pointed to by the hca_ops and hca_attr
438  * structure members are persistent.
439  */
440 typedef struct ibc_hca_info_s {
441 	ibc_version_t		hca_ci_vers;	/* CI Version */
442 	dev_info_t		*hca_dip;	/* HCA dev_info */
443 	ibc_hca_hdl_t		hca_handle;	/* used for call through */
444 						/* "hca_ops" */
445 	ibc_operations_t	*hca_ops;
446 	ibt_hca_attr_t		*hca_attr;
447 	ibc_cq_handler_attr_t	hca_def_cq_handler_attr;
448 } ibc_hca_info_t;
449 
450 
451 /* Channel Interface return status */
452 typedef enum ibc_status_e {
453 	IBC_SUCCESS = 0,
454 	IBC_FAILURE = 1
455 } ibc_status_t;
456 
457 /*
458  * CI up-calls to IBTF.
459  */
460 
461 /*
462  * ibc_init
463  *	Registers CI clients with the Solaris I/O framework
464  *
465  * ibc_fini
466  *	Un-Registers CI clients with the Solaris I/O framework
467  */
468 int ibc_init(struct modlinkage *modlp);
469 void ibc_fini(struct modlinkage *modlp);
470 
471 /*
472  * ibc_attach
473  *	Register HCA device with IBTF. During this call HCA driver provides
474  *	driver's information neededby IBTF.
475  *
476  * ibc_post_attach
477  *	After a successful ibc_attach, this must be called.
478  *
479  * ibc_pre_detach
480  *	Attempt to De-Register HCA Device from IBTF.
481  *	This requires the cooperation of IBTF clients to
482  *	stop using this HCA.  Upon success, the HCA driver
483  *	is committed to calling ibc_detach.
484  *
485  * ibc_detach
486  *	De-Register HCA Device from IBTF.
487  *	This function will succeed if ibc_pre_detach has previously
488  *	succeeded for this device.
489  */
490 ibc_status_t ibc_attach(ibc_clnt_hdl_t *ibc_hdl_p, ibc_hca_info_t *info_p);
491 void ibc_post_attach(ibc_clnt_hdl_t ibc_hdl);
492 ibc_status_t ibc_pre_detach(ibc_clnt_hdl_t ibc_hdl, ddi_detach_cmd_t cmd);
493 void ibc_detach(ibc_clnt_hdl_t ibc_hdl);
494 
495 /*
496  * ibc_cq_handler
497  *	IBTF Completion Queue Notification Handler.
498  */
499 void ibc_cq_handler(ibc_clnt_hdl_t ibc_hdl, ibt_cq_hdl_t ibt_cq);
500 
501 /*
502  * ibc_async_handler
503  *	IBTF Asynchronous event/error handler.
504  */
505 void ibc_async_handler(ibc_clnt_hdl_t ibc_hdl, ibt_async_code_t code,
506     ibc_async_event_t *event_p);
507 
508 /*
509  * ibc_memory_handler
510  *	IBTF memory event/error handler.
511  */
512 void ibc_memory_handler(ibc_clnt_hdl_t ibc_hdl, ibt_mem_code_t code,
513     ibt_mem_data_t *data_p, void *ibtl_reserved);
514 
515 /*
516  * ibc_get_ci_failure()
517  *
518  *	Used to obtain a special IBTF failure code for CI specific failures,
519  *	failures other than those defined in ibt_status_t.
520  */
521 ibt_status_t ibc_get_ci_failure(uint64_t ena);
522 
523 #ifdef __cplusplus
524 }
525 #endif
526 
527 #endif	/* _SYS_IB_IBTL_IBCI_H */
528