1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License, Version 1.0 only 6 * (the "License"). You may not use this file except in compliance 7 * with the License. 8 * 9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 10 * or http://www.opensolaris.org/os/licensing. 11 * See the License for the specific language governing permissions 12 * and limitations under the License. 13 * 14 * When distributing Covered Code, include this CDDL HEADER in each 15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 16 * If applicable, add the following below this CDDL HEADER, with the 17 * fields enclosed by brackets "[]" replaced with your own identifying 18 * information: Portions Copyright [yyyy] [name of copyright owner] 19 * 20 * CDDL HEADER END 21 */ 22 /* 23 * Copyright (c) 1998-2001 by Sun Microsystems, Inc. 24 * All rights reserved. 25 */ 26 27 #ifndef _SYS_RSM_RSMPI_H 28 #define _SYS_RSM_RSMPI_H 29 30 #pragma ident "%Z%%M% %I% %E% SMI" 31 32 #ifdef __cplusplus 33 extern "C" { 34 #endif 35 36 #ifndef _KERNEL 37 typedef void * ddi_as_handle_t; 38 #endif 39 40 #include <sys/sunddi.h> 41 #include <sys/rsm/rsm_common.h> 42 43 struct __rsm_resource_callback_arg; 44 typedef struct __rsm_resource_callback_arg *rsm_resource_callback_arg_t; 45 46 typedef void (*rsm_resource_callback_t)(rsm_resource_callback_arg_t); 47 48 struct __rsm_callback_arg; 49 typedef struct __rsm_callback_arg *rsm_callback_arg_t; 50 51 typedef void (*rsm_callback_t)(rsm_callback_arg_t); 52 53 /* Values for resource callback function pointer */ 54 #define RSM_RESOURCE_SLEEP (rsm_resource_callback_t)0 55 #define RSM_RESOURCE_DONTWAIT (rsm_resource_callback_t)-1 56 57 /* rsm_seg_create() flags values */ 58 #define RSM_ALLOW_UNBIND_REBIND 0x01 59 60 typedef uint_t rsm_intr_t; 61 typedef rsm_intr_t rsm_intr_service_t; 62 /* The following definitions used to describe the ranges fro rsm_intr_t */ 63 #define RSM_INTR_T_DRV_BASE 0 64 #define RSM_INTR_T_DRV_END 0x3F 65 #define RSM_INTR_T_FRM_BASE 0x40 66 #define RSM_INTR_T_FRM_END 0x4F 67 #define RSM_INTR_T_RESERVED_BASE 0x50 68 #define RSM_INTR_T_RESERVED_END 0x5F 69 #define RSM_INTR_T_SUN_BASE 0x60 70 #define RSM_INTR_T_SUN_END 0xDF 71 #define RSM_INTR_T_USR_BASE 0xE0 72 #define RSM_INTR_T_USR_END 0xFF 73 #define RSM_INTR_T_NSVC 0x100 74 75 /* kstat's ks_name for RSMPI controller drivers */ 76 #define RSM_KS_NAME "rsmpi_stat" 77 78 /* named kstat component names */ 79 #define RSM_KS_CTLR_STATE "ctlr_state" /* CHAR */ 80 #define RSM_KS_ADDR "addr" /* UINT64 */ 81 #define RSM_KS_EX_MEMSEGS "ex_memsegs" /* UINT32 */ 82 #define RSM_KS_EX_MEMSEGS_PUB "ex_memsegs_pub" /* UINT32 */ 83 #define RSM_KS_EX_MEMSEGS_CON "ex_memsegs_con" /* UINT32 */ 84 #define RSM_KS_BYTES_BOUND "bytes_bound" /* UINT64 */ 85 #define RSM_KS_IM_MEMSEGS_CON "im_memsegs_con" /* UINT32 */ 86 #define RSM_KS_SENDQS "sendqs" /* UINT64 */ 87 #define RSM_KS_HANDLERS "handlers" /* UINT64 */ 88 89 /* The following are the possible values of RSM_KS_CTLR_STATE */ 90 #define RSM_AE_CTLR_DOWN "rsm_down" 91 #define RSM_AE_CTLR_UP "rsm_up" 92 93 94 struct __rsm_send_q_handle; 95 typedef struct __rsm_send_q_handle *rsm_send_q_handle_t; 96 97 /* rsm_intr_send_q_create flags values */ 98 #define RSM_INTR_SEND_Q_NO_FENCE 0x1 99 #define RSM_INTR_SEND_Q_FULL_FAIL 0x2 100 #define RSM_INTR_SEND_Q_UNRELIABLE 0x4 101 102 typedef struct { 103 void *is_data; 104 size_t is_size; 105 int is_flags; 106 clock_t is_wait; 107 } rsm_send_t; 108 109 /* rsm_send_t flags values */ 110 #define RSM_INTR_SEND_QUEUE 0x1 111 #define RSM_INTR_SEND_DELIVER 0x2 112 #define RSM_INTR_SEND_POLL 0x4 113 #define RSM_INTR_SEND_SLEEP 0x8 114 #define RSM_INTR_SEND_LOWER_FENCE 0x10 115 116 typedef enum { 117 RSM_INTR_HAND_UNCLAIMED = 0, 118 RSM_INTR_HAND_CLAIMED = 1, 119 RSM_INTR_HAND_CLAIMED_EXCLUSIVE = 2 120 } rsm_intr_hand_ret_t; 121 122 typedef enum { 123 RSM_INTR_Q_OP_CREATE, 124 RSM_INTR_Q_OP_CONFIGURE, 125 RSM_INTR_Q_OP_DESTROY, 126 RSM_INTR_Q_OP_RECEIVE, 127 RSM_INTR_Q_OP_DROP 128 } rsm_intr_q_op_t; 129 130 struct __rsm_intr_hand_arg; 131 typedef struct __rsm_intr_hand_arg *rsm_intr_hand_arg_t; 132 133 struct __rsm_registry_item; 134 typedef struct __rsm_registry_item *rsm_registry_item_t; 135 136 typedef int rsm_intr_pri_t; 137 138 typedef struct { 139 rsm_addr_t ae_addr; /* node hwaddr allowed access */ 140 rsm_permission_t ae_permission; /* permissions for node */ 141 } rsm_access_entry_t; 142 /* 143 * ae_addr can be set to the following value to mean that the permissions 144 * should apply to all nodes accessible through this RSM controller 145 */ 146 #define RSM_ACCESS_PUBLIC 0xFFFF 147 148 struct __rsm_controller_handle; 149 typedef struct __rsm_controller_handle *rsm_controller_handle_t; 150 151 /* 152 * The following typedef is used to represent a controller object. 153 */ 154 typedef struct rsm_controller_object { 155 struct rsm_ops *ops; 156 rsm_controller_handle_t handle; 157 } rsm_controller_object_t; 158 159 typedef rsm_intr_hand_ret_t (*rsm_intr_hand_t)( 160 rsm_controller_object_t *controller, 161 rsm_intr_q_op_t operation, 162 rsm_addr_t sender, 163 void *data, 164 size_t size, 165 rsm_intr_hand_arg_t arg); 166 167 typedef struct { 168 enum { RSM_MEM_VADDR, 169 RSM_MEM_BUF, 170 RSM_MEM_HANDLE, 171 RSM_MEM_INVALID } ms_type; 172 union { 173 struct { 174 void *vaddr; 175 size_t length; 176 ddi_as_handle_t as; 177 } vr; 178 struct buf *bp; 179 rsm_memseg_export_handle_t handle; 180 } ms_memory; 181 #define ms_bp ms_memory.bp 182 #define ms_vaddr ms_memory.vr.vaddr 183 #define ms_length ms_memory.vr.length 184 #define ms_as ms_memory.vr.as 185 } rsm_memory_local_t; 186 187 typedef struct { 188 rsm_memory_local_t local_mem; 189 size_t local_offset; 190 rsm_memseg_import_handle_t remote_handle; 191 size_t remote_offset; 192 size_t transfer_length; 193 } rsmpi_iovec_t; 194 195 typedef struct { 196 ulong_t io_request_count; /* size of iovec array */ 197 ulong_t io_residual_count; /* zero for success */ 198 uio_seg_t io_segflg; /* user/kernel addr */ 199 rsmpi_iovec_t *iovec; /* ptr to array */ 200 } rsmpi_scat_gath_t; 201 202 typedef struct { 203 char *attr_name; 204 rsm_addr_t attr_controller_addr; 205 uint_t attr_direct_access_sizes; 206 uint_t attr_atomic_sizes; 207 uint_t attr_error_sizes; 208 uint_t attr_error_behavior; 209 boolean_t attr_mmu_protections; 210 size_t attr_page_size; 211 size_t attr_max_export_segment_size; 212 size_t attr_tot_export_segment_size; 213 ulong_t attr_max_export_segments; 214 size_t attr_max_import_map_size; 215 size_t attr_tot_import_map_size; 216 ulong_t attr_max_import_segments; 217 boolean_t attr_io_space_exportable; 218 boolean_t attr_imported_space_ioable; 219 boolean_t attr_intr_sender_ident; 220 size_t attr_intr_data_size_max; 221 uint_t attr_intr_data_align; 222 boolean_t attr_intr_piggyback; 223 boolean_t attr_resource_callbacks; 224 } rsm_controller_attr_t; 225 226 /* 227 * The following three defines are possible values for attr_error_behavior 228 * field of the rsm_controller_attr_t struct. 229 */ 230 #define RSM_ERR_NOCHANGE 0 231 #define RSM_ERR_ZEROES 0x1 232 #define RSM_ERR_RANDOM 0x2 233 234 typedef struct rsm_ops { 235 236 /* 237 * structure revision number: 238 */ 239 uint_t rsm_version; 240 241 /* 242 * export side memory segment operations: 243 */ 244 int (*rsm_seg_create) 245 (rsm_controller_handle_t controller, 246 rsm_memseg_export_handle_t *memseg, 247 size_t size, 248 uint_t flags, 249 rsm_memory_local_t *memory, 250 rsm_resource_callback_t callback, 251 rsm_resource_callback_arg_t callback_arg); 252 int (*rsm_seg_destroy) 253 (rsm_memseg_export_handle_t handle); 254 int (*rsm_bind) 255 (rsm_memseg_export_handle_t memseg, 256 off_t offset, 257 rsm_memory_local_t *memory, 258 rsm_resource_callback_t callback, 259 rsm_resource_callback_arg_t callback_arg); 260 int (*rsm_unbind) 261 (rsm_memseg_export_handle_t memseg, 262 off_t offset, 263 size_t length); 264 int (*rsm_rebind) 265 (rsm_memseg_export_handle_t memseg, 266 off_t offset, 267 rsm_memory_local_t *memory, 268 rsm_resource_callback_t callback, 269 rsm_resource_callback_arg_t callback_arg); 270 int (*rsm_publish) 271 (rsm_memseg_export_handle_t memseg, 272 rsm_access_entry_t access_list[], 273 uint_t access_list_length, 274 rsm_memseg_id_t segment_id, 275 rsm_resource_callback_t callback, 276 rsm_resource_callback_arg_t callback_arg); 277 int (*rsm_unpublish) 278 (rsm_memseg_export_handle_t memseg); 279 int (*rsm_republish) 280 (rsm_memseg_export_handle_t memseg, 281 rsm_access_entry_t access_list[], 282 uint_t access_list_length, 283 rsm_resource_callback_t callback, 284 rsm_resource_callback_arg_t callback_arg); 285 286 /* 287 * import side memory segment operations 288 */ 289 int (*rsm_connect) 290 (rsm_controller_handle_t controller, 291 rsm_addr_t addr, 292 rsm_memseg_id_t segment_id, 293 rsm_memseg_import_handle_t *im_memseg); 294 295 int (*rsm_disconnect) 296 (rsm_memseg_import_handle_t im_memseg); 297 298 /* 299 * import side memory segment operations (read access functions): 300 */ 301 int (* rsm_get8) 302 (rsm_memseg_import_handle_t im_memseg, 303 off_t offset, 304 uint8_t *datap, 305 ulong_t rep_cnt, 306 boolean_t byte_swap); 307 int (* rsm_get16) 308 (rsm_memseg_import_handle_t im_memseg, 309 off_t offset, 310 uint16_t *datap, 311 ulong_t rep_cnt, 312 boolean_t byte_swap); 313 int (* rsm_get32) 314 (rsm_memseg_import_handle_t im_memseg, 315 off_t offset, 316 uint32_t *datap, 317 ulong_t rep_cnt, 318 boolean_t byte_swap); 319 int (* rsm_get64) 320 (rsm_memseg_import_handle_t im_memseg, 321 off_t offset, 322 uint64_t *datap, 323 ulong_t rep_cnt, 324 boolean_t byte_swap); 325 int (* rsm_get) 326 (rsm_memseg_import_handle_t im_memseg, 327 off_t offset, 328 void *datap, 329 size_t length); 330 331 /* 332 * import side memory segment operations (write access functions) 333 */ 334 int (* rsm_put8) 335 (rsm_memseg_import_handle_t im_memseg, 336 off_t offset, 337 uint8_t *datap, 338 ulong_t rep_cnt, 339 boolean_t byte_swap); 340 int (* rsm_put16) 341 (rsm_memseg_import_handle_t im_memseg, 342 off_t offset, 343 uint16_t *datap, 344 ulong_t rep_cnt, 345 boolean_t byte_swap); 346 int (* rsm_put32) 347 (rsm_memseg_import_handle_t im_memseg, 348 off_t offset, 349 uint32_t *datap, 350 ulong_t rep_cnt, 351 boolean_t byte_swap); 352 int (* rsm_put64) 353 (rsm_memseg_import_handle_t im_memseg, 354 off_t offset, 355 uint64_t *datap, 356 ulong_t rep_cnt, 357 boolean_t byte_swap); 358 int (* rsm_put) 359 (rsm_memseg_import_handle_t im_memseg, 360 off_t offset, 361 void *datap, 362 size_t length); 363 364 /* 365 * import side memory segment operations (mapping) 366 */ 367 int (*rsm_map)(rsm_memseg_import_handle_t im_memseg, 368 off_t offset, 369 size_t len, 370 size_t *maplen, 371 dev_info_t **dipp, 372 uint_t *register_number, 373 off_t *register_offset, 374 rsm_resource_callback_t callback, 375 rsm_resource_callback_arg_t callback_arg); 376 377 int (*rsm_unmap) 378 (rsm_memseg_import_handle_t im_memseg); 379 380 /* 381 * import side memory segment operations (barriers): 382 */ 383 int (* rsm_open_barrier_region) 384 (rsm_memseg_import_handle_t region, 385 rsm_barrier_t *barrier); 386 int (* rsm_open_barrier_regions) 387 (rsm_memseg_import_handle_t regions[], 388 uint_t num_regions, 389 rsm_barrier_t *barrier); 390 int (* rsm_open_barrier_node) 391 (rsm_controller_handle_t controller, 392 rsm_addr_t addr, 393 rsm_barrier_t *barrier); 394 int (* rsm_open_barrier_ctrl) 395 (rsm_controller_handle_t controller, 396 rsm_barrier_t *barrier); 397 int (* rsm_open_barrier_region_thr) 398 (rsm_memseg_import_handle_t region, 399 rsm_barrier_t *barrier); 400 int (* rsm_open_barrier_regions_thr) 401 (rsm_memseg_import_handle_t regions[], 402 uint_t num_regions, 403 rsm_barrier_t *barrier); 404 int (* rsm_open_barrier_node_thr) 405 (rsm_controller_handle_t controller, 406 rsm_addr_t addr, 407 rsm_barrier_t *barrier); 408 int (* rsm_open_barrier_ctrl_thr) 409 (rsm_controller_handle_t controller, 410 rsm_barrier_t *barrier); 411 int (* rsm_close_barrier) 412 (rsm_barrier_t *barrier); 413 int (* rsm_reopen_barrier) 414 (rsm_barrier_t *barrier); 415 int (* rsm_order_barrier) 416 (rsm_barrier_t *barrier); 417 int (* rsm_thread_init) 418 (rsm_controller_handle_t controller); 419 int (* rsm_thread_fini) 420 (rsm_controller_handle_t controller); 421 int (* rsm_get_barrier_mode) 422 (rsm_memseg_import_handle_t im_memseg, 423 rsm_barrier_mode_t *mode); 424 int (* rsm_set_barrier_mode) 425 (rsm_memseg_import_handle_t im_memseg, 426 rsm_barrier_mode_t mode); 427 428 /* 429 * sending side interrupt operations: 430 */ 431 int (* rsm_sendq_create) 432 (rsm_controller_handle_t controller, 433 rsm_addr_t addr, 434 rsm_intr_service_t service, 435 rsm_intr_pri_t pri, 436 ulong_t qdepth, 437 uint_t flags, 438 rsm_resource_callback_t callback, 439 rsm_resource_callback_arg_t arg, 440 rsm_send_q_handle_t *iqp); 441 int (* rsm_sendq_config) 442 (rsm_send_q_handle_t iq, 443 rsm_intr_pri_t pri, 444 ulong_t qdepth, 445 uint_t flags, 446 rsm_resource_callback_t callback, 447 rsm_resource_callback_arg_t arg); 448 int (* rsm_sendq_destroy) 449 (rsm_send_q_handle_t iq); 450 int (* rsm_send) 451 (rsm_send_q_handle_t iq, 452 rsm_send_t *is, 453 rsm_barrier_t *barrier); 454 455 456 /* 457 * receiving side interrupt operations: 458 */ 459 int (* rsm_register_handler) 460 (rsm_controller_handle_t controller, 461 rsm_controller_object_t *controller_obj, 462 rsm_intr_t type, 463 rsm_intr_hand_t handler, 464 rsm_intr_hand_arg_t handler_arg, 465 rsm_addr_t senders_list[], 466 uint_t senders_list_length); 467 468 int (* rsm_unregister_handler) 469 (rsm_controller_handle_t controller, 470 rsm_intr_t type, 471 rsm_intr_hand_t handler, 472 rsm_intr_hand_arg_t handler_arg); 473 474 475 /* scatter-gather I/O */ 476 int (* rsm_memseg_import_getv) 477 (rsm_controller_handle_t cp, 478 rsmpi_scat_gath_t *sg_io); 479 int (* rsm_memseg_import_putv) 480 (rsm_controller_handle_t cp, 481 rsmpi_scat_gath_t *sg_io); 482 483 /* Management operation */ 484 int (*rsm_get_peers) 485 (rsm_controller_handle_t controller, 486 rsm_addr_t *addr_list, 487 uint_t count, 488 uint_t *num_addrs); 489 490 /* Extension operation */ 491 int (*rsm_extension) 492 (rsm_controller_handle_t controller, 493 char *extname, 494 void *extobj); 495 496 } rsm_ops_t; 497 498 /* 499 * service module function templates: 500 */ 501 502 int rsm_get_controller(const char *name, uint_t number, 503 rsm_controller_object_t *controller, 504 uint_t version); 505 506 int rsm_release_controller(const char *name, uint_t number, 507 rsm_controller_object_t *controller); 508 509 int rsm_get_controller_attr(rsm_controller_handle_t, 510 rsm_controller_attr_t **attrp); 511 /* 512 * MACROS for Clients requesting services via RSMPI module 513 */ 514 515 /* 516 * Export Side segment operations 517 */ 518 519 #define RSM_SEG_CREATE(controller, memseg, size, flags, memory, callback, \ 520 callback_arg) \ 521 (*((controller).ops->rsm_seg_create)) \ 522 ((controller).handle, (memseg), (size), (flags), (memory), \ 523 (callback), (callback_arg)) 524 #define RSM_SEG_DESTROY(controller, memseg) \ 525 (*((controller).ops->rsm_seg_destroy)) \ 526 ((memseg)) 527 #define RSM_BIND(controller, memseg, offset, memory, callback, \ 528 callback_arg) \ 529 (*((controller).ops->rsm_bind)) \ 530 ((memseg), offset, (memory), (callback), (callback_arg)) 531 #define RSM_UNBIND(controller, memseg, offset, length) \ 532 (*((controller).ops->rsm_unbind)) \ 533 ((memseg), (offset), (length)) 534 #define RSM_REBIND(controller, memseg, offset, memory, callback, \ 535 callback_arg) \ 536 (*((controller).ops->rsm_rebind)) \ 537 ((memseg), offset, (memory), (callback), (callback_arg)) 538 #define RSM_PUBLISH(controller, memseg, access_list, access_list_length, \ 539 segment_id, callback, callback_arg) \ 540 (*((controller).ops->rsm_publish)) \ 541 ((memseg), access_list, access_list_length, segment_id, \ 542 (callback), (callback_arg)) 543 #define RSM_UNPUBLISH(controller, memseg) \ 544 (*((controller).ops->rsm_unpublish)) \ 545 ((memseg)) 546 #define RSM_REPUBLISH(controller, memseg, access_list, access_list_length, \ 547 callback, callback_arg) \ 548 (*((controller).ops->rsm_republish)) \ 549 ((memseg), (access_list), (access_list_length), (callback), \ 550 (callback_arg)) 551 #define RSM_CONNECT(controller, addr, segment_id, im_memseg) \ 552 (*((controller).ops->rsm_connect)) \ 553 ((controller).handle, (addr), (segment_id), (im_memseg)) 554 #define RSM_DISCONNECT(controller, im_memseg) \ 555 (*((controller).ops->rsm_disconnect)) \ 556 ((im_memseg)) 557 558 /* 559 * import side memory segment operations (read access functions) 560 */ 561 562 #define RSM_GET8(controller, im_memseg, offset, datap, rep_cnt, byte_swap) \ 563 (*((controller).ops->rsm_get8)) \ 564 ((im_memseg), (offset), (datap), (rep_cnt), (byte_swap)) 565 #define RSM_GET16(controller, im_memseg, offset, datap, rep_cnt, byte_swap) \ 566 (*((controller).ops->rsm_get16)) \ 567 ((im_memseg), (offset), (datap), (rep_cnt), (byte_swap)) 568 #define RSM_GET32(controller, im_memseg, offset, datap, rep_cnt, byte_swap) \ 569 (*((controller).ops->rsm_get32)) \ 570 ((im_memseg), (offset), (datap), (rep_cnt), (byte_swap)) 571 #define RSM_GET64(controller, im_memseg, offset, datap, rep_cnt, byte_swap) \ 572 (*((controller).ops->rsm_get64)) \ 573 ((im_memseg), (offset), (datap), (rep_cnt), (byte_swap)) 574 #define RSM_GET(controller, im_memseg, offset, dst_addr, length) \ 575 (*((controller).ops->rsm_get)) \ 576 ((im_memseg), (offset), (dst_addr), (length)) 577 578 /* 579 * import side memory segment operations (write access functions) 580 */ 581 582 #define RSM_PUT8(controller, im_memseg, offset, datap, rep_cnt, byte_swap) \ 583 (*((controller).ops->rsm_put8)) \ 584 ((im_memseg), (offset), (datap), (rep_cnt), (byte_swap)) 585 #define RSM_PUT16(controller, im_memseg, offset, datap, rep_cnt, byte_swap) \ 586 (*((controller).ops->rsm_put16)) \ 587 ((im_memseg), (offset), (datap), (rep_cnt), (byte_swap)) 588 #define RSM_PUT32(controller, im_memseg, offset, datap, rep_cnt, byte_swap) \ 589 (*((controller).ops->rsm_put32)) \ 590 ((im_memseg), (offset), (datap), (rep_cnt), (byte_swap)) 591 #define RSM_PUT64(controller, im_memseg, offset, datap, rep_cnt, byte_swap) \ 592 (*((controller).ops->rsm_put64)) \ 593 ((im_memseg), (offset), (datap), (rep_cnt), (byte_swap)) 594 #define RSM_PUT(controller, im_memseg, offset, datap, length) \ 595 (*((controller).ops->rsm_put)) \ 596 ((im_memseg), (offset), (datap), (length)) 597 598 /* 599 * import side memory segment operations (mapping): 600 */ 601 602 #define RSM_MAP(controller, im_memseg, offset, length, maplen, dipp, \ 603 dev_register, dev_offset, callback, arg) \ 604 (*((controller).ops->rsm_map)) \ 605 ((im_memseg), (offset), (length), (maplen), (dipp), (dev_register), \ 606 (dev_offset), (callback), (arg)) 607 #define RSM_UNMAP(controller, im_memseg) \ 608 (*((controller).ops->rsm_unmap)) \ 609 ((im_memseg)) 610 611 /* 612 * import side memory segment operations (barriers): 613 */ 614 615 #define RSM_OPEN_BARRIER_REGION(controller, region, barrier) \ 616 (*((controller).ops->rsm_open_barrier_region)) \ 617 ((region), (barrier)) 618 #define RSM_OPEN_BARRIER_REGIONS(controller, regions, num_regions, barrier) \ 619 (*((controller).ops->rsm_open_barrier_regions)) \ 620 ((regions), (num_regions), (barrier)) 621 #define RSM_OPEN_BARRIER_NODE(controller, addr, barrier) \ 622 (*((controller).ops-> rsm_open_barrier_node)) \ 623 ((controller).handle, (addr), (barrier)) 624 #define RSM_OPEN_BARRIER_CTRL(controller, barrier) \ 625 (*((controller).ops->rsm_open_barrier_ctrl)) \ 626 ((controller).handle, (barrier)) 627 #define RSM_OPEN_BARRIER_REGION_THR(controller, region, barrier) \ 628 (*((controller).ops->rsm_open_barrier_region_thr)) \ 629 ((region), (barrier)) 630 #define RSM_OPEN_BARRIER_REGIONS_THR(controller, regions, num_regions, barrier)\ 631 (*((controller).ops->rsm_open_barrier_regions_thr)) \ 632 ((regions), (num_regions), (barrier)) 633 #define RSM_OPEN_BARRIER_NODE_THR(controller, addr, barrier) \ 634 (*((controller).ops->rsm_open_barrier_node_thr)) \ 635 ((controller).handle, (addr), (barrier)) 636 #define RSM_OPEN_BARRIER_CTRL_THR(controller, barrier) \ 637 (*((controller).ops->rsm_open_barrier_ctrl_thr)) \ 638 ((controller).handle, (barrier)); 639 #define RSM_CLOSE_BARRIER(controller, barrier) \ 640 (*((controller).ops->rsm_close_barrier)) \ 641 ((barrier)) 642 #define RSM_REOPEN_BARRIER(controller, barrier) \ 643 (*((controller).ops->rsm_reopen_barrier)) \ 644 ((barrier)); 645 #define RSM_ORDER_BARRIER(controller, barrier) \ 646 (*((controller).ops->rsm_order_barrier)) \ 647 ((barrier)) 648 #define RSM_THREAD_INIT(controller) \ 649 (*((controller).ops->rsm_thread_init)) \ 650 ((controller).handle) 651 #define RSM_THREAD_FINI(controller) \ 652 (*((controller).ops->rsm_thread_fini)) \ 653 ((controller).handle) 654 #define RSM_GET_BARRIER_MODE(controller, im_memseg, mode) \ 655 (*((controller).ops->rsm_get_barrier_mode)) \ 656 ((im_memseg), (mode)) 657 #define RSM_SET_BARRIER_MODE(controller, im_memseg, mode) \ 658 (*((controller).ops->rsm_set_barrier_mode)) \ 659 ((im_memseg), (mode)) 660 /* 661 * sending side interrupt operations: 662 */ 663 664 #define RSM_SENDQ_CREATE(controller, addr, service, pri, qdepth, flags, \ 665 callback, arg, iqp) \ 666 (*((controller).ops->rsm_sendq_create)) \ 667 ((controller).handle, (addr), (service), (pri), (qdepth), (flags), \ 668 (callback), (arg), (iqp)) 669 #define RSM_SENDQ_CONFIG(controller, iq, pri, qdepth, flags, callback, arg) \ 670 (*((controller).ops->rsm_sendq_config)) \ 671 ((iq), (pri), (qdepth), (flags), \ 672 (callback), (arg)) 673 #define RSM_SENDQ_DESTROY(controller, iq) \ 674 (*((controller).ops->rsm_sendq_destroy)) \ 675 ((iq)) 676 #define RSM_SEND(controller, iq, is, barrier) \ 677 (*((controller).ops->rsm_send)) \ 678 ((iq), (is), (barrier)) 679 680 /* 681 * receiving side interrupt operations: 682 */ 683 #define RSM_REGISTER_HANDLER(controller, type, handler, handler_arg, \ 684 senders_list, senders_list_length) \ 685 (*((controller).ops->rsm_register_handler)) \ 686 ((controller).handle, &(controller), (type), (handler), (handler_arg), \ 687 (senders_list), (senders_list_length)) 688 #define RSM_UNREGISTER_HANDLER(controller, type, handler, handler_arg) \ 689 (*((controller).ops->rsm_unregister_handler)) \ 690 ((controller).handle, (type), (handler), (handler_arg)) 691 #define RSM_GETV(controller, sg_io) \ 692 (*((controller).ops->rsm_memseg_import_getv)) \ 693 ((controller).handle, (sg_io)) 694 #define RSM_PUTV(controller, sg_io) \ 695 (*((controller).ops->rsm_memseg_import_putv)) \ 696 ((controller).handle, (sg_io)) 697 #define RSM_GET_PEERS(controller, addr_list, count, num_addrs) \ 698 (*((controller).ops->rsm_get_peers)) \ 699 ((controller).handle, (addr_list), (count), (num_addrs)) 700 #define RSM_EXTENSION(controller, extname, extobj) \ 701 (*((controller).ops->rsm_extension)) \ 702 ((controller).handle, (extname), (extobj)) 703 704 #ifdef __cplusplus 705 } 706 #endif 707 708 709 #endif /* _SYS_RSM_RSMPI_H */ 710