xref: /illumos-gate/usr/src/uts/sun4v/sys/vdsk_common.h (revision c73a93f2f62aa040c7fc1755230b787b0ad03967)
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 /*
23  * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
24  * Use is subject to license terms.
25  */
26 
27 #ifndef	_VDSK_COMMON_H
28 #define	_VDSK_COMMON_H
29 
30 #pragma ident	"%Z%%M%	%I%	%E% SMI"
31 
32 #ifdef __cplusplus
33 extern "C" {
34 #endif
35 
36 /*
37  * This header file contains the private LDoms Virtual Disk (vDisk) definitions
38  * common to both the server (vds) and the client (vdc)
39  */
40 
41 #include <sys/machparam.h>
42 #include <sys/vtoc.h>
43 
44 #include <sys/ldc.h>
45 #include <sys/vio_common.h>
46 #include <sys/vio_mailbox.h>
47 
48 /*
49  * vDisk definitions
50  */
51 
52 /*
53  * The number of Descriptor Ring entries
54  *
55  * Constraints:
56  * 	- overall DRing size must be greater than 8K (MMU_PAGESIZE)
57  *	- overall DRing size should be 8K aligned (desirable but not enforced)
58  *	- DRing entry must be 8 byte aligned
59  */
60 #define	VD_DRING_LEN		512
61 
62 /*
63  *
64  */
65 #define	VD_DRING_ENTRY_SZ	(sizeof (vd_dring_entry_t) + 		\
66 		(sizeof (ldc_mem_cookie_t) * (VD_MAX_COOKIES - 1)))
67 
68 /*
69  * The maximum block size we can transmit using one Descriptor Ring entry
70  *
71  * Currently no FS uses more than 128K and it doesn't look like they
72  * will either as there is no perf gain to be had by larger values.
73  * ( see ZFS comment at definition of SPA_MAXBLOCKSIZE ).
74  *
75  * We choose 256K to give us some headroom.
76  */
77 #define	VD_MAX_BLOCK_SIZE	(256 * 1024)
78 
79 #define	VD_MAX_COOKIES		((VD_MAX_BLOCK_SIZE / PAGESIZE) + 1)
80 #define	VD_USEC_TIMEOUT		20000
81 #define	VD_LDC_IDS_PROP		"ldc-ids"
82 #define	VD_LDC_QLEN		32
83 
84 /*
85  * Flags used by ioctl routines to indicate if a copyin/copyout is needed
86  */
87 #define	VD_COPYOUT		0x1
88 #define	VD_COPYIN		0x2
89 
90 /*
91  * vDisk operations on physical devices
92  */
93 #define	VD_OP_BREAD		0x01	/* Block Read */
94 #define	VD_OP_BWRITE		0x02	/* Block Write */
95 #define	VD_OP_FLUSH		0x03	/* Flush disk write cache contents */
96 #define	VD_OP_GET_WCE		0x04	/* Get disk W$ status */
97 #define	VD_OP_SET_WCE		0x05	/* Enable/Disable disk W$ */
98 #define	VD_OP_GET_VTOC		0x06	/* Get VTOC */
99 #define	VD_OP_SET_VTOC		0x07	/* Set VTOC */
100 #define	VD_OP_GET_DISKGEOM	0x08	/* Get disk geometry */
101 #define	VD_OP_SET_DISKGEOM	0x09	/* Set disk geometry */
102 #define	VD_OP_SCSICMD		0x0a	/* SCSI control command */
103 #define	VD_OP_MASK		0xFF	/* mask of all possible operations */
104 #define	VD_OP_COUNT		10	/* Number of operations */
105 
106 /*
107  * Definitions of the various ways vds can export disk support to vdc.
108  */
109 typedef enum vd_disk_type {
110 	VD_DISK_TYPE_UNK = 0,		/* Unknown device type */
111 	VD_DISK_TYPE_SLICE,		/* slice in block device */
112 	VD_DISK_TYPE_DISK		/* entire disk (slice 2) */
113 } vd_disk_type_t;
114 
115 /*
116  * vDisk Descriptor payload
117  */
118 typedef struct vd_dring_payload {
119 	uint64_t	req_id;		/* The request ID being processed */
120 	uint8_t		operation;	/* operation for server to perform */
121 	uint8_t		slice;		/* The disk slice being accessed */
122 	uint16_t	resv1;		/* padding */
123 	uint32_t	status;		/* "errno" of server operation */
124 	uint64_t	addr;		/* LP64	diskaddr_t (block I/O) */
125 	uint64_t	nbytes;		/* LP64 size_t */
126 	uint32_t	ncookies;	/* Number of cookies used */
127 	uint32_t	resv2;		/* padding */
128 
129 	ldc_mem_cookie_t	cookie[1];	/* variable sized array */
130 } vd_dring_payload_t;
131 
132 
133 /*
134  * vDisk Descriptor entry
135  */
136 typedef struct vd_dring_entry {
137 	vio_dring_entry_hdr_t		hdr;		/* common header */
138 	vd_dring_payload_t		payload;	/* disk specific data */
139 } vd_dring_entry_t;
140 
141 
142 /*
143  * vDisk control operation structures
144  *
145  * XXX FIXME - future support - add structures for VD_OP_XXXX
146  */
147 
148 /*
149  * VTOC message
150  *
151  * vDisk Get Volume Table of Contents (VD_OP_GET_VTOC)
152  *
153  */
154 typedef struct vd_partition {
155 	uint16_t	p_tag;		/* ID tag of partition */
156 	uint16_t	p_flag;		/* permision flags */
157 	uint32_t	reserved;	/* padding */
158 	int64_t		p_start;	/* start sector no of partition */
159 	int64_t		p_size;		/* # of blocks in partition */
160 } vd_partition_t;
161 
162 typedef struct vd_vtoc {
163 	uint8_t		v_volume[LEN_DKL_VVOL]; /* volume name */
164 	uint16_t	v_sectorsz;		/* sector size in bytes */
165 	uint16_t	v_nparts;		/* num of partitions */
166 	uint32_t	reserved;		/* padding */
167 	uint8_t		v_asciilabel[LEN_DKL_ASCII];    /* for compatibility */
168 
169 } vd_vtoc_t;
170 
171 
172 /*
173  * vDisk Get Geometry (VD_OP_GET_GEOM)
174  */
175 typedef struct vd_geom {
176 	uint16_t	dkg_ncyl;	/* # of data cylinders */
177 	uint16_t	dkg_acyl;	/* # of alternate cylinders */
178 	uint16_t	dkg_bcyl;	/* cyl offset (for fixed head area) */
179 	uint16_t	dkg_nhead;	/* # of heads */
180 	uint16_t	dkg_nsect;	/* # of data sectors per track */
181 	uint16_t	dkg_intrlv;	/* interleave factor */
182 	uint16_t	dkg_apc;	/* alternates per cyl (SCSI only) */
183 	uint16_t	dkg_rpm;	/* revolutions per minute */
184 	uint16_t	dkg_pcyl;	/* # of physical cylinders */
185 	uint16_t	dkg_write_reinstruct;	/* # sectors to skip, writes */
186 	uint16_t	dkg_read_reinstruct;	/* # sectors to skip, reads */
187 } vd_geom_t;
188 
189 
190 #ifdef	__cplusplus
191 }
192 #endif
193 
194 #endif	/* _VDSK_COMMON_H */
195