xref: /illumos-gate/usr/src/uts/common/sys/ib/ibtl/ibci.h (revision 6a634c9dca3093f3922e4b7ab826d7bdf17bf78e)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 /*
22  * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
23  */
24 
25 #ifndef	_SYS_IB_IBTL_IBCI_H
26 #define	_SYS_IB_IBTL_IBCI_H
27 
28 /*
29  * ibci.h
30  *
31  * Define the data structures and function prototypes that comprise
32  * the IB Channel API (API for HCA drivers).  All CI handles are opaque
33  * to the IBTF here, real data is accessed in the HCA driver by a
34  * typecast to a driver specific struct.
35  */
36 
37 #include <sys/ib/ibtl/ibtl_types.h>
38 #include <sys/ib/ibtl/ibtl_ci_types.h>
39 #include <sys/modctl.h>
40 
41 
42 #ifdef	__cplusplus
43 extern "C" {
44 #endif
45 
46 /*
47  * Define CI opaque IBTF handles.
48  */
49 typedef	struct	ibtl_qp_s	*ibtl_qp_hdl_t;		/* ibt_alloc_qp() */
50 typedef struct	ibtl_eec_s	*ibtl_eec_hdl_t;	/* ibt_alloc_eec() */
51 
52 /*
53  * Define IBTF opaque CI handles.
54  */
55 typedef struct ibc_hca_s	*ibc_hca_hdl_t; /* HCA/CI Handle */
56 typedef struct ibc_pd_s		*ibc_pd_hdl_t;	/* Protection Domain Handle */
57 typedef	struct ibc_rdd_s	*ibc_rdd_hdl_t;	/* Reliable Datagram Domain */
58 typedef struct ibc_ah_s		*ibc_ah_hdl_t;	/* Address Handle */
59 typedef struct ibc_qp_s		*ibc_qp_hdl_t;	/* Queue Pair Handle */
60 typedef struct ibc_srq_s	*ibc_srq_hdl_t;	/* Shared Receive Queue Hdl */
61 typedef struct ibc_qpn_s	*ibc_qpn_hdl_t;	/* Queue Pair Number Handle */
62 typedef struct ibc_cq_s		*ibc_cq_hdl_t;	/* Completion Queue Handle */
63 typedef struct ibc_eec_s	*ibc_eec_hdl_t; /* End-to-End Context Handle */
64 typedef struct ibc_mem_alloc_s	*ibc_mem_alloc_hdl_t; /* Memory Handle */
65 
66 #define	ibc_sched_hdl_t		ibt_sched_hdl_t	/* CQ Sched Handle */
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_wc_t
140  */
141 #define	wc_eecn		wc_detail	/* End-to-End Context RD's only */
142 
143 
144 /* Channel Interface version */
145 typedef int ibc_version_t;
146 #define	IBCI_V1	1
147 #define	IBCI_V2	2
148 #define	IBCI_V3	3
149 #define	IBCI_V4	4
150 
151 
152 typedef enum ibc_free_qp_flags_e {
153 	IBC_FREE_QP_AND_QPN	= 0,	/* free all qp resources */
154 	IBC_FREE_QP_ONLY	= 1	/* OK to free the QP, but the QPN */
155 					/* cannot be reused until a future */
156 					/* call to ibc_release_qpn(qpn_hdl), */
157 					/* where qpn_hdl is a return value */
158 					/* of ibc_free_qp() */
159 } ibc_free_qp_flags_t;
160 
161 /*
162  * RDD alloc flags
163  */
164 typedef enum ibc_rdd_flags_e {
165 	IBT_RDD_NO_FLAGS	= 0,
166 	IBT_RDD_USER_MAP	= (1 << 0),
167 	IBT_RDD_DEFER_ALLOC	= (1 << 1)
168 } ibc_rdd_flags_t;
169 
170 /*
171  * EEC alloc flags
172  */
173 typedef enum ibc_eec_flags_e {
174 	IBT_EEC_NO_FLAGS	= 0,
175 	IBT_EEC_USER_MAP	= (1 << 0),
176 	IBT_EEC_DEFER_ALLOC	= (1 << 1)
177 } ibc_eec_flags_t;
178 
179 /*
180  * Event data for asynchronous events and errors. The QP/EEC/CQ/SRQ handle,
181  * or port number associated with the Event/Error is passed as an argument
182  * to the async handler.
183  */
184 typedef struct ibc_async_event_s {
185 	uint64_t	ev_fma_ena;	/* fault management error data */
186 	ibtl_qp_hdl_t	ev_qp_hdl;	/* IBTF QP handle. */
187 	ibtl_eec_hdl_t	ev_eec_hdl;	/* IBTF EEC handle. */
188 	ibt_cq_hdl_t	ev_cq_hdl;	/* IBT CQ handle. */
189 	ibt_srq_hdl_t	ev_srq_hdl;	/* SRQ handle */
190 	ibt_port_change_t ev_port_flags; /* Port Change flags */
191 	uint8_t		ev_port;	/* For PORT UP/DOWN/CHANGE events */
192 	ibt_fc_syndrome_t ev_fc;	/* FEXCH syndrome */
193 } ibc_async_event_t;
194 
195 
196 typedef struct ibc_operations_s {
197 	/* HCA */
198 	ibt_status_t (*ibc_query_hca_ports)(ibc_hca_hdl_t hca, uint8_t port,
199 	    ibt_hca_portinfo_t *info_p);
200 	ibt_status_t (*ibc_modify_ports)(ibc_hca_hdl_t hca, uint8_t port,
201 	    ibt_port_modify_flags_t flags, uint8_t init_type);
202 	ibt_status_t (*ibc_modify_system_image)(ibc_hca_hdl_t hca,
203 	    ib_guid_t sys_guid);
204 
205 	/* Protection Domain */
206 	ibt_status_t (*ibc_alloc_pd)(ibc_hca_hdl_t hca, ibt_pd_flags_t flags,
207 	    ibc_pd_hdl_t *pd_p);
208 	ibt_status_t (*ibc_free_pd)(ibc_hca_hdl_t hca, ibc_pd_hdl_t pd);
209 
210 	/* Reliable Datagram Domain */
211 	ibt_status_t (*ibc_alloc_rdd)(ibc_hca_hdl_t hca, ibc_rdd_flags_t flags,
212 	    ibc_rdd_hdl_t *rdd_p);
213 	ibt_status_t (*ibc_free_rdd)(ibc_hca_hdl_t hca, ibc_rdd_hdl_t rdd);
214 
215 	/* Address Handle */
216 	ibt_status_t (*ibc_alloc_ah)(ibc_hca_hdl_t hca, ibt_ah_flags_t flags,
217 	    ibc_pd_hdl_t pd, ibt_adds_vect_t *attr_p, ibc_ah_hdl_t *ah_p);
218 	ibt_status_t (*ibc_free_ah)(ibc_hca_hdl_t hca, ibc_ah_hdl_t ah);
219 	ibt_status_t (*ibc_query_ah)(ibc_hca_hdl_t hca, ibc_ah_hdl_t ah,
220 	    ibc_pd_hdl_t *pd_p, ibt_adds_vect_t *attr_p);
221 	ibt_status_t (*ibc_modify_ah)(ibc_hca_hdl_t hca, ibc_ah_hdl_t ah,
222 	    ibt_adds_vect_t *attr_p);
223 
224 	/* Queue Pair */
225 	ibt_status_t (*ibc_alloc_qp)(ibc_hca_hdl_t hca, ibtl_qp_hdl_t ibtl_qp,
226 	    ibt_qp_type_t type, ibt_qp_alloc_attr_t *attr_p,
227 	    ibt_chan_sizes_t *queue_sizes_p, ib_qpn_t *qpn, ibc_qp_hdl_t *qp_p);
228 	ibt_status_t (*ibc_alloc_special_qp)(ibc_hca_hdl_t hca, uint8_t port,
229 	    ibtl_qp_hdl_t ibt_qp, ibt_sqp_type_t type,
230 	    ibt_qp_alloc_attr_t *attr_p, ibt_chan_sizes_t *queue_sizes_p,
231 	    ibc_qp_hdl_t *qp_p);
232 	ibt_status_t (*ibc_alloc_qp_range)(ibc_hca_hdl_t hca, uint_t log2,
233 	    ibtl_qp_hdl_t *ibtl_qp_p, ibt_qp_type_t type,
234 	    ibt_qp_alloc_attr_t *attr_p, ibt_chan_sizes_t *queue_sizes_p,
235 	    ibc_cq_hdl_t *send_cq_p, ibc_cq_hdl_t *recv_cq_p,
236 	    ib_qpn_t *qpn_p, ibc_qp_hdl_t *qp_p);
237 	ibt_status_t (*ibc_free_qp)(ibc_hca_hdl_t hca, ibc_qp_hdl_t qp,
238 	    ibc_free_qp_flags_t free_qp_flags, ibc_qpn_hdl_t *qpnh_p);
239 	ibt_status_t (*ibc_release_qpn)(ibc_hca_hdl_t hca, ibc_qpn_hdl_t qpnh);
240 	ibt_status_t (*ibc_query_qp)(ibc_hca_hdl_t hca, ibc_qp_hdl_t qp,
241 	    ibt_qp_query_attr_t *attr_p);
242 	ibt_status_t (*ibc_modify_qp)(ibc_hca_hdl_t hca, ibc_qp_hdl_t qp,
243 	    ibt_cep_modify_flags_t flags, ibt_qp_info_t *info_p,
244 	    ibt_queue_sizes_t *actual_sz);
245 
246 	/* Completion Queues */
247 	ibt_status_t (*ibc_alloc_cq)(ibc_hca_hdl_t hca, ibt_cq_hdl_t ibt_cq,
248 	    ibt_cq_attr_t *attr_p, ibc_cq_hdl_t *cq_p, uint_t *actual_size);
249 	ibt_status_t (*ibc_free_cq)(ibc_hca_hdl_t hca, ibc_cq_hdl_t cq);
250 	ibt_status_t (*ibc_query_cq)(ibc_hca_hdl_t hca, ibc_cq_hdl_t cq,
251 	    uint_t *entries, uint_t *count_p, uint_t *usec_p,
252 	    ibt_cq_handler_id_t *hid_p);
253 	ibt_status_t (*ibc_resize_cq)(ibc_hca_hdl_t hca, ibc_cq_hdl_t cq,
254 	    uint_t size, uint_t *actual_size);
255 	ibt_status_t (*ibc_modify_cq)(ibc_hca_hdl_t hca, ibc_cq_hdl_t cq,
256 	    uint_t count, uint_t usec, ibt_cq_handler_id_t hid);
257 	ibt_status_t (*ibc_alloc_cq_sched)(ibc_hca_hdl_t hca,
258 	    ibt_cq_sched_attr_t *attr, ibc_sched_hdl_t *sched_hdl_p);
259 	ibt_status_t (*ibc_free_cq_sched)(ibc_hca_hdl_t hca,
260 	    ibc_sched_hdl_t sched_hdl);
261 	ibt_status_t (*ibc_query_cq_handler_id)(ibc_hca_hdl_t hca,
262 	    ibt_cq_handler_id_t hid, ibt_cq_handler_attr_t *attrs);
263 
264 	/* EE Context */
265 	ibt_status_t (*ibc_alloc_eec)(ibc_hca_hdl_t hca, ibc_eec_flags_t flags,
266 	    ibtl_eec_hdl_t ibtl_eec, ibc_rdd_hdl_t rdd, ibc_eec_hdl_t *eec_p);
267 	ibt_status_t (*ibc_free_eec)(ibc_hca_hdl_t hca, ibc_eec_hdl_t eec);
268 	ibt_status_t (*ibc_query_eec)(ibc_hca_hdl_t hca, ibc_eec_hdl_t eec,
269 	    ibt_eec_query_attr_t *attr_p);
270 	ibt_status_t (*ibc_modify_eec)(ibc_hca_hdl_t hca, ibc_eec_hdl_t eec,
271 	    ibt_cep_modify_flags_t flags, ibt_eec_info_t *info_p);
272 
273 	/* Memory Registration */
274 	ibt_status_t (*ibc_register_mr)(ibc_hca_hdl_t hca, ibc_pd_hdl_t pd,
275 	    ibt_mr_attr_t *attr_p, void *ibtl_reserved, ibc_mr_hdl_t *mr_p,
276 	    ibt_mr_desc_t *mem_desc);
277 	ibt_status_t (*ibc_register_buf)(ibc_hca_hdl_t hca, ibc_pd_hdl_t pd,
278 	    ibt_smr_attr_t *attrp, struct buf *buf, void *ibtl_reserved,
279 	    ibc_mr_hdl_t *mr_hdl_p, ibt_mr_desc_t *mem_desc);
280 	ibt_status_t (*ibc_register_shared_mr)(ibc_hca_hdl_t hca,
281 	    ibc_mr_hdl_t mr, ibc_pd_hdl_t pd, ibt_smr_attr_t *attr_p,
282 	    void *ibtl_reserved, ibc_mr_hdl_t *mr_p, ibt_mr_desc_t *mem_desc);
283 	ibt_status_t (*ibc_deregister_mr)(ibc_hca_hdl_t hca, ibc_mr_hdl_t mr);
284 	ibt_status_t (*ibc_query_mr)(ibc_hca_hdl_t hca, ibc_mr_hdl_t mr,
285 	    ibt_mr_query_attr_t *info_p);
286 	ibt_status_t (*ibc_reregister_mr)(ibc_hca_hdl_t hca, ibc_mr_hdl_t mr,
287 	    ibc_pd_hdl_t pd, ibt_mr_attr_t *attr_p, void *ibtl_reserved,
288 	    ibc_mr_hdl_t *mr_p, ibt_mr_desc_t *mem_desc);
289 	ibt_status_t (*ibc_reregister_buf)(ibc_hca_hdl_t hca, ibc_mr_hdl_t mr,
290 	    ibc_pd_hdl_t pd, ibt_smr_attr_t *attrp, struct buf *buf,
291 	    void *ibtl_reserved, ibc_mr_hdl_t *mr_p, ibt_mr_desc_t *mem_desc);
292 	ibt_status_t (*ibc_sync_mr)(ibc_hca_hdl_t hca,
293 	    ibt_mr_sync_t *mr_segments, size_t	num_segments);
294 
295 	/* Memory Window */
296 	ibt_status_t (*ibc_alloc_mw)(ibc_hca_hdl_t hca, ibc_pd_hdl_t pd,
297 	    ibt_mw_flags_t flags, ibc_mw_hdl_t *mw_p, ibt_rkey_t *rkey_p);
298 	ibt_status_t (*ibc_free_mw)(ibc_hca_hdl_t hca, ibc_mw_hdl_t mw);
299 	ibt_status_t (*ibc_query_mw)(ibc_hca_hdl_t hca, ibc_mw_hdl_t mw,
300 	    ibt_mw_query_attr_t *mw_attr_p);
301 
302 	/* Multicast Group */
303 	ibt_status_t (*ibc_attach_mcg)(ibc_hca_hdl_t hca, ibc_qp_hdl_t qp,
304 	    ib_gid_t gid, ib_lid_t lid);
305 	ibt_status_t (*ibc_detach_mcg)(ibc_hca_hdl_t hca, ibc_qp_hdl_t qp,
306 	    ib_gid_t gid, ib_lid_t lid);
307 
308 	/* WR processing */
309 	ibt_status_t (*ibc_post_send)(ibc_hca_hdl_t hca, ibc_qp_hdl_t qp,
310 	    ibt_send_wr_t *wr_p, uint_t num_wr, uint_t *num_posted);
311 	ibt_status_t (*ibc_post_recv)(ibc_hca_hdl_t hca, ibc_qp_hdl_t qp,
312 	    ibt_recv_wr_t *wr_p, uint_t num_wr, uint_t *num_posted);
313 	ibt_status_t (*ibc_poll_cq)(ibc_hca_hdl_t hca, ibc_cq_hdl_t cq,
314 	    ibt_wc_t *wc_p, uint_t num_wc, uint_t *num_polled);
315 	ibt_status_t (*ibc_notify_cq)(ibc_hca_hdl_t hca, ibc_cq_hdl_t cq,
316 	    ibt_cq_notify_flags_t flags);
317 
318 	/* CI Object Private Data */
319 	ibt_status_t (*ibc_ci_data_in)(ibc_hca_hdl_t hca,
320 	    ibt_ci_data_flags_t flags, ibt_object_type_t object,
321 	    void *ibc_object_handle, void *data_p, size_t data_sz);
322 	ibt_status_t (*ibc_ci_data_out)(ibc_hca_hdl_t hca,
323 	    ibt_ci_data_flags_t flags, ibt_object_type_t object,
324 	    void *ibc_object_handle, void *data_p, size_t data_sz);
325 
326 	/* Shared Receive Queues */
327 	ibt_status_t (*ibc_alloc_srq)(ibc_hca_hdl_t hca, ibt_srq_flags_t flags,
328 	    ibt_srq_hdl_t ibt_srq, ibc_pd_hdl_t pd, ibt_srq_sizes_t *sizes,
329 	    ibc_srq_hdl_t *ibc_srq_p, ibt_srq_sizes_t *real_size_p);
330 	ibt_status_t (*ibc_free_srq)(ibc_hca_hdl_t hca, ibc_srq_hdl_t srq);
331 	ibt_status_t (*ibc_query_srq)(ibc_hca_hdl_t hca, ibc_srq_hdl_t srq,
332 	    ibc_pd_hdl_t *pd_p, ibt_srq_sizes_t *sizes_p, uint_t *limit);
333 	ibt_status_t (*ibc_modify_srq)(ibc_hca_hdl_t hca, ibc_srq_hdl_t srq,
334 	    ibt_srq_modify_flags_t flags, uint_t size, uint_t limit,
335 	    uint_t *real_size_p);
336 	ibt_status_t (*ibc_post_srq)(ibc_hca_hdl_t hca, ibc_srq_hdl_t srq,
337 	    ibt_recv_wr_t *wr, uint_t num_wr, uint_t *num_posted_p);
338 
339 	/* Address translation */
340 	ibt_status_t (*ibc_map_mem_area)(ibc_hca_hdl_t hca_hdl,
341 	    ibt_va_attr_t *va_attrs, void *ibtl_reserved,
342 	    uint_t paddr_list_len, ibt_reg_req_t *reg_req,
343 	    ibc_ma_hdl_t *ma_hdl_p);
344 	ibt_status_t (*ibc_unmap_mem_area)(ibc_hca_hdl_t hca_hdl,
345 	    ibc_ma_hdl_t ma_hdl);
346 	ibt_status_t (*ibc_map_mem_iov)(ibc_hca_hdl_t hca_hdl,
347 	    ibt_iov_attr_t *iov_attr, ibt_all_wr_t *wr,
348 	    ibc_mi_hdl_t *mi_hdl);
349 	ibt_status_t (*ibc_unmap_mem_iov)(ibc_hca_hdl_t hca_hdl,
350 	    ibc_mi_hdl_t mi_hdl);
351 
352 	/* Allocate L_Key */
353 	ibt_status_t (*ibc_alloc_lkey)(ibc_hca_hdl_t hca_hdl, ibc_pd_hdl_t pd,
354 	    ibt_lkey_flags_t flags, uint_t phys_buf_list_sz,
355 	    ibc_mr_hdl_t *mr_p, ibt_pmr_desc_t *mem_desc_p);
356 
357 	/* Physical Register Memory Region */
358 	ibt_status_t (*ibc_register_physical_mr)(ibc_hca_hdl_t hca,
359 	    ibc_pd_hdl_t pd, ibt_pmr_attr_t *mem_pattr, void *ibtl_reserved,
360 	    ibc_mr_hdl_t *mr_p, ibt_pmr_desc_t *mem_desc_p);
361 	ibt_status_t (*ibc_reregister_physical_mr)(ibc_hca_hdl_t hca,
362 	    ibc_mr_hdl_t mr, ibc_pd_hdl_t pd, ibt_pmr_attr_t *mem_pattr,
363 	    void *ibtl_reserved, ibc_mr_hdl_t *mr_p,
364 	    ibt_pmr_desc_t *mem_desc_p);
365 
366 	/* Fast Memory Registration (FMR) */
367 	ibt_status_t (*ibc_create_fmr_pool)(ibc_hca_hdl_t hca, ibc_pd_hdl_t pd,
368 	    ibt_fmr_pool_attr_t *fmr_params, ibc_fmr_pool_hdl_t *fmr_pool_p);
369 	ibt_status_t (*ibc_destroy_fmr_pool)(ibc_hca_hdl_t hca,
370 	    ibc_fmr_pool_hdl_t fmr_pool);
371 	ibt_status_t (*ibc_flush_fmr_pool)(ibc_hca_hdl_t hca,
372 	    ibc_fmr_pool_hdl_t fmr_pool);
373 	ibt_status_t (*ibc_register_physical_fmr)(ibc_hca_hdl_t hca,
374 	    ibc_fmr_pool_hdl_t fmr_pool, ibt_pmr_attr_t *mem_pattr,
375 	    void *ibtl_reserved, ibc_mr_hdl_t *mr_hdl_p,
376 	    ibt_pmr_desc_t *mem_desc_p);
377 	ibt_status_t (*ibc_deregister_fmr)(ibc_hca_hdl_t hca, ibc_mr_hdl_t mr);
378 
379 	/* IO memory management */
380 	ibt_status_t (*ibc_alloc_io_mem)(ibc_hca_hdl_t hca_hdl, size_t size,
381 	    ibt_mr_flags_t mr_flag, caddr_t *kaddrp,
382 	    ibc_mem_alloc_hdl_t *mem_alloc_hdl);
383 	ibt_status_t (*ibc_free_io_mem)(ibc_hca_hdl_t hca_hdl,
384 	    ibc_mem_alloc_hdl_t mem_alloc_hdl);
385 
386 	/* Extended RC (XRC) */
387 	ibt_status_t (*ibc_alloc_xrc_domain)();
388 	ibt_status_t (*ibc_free_xrc_domain)();
389 	ibt_status_t (*ibc_alloc_xrc_srq)();
390 	ibt_status_t (*ibc_free_xrc_srq)();
391 	ibt_status_t (*ibc_query_xrc_srq)();
392 	ibt_status_t (*ibc_modify_xrc_srq)();
393 	ibt_status_t (*ibc_alloc_xrc_tgt_qp)();
394 	ibt_status_t (*ibc_free_xrc_tgt_qp)();
395 	ibt_status_t (*ibc_query_xrc_tgt_qp)();
396 	ibt_status_t (*ibc_modify_xrc_tgt_qp)();
397 
398 	/* DMA memory region */
399 	ibt_status_t (*ibc_register_dma_mr)(ibc_hca_hdl_t hca, ibc_pd_hdl_t pd,
400 	    ibt_dmr_attr_t *attr_p, void *ibtl_reserved, ibc_mr_hdl_t *mr_p,
401 	    ibt_mr_desc_t *mem_desc);
402 
403 	/* OPS extensions for next round of enhancements */
404 	ibt_status_t (*ibc_enhancement1)();
405 	ibt_status_t (*ibc_enhancement2)();
406 	ibt_status_t (*ibc_enhancement3)();
407 	ibt_status_t (*ibc_enhancement4)();
408 } ibc_operations_t;
409 
410 
411 /*
412  * The ibc_hca_info_s structure is used for HCA drivers to communicate its
413  * HCA specific information to IBTF when it attaches a device via ibc_attach().
414  *
415  * IBTF assumes that the structures pointed to by the hca_ops and hca_attr
416  * structure members are persistent.
417  */
418 typedef struct ibc_hca_info_s {
419 	ibc_version_t		hca_ci_vers;	/* CI Version */
420 	ibc_hca_hdl_t		hca_handle;	/* used for call through */
421 						/* "hca_ops" */
422 	ibc_operations_t	*hca_ops;
423 	ibt_hca_attr_t		*hca_attr;
424 } ibc_hca_info_t;
425 
426 
427 /* Channel Interface return status */
428 typedef enum ibc_status_e {
429 	IBC_SUCCESS = 0,
430 	IBC_FAILURE = 1
431 } ibc_status_t;
432 
433 /*
434  * CI up-calls to IBTF.
435  */
436 
437 /*
438  * ibc_init
439  *	Registers CI clients with the Solaris I/O framework
440  *
441  * ibc_fini
442  *	Un-Registers CI clients with the Solaris I/O framework
443  */
444 int ibc_init(struct modlinkage *modlp);
445 void ibc_fini(struct modlinkage *modlp);
446 
447 /*
448  * ibc_attach
449  *	Register HCA device with IBTF. During this call HCA driver provides
450  *	driver's information neededby IBTF.
451  *
452  * ibc_post_attach
453  *	After a successful ibc_attach, this must be called.
454  *
455  * ibc_pre_detach
456  *	Attempt to De-Register HCA Device from IBTF.
457  *	This requires the cooperation of IBTF clients to
458  *	stop using this HCA.  Upon success, the HCA driver
459  *	is committed to calling ibc_detach.
460  *
461  * ibc_detach
462  *	De-Register HCA Device from IBTF.
463  *	This function will succeed if ibc_pre_detach has previously
464  *	succeeded for this device.
465  */
466 ibc_status_t ibc_attach(ibc_clnt_hdl_t *ibc_hdl_p, ibc_hca_info_t *info_p);
467 void ibc_post_attach(ibc_clnt_hdl_t ibc_hdl);
468 ibc_status_t ibc_pre_detach(ibc_clnt_hdl_t ibc_hdl, ddi_detach_cmd_t cmd);
469 void ibc_detach(ibc_clnt_hdl_t ibc_hdl);
470 
471 /*
472  * ibc_cq_handler
473  *	IBTF Completion Queue Notification Handler.
474  */
475 void ibc_cq_handler(ibc_clnt_hdl_t ibc_hdl, ibt_cq_hdl_t ibt_cq);
476 
477 /*
478  * ibc_async_handler
479  *	IBTF Asynchronous event/error handler.
480  */
481 void ibc_async_handler(ibc_clnt_hdl_t ibc_hdl, ibt_async_code_t code,
482     ibc_async_event_t *event_p);
483 
484 /*
485  * ibc_memory_handler
486  *	IBTF memory event/error handler.
487  */
488 void ibc_memory_handler(ibc_clnt_hdl_t ibc_hdl, ibt_mem_code_t code,
489     ibt_mem_data_t *data_p, void *ibtl_reserved);
490 
491 /*
492  * ibc_get_ci_failure()
493  *
494  *	Used to obtain a special IBTF failure code for CI specific failures,
495  *	failures other than those defined in ibt_status_t.
496  */
497 ibt_status_t ibc_get_ci_failure(uint64_t ena);
498 
499 #ifdef __cplusplus
500 }
501 #endif
502 
503 #endif	/* _SYS_IB_IBTL_IBCI_H */
504