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 (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21/*
22 * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
23 * Use is subject to license terms.
24 */
25
26#ifndef	_SYS_NSCTL_H
27#define	_SYS_NSCTL_H
28
29#ifdef	__cplusplus
30extern "C" {
31#endif
32
33#if (defined(lint) || defined(OSDEBUG)) && defined(_KERNEL)
34#define	__NSC_GEN__
35#include <sys/ksynch.h>
36#include <sys/nsctl/nsc_dev.h>
37#include <sys/nsctl/nsc_gen.h>
38#include <sys/nsctl/nsc_mem.h>
39#include <sys/nsctl/nsc_rmspin.h>
40#endif
41
42
43/*
44 * nsctl multi-terabyte volume support
45 *
46 * To build a multi-terabyte stack, '#define NSC_MULTI_TERABYTE'.
47 */
48
49#ifdef NSC_MULTI_TERABYTE
50typedef uint64_t	nsc_off_t;	/* positions, offsets */
51typedef uint64_t	nsc_size_t;	/* lengths, sizes */
52#ifdef _LP64
53#define	NSC_SZFMT	"lu"
54#define	NSC_XSZFMT	"lx"
55#else
56#define	NSC_SZFMT	"llu"
57#define	NSC_XSZFMT	"llx"
58#endif
59
60#else	/* max 1TB volume size */
61typedef int		nsc_off_t;
62typedef int		nsc_size_t;
63#define	NSC_SZFMT	"u"
64#define	NSC_XSZFMT	"x"
65#endif
66
67
68#ifdef _KERNEL
69
70#ifdef sun
71#include <sys/nsc_ddi.h>
72#endif
73
74/*
75 * Generic parameter definition.
76 */
77
78typedef struct nsc_def_s {
79	char	*name;			/* Parameter name */
80	uintptr_t value;		/* Parameter value */
81	int	offset;			/* Structure offset */
82} nsc_def_t;
83
84extern int nsc_inval(), nsc_ioerr();
85extern int nsc_fatal(), nsc_null(), nsc_true();
86extern void nsc_decode_param(nsc_def_t *, nsc_def_t *, long *);
87#endif	/* _KERNEL */
88
89
90/* ID and Type flags */
91
92#define	NSC_ID		0x40000000	/* Module ID */
93#define	NSC_NULL	0x00000100	/* No I/O possible */
94#define	NSC_DEVICE	0x00000200	/* Device interface */
95#define	NSC_FILE	0x00000400	/* File vnode interface */
96#define	NSC_CACHE	0x00000800	/* Cache interface */
97#define	NSC_ANON	0x00001000	/* Supports anonymous buffers */
98#define	NSC_VCHR	0x00002000	/* VCHR vnode device */
99#define	NSC_NCALL	0x00004000	/* ncall-io interface */
100
101#define	NSC_IDS		0x7ff00000	/* ID mask */
102#define	NSC_TYPES	0x7fffff00	/* Type mask */
103
104#define	NSC_MKID(x)	(NSC_ID | ((x) << 20))
105
106#define	NSC_RAW_ID  	NSC_MKID(39)	/* Raw device */
107#define	NSC_FILE_ID	NSC_MKID(40)	/* File vnode device */
108#define	NSC_FREEZE_ID	NSC_MKID(41)	/* Frozen raw device */
109#define	NSC_VCHR_ID	NSC_MKID(42)	/* VCHR vnode device */
110#define	NSC_NCALL_ID	NSC_MKID(43)	/* ncall-io */
111#define	NSC_SDBC_ID	NSC_MKID(80)	/* Block based cache */
112#define	NSC_RDCLR_ID	NSC_MKID(94)	/* RDC (low, raw) */
113#define	NSC_RDCL_ID	NSC_MKID(95)	/* RDC (low, cache) */
114#define	NSC_IIR_ID	NSC_MKID(96)	/* Instant Image (raw) */
115#define	NSC_II_ID	NSC_MKID(98)	/* Instant Image */
116#define	NSC_RDCHR_ID	NSC_MKID(99)	/* RDC (high, raw) */
117#define	NSC_RDCH_ID	NSC_MKID(100)	/* RDC (high, cache) */
118
119typedef enum nsc_power_ops_e {
120	Power_Lost,	/* Power Failing initial warning */
121			/* with timeleft (rideout) minutes */
122
123	Power_OK,	/* Power OK or restored before death */
124
125	Power_Down 	/* that's all folks machine will */
126			/* be shutdown, save any state */
127} nsc_power_ops_t;
128
129#ifdef _KERNEL
130
131/* Module Flags */
132
133#define	NSC_REFCNT	0x00000001	/* Counts references */
134#define	NSC_FILTER	0x00000002	/* Uses lower level driver */
135
136
137#ifndef _NSC_DEV_H
138typedef struct nsc_io_s { int x; } nsc_io_t;
139typedef struct nsc_path_s { int x; } nsc_path_t;
140#endif
141
142extern nsc_io_t *nsc_register_io(char *, int, nsc_def_t *);
143extern int nsc_unregister_io(nsc_io_t *, int);
144extern nsc_path_t *nsc_register_path(char *, int, nsc_io_t *);
145extern int nsc_unregister_path(nsc_path_t *, int);
146extern int nsc_cache_sizes(int *, int *);
147extern int nsc_node_hints(unsigned int *);
148extern int nsc_node_hints_set(unsigned int);
149extern blind_t nsc_register_power(char *, nsc_def_t *);
150extern int nsc_unregister_power(blind_t);
151
152/*
153 *  Strategy function interface
154 */
155#ifndef DS_DDICT
156typedef int (*strategy_fn_t)(struct buf *);
157#endif
158extern strategy_fn_t    nsc_get_strategy(major_t);
159
160extern void *nsc_get_devops(major_t);
161
162#endif /* _KERNEL */
163
164
165/* Block sizes */
166
167#define	FBA_SHFT	9
168#define	FBA_MASK	0x1ff
169#define	FBA_SIZE(x)	((x) << FBA_SHFT)		/* fba to bytes */
170#define	FBA_OFF(x)	((x) & FBA_MASK)		/* byte offset */
171#define	FBA_LEN(x)	FBA_NUM((x) + FBA_MASK)		/* len to fba */
172#define	FBA_NUM(x)	((nsc_size_t)((uint64_t)(x) >> FBA_SHFT))
173							/* bytes to fba */
174
175
176/* Return values */
177
178#define	NSC_DONE	(0)
179#define	NSC_PENDING  	(-1)
180#define	NSC_HIT		(-2)
181
182
183#if defined(_KERNEL) || defined(_KMEMUSER)
184
185/*
186 * External file descriptor.
187 */
188
189#ifndef _NSC_DEV_H
190typedef struct nsc_fd_s { int x; } nsc_fd_t;
191#endif
192
193#endif /* _KERNEL || _KMEMUSER */
194
195
196#ifdef _KERNEL
197
198#define	NSC_TRY		(1<<24)		/* Conditional operation */
199#define	NSC_PCATCH	(1<<25)		/* Catch signals */
200#define	NSC_DEFER	(1<<26)		/* Defer if busy */
201#define	NSC_MULTI	(1<<27)		/* Multiple reserves */
202#define	NSC_NOWAIT	(1<<28)		/* Don't wait if busy */
203
204extern nsc_fd_t *nsc_open(char *, int, nsc_def_t *, blind_t, int *);
205extern int nsc_close(nsc_fd_t *);
206extern char *nsc_pathname(nsc_fd_t *);
207extern int nsc_fdpathcmp(nsc_fd_t *, uint64_t, char *);
208extern int nsc_shared(nsc_fd_t *);
209extern int nsc_setval(nsc_fd_t *, char *, int);
210extern int nsc_getval(nsc_fd_t *, char *, int *);
211extern int nsc_set_trksize(nsc_fd_t *, nsc_size_t);
212extern int nsc_discard_pinned(nsc_fd_t *, nsc_off_t, nsc_size_t);
213extern kmutex_t *nsc_lock_addr(nsc_fd_t *);
214extern int nsc_attach(nsc_fd_t *, int);
215extern int nsc_reserve(nsc_fd_t *, int);
216extern void nsc_reserve_lk(nsc_fd_t *);
217extern void nsc_release(nsc_fd_t *);
218extern int nsc_release_lk(nsc_fd_t *);
219extern int nsc_detach(nsc_fd_t *, int);
220extern int nsc_avail(nsc_fd_t *);
221extern int nsc_held(nsc_fd_t *);
222extern int nsc_waiting(nsc_fd_t *);
223extern int nsc_partsize(nsc_fd_t *, nsc_size_t *);
224extern int nsc_maxfbas(nsc_fd_t *, int, nsc_size_t *);
225extern int nsc_get_pinned(nsc_fd_t *);
226extern int nsc_max_devices(void);
227extern int nsc_control(nsc_fd_t *, int, void *, int);
228
229#endif /* _KERNEL */
230
231
232#if defined(_KERNEL) || defined(_KMEMUSER)
233
234/*
235 * I/O device structure.
236 */
237
238#ifndef _NSC_DEV_H
239typedef struct nsc_iodev_s { int x; } nsc_iodev_t;
240#endif
241
242#ifdef _KERNEL
243extern void nsc_set_owner(nsc_fd_t *, nsc_iodev_t *);
244extern void nsc_pinned_data(nsc_iodev_t *, nsc_off_t, nsc_size_t);
245extern void nsc_unpinned_data(nsc_iodev_t *, nsc_off_t, nsc_size_t);
246#endif
247
248
249/*
250 * Data structures used by I/O interface.
251 */
252
253typedef struct nsc_vec_s {		/* Scatter gather element */
254	unsigned char	*sv_addr;	/* Virtual address of data */
255	unsigned long	sv_vme;		/* VME address of data */
256	int		sv_len;		/* Data length in bytes */
257} nsc_vec_t;
258
259
260typedef struct nsc_buf_s {		/* Buffer structure */
261	nsc_fd_t *sb_fd;		/* File descriptor */
262	nsc_off_t sb_pos;		/* Block offset of data */
263	nsc_size_t sb_len;		/* Length of data in blocks */
264	volatile int sb_flag;		/* Buffer flags */
265	int sb_error;			/* Error code */
266	uintptr_t sb_user;		/* User definable */
267	nsc_vec_t *sb_vec;		/* Scatter gather list */
268} nsc_buf_t;
269
270#endif /* _KERNEL || _KMEMUSER */
271
272
273/* Allocate flags */
274
275#define	NSC_RDBUF	0x0001
276#define	NSC_WRBUF	0x0002
277#define	NSC_PINNABLE	0x0004
278#define	NSC_NOBLOCK	0x0008
279
280#define	NSC_READ	(NSC_RDBUF)
281#define	NSC_WRITE	(NSC_WRBUF)
282#define	NSC_RDWR	(NSC_RDBUF | NSC_WRBUF)
283#define	NSC_RDWRBUF	(NSC_RDBUF | NSC_WRBUF)
284
285
286/* Other flags */
287
288#define	NSC_CACHEBLK	0x0008	/* nsc_maxfbas: size of cache block in fbas */
289#define	NSC_HALLOCATED	0x0010	/* handle allocated (IO provider internals) */
290#define	NSC_HACTIVE	0x0020	/* handle active (IO provider internals) */
291#define	NSC_BCOPY	0x0040	/* bcopy, don't DMA when moving data */
292#define	NSC_PAGEIO	0x0080	/* client will use handle for pageio */
293#define	NSC_ABUF	0x0100	/* anonymous buffer handle */
294#define	NSC_MIXED	0x0200	/* data from 2 devs is mixed in this buffer */
295#define	NSC_NODATA	0x0400	/* allocate without data buffer (sb_vec) */
296
297
298#define	NSC_FLAGS	0xffff
299
300#ifdef _KERNEL
301
302#define	NSC_ANON_CD	((blind_t)(-1)) /* used for IO provider alloc buf */
303
304extern int nsc_alloc_buf(nsc_fd_t *, nsc_off_t, nsc_size_t, int, nsc_buf_t **);
305extern int nsc_alloc_abuf(nsc_off_t, nsc_size_t, int, nsc_buf_t **);
306extern int nsc_read(nsc_buf_t *, nsc_off_t, nsc_size_t, int);
307extern int nsc_write(nsc_buf_t *, nsc_off_t, nsc_size_t, int);
308extern int nsc_zero(nsc_buf_t *, nsc_off_t, nsc_size_t, int);
309extern int nsc_copy(nsc_buf_t *, nsc_buf_t *, nsc_off_t, nsc_off_t, nsc_size_t);
310extern int nsc_copy_direct(nsc_buf_t *, nsc_buf_t *, nsc_off_t,
311    nsc_off_t, nsc_size_t);
312extern int nsc_uncommit(nsc_buf_t *, nsc_off_t, nsc_size_t, int);
313extern int nsc_free_buf(nsc_buf_t *);
314extern nsc_buf_t *nsc_alloc_handle(nsc_fd_t *,
315	void (*)(), void (*)(), void (*)());
316extern int nsc_free_handle(nsc_buf_t *);
317extern int nsc_uread(nsc_fd_t *, void *, void *);
318extern int nsc_uwrite(nsc_fd_t *, void *, void *);
319
320#endif /* _KERNEL */
321
322
323/*
324 * Performance hints.
325 */
326
327#define	NSC_WRTHRU		0x00010000
328#define	NSC_FORCED_WRTHRU  	0x00020000
329#define	NSC_NOCACHE		0x00040000
330#define	NSC_QUEUE		0x00080000
331#define	NSC_RDAHEAD		0x00100000
332#define	NSC_NO_FORCED_WRTHRU	0x00200000
333#define	NSC_METADATA		0x00400000
334#define	NSC_SEQ_IO		0x00800000
335
336#define	NSC_HINTS		0x00ff0000
337
338
339#ifdef _KERNEL
340/*
341 * node hint actions
342 */
343
344#define	NSC_GET_NODE_HINT	0
345#define	NSC_SET_NODE_HINT	1
346#define	NSC_CLEAR_NODE_HINT	2
347
348/*
349 * Reflective memory spinlocks.
350 */
351
352
353#ifndef _NSC_RMSPIN_H
354typedef struct nsc_rmlock_s { int x; } nsc_rmlock_t;
355#endif
356
357
358extern nsc_rmlock_t *nsc_rm_lock_alloc(char *, int, void *);
359extern void nsc_rm_lock_dealloc(nsc_rmlock_t *);
360extern int nsc_rm_lock(nsc_rmlock_t *);
361extern void nsc_rm_unlock(nsc_rmlock_t *);
362
363#endif /* _KERNEL */
364
365
366/*
367 * Memory allocation routines.
368 */
369
370#define	NSC_MEM_LOCAL	0x1
371#define	NSC_MEM_GLOBAL	0x4
372
373#define	NSC_MEM_RESIZE  0x100
374#define	NSC_MEM_NVDIRTY 0x400
375
376
377#ifdef _KERNEL
378
379#ifndef _NSC_MEM_H
380typedef struct nsc_mem_s { int x; } nsc_mem_t;
381#endif
382
383
384extern nsc_mem_t *nsc_register_mem(char *, int, int);
385extern void nsc_unregister_mem(nsc_mem_t *);
386extern void *nsc_kmem_alloc(size_t, int, nsc_mem_t *);
387extern void *nsc_kmem_zalloc(size_t, int, nsc_mem_t *);
388extern void nsc_kmem_free(void *, size_t);
389extern void nsc_mem_sizes(nsc_mem_t *, size_t *, size_t *, size_t *);
390extern size_t nsc_mem_avail(nsc_mem_t *);
391
392/* nvmem suppport */
393typedef void (*nsc_mem_err_cb) (void *, void *, size_t, int);
394extern int nsc_commit_mem(void *, void *, size_t, nsc_mem_err_cb);
395
396extern void nsc_cm_errhdlr(void *, void *, size_t, int);
397
398#endif /* _KERNEL */
399
400
401/*
402 * Max pathname
403 * Note: Currently defined both here and in nsc_dev.h
404 */
405#if !defined(NSC_MAXPATH)
406#define	NSC_MAXPATH	64
407#endif
408
409#ifdef _KERNEL
410
411/*
412 * Inter-module function (callback) services
413 */
414
415#ifndef _NSC_GEN_H
416typedef struct nsc_svc_s { int x; } nsc_svc_t;
417#endif
418
419extern nsc_svc_t *nsc_register_svc(char *, void (*)(intptr_t));
420extern int nsc_unregister_svc(nsc_svc_t *);
421extern int nsc_call_svc(nsc_svc_t *, intptr_t);
422
423
424/*
425 * String manipulation functions.
426 */
427
428#ifndef sun
429#define	sprintf nsc_sprintf
430#endif /* sun */
431
432extern char *nsc_strdup(char *);
433extern void nsc_strfree(char *);
434extern int nsc_strmatch(char *, char *);
435extern void nsc_sprintf(char *, char *, ...);
436extern uint64_t nsc_strhash(char *);
437
438
439/*
440 * Macro definitions.
441 */
442
443#define	NSC_HIER	1
444
445#ifndef NULL
446#define	NULL		0
447#endif
448
449
450/*
451 * External definitions.
452 */
453
454#undef HZ
455extern clock_t HZ;
456extern int nsc_max_nodeid, nsc_min_nodeid;
457
458extern int nsc_node_id(void);
459extern char *nsc_node_name(void);
460extern int nsc_node_up(int);
461extern time_t nsc_time(void);
462extern clock_t nsc_lbolt(void);
463extern int nsc_delay_sig(clock_t);
464extern clock_t nsc_usec(void);
465extern void nsc_yield(void);
466
467extern void nsc_membar_stld(void);
468extern uint8_t nsc_ldstub(uint8_t *);
469extern caddr_t nsc_caller(void);
470extern caddr_t nsc_callee(void);
471
472extern int nsc_create_process(void (*)(void *), void *, boolean_t);
473
474extern int nsc_power_init(void);
475extern void nsc_power_deinit(void);
476extern int nsc_nodeid_data(void);
477
478#define	NSC_ALERT_INFO		0	/* Information alert */
479#define	NSC_ALERT_WARNING	1	/* Warning alert */
480#define	NSC_ALERT_ERROR		2	/* Error alert */
481#define	NSC_ALERT_DOWN		3	/* System or Module down */
482
483extern void nsc_do_sysevent(char *, char *, int, int, char *, dev_info_t *);
484
485
486/*
487 * Missing DDI/DKI definition.
488 */
489
490#if defined(_SYS_CONF_H)
491#ifndef D_MP
492#define	D_MP 0
493#endif
494#endif
495
496extern void *nsc_threadp(void);
497
498#endif /* _KERNEL */
499
500
501/*
502 * Common defines
503 */
504
505#ifndef TRUE
506#define	TRUE	1
507#endif
508
509#ifndef FALSE
510#define	FALSE	0
511#endif
512
513#ifndef  NBBY
514#define	NBBY	8	/* number of bits per byte */
515#endif
516
517/*
518 * kstat definition
519 */
520#define	KSTAT_DATA_CHAR_LEN (sizeof (((kstat_named_t *)0)->value.c))
521
522#ifdef	__cplusplus
523}
524#endif
525
526#endif /* _SYS_NSCTL_H */
527