1/*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License, Version 1.0 only
6 * (the "License").  You may not use this file except in compliance
7 * with the License.
8 *
9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10 * or http://www.opensolaris.org/os/licensing.
11 * See the License for the specific language governing permissions
12 * and limitations under the License.
13 *
14 * When distributing Covered Code, include this CDDL HEADER in each
15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16 * If applicable, add the following below this CDDL HEADER, with the
17 * fields enclosed by brackets "[]" replaced with your own identifying
18 * information: Portions Copyright [yyyy] [name of copyright owner]
19 *
20 * CDDL HEADER END
21 */
22/*
23 * Copyright 2001-2002 Sun Microsystems, Inc.  All rights reserved.
24 * Use is subject to license terms.
25 */
26
27#ifndef _SYS_RSM_RSMNDI_H
28#define	_SYS_RSM_RSMNDI_H
29
30#pragma ident	"%Z%%M%	%I%	%E% SMI"
31
32#ifdef	__cplusplus
33extern "C" {
34#endif
35
36#include <sys/types.h>
37#include <sys/mman.h>
38#include <sys/stat.h>
39#include <fcntl.h>
40#include <thread.h>
41#include <synch.h>
42#include <sys/rsm/rsm_common.h>
43#include <sys/rsm/rsmapi_common.h>
44
45/*
46 * This structure defines the functions implemented in rsmlib
47 * that the NDI library can call.
48 */
49typedef struct {
50	int	version;
51#define	RSM_LIB_FUNCS_VERSION	1
52	int	(* rsm_get_hwaddr)(
53	    rsmapi_controller_handle_t handle,
54	    rsm_node_id_t nodeid,
55	    rsm_addr_t *hwaddrp);
56	int	(* rsm_get_nodeid)(
57	    rsmapi_controller_handle_t handle,
58	    rsm_addr_t hwaddr,
59	    rsm_node_id_t *nodeidp);
60} rsm_lib_funcs_t;
61
62/* Library attributes - set by specific NDI libraries */
63typedef struct {
64	boolean_t	rsm_putget_map_reqd;	/* put/get require mapping */
65	boolean_t	rsm_scatgath_map_reqd;	/* putv/getv require mapping */
66} rsm_ndlib_attr_t;
67
68/* The opaque barrier handle used by the RSMNDI plugin for the barrier calls */
69typedef struct rsm_barrier *rsm_barrier_handle_t;
70
71typedef struct {
72
73	/*
74	 * structure revision number:
75	 */
76	int rsm_version;
77
78	/*
79	 * import side memory segment operations
80	 */
81	int (* rsm_memseg_import_connect)
82	    (rsmapi_controller_handle_t controller,
83	    rsm_node_id_t node_id,
84	    rsm_memseg_id_t segment_id,
85	    rsm_permission_t perm,
86	    rsm_memseg_import_handle_t *im_memseg);
87	int (* rsm_memseg_import_disconnect)
88	    (rsm_memseg_import_handle_t im_memseg);
89
90	/*
91	 * import side memory segment operations (read access functions):
92	 */
93	int (* rsm_memseg_import_get8)
94	    (rsm_memseg_import_handle_t im_memseg,
95	    off_t offset,
96	    uint8_t *datap,
97	    ulong_t rep_cnt,
98	    boolean_t swap);
99	int (* rsm_memseg_import_get16)
100	    (rsm_memseg_import_handle_t im_memseg,
101	    off_t offset,
102	    uint16_t *datap,
103	    ulong_t rep_cnt,
104	    boolean_t swap);
105	int (* rsm_memseg_import_get32)
106	    (rsm_memseg_import_handle_t im_memseg,
107	    off_t offset,
108	    uint32_t *datap,
109	    ulong_t rep_cnt,
110	    boolean_t swap);
111	int (* rsm_memseg_import_get64)
112	    (rsm_memseg_import_handle_t im_memseg,
113	    off_t offset,
114	    uint64_t *datap,
115	    ulong_t rep_cnt,
116	    boolean_t swap);
117	int (* rsm_memseg_import_get)
118	    (rsm_memseg_import_handle_t im_memseg,
119	    off_t offset,
120	    void *dst_addr,
121	    size_t length);
122
123	/*
124	 * import side memory segment operations (read access functions):
125	 */
126	int (* rsm_memseg_import_put8)
127	    (rsm_memseg_import_handle_t im_memseg,
128	    off_t offset,
129	    uint8_t *datap,
130	    ulong_t rep_cnt,
131	    boolean_t swap);
132	int (* rsm_memseg_import_put16)
133	    (rsm_memseg_import_handle_t im_memseg,
134	    off_t offset,
135	    uint16_t *datap,
136	    ulong_t rep_cnt,
137	    boolean_t swap);
138	int (* rsm_memseg_import_put32)
139	    (rsm_memseg_import_handle_t im_memseg,
140	    off_t offset,
141	    uint32_t *datap,
142	    ulong_t rep_cnt,
143	    boolean_t swap);
144	int (* rsm_memseg_import_put64)
145	    (rsm_memseg_import_handle_t im_memseg,
146	    off_t offset,
147	    uint64_t *datap,
148	    ulong_t rep_cnt,
149	    boolean_t swap);
150	int (* rsm_memseg_import_put)
151	    (rsm_memseg_import_handle_t im_memseg,
152	    off_t offset,
153	    void *src_addr,
154	    size_t length);
155
156	/*
157	 * import side memory segment operations (barriers):
158	 */
159	int (* rsm_memseg_import_init_barrier)
160	    (rsm_memseg_import_handle_t im_memseg,
161	    rsm_barrier_type_t type,
162	    rsm_barrier_handle_t barrier);
163
164	int (* rsm_memseg_import_open_barrier)(rsm_barrier_handle_t barrier);
165
166	int (* rsm_memseg_import_order_barrier)(rsm_barrier_handle_t barrier);
167
168	int (* rsm_memseg_import_close_barrier)(rsm_barrier_handle_t barrier);
169
170	int (* rsm_memseg_import_destroy_barrier)(rsm_barrier_handle_t barrier);
171
172	int (* rsm_memseg_import_get_mode)
173	    (rsm_memseg_import_handle_t im_memseg,
174	    rsm_barrier_mode_t *mode);
175
176	int (* rsm_memseg_import_set_mode)
177	    (rsm_memseg_import_handle_t im_memseg,
178	    rsm_barrier_mode_t mode);
179
180
181	/*
182	 * import side memory segment data transfer operations.
183	 */
184	int (* rsm_memseg_import_putv)(rsm_scat_gath_t *sg_io);
185	int (* rsm_memseg_import_getv)(rsm_scat_gath_t *sg_io);
186
187	int (* rsm_create_localmemory_handle)
188	    (rsmapi_controller_handle_t controller,
189	    rsm_localmemory_handle_t *local_handle_p,
190	    caddr_t local_vaddr, size_t len);
191
192	int (* rsm_free_localmemory_handle)
193	    (rsm_localmemory_handle_t local_handle);
194
195	int (* rsm_register_lib_funcs)
196	    (rsm_lib_funcs_t *libfuncs);
197	int (* rsm_get_lib_attr)
198	    (rsm_ndlib_attr_t **libattr);
199	int (* rsm_closedevice)
200	    (rsmapi_controller_handle_t controller);
201} rsm_segops_t;
202
203#define	RSM_LIB_VERSION	1
204
205/* library internal controller attribute structure */
206typedef struct {
207	/* following fields should be identical to rsmapi_controller_attr_t */
208	uint_t		attr_direct_access_sizes;
209	uint_t		attr_atomic_sizes;
210	size_t		attr_page_size;
211	size_t		attr_max_export_segment_size;
212	size_t		attr_tot_export_segment_size;
213	ulong_t		attr_max_export_segments;
214	size_t		attr_max_import_map_size;
215	size_t		attr_tot_import_map_size;
216	ulong_t		attr_max_import_segments;
217	/* following fields are for internal use */
218	rsm_addr_t	attr_controller_addr;
219} rsm_int_controller_attr_t;
220
221typedef struct rsm_controller {
222	void			*cntr_privdata;
223	struct rsm_controller	*cntr_next;
224	int			cntr_fd;
225	int			cntr_refcnt;
226	int			cntr_unit;
227	char			*cntr_name;	/* generic type eg. sci   */
228	rsm_segops_t		*cntr_segops;
229	struct rsmqueue		*cntr_rqlist;	/* list of receive queues */
230	rsm_int_controller_attr_t	cntr_attr;
231	rsm_ndlib_attr_t	*cntr_lib_attr;
232	mutex_t			cntr_lock;
233	cond_t			cntr_cv;
234} rsm_controller_t;
235
236
237typedef enum {
238	EXPORT_CREATE = 0x1,
239	EXPORT_BIND,
240	EXPORT_PUBLISH,
241	IMPORT_CONNECT,
242	IMPORT_DISCONNECT,
243	IMPORT_MAP,
244	IMPORT_UNMAP
245} rsm_seg_state_t;
246
247typedef struct {
248	void		*rsmseg_privdata;
249	rsm_segops_t	*rsmseg_ops;
250	rsm_seg_state_t	rsmseg_state;
251	caddr_t		rsmseg_vaddr;	/* base address of segment */
252	size_t		rsmseg_size;	/* size of segment */
253	size_t		rsmseg_maplen;	/* length of mapped region */
254	rsm_node_id_t	rsmseg_nodeid;
255	rsm_memseg_id_t	rsmseg_keyid;
256	int		rsmseg_fd;
257	int		rsmseg_pollfd_refcnt;
258	rsm_permission_t rsmseg_perm;
259	rsm_controller_t *rsmseg_controller;
260	rsm_barrier_mode_t rsmseg_barmode;
261	void		*rsmseg_data;
262	uint16_t	*rsmseg_bar;
263	uint16_t	rsmseg_gnum;	/* generation number */
264	int		rsmseg_type;
265	mutex_t		rsmseg_lock;
266	rsmapi_barrier_t	*rsmseg_barrier; /* used in put/get routines */
267	offset_t	rsmseg_mapoffset; /* seg offset where mmapped */
268	uint32_t	rsmseg_flags;
269	minor_t		rsmseg_rnum; /* resource number of the segment */
270} rsmseg_handle_t;
271
272/*
273 * defines for rsmseg_flags
274 */
275#define	RSM_IMPLICIT_MAP	0x00000001	/* segment mapped implicitly */
276
277/* This is a template for all barrier implementations */
278typedef struct {
279	rsmseg_handle_t	*rsmbar_seg;
280	uint16_t	rsmbar_gen; /* generation number */
281	void		*rsmbar_privdata;
282} rsmbar_handle_t;
283
284/*
285 * These macros set and get the private data pointer in the opaque barrier
286 * structure for Network plugins.
287 */
288#define	RSMNDI_BARRIER_SETPRIV(HANDLE, ADDR) \
289		((rsmbar_handle_t *)HANDLE)->rsmbar_privdata = (void *)ADDR;
290
291#define	RSMNDI_BARRIER_GETPRIV(HANDLE) \
292		((rsmbar_handle_t *)HANDLE)->rsmbar_privdata
293
294#define	RSMNDI_BARRIER_GETSEG(HANDLE)	\
295		((rsmbar_handle_t *)HANDLE)->rsmbar_seg
296
297#define	RSMNDI_BARRIER_GETUNIT(HANDLE)	\
298	((rsmbar_handle_t *)HANDLE)->rsmbar_seg->rsmseg_controller->cntr_unit
299
300/*
301 * These macros set and get the private data pointer in the opaque segment
302 * structure for Network plugins.
303 */
304#define	RSMNDI_SEG_SETPRIV(HANDLE, ADDR) \
305		((rsmseg_handle_t *)HANDLE)->rsmseg_privdata = (void *)ADDR;
306
307#define	RSMNDI_SEG_GETPRIV(HANDLE) \
308		((rsmseg_handle_t *)HANDLE)->rsmseg_privdata
309
310/*
311 * Get the controller unit number from a opaque segment structure.
312 */
313
314#define	RSMNDI_SEG_GETUNIT(HANDLE) \
315		((rsmseg_handle_t *)HANDLE)->rsmseg_controller->cntr_unit
316
317/*
318 * These macros set and get the private data pointer in the opaque controller
319 * structure for Network plugins.
320 */
321#define	RSMNDI_CNTRLR_SETPRIV(HANDLE, ADDR) \
322		((rsm_controller_t *)HANDLE)->cntr_privdata = (void *)ADDR;
323
324#define	RSMNDI_CNTRLR_GETPRIV(HANDLE) \
325		((rsm_controller_t *)HANDLE)->cntr_privdata
326
327/*
328 * Get the controller unit number from a opaque controller structure.
329 */
330#define	RSMNDI_CNTRLR_GETUNIT(HANDLE) \
331		((rsm_controller_t *)HANDLE)->cntr_unit
332
333/*
334 * This macro returns an address inside a segment given the segment handle
335 * and a byte offset.
336 */
337#define	RSMNDI_GET_MAPADDR(HANDLE, OFFSET) \
338		(((rsmseg_handle_t *)HANDLE)->rsmseg_vaddr + OFFSET)
339
340#ifdef	__cplusplus
341}
342#endif
343
344#endif	/* _SYS_RSM_RSMNDI_H */
345