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