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