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
30 extern "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
50 typedef uint64_t nsc_off_t; /* positions, offsets */
51 typedef 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 */
61 typedef int nsc_off_t;
62 typedef 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
78 typedef 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
84 extern int nsc_inval(), nsc_ioerr();
85 extern int nsc_fatal(), nsc_null(), nsc_true();
86 extern 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
119 typedef 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
138 typedef struct nsc_io_s { int x; } nsc_io_t;
139 typedef struct nsc_path_s { int x; } nsc_path_t;
140 #endif
141
142 extern nsc_io_t *nsc_register_io(char *, int, nsc_def_t *);
143 extern int nsc_unregister_io(nsc_io_t *, int);
144 extern nsc_path_t *nsc_register_path(char *, int, nsc_io_t *);
145 extern int nsc_unregister_path(nsc_path_t *, int);
146 extern int nsc_cache_sizes(int *, int *);
147 extern int nsc_node_hints(unsigned int *);
148 extern int nsc_node_hints_set(unsigned int);
149 extern blind_t nsc_register_power(char *, nsc_def_t *);
150 extern int nsc_unregister_power(blind_t);
151
152 /*
153 * Strategy function interface
154 */
155 #ifndef DS_DDICT
156 typedef int (*strategy_fn_t)(struct buf *);
157 #endif
158 extern strategy_fn_t nsc_get_strategy(major_t);
159
160 extern 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
190 typedef 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
204 extern nsc_fd_t *nsc_open(char *, int, nsc_def_t *, blind_t, int *);
205 extern int nsc_close(nsc_fd_t *);
206 extern char *nsc_pathname(nsc_fd_t *);
207 extern int nsc_fdpathcmp(nsc_fd_t *, uint64_t, char *);
208 extern int nsc_shared(nsc_fd_t *);
209 extern int nsc_setval(nsc_fd_t *, char *, int);
210 extern int nsc_getval(nsc_fd_t *, char *, int *);
211 extern int nsc_set_trksize(nsc_fd_t *, nsc_size_t);
212 extern int nsc_discard_pinned(nsc_fd_t *, nsc_off_t, nsc_size_t);
213 extern kmutex_t *nsc_lock_addr(nsc_fd_t *);
214 extern int nsc_attach(nsc_fd_t *, int);
215 extern int nsc_reserve(nsc_fd_t *, int);
216 extern void nsc_reserve_lk(nsc_fd_t *);
217 extern void nsc_release(nsc_fd_t *);
218 extern int nsc_release_lk(nsc_fd_t *);
219 extern int nsc_detach(nsc_fd_t *, int);
220 extern int nsc_avail(nsc_fd_t *);
221 extern int nsc_held(nsc_fd_t *);
222 extern int nsc_waiting(nsc_fd_t *);
223 extern int nsc_partsize(nsc_fd_t *, nsc_size_t *);
224 extern int nsc_maxfbas(nsc_fd_t *, int, nsc_size_t *);
225 extern int nsc_get_pinned(nsc_fd_t *);
226 extern int nsc_max_devices(void);
227 extern 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
239 typedef struct nsc_iodev_s { int x; } nsc_iodev_t;
240 #endif
241
242 #ifdef _KERNEL
243 extern void nsc_set_owner(nsc_fd_t *, nsc_iodev_t *);
244 extern void nsc_pinned_data(nsc_iodev_t *, nsc_off_t, nsc_size_t);
245 extern 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
253 typedef 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
260 typedef 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
304 extern int nsc_alloc_buf(nsc_fd_t *, nsc_off_t, nsc_size_t, int, nsc_buf_t **);
305 extern int nsc_alloc_abuf(nsc_off_t, nsc_size_t, int, nsc_buf_t **);
306 extern int nsc_read(nsc_buf_t *, nsc_off_t, nsc_size_t, int);
307 extern int nsc_write(nsc_buf_t *, nsc_off_t, nsc_size_t, int);
308 extern int nsc_zero(nsc_buf_t *, nsc_off_t, nsc_size_t, int);
309 extern int nsc_copy(nsc_buf_t *, nsc_buf_t *, nsc_off_t, nsc_off_t, nsc_size_t);
310 extern int nsc_copy_direct(nsc_buf_t *, nsc_buf_t *, nsc_off_t,
311 nsc_off_t, nsc_size_t);
312 extern int nsc_uncommit(nsc_buf_t *, nsc_off_t, nsc_size_t, int);
313 extern int nsc_free_buf(nsc_buf_t *);
314 extern nsc_buf_t *nsc_alloc_handle(nsc_fd_t *,
315 void (*)(), void (*)(), void (*)());
316 extern int nsc_free_handle(nsc_buf_t *);
317 extern int nsc_uread(nsc_fd_t *, void *, void *);
318 extern 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
354 typedef struct nsc_rmlock_s { int x; } nsc_rmlock_t;
355 #endif
356
357
358 extern nsc_rmlock_t *nsc_rm_lock_alloc(char *, int, void *);
359 extern void nsc_rm_lock_dealloc(nsc_rmlock_t *);
360 extern int nsc_rm_lock(nsc_rmlock_t *);
361 extern 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
380 typedef struct nsc_mem_s { int x; } nsc_mem_t;
381 #endif
382
383
384 extern nsc_mem_t *nsc_register_mem(char *, int, int);
385 extern void nsc_unregister_mem(nsc_mem_t *);
386 extern void *nsc_kmem_alloc(size_t, int, nsc_mem_t *);
387 extern void *nsc_kmem_zalloc(size_t, int, nsc_mem_t *);
388 extern void nsc_kmem_free(void *, size_t);
389 extern void nsc_mem_sizes(nsc_mem_t *, size_t *, size_t *, size_t *);
390 extern size_t nsc_mem_avail(nsc_mem_t *);
391
392 /* nvmem suppport */
393 typedef void (*nsc_mem_err_cb) (void *, void *, size_t, int);
394 extern int nsc_commit_mem(void *, void *, size_t, nsc_mem_err_cb);
395
396 extern 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
416 typedef struct nsc_svc_s { int x; } nsc_svc_t;
417 #endif
418
419 extern nsc_svc_t *nsc_register_svc(char *, void (*)(intptr_t));
420 extern int nsc_unregister_svc(nsc_svc_t *);
421 extern 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
432 extern char *nsc_strdup(char *);
433 extern void nsc_strfree(char *);
434 extern int nsc_strmatch(char *, char *);
435 extern void nsc_sprintf(char *, char *, ...);
436 extern 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
455 extern clock_t HZ;
456 extern int nsc_max_nodeid, nsc_min_nodeid;
457
458 extern int nsc_node_id(void);
459 extern char *nsc_node_name(void);
460 extern int nsc_node_up(int);
461 extern time_t nsc_time(void);
462 extern clock_t nsc_lbolt(void);
463 extern int nsc_delay_sig(clock_t);
464 extern clock_t nsc_usec(void);
465 extern void nsc_yield(void);
466
467 extern void nsc_membar_stld(void);
468 extern uint8_t nsc_ldstub(uint8_t *);
469 extern caddr_t nsc_caller(void);
470 extern caddr_t nsc_callee(void);
471
472 extern int nsc_create_process(void (*)(void *), void *, boolean_t);
473
474 extern int nsc_power_init(void);
475 extern void nsc_power_deinit(void);
476 extern 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
483 extern 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
496 extern 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 */