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