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