summaryrefslogtreecommitdiff
path: root/usr/src/uts/common/avs/ns/nsctl.h
blob: c91d6916846a362154d78d1d8cf06713e721c0cf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License (the "License").
 * You may not use this file except in compliance with the License.
 *
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 * or http://www.opensolaris.org/os/licensing.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information: Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 */
/*
 * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
 * Use is subject to license terms.
 */

#ifndef	_SYS_NSCTL_H
#define	_SYS_NSCTL_H

#ifdef	__cplusplus
extern "C" {
#endif

#if (defined(lint) || defined(OSDEBUG)) && defined(_KERNEL)
#define	__NSC_GEN__
#include <sys/ksynch.h>
#include <sys/nsctl/nsc_dev.h>
#include <sys/nsctl/nsc_gen.h>
#include <sys/nsctl/nsc_mem.h>
#include <sys/nsctl/nsc_rmspin.h>
#endif


/*
 * nsctl multi-terabyte volume support
 *
 * To build a multi-terabyte stack, '#define NSC_MULTI_TERABYTE'.
 */

#ifdef NSC_MULTI_TERABYTE
typedef uint64_t	nsc_off_t;	/* positions, offsets */
typedef uint64_t	nsc_size_t;	/* lengths, sizes */
#ifdef _LP64
#define	NSC_SZFMT	"lu"
#define	NSC_XSZFMT	"lx"
#else
#define	NSC_SZFMT	"llu"
#define	NSC_XSZFMT	"llx"
#endif

#else	/* max 1TB volume size */
typedef int		nsc_off_t;
typedef int		nsc_size_t;
#define	NSC_SZFMT	"u"
#define	NSC_XSZFMT	"x"
#endif


#ifdef _KERNEL

#ifdef sun
#include <sys/nsc_ddi.h>
#endif

/*
 * Generic parameter definition.
 */

typedef struct nsc_def_s {
	char	*name;			/* Parameter name */
	uintptr_t value;		/* Parameter value */
	int	offset;			/* Structure offset */
} nsc_def_t;

extern int nsc_inval(), nsc_ioerr();
extern int nsc_fatal(), nsc_null(), nsc_true();
extern void nsc_decode_param(nsc_def_t *, nsc_def_t *, long *);
#endif	/* _KERNEL */


/* ID and Type flags */

#define	NSC_ID		0x40000000	/* Module ID */
#define	NSC_NULL	0x00000100	/* No I/O possible */
#define	NSC_DEVICE	0x00000200	/* Device interface */
#define	NSC_FILE	0x00000400	/* File vnode interface */
#define	NSC_CACHE	0x00000800	/* Cache interface */
#define	NSC_ANON	0x00001000	/* Supports anonymous buffers */
#define	NSC_VCHR	0x00002000	/* VCHR vnode device */
#define	NSC_NCALL	0x00004000	/* ncall-io interface */

#define	NSC_IDS		0x7ff00000	/* ID mask */
#define	NSC_TYPES	0x7fffff00	/* Type mask */

#define	NSC_MKID(x)	(NSC_ID | ((x) << 20))

#define	NSC_RAW_ID  	NSC_MKID(39)	/* Raw device */
#define	NSC_FILE_ID	NSC_MKID(40)	/* File vnode device */
#define	NSC_FREEZE_ID	NSC_MKID(41)	/* Frozen raw device */
#define	NSC_VCHR_ID	NSC_MKID(42)	/* VCHR vnode device */
#define	NSC_NCALL_ID	NSC_MKID(43)	/* ncall-io */
#define	NSC_SDBC_ID	NSC_MKID(80)	/* Block based cache */
#define	NSC_RDCLR_ID	NSC_MKID(94)	/* RDC (low, raw) */
#define	NSC_RDCL_ID	NSC_MKID(95)	/* RDC (low, cache) */
#define	NSC_IIR_ID	NSC_MKID(96)	/* Instant Image (raw) */
#define	NSC_II_ID	NSC_MKID(98)	/* Instant Image */
#define	NSC_RDCHR_ID	NSC_MKID(99)	/* RDC (high, raw) */
#define	NSC_RDCH_ID	NSC_MKID(100)	/* RDC (high, cache) */

typedef enum nsc_power_ops_e {
	Power_Lost,	/* Power Failing initial warning */
			/* with timeleft (rideout) minutes */

	Power_OK,	/* Power OK or restored before death */

	Power_Down 	/* that's all folks machine will */
			/* be shutdown, save any state */
} nsc_power_ops_t;

#ifdef _KERNEL

/* Module Flags */

#define	NSC_REFCNT	0x00000001	/* Counts references */
#define	NSC_FILTER	0x00000002	/* Uses lower level driver */


#ifndef _NSC_DEV_H
typedef struct nsc_io_s { int x; } nsc_io_t;
typedef struct nsc_path_s { int x; } nsc_path_t;
#endif

extern nsc_io_t *nsc_register_io(char *, int, nsc_def_t *);
extern int nsc_unregister_io(nsc_io_t *, int);
extern nsc_path_t *nsc_register_path(char *, int, nsc_io_t *);
extern int nsc_unregister_path(nsc_path_t *, int);
extern int nsc_cache_sizes(int *, int *);
extern int nsc_node_hints(unsigned int *);
extern int nsc_node_hints_set(unsigned int);
extern blind_t nsc_register_power(char *, nsc_def_t *);
extern int nsc_unregister_power(blind_t);

/*
 *  Strategy function interface
 */
#ifndef DS_DDICT
typedef int (*strategy_fn_t)(struct buf *);
#endif
extern strategy_fn_t    nsc_get_strategy(major_t);

extern void *nsc_get_devops(major_t);

#endif /* _KERNEL */


/* Block sizes */

#define	FBA_SHFT	9
#define	FBA_MASK	0x1ff
#define	FBA_SIZE(x)	((x) << FBA_SHFT)		/* fba to bytes */
#define	FBA_OFF(x)	((x) & FBA_MASK)		/* byte offset */
#define	FBA_LEN(x)	FBA_NUM((x) + FBA_MASK)		/* len to fba */
#define	FBA_NUM(x)	((nsc_size_t)((uint64_t)(x) >> FBA_SHFT))
							/* bytes to fba */


/* Return values */

#define	NSC_DONE	(0)
#define	NSC_PENDING  	(-1)
#define	NSC_HIT		(-2)


#if defined(_KERNEL) || defined(_KMEMUSER)

/*
 * External file descriptor.
 */

#ifndef _NSC_DEV_H
typedef struct nsc_fd_s { int x; } nsc_fd_t;
#endif

#endif /* _KERNEL || _KMEMUSER */


#ifdef _KERNEL

#define	NSC_TRY		(1<<24)		/* Conditional operation */
#define	NSC_PCATCH	(1<<25)		/* Catch signals */
#define	NSC_DEFER	(1<<26)		/* Defer if busy */
#define	NSC_MULTI	(1<<27)		/* Multiple reserves */
#define	NSC_NOWAIT	(1<<28)		/* Don't wait if busy */

extern nsc_fd_t *nsc_open(char *, int, nsc_def_t *, blind_t, int *);
extern int nsc_close(nsc_fd_t *);
extern char *nsc_pathname(nsc_fd_t *);
extern int nsc_fdpathcmp(nsc_fd_t *, uint64_t, char *);
extern int nsc_shared(nsc_fd_t *);
extern int nsc_setval(nsc_fd_t *, char *, int);
extern int nsc_getval(nsc_fd_t *, char *, int *);
extern int nsc_set_trksize(nsc_fd_t *, nsc_size_t);
extern int nsc_discard_pinned(nsc_fd_t *, nsc_off_t, nsc_size_t);
extern kmutex_t *nsc_lock_addr(nsc_fd_t *);
extern int nsc_attach(nsc_fd_t *, int);
extern int nsc_reserve(nsc_fd_t *, int);
extern void nsc_reserve_lk(nsc_fd_t *);
extern void nsc_release(nsc_fd_t *);
extern int nsc_release_lk(nsc_fd_t *);
extern int nsc_detach(nsc_fd_t *, int);
extern int nsc_avail(nsc_fd_t *);
extern int nsc_held(nsc_fd_t *);
extern int nsc_waiting(nsc_fd_t *);
extern int nsc_partsize(nsc_fd_t *, nsc_size_t *);
extern int nsc_maxfbas(nsc_fd_t *, int, nsc_size_t *);
extern int nsc_get_pinned(nsc_fd_t *);
extern int nsc_max_devices(void);
extern int nsc_control(nsc_fd_t *, int, void *, int);

#endif /* _KERNEL */


#if defined(_KERNEL) || defined(_KMEMUSER)

/*
 * I/O device structure.
 */

#ifndef _NSC_DEV_H
typedef struct nsc_iodev_s { int x; } nsc_iodev_t;
#endif

#ifdef _KERNEL
extern void nsc_set_owner(nsc_fd_t *, nsc_iodev_t *);
extern void nsc_pinned_data(nsc_iodev_t *, nsc_off_t, nsc_size_t);
extern void nsc_unpinned_data(nsc_iodev_t *, nsc_off_t, nsc_size_t);
#endif


/*
 * Data structures used by I/O interface.
 */

typedef struct nsc_vec_s {		/* Scatter gather element */
	unsigned char	*sv_addr;	/* Virtual address of data */
	unsigned long	sv_vme;		/* VME address of data */
	int		sv_len;		/* Data length in bytes */
} nsc_vec_t;


typedef struct nsc_buf_s {		/* Buffer structure */
	nsc_fd_t *sb_fd;		/* File descriptor */
	nsc_off_t sb_pos;		/* Block offset of data */
	nsc_size_t sb_len;		/* Length of data in blocks */
	volatile int sb_flag;		/* Buffer flags */
	int sb_error;			/* Error code */
	uintptr_t sb_user;		/* User definable */
	nsc_vec_t *sb_vec;		/* Scatter gather list */
} nsc_buf_t;

#endif /* _KERNEL || _KMEMUSER */


/* Allocate flags */

#define	NSC_RDBUF	0x0001
#define	NSC_WRBUF	0x0002
#define	NSC_PINNABLE	0x0004
#define	NSC_NOBLOCK	0x0008

#define	NSC_READ	(NSC_RDBUF)
#define	NSC_WRITE	(NSC_WRBUF)
#define	NSC_RDWR	(NSC_RDBUF | NSC_WRBUF)
#define	NSC_RDWRBUF	(NSC_RDBUF | NSC_WRBUF)


/* Other flags */

#define	NSC_CACHEBLK	0x0008	/* nsc_maxfbas: size of cache block in fbas */
#define	NSC_HALLOCATED	0x0010	/* handle allocated (IO provider internals) */
#define	NSC_HACTIVE	0x0020	/* handle active (IO provider internals) */
#define	NSC_BCOPY	0x0040	/* bcopy, don't DMA when moving data */
#define	NSC_PAGEIO	0x0080	/* client will use handle for pageio */
#define	NSC_ABUF	0x0100	/* anonymous buffer handle */
#define	NSC_MIXED	0x0200	/* data from 2 devs is mixed in this buffer */
#define	NSC_NODATA	0x0400	/* allocate without data buffer (sb_vec) */


#define	NSC_FLAGS	0xffff

#ifdef _KERNEL

#define	NSC_ANON_CD	((blind_t)(-1)) /* used for IO provider alloc buf */

extern int nsc_alloc_buf(nsc_fd_t *, nsc_off_t, nsc_size_t, int, nsc_buf_t **);
extern int nsc_alloc_abuf(nsc_off_t, nsc_size_t, int, nsc_buf_t **);
extern int nsc_read(nsc_buf_t *, nsc_off_t, nsc_size_t, int);
extern int nsc_write(nsc_buf_t *, nsc_off_t, nsc_size_t, int);
extern int nsc_zero(nsc_buf_t *, nsc_off_t, nsc_size_t, int);
extern int nsc_copy(nsc_buf_t *, nsc_buf_t *, nsc_off_t, nsc_off_t, nsc_size_t);
extern int nsc_copy_direct(nsc_buf_t *, nsc_buf_t *, nsc_off_t,
    nsc_off_t, nsc_size_t);
extern int nsc_uncommit(nsc_buf_t *, nsc_off_t, nsc_size_t, int);
extern int nsc_free_buf(nsc_buf_t *);
extern nsc_buf_t *nsc_alloc_handle(nsc_fd_t *,
	void (*)(), void (*)(), void (*)());
extern int nsc_free_handle(nsc_buf_t *);
extern int nsc_uread(nsc_fd_t *, void *, void *);
extern int nsc_uwrite(nsc_fd_t *, void *, void *);

#endif /* _KERNEL */


/*
 * Performance hints.
 */

#define	NSC_WRTHRU		0x00010000
#define	NSC_FORCED_WRTHRU  	0x00020000
#define	NSC_NOCACHE		0x00040000
#define	NSC_QUEUE		0x00080000
#define	NSC_RDAHEAD		0x00100000
#define	NSC_NO_FORCED_WRTHRU	0x00200000
#define	NSC_METADATA		0x00400000
#define	NSC_SEQ_IO		0x00800000

#define	NSC_HINTS		0x00ff0000


#ifdef _KERNEL
/*
 * node hint actions
 */

#define	NSC_GET_NODE_HINT	0
#define	NSC_SET_NODE_HINT	1
#define	NSC_CLEAR_NODE_HINT	2

/*
 * Reflective memory spinlocks.
 */


#ifndef _NSC_RMSPIN_H
typedef struct nsc_rmlock_s { int x; } nsc_rmlock_t;
#endif


extern nsc_rmlock_t *nsc_rm_lock_alloc(char *, int, void *);
extern void nsc_rm_lock_dealloc(nsc_rmlock_t *);
extern int nsc_rm_lock(nsc_rmlock_t *);
extern void nsc_rm_unlock(nsc_rmlock_t *);

#endif /* _KERNEL */


/*
 * Memory allocation routines.
 */

#define	NSC_MEM_LOCAL	0x1
#define	NSC_MEM_GLOBAL	0x4

#define	NSC_MEM_RESIZE  0x100
#define	NSC_MEM_NVDIRTY 0x400


#ifdef _KERNEL

#ifndef _NSC_MEM_H
typedef struct nsc_mem_s { int x; } nsc_mem_t;
#endif


extern nsc_mem_t *nsc_register_mem(char *, int, int);
extern void nsc_unregister_mem(nsc_mem_t *);
extern void *nsc_kmem_alloc(size_t, int, nsc_mem_t *);
extern void *nsc_kmem_zalloc(size_t, int, nsc_mem_t *);
extern void nsc_kmem_free(void *, size_t);
extern void nsc_mem_sizes(nsc_mem_t *, size_t *, size_t *, size_t *);
extern size_t nsc_mem_avail(nsc_mem_t *);

/* nvmem suppport */
typedef void (*nsc_mem_err_cb) (void *, void *, size_t, int);
extern int nsc_commit_mem(void *, void *, size_t, nsc_mem_err_cb);

extern void nsc_cm_errhdlr(void *, void *, size_t, int);

#endif /* _KERNEL */


/*
 * Max pathname
 * Note: Currently defined both here and in nsc_dev.h
 */
#if !defined(NSC_MAXPATH)
#define	NSC_MAXPATH	64
#endif

#ifdef _KERNEL

/*
 * Inter-module function (callback) services
 */

#ifndef _NSC_GEN_H
typedef struct nsc_svc_s { int x; } nsc_svc_t;
#endif

extern nsc_svc_t *nsc_register_svc(char *, void (*)(intptr_t));
extern int nsc_unregister_svc(nsc_svc_t *);
extern int nsc_call_svc(nsc_svc_t *, intptr_t);


/*
 * String manipulation functions.
 */

#ifndef sun
#define	sprintf nsc_sprintf
#endif /* sun */

extern char *nsc_strdup(char *);
extern void nsc_strfree(char *);
extern int nsc_strmatch(char *, char *);
extern void nsc_sprintf(char *, char *, ...);
extern uint64_t nsc_strhash(char *);


/*
 * Macro definitions.
 */

#define	NSC_HIER	1

#ifndef NULL
#define	NULL		0
#endif


/*
 * External definitions.
 */

#undef HZ
extern clock_t HZ;
extern int nsc_max_nodeid, nsc_min_nodeid;

extern int nsc_node_id(void);
extern char *nsc_node_name(void);
extern int nsc_node_up(int);
extern time_t nsc_time(void);
extern clock_t nsc_lbolt(void);
extern int nsc_delay_sig(clock_t);
extern clock_t nsc_usec(void);
extern void nsc_yield(void);

extern void nsc_membar_stld(void);
extern uint8_t nsc_ldstub(uint8_t *);
extern caddr_t nsc_caller(void);
extern caddr_t nsc_callee(void);

extern int nsc_create_process(void (*)(void *), void *, boolean_t);

extern int nsc_power_init(void);
extern void nsc_power_deinit(void);
extern int nsc_nodeid_data(void);

#define	NSC_ALERT_INFO		0	/* Information alert */
#define	NSC_ALERT_WARNING	1	/* Warning alert */
#define	NSC_ALERT_ERROR		2	/* Error alert */
#define	NSC_ALERT_DOWN		3	/* System or Module down */

extern void nsc_do_sysevent(char *, char *, int, int, char *, dev_info_t *);


/*
 * Missing DDI/DKI definition.
 */

#if defined(_SYS_CONF_H)
#ifndef D_MP
#define	D_MP 0
#endif
#endif

extern void *nsc_threadp(void);

#endif /* _KERNEL */


/*
 * Common defines
 */

#ifndef TRUE
#define	TRUE	1
#endif

#ifndef FALSE
#define	FALSE	0
#endif

#ifndef  NBBY
#define	NBBY	8	/* number of bits per byte */
#endif

/*
 * kstat definition
 */
#define	KSTAT_DATA_CHAR_LEN (sizeof (((kstat_named_t *)0)->value.c))

#ifdef	__cplusplus
}
#endif

#endif /* _SYS_NSCTL_H */