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 */
|