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 /* 23 * Copyright 2007 Sun Microsystems, Inc. All rights reserved. 24 * Use is subject to license terms. 25 */ 26 27 #ifndef _DAPL_IF_H_ 28 #define _DAPL_IF_H_ 29 30 #ifdef __cplusplus 31 extern "C" { 32 #endif 33 34 /* change this "version" everytime the interface changes */ 35 #define DAPL_IF_VERSION (0x05302007) 36 37 #define DAPL_IOC (0x0da9 << 16) 38 #define DAPL_TYPE_IA (DAPL_IOC | 0x11 << 8) 39 #define DAPL_TYPE_EVD (DAPL_IOC | 0x12 << 8) 40 #define DAPL_TYPE_EP (DAPL_IOC | 0x13 << 8) 41 #define DAPL_TYPE_MR (DAPL_IOC | 0x14 << 8) 42 #define DAPL_TYPE_PD (DAPL_IOC | 0x15 << 8) 43 #define DAPL_TYPE_SP (DAPL_IOC | 0x16 << 8) 44 #define DAPL_TYPE_CNO (DAPL_IOC | 0x17 << 8) 45 #define DAPL_TYPE_MW (DAPL_IOC | 0x18 << 8) 46 #define DAPL_TYPE_MISC (DAPL_IOC | 0x19 << 8) 47 #define DAPL_TYPE_SRQ (DAPL_IOC | 0x1a << 8) 48 #define DAPL_TYPE_NONE (DAPL_IOC | 0x1f << 8) 49 #define DAPL_TYPE_MASK (0xffffff00) 50 51 /* NONE */ 52 #define DAPL_IA_CREATE (DAPL_TYPE_NONE | 0x01) 53 54 /* MISC */ 55 #define DAPL_CR_ACCEPT (DAPL_TYPE_MISC | 0x01) 56 #define DAPL_CR_REJECT (DAPL_TYPE_MISC | 0x02) 57 #define DAPL_IA_QUERY (DAPL_TYPE_MISC | 0x03) 58 #define DAPL_CR_HANDOFF (DAPL_TYPE_MISC | 0x04) 59 60 /* EP */ 61 #define DAPL_EP_CREATE (DAPL_TYPE_EP | 0x01) 62 #define DAPL_EP_FREE (DAPL_TYPE_EP | 0x02) 63 #define DAPL_EP_CONNECT (DAPL_TYPE_EP | 0x03) 64 #define DAPL_EP_MODIFY (DAPL_TYPE_EP | 0x04) 65 #define DAPL_EP_DISCONNECT (DAPL_TYPE_EP | 0x05) 66 #define DAPL_EP_REINIT (DAPL_TYPE_EP | 0x06) 67 68 /* EVD */ 69 #define DAPL_EVD_CREATE (DAPL_TYPE_EVD | 0x01) 70 #define DAPL_CQ_RESIZE (DAPL_TYPE_EVD | 0x02) 71 #define DAPL_EVD_FREE (DAPL_TYPE_EVD | 0x03) 72 #define DAPL_EVENT_POLL (DAPL_TYPE_EVD | 0x04) 73 #define DAPL_EVENT_WAKEUP (DAPL_TYPE_EVD | 0x05) 74 #define DAPL_EVD_MODIFY_CNO (DAPL_TYPE_EVD | 0x06) 75 76 /* MR */ 77 #define DAPL_MR_REGISTER (DAPL_TYPE_MR | 0x01) 78 #define DAPL_MR_REGISTER_LMR (DAPL_TYPE_MR | 0x02) 79 #define DAPL_MR_REGISTER_SHARED (DAPL_TYPE_MR | 0x03) 80 #define DAPL_MR_DEREGISTER (DAPL_TYPE_MR | 0x04) 81 #define DAPL_MR_SYNC (DAPL_TYPE_MR | 0x05) 82 83 /* MW */ 84 #define DAPL_MW_ALLOC (DAPL_TYPE_MW | 0x01) 85 #define DAPL_MW_FREE (DAPL_TYPE_MW | 0x02) 86 87 /* CNO */ 88 #define DAPL_CNO_ALLOC (DAPL_TYPE_CNO | 0x01) 89 #define DAPL_CNO_FREE (DAPL_TYPE_CNO | 0x02) 90 #define DAPL_CNO_WAIT (DAPL_TYPE_CNO | 0x03) 91 92 /* PD */ 93 #define DAPL_PD_ALLOC (DAPL_TYPE_PD | 0x01) 94 #define DAPL_PD_FREE (DAPL_TYPE_PD | 0x02) 95 96 /* SP */ 97 #define DAPL_SERVICE_REGISTER (DAPL_TYPE_SP | 0x01) 98 #define DAPL_SERVICE_DEREGISTER (DAPL_TYPE_SP | 0x02) 99 100 /* SRQ */ 101 #define DAPL_SRQ_CREATE (DAPL_TYPE_SRQ | 0x01) 102 #define DAPL_SRQ_FREE (DAPL_TYPE_SRQ | 0x02) 103 #define DAPL_SRQ_RESIZE (DAPL_TYPE_SRQ | 0x03) 104 105 /* 106 * Drivers name and minor name. 107 */ 108 #define DAPLKA_DRV_NAME "daplt" 109 #define DAPLKA_MINOR_NAME "daplt" 110 #define DAPLKA_DEFAULT_PATH "/devices/ib/daplt@0:daplt" 111 #define DAPLKA_DRIVER_MINOR 0 112 113 /* 114 * Upper limit on number of events that can be polled per event_poll ioctl 115 * Since we allocate memory in kernel there needs to be an upper bound. 116 */ 117 #define DAPL_EVD_MAX_EVENTS 16384 118 /* 119 * Number of events that we generally poll for in event_poll. 120 */ 121 #define NUM_EVENTS_PER_POLL 16 122 123 /* duplicated from dat.h */ 124 #ifndef _DAT_H_ 125 typedef enum dat_evd_flags { 126 DAT_EVD_SOFTWARE_FLAG = 0x01, 127 DAT_EVD_CR_FLAG = 0x10, 128 DAT_EVD_DTO_FLAG = 0x20, 129 DAT_EVD_CONNECTION_FLAG = 0x40, 130 DAT_EVD_RMR_BIND_FLAG = 0x80, 131 DAT_EVD_ASYNC_FLAG = 0x100, 132 /* DAT events only, no software events */ 133 DAT_EVD_DEFAULT_FLAG = 0x1F0 134 } DAT_EVD_FLAGS; 135 #endif /* _DAT_H_ */ 136 137 #define DAPL_MAX_PRIVATE_DATA_SIZE IBT_MAX_PRIV_DATA_SZ 138 #define DAPL_ATS_NBYTES 16 /* SA record data length */ 139 140 /* 141 * All structures defined herein are used for ioctls. On amd64, 142 * use pack(4) to make structures match the x86 alignment rules. 143 */ 144 145 #if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4 146 #pragma pack(4) 147 #endif 148 149 /* 150 * Byte Offset 151 * uDAPL client's private data 64 00 152 * Base Sockets Direct Header (BSDH) 4 64 153 * Extended Header 68 154 * Hello Message (HH) 24 155 * 156 * bits 32-24 23-16 15-8 7-0 157 * bytes 158 * 00-63 uDAPL client's private data 159 * 64-67 MID client_msg_len checksum 160 * 68-72 MajV MinV IPV rsvd1 161 * 73-75 rsvd2 LocalPort 162 * 76-79 SrcIP(127-96) 163 * 80-83 SrcIP(95-64) 164 * 84-87 SrcIP(63-32) 165 * 88-92 SrcIP(31-00) 166 * 167 */ 168 typedef union dapl_ia_addr_s { 169 struct { 170 uint32_t iad_pad[3]; 171 struct in_addr iad_v4data; 172 } iad_v4_s; /* IPv4 format */ 173 in6_addr_t iad_v6data; /* IPv6 format */ 174 uint8_t iad_sadata[DAPL_ATS_NBYTES]; /* SA format */ 175 uint32_t iad_src; /* alignment */ 176 } dapl_ia_addr_t; 177 #define iad_v4 iad_v4_s.iad_v4data 178 #define iad_v4pad iad_v4_s.iad_pad 179 #define iad_v6 iad_v6data 180 #define iad_sa iad_sadata 181 182 typedef struct dapl_hello_msg { 183 uint16_t hi_checksum; /* checksum */ 184 uint8_t hi_clen; /* client private data len */ 185 uint8_t hi_mid; /* command - not use */ 186 uint16_t hi_rsvd1; 187 uint8_t hi_ipv; /* IP family ipv4 or ipv6 */ 188 uint8_t hi_vers; /* hello message version number */ 189 in_port_t hi_port; /* IP port number */ 190 uint16_t hi_rsvd2; 191 dapl_ia_addr_t _hi_ipaddr; /* IP address */ 192 } DAPL_HELLO_MSG; 193 /* different views of the address field */ 194 #define hi_v4ipaddr _hi_ipaddr.iad_v4 /* IPv4 */ 195 #define hi_v4pad _hi_ipaddr.iad_v4pad 196 #define hi_v6ipaddr _hi_ipaddr.iad_v6 /* IPv6 */ 197 #define hi_saaddr _hi_ipaddr.iad_sa /* 16 bytes SA record */ 198 199 #define DAPL_CHECKSUM 0xbeef /* use as magic number */ 200 #define DAPL_HELLO_MSG_VERS 0x10 /* major 1 minor 0 */ 201 /* DAPL_PRIVATE used to pass private data in a connection */ 202 #define DAPL_CONSUMER_MAX_PRIVATE_DATA_SIZE 64 203 typedef struct dapl_private { 204 unsigned char private_data[DAPL_CONSUMER_MAX_PRIVATE_DATA_SIZE]; 205 DAPL_HELLO_MSG hello_msg; 206 } DAPL_PRIVATE; 207 208 /* EP ioctl interfaces */ 209 210 /* 211 * Definitions used by DAPL for HCA specific "data out" information. This 212 * data is opaque to daplt, and is consumed by HCA specific code in the 213 * userland library. 214 * 215 * The sizes (in units of uint64_t) need to be big enough for all HCAs 216 * supported. Although 16 is large enough, since we never want to have 217 * to change our interface version just because we undersized this, we 218 * have chosen 24. 219 */ 220 #define DAPL_CQ_DATA_OUT_SIZE 24 221 #define DAPL_QP_DATA_OUT_SIZE 24 222 #define DAPL_SRQ_DATA_OUT_SIZE 24 223 224 typedef uint64_t dapl_cq_data_out_t[DAPL_QP_DATA_OUT_SIZE]; 225 typedef uint64_t dapl_qp_data_out_t[DAPL_CQ_DATA_OUT_SIZE]; 226 typedef uint64_t dapl_srq_data_out_t[DAPL_SRQ_DATA_OUT_SIZE]; 227 228 /* 229 * Channel sizes struct, copy of ibt_chan_sizes_t so that it can work 230 * fine for both 32/64 bit library 231 */ 232 typedef struct dapl_chan_sizes_s { 233 uint_t dcs_sq; /* SendQ size. */ 234 uint_t dcs_rq; /* ReceiveQ size. */ 235 uint_t dcs_sq_sgl; /* Max SGL elements in a SQ WR. */ 236 uint_t dcs_rq_sgl; /* Max SGL elements in a RQ Wr. */ 237 } dapl_chan_sizes_t; 238 239 /* 240 * EP create ioctl message structure 241 */ 242 typedef struct dapl_ep_create_s { 243 uint64_t ep_hkey; /* hash key of the EP */ 244 uint64_t ep_pd_hkey; /* PD hash key */ 245 uint64_t ep_rcv_evd_hkey; /* Recv evd hash key */ 246 uint64_t ep_snd_evd_hkey; /* Send evd hash key */ 247 uint64_t ep_conn_evd_hkey; /* Conn evd hash key */ 248 uint64_t ep_srq_hkey; /* SRQ hash key */ 249 uint32_t ep_srq_attached; /* EP with SRQ - 1 or 0 */ 250 uint64_t ep_cookie; /* Userland EP pointer */ 251 dapl_chan_sizes_t ep_ch_sizes; /* Requested RC params */ 252 dapl_chan_sizes_t ep_ch_real_sizes; /* Allocated RC params */ 253 dapl_qp_data_out_t ep_qp_data_out; 254 } dapl_ep_create_t; 255 256 /* 257 * Modify is not yet completely implemented 258 */ 259 typedef struct dapl_ep_modify_s { 260 uint64_t epm_hkey; 261 ibt_cep_modify_flags_t epm_flags; 262 uint8_t epm_rdma_ra_out; 263 uint8_t epm_rdma_ra_in; 264 } dapl_ep_modify_t; 265 266 /* 267 * EP Connect ioctl message 268 */ 269 typedef struct dapl_ep_connect_s { 270 uint64_t epc_hkey; /* EP hash key */ 271 ib_gid_t epc_dgid; /* destination gid */ 272 uint64_t epc_sid; /* service id */ 273 uint64_t epc_timeout; /* timeout */ 274 uint32_t epc_priv_sz; /* private data size */ 275 dapl_ia_addr_t epc_raddr_sadata; /* remote addr in SA format */ 276 uchar_t epc_priv[DAPL_MAX_PRIVATE_DATA_SIZE]; 277 } dapl_ep_connect_t; 278 279 typedef struct dapl_ep_disconnect_s { 280 uint64_t epd_hkey; /* EP hash key */ 281 } dapl_ep_disconnect_t; 282 283 /* 284 * EP reinit ioctl called to recycle the RC 285 */ 286 typedef struct dapl_ep_reinit_s { 287 uint64_t epri_hkey; /* EP hash key */ 288 uint64_t epri_map_offset; /* Mapping offset of new QP */ 289 uint64_t epri_map_len; /* Map len of new QP */ 290 uint32_t epri_qpnum; /* QPnum of the new QP */ 291 uint32_t epri_rq_offset; /* New RecvQ offset in buf */ 292 uint32_t epri_rq_desc_addr; /* New RecvQ kernel addr */ 293 uint32_t epri_rq_numwqe; 294 uint32_t epri_rq_wqesz; 295 uint32_t epri_sq_offset; /* New SendQ offset in buf */ 296 uint32_t epri_sq_desc_addr; /* New SendQ kernel addr */ 297 uint32_t epri_sq_numwqe; 298 uint32_t epri_sq_wqesz; 299 } dapl_ep_reinit_t; 300 301 typedef struct dapl_ep_free_s { 302 uint64_t epf_hkey; /* EP hash key */ 303 } dapl_ep_free_t; 304 305 /* EVD ioctl interfaces */ 306 307 /* 308 * EVD create ioctl 309 */ 310 typedef struct dapl_evd_create_s { 311 uint64_t evd_hkey; /* EVD hash key */ 312 DAT_EVD_FLAGS evd_flags; /* EVD streams flag */ 313 uint64_t evd_cookie; /* userland EVD pointer */ 314 uint64_t evd_cno_hkey; /* CNO hash key */ 315 uint32_t evd_cq_size; /* Requested CQ Size */ 316 uint32_t evd_cq_real_size; /* Allocated CQ size */ 317 dapl_cq_data_out_t evd_cq_data_out; 318 } dapl_evd_create_t; 319 320 /* 321 * If an EVD has a CQ this ioctl message is used to resize the CQ 322 */ 323 typedef struct dapl_cq_resize_s { 324 uint64_t cqr_evd_hkey; /* EVD hash key */ 325 uint32_t cqr_cq_new_size; /* New requested CQ size */ 326 uint32_t cqr_cq_real_size; /* Allocated CQ size */ 327 dapl_cq_data_out_t cqr_cq_data_out; 328 } dapl_cq_resize_t; 329 330 /* 331 * Event type used while returning events from the kernel 332 */ 333 typedef enum { 334 /* event family for the Async events */ 335 DAPL_ASYNC_EVENTS = 0x01, 336 /* event family for events posted by the PASSIVE side cm_handler */ 337 DAPL_CR_EVENTS = 0x02, 338 /* event family for events posted by the PASSIVE side cm_handler */ 339 DAPL_PASSIVE_CONNECTION_EVENTS = 0x04, 340 /* event family for events posted by the ACTIVE side cm_handler */ 341 DAPL_ACTIVE_CONNECTION_EVENTS = 0x08 342 } dapl_event_family_t; 343 344 /* 345 * Async event structure 346 */ 347 typedef struct dapl_ib_async_event_s { 348 ibt_async_code_t ibae_type; 349 ib_guid_t ibae_hca_guid; /* HCA node GUID */ 350 uint64_t ibae_cookie; /* ep or cq pointer */ 351 uint8_t ibae_port; /* HCA Port num unaffiliated evnt */ 352 } dapl_ib_async_event_t; 353 354 /* 355 * CM events definitions used to translate IBTF CM events to DAPL CM events 356 */ 357 typedef enum { 358 /* IBT_CM_EVENT_CONN_EST */ 359 DAPL_IB_CME_CONNECTED = 1, 360 /* IBT_CM_EVENT_CONN_CLOSED */ 361 DAPL_IB_CME_DISCONNECTED, 362 /* IBT_CM_EVENT_REQ_RCV */ 363 DAPL_IB_CME_CONNECTION_REQUEST_PENDING, 364 DAPL_IB_CME_CONNECTION_REQUEST_PENDING_PRIVATE_DATA, 365 /* IBT_CM_EVENT_FAILURE */ 366 DAPL_IB_CME_DESTINATION_REJECT, 367 DAPL_IB_CME_DESTINATION_REJECT_PRIVATE_DATA, 368 /* Currently not mapped to IBTF CM events */ 369 DAPL_IB_CME_DESTINATION_UNREACHABLE, 370 DAPL_IB_CME_TOO_MANY_CONNECTION_REQUESTS, 371 DAPL_IB_CME_LOCAL_FAILURE, 372 DAPL_IB_CME_TIMED_OUT, 373 DAPL_IB_CME_DISCONNECTED_ON_LINK_DOWN, 374 /* 375 * Not really a CM event but library uses CM events as reject reasons 376 * so to avoid any overlaps, make it part of this enum 377 */ 378 DAPL_IB_CM_REJ_REASON_CONSUMER_REJ 379 } dapl_ib_cm_event_type_t; 380 381 /* 382 * CM event structure 383 */ 384 typedef struct dapl_ib_cm_event_s { 385 dapl_ib_cm_event_type_t ibce_event; 386 /* Userland PSP ptr for CR, EP ptr for CONNECTION */ 387 uint64_t ibce_cookie; 388 /* Unique CR cookie: tmstamp + Index in the connection pending table */ 389 uint64_t ibce_psep_cookie; 390 uint32_t ibce_priv_data_size; 391 uchar_t ibce_priv_data_ptr[DAPL_MAX_PRIVATE_DATA_SIZE]; 392 } dapl_ib_cm_event_t; 393 394 /* 395 * Kernel Events structure used for returning CM or Async events 396 */ 397 typedef struct dapl_ib_event_s { 398 dapl_event_family_t ibe_ev_family; 399 union { 400 dapl_ib_async_event_t ibe_async; /* Async event */ 401 dapl_ib_cm_event_t ibe_ce; /* CM event */ 402 } ev_data; 403 #define ibe_async ev_data.ibe_async 404 #define ibe_ce ev_data.ibe_ce 405 } dapl_ib_event_t; 406 407 /* 408 * Event poll ioctl message 409 */ 410 typedef struct dapl_event_poll_s { 411 uint64_t evp_evd_hkey; /* EVD hash key */ 412 uint64_t evp_timeout; /* Timeout value */ 413 uint_t evp_threshold; /* Threshold passed in */ 414 dapl_ib_event_t *evp_ep; /* array of events to be filled */ 415 uint_t evp_num_ev; /* array sz, possbly > threshold */ 416 uint_t evp_num_polled; /* number of elements filled */ 417 } dapl_event_poll_t; 418 419 /* 420 * Event poll ioctl message 421 */ 422 typedef struct dapl_event_poll32_s { 423 uint64_t evp_evd_hkey; /* EVD hash key */ 424 uint64_t evp_timeout; /* Timeout value */ 425 uint_t evp_threshold; /* Threshold passed in */ 426 caddr32_t evp_ep; /* array of events to be filled */ 427 uint_t evp_num_ev; /* array sz, possbly > threshold */ 428 uint_t evp_num_polled; /* number of elements filled */ 429 } dapl_event_poll32_t; 430 431 /* 432 * EVD hash key to wakeup 433 */ 434 typedef struct dapl_event_wakeup_s { 435 uint64_t evw_hkey; /* EVD hash key */ 436 } dapl_event_wakeup_t; 437 438 /* 439 * modify EVD to CNO association 440 */ 441 typedef struct dapl_evd_modify_cno_s { 442 uint64_t evmc_hkey; /* EVD hash key */ 443 uint64_t evmc_cno_hkey; /* new CNO hash key */ 444 } dapl_evd_modify_cno_t; 445 446 447 /* 448 * EVD hash key to free 449 */ 450 typedef struct dapl_evd_free_s { 451 uint64_t evf_hkey; /* EVD hash key */ 452 } dapl_evd_free_t; 453 454 /* MR ioctl interfaces */ 455 456 /* 457 * MR register ioctl message 458 */ 459 typedef struct dapl_mr_register_s { 460 uint64_t mr_hkey; /* MR hash key */ 461 uint64_t mr_pd_hkey; /* PD hash key */ 462 ib_vaddr_t mr_vaddr; /* Virtual address to register */ 463 ib_memlen_t mr_len; /* Length of region to register */ 464 ibt_mr_flags_t mr_flags; 465 ibt_lkey_t mr_lkey; /* Lkey returned from mr_register */ 466 ibt_rkey_t mr_rkey; /* Rkey returned from mr_register */ 467 } dapl_mr_register_t; 468 469 /* 470 * Shared MR cookie 471 */ 472 typedef union dapl_mr_cookie_u { 473 uint64_t mc_uint_arr[5]; 474 uchar_t mc_byte_arr[40]; 475 } dapl_mr_cookie_t; 476 477 /* 478 * Shared MR register ioctl message 479 */ 480 typedef struct dapl_mr_register_shared_s { 481 uint64_t mrs_hkey; /* MR hash key */ 482 uint64_t mrs_pd_hkey; /* PD hash key */ 483 ib_vaddr_t mrs_vaddr; /* Virtual address to register */ 484 ib_memlen_t mrs_len; /* Length of region to register */ 485 ibt_mr_flags_t mrs_flags; 486 ibt_lkey_t mrs_lkey; /* Lkey returned from mr_register */ 487 ibt_rkey_t mrs_rkey; /* Rkey returned from mr_register */ 488 dapl_mr_cookie_t mrs_shm_cookie; /* shared mem cookie */ 489 } dapl_mr_register_shared_t; 490 491 /* 492 * MR based MR register ioctl message 493 */ 494 typedef struct dapl_mr_register_lmr_s { 495 uint64_t mrl_hkey; /* MR hash key */ 496 uint64_t mrl_orig_hkey; /* hash key of Original MR */ 497 ibt_mr_flags_t mrl_flags; 498 ibt_lkey_t mrl_lkey; /* Lkey returned from mr_register */ 499 ibt_rkey_t mrl_rkey; /* Rkey returned from mr_register */ 500 } dapl_mr_register_lmr_t; 501 502 /* 503 * MR deregister ioctl message 504 */ 505 typedef struct dapl_mr_deregister_s { 506 uint64_t mrd_hkey; /* MR hash key */ 507 } dapl_mr_deregister_t; 508 509 /* 510 * MR RDMA sync ioctl message 511 */ 512 513 #define DAPL_MR_PER_SYNC 16 514 #define DAPL_MR_SYNC_RDMA_RD 0 515 #define DAPL_MR_SYNC_RDMA_WR 1 516 517 typedef struct dapl_mr_sync_vec_s { 518 uint64_t mrsv_hkey; /* MR hash key */ 519 uint64_t mrsv_va; /* MR sync virtual addr */ 520 uint64_t mrsv_len; /* MR sync length */ 521 } dapl_mr_sync_vec_t; 522 523 typedef struct dapl_mr_sync_s { 524 uint32_t mrs_flags; /* MR sync direction */ 525 uint64_t mrs_numseg; /* number of MR's */ 526 dapl_mr_sync_vec_t mrs_vec[DAPL_MR_PER_SYNC]; /* sync elements */ 527 } dapl_mr_sync_t; 528 529 /* IA ioctl interfaces */ 530 531 /* 532 * IA create ioctl message 533 */ 534 typedef struct dapl_ia_create_s { 535 uint32_t ia_version; /* ioctl interface version */ 536 ib_guid_t ia_guid; /* HCA guid */ 537 uint32_t ia_port; /* port number */ 538 uint32_t ia_pkey; /* pkey of the ibd instance */ 539 uint32_t ia_resnum; /* resource num in resrc table */ 540 uint8_t ia_sadata[DAPL_ATS_NBYTES]; /* SA data record */ 541 } dapl_ia_create_t; 542 543 /* 544 * This structure is pretty much a copy of ibt_hca_attr_t but only 545 * relevant fields are present and the data types are such that 546 * its safe to use it in both in 32 and 64 bit libraries 547 * For detailed description refer to ibt_hca_attr_t in ibtl_types.h 548 */ 549 typedef struct dapl_hca_attr_s { 550 uint32_t dhca_vendor_id:24; 551 uint16_t dhca_device_id; 552 uint32_t dhca_version_id; 553 uint_t dhca_max_chans; 554 uint_t dhca_max_chan_sz; 555 uint_t dhca_max_sgl; 556 uint_t dhca_max_cq; 557 uint_t dhca_max_cq_sz; 558 uint_t dhca_max_memr; 559 ib_memlen_t dhca_max_memr_len; 560 uint_t dhca_max_mem_win; 561 uint8_t dhca_max_rdma_in_chan; 562 uint8_t dhca_max_rdma_out_chan; 563 uint16_t dhca_max_partitions; 564 uint8_t dhca_nports; 565 ib_guid_t dhca_node_guid; 566 uint_t dhca_max_pd; 567 uint_t dhca_max_srqs; 568 uint_t dhca_max_srqs_sz; 569 uint_t dhca_max_srq_sgl; 570 } dapl_hca_attr_t; 571 572 /* 573 * IA query ioctl message 574 */ 575 typedef struct dapl_ia_query_s { 576 dapl_hca_attr_t hca_attr; 577 } dapl_ia_query_t; 578 579 #define DAPL_MAX_IA 64 580 /* 581 * IA enum ioctl message 582 */ 583 typedef struct dapl_ia_enum_s { 584 uint32_t ia_count; /* number of IAs */ 585 uint16_t ia_devnum[DAPL_MAX_IA]; /* devnum of IAs */ 586 } dapl_ia_enum_t; 587 588 /* PD ioctl interfaces */ 589 590 typedef struct dapl_pd_alloc_s { 591 uint64_t pda_hkey; 592 } dapl_pd_alloc_t; 593 594 typedef struct dapl_pd_free_s { 595 uint64_t pdf_hkey; 596 } dapl_pd_free_t; 597 598 /* MW ioctl interfaces */ 599 600 typedef struct dapl_mw_alloc_s { 601 uint64_t mw_pd_hkey; 602 uint64_t mw_hkey; 603 ibt_rkey_t mw_rkey; 604 } dapl_mw_alloc_t; 605 606 typedef struct dapl_mw_free_s { 607 uint64_t mw_hkey; 608 } dapl_mw_free_t; 609 610 /* Passive Side ioctl interfaces */ 611 612 /* 613 * Service register ioctl message 614 */ 615 typedef struct dapl_service_register_s { 616 ib_svc_id_t sr_sid; /* Requested service id */ 617 uint64_t sr_evd_hkey; /* CR EVD hash key */ 618 uint64_t sr_sp_hkey; /* SP hash key */ 619 uint64_t sr_sp_cookie; /* Userland xSP ptr */ 620 ib_svc_id_t sr_retsid; /* Returned service id */ 621 } dapl_service_register_t; 622 623 /* 624 * Service deregister ioctl message 625 */ 626 typedef struct dapl_service_deregister_s { 627 uint64_t sdr_sp_hkey; 628 } dapl_service_deregister_t; 629 630 /* 631 * Connection request accept ioctl message 632 */ 633 typedef struct dapl_cr_accept_s { 634 uint64_t cra_sp_hkey; /* xSP hash key */ 635 uint64_t cra_ep_hkey; /* EP hash key */ 636 uint64_t cra_bkl_cookie; /* CR timestamp + SP backlog index */ 637 uint32_t cra_priv_sz; /* private data and size */ 638 uchar_t cra_priv[DAPL_MAX_PRIVATE_DATA_SIZE]; 639 } dapl_cr_accept_t; 640 641 /* 642 * Connection request reject ioctl message 643 */ 644 typedef struct dapl_cr_reject_s { 645 uint64_t crr_sp_hkey; /* xSP hash key */ 646 uint64_t crr_bkl_cookie; /* CR timestamp + SP backlog index */ 647 int crr_reason; /* Reason for rejecting the CR */ 648 } dapl_cr_reject_t; 649 650 /* 651 * Connection request handoff ioctl message 652 */ 653 typedef struct dapl_cr_handoff_s { 654 uint64_t crh_sp_hkey; /* xSP hash key */ 655 uint64_t crh_bkl_cookie; /* CR timestamp + SP backlog index */ 656 ib_svc_id_t crh_conn_qual; /* Service id of destination SP */ 657 } dapl_cr_handoff_t; 658 659 /* CNO ioctl interfaces */ 660 661 /* 662 * CNO alloc ioctl message 663 */ 664 typedef struct dapl_cno_alloc_s { 665 uint64_t cno_hkey; /* CNO hash key */ 666 } dapl_cno_alloc_t; 667 668 /* 669 * CNO free ioctl message 670 */ 671 typedef struct dapl_cno_free_s { 672 uint64_t cnf_hkey; /* CNO hash key */ 673 } dapl_cno_free_t; 674 675 /* 676 * CNO wait ioctl message 677 */ 678 typedef struct dapl_cno_wait_s { 679 uint64_t cnw_hkey; /* CNO hash key */ 680 uint64_t cnw_timeout; /* CNO timeout */ 681 uint64_t cnw_evd_cookie; 682 } dapl_cno_wait_t; 683 684 /* 685 * SRQ related structures 686 */ 687 typedef struct dapl_srq_sizes_s { 688 uint_t srqs_sz; 689 uint_t srqs_sgl; 690 } dapl_srq_sizes_t; 691 692 /* 693 * SRQ create ioctl message 694 */ 695 typedef struct dapl_srq_create_s { 696 uint64_t srqc_pd_hkey; /* hash key of the assoc PD */ 697 dapl_srq_sizes_t srqc_sizes; /* Requested SRQ params */ 698 uint64_t srqc_hkey; /* hash key of allocated SRQ */ 699 dapl_srq_sizes_t srqc_real_sizes; /* Allocated SRQ params */ 700 dapl_srq_data_out_t srqc_data_out; 701 } dapl_srq_create_t; 702 703 /* 704 * SRQ resize ioctl message 705 */ 706 typedef struct dapl_srq_resize_s { 707 uint64_t srqr_hkey; /* hash key of the SRQ */ 708 uint32_t srqr_new_size; /* New SRQ size */ 709 uint32_t srqr_real_size; /* Actual SRQ size */ 710 dapl_srq_data_out_t srqr_data_out; 711 } dapl_srq_resize_t; 712 713 /* 714 * SRQ free ioctl message 715 */ 716 typedef struct dapl_srq_free_s { 717 uint64_t srqf_hkey; /* hash key of the SRQ being freed */ 718 } dapl_srq_free_t; 719 720 #if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4 721 #pragma pack() 722 #endif 723 724 #ifdef __cplusplus 725 } 726 #endif 727 728 #endif /* _DAPL_IF_H_ */ 729