4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
22 * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
25 #ifndef _SYS_IB_IBTL_IBCI_H
26 #define _SYS_IB_IBTL_IBCI_H
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.
37 #include <sys/ib/ibtl/ibtl_types.h>
38 #include <sys/ib/ibtl/ibtl_ci_types.h>
39 #include <sys/modctl.h>
47 * Define CI opaque IBTF handles.
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() */
53 * Define IBTF opaque CI handles.
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 */
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 */
73 /* Handle used by CI for up calls to IBTF */
74 typedef struct ibtl_hca_devinfo_s
*ibc_clnt_hdl_t
; /* ibc_attach() */
77 * Fields opaque to TI, but visible to CI
83 #define qp_ibc_scq_hdl qp_opaque1
84 #define qp_ibc_rcq_hdl qp_opaque2
85 #define qp_ibc_srq_hdl qp_opaque3
91 #define IBT_HCA_RAWD_CHAN_EXCEEDED IBT_ERR_OPAQUE1 /* Requested raw QP */
94 #define IBT_CHAN_RAWD_NOT_SUPPORTED IBT_ERR_OPAQUE2 /* Raw datagram QPs */
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 */
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 */
105 #define IBT_RDD_NOT_SUPPORTED IBT_ERR_OPAQUE10
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 */
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 */
120 #define IBT_WC_EEC_NUM_INVALID 33 /* Invalid EEC Number */
122 #define IBT_WC_EEC_STATE_INVALID 34 /* Invalid EEC state */
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
134 #define IBT_HDL_EEC IBT_HDL_OPAQUE1
135 #define IBT_HDL_RDD IBT_HDL_OPAQUE2
141 #define wc_eecn wc_detail /* End-to-End Context RD's only */
144 /* Channel Interface version */
145 typedef int ibc_version_t
;
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
;
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)
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)
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.
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 */
196 typedef struct ibc_operations_s
{
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
,
205 /* Protection Domain */
206 ibt_status_t (*ibc_alloc_pd
)(ibc_hca_hdl_t hca
, ibt_pd_flags_t flags
,
208 ibt_status_t (*ibc_free_pd
)(ibc_hca_hdl_t hca
, ibc_pd_hdl_t pd
);
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
);
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
);
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
,
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
)();
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
);
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
)();
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().
415 * IBTF assumes that the structures pointed to by the hca_ops and hca_attr
416 * structure members are persistent.
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 */
422 ibc_operations_t
*hca_ops
;
423 ibt_hca_attr_t
*hca_attr
;
427 /* Channel Interface return status */
428 typedef enum ibc_status_e
{
434 * CI up-calls to IBTF.
439 * Registers CI clients with the Solaris I/O framework
442 * Un-Registers CI clients with the Solaris I/O framework
444 int ibc_init(struct modlinkage
*modlp
);
445 void ibc_fini(struct modlinkage
*modlp
);
449 * Register HCA device with IBTF. During this call HCA driver provides
450 * driver's information neededby IBTF.
453 * After a successful ibc_attach, this must be called.
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.
462 * De-Register HCA Device from IBTF.
463 * This function will succeed if ibc_pre_detach has previously
464 * succeeded for this device.
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
);
473 * IBTF Completion Queue Notification Handler.
475 void ibc_cq_handler(ibc_clnt_hdl_t ibc_hdl
, ibt_cq_hdl_t ibt_cq
);
479 * IBTF Asynchronous event/error handler.
481 void ibc_async_handler(ibc_clnt_hdl_t ibc_hdl
, ibt_async_code_t code
,
482 ibc_async_event_t
*event_p
);
486 * IBTF memory event/error handler.
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
);
492 * ibc_get_ci_failure()
494 * Used to obtain a special IBTF failure code for CI specific failures,
495 * failures other than those defined in ibt_status_t.
497 ibt_status_t
ibc_get_ci_failure(uint64_t ena
);
503 #endif /* _SYS_IB_IBTL_IBCI_H */