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_IBTI_COMMON_H 27 #define _SYS_IB_IBTL_IBTI_COMMON_H 28 29 /* 30 * ibti_common.h 31 * 32 * This file contains the shared/common transport data types and function 33 * prototypes. 34 */ 35 #include <sys/ib/ibtl/ibtl_types.h> 36 #include <sys/ib/ibtl/ibti_cm.h> 37 #include <sys/isa_defs.h> 38 #include <sys/byteorder.h> 39 40 #ifdef __cplusplus 41 extern "C" { 42 #endif 43 44 /* 45 * Max number of paths that can be requested in an ibt_get_paths() call, 46 * if IBT_PATH_PERF or IBT_PATH_AVAIL flag (ibt_path_flags_t) is set. 47 */ 48 #define IBT_MAX_SPECIAL_PATHS 2 49 50 /* 51 * The name of DDI Event, generated when the properties of IOC device 52 * node properties were modified. 53 */ 54 #define IB_PROP_UPDATE_EVENT "SUNW,IB:IB_PROP_UPDATE" 55 56 57 /* Transport Interface version */ 58 typedef enum ibt_version_e { 59 IBTI_V1 = 1, 60 IBTI_V2 = 2, /* FMR Support */ 61 IBTI_V3 = 3, 62 IBTI_V_CURR = IBTI_V3 63 } ibt_version_t; 64 65 /* 66 * Driver class type. Identifies a type of client driver so that 67 * "IBTF Policy" decisions can be made on a driver class basis. 68 * The last class should always be IBT_CLNT_NUM, and any new classes added 69 * must be defined before IBT_CLNT_NUM. The class values must be above 0. 70 * Any class values below or equal to 0 shall be invalid 71 */ 72 typedef enum ibt_clnt_class_e { 73 IBT_STORAGE_DEV = 0x1, /* SCSI, FC, etc.. */ 74 IBT_NETWORK_DEV, /* Network driver with associated client H/W */ 75 IBT_GENERIC_DEV, /* Generic client H/W device driver */ 76 IBT_NETWORK, /* Network driver with no associated */ 77 /* client H/W, e.g., IPoIB */ 78 IBT_GENERIC, /* A generic IB driver not */ 79 /* associated with client H/W */ 80 IBT_USER, /* A user application IBT interface driver */ 81 IBT_IBMA, /* The IBMA Module */ 82 IBT_CM, /* The CM Module */ 83 IBT_DM, /* The DM Module */ 84 IBT_DM_AGENT, /* DM Agent Module */ 85 IBT_GENERIC_MISC, /* Generic Misc Module */ 86 IBT_CLASS_NUM /* Place holder for class count */ 87 } ibt_clnt_class_t; 88 89 #define IBT_TEST_DEV 999 /* Place holder for modules that test IBTL */ 90 91 #define IBT_CLNT_DEVICE_CLASS(class) ((class) == IBT_STORAGE_DEV || \ 92 (class) == IBT_NETWORK_DEV || \ 93 (class) == IBT_GENERIC_DEV) 94 95 #define IBT_CLNT_GENERAL_CLASS(class) ((class) == IBT_NETWORK || \ 96 (class) == IBT_GENERIC || \ 97 (class) == IBT_DM_AGENT || \ 98 (class) == IBT_TEST_DEV || \ 99 (class) == IBT_GENERIC_MISC || \ 100 (class) == IBT_USER) 101 102 #define IBT_CLNT_MGMT_CLASS(class) ((class) == IBT_IBMA || \ 103 (class) == IBT_CM || \ 104 (class) == IBT_DM) 105 106 /* 107 * These are some special client classes which don't have a 'dip' hence have 108 * to be handled specially in ibt_attach, where we bypass the check for a valid 109 * dip if the client belongs to the class below. 110 */ 111 #define IBT_MISCMOD_CLIENTS(class) ((class) == IBT_IBMA || \ 112 (class) == IBT_CM || \ 113 (class) == IBT_DM || \ 114 (class) == IBT_DM_AGENT || \ 115 (class) == IBT_GENERIC_MISC || \ 116 (class) == IBT_TEST_DEV) 117 118 /* 119 * Event record & status returns for asynchronous events and errors. 120 */ 121 typedef struct ibt_async_event_s { 122 uint64_t ev_fma_ena; /* FMA Error data */ 123 ibt_channel_hdl_t ev_chan_hdl; /* Channel handle */ 124 ibt_cq_hdl_t ev_cq_hdl; /* CQ handle */ 125 ib_guid_t ev_hca_guid; /* HCA node GUID */ 126 ibt_srq_hdl_t ev_srq_hdl; /* SRQ handle */ 127 ibt_port_change_t ev_port_flags; /* Port Change flags */ 128 uint8_t ev_port; /* HCA port */ 129 } ibt_async_event_t; 130 131 /* 132 * IBT Client Callback function typedefs. 133 * 134 * ibt_async_handler_t 135 * Pointer to an async event/error handler function. This function is 136 * called when an async event/error is detected on a HCA that is being 137 * used by the IBT client driver that registered the function. 138 */ 139 typedef void (*ibt_async_handler_t)(void *clnt_private, 140 ibt_hca_hdl_t hca_hdl, ibt_async_code_t code, ibt_async_event_t *event); 141 142 /* 143 * IBT Client Memory Error Callback function typedefs. 144 * 145 * ibt_memory_handler_t 146 * Pointer to an memory event/error handler function. 147 */ 148 typedef void (*ibt_memory_handler_t)(void *clnt_private, 149 ibt_hca_hdl_t hca_hdl, ibt_mem_code_t code, ibt_mem_data_t *data); 150 151 /* 152 * Define a client module information structure. All clients MUST 153 * define a global of type ibt_clnt_modinfo_t. A pointer to this global 154 * is passed into the IBTF by a client when calling ibt_attach(). 155 * This struct must persist during the life of the client. 156 * 157 * The client's mi_async_handler is called when an async event/error is 158 * detected on a HCA that is being used by this client. 159 */ 160 typedef struct ibt_clnt_modinfo_s { 161 ibt_version_t mi_ibt_version; /* TI version */ 162 ibt_clnt_class_t mi_clnt_class; /* Type of client */ 163 ibt_async_handler_t mi_async_handler; /* Async Handler */ 164 ibt_memory_handler_t mi_reserved; /* Memory handler */ 165 char *mi_clnt_name; /* Client Name. */ 166 } ibt_clnt_modinfo_t; 167 168 169 /* 170 * Definitions for use with ibt_register_subnet_notices() 171 */ 172 typedef enum ibt_subnet_event_code_e { 173 IBT_SM_EVENT_MCG_CREATED = 1, 174 IBT_SM_EVENT_MCG_DELETED = 2, 175 IBT_SM_EVENT_AVAILABLE = 3, 176 IBT_SM_EVENT_UNAVAILABLE = 4, 177 IBT_SM_EVENT_GID_AVAIL = 5, 178 IBT_SM_EVENT_GID_UNAVAIL = 6 179 } ibt_subnet_event_code_t; 180 181 typedef struct ibt_subnet_event_s { 182 ib_gid_t sm_notice_gid; 183 } ibt_subnet_event_t; 184 185 typedef void (*ibt_sm_notice_handler_t)(void *private, ib_gid_t gid, 186 ibt_subnet_event_code_t code, ibt_subnet_event_t *event); 187 188 189 /* 190 * MTU Request type. 191 */ 192 typedef struct ibt_mtu_req_s { 193 ib_mtu_t r_mtu; /* Requested MTU */ 194 ibt_selector_t r_selector; /* Qualifier for r_mtu */ 195 } ibt_mtu_req_t; 196 197 198 /* 199 * Qflags, used by ibt_resize_queues(). 200 */ 201 typedef enum ibt_qflags_e { 202 IBT_SEND_Q = 1 << 0, /* Op applies to the Send Q */ 203 IBT_RECV_Q = 1 << 1 /* Op applies to the Recv Q */ 204 } ibt_qflags_t; 205 206 /* 207 * CQ priorities 208 * The IBTF will attempt to implement a coarse 3 level priority scheme 209 * (IBT_CQ_LOW, IBT_CQ_MEDIUM, IBT_CQ_HIGH) based on the class of client 210 * driver. The requested priority is not guaranteed. If a CI implementation 211 * has the ability to implement priority CQs, then the IBTF will take advantage 212 * of that when calling the CI to create a CQ by passing a priority indicator 213 * to the CI. 214 */ 215 typedef enum ibt_cq_priority_e { 216 IBT_CQ_DEFAULT = 0x0, 217 IBT_CQ_LOW = 0x1, 218 IBT_CQ_MEDIUM = 0x2, 219 IBT_CQ_HIGH = 0x3, 220 IBT_CQ_OPAQUE_1 = 0x4, 221 IBT_CQ_OPAQUE_2 = 0x5, 222 IBT_CQ_OPAQUE_3 = 0x6, 223 IBT_CQ_OPAQUE_4 = 0x7, 224 IBT_CQ_OPAQUE_5 = 0x8, 225 IBT_CQ_OPAQUE_6 = 0x9, 226 IBT_CQ_OPAQUE_7 = 0xA, 227 IBT_CQ_OPAQUE_8 = 0xB, 228 IBT_CQ_OPAQUE_9 = 0xC, 229 IBT_CQ_OPAQUE_10 = 0xD, 230 IBT_CQ_OPAQUE_11 = 0xE, 231 IBT_CQ_OPAQUE_12 = 0xF, 232 IBT_CQ_OPAQUE_13 = 0x10, 233 IBT_CQ_OPAQUE_14 = 0x11, 234 IBT_CQ_OPAQUE_15 = 0x12, 235 IBT_CQ_OPAQUE_16 = 0x13 236 } ibt_cq_priority_t; 237 238 /* 239 * Attributes when creating a Completion Queue Scheduling Handle. 240 */ 241 typedef struct ibt_cq_sched_attr_s { 242 ibt_cq_sched_flags_t cqs_flags; 243 ibt_cq_priority_t cqs_priority; 244 uint_t cqs_load; 245 ibt_sched_hdl_t cqs_affinity_hdl; 246 } ibt_cq_sched_attr_t; 247 248 249 /* 250 * ibt_cq_handler_t 251 * Pointer to a work request completion handler function. This function 252 * is called when a WR completes on a CQ that is being used by the IBTF 253 * client driver that registered the function. 254 */ 255 typedef void (*ibt_cq_handler_t)(ibt_cq_hdl_t ibt_cq, void *arg); 256 257 /* default CQ handler ID */ 258 #define IBT_CQ_HID_DEFAULT (1) 259 260 /* 261 * Service Data and flags. 262 * (IBTA Spec Release 1.1, Vol-1 Ref: 15.2.5.14.4) 263 * 264 * The ServiceData8.1 (sb_data8[0]) through ServiceData64.2 (sb_data64[1]) 265 * components together constitutes a 64-byte area in which any data may be 266 * placed. It is intended to be a convenient way for a service to provide its 267 * clients with some initial data. 268 * 269 * In addition, this 64-byte area is formally divided into a total of 30 270 * components, 16 8-bit (uint8_t) components, then 8 16-bit (uint16_t) 271 * components, then 6 32-bit (uint32_t) components, then 2 64-bit (uint64_t) 272 * components, thereby assigning ComponentMask bits (ibt_srv_data_flags_t) to 273 * variously-sized segments of the data. All data are in host endian format. 274 * This allows query operations (ibt_get_paths()) to be used which match 275 * parts of the Service Data, making it possible, for example, for 276 * service-specific parts of the ServiceData to serve as a binary-coded 277 * extension to the ServiceName for purposes of lookup. 278 */ 279 typedef enum ibt_srv_data_flags_e { 280 IBT_NO_SDATA = 0, 281 282 IBT_SDATA8_0 = (1 << 0), 283 IBT_SDATA8_1 = (1 << 1), 284 IBT_SDATA8_2 = (1 << 2), 285 IBT_SDATA8_3 = (1 << 3), 286 IBT_SDATA8_4 = (1 << 4), 287 IBT_SDATA8_5 = (1 << 5), 288 IBT_SDATA8_6 = (1 << 6), 289 IBT_SDATA8_7 = (1 << 7), 290 IBT_SDATA8_8 = (1 << 8), 291 IBT_SDATA8_9 = (1 << 9), 292 IBT_SDATA8_10 = (1 << 10), 293 IBT_SDATA8_11 = (1 << 11), 294 IBT_SDATA8_12 = (1 << 12), 295 IBT_SDATA8_13 = (1 << 13), 296 IBT_SDATA8_14 = (1 << 14), 297 IBT_SDATA8_15 = (1 << 15), 298 299 IBT_SDATA16_0 = (1 << 16), 300 IBT_SDATA16_1 = (1 << 17), 301 IBT_SDATA16_2 = (1 << 18), 302 IBT_SDATA16_3 = (1 << 19), 303 IBT_SDATA16_4 = (1 << 20), 304 IBT_SDATA16_5 = (1 << 21), 305 IBT_SDATA16_6 = (1 << 22), 306 IBT_SDATA16_7 = (1 << 23), 307 308 IBT_SDATA32_0 = (1 << 24), 309 IBT_SDATA32_1 = (1 << 25), 310 IBT_SDATA32_2 = (1 << 26), 311 IBT_SDATA32_3 = (1 << 27), 312 313 IBT_SDATA64_0 = (1 << 28), 314 IBT_SDATA64_1 = (1 << 29), 315 316 IBT_SDATA_ALL = 0x3FFFFFFF 317 } ibt_srv_data_flags_t; 318 319 typedef struct ibt_srv_data_s { 320 uint8_t s_data8[16]; /* 8-bit service data fields. */ 321 uint16_t s_data16[8]; /* 16-bit service data fields. */ 322 uint32_t s_data32[4]; /* 32-bit service data fields. */ 323 uint64_t s_data64[2]; /* 64-bit service data fields. */ 324 } ibt_srv_data_t; 325 326 /* 327 * Path flags, used in ibt_get_paths() 328 */ 329 typedef enum ibt_path_flags_e { 330 IBT_PATH_NO_FLAGS = 0, 331 IBT_PATH_APM = 1 << 0, /* APM is desired. */ 332 IBT_PATH_AVAIL = 1 << 2, 333 IBT_PATH_PERF = 1 << 3, 334 IBT_PATH_MULTI_SVC_DEST = 1 << 4, /* Multiple ServiceRecords */ 335 IBT_PATH_HOP = 1 << 5, /* pa_hop is specified. */ 336 IBT_PATH_PKEY = 1 << 6 /* pa_pkey is specified. */ 337 } ibt_path_flags_t; 338 339 /* 340 * Path attributes. 341 * 342 * The ibt_path_attr_t structure is used to specify required attributes in a 343 * path from the requesting (source) node to a specified destination node. 344 * Attributes that are don't care should be set to NULL or '0'. 345 * A destination must be specified, where a destination can be defined as 346 * one of the following: 347 * 348 * o Service Name 349 * o Service ID (SID) 350 * o Array of DGIDs. 351 * o Service Name and Array of DGIDs. 352 */ 353 typedef struct ibt_path_attr_s { 354 ib_gid_t *pa_dgids; /* Array of DGIDs */ 355 ib_gid_t pa_sgid; 356 ib_guid_t pa_hca_guid; 357 char *pa_sname; /* ASCII Service name */ 358 /* NULL Terminated */ 359 ib_svc_id_t pa_sid; /* Service ID */ 360 ibt_srv_data_flags_t pa_sd_flags; /* Service Data flags. */ 361 ibt_srv_data_t pa_sdata; /* Service Data */ 362 uint8_t pa_hca_port_num; 363 uint8_t pa_num_dgids; /* size of pa_dgids array */ 364 uint8_t pa_sl:4; 365 ibt_mtu_req_t pa_mtu; 366 ibt_srate_req_t pa_srate; 367 ibt_pkt_lt_req_t pa_pkt_lt; /* Packet Life Time Request */ 368 uint_t pa_flow:20; 369 uint8_t pa_hop; /* IBT_PATH_HOP */ 370 uint8_t pa_tclass; 371 ib_pkey_t pa_pkey; /* IBT_PATH_PKEY */ 372 } ibt_path_attr_t; 373 374 /* 375 * Path Information. 376 * 377 * The ibt_get_paths() performs SA Path record lookups to select a path(s) to 378 * a given destination(s), details of selected path(s) are returned in this 379 * structure. 380 * 381 * The ibt_path_info_t contains all the attributes of the best path(s), as 382 * as determined by IBTL, to the specified destination(s), including the 383 * local HCA and HCA port to use to access the fabric. 384 * 385 * The Service ID (pi_sid) and Service Data (pi_sdata) are returned only for 386 * lookups based on Service ID or/and Service Name. 387 */ 388 typedef struct ibt_path_info_s { 389 ib_guid_t pi_hca_guid; /* Local HCA GUID; 0 implies */ 390 /* this record is invalid */ 391 ib_svc_id_t pi_sid; /* Service ID */ 392 ibt_srv_data_t pi_sdata; /* Service Data */ 393 394 ibt_cep_path_t pi_prim_cep_path; /* Contains CEP adds info */ 395 ibt_cep_path_t pi_alt_cep_path; /* RC & UC Only, valid if */ 396 /* cep_hca_port_num is not */ 397 /* '0' */ 398 ib_mtu_t pi_path_mtu; /* Common path MTU */ 399 ib_time_t pi_prim_pkt_lt; 400 ib_time_t pi_alt_pkt_lt; 401 } ibt_path_info_t; 402 403 /* 404 * Optional Alternate Path attributes. 405 * 406 * The ibt_alt_path_attr_t structure is used to specify additional optional 407 * attributes when requesting an alternate path for an existing channel. 408 * 409 * Attributes that are don't care should be set to NULL or '0'. 410 */ 411 typedef struct ibt_alt_path_attr_s { 412 ib_gid_t apa_sgid; 413 ib_gid_t apa_dgid; 414 ibt_srate_req_t apa_srate; 415 ibt_pkt_lt_req_t apa_pkt_lt; /* Packet Life Time Request */ 416 uint_t apa_flow:20; 417 uint8_t apa_sl:4; 418 uint8_t apa_hop; 419 uint8_t apa_tclass; 420 } ibt_alt_path_attr_t; 421 422 /* 423 * Path Information for Alternate Path - input to ibt_set_alt_path(). 424 */ 425 typedef struct ibt_alt_path_info_s { 426 ibt_cep_path_t ap_alt_cep_path; /* RC & UC Only, valid if */ 427 /* cep_hca_port_num is not */ 428 /* '0' */ 429 ib_time_t ap_alt_pkt_lt; 430 } ibt_alt_path_info_t; 431 432 /* 433 * Open Channel flags, Used in ibt_open_rc_channel call 434 */ 435 typedef enum ibt_chan_open_flags_e { 436 IBT_OCHAN_NO_FLAGS = 0, 437 IBT_OCHAN_REDIRECTED = 1 << 0, 438 IBT_OCHAN_PORT_REDIRECTED = 1 << 1, 439 IBT_OCHAN_DUP = 1 << 2, 440 IBT_OCHAN_PORT_FIXED = 1 << 3, 441 IBT_OCHAN_OPAQUE1 = 1 << 4, 442 IBT_OCHAN_OPAQUE2 = 1 << 5, 443 IBT_OCHAN_OPAQUE3 = 1 << 6, 444 IBT_OCHAN_OPAQUE4 = 1 << 7, 445 IBT_OCHAN_OPAQUE5 = 1 << 8, 446 IBT_OCHAN_OPAQUE6 = 1 << 9 447 } ibt_chan_open_flags_t; 448 449 /* 450 * Arguments for ibt_open_rc_channel(). 451 * 452 * oc_priv_data should be NULL or point to a buffer allocated by the caller, 453 * the size of which should be in oc_priv_data_len, where oc_priv_data_len <= 454 * IBT_REQ_PRIV_DATA_SZ. 455 * 456 * When ibt_open_rc_channel returns with ibt_cm_reason_t of 457 * IBT_CM_REDIRECT_PORT, the client can re-issue ibt_open_rc_channel setting 458 * new fields as follows: 459 * 460 * Set (ibt_chan_args_t)->oc_cm_cep_path = 461 * original (ibt_chan_open_args_t)->oc_path->pi_prim_cep_path. 462 * Set (ibt_chan_args_t)->oc_cm_pkt_lt = 463 * original (ibt_chan_open_args_t)->oc_prim_pkt_lt. 464 * Update (ibt_chan_args_t)->oc_path based on path information returned 465 * from ibt_get_paths using the gid in the return data below: 466 * (ibt_rc_returns_t)->rc_arej_info.ari_redirect_info.ari_gid. 467 * Set flags to IBT_OCHAN_PORT_REDIRECTED. 468 * 469 * Note : oc_cm_path is not used for any other scenario, and must be set for 470 * IBT_OCHAN_PORT_REDIRECTED. 471 * 472 * When ibt_open_rc_channel returns with ibt_cm_reason_t of 473 * IBT_CM_REDIRECT_CM, the client can re-issue ibt_open_rc_channel setting 474 * new fields as follows: 475 * 476 * Update (ibt_chan_args_t)->oc_path based on path information returned 477 * from ibt_get_paths using the return data in 478 * (ibt_rc_returns_t)->rc_arej_info.ari_redirect_info. 479 * 480 * Set (ibt_chan_args_t)->oc_cm_redirect_info = 481 * Returned (ibt_rc_returns_t)->rc_arej_info.ari_redirect_info. 482 * Set flags to IBT_OCHAN_REDIRECTED. 483 * 484 * Note: 485 * 486 * IBT_OCHAN_PORT_REDIRECTED flag cannot be used to specify a remote CM MAD 487 * address, that is on a different subnet than the RC connection itself. 488 * 489 * Not specified attributes should be set to "NULL" or "0". 490 */ 491 typedef struct ibt_chan_open_args_s { 492 ibt_path_info_t *oc_path; /* Primary & Alternate */ 493 ibt_cm_handler_t oc_cm_handler; /* cm_handler - required */ 494 void *oc_cm_clnt_private; /* First argument to */ 495 /* cm_handler */ 496 ibt_rnr_retry_cnt_t oc_path_rnr_retry_cnt; 497 uint8_t oc_path_retry_cnt:3; 498 uint8_t oc_rdma_ra_out; 499 uint8_t oc_rdma_ra_in; 500 ibt_priv_data_len_t oc_priv_data_len; /* Number of bytes of */ 501 /* REQ Private data */ 502 void *oc_priv_data; /* REQ private data */ 503 ibt_channel_hdl_t oc_dup_channel; /* IBT_OCHAN_DUP */ 504 ibt_redirect_info_t *oc_cm_redirect_info; /* Redirect params */ 505 /* for port and CM */ 506 /* redirection */ 507 ibt_cep_path_t *oc_cm_cep_path; /* Optional Path for */ 508 /* CM MADs on */ 509 /* port redirection */ 510 ib_time_t oc_cm_pkt_lt; /* Pkt life time for */ 511 /* CM MADs */ 512 uint32_t oc_opaque1:4; 513 uint32_t oc_opaque2:24; 514 uint32_t oc_opaque3; 515 uint32_t oc_opaque4; 516 } ibt_chan_open_args_t; 517 518 519 /* 520 * Define an optional RC return arguments structure. This contains return 521 * parameters from ibt_open_rc_channel() when called in BLOCKING mode. 522 * 523 * rc_priv_data should be NULL or point to a buffer allocated by the caller, 524 * the size of which should be in rc_priv_data_len, where rc_priv_data_len <= 525 * IBT_REP_PRIV_DATA_SZ. 526 */ 527 typedef struct ibt_rc_returns_s { 528 uint8_t rc_rdma_ra_in; /* Arbitrated resp resources */ 529 uint8_t rc_rdma_ra_out; /* Arbitrated initiator depth */ 530 ibt_arej_info_t rc_arej_info; 531 ibt_cm_reason_t rc_status; 532 uint8_t rc_failover_status; /* Failover status */ 533 ibt_priv_data_len_t rc_priv_data_len; 534 void *rc_priv_data; 535 } ibt_rc_returns_t; 536 537 /* 538 * Define a callback function that can be used in Non-Blocking calls to 539 * ibt_recycle_rc(). 540 */ 541 542 typedef void (*ibt_recycle_handler_t)(ibt_status_t ibt_status, void *arg); 543 544 /* 545 * Define an optional return arguments structure from ibt_set_alt_path() 546 * This contains return parameters, when called in BLOCKING mode. 547 * 548 * ap_priv_data should be NULL or point to a buffer allocated by the caller, 549 * the size of which should be in ap_priv_data_len, where ap_priv_data_len <= 550 * IBT_APR_PRIV_DATA_SZ. 551 * The private data from APR is returned in ap_priv_data. 552 * The caller specifies amount of APR private data to be returned in 553 * ap_priv_data_len. 554 */ 555 typedef struct ibt_ap_returns_s { 556 ibt_ap_status_t ap_status; 557 boolean_t ap_arej_info_valid; 558 ibt_arej_info_t ap_arej_info; /* Only valid if redirect */ 559 ibt_priv_data_len_t ap_priv_data_len; 560 void *ap_priv_data; 561 } ibt_ap_returns_t; 562 563 /* 564 * UD remote destination attributes. 565 * 566 * ud_sid, ud_addr, ud_pkt_lt and ud_pkey_ix must be specified. 567 * These values can be as returned in an ibt_path_info_t struct from an 568 * ibt_get_paths() call. 569 * 570 * ud_priv_data should be NULL or point to a buffer allocated by the caller, 571 * the size of which is in ud_priv_data_len, where ud_priv_data_len <= 572 * IBT_SIDR_REQ_PRIV_DATA_SZ. 573 */ 574 typedef struct ibt_ud_dest_attr_s { 575 ib_svc_id_t ud_sid; /* Service ID */ 576 ibt_adds_vect_t *ud_addr; /* Address Info */ 577 uint16_t ud_pkey_ix; /* Pkey Index */ 578 ib_time_t ud_pkt_lt; 579 ibt_cm_ud_handler_t ud_cm_handler; /* An optional CM UD event */ 580 /* which must be NULL */ 581 /* if not specified. */ 582 void *ud_cm_private; /* First arg to ud_cm_handler */ 583 ibt_priv_data_len_t ud_priv_data_len; 584 void *ud_priv_data; /* SIDR REQ private data */ 585 } ibt_ud_dest_attr_t; 586 587 /* 588 * Define an optional UD return arguments structure. 589 * 590 * ud_priv_data should be NULL or point to a buffer allocated by the caller, 591 * the size of which should be in ud_priv_data_len, where ud_priv_data_len <= 592 * IBT_SIDR_REP_PRIV_DATA_SZ. 593 */ 594 typedef struct ibt_ud_returns_s { 595 ibt_sidr_status_t ud_status; 596 ibt_redirect_info_t ud_redirect; 597 ib_qpn_t ud_dqpn; /* Returned destination QPN */ 598 ib_qkey_t ud_qkey; /* Q_Key for destination QPN */ 599 ibt_priv_data_len_t ud_priv_data_len; 600 void *ud_priv_data; 601 } ibt_ud_returns_t; 602 603 /* 604 * Multicast group attributes 605 * Not specified attributes should be set to "NULL" or "0". 606 * Used by ibt_join_mcg()/ibt_query_mcg(). 607 * 608 * mc_qkey, mc_pkey, mc_flow, mc_tclass, mc_sl, mc_join_state are required for 609 * create - ibt_join_mcg(). 610 */ 611 typedef struct ibt_mcg_attr_s { 612 ib_gid_t mc_mgid; /* MGID */ 613 ib_gid_t mc_pgid; /* SGID of the end port being */ 614 /* added to the MCG. */ 615 ib_qkey_t mc_qkey; /* Q_Key */ 616 ib_pkey_t mc_pkey; /* Partition key for this MCG */ 617 ibt_mtu_req_t mc_mtu_req; /* MTU */ 618 ibt_srate_req_t mc_rate_req; /* Static rate */ 619 ibt_pkt_lt_req_t mc_pkt_lt_req; /* Packet Life Time Request */ 620 uint_t mc_flow:20; /* FlowLabel. */ 621 uint8_t mc_hop; /* HopLimit */ 622 uint8_t mc_tclass; /* Traffic Class. */ 623 uint8_t mc_sl:4; /* Service Level */ 624 uint8_t mc_scope:4, /* Multicast Address Scope */ 625 mc_join_state:4; /* FULL For create */ 626 ib_lid_t mc_opaque1; 627 } ibt_mcg_attr_t; 628 629 /* 630 * Multicast group attributes. 631 * returned by ibt_join_mcg()/ibt_query_mcg(). 632 */ 633 typedef struct ibt_mcg_info_s { 634 ibt_adds_vect_t mc_adds_vect; /* Address information */ 635 ib_mtu_t mc_mtu; /* MTU */ 636 ib_qkey_t mc_qkey; /* Q_Key */ 637 uint16_t mc_pkey_ix; /* Pkey Index */ 638 uint8_t mc_scope:4; /* Multicast Address Scope */ 639 clock_t mc_opaque2; 640 } ibt_mcg_info_t; 641 642 /* 643 * Define a callback function that can be used in Non-Blocking calls to 644 * ibt_join_mcg(). 645 */ 646 typedef void (*ibt_mcg_handler_t)(void *arg, ibt_status_t retval, 647 ibt_mcg_info_t *mcg_info_p); 648 649 650 /* 651 * Service Flags - sd_flags 652 * 653 * IBT_SRV_PEER_TYPE_SID Peer-to-peer Service IDs. 654 */ 655 656 typedef enum ibt_service_flags_e { 657 IBT_SRV_NO_FLAGS = 0x0, 658 IBT_SRV_PEER_TYPE_SID = 0x1 659 } ibt_service_flags_t; 660 661 /* 662 * Define a Service ID Registration structure. 663 */ 664 typedef struct ibt_srv_desc_s { 665 ibt_cm_ud_handler_t sd_ud_handler; /* UD Service Handler */ 666 ibt_cm_handler_t sd_handler; /* Non-UD Service Handler */ 667 ibt_service_flags_t sd_flags; /* Flags */ 668 } ibt_srv_desc_t; 669 670 /* 671 * Flag to indicate ibt_bind_service() to or NOT-to clean-up Stale matching 672 * Local Service Records with SA prior to binding the new request. 673 */ 674 #define IBT_SBIND_NO_FLAGS 0 675 #define IBT_SBIND_NO_CLEANUP 1 676 677 /* 678 * Define a Service ID Binding structure (data for service records). 679 */ 680 typedef struct ibt_srv_bind_s { 681 uint64_t sb_key[2]; /* Service Key */ 682 char *sb_name; /* Service Name (up to 63 chars) */ 683 uint32_t sb_lease; /* Service Lease period (in seconds) */ 684 ib_pkey_t sb_pkey; /* Service P_Key */ 685 ibt_srv_data_t sb_data; /* Service Data */ 686 uint_t sb_flag; /* indicates to/not-to clean-up stale */ 687 /* matching local service records. */ 688 } ibt_srv_bind_t; 689 690 /* 691 * ibt_cm_delay() flags. 692 * 693 * Refer to InfiniBand Architecture Release Volume 1 Rev 1.0a: 694 * Section 12.6.6 MRA 695 */ 696 typedef enum ibt_cmdelay_flags_e { 697 IBT_CM_DELAY_REQ = 0, 698 IBT_CM_DELAY_REP = 1, 699 IBT_CM_DELAY_LAP = 2 700 } ibt_cmdelay_flags_t; 701 702 /* 703 * The payload for DDI events passed on IB_PROP_UPDATE_EVENT. 704 * This is passed as the bus nexus data to event_handler(9e). 705 */ 706 typedef struct ibt_prop_update_payload_s { 707 union { 708 struct { 709 uint32_t srv_updated:1; 710 uint32_t gid_updated:1; 711 } _ib_prop_update_struct; 712 uint32_t prop_updated; 713 } _ib_prop_update_union; 714 ibt_status_t ib_reprobe_status; 715 716 #define ib_srv_prop_updated \ 717 _ib_prop_update_union._ib_prop_update_struct.srv_updated 718 #define ib_gid_prop_updated \ 719 _ib_prop_update_union._ib_prop_update_struct.gid_updated 720 #define ib_prop_updated \ 721 _ib_prop_update_union.prop_updated 722 } ibt_prop_update_payload_t; 723 724 725 /* 726 * FUNCTION PROTOTYPES. 727 */ 728 729 /* 730 * ibt_attach() and ibt_detach(): 731 * These are the calls into IBTF used during client driver attach() and 732 * detach(). 733 * 734 * The IBTF returns an ibt_clnt_hdl_t to the client. This handle is used 735 * to identify this client device in all subsequent calls into the IBTF. 736 * 737 * The ibt_detach() routine is called from a client driver's detach() 738 * routine to deregister itself from the IBTF. 739 */ 740 ibt_status_t ibt_attach(ibt_clnt_modinfo_t *mod_infop, dev_info_t *arg, 741 void *clnt_private, ibt_clnt_hdl_t *ibt_hdl_p); 742 743 ibt_status_t ibt_detach(ibt_clnt_hdl_t ibt_hdl); 744 745 /* 746 * HCA FUNCTIONS 747 */ 748 749 /* 750 * ibt_get_hca_list() 751 * Returns the number of HCAs in a system and their node GUIDS. 752 * 753 * If hca_list_p is not NULL then the memory for the array of GUIDs is 754 * allocated by the IBTF and should be freed by the caller using 755 * ibt_free_hca_list(). If hca_list_p is NULL then no memory is allocated 756 * by ibt_get_hca_list and only the number of HCAs in a system is returned. 757 * 758 * It is assumed that the caller can block in kmem_alloc. 759 * 760 * ibt_free_hca_list() 761 * Free the memory allocated by ibt_get_hca_list(). 762 */ 763 uint_t ibt_get_hca_list(ib_guid_t **hca_list_p); 764 765 void ibt_free_hca_list(ib_guid_t *hca_list, uint_t entries); 766 767 /* 768 * ibt_open_hca() - Open/Close a HCA. HCA can only be opened/closed 769 * ibt_close_hca() once. ibt_open_hca() takes a client's ibt handle 770 * and a GUID and returns a unique IBT client HCA 771 * handle. 772 * 773 * These routines can not be called from interrupt context. 774 */ 775 ibt_status_t ibt_open_hca(ibt_clnt_hdl_t ibt_hdl, ib_guid_t hca_guid, 776 ibt_hca_hdl_t *hca_hdl); 777 778 ibt_status_t ibt_close_hca(ibt_hca_hdl_t hca_hdl); 779 780 781 /* 782 * ibt_query_hca() 783 * ibt_query_hca_byguid() 784 * Returns the static attributes of the specified HCA 785 */ 786 ibt_status_t ibt_query_hca(ibt_hca_hdl_t hca_hdl, ibt_hca_attr_t *hca_attrs); 787 788 ibt_status_t ibt_query_hca_byguid(ib_guid_t hca_guid, 789 ibt_hca_attr_t *hca_attrs); 790 791 792 /* 793 * ibt_query_hca_ports() 794 * ibt_query_hca_ports_byguid() 795 * Returns HCA port/ports attributes for the specified HCA port/ports. 796 * ibt_query_hca_ports() allocates the memory required for the 797 * ibt_hca_portinfo_t struct as well as the memory required for the SGID 798 * and P_Key tables contained within that struct. 799 * 800 * ibt_free_portinfo() 801 * Frees the memory allocated for a specified ibt_hca_portinfo_t struct. 802 */ 803 ibt_status_t ibt_query_hca_ports(ibt_hca_hdl_t hca_hdl, uint8_t port, 804 ibt_hca_portinfo_t **port_info_p, uint_t *ports_p, uint_t *size_p); 805 806 ibt_status_t ibt_query_hca_ports_byguid(ib_guid_t hca_guid, uint8_t port, 807 ibt_hca_portinfo_t **port_info_p, uint_t *ports_p, uint_t *size_p); 808 809 void ibt_free_portinfo(ibt_hca_portinfo_t *port_info, uint_t size); 810 811 /* 812 * ibt_set_hca_private() - Set/get the client private data. 813 * ibt_get_hca_private() 814 */ 815 void ibt_set_hca_private(ibt_hca_hdl_t hca_hdl, void *clnt_private); 816 void *ibt_get_hca_private(ibt_hca_hdl_t hca_hdl); 817 818 /* 819 * ibt_hca_handle_to_guid() 820 * A helper function to retrieve HCA GUID for the specified handle. 821 * Returns HCA GUID on which the specified Channel is allocated. Valid 822 * if it is non-NULL on return. 823 */ 824 ib_guid_t ibt_hca_handle_to_guid(ibt_hca_hdl_t hca); 825 826 /* 827 * ibt_hca_guid_to_handle() 828 * A helper function to retrieve a hca handle from a HCA GUID. 829 */ 830 ibt_status_t ibt_hca_guid_to_handle(ibt_clnt_hdl_t ibt_hdl, ib_guid_t hca_guid, 831 ibt_hca_hdl_t *hca_hdl); 832 833 /* 834 * CONNECTION ESTABLISHMENT/TEAR DOWN FUNCTIONS. 835 */ 836 837 /* 838 * ibt_get_paths 839 * Finds the best path to a specified destination (as determined by the 840 * IBTL) that satisfies the requirements specified in an ibt_path_attr_t 841 * struct. 842 */ 843 ibt_status_t ibt_get_paths(ibt_clnt_hdl_t ibt_hdl, ibt_path_flags_t flags, 844 ibt_path_attr_t *attr, uint8_t max_paths, ibt_path_info_t *paths, 845 uint8_t *num_paths_p); 846 847 848 /* 849 * Callback function that can be used in ibt_aget_paths(), a Non-Blocking 850 * version of ibt_get_paths(). 851 */ 852 typedef void (*ibt_path_handler_t)(void *arg, ibt_status_t retval, 853 ibt_path_info_t *paths, uint8_t num_paths); 854 855 /* 856 * Find path(s) to a given destination or service asynchronously. 857 * ibt_aget_paths() is a Non-Blocking version of ibt_get_paths(). 858 */ 859 ibt_status_t ibt_aget_paths(ibt_clnt_hdl_t ibt_hdl, ibt_path_flags_t flags, 860 ibt_path_attr_t *attr, uint8_t max_paths, ibt_path_handler_t func, 861 void *arg); 862 863 /* 864 * ibt_get_alt_path 865 * Finds the best alternate path to a specified channel (as determined by 866 * the IBTL) that satisfies the requirements specified in an 867 * ibt_alt_path_attr_t struct. The specified channel must have been 868 * previously opened successfully using ibt_open_rc_channel. 869 */ 870 ibt_status_t ibt_get_alt_path(ibt_channel_hdl_t chan, ibt_path_flags_t flags, 871 ibt_alt_path_attr_t *attr, ibt_alt_path_info_t *alt_path); 872 873 /* 874 * ibt_open_rc_channel 875 * ibt_open_rc_channel() opens a previously allocated RC communication 876 * channel. The IBTL initiates the channel establishment protocol. 877 */ 878 ibt_status_t ibt_open_rc_channel(ibt_channel_hdl_t rc_chan, 879 ibt_chan_open_flags_t flags, ibt_execution_mode_t mode, 880 ibt_chan_open_args_t *args, ibt_rc_returns_t *returns); 881 882 /* 883 * ibt_close_rc_channel 884 * Close the specified channel. Outstanding work requests are flushed 885 * so that the client can do the associated clean up. After that, the 886 * client will usually deregister the previously registered memory, 887 * then free the channel by calling ibt_free_rc_channel(). 888 * 889 * This function will reuse CM event Handler provided in 890 * ibt_open_rc_channel(). 891 */ 892 ibt_status_t ibt_close_rc_channel(ibt_channel_hdl_t rc_chan, 893 ibt_execution_mode_t mode, void *priv_data, 894 ibt_priv_data_len_t priv_data_len, uint8_t *ret_status, 895 void *ret_priv_data, ibt_priv_data_len_t *ret_priv_data_len_p); 896 897 /* 898 * ibt_prime_close_rc_channel 899 * 900 * Allocates resources required for a close rc channel operation. 901 * Calling ibt_prime_close_rc_channel() allows a channel to be 902 * subsequently closed in interrupt context. 903 * 904 * A call is first made to ibt_prime_close_rc_channel in non-interrupt 905 * context, followed by ibt_close_rc_channel in non-blocking mode from 906 * interrupt context 907 * 908 * ibt_prime_close_rc_channel() can only be called on a previously opened 909 * channel. 910 */ 911 ibt_status_t ibt_prime_close_rc_channel(ibt_channel_hdl_t rc_chan); 912 913 /* 914 * ibt_recycle_rc 915 * 916 * Recycle a RC channel which has transitioned to Error state. The 917 * ibt_recycle_rc() function transitions the channel from Error 918 * state (IBT_STATE_ERROR) to the state ready for use by 919 * ibt_open_rc_channel. Basically, this function is very similar to 920 * ibt_alloc_rc_channel, but reuses an existing RC channel. 921 * 922 * Clients are allowed to make resource clean up/free calls in the CM handler 923 * 924 * Client(s) must not invoke blocking version (ie., func specified as NULL) of 925 * ibt_recycle_rc from cm callback for IBT_CM_EVENT_CONN_CLOSED 926 * 927 * Clients are strongly advised not to issue blocking calls from func, as this 928 * would block the CM threads, and could delay or block other client connections 929 * and ibtl related API invocations. 930 */ 931 ibt_status_t ibt_recycle_rc(ibt_channel_hdl_t rc_chan, ibt_cep_flags_t control, 932 uint8_t hca_port_num, ibt_recycle_handler_t func, void *arg); 933 934 /* 935 * ibt_recycle_ud 936 * 937 * Recycle a UD channel which has transitioned to Error state. The 938 * ibt_recycle_ud() function transitions the channel from Error 939 * state (IBT_STATE_ERROR) to a usable state (IBT_STATE_RTS). 940 * Basically, this function is very similar to ibt_alloc_ud_channel, 941 * but reuses an existing UD channel. 942 */ 943 ibt_status_t ibt_recycle_ud(ibt_channel_hdl_t ud_chan, uint8_t hca_port_num, 944 uint16_t pkey_ix, ib_qkey_t qkey); 945 946 /* 947 * MODIFY CHANNEL ATTRIBUTE FUNCTIONs. 948 */ 949 950 /* 951 * ibt_pause_sendq 952 * ibt_unpause_sendq 953 * Place the send queue of the specified channel into the send queue 954 * drained state. 955 * Applicable for both RC and UD channels. 956 */ 957 ibt_status_t ibt_pause_sendq(ibt_channel_hdl_t chan, 958 ibt_cep_modify_flags_t modify_flags); 959 960 ibt_status_t ibt_unpause_sendq(ibt_channel_hdl_t chan); 961 962 /* 963 * ibt_resize_queues() 964 * Resize the SendQ/RecvQ sizes of a channel. 965 * 966 * Applicable for both RC and UD channels. 967 */ 968 ibt_status_t ibt_resize_queues(ibt_channel_hdl_t chan, ibt_qflags_t flags, 969 ibt_queue_sizes_t *request_sz, ibt_queue_sizes_t *actual_sz); 970 971 /* 972 * ibt_query_queues() 973 * 974 * Query the SendQ/RecvQ sizes of a channel. 975 * Applicable for both RC and UD channels. 976 */ 977 ibt_status_t ibt_query_queues(ibt_channel_hdl_t chan, 978 ibt_queue_sizes_t *actual_sz); 979 980 /* 981 * ibt_modify_rdma 982 * Enable/disable RDMA operations. 983 * 984 * Applicable for RC channels only. 985 */ 986 ibt_status_t ibt_modify_rdma(ibt_channel_hdl_t rc_chan, 987 ibt_cep_modify_flags_t modify_flags, ibt_cep_flags_t flags); 988 989 990 /* 991 * ibt_set_rdma_resource 992 * Change the number of resources to be used for incoming and outgoing 993 * RDMA reads & Atomics. 994 */ 995 ibt_status_t ibt_set_rdma_resource(ibt_channel_hdl_t rc_chan, 996 ibt_cep_modify_flags_t modify_flags, uint8_t rdma_ra_out, 997 uint8_t rdma_ra_in); 998 999 /* 1000 * ibt_change_port 1001 * Change the primary physical port of an RC channel. (This is done only 1002 * if HCA supports this capability). Can only be called on a paused 1003 * channel. 1004 * Applicable for RC channels only. 1005 */ 1006 ibt_status_t ibt_change_port(ibt_channel_hdl_t rc_chan, uint8_t port_num); 1007 1008 1009 /* 1010 * SERVICE REGISTRATION FUNCTIONS 1011 */ 1012 1013 /* 1014 * ibt_register_service() 1015 * ibt_deregister_service() 1016 * Register/deregister a Service (range of Service IDs) with the IBTF. 1017 * 1018 * ibt_bind_service() 1019 * ibt_unbind_service() 1020 * ibt_unbind_all_services() 1021 * Bind a Service to a given port (GID), and optionally create 1022 * service record(s) with the SA for ibt_get_paths() to find. 1023 */ 1024 ibt_status_t ibt_register_service(ibt_clnt_hdl_t ibt_hdl, 1025 ibt_srv_desc_t *service, ib_svc_id_t sid, int num_sids, 1026 ibt_srv_hdl_t *srv_hdl_p, ib_svc_id_t *ret_sid_p); 1027 1028 ibt_status_t ibt_deregister_service(ibt_clnt_hdl_t ibt_hdl, 1029 ibt_srv_hdl_t srv_hdl); 1030 1031 ibt_status_t ibt_bind_service(ibt_srv_hdl_t srv_hdl, ib_gid_t gid, 1032 ibt_srv_bind_t *srv_bind, void *cm_private, ibt_sbind_hdl_t *sb_hdl_p); 1033 1034 ibt_status_t ibt_unbind_service(ibt_srv_hdl_t srv_hdl, ibt_sbind_hdl_t sb_hdl); 1035 ibt_status_t ibt_unbind_all_services(ibt_srv_hdl_t srv_hdl); 1036 1037 /* 1038 * ibt_cm_delay 1039 * A client CM handler/srv_handler function can call this function to 1040 * extend its response time to a CM event. 1041 * Applicable for RC channels only. 1042 */ 1043 ibt_status_t ibt_cm_delay(ibt_cmdelay_flags_t flags, void *cm_session_id, 1044 clock_t service_time, void *priv_data, ibt_priv_data_len_t priv_data_len); 1045 1046 /* 1047 * ibt_cm_proceed 1048 * 1049 * An IBT client calls ibt_cm_proceed() to proceed with a connection that 1050 * previously deferred by the client returning IBT_CM_DEFER on a CM handler 1051 * callback. CM events that can be deferred and continued with ibt_cm_proceed() 1052 * are REQ_RCV, REP_RCV, LAP_RCV, and DREQ_RCV. 1053 * 1054 * NOTE : 1055 * 1056 * Typically CM completes processing of a client's CM handler return, with 1057 * IBT_CM_DEFER status, before processing of the corresponding ibt_cm_proceed() 1058 * is started. However a race exists where by CM may not have completed the 1059 * client's handler return processing when ibt_cm_proceed() is called by a 1060 * client. In this case ibt_cm_proceed() will block until processing of the 1061 * client's CM handler return is complete. 1062 * 1063 * A client that returns IBT_CM_DEFER from the cm handler must 1064 * subsequently make a call to ibt_cm_proceed(). It is illegal to call 1065 * ibt_cm_proceed() on a channel that has not had the connection 1066 * establishment deferred. 1067 * 1068 * Client cannot call ibt_cm_proceed from the cm handler. 1069 */ 1070 ibt_status_t ibt_cm_proceed(ibt_cm_event_type_t event, void *session_id, 1071 ibt_cm_status_t status, ibt_cm_proceed_reply_t *cm_event_data, 1072 void *priv_data, ibt_priv_data_len_t priv_data_len); 1073 1074 /* 1075 * ibt_cm_ud_proceed 1076 * 1077 * An IBT client calls ibt_cm_ud_proceed() to proceed with an 1078 * IBT_CM_UD_EVENT_SIDR_REQ UD event that was previously deferred by the 1079 * client returning IBT_CM_DEFER on a CM UD handler callback. 1080 * NOTE : 1081 * 1082 * Typically CM completes processing of a client's CM handler return, with 1083 * IBT_CM_DEFER status, before processing of the corresponding 1084 * ibt_cm_ud_proceed() is started. However a race exists where by CM may not 1085 * have completed the client's handler return processing when 1086 * ibt_cm_ud_proceed() is called by a client. In this case ibt_cm_ud_proceed() 1087 * will block until processing of the client's CM handler return is complete. 1088 * 1089 * A client that returns IBT_CM_DEFER from the cm handler must 1090 * subsequently make a call to ibt_cm_ud_proceed(). It is illegal to call 1091 * ibt_cm_ud_proceed() on a channel that has not had the connection 1092 * establishment deferred. 1093 * 1094 * Client cannot call ibt_cm_ud_proceed from the cm handler. 1095 */ 1096 ibt_status_t ibt_cm_ud_proceed(void *session_id, ibt_channel_hdl_t ud_channel, 1097 ibt_cm_status_t status, ibt_redirect_info_t *redirect_infop, 1098 void *priv_data, ibt_priv_data_len_t priv_data_len); 1099 1100 1101 /* 1102 * COMPLETION QUEUES. 1103 * 1104 * ibt_alloc_cq_sched() 1105 * Reserve CQ scheduling class resources 1106 * 1107 * ibt_free_cq_sched() 1108 * Free CQ scheduling class resources 1109 */ 1110 ibt_status_t ibt_alloc_cq_sched(ibt_hca_hdl_t hca_hdl, 1111 ibt_cq_sched_attr_t *attr, ibt_sched_hdl_t *sched_hdl_p); 1112 1113 ibt_status_t ibt_free_cq_sched(ibt_hca_hdl_t hca_hdl, 1114 ibt_sched_hdl_t sched_hdl, uint_t load); 1115 1116 /* 1117 * ibt_alloc_cq() 1118 * Allocate a completion queue. 1119 */ 1120 ibt_status_t ibt_alloc_cq(ibt_hca_hdl_t hca_hdl, ibt_cq_attr_t *cq_attr, 1121 ibt_cq_hdl_t *ibt_cq_p, uint_t *real_size); 1122 1123 /* 1124 * ibt_free_cq() 1125 * Free allocated CQ resources. 1126 */ 1127 ibt_status_t ibt_free_cq(ibt_cq_hdl_t ibt_cq); 1128 1129 1130 /* 1131 * ibt_enable_cq_notify() 1132 * Enable notification requests on the specified CQ. 1133 * Applicable for both RC and UD channels. 1134 * 1135 * Completion notifications are disabled by setting the completion 1136 * handler to NULL by calling ibt_set_cq_handler(). 1137 */ 1138 ibt_status_t ibt_enable_cq_notify(ibt_cq_hdl_t ibt_cq, 1139 ibt_cq_notify_flags_t notify_type); 1140 1141 /* 1142 * ibt_set_cq_handler() 1143 * Register a work request completion handler with the IBTF. 1144 * Applicable for both RC and UD channels. 1145 * 1146 * Completion notifications are disabled by setting the completion 1147 * handler to NULL. When setting the handler to NULL, no additional 1148 * calls to the CQ handler will be initiated. 1149 * 1150 * This function does not otherwise change the state of previous 1151 * calls to ibt_enable_cq_notify(). 1152 */ 1153 void ibt_set_cq_handler(ibt_cq_hdl_t ibt_cq, 1154 ibt_cq_handler_t completion_handler, void *arg); 1155 1156 /* 1157 * ibt_poll_cq() 1158 * Poll the specified CQ for the completion of work requests (WRs). 1159 * If the CQ contains completed WRs, up to num_wc of them are returned. 1160 * Applicable for both RC and UD channels. 1161 */ 1162 ibt_status_t ibt_poll_cq(ibt_cq_hdl_t ibt_cq, ibt_wc_t *work_completions, 1163 uint_t num_wc, uint_t *num_polled); 1164 1165 /* 1166 * ibt_query_cq() 1167 * Return the total number of entries in the CQ. 1168 */ 1169 ibt_status_t ibt_query_cq(ibt_cq_hdl_t ibt_cq, uint_t *entries, 1170 uint_t *count_p, uint_t *usec_p, ibt_cq_handler_id_t *hid_p); 1171 1172 /* 1173 * ibt_resize_cq() 1174 * Change the size of a CQ. 1175 */ 1176 ibt_status_t ibt_resize_cq(ibt_cq_hdl_t ibt_cq, uint_t new_sz, uint_t *real_sz); 1177 1178 /* 1179 * ibt_modify_cq() 1180 * Change the interrupt moderation values of a CQ. 1181 * "count" is number of completions before interrupting. 1182 * "usec" is the number of microseconds before interrupting. 1183 */ 1184 ibt_status_t ibt_modify_cq(ibt_cq_hdl_t ibt_cq, uint_t count, uint_t usec, 1185 ibt_cq_handler_id_t hid); 1186 1187 /* 1188 * ibt_set_cq_private() 1189 * ibt_get_cq_private() 1190 * Set/get the client private data. 1191 */ 1192 void ibt_set_cq_private(ibt_cq_hdl_t ibt_cq, void *clnt_private); 1193 void *ibt_get_cq_private(ibt_cq_hdl_t ibt_cq); 1194 1195 1196 /* 1197 * Memory Management Functions. 1198 * Applicable for both RC and UD channels. 1199 * 1200 * ibt_register_mr() 1201 * Prepares a virtually addressed memory region for use by a HCA. A 1202 * description of the registered memory suitable for use in Work Requests 1203 * (WRs) is returned in the ibt_mr_desc_t parameter. 1204 * 1205 * ibt_register_buf() 1206 * Prepares a memory region described by a buf(9S) struct for use by a 1207 * HCA. A description of the registered memory suitable for use in 1208 * Work Requests (WRs) is returned in the ibt_mr_desc_t parameter. 1209 * 1210 * ibt_query_mr() 1211 * Retrieves information about a specified memory region. 1212 * 1213 * ibt_deregister_mr() 1214 * Remove a memory region from a HCA translation table, and free all 1215 * resources associated with the memory region. 1216 * 1217 * ibt_reregister_mr() 1218 * ibt_reregister_buf() 1219 * Modify the attributes of an existing memory region. 1220 * 1221 * ibt_register_shared_mr() 1222 * Given an existing memory region, a new memory region associated with 1223 * the same physical locations is created. 1224 * 1225 * ibt_sync_mr() 1226 * Sync a memory region for either RDMA reads or RDMA writes 1227 * 1228 * ibt_alloc_mw() 1229 * Allocate a memory window. 1230 * 1231 * ibt_query_mw() 1232 * Retrieves information about a specified memory window. 1233 * 1234 * ibt_free_mw() 1235 * De-allocate the Memory Window. 1236 */ 1237 ibt_status_t ibt_register_mr(ibt_hca_hdl_t hca_hdl, ibt_pd_hdl_t pd, 1238 ibt_mr_attr_t *mem_attr, ibt_mr_hdl_t *mr_hdl_p, ibt_mr_desc_t *mem_desc); 1239 1240 ibt_status_t ibt_register_buf(ibt_hca_hdl_t hca_hdl, ibt_pd_hdl_t pd, 1241 ibt_smr_attr_t *mem_bpattr, struct buf *bp, ibt_mr_hdl_t *mr_hdl_p, 1242 ibt_mr_desc_t *mem_desc); 1243 1244 ibt_status_t ibt_query_mr(ibt_hca_hdl_t hca_hdl, ibt_mr_hdl_t mr_hdl, 1245 ibt_mr_query_attr_t *attr); 1246 1247 ibt_status_t ibt_deregister_mr(ibt_hca_hdl_t hca_hdl, ibt_mr_hdl_t mr_hdl); 1248 1249 ibt_status_t ibt_reregister_mr(ibt_hca_hdl_t hca_hdl, ibt_mr_hdl_t mr_hdl, 1250 ibt_pd_hdl_t pd, ibt_mr_attr_t *mem_attr, ibt_mr_hdl_t *mr_hdl_p, 1251 ibt_mr_desc_t *mem_desc); 1252 1253 ibt_status_t ibt_reregister_buf(ibt_hca_hdl_t hca_hdl, ibt_mr_hdl_t mr_hdl, 1254 ibt_pd_hdl_t pd, ibt_smr_attr_t *mem_bpattr, struct buf *bp, 1255 ibt_mr_hdl_t *mr_hdl_p, ibt_mr_desc_t *mem_desc); 1256 1257 ibt_status_t ibt_register_shared_mr(ibt_hca_hdl_t hca_hdl, ibt_mr_hdl_t mr_hdl, 1258 ibt_pd_hdl_t pd, ibt_smr_attr_t *mem_sattr, ibt_mr_hdl_t *mr_hdl_p, 1259 ibt_mr_desc_t *mem_desc); 1260 1261 ibt_status_t ibt_sync_mr(ibt_hca_hdl_t hca_hdl, ibt_mr_sync_t *mr_segments, 1262 size_t num_segments); 1263 1264 ibt_status_t ibt_alloc_mw(ibt_hca_hdl_t hca_hdl, ibt_pd_hdl_t pd, 1265 ibt_mw_flags_t flags, ibt_mw_hdl_t *mw_hdl_p, ibt_rkey_t *rkey); 1266 1267 ibt_status_t ibt_query_mw(ibt_hca_hdl_t hca_hdl, ibt_mw_hdl_t mw_hdl, 1268 ibt_mw_query_attr_t *mw_attr_p); 1269 1270 ibt_status_t ibt_free_mw(ibt_hca_hdl_t hca_hdl, ibt_mw_hdl_t mw_hdl); 1271 1272 /* 1273 * ibt_alloc_lkey() 1274 * Allocates physical buffer list resources for use in memory 1275 * registrations. 1276 * 1277 * Applicable for both RC and UD channels. 1278 */ 1279 ibt_status_t ibt_alloc_lkey(ibt_hca_hdl_t hca_hdl, ibt_pd_hdl_t pd, 1280 ibt_lkey_flags_t flags, uint_t phys_buf_list_sz, ibt_mr_hdl_t *mr_p, 1281 ibt_pmr_desc_t *mem_desc_p); 1282 1283 1284 /* 1285 * Physical Memory Management Functions. 1286 * Applicable for both RC and UD channels. 1287 * 1288 * ibt_register_phys_mr() 1289 * Prepares a physically addressed memory region for use by a HCA. 1290 * 1291 * ibt_reregister_phys_mr() 1292 * Modify the attributes of an existing memory region. 1293 */ 1294 ibt_status_t ibt_register_phys_mr(ibt_hca_hdl_t hca_hdl, ibt_pd_hdl_t pd, 1295 ibt_pmr_attr_t *mem_pattr, ibt_mr_hdl_t *mr_hdl_p, 1296 ibt_pmr_desc_t *mem_desc_p); 1297 1298 ibt_status_t ibt_reregister_phys_mr(ibt_hca_hdl_t hca_hdl, ibt_mr_hdl_t mr_hdl, 1299 ibt_pd_hdl_t pd, ibt_pmr_attr_t *mem_pattr, ibt_mr_hdl_t *mr_hdl_p, 1300 ibt_pmr_desc_t *mem_desc_p); 1301 1302 1303 /* 1304 * Address Translation. 1305 */ 1306 1307 /* 1308 * ibt_map_mem_area() 1309 * Translate a kernel virtual address range into HCA physical addresses. 1310 * A set of physical addresses, that can be used with "Reserved L_Key", 1311 * register physical, and "Fast Registration Work Request" operations 1312 * is returned. 1313 */ 1314 ibt_status_t ibt_map_mem_area(ibt_hca_hdl_t hca_hdl, ibt_va_attr_t *va_attrs, 1315 uint_t paddr_list_len, ibt_phys_buf_t *paddr_list_p, uint_t *num_paddr_p, 1316 size_t *paddr_bufsz_p, ib_memlen_t *paddr_offset_p, ibt_ma_hdl_t *ma_hdl_p); 1317 1318 /* 1319 * ibt_unmap_mem_area() 1320 * Un pin physical pages pinned during an ibt_map_mem_area() call. 1321 */ 1322 ibt_status_t ibt_unmap_mem_area(ibt_hca_hdl_t hca_hdl, ibt_ma_hdl_t ma_hdl); 1323 1324 /* ibt_map_mem_iov() */ 1325 ibt_status_t ibt_map_mem_iov(ibt_hca_hdl_t hca_hdl, 1326 ibt_iov_attr_t *iov_attr, ibt_all_wr_t *wr, ibt_mi_hdl_t *mi_hdl); 1327 1328 /* ibt_unmap_mem_iov() */ 1329 ibt_status_t ibt_unmap_mem_iov(ibt_hca_hdl_t hca_hdl, ibt_mi_hdl_t mi_hdl); 1330 1331 /* 1332 * Work Request Functions 1333 * Applicable for RC and UD channels. 1334 * 1335 * ibt_post_send() 1336 * Post send work requests to the specified channel. 1337 * 1338 * ibt_post_recv() 1339 * ibt_post_srq() 1340 * Post receive work requests to the specified channel. 1341 */ 1342 ibt_status_t ibt_post_send(ibt_channel_hdl_t chan, ibt_send_wr_t *wr_list, 1343 uint_t num_wr, uint_t *posted); 1344 1345 ibt_status_t ibt_post_recv(ibt_channel_hdl_t chan, ibt_recv_wr_t *wr_list, 1346 uint_t num_wr, uint_t *posted); 1347 1348 ibt_status_t ibt_post_srq(ibt_srq_hdl_t srq, ibt_recv_wr_t *wr_list, 1349 uint_t num_wr, uint_t *posted); 1350 1351 1352 /* 1353 * Alternate Path Migration Functions. 1354 * Applicable for RC channels only. 1355 * 1356 * 1357 * ibt_get_alt_path() 1358 * Finds the best alternate path to a specified channel (as determined by 1359 * the IBTL) that satisfies the requirements specified in an 1360 * ibt_alt_path_attr_t struct. The specified channel must have been 1361 * previously opened successfully using ibt_open_rc_channel. 1362 * This function also ensures that the service being accessed by the 1363 * channel is available at the selected alternate port. 1364 * 1365 * Note: The apa_dgid must be on the same destination channel adapter, 1366 * if specified. 1367 * 1368 * 1369 * ibt_set_alt_path() 1370 * Load the specified alternate path. Causes the CM to send an LAP message 1371 * to the remote node. If successful, the local channel is updated with 1372 * the new alternate path and the channel migration state is set to REARM. 1373 * Can only be called on a previously opened RC channel. The channel must 1374 * be either in RTS or paused state. 1375 * 1376 * 1377 * ibt_migrate_path() 1378 * Force the CI to use the alternate path. The alternate path becomes 1379 * the primary path. A new alternate path should be loaded and enabled. 1380 */ 1381 ibt_status_t ibt_get_alt_path(ibt_channel_hdl_t rc_chan, ibt_path_flags_t flags, 1382 ibt_alt_path_attr_t *attr, ibt_alt_path_info_t *alt_pathp); 1383 1384 ibt_status_t ibt_set_alt_path(ibt_channel_hdl_t rc_chan, 1385 ibt_execution_mode_t mode, ibt_alt_path_info_t *alt_pinfo, void *priv_data, 1386 ibt_priv_data_len_t priv_data_len, ibt_ap_returns_t *ret_args); 1387 1388 ibt_status_t ibt_migrate_path(ibt_channel_hdl_t rc_chan); 1389 1390 1391 /* 1392 * Multicast group Functions. 1393 * Applicable for UD channels only. 1394 */ 1395 1396 /* 1397 * ibt_attach_mcg() 1398 * Attaches a UD channel to the specified multicast group. On successful 1399 * completion, this channel will be provided with a copy of every 1400 * multicast message addressed to the group specified by the MGID 1401 * (mcg_info->mc_adds_vect.av_dgid) and received on the HCA port with 1402 * which the channel is associated. 1403 */ 1404 ibt_status_t ibt_attach_mcg(ibt_channel_hdl_t ud_chan, 1405 ibt_mcg_info_t *mcg_info); 1406 1407 /* 1408 * ibt_detach_mcg() 1409 * Detach the specified UD channel from the specified multicast group. 1410 */ 1411 ibt_status_t ibt_detach_mcg(ibt_channel_hdl_t ud_chan, 1412 ibt_mcg_info_t *mcg_info); 1413 1414 /* 1415 * ibt_join_mcg() 1416 * Join a multicast group. The first full member "join" causes the MCG 1417 * to be created. 1418 */ 1419 ibt_status_t ibt_join_mcg(ib_gid_t rgid, ibt_mcg_attr_t *mcg_attr, 1420 ibt_mcg_info_t *mcg_info_p, ibt_mcg_handler_t func, void *arg); 1421 1422 /* 1423 * ibt_leave_mcg() 1424 * The port associated with the port GID shall be removed from the 1425 * multicast group specified by MGID (mc_gid) or from all the multicast 1426 * groups of which it is a member if the MGID (mc_gid) is not specified 1427 * (i.e. mc_gid.mgid_prefix must have 8-bits of 11111111 at the start of 1428 * the GID to identify this as being a multicast GID). 1429 * 1430 * The last full member to leave causes the destruction of the Multicast 1431 * Group. 1432 */ 1433 ibt_status_t ibt_leave_mcg(ib_gid_t rgid, ib_gid_t mc_gid, ib_gid_t port_gid, 1434 uint8_t mc_join_state); 1435 1436 /* 1437 * ibt_query_mcg() 1438 * Request information on multicast groups that match the parameters 1439 * specified in mcg_attr. Information on each multicast group is returned 1440 * to the caller in the form of an array of ibt_mcg_info_t. 1441 * ibt_query_mcg() allocates the memory for this array and returns a 1442 * pointer to the array (mcgs_p) and the number of entries in the array 1443 * (entries_p). This memory should be freed by the client using 1444 * ibt_free_mcg_info(). 1445 */ 1446 ibt_status_t ibt_query_mcg(ib_gid_t rgid, ibt_mcg_attr_t *mcg_attr, 1447 uint_t mcgs_max_num, ibt_mcg_info_t **mcgs_info_p, uint_t *entries_p); 1448 1449 /* 1450 * ibt_free_mcg_info() 1451 * Free the memory allocated by successful ibt_query_mcg() 1452 */ 1453 void ibt_free_mcg_info(ibt_mcg_info_t *mcgs_info, uint_t entries); 1454 1455 1456 /* 1457 * ibt_register_subnet_notices() 1458 * Register a handler to be called for subnet notifications. 1459 */ 1460 void ibt_register_subnet_notices(ibt_clnt_hdl_t ibt_hdl, 1461 ibt_sm_notice_handler_t sm_notice_handler, void *private); 1462 1463 1464 /* 1465 * Protection Domain Functions. 1466 * 1467 * ibt_alloc_pd() 1468 * ibt_free_pd() 1469 * Allocate/Release a protection domain 1470 */ 1471 ibt_status_t ibt_alloc_pd(ibt_hca_hdl_t hca_hdl, ibt_pd_flags_t flags, 1472 ibt_pd_hdl_t *pd); 1473 ibt_status_t ibt_free_pd(ibt_hca_hdl_t hca_hdl, ibt_pd_hdl_t pd); 1474 1475 /* 1476 * P_Key to P_Key Index conversion Functions. 1477 * 1478 * ibt_pkey2index_byguid 1479 * ibt_pkey2index Convert a P_Key into a P_Key index. 1480 * 1481 * ibt_index2pkey_byguid 1482 * ibt_index2pkey Convert a P_Key Index into a P_Key. 1483 */ 1484 ibt_status_t ibt_pkey2index(ibt_hca_hdl_t hca_hdl, uint8_t port_num, 1485 ib_pkey_t pkey, uint16_t *pkey_ix); 1486 1487 ibt_status_t ibt_index2pkey(ibt_hca_hdl_t hca_hdl, uint8_t port_num, 1488 uint16_t pkey_ix, ib_pkey_t *pkey); 1489 1490 ibt_status_t ibt_pkey2index_byguid(ib_guid_t hca_guid, uint8_t port_num, 1491 ib_pkey_t pkey, uint16_t *pkey_ix); 1492 1493 ibt_status_t ibt_index2pkey_byguid(ib_guid_t hca_guid, uint8_t port_num, 1494 uint16_t pkey_ix, ib_pkey_t *pkey); 1495 1496 /* 1497 * ibt_ci_data_in() 1498 * 1499 * Pass CI specific userland data for CI objects to the CI. 1500 */ 1501 ibt_status_t ibt_ci_data_in(ibt_hca_hdl_t hca, ibt_ci_data_flags_t flags, 1502 ibt_object_type_t object, void *ibt_object_handle, void *data_p, 1503 size_t data_sz); 1504 1505 /* 1506 * ibt_ci_data_out() 1507 * 1508 * Obtain CI specific userland data for CI objects. 1509 */ 1510 ibt_status_t ibt_ci_data_out(ibt_hca_hdl_t hca, ibt_ci_data_flags_t flags, 1511 ibt_object_type_t object, void *ibt_object_handle, void *data_p, 1512 size_t data_sz); 1513 1514 1515 /* 1516 * Node Information. 1517 */ 1518 1519 /* Node type : n_node_type */ 1520 #define IBT_NODE_TYPE_CHANNEL_ADAPTER 1 /* HCA or TCA */ 1521 #define IBT_NODE_TYPE_SWITCH 2 1522 #define IBT_NODE_TYPE_ROUTER 3 1523 1524 typedef struct ibt_node_info_s { 1525 ib_guid_t n_sys_img_guid; /* System Image GUID */ 1526 ib_guid_t n_node_guid; /* Node GUID */ 1527 ib_guid_t n_port_guid; /* Port GUID */ 1528 uint16_t n_dev_id; /* Device ID */ 1529 uint32_t n_revision; /* Device Revision */ 1530 uint32_t n_vendor_id:24; /* Device Vendor ID */ 1531 uint8_t n_num_ports; /* Number of ports on this node. */ 1532 uint8_t n_port_num; /* Port number. */ 1533 uint8_t n_node_type; /* Node type */ 1534 char n_description[64]; /* NULL terminated ASCII string */ 1535 } ibt_node_info_t; 1536 1537 1538 /* 1539 * ibt_gid_to_node_info() 1540 * Retrieve node information for the specified GID. 1541 */ 1542 ibt_status_t ibt_gid_to_node_info(ib_gid_t gid, ibt_node_info_t *node_info_p); 1543 1544 /* 1545 * ibt_reprobe_dev 1546 * Reprobe properties for IOC device node. 1547 */ 1548 ibt_status_t ibt_reprobe_dev(dev_info_t *dip); 1549 1550 /* 1551 * ibt_get_companion_port_gids() 1552 * 1553 * Get list of GID's available on a companion port(s) of the specified 1554 * GID or list of GIDs available on a specified Node GUID/System Image 1555 * GUID. 1556 */ 1557 ibt_status_t ibt_get_companion_port_gids(ib_gid_t gid, ib_guid_t hca_guid, 1558 ib_guid_t sysimg_guid, ib_gid_t **gids_p, uint_t *num_gids_p); 1559 1560 /* 1561 * SHARED RECEIVE QUEUE 1562 */ 1563 1564 1565 /* 1566 * ibt_alloc_srq() 1567 * Allocate a shared receive queue. 1568 */ 1569 ibt_status_t ibt_alloc_srq(ibt_hca_hdl_t hca_hdl, ibt_srq_flags_t flags, 1570 ibt_pd_hdl_t pd, ibt_srq_sizes_t *sizes, ibt_srq_hdl_t *ibt_srq_p, 1571 ibt_srq_sizes_t *real_size_p); 1572 1573 /* 1574 * ibt_free_srq() 1575 * Free allocated SRQ resources. 1576 */ 1577 ibt_status_t ibt_free_srq(ibt_srq_hdl_t ibt_srq); 1578 1579 /* 1580 * ibt_query_srq() 1581 * Query a shared receive queue. 1582 */ 1583 ibt_status_t ibt_query_srq(ibt_srq_hdl_t ibt_srq, ibt_pd_hdl_t *pd_p, 1584 ibt_srq_sizes_t *sizes_p, uint_t *limit_p); 1585 1586 /* 1587 * ibt_modify_srq() 1588 * Modify a shared receive queue. 1589 */ 1590 ibt_status_t ibt_modify_srq(ibt_srq_hdl_t ibt_srq, ibt_srq_modify_flags_t flags, 1591 uint_t size, uint_t limit, uint_t *real_size_p); 1592 1593 /* 1594 * ibt_set_srq_private() 1595 * ibt_get_srq_private() 1596 * Set/get the SRQ client private data. 1597 */ 1598 void ibt_set_srq_private(ibt_srq_hdl_t ibt_srq, void *clnt_private); 1599 void *ibt_get_srq_private(ibt_srq_hdl_t ibt_srq); 1600 1601 /* 1602 * ibt_check_failure() 1603 * Function to test for special case failures 1604 */ 1605 ibt_failure_type_t ibt_check_failure(ibt_status_t status, uint64_t *reserved_p); 1606 1607 1608 /* 1609 * ibt_hw_is_present() returns 0 when there is no IB hardware actively 1610 * running. This is primarily useful for modules like rpcmod which needs a 1611 * quick check to decide whether or not it should try to use InfiniBand. 1612 */ 1613 int ibt_hw_is_present(); 1614 1615 /* 1616 * Fast Memory Registration (FMR). 1617 * 1618 * ibt_create_fmr_pool 1619 * Not fast-path. 1620 * ibt_create_fmr_pool() verifies that the HCA supports FMR and allocates 1621 * and initializes an "FMR pool". This pool contains state specific to 1622 * this registration, including the watermark setting to determine when 1623 * to sync, and the total number of FMR regions available within this pool. 1624 * 1625 * ibt_destroy_fmr_pool 1626 * ibt_destroy_fmr_pool() deallocates all of the FMR regions in a specific 1627 * pool. All state and information regarding the pool are destroyed and 1628 * returned as free space once again. No more use of FMR regions in this 1629 * pool are possible without a subsequent call to ibt_create_fmr_pool(). 1630 * 1631 * ibt_flush_fmr_pool 1632 * ibt_flush_fmr_pool forces a flush to occur. At the client's request, 1633 * any unmapped FMR regions (See 'ibt_deregister_mr())') are returned to 1634 * a free state. This function allows for an asynchronous cleanup of 1635 * formerly used FMR regions. Sync operation is also performed internally 1636 * by HCA driver, when 'watermark' settings for the number of free FMR 1637 * regions left in the "pool" is reached. 1638 * 1639 * ibt_register_physical_fmr 1640 * ibt_register_physical_fmr() assigns a "free" entry from the FMR Pool. 1641 * It first consults the "FMR cache" to see if this is a duplicate memory 1642 * registration to something already in use. If not, then a free entry 1643 * in the "pool" is marked used. 1644 * 1645 * ibt_deregister_fmr 1646 * The ibt_deregister_fmr un-maps the resources reserved from the FMR 1647 * pool by ibt_register_physical_fmr(). The ibt_deregister_fmr() will 1648 * mark the region as free in the FMR Pool. 1649 */ 1650 ibt_status_t ibt_create_fmr_pool(ibt_hca_hdl_t hca_hdl, ibt_pd_hdl_t pd, 1651 ibt_fmr_pool_attr_t *fmr_params, ibt_fmr_pool_hdl_t *fmr_pool_p); 1652 1653 ibt_status_t ibt_destroy_fmr_pool(ibt_hca_hdl_t hca_hdl, 1654 ibt_fmr_pool_hdl_t fmr_pool); 1655 1656 ibt_status_t ibt_flush_fmr_pool(ibt_hca_hdl_t hca_hdl, 1657 ibt_fmr_pool_hdl_t fmr_pool); 1658 1659 ibt_status_t ibt_register_physical_fmr(ibt_hca_hdl_t hca_hdl, 1660 ibt_fmr_pool_hdl_t fmr_pool, ibt_pmr_attr_t *mem_pattr, 1661 ibt_mr_hdl_t *mr_hdl_p, ibt_pmr_desc_t *mem_desc_p); 1662 1663 ibt_status_t ibt_deregister_fmr(ibt_hca_hdl_t hca, ibt_mr_hdl_t mr_hdl); 1664 1665 /* 1666 * IP SUPPORT 1667 */ 1668 1669 /* 1670 * IP get_paths 1671 * Returns an array (or single) of paths and source IP addresses. In the 1672 * simplest form just the destination IP address is specified, and one path 1673 * is requested, then one ibt_path_info_t struct and one source IP. 1674 * 1675 * More than one path can be requested to a single destination, in which case 1676 * the requested number of ibt_path_info_t's are returned, and the same 1677 * number of SRC IP address, with the first SRC IP address corrosponding 1678 * to the first ibt_path_info_t, etc. 1679 * 1680 * Restrictions on the source end point can be specified, in the form of a 1681 * source IP address (this implicitly defines the HCA, HCA port and Pkey) 1682 * HCA, HCA port, and sgid (implicitly defines HCA and HCA port). 1683 * Combinations are allowed but they must be consistent. 1684 * 1685 * Path attributes can also be specified, these can also affect local HCA 1686 * selection. 1687 * 1688 * ibt_get_ip_paths() internally does (among other things): 1689 * 1690 * o ibt_get_list_of_ibd_ipaddr_and_macaddr( OUT list_ipaddr_macaddr) 1691 * 1692 * o extract_pkey_and_sgid(IN list_ipaddr_macaddr, OUT list_pkey_and_sgid) 1693 * 1694 * o map_dst_ip_addr(IN dst_ip_addr, OUT dst_pkey, OUT dgid) - See Note 1695 * 1696 * o filter_by_pkey(IN list_pkey_and_sgid, IN dst_pkey, OUT list_of_sgid) 1697 * 1698 * o do_multipath_query(IN list_of_sgid, IN dst_pkey, IN dgid, OUT path_list) 1699 * 1700 * o pick_a_good_path(IN path_list, OUT the_path) 1701 * 1702 * o find_matching_src_ip(IN the_path, IN list_ipaddr_macaddr, OUT src_ip) 1703 * 1704 * The ibd instance which got the ARP response is only on one P_Key 1705 * knowing the ibd instance (or which IPonIB MCG) got the ARP response 1706 * determins the P_Key associated with a dgid. If the proposedi "ip2mac()" 1707 * API is used to get an IP to GID translations, then returned 'sockaddr_dl' 1708 * contains the interface name and index. 1709 * 1710 * 1711 * Example: 1712 * ip_path_attr.ipa_dst_ip = dst_ip_addr; 1713 * ip_path_attr.ipa_ndst = 1; 1714 * ip_path_attr.ipa_max_paths = 1; 1715 * 1716 * status = ibt_get_ip_paths(clnt_hdl, flags, &ip_path_attr, &paths, 1717 * &num_paths_p, &src_ip); 1718 * 1719 * sid = ibt_get_ip_sid(protocol_num, dst_port); 1720 * path_info->sid = sid; 1721 * 1722 * ip_cm_info.src_addr = src_ip; 1723 * ip_cm_info.dst_addr = dst_ip_addr; 1724 * ip_cm_info.src_port = src_port 1725 * 1726 * ibt_format_ip_private_data(ip_cm_info, priv_data_len, &priv_data); 1727 * ibt_open_rc_channel(chan, private_data); 1728 */ 1729 typedef struct ibt_ip_path_attr_s { 1730 ibt_ip_addr_t *ipa_dst_ip; /* Required */ 1731 ibt_ip_addr_t ipa_src_ip; /* Optional */ 1732 ib_guid_t ipa_hca_guid; /* Optional */ 1733 uint8_t ipa_hca_port_num; /* Optional */ 1734 uint8_t ipa_max_paths; /* Required */ 1735 uint8_t ipa_ndst; /* Required */ 1736 uint8_t ipa_sl:4; /* Optional */ 1737 ibt_mtu_req_t ipa_mtu; /* Optional */ 1738 ibt_srate_req_t ipa_srate; /* Optional */ 1739 ibt_pkt_lt_req_t ipa_pkt_lt; /* Optional */ 1740 uint_t ipa_flow:20; /* Optional */ 1741 uint8_t ipa_hop; /* Optional */ 1742 uint8_t ipa_tclass; /* Optional */ 1743 } ibt_ip_path_attr_t; 1744 1745 /* 1746 * Path SRC IP addresses 1747 */ 1748 typedef struct ibt_path_ip_src_s { 1749 ibt_ip_addr_t ip_primary; 1750 ibt_ip_addr_t ip_alternate; 1751 } ibt_path_ip_src_t; 1752 1753 1754 ibt_status_t ibt_get_ip_paths(ibt_clnt_hdl_t ibt_hdl, ibt_path_flags_t flags, 1755 ibt_ip_path_attr_t *attr, ibt_path_info_t *paths_p, uint8_t *num_paths_p, 1756 ibt_path_ip_src_t *src_ip_p); 1757 1758 ibt_status_t ibt_get_src_ip(ib_gid_t gid, ib_pkey_t pkey, 1759 ibt_ip_addr_t *src_ip); 1760 1761 /* 1762 * Callback function that can be used in ibt_aget_ip_paths(), a Non-Blocking 1763 * version of ibt_get_ip_paths(). 1764 */ 1765 typedef void (*ibt_ip_path_handler_t)(void *arg, ibt_status_t retval, 1766 ibt_path_info_t *paths_p, uint8_t num_paths, ibt_path_ip_src_t *src_ip_p); 1767 1768 /* 1769 * Find path(s) to a given destination or service asynchronously. 1770 * ibt_aget_ip_paths() is a Non-Blocking version of ibt_get_ip_paths(). 1771 */ 1772 ibt_status_t ibt_aget_ip_paths(ibt_clnt_hdl_t ibt_hdl, ibt_path_flags_t flags, 1773 ibt_ip_path_attr_t *attr, ibt_ip_path_handler_t func, void *arg); 1774 1775 /* 1776 * IP RDMA protocol functions 1777 */ 1778 1779 /* 1780 * IBTF manages the port number space for non well known ports. If a ULP 1781 * is not using TCP/UDP and a well known port, then ibt_get_ip_sid() returns 1782 * an sid based on the IP protocol number '0' (reserved) and an IBTF assigned 1783 * port number. ibt_release_ip_sid() should be used to release the hold 1784 * of SID created by ibt_get_ip_sid(). 1785 */ 1786 ib_svc_id_t ibt_get_ip_sid(uint8_t protocol_num, in_port_t dst_port); 1787 ibt_status_t ibt_release_ip_sid(ib_svc_id_t sid); 1788 1789 uint8_t ibt_get_ip_protocol_num(ib_svc_id_t sid); 1790 in_port_t ibt_get_ip_dst_port(ib_svc_id_t sid); 1791 1792 /* 1793 * Functions to format/extract the RDMA IP CM private data 1794 */ 1795 typedef struct ibt_ip_cm_info_s { 1796 ibt_ip_addr_t src_addr; 1797 ibt_ip_addr_t dst_addr; 1798 in_port_t src_port; 1799 } ibt_ip_cm_info_t; 1800 1801 /* 1802 * If a ULP is using IP addressing as defined by the RDMA IP CM Service IBTA 1803 * Annex 11, then it must always allocate a private data buffer for use in 1804 * the ibt_open_rc_channel(9F) call. The minimum size of the buffer is 1805 * IBT_IP_HDR_PRIV_DATA_SZ, if the ULP has no ULP specific private data. 1806 * This allows ibt_format_ip_private_data() to place the RDMA IP CM service 1807 * hello message in the private data of the REQ. If the ULP has some ULP 1808 * specific private data then it should allocate a buffer big enough to 1809 * contain that data plus an additional IBT_IP_HDR_PRIV_DATA_SZ bytes. 1810 * The ULP should place its ULP specific private data at offset 1811 * IBT_IP_HDR_PRIV_DATA_SZ in the allocated buffer before calling 1812 * ibt_format_ip_private_data(). 1813 */ 1814 ibt_status_t ibt_format_ip_private_data(ibt_ip_cm_info_t *ip_cm_info, 1815 ibt_priv_data_len_t priv_data_len, void *priv_data_p); 1816 ibt_status_t ibt_get_ip_data(ibt_priv_data_len_t priv_data_len, 1817 void *priv_data, ibt_ip_cm_info_t *ip_info_p); 1818 1819 /* 1820 * The ibt_alt_ip_path_attr_t structure is used to specify additional optional 1821 * attributes when requesting an alternate path for an existing channel. 1822 * 1823 * Attributes that are don't care should be set to NULL or '0'. 1824 */ 1825 typedef struct ibt_alt_ip_path_attr_s { 1826 ibt_ip_addr_t apa_dst_ip; 1827 ibt_ip_addr_t apa_src_ip; 1828 ibt_srate_req_t apa_srate; 1829 ibt_pkt_lt_req_t apa_pkt_lt; /* Packet Life Time Request */ 1830 uint_t apa_flow:20; 1831 uint8_t apa_sl:4; 1832 uint8_t apa_hop; 1833 uint8_t apa_tclass; 1834 } ibt_alt_ip_path_attr_t; 1835 1836 ibt_status_t ibt_get_ip_alt_path(ibt_channel_hdl_t rc_chan, 1837 ibt_path_flags_t flags, ibt_alt_ip_path_attr_t *attr, 1838 ibt_alt_path_info_t *alt_path); 1839 1840 /* 1841 * CONTRACT PRIVATE ONLY INTERFACES 1842 * 1843 * DO NOT USE THE FOLLOWING FUNCTIONS WITHOUT SIGNING THE CONTRACT 1844 * WITH IBTF GROUP. 1845 */ 1846 1847 /* Define an Address Record structure (data for ATS service records). */ 1848 typedef struct ibt_ar_s { 1849 ib_gid_t ar_gid; /* GID of local HCA port */ 1850 ib_pkey_t ar_pkey; /* P_Key valid on port of ar_gid */ 1851 uint8_t ar_data[16]; /* Data affiliated with GID/P_Key */ 1852 } ibt_ar_t; 1853 1854 /* 1855 * ibt_register_ar() 1856 * ibt_deregister_ar() 1857 * Register/deregister an Address Record with the SA. 1858 * ibt_query_ar() 1859 * Query the SA for Address Records matching either GID/P_Key or Data. 1860 */ 1861 ibt_status_t ibt_register_ar(ibt_clnt_hdl_t ibt_hdl, ibt_ar_t *arp); 1862 1863 ibt_status_t ibt_deregister_ar(ibt_clnt_hdl_t ibt_hdl, ibt_ar_t *arp); 1864 1865 ibt_status_t ibt_query_ar(ib_gid_t *sgid, ibt_ar_t *queryp, ibt_ar_t *resultp); 1866 1867 1868 /* 1869 * ibt_modify_system_image() 1870 * ibt_modify_system_image_byguid() 1871 * Modify specified HCA's system image GUID. 1872 */ 1873 ibt_status_t ibt_modify_system_image(ibt_hca_hdl_t hca_hdl, ib_guid_t sys_guid); 1874 1875 ibt_status_t ibt_modify_system_image_byguid(ib_guid_t hca_guid, 1876 ib_guid_t sys_guid); 1877 1878 1879 /* 1880 * ibt_modify_port() 1881 * ibt_modify_port_byguid() 1882 * Modify the specified port, or all ports attribute(s). 1883 */ 1884 ibt_status_t ibt_modify_port(ibt_hca_hdl_t hca_hdl, uint8_t port, 1885 ibt_port_modify_flags_t flags, uint8_t init_type); 1886 1887 ibt_status_t ibt_modify_port_byguid(ib_guid_t hca_guid, uint8_t port, 1888 ibt_port_modify_flags_t flags, uint8_t init_type); 1889 1890 1891 /* 1892 * ibt_get_port_state() 1893 * ibt_get_port_state_byguid() 1894 * Return the most commonly requested attributes of an HCA port. 1895 * If the link state is not IBT_PORT_ACTIVE, the other returned values 1896 * are undefined. 1897 */ 1898 ibt_status_t ibt_get_port_state(ibt_hca_hdl_t hca_hdl, uint8_t port, 1899 ib_gid_t *sgid_p, ib_lid_t *base_lid_p); 1900 1901 ibt_status_t ibt_get_port_state_byguid(ib_guid_t hca_guid, uint8_t port, 1902 ib_gid_t *sgid_p, ib_lid_t *base_lid_p); 1903 1904 /* 1905 * ibt_alloc_io_mem() 1906 * ibt_free_io_mem() 1907 * Allocate and deallocate dma-able memory. 1908 */ 1909 ibt_status_t ibt_alloc_io_mem(ibt_hca_hdl_t, size_t, ibt_mr_flags_t, 1910 caddr_t *, ibt_mem_alloc_hdl_t *); 1911 1912 ibt_status_t ibt_free_io_mem(ibt_hca_hdl_t, ibt_mem_alloc_hdl_t); 1913 1914 #ifdef __cplusplus 1915 } 1916 #endif 1917 1918 #endif /* _SYS_IB_IBTL_IBTI_COMMON_H */ 1919