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, Version 1.0 only 6 * (the "License"). You may not use this file except in compliance 7 * with the License. 8 * 9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 10 * or http://www.opensolaris.org/os/licensing. 11 * See the License for the specific language governing permissions 12 * and limitations under the License. 13 * 14 * When distributing Covered Code, include this CDDL HEADER in each 15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 16 * If applicable, add the following below this CDDL HEADER, with the 17 * fields enclosed by brackets "[]" replaced with your own identifying 18 * information: Portions Copyright [yyyy] [name of copyright owner] 19 * 20 * CDDL HEADER END 21 */ 22 /* 23 * Copyright 2005 Sun Microsystems, Inc. All rights reserved. 24 * Use is subject to license terms. 25 */ 26 27 #ifndef _SYS_IB_IBTL_IBCI_H 28 #define _SYS_IB_IBTL_IBCI_H 29 30 #pragma ident "%Z%%M% %I% %E% SMI" 31 32 /* 33 * ibci.h 34 * 35 * Define the data structures and function prototypes that comprise 36 * the IB Channel API (API for HCA drivers). All CI handles are opaque 37 * to the IBTF here, real data is accessed in the HCA driver by a 38 * typecast to a driver specific struct. 39 */ 40 41 #include <sys/ib/ibtl/ibtl_types.h> 42 #include <sys/ib/ibtl/ibtl_ci_types.h> 43 #include <sys/modctl.h> 44 45 46 #ifdef __cplusplus 47 extern "C" { 48 #endif 49 50 /* 51 * Define CI opaque IBTF handles. 52 */ 53 typedef struct ibtl_qp_s *ibtl_qp_hdl_t; /* ibt_alloc_qp() */ 54 typedef struct ibtl_eec_s *ibtl_eec_hdl_t; /* ibt_alloc_eec() */ 55 56 /* 57 * Define IBTF opaque CI handles. 58 */ 59 typedef struct ibc_hca_s *ibc_hca_hdl_t; /* HCA/CI Handle */ 60 typedef struct ibc_pd_s *ibc_pd_hdl_t; /* Protection Domain Handle */ 61 typedef struct ibc_rdd_s *ibc_rdd_hdl_t; /* Reliable Datagram Domain */ 62 typedef struct ibc_ah_s *ibc_ah_hdl_t; /* Address Handle */ 63 typedef struct ibc_qp_s *ibc_qp_hdl_t; /* Queue Pair Handle */ 64 typedef struct ibc_srq_s *ibc_srq_hdl_t; /* Shared Receive Queue Hdl */ 65 typedef struct ibc_qpn_s *ibc_qpn_hdl_t; /* Queue Pair Number Handle */ 66 typedef struct ibc_cq_s *ibc_cq_hdl_t; /* Completion Queue Handle */ 67 typedef struct ibc_eec_s *ibc_eec_hdl_t; /* End-to-End Context Handle */ 68 69 #define ibc_fmr_pool_hdl_t ibt_fmr_pool_hdl_t /* FMR Pool Handle */ 70 #define ibc_mr_hdl_t ibt_mr_hdl_t /* Memory Region Handle */ 71 #define ibc_mw_hdl_t ibt_mw_hdl_t /* Memory Window Handle */ 72 #define ibc_ma_hdl_t ibt_ma_hdl_t /* Memory Area Handle */ 73 74 /* Handle used by CI for up calls to IBTF */ 75 typedef struct ibtl_hca_devinfo_s *ibc_clnt_hdl_t; /* ibc_attach() */ 76 77 /* 78 * Fields opaque to TI, but visible to CI 79 */ 80 81 /* 82 * ibt_qp_alloc_attr_t 83 */ 84 #define qp_ibc_scq_hdl qp_opaque1 85 #define qp_ibc_rcq_hdl qp_opaque2 86 #define qp_ibc_srq_hdl qp_opaque3 87 88 89 /* 90 * ibt_status_t 91 */ 92 #define IBT_HCA_RAWD_CHAN_EXCEEDED IBT_ERR_OPAQUE1 /* Requested raw QP */ 93 /* exceeds HCA max */ 94 /* limit */ 95 #define IBT_CHAN_RAWD_NOT_SUPPORTED IBT_ERR_OPAQUE2 /* Raw datagram QPs */ 96 /* not supported */ 97 #define IBT_CHAN_RD_NOT_SUPPORTED IBT_ERR_OPAQUE3 /* RD not supported */ 98 #define IBT_EEC_HDL_INVALID IBT_ERR_OPAQUE4 /* Invalid EEC handle */ 99 #define IBT_EEC_STATE_INVALID IBT_ERR_OPAQUE5 /* Invalid EEC State */ 100 #define IBT_EEC_ATTR_RO IBT_ERR_OPAQUE6 /* Can't Change EEC */ 101 /* Attribute */ 102 #define IBT_RDD_IN_USE IBT_ERR_OPAQUE7 /* RDD in Use */ 103 #define IBT_RDD_HDL_INVALID IBT_ERR_OPAQUE8 /* Invalid RDD */ 104 #define IBT_RNR_NAK_TIMER_INVALID IBT_ERR_OPAQUE9 /* Invalid RNR NAK */ 105 /* Timer Value */ 106 #define IBT_RDD_NOT_SUPPORTED IBT_ERR_OPAQUE10 107 108 109 /* 110 * ibt_wc_status_t 111 */ 112 #define IBT_WC_LOCAL_EEC_OP_ERR 12 /* Internal consistency error */ 113 #define IBT_WC_LOCAL_RDD_VIOLATION_ERR 30 /* The RDD associated with */ 114 /* the QP does not match */ 115 /* the RDD associated with */ 116 /* the EE Context */ 117 #define IBT_WC_REMOTE_RD_REQ_INVALID 31 /* Detected an invalid */ 118 /* incoming RD message */ 119 #define IBT_WC_EEC_REMOTE_ABORTED 32 /* Requester aborted the */ 120 /* operation */ 121 #define IBT_WC_EEC_NUM_INVALID 33 /* Invalid EEC Number */ 122 /* detected */ 123 #define IBT_WC_EEC_STATE_INVALID 34 /* Invalid EEC state */ 124 125 /* 126 * ibt_async_code_t 127 */ 128 #define IBT_EVENT_PATH_MIGRATED_EEC IBT_ASYNC_OPAQUE1 129 #define IBT_ERROR_CATASTROPHIC_EEC IBT_ASYNC_OPAQUE3 130 #define IBT_ERROR_PATH_MIGRATE_REQ_EEC IBT_ASYNC_OPAQUE4 131 132 /* 133 * ibt_object_type_t 134 */ 135 #define IBT_HDL_EEC IBT_HDL_OPAQUE1 136 #define IBT_HDL_RDD IBT_HDL_OPAQUE2 137 138 139 /* 140 * ibt_hca_attr_t 141 */ 142 #define hca_max_rdd hca_opaque2 /* Max RDDs in HCA */ 143 #define hca_max_eec hca_opaque3 /* Max EEContexts in HCA */ 144 #define hca_max_rd_sgl hca_opaque4 /* Max SGL entries per RD WR */ 145 #define hca_max_rdma_in_ee hca_opaque5 /* Max RDMA Reads/Atomics in */ 146 /* per EEC with HCA as target */ 147 #define hca_max_rdma_out_ee hca_opaque6 /* Max RDMA Reads/Atomics out */ 148 /* per EE by this HCA */ 149 #define hca_max_ipv6_qp hca_max_ipv6_chan 150 #define hca_max_ether_qp hca_max_ether_chan 151 #define hca_eec_max_ci_priv_sz hca_opaque7 152 #define hca_rdd_max_ci_priv_sz hca_opaque8 153 #define hca_max_map_per_fmr hca_opaque9 154 155 156 /* 157 * ibt_wc_t 158 */ 159 #define wc_eecn wc_opaque3 /* End-to-End Context RD's only */ 160 161 162 /* Channel Interface version */ 163 typedef enum ibc_version_e { 164 IBCI_V1 = 1, 165 IBCI_V2 = 2 /* FMR Support */ 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 uint8_t ev_port; /* Valid for PORT UP/DOWN events */ 225 ibt_srq_hdl_t ev_srq_hdl; /* SRQ handle */ 226 } ibc_async_event_t; 227 228 229 typedef struct ibc_operations_s { 230 /* HCA */ 231 ibt_status_t (*ibc_query_hca_ports)(ibc_hca_hdl_t hca, uint8_t port, 232 ibt_hca_portinfo_t *info_p); 233 ibt_status_t (*ibc_modify_ports)(ibc_hca_hdl_t hca, uint8_t port, 234 ibt_port_modify_flags_t flags, uint8_t init_type); 235 ibt_status_t (*ibc_modify_system_image)(ibc_hca_hdl_t hca, 236 ib_guid_t sys_guid); 237 238 /* Protection Domain */ 239 ibt_status_t (*ibc_alloc_pd)(ibc_hca_hdl_t hca, ibt_pd_flags_t flags, 240 ibc_pd_hdl_t *pd_p); 241 ibt_status_t (*ibc_free_pd)(ibc_hca_hdl_t hca, ibc_pd_hdl_t pd); 242 243 /* Reliable Datagram Domain */ 244 ibt_status_t (*ibc_alloc_rdd)(ibc_hca_hdl_t hca, ibc_rdd_flags_t flags, 245 ibc_rdd_hdl_t *rdd_p); 246 ibt_status_t (*ibc_free_rdd)(ibc_hca_hdl_t hca, ibc_rdd_hdl_t rdd); 247 248 /* Address Handle */ 249 ibt_status_t (*ibc_alloc_ah)(ibc_hca_hdl_t hca, ibt_ah_flags_t flags, 250 ibc_pd_hdl_t pd, ibt_adds_vect_t *attr_p, ibc_ah_hdl_t *ah_p); 251 ibt_status_t (*ibc_free_ah)(ibc_hca_hdl_t hca, ibc_ah_hdl_t ah); 252 ibt_status_t (*ibc_query_ah)(ibc_hca_hdl_t hca, ibc_ah_hdl_t ah, 253 ibc_pd_hdl_t *pd_p, ibt_adds_vect_t *attr_p); 254 ibt_status_t (*ibc_modify_ah)(ibc_hca_hdl_t hca, ibc_ah_hdl_t ah, 255 ibt_adds_vect_t *attr_p); 256 257 /* Queue Pair */ 258 ibt_status_t (*ibc_alloc_qp)(ibc_hca_hdl_t hca, ibtl_qp_hdl_t ibtl_qp, 259 ibt_qp_type_t type, ibt_qp_alloc_attr_t *attr_p, 260 ibt_chan_sizes_t *queue_sizes_p, ib_qpn_t *qpn, ibc_qp_hdl_t *qp_p); 261 ibt_status_t (*ibc_alloc_special_qp)(ibc_hca_hdl_t hca, uint8_t port, 262 ibtl_qp_hdl_t ibt_qp, ibt_sqp_type_t type, 263 ibt_qp_alloc_attr_t *attr_p, ibt_chan_sizes_t *queue_sizes_p, 264 ibc_qp_hdl_t *qp_p); 265 ibt_status_t (*ibc_free_qp)(ibc_hca_hdl_t hca, ibc_qp_hdl_t qp, 266 ibc_free_qp_flags_t free_qp_flags, ibc_qpn_hdl_t *qpnh_p); 267 ibt_status_t (*ibc_release_qpn)(ibc_hca_hdl_t hca, ibc_qpn_hdl_t qpnh); 268 ibt_status_t (*ibc_query_qp)(ibc_hca_hdl_t hca, ibc_qp_hdl_t qp, 269 ibt_qp_query_attr_t *attr_p); 270 ibt_status_t (*ibc_modify_qp)(ibc_hca_hdl_t hca, ibc_qp_hdl_t qp, 271 ibt_cep_modify_flags_t flags, ibt_qp_info_t *info_p, 272 ibt_queue_sizes_t *actual_sz); 273 274 /* Completion Queues */ 275 ibt_status_t (*ibc_alloc_cq)(ibc_hca_hdl_t hca, ibt_cq_hdl_t ibt_cq, 276 ibt_cq_attr_t *attr_p, ibc_cq_hdl_t *cq_p, uint_t *actual_size); 277 ibt_status_t (*ibc_free_cq)(ibc_hca_hdl_t hca, ibc_cq_hdl_t cq); 278 ibt_status_t (*ibc_query_cq)(ibc_hca_hdl_t hca, ibc_cq_hdl_t cq, 279 uint_t *entries); 280 ibt_status_t (*ibc_resize_cq)(ibc_hca_hdl_t hca, ibc_cq_hdl_t cq, 281 uint_t size, uint_t *actual_size); 282 ibt_status_t (*ibc_alloc_cq_sched)(ibc_hca_hdl_t hca, 283 ibt_cq_sched_flags_t flags, ibc_cq_handler_attr_t *handler_attrs_p); 284 ibt_status_t (*ibc_free_cq_sched)(ibc_hca_hdl_t hca, 285 ibt_cq_handler_id_t id); 286 287 /* EE Context */ 288 ibt_status_t (*ibc_alloc_eec)(ibc_hca_hdl_t hca, ibc_eec_flags_t flags, 289 ibtl_eec_hdl_t ibtl_eec, ibc_rdd_hdl_t rdd, ibc_eec_hdl_t *eec_p); 290 ibt_status_t (*ibc_free_eec)(ibc_hca_hdl_t hca, ibc_eec_hdl_t eec); 291 ibt_status_t (*ibc_query_eec)(ibc_hca_hdl_t hca, ibc_eec_hdl_t eec, 292 ibt_eec_query_attr_t *attr_p); 293 ibt_status_t (*ibc_modify_eec)(ibc_hca_hdl_t hca, ibc_eec_hdl_t eec, 294 ibt_cep_modify_flags_t flags, ibt_eec_info_t *info_p); 295 296 /* Memory Registration */ 297 ibt_status_t (*ibc_register_mr)(ibc_hca_hdl_t hca, ibc_pd_hdl_t pd, 298 ibt_mr_attr_t *attr_p, void *ibtl_reserved, ibc_mr_hdl_t *mr_p, 299 ibt_mr_desc_t *mem_desc); 300 ibt_status_t (*ibc_register_buf)(ibc_hca_hdl_t hca, ibc_pd_hdl_t pd, 301 ibt_smr_attr_t *attrp, struct buf *buf, void *ibtl_reserved, 302 ibc_mr_hdl_t *mr_hdl_p, ibt_mr_desc_t *mem_desc); 303 ibt_status_t (*ibc_register_shared_mr)(ibc_hca_hdl_t hca, 304 ibc_mr_hdl_t mr, ibc_pd_hdl_t pd, ibt_smr_attr_t *attr_p, 305 void *ibtl_reserved, ibc_mr_hdl_t *mr_p, ibt_mr_desc_t *mem_desc); 306 ibt_status_t (*ibc_deregister_mr)(ibc_hca_hdl_t hca, ibc_mr_hdl_t mr); 307 ibt_status_t (*ibc_query_mr)(ibc_hca_hdl_t hca, ibc_mr_hdl_t mr, 308 ibt_mr_query_attr_t *info_p); 309 ibt_status_t (*ibc_reregister_mr)(ibc_hca_hdl_t hca, ibc_mr_hdl_t mr, 310 ibc_pd_hdl_t pd, ibt_mr_attr_t *attr_p, void *ibtl_reserved, 311 ibc_mr_hdl_t *mr_p, ibt_mr_desc_t *mem_desc); 312 ibt_status_t (*ibc_reregister_buf)(ibc_hca_hdl_t hca, ibc_mr_hdl_t mr, 313 ibc_pd_hdl_t pd, ibt_smr_attr_t *attrp, struct buf *buf, 314 void *ibtl_reserved, ibc_mr_hdl_t *mr_p, ibt_mr_desc_t *mem_desc); 315 ibt_status_t (*ibc_sync_mr)(ibc_hca_hdl_t hca, 316 ibt_mr_sync_t *mr_segments, size_t num_segments); 317 318 /* Memory Window */ 319 ibt_status_t (*ibc_alloc_mw)(ibc_hca_hdl_t hca, ibc_pd_hdl_t pd, 320 ibt_mw_flags_t flags, ibc_mw_hdl_t *mw_p, ibt_rkey_t *rkey_p); 321 ibt_status_t (*ibc_free_mw)(ibc_hca_hdl_t hca, ibc_mw_hdl_t mw); 322 ibt_status_t (*ibc_query_mw)(ibc_hca_hdl_t hca, ibc_mw_hdl_t mw, 323 ibt_mw_query_attr_t *mw_attr_p); 324 325 /* Multicast Group */ 326 ibt_status_t (*ibc_attach_mcg)(ibc_hca_hdl_t hca, ibc_qp_hdl_t qp, 327 ib_gid_t gid, ib_lid_t lid); 328 ibt_status_t (*ibc_detach_mcg)(ibc_hca_hdl_t hca, ibc_qp_hdl_t qp, 329 ib_gid_t gid, ib_lid_t lid); 330 331 /* WR processing */ 332 ibt_status_t (*ibc_post_send)(ibc_hca_hdl_t hca, ibc_qp_hdl_t qp, 333 ibt_send_wr_t *wr_p, uint_t num_wr, uint_t *num_posted); 334 ibt_status_t (*ibc_post_recv)(ibc_hca_hdl_t hca, ibc_qp_hdl_t qp, 335 ibt_recv_wr_t *wr_p, uint_t num_wr, uint_t *num_posted); 336 ibt_status_t (*ibc_poll_cq)(ibc_hca_hdl_t hca, ibc_cq_hdl_t cq, 337 ibt_wc_t *wc_p, uint_t num_wc, uint_t *num_polled); 338 ibt_status_t (*ibc_notify_cq)(ibc_hca_hdl_t hca, ibc_cq_hdl_t cq, 339 ibt_cq_notify_flags_t flags); 340 341 /* CI Object Private Data */ 342 ibt_status_t (*ibc_ci_data_in)(ibc_hca_hdl_t hca, 343 ibt_ci_data_flags_t flags, ibt_object_type_t object, 344 void *ibc_object_handle, void *data_p, size_t data_sz); 345 ibt_status_t (*ibc_ci_data_out)(ibc_hca_hdl_t hca, 346 ibt_ci_data_flags_t flags, ibt_object_type_t object, 347 void *ibc_object_handle, void *data_p, size_t data_sz); 348 349 /* Shared Receive Queues */ 350 ibt_status_t (*ibc_alloc_srq)(ibc_hca_hdl_t hca, ibt_srq_flags_t flags, 351 ibt_srq_hdl_t ibt_srq, ibc_pd_hdl_t pd, ibt_srq_sizes_t *sizes, 352 ibc_srq_hdl_t *ibc_srq_p, ibt_srq_sizes_t *real_size_p); 353 ibt_status_t (*ibc_free_srq)(ibc_hca_hdl_t hca, ibc_srq_hdl_t srq); 354 ibt_status_t (*ibc_query_srq)(ibc_hca_hdl_t hca, ibc_srq_hdl_t srq, 355 ibc_pd_hdl_t *pd_p, ibt_srq_sizes_t *sizes_p, uint_t *limit); 356 ibt_status_t (*ibc_modify_srq)(ibc_hca_hdl_t hca, ibc_srq_hdl_t srq, 357 ibt_srq_modify_flags_t flags, uint_t size, uint_t limit, 358 uint_t *real_size_p); 359 ibt_status_t (*ibc_post_srq)(ibc_hca_hdl_t hca, ibc_srq_hdl_t srq, 360 ibt_recv_wr_t *wr, uint_t num_wr, uint_t *num_posted_p); 361 362 /* Address translation */ 363 ibt_status_t (*ibc_map_mem_area)(ibc_hca_hdl_t hca_hdl, 364 ibt_va_attr_t *va_attrs, void *ibtl_reserved, 365 uint_t paddr_list_len, ibt_phys_buf_t *paddr_list_p, 366 uint_t *num_paddr_p, size_t *paddr_bufsz_p, 367 ib_memlen_t *paddr_offset_p, ibc_ma_hdl_t *ma_hdl_p); 368 ibt_status_t (*ibc_unmap_mem_area)(ibc_hca_hdl_t hca_hdl, 369 ibc_ma_hdl_t ma_hdl); 370 371 /* Allocate L_Key */ 372 ibt_status_t (*ibc_alloc_lkey)(ibc_hca_hdl_t hca_hdl, ibc_pd_hdl_t pd, 373 ibt_lkey_flags_t flags, uint_t phys_buf_list_sz, 374 ibc_mr_hdl_t *mr_p, ibt_pmr_desc_t *mem_desc_p); 375 376 /* Physical Register Memory Region */ 377 ibt_status_t (*ibc_register_physical_mr)(ibc_hca_hdl_t hca, 378 ibc_pd_hdl_t pd, ibt_pmr_attr_t *mem_pattr, void *ibtl_reserved, 379 ibc_mr_hdl_t *mr_p, ibt_pmr_desc_t *mem_desc_p); 380 ibt_status_t (*ibc_reregister_physical_mr)(ibc_hca_hdl_t hca, 381 ibc_mr_hdl_t mr, ibc_pd_hdl_t pd, ibt_pmr_attr_t *mem_pattr, 382 void *ibtl_reserved, ibc_mr_hdl_t *mr_p, 383 ibt_pmr_desc_t *mem_desc_p); 384 385 /* Fast Memory Registration (FMR) */ 386 ibt_status_t (*ibc_create_fmr_pool)(ibc_hca_hdl_t hca, ibc_pd_hdl_t pd, 387 ibt_fmr_pool_attr_t *fmr_params, ibc_fmr_pool_hdl_t *fmr_pool_p); 388 ibt_status_t (*ibc_destroy_fmr_pool)(ibc_hca_hdl_t hca, 389 ibc_fmr_pool_hdl_t fmr_pool); 390 ibt_status_t (*ibc_flush_fmr_pool)(ibc_hca_hdl_t hca, 391 ibc_fmr_pool_hdl_t fmr_pool); 392 ibt_status_t (*ibc_register_physical_fmr)(ibc_hca_hdl_t hca, 393 ibc_fmr_pool_hdl_t fmr_pool, ibt_pmr_attr_t *mem_pattr, 394 void *ibtl_reserved, ibc_mr_hdl_t *mr_hdl_p, 395 ibt_pmr_desc_t *mem_desc_p); 396 ibt_status_t (*ibc_deregister_fmr)(ibc_hca_hdl_t hca, ibc_mr_hdl_t mr); 397 } ibc_operations_t; 398 399 400 /* 401 * The ibc_hca_info_s structure is used for HCA drivers to communicate its 402 * HCA specific information to IBTF when it attaches a device via ibc_attach(). 403 * 404 * IBTF assumes that the structures pointed to by the hca_ops and hca_attr 405 * structure members are persistent. 406 */ 407 typedef struct ibc_hca_info_s { 408 ibc_version_t hca_ci_vers; /* CI Version */ 409 dev_info_t *hca_dip; /* HCA dev_info */ 410 ibc_hca_hdl_t hca_handle; /* used for call through */ 411 /* "hca_ops" */ 412 ibc_operations_t *hca_ops; 413 ibt_hca_attr_t *hca_attr; 414 ibc_cq_handler_attr_t hca_def_cq_handler_attr; 415 } ibc_hca_info_t; 416 417 418 /* Channel Interface return status */ 419 typedef enum ibc_status_e { 420 IBC_SUCCESS = 0, 421 IBC_FAILURE = 1 422 } ibc_status_t; 423 424 /* 425 * CI up-calls to IBTF. 426 */ 427 428 /* 429 * ibc_init 430 * Registers CI clients with the Solaris I/O framework 431 * 432 * ibc_fini 433 * Un-Registers CI clients with the Solaris I/O framework 434 */ 435 int ibc_init(struct modlinkage *modlp); 436 void ibc_fini(struct modlinkage *modlp); 437 438 /* 439 * ibc_attach 440 * Register HCA device with IBTF. During this call HCA driver provides 441 * driver's information neededby IBTF. 442 * 443 * ibc_post_attach 444 * After a successful ibc_attach, this must be called. 445 * 446 * ibc_pre_detach 447 * Attempt to De-Register HCA Device from IBTF. 448 * This requires the cooperation of IBTF clients to 449 * stop using this HCA. Upon success, the HCA driver 450 * is committed to calling ibc_detach. 451 * 452 * ibc_detach 453 * De-Register HCA Device from IBTF. 454 * This function will succeed if ibc_pre_detach has previously 455 * succeeded for this device. 456 */ 457 ibc_status_t ibc_attach(ibc_clnt_hdl_t *ibc_hdl_p, ibc_hca_info_t *info_p); 458 void ibc_post_attach(ibc_clnt_hdl_t ibc_hdl); 459 ibc_status_t ibc_pre_detach(ibc_clnt_hdl_t ibc_hdl, ddi_detach_cmd_t cmd); 460 void ibc_detach(ibc_clnt_hdl_t ibc_hdl); 461 462 /* 463 * ibc_cq_handler 464 * IBTF Completion Queue Notification Handler. 465 */ 466 void ibc_cq_handler(ibc_clnt_hdl_t ibc_hdl, ibt_cq_hdl_t ibt_cq); 467 468 /* 469 * ibc_async_handler 470 * IBTF Asynchronous event/error handler. 471 */ 472 void ibc_async_handler(ibc_clnt_hdl_t ibc_hdl, ibt_async_code_t code, 473 ibc_async_event_t *event_p); 474 475 /* 476 * ibc_memory_handler 477 * IBTF memory event/error handler. 478 */ 479 void ibc_memory_handler(ibc_clnt_hdl_t ibc_hdl, ibt_mem_code_t code, 480 ibt_mem_data_t *data_p, void *ibtl_reserved); 481 482 /* 483 * ibc_get_ci_failure() 484 * 485 * Used to obtain a special IBTF failure code for CI specific failures, 486 * failures other than those defined in ibt_status_t. 487 */ 488 ibt_status_t ibc_get_ci_failure(uint64_t ena); 489 490 #ifdef __cplusplus 491 } 492 #endif 493 494 #endif /* _SYS_IB_IBTL_IBCI_H */ 495