/*
 * 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	_SV_H
#define	_SV_H

#ifdef	__cplusplus
extern "C" {
#endif


/*
 * Storage Volume Character and Block Driver (SV)
 * Public header file.
 * SPARC case 1998/036.
 * PSARC case 1999/023.
 */

#define	SV_MAXPATH	NSC_MAXPATH
#define	SV_DEVICE	"/dev/sv"


/*
 * Ioctl structures
 */

typedef struct sv_name_s {
	char	svn_path[SV_MAXPATH];	/* path to underlying raw device */
	time_t	svn_timestamp;		/* timestamp of successful enable */
	int	svn_nblocks;		/* size of device */
	int	svn_mode;		/* NSC_DEVICE | NSC_CACHE */
} sv_name_t;


#ifdef _KERNEL

typedef struct sv_name32_s {
	char	svn_path[SV_MAXPATH];	/* path to underlying raw device */
	int32_t	svn_timestamp;		/* timestamp of successful enable */
	int32_t	svn_nblocks;		/* size of device */
	int32_t	svn_mode;		/* NSC_DEVICE | NSC_CACHE */
} sv_name32_t;

#endif	/* _KERNEL */


typedef struct sv_list_s {
	spcs_s_info_t	svl_error;	/* Error information */
	time_t		svl_timestamp;	/* time of successful {en,dis}able */
	int		svl_count;	/* Count of elements in svl_names */
	int		svl_maxdevs;	/* Max # of devices that can be used */
	sv_name_t	*svl_names;	/* pointer to names array */
} sv_list_t;


#ifdef _KERNEL

typedef struct sv_list32_s {
	spcs_s_info32_t	svl_error;	/* Error information */
	int32_t		svl_timestamp;	/* time of successful {en,dis}able */
	int32_t		svl_count;	/* Count of elements in svl_names */
	int32_t		svl_maxdevs;	/* Max # of devices that can be used */
	uint32_t	svl_names;	/* pointer to names array */
} sv_list32_t;

#endif	/* _KERNEL */


typedef struct sv_conf_s {
	spcs_s_info_t	svc_error;	/* Error information */
	char	svc_path[SV_MAXPATH];	/* path to underlying raw device */
	int	svc_flag;		/* NSC_DEVICE | NSC_CACHE */
	major_t	svc_major;		/* major_t of underlying raw device */
	minor_t	svc_minor;		/* minor_t of underlying raw device */
} sv_conf_t;

#ifdef _KERNEL

typedef struct sv_conf32_s {
	spcs_s_info32_t	svc_error;	/* Error information */
	char	svc_path[SV_MAXPATH];	/* path to underlying raw device */
	int32_t	svc_flag;		/* NSC_DEVICE | NSC_CACHE */
	major_t	svc_major;		/* major_t of underlying raw device */
	minor_t	svc_minor;		/* minor_t of underlying raw device */
} sv_conf32_t;

#endif	/* _KERNEL */


typedef struct sv_version_s {
	spcs_s_info_t	svv_error;		/* Error information */
	int		svv_major_rev;		/* Major revision */
	int		svv_minor_rev;		/* Minor revision */
	int		svv_micro_rev;		/* Micro revision */
	int		svv_baseline_rev;	/* Baseline revision */
} sv_version_t;

#ifdef _KERNEL

typedef struct sv_version32_s {
	spcs_s_info32_t	svv_error;	/* Error information */
	int32_t		svv_major_rev;	/* Major revision */
	int32_t		svv_minor_rev;	/* Minor revision */
	int32_t		svv_micro_rev;		/* Micro revision */
	int32_t		svv_baseline_rev;	/* Baseline revision */
} sv_version32_t;

#endif	/* _KERNEL */


#ifdef _KERNEL

/*
 * SV guard devices.
 */

typedef struct sv_guard_s {
	int		sg_magic;	/* Magic # */
	int		sg_version;	/* Version # */
	char		*sg_pathname;	/* Pathname of device to guard */
	char		*sg_module;	/* Module name of client */
	int		sg_kernel;	/* Prevent user access if true */
	spcs_s_info_t	sg_error;	/* Error to be returned to client */
} sv_guard_t;

#define	SV_SG_MAGIC	0x47554152
#define	SV_SG_VERSION	1

#endif	/* _KERNEL */


/*
 * Ioctl numbers.
 */

#define	__SV__(x)	(('S'<<16)|('V'<<8)|(x))

#define	SVIOC_ENABLE		__SV__(1)
#define	SVIOC_DISABLE		__SV__(2)
#define	SVIOC_LIST		__SV__(3)
#define	SVIOC_VERSION		__SV__(4)
#define	SVIOC_UNLOAD		__SV__(5)

/*
 * seconds to wait before unload, to drain lingering IOs.
 */
#define	SV_WAIT_UNLOAD	10

#ifdef	__cplusplus
}
#endif

#endif	/* _SV_H */