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_IBTL_CI_TYPES_H 26 #define _SYS_IB_IBTL_IBTL_CI_TYPES_H 27 28 /* 29 * ibtl_ci_types.h 30 * Definitions shared between the IBTL and CI interface. 31 */ 32 33 #ifdef __cplusplus 34 extern "C" { 35 #endif 36 37 typedef struct ibc_cq_s *ibt_opaque1_t; 38 typedef struct ibc_srq_s *ibt_opaque2_t; 39 typedef struct ibc_rdd_s *ibt_rdd_hdl_t; /* ibt_alloc_eec() */ 40 41 42 /* 43 * Channel Modify flags - ibt_cep_modify_flags_t 44 * 45 * Note: 46 * That the IBT_CEP_SET_RESET_INIT, IBT_CEP_SET_INIT_RTR 47 * IBT_CEP_SET_RTR_RTS flags are mutually exclusive. However if one of the 48 * optional attributes associated with these flags is to be modified then 49 * the corresponding modify flag must also be specified. For example if 50 * a client wishes to transit from the INIT to RTR state but additionally 51 * they want to disable atomics, then the modify flags should be: 52 * 53 * (IBT_CEP_SET_INIT_RTR | IBT_CEP_SET_ATOMIC) 54 * 55 * And the following attributes specified: 56 * 57 * - Number of responder resources for RDMA read/atomic ops. 58 * - Primary Path Address Vector Information. 59 * - Destination QPN. 60 * - PSN for ReceiveQ. 61 * - Minimum RNR NAK Timer field value. 62 * - ibt_cep_flags_t set to IBT_CEP_ATOMIC 63 * 64 */ 65 #define IBT_CEP_SET_RESET_INIT IBT_CEP_SET_OPAQUE1 66 #define IBT_CEP_SET_INIT_RTR IBT_CEP_SET_OPAQUE2 67 #define IBT_CEP_SET_RTR_RTS IBT_CEP_SET_OPAQUE3 68 69 #define IBT_CEP_SET_STATE IBT_CEP_SET_OPAQUE4 70 #define IBT_CEP_SET_MTU IBT_CEP_SET_OPAQUE5 71 72 #define IBT_CEP_SET_TIMEOUT IBT_CEP_SET_OPAQUE6 73 #define IBT_CEP_SET_PKEY_IX IBT_CEP_SET_OPAQUE7 74 #define IBT_CEP_SET_MIG IBT_CEP_SET_OPAQUE8 75 76 /* 77 * ibt_async_code_t 78 */ 79 #define IBT_EVENT_PATH_MIGRATED_QP IBT_EVENT_PATH_MIGRATED 80 #define IBT_EVENT_COM_EST_QP IBT_EVENT_COM_EST 81 #define IBT_EVENT_COM_EST_EEC IBT_ASYNC_OPAQUE2 82 #define IBT_ERROR_CATASTROPHIC_QP IBT_ERROR_CATASTROPHIC_CHAN 83 #define IBT_ERROR_INVALID_REQUEST_QP IBT_ERROR_INVALID_REQUEST_CHAN 84 #define IBT_ERROR_ACCESS_VIOLATION_QP IBT_ERROR_ACCESS_VIOLATION_CHAN 85 #define IBT_ERROR_PATH_MIGRATE_REQ_QP IBT_ERROR_PATH_MIGRATE_REQ 86 #define IBT_EVENT_EMPTY_QP IBT_EVENT_EMPTY_CHAN 87 88 89 /* 90 * ibt_adds_vect_t 91 */ 92 #define av_send_grh av_opaque1 /* flag to specify if GRH is there */ 93 #define av_dlid av_opaque2 /* destination LID, or router LID */ 94 #define av_src_path av_opaque3 /* Source path bits */ 95 #define av_sgid_ix av_opaque4 96 97 /* 98 * ibt_wc_t 99 */ 100 #define wc_slid wc_opaque1 /* source LID */ 101 #define wc_pkey_ix wc_opaque2 /* The P_Key index, GSI only */ 102 #define wc_path_bits wc_opaque4 /* DLID path bits, UD's, RawIPv6 & */ 103 /* RawEthr only */ 104 105 /* 106 * ibt_mcg_attr_t 107 */ 108 #define mc_mlid mc_opaque1 /* Multicast LID */ 109 110 /* 111 * ibt_mcg_info_t 112 */ 113 #define mc_pkt_lt mc_opaque2 114 115 /* 116 * ibt_hca_flags_t 117 */ 118 #define IBT_HCA_RESIZE_QP IBT_HCA_RESIZE_CHAN 119 120 /* 121 * ibt_object_type_t 122 */ 123 #define IBT_HDL_QP IBT_HDL_CHANNEL 124 #define IBT_HDL_AH IBT_HDL_UD_DEST 125 126 /* 127 * ibt_hca_attr_t 128 */ 129 #define hca_max_ah hca_max_ud_dest /* Max address handles in HCA */ 130 #define hca_ah_max_ci_priv_sz hca_ud_dest_max_ci_priv_sz 131 #define hca_qp_max_ci_priv_sz hca_chan_max_ci_priv_sz 132 #define hca_max_qp hca_max_chans /* Max Channels supported by the HCA */ 133 #define hca_max_qp_sz hca_max_chan_sz /* Max outstanding WRs on any channel */ 134 #define hca_max_rdma_out_qp hca_max_rdma_out_chan 135 #define hca_max_rdma_in_qp hca_max_rdma_in_chan 136 #define hca_max_mcg_qps hca_max_mcg_chans 137 #define hca_max_qp_per_mcg hca_max_chan_per_mcg 138 139 /* 140 * ibt_hca_portinfo_t 141 */ 142 #define p_base_lid p_opaque1 /* Base LID of the port */ 143 144 145 /* Mapping of Verbs defined return status to channel specific. */ 146 #define IBT_QP_FULL IBT_CHAN_FULL 147 #define IBT_QP_HDL_INVALID IBT_CHAN_HDL_INVALID 148 #define IBT_QP_ATTR_RO IBT_CHAN_ATTR_RO 149 #define IBT_QP_STATE_INVALID IBT_CHAN_STATE_INVALID 150 #define IBT_QP_SRV_TYPE_INVALID IBT_CHAN_SRV_TYPE_INVALID 151 #define IBT_QP_IN_USE IBT_CHAN_IN_USE 152 #define IBT_QP_ATOMICS_NOT_SUPPORTED IBT_CHAN_ATOMICS_NOT_SUPPORTED 153 #define IBT_QP_OP_TYPE_INVALID IBT_CHAN_OP_TYPE_INVALID 154 #define IBT_QP_SGL_FORMAT_INVALID IBT_CHAN_SGL_FORMAT_INVALID 155 #define IBT_QP_SGL_LEN_INVALID IBT_CHAN_SGL_LEN_INVALID 156 #define IBT_QP_APM_STATE_INVALID IBT_CHAN_APM_STATE_INVALID 157 #define IBT_QP_SZ_INSUFFICIENT IBT_CHAN_SZ_INSUFFICIENT 158 #define IBT_QP_SPECIAL_TYPE_INVALID IBT_CHAN_SPECIAL_TYPE_INVALID 159 #define IBT_WC_LOCAL_QP_OP_ERR IBT_WC_LOCAL_CHAN_OP_ERR 160 #define IBT_AH_HDL_INVALID IBT_UD_DEST_HDL_INVALID 161 #define IBT_HCA_MCG_QP_EXCEEDED IBT_HCA_MCG_CHAN_EXCEEDED 162 #define IBT_MC_MLID_INVALID IBT_MC_OPAQUE 163 #define IBT_QP_SRQ IBT_CHAN_SRQ 164 #define IBT_QP_TYPE_2A_MW_BOUND IBT_CHAN_TYPE_2A_MW_BOUND 165 #define IBT_QP_WQE_SZ_INSUFF IBT_CHAN_WQE_SZ_INSUFF 166 167 168 /* 169 * ibt_cep_path_t 170 */ 171 #define cep_timeout cep_cm_opaque1 /* 6 bits of timeout exponent */ 172 /* Local ACK timeout for RC */ 173 174 /* 175 * Define an ibt UD Destination struct. This holds all the information 176 * needed to reach a UD destination. 177 * 178 * The ibt_ud_dest_s struct is known by the CI and IBTL. This structure is 179 * referenced by the CI during UD work request processing. It is defined here 180 * here so that IBTL does not need to do any data copying during ibt_post_send. 181 */ 182 typedef struct ibt_ud_dest_s { 183 ibt_ah_hdl_t ud_ah; /* Address handle */ 184 ib_qpn_t ud_dst_qpn; /* Destination QPN */ 185 ib_qkey_t ud_qkey; /* Q_Key */ 186 187 /* The following fields are IBTL-only, i.e., opaque to the CI */ 188 struct ibtl_hca_s *ud_dest_opaque1; 189 } ibt_ud_dest_t; 190 191 /* 192 * Reserved For Future Use 193 * RD destination address info. 194 */ 195 typedef struct ibt_rd_dest_s { 196 ibt_ah_hdl_t rd_ah; /* Address handle */ 197 ib_eecn_t rd_eecn; /* Local EEC Number */ 198 ib_qpn_t rd_dst_qpn; /* Destination QP Number */ 199 ib_qkey_t rd_dst_qkey; /* The Q_Key for the destination QP */ 200 } ibt_rd_dest_t; 201 202 /* 203 * QP Type. 204 */ 205 typedef enum ibt_qp_type_e { 206 IBT_RC_RQP = 0, 207 IBT_RD_RQP = 1, /* Reserved For Future Use */ 208 IBT_UC_RQP = 2, /* Reserved For Future Use */ 209 IBT_UD_RQP = 3 210 } ibt_qp_type_t; 211 212 /* 213 * Special QP Type. 214 */ 215 typedef enum ibt_sqp_type_e { 216 IBT_SMI_SQP = 0, 217 IBT_GSI_SQP = 1, 218 IBT_RAWIP_SQP = 2, /* Reserved For Future Use */ 219 IBT_RAWETHER_SQP = 3 /* Reserved For Future Use */ 220 } ibt_sqp_type_t; 221 222 /* 223 * QP alloc flags. 224 */ 225 typedef enum ibt_qp_alloc_flags_e { 226 IBT_QP_NO_FLAGS = 0, 227 IBT_QP_USER_MAP = (1 << 0), 228 IBT_QP_DEFER_ALLOC = (1 << 1), 229 IBT_QP_USES_SRQ = (1 << 2), 230 IBT_QP_USES_RSS = (1 << 3), 231 232 /* FC variants of UD */ 233 IBT_QP_USES_RFCI = (1 << 4), 234 IBT_QP_USES_FCMD = (1 << 5), 235 IBT_QP_USES_FEXCH = (1 << 6) 236 } ibt_qp_alloc_flags_t; 237 238 /* 239 * QP Alloc Attributes definition. 240 * 241 * Contains the QP attributes that are required to create a QP. 242 */ 243 typedef struct ibt_qp_alloc_attr_s { 244 ibt_qp_alloc_flags_t qp_alloc_flags; 245 ibt_cq_hdl_t qp_scq_hdl; /* SQ CQ IBT Hdl */ 246 ibt_cq_hdl_t qp_rcq_hdl; /* RQ CQ IBT Hdl */ 247 ibt_rdd_hdl_t qp_rdd_hdl; /* Reserved */ 248 ibt_pd_hdl_t qp_pd_hdl; /* PD handle. */ 249 ibt_chan_sizes_t qp_sizes; /* Queue and SGL */ 250 ibt_attr_flags_t qp_flags; /* SQ Signaling Type etc */ 251 ibt_opaque1_t qp_opaque1; 252 ibt_opaque1_t qp_opaque2; 253 ibt_srq_hdl_t qp_srq_hdl; /* SRQ ibt hdl */ 254 ibt_opaque2_t qp_opaque3; 255 ibt_fc_attr_t qp_fc; 256 } ibt_qp_alloc_attr_t; 257 258 259 /* 260 * QP query info 261 */ 262 /* RC transport specific */ 263 typedef struct ibt_qp_rc_attr_s { 264 uint32_t rc_sq_psn:24; /* SQ PSN */ 265 uint32_t rc_rq_psn:24; /* RQ PSN */ 266 ib_qpn_t rc_dst_qpn; /* Destination QPN */ 267 ibt_cep_cmstate_t rc_mig_state; /* Channel Migration State */ 268 ibt_rnr_retry_cnt_t rc_rnr_retry_cnt; 269 uint8_t rc_retry_cnt:3; 270 uint8_t rc_rdma_ra_out; /* max RDMA-R/Atomic sent */ 271 /* Number of RDMA RD's & */ 272 /* Atomics outstanding */ 273 uint8_t rc_rdma_ra_in; /* Incoming RDMA-R/Atomic */ 274 /* Responder resources for */ 275 /* handling incoming RDMA */ 276 /* RD's & Atomics */ 277 ibt_rnr_nak_time_t rc_min_rnr_nak; /* min RNR-NAK timer */ 278 ib_mtu_t rc_path_mtu; 279 ibt_cep_path_t rc_path; /* primary path */ 280 ibt_cep_path_t rc_alt_path; /* alternate path */ 281 } ibt_qp_rc_attr_t; 282 283 /* 284 * Reserved For Future Use. 285 * UC transport specific 286 */ 287 typedef struct ibt_qp_uc_attr_s { 288 uint32_t uc_sq_psn:24; /* SQ PSN */ 289 uint32_t uc_rq_psn:24; /* RQ PSN */ 290 ib_qpn_t uc_dst_qpn; /* destination QPN */ 291 ibt_cep_cmstate_t uc_mig_state; /* Channel Migration State */ 292 ib_mtu_t uc_path_mtu; 293 ibt_cep_path_t uc_path; /* primary path */ 294 ibt_cep_path_t uc_alt_path; /* alternate path */ 295 } ibt_qp_uc_attr_t; 296 297 /* 298 * Reserved For Future Use. 299 * RD transport specific 300 */ 301 typedef struct ibt_qp_rd_attr_s { 302 ib_qkey_t rd_qkey; 303 ibt_rnr_nak_time_t rd_min_rnr_nak; /* min RNR-NAK timer */ 304 } ibt_qp_rd_attr_t; 305 306 /* UD transport specific */ 307 typedef struct ibt_qp_ud_attr_s { 308 ib_qkey_t ud_qkey; /* Q_Key */ 309 uint32_t ud_sq_psn:24; /* SQ PSN */ 310 uint16_t ud_pkey_ix; /* P_Key Index */ 311 uint8_t ud_port; /* port */ 312 ibt_rss_attr_t ud_rss; /* RSS stuff */ 313 ibt_fc_attr_t ud_fc; 314 } ibt_qp_ud_attr_t; 315 316 /* 317 * Common QP Info 318 */ 319 typedef struct ibt_qp_info_s { 320 uint_t qp_sq_sz; /* SQ WQEs */ 321 uint_t qp_rq_sz; /* RQ WQEs */ 322 ibt_cep_state_t qp_state; /* QP state */ 323 ibt_cep_state_t qp_current_state; /* current state for */ 324 /* modify_qp to RTS state */ 325 ibt_cep_flags_t qp_flags; /* QP flags */ 326 ibt_tran_srv_t qp_trans; /* transport service type */ 327 union { /* transport specific */ 328 ibt_qp_rc_attr_t rc; 329 ibt_qp_rd_attr_t rd; /* Reserved For Future Use */ 330 ibt_qp_uc_attr_t uc; /* Reserved For Future Use */ 331 ibt_qp_ud_attr_t ud; 332 } qp_transport; 333 } ibt_qp_info_t; 334 335 /* 336 * QP Query Attributes definition. 337 */ 338 typedef struct ibt_qp_query_attr_s { 339 ibt_cq_hdl_t qp_sq_cq; /* SQ CQ */ 340 ibt_cq_hdl_t qp_rq_cq; /* RQ CQ */ 341 ibt_rdd_hdl_t qp_rdd_hdl; /* Reserved */ 342 ib_qpn_t qp_qpn; /* QPN */ 343 uint_t qp_sq_sgl; /* max SQ SGL */ 344 uint_t qp_rq_sgl; /* max RQ SGL */ 345 ibt_qp_info_t qp_info; /* Modifiable attributes */ 346 ibt_srq_hdl_t qp_srq; /* SRQ hdl or NULL */ 347 ibt_attr_flags_t qp_flags; 348 ibt_fexch_query_attr_t qp_query_fexch; /* FEXCH query only set */ 349 } ibt_qp_query_attr_t; 350 351 352 /* 353 * Reserved For Future Use. 354 * EEC Info. 355 */ 356 typedef struct ibt_eec_info_s { 357 uint32_t eec_sq_psn:24; /* SQ PSN */ 358 uint32_t eec_rq_psn:24; /* RQ PSN */ 359 ib_eecn_t eec_dst_eecn; /* destination EECN */ 360 ibt_cep_state_t eec_state; /* EEC state */ 361 ibt_cep_cmstate_t eec_mig; /* channel migration state */ 362 uint8_t eec_rdma_ra_out; /* RDMA-R/Atomics out */ 363 uint8_t eec_rdma_ra_in; /* RDMA-R/Atomics in */ 364 uint8_t eec_retry_cnt:3; 365 ibt_rnr_retry_cnt_t eec_rnr_retry_cnt; 366 ib_mtu_t eec_path_mtu; 367 ibt_cep_path_t eec_prim_path; /* primary path */ 368 ibt_cep_path_t eec_alt_path; /* alternate path */ 369 } ibt_eec_info_t; 370 371 /* 372 * Reserved For Future Use. 373 * EEC Query Attributes definition. 374 */ 375 typedef struct ibt_eec_query_attr_s { 376 ib_eecn_t eec_eecn; /* The EEC Number */ 377 ibt_rdd_hdl_t eec_rdd_hdl; 378 ibt_eec_info_t eec_info; /* Modifiable attributes */ 379 } ibt_eec_query_attr_t; 380 381 382 #define ibt_ah_flags_t ibt_ud_dest_flags_t 383 #define IBT_AH_NO_FLAGS IBT_UD_DEST_NO_FLAGS 384 #define IBT_AH_USER_MAP IBT_UD_DEST_USER_MAP 385 #define IBT_AH_DEFER_ALLOC IBT_UD_DEST_DEFER_ALLOC 386 387 388 /* 389 * ibt_hca_attr_t 390 */ 391 #define hca_max_rdd hca_opaque2 /* Max RDDs in HCA */ 392 #define hca_max_eec hca_opaque3 /* Max EEContexts in HCA */ 393 #define hca_max_rd_sgl hca_opaque4 /* Max SGL entries per RD WR */ 394 #define hca_max_rdma_in_ee hca_opaque5 /* Max RDMA Reads/Atomics in */ 395 /* per EEC with HCA as target */ 396 #define hca_max_rdma_out_ee hca_opaque6 /* Max RDMA Reads/Atomics out */ 397 /* per EE by this HCA */ 398 #define hca_max_ipv6_qp hca_max_ipv6_chan 399 #define hca_max_ether_qp hca_max_ether_chan 400 #define hca_eec_max_ci_priv_sz hca_opaque7 401 #define hca_rdd_max_ci_priv_sz hca_opaque8 402 #define hca_max_map_per_fmr hca_opaque9 403 404 #ifdef __cplusplus 405 } 406 #endif 407 408 #endif /* _SYS_IB_IBTL_IBTL_CI_TYPES_H */ 409