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