#ifndef _SYS_RSM_RSMNDI_H
#define _SYS_RSM_RSMNDI_H
#ifdef __cplusplus
extern "C" {
#endif
#include <sys/types.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <thread.h>
#include <synch.h>
#include <sys/rsm/rsm_common.h>
#include <sys/rsm/rsmapi_common.h>
typedef struct {
int version;
#define RSM_LIB_FUNCS_VERSION 1
int (* rsm_get_hwaddr)(
rsmapi_controller_handle_t handle,
rsm_node_id_t nodeid,
rsm_addr_t *hwaddrp);
int (* rsm_get_nodeid)(
rsmapi_controller_handle_t handle,
rsm_addr_t hwaddr,
rsm_node_id_t *nodeidp);
} rsm_lib_funcs_t;
typedef struct {
boolean_t rsm_putget_map_reqd;
boolean_t rsm_scatgath_map_reqd;
} rsm_ndlib_attr_t;
typedef struct rsm_barrier *rsm_barrier_handle_t;
typedef struct {
int rsm_version;
int (* rsm_memseg_import_connect)
(rsmapi_controller_handle_t controller,
rsm_node_id_t node_id,
rsm_memseg_id_t segment_id,
rsm_permission_t perm,
rsm_memseg_import_handle_t *im_memseg);
int (* rsm_memseg_import_disconnect)
(rsm_memseg_import_handle_t im_memseg);
int (* rsm_memseg_import_get8)
(rsm_memseg_import_handle_t im_memseg,
off_t offset,
uint8_t *datap,
ulong_t rep_cnt,
boolean_t swap);
int (* rsm_memseg_import_get16)
(rsm_memseg_import_handle_t im_memseg,
off_t offset,
uint16_t *datap,
ulong_t rep_cnt,
boolean_t swap);
int (* rsm_memseg_import_get32)
(rsm_memseg_import_handle_t im_memseg,
off_t offset,
uint32_t *datap,
ulong_t rep_cnt,
boolean_t swap);
int (* rsm_memseg_import_get64)
(rsm_memseg_import_handle_t im_memseg,
off_t offset,
uint64_t *datap,
ulong_t rep_cnt,
boolean_t swap);
int (* rsm_memseg_import_get)
(rsm_memseg_import_handle_t im_memseg,
off_t offset,
void *dst_addr,
size_t length);
int (* rsm_memseg_import_put8)
(rsm_memseg_import_handle_t im_memseg,
off_t offset,
uint8_t *datap,
ulong_t rep_cnt,
boolean_t swap);
int (* rsm_memseg_import_put16)
(rsm_memseg_import_handle_t im_memseg,
off_t offset,
uint16_t *datap,
ulong_t rep_cnt,
boolean_t swap);
int (* rsm_memseg_import_put32)
(rsm_memseg_import_handle_t im_memseg,
off_t offset,
uint32_t *datap,
ulong_t rep_cnt,
boolean_t swap);
int (* rsm_memseg_import_put64)
(rsm_memseg_import_handle_t im_memseg,
off_t offset,
uint64_t *datap,
ulong_t rep_cnt,
boolean_t swap);
int (* rsm_memseg_import_put)
(rsm_memseg_import_handle_t im_memseg,
off_t offset,
void *src_addr,
size_t length);
int (* rsm_memseg_import_init_barrier)
(rsm_memseg_import_handle_t im_memseg,
rsm_barrier_type_t type,
rsm_barrier_handle_t barrier);
int (* rsm_memseg_import_open_barrier)(rsm_barrier_handle_t barrier);
int (* rsm_memseg_import_order_barrier)(rsm_barrier_handle_t barrier);
int (* rsm_memseg_import_close_barrier)(rsm_barrier_handle_t barrier);
int (* rsm_memseg_import_destroy_barrier)(rsm_barrier_handle_t barrier);
int (* rsm_memseg_import_get_mode)
(rsm_memseg_import_handle_t im_memseg,
rsm_barrier_mode_t *mode);
int (* rsm_memseg_import_set_mode)
(rsm_memseg_import_handle_t im_memseg,
rsm_barrier_mode_t mode);
int (* rsm_memseg_import_putv)(rsm_scat_gath_t *sg_io);
int (* rsm_memseg_import_getv)(rsm_scat_gath_t *sg_io);
int (* rsm_create_localmemory_handle)
(rsmapi_controller_handle_t controller,
rsm_localmemory_handle_t *local_handle_p,
caddr_t local_vaddr, size_t len);
int (* rsm_free_localmemory_handle)
(rsm_localmemory_handle_t local_handle);
int (* rsm_register_lib_funcs)
(rsm_lib_funcs_t *libfuncs);
int (* rsm_get_lib_attr)
(rsm_ndlib_attr_t **libattr);
int (* rsm_closedevice)
(rsmapi_controller_handle_t controller);
} rsm_segops_t;
#define RSM_LIB_VERSION 1
typedef struct {
uint_t attr_direct_access_sizes;
uint_t attr_atomic_sizes;
size_t attr_page_size;
size_t attr_max_export_segment_size;
size_t attr_tot_export_segment_size;
ulong_t attr_max_export_segments;
size_t attr_max_import_map_size;
size_t attr_tot_import_map_size;
ulong_t attr_max_import_segments;
rsm_addr_t attr_controller_addr;
} rsm_int_controller_attr_t;
typedef struct rsm_controller {
void *cntr_privdata;
struct rsm_controller *cntr_next;
int cntr_fd;
int cntr_refcnt;
int cntr_unit;
char *cntr_name;
rsm_segops_t *cntr_segops;
struct rsmqueue *cntr_rqlist;
rsm_int_controller_attr_t cntr_attr;
rsm_ndlib_attr_t *cntr_lib_attr;
mutex_t cntr_lock;
cond_t cntr_cv;
} rsm_controller_t;
typedef enum {
EXPORT_CREATE = 0x1,
EXPORT_BIND,
EXPORT_PUBLISH,
IMPORT_CONNECT,
IMPORT_DISCONNECT,
IMPORT_MAP,
IMPORT_UNMAP
} rsm_seg_state_t;
typedef struct {
void *rsmseg_privdata;
rsm_segops_t *rsmseg_ops;
rsm_seg_state_t rsmseg_state;
caddr_t rsmseg_vaddr;
size_t rsmseg_size;
size_t rsmseg_maplen;
rsm_node_id_t rsmseg_nodeid;
rsm_memseg_id_t rsmseg_keyid;
int rsmseg_fd;
int rsmseg_pollfd_refcnt;
rsm_permission_t rsmseg_perm;
rsm_controller_t *rsmseg_controller;
rsm_barrier_mode_t rsmseg_barmode;
void *rsmseg_data;
uint16_t *rsmseg_bar;
uint16_t rsmseg_gnum;
int rsmseg_type;
mutex_t rsmseg_lock;
rsmapi_barrier_t *rsmseg_barrier;
offset_t rsmseg_mapoffset;
uint32_t rsmseg_flags;
minor_t rsmseg_rnum;
} rsmseg_handle_t;
#define RSM_IMPLICIT_MAP 0x00000001
typedef struct {
rsmseg_handle_t *rsmbar_seg;
uint16_t rsmbar_gen;
void *rsmbar_privdata;
} rsmbar_handle_t;
#define RSMNDI_BARRIER_SETPRIV(HANDLE, ADDR) \
((rsmbar_handle_t *)HANDLE)->rsmbar_privdata = (void *)ADDR;
#define RSMNDI_BARRIER_GETPRIV(HANDLE) \
((rsmbar_handle_t *)HANDLE)->rsmbar_privdata
#define RSMNDI_BARRIER_GETSEG(HANDLE) \
((rsmbar_handle_t *)HANDLE)->rsmbar_seg
#define RSMNDI_BARRIER_GETUNIT(HANDLE) \
((rsmbar_handle_t *)HANDLE)->rsmbar_seg->rsmseg_controller->cntr_unit
#define RSMNDI_SEG_SETPRIV(HANDLE, ADDR) \
((rsmseg_handle_t *)HANDLE)->rsmseg_privdata = (void *)ADDR;
#define RSMNDI_SEG_GETPRIV(HANDLE) \
((rsmseg_handle_t *)HANDLE)->rsmseg_privdata
#define RSMNDI_SEG_GETUNIT(HANDLE) \
((rsmseg_handle_t *)HANDLE)->rsmseg_controller->cntr_unit
#define RSMNDI_CNTRLR_SETPRIV(HANDLE, ADDR) \
((rsm_controller_t *)HANDLE)->cntr_privdata = (void *)ADDR;
#define RSMNDI_CNTRLR_GETPRIV(HANDLE) \
((rsm_controller_t *)HANDLE)->cntr_privdata
#define RSMNDI_CNTRLR_GETUNIT(HANDLE) \
((rsm_controller_t *)HANDLE)->cntr_unit
#define RSMNDI_GET_MAPADDR(HANDLE, OFFSET) \
(((rsmseg_handle_t *)HANDLE)->rsmseg_vaddr + OFFSET)
#ifdef __cplusplus
}
#endif
#endif