diff options
| author | Juergen Gross <jgross@suse.com> | 2014-08-28 00:44:10 -0400 |
|---|---|---|
| committer | Stefano Stabellini <stefano.stabellini@eu.citrix.com> | 2014-09-23 09:36:19 -0400 |
| commit | e124c9a2c3c4c51555fe6f0bc214fe1b5cce3666 (patch) | |
| tree | 8a1940b12d0654f85b8f9495db4abb75efc0bfff /include/xen/interface | |
| parent | 854072dd0f73b8e4238c88bdf0dd2a8db0239c1c (diff) | |
xen: Add Xen pvSCSI protocol description
Add the definition of pvSCSI protocol used between the pvSCSI frontend
in a XEN domU and the pvSCSI backend in a XEN driver domain (usually
Dom0).
This header was originally provided by Fujitsu for Xen based on Linux
2.6.18. Changes are:
- Added comments.
- Adapt to Linux style guide.
- Add support for larger SG-lists by putting them in an own granted
page.
- Remove stale definitions.
Signed-off-by: Juergen Gross <jgross@suse.com>
Signed-off-by: David Vrabel <david.vrabel@citrix.com>
Diffstat (limited to 'include/xen/interface')
| -rw-r--r-- | include/xen/interface/io/vscsiif.h | 229 |
1 files changed, 229 insertions, 0 deletions
diff --git a/include/xen/interface/io/vscsiif.h b/include/xen/interface/io/vscsiif.h new file mode 100644 index 000000000000..d07d7aca8d1c --- /dev/null +++ b/include/xen/interface/io/vscsiif.h | |||
| @@ -0,0 +1,229 @@ | |||
| 1 | /****************************************************************************** | ||
| 2 | * vscsiif.h | ||
| 3 | * | ||
| 4 | * Based on the blkif.h code. | ||
| 5 | * | ||
| 6 | * Permission is hereby granted, free of charge, to any person obtaining a copy | ||
| 7 | * of this software and associated documentation files (the "Software"), to | ||
| 8 | * deal in the Software without restriction, including without limitation the | ||
| 9 | * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or | ||
| 10 | * sell copies of the Software, and to permit persons to whom the Software is | ||
| 11 | * furnished to do so, subject to the following conditions: | ||
| 12 | * | ||
| 13 | * The above copyright notice and this permission notice shall be included in | ||
| 14 | * all copies or substantial portions of the Software. | ||
| 15 | * | ||
| 16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
| 17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
| 18 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||
| 19 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||
| 20 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING | ||
| 21 | * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER | ||
| 22 | * DEALINGS IN THE SOFTWARE. | ||
| 23 | * | ||
| 24 | * Copyright(c) FUJITSU Limited 2008. | ||
| 25 | */ | ||
| 26 | |||
| 27 | #ifndef __XEN__PUBLIC_IO_SCSI_H__ | ||
| 28 | #define __XEN__PUBLIC_IO_SCSI_H__ | ||
| 29 | |||
| 30 | #include "ring.h" | ||
| 31 | #include "../grant_table.h" | ||
| 32 | |||
| 33 | /* | ||
| 34 | * Feature and Parameter Negotiation | ||
| 35 | * ================================= | ||
| 36 | * The two halves of a Xen pvSCSI driver utilize nodes within the XenStore to | ||
| 37 | * communicate capabilities and to negotiate operating parameters. This | ||
| 38 | * section enumerates these nodes which reside in the respective front and | ||
| 39 | * backend portions of the XenStore, following the XenBus convention. | ||
| 40 | * | ||
| 41 | * Any specified default value is in effect if the corresponding XenBus node | ||
| 42 | * is not present in the XenStore. | ||
| 43 | * | ||
| 44 | * XenStore nodes in sections marked "PRIVATE" are solely for use by the | ||
| 45 | * driver side whose XenBus tree contains them. | ||
| 46 | * | ||
| 47 | ***************************************************************************** | ||
| 48 | * Backend XenBus Nodes | ||
| 49 | ***************************************************************************** | ||
| 50 | * | ||
| 51 | *------------------ Backend Device Identification (PRIVATE) ------------------ | ||
| 52 | * | ||
| 53 | * p-devname | ||
| 54 | * Values: string | ||
| 55 | * | ||
| 56 | * A free string used to identify the physical device (e.g. a disk name). | ||
| 57 | * | ||
| 58 | * p-dev | ||
| 59 | * Values: string | ||
| 60 | * | ||
| 61 | * A string specifying the backend device: either a 4-tuple "h:c:t:l" | ||
| 62 | * (host, controller, target, lun, all integers), or a WWN (e.g. | ||
| 63 | * "naa.60014054ac780582"). | ||
| 64 | * | ||
| 65 | * v-dev | ||
| 66 | * Values: string | ||
| 67 | * | ||
| 68 | * A string specifying the frontend device in form of a 4-tuple "h:c:t:l" | ||
| 69 | * (host, controller, target, lun, all integers). | ||
| 70 | * | ||
| 71 | *--------------------------------- Features --------------------------------- | ||
| 72 | * | ||
| 73 | * feature-sg-grant | ||
| 74 | * Values: unsigned [VSCSIIF_SG_TABLESIZE...65535] | ||
| 75 | * Default Value: 0 | ||
| 76 | * | ||
| 77 | * Specifies the maximum number of scatter/gather elements in grant pages | ||
| 78 | * supported. If not set, the backend supports up to VSCSIIF_SG_TABLESIZE | ||
| 79 | * SG elements specified directly in the request. | ||
| 80 | * | ||
| 81 | ***************************************************************************** | ||
| 82 | * Frontend XenBus Nodes | ||
| 83 | ***************************************************************************** | ||
| 84 | * | ||
| 85 | *----------------------- Request Transport Parameters ----------------------- | ||
| 86 | * | ||
| 87 | * event-channel | ||
| 88 | * Values: unsigned | ||
| 89 | * | ||
| 90 | * The identifier of the Xen event channel used to signal activity | ||
| 91 | * in the ring buffer. | ||
| 92 | * | ||
| 93 | * ring-ref | ||
| 94 | * Values: unsigned | ||
| 95 | * | ||
| 96 | * The Xen grant reference granting permission for the backend to map | ||
| 97 | * the sole page in a single page sized ring buffer. | ||
| 98 | * | ||
| 99 | * protocol | ||
| 100 | * Values: string (XEN_IO_PROTO_ABI_*) | ||
| 101 | * Default Value: XEN_IO_PROTO_ABI_NATIVE | ||
| 102 | * | ||
| 103 | * The machine ABI rules governing the format of all ring request and | ||
| 104 | * response structures. | ||
| 105 | */ | ||
| 106 | |||
| 107 | /* Requests from the frontend to the backend */ | ||
| 108 | |||
| 109 | /* | ||
| 110 | * Request a SCSI operation specified via a CDB in vscsiif_request.cmnd. | ||
| 111 | * The target is specified via channel, id and lun. | ||
| 112 | * | ||
| 113 | * The operation to be performed is specified via a CDB in cmnd[], the length | ||
| 114 | * of the CDB is in cmd_len. sc_data_direction specifies the direction of data | ||
| 115 | * (to the device, from the device, or none at all). | ||
| 116 | * | ||
| 117 | * If data is to be transferred to or from the device the buffer(s) in the | ||
| 118 | * guest memory is/are specified via one or multiple scsiif_request_segment | ||
| 119 | * descriptors each specifying a memory page via a grant_ref_t, a offset into | ||
| 120 | * the page and the length of the area in that page. All scsiif_request_segment | ||
| 121 | * areas concatenated form the resulting data buffer used by the operation. | ||
| 122 | * If the number of scsiif_request_segment areas is not too large (less than | ||
| 123 | * or equal VSCSIIF_SG_TABLESIZE) the areas can be specified directly in the | ||
| 124 | * seg[] array and the number of valid scsiif_request_segment elements is to be | ||
| 125 | * set in nr_segments. | ||
| 126 | * | ||
| 127 | * If "feature-sg-grant" in the Xenstore is set it is possible to specify more | ||
| 128 | * than VSCSIIF_SG_TABLESIZE scsiif_request_segment elements via indirection. | ||
| 129 | * The maximum number of allowed scsiif_request_segment elements is the value | ||
| 130 | * of the "feature-sg-grant" entry from Xenstore. When using indirection the | ||
| 131 | * seg[] array doesn't contain specifications of the data buffers, but | ||
| 132 | * references to scsiif_request_segment arrays, which in turn reference the | ||
| 133 | * data buffers. While nr_segments holds the number of populated seg[] entries | ||
| 134 | * (plus the set VSCSIIF_SG_GRANT bit), the number of scsiif_request_segment | ||
| 135 | * elements referencing the target data buffers is calculated from the lengths | ||
| 136 | * of the seg[] elements (the sum of all valid seg[].length divided by the | ||
| 137 | * size of one scsiif_request_segment structure). | ||
| 138 | */ | ||
| 139 | #define VSCSIIF_ACT_SCSI_CDB 1 | ||
| 140 | |||
| 141 | /* | ||
| 142 | * Request abort of a running operation for the specified target given by | ||
| 143 | * channel, id, lun and the operation's rqid in ref_rqid. | ||
| 144 | */ | ||
| 145 | #define VSCSIIF_ACT_SCSI_ABORT 2 | ||
| 146 | |||
| 147 | /* | ||
| 148 | * Request a device reset of the specified target (channel and id). | ||
| 149 | */ | ||
| 150 | #define VSCSIIF_ACT_SCSI_RESET 3 | ||
| 151 | |||
| 152 | /* | ||
| 153 | * Preset scatter/gather elements for a following request. Deprecated. | ||
| 154 | * Keeping the define only to avoid usage of the value "4" for other actions. | ||
| 155 | */ | ||
| 156 | #define VSCSIIF_ACT_SCSI_SG_PRESET 4 | ||
| 157 | |||
| 158 | /* | ||
| 159 | * Maximum scatter/gather segments per request. | ||
| 160 | * | ||
| 161 | * Considering balance between allocating at least 16 "vscsiif_request" | ||
| 162 | * structures on one page (4096 bytes) and the number of scatter/gather | ||
| 163 | * elements needed, we decided to use 26 as a magic number. | ||
| 164 | * | ||
| 165 | * If "feature-sg-grant" is set, more scatter/gather elements can be specified | ||
| 166 | * by placing them in one or more (up to VSCSIIF_SG_TABLESIZE) granted pages. | ||
| 167 | * In this case the vscsiif_request seg elements don't contain references to | ||
| 168 | * the user data, but to the SG elements referencing the user data. | ||
| 169 | */ | ||
| 170 | #define VSCSIIF_SG_TABLESIZE 26 | ||
| 171 | |||
| 172 | /* | ||
| 173 | * based on Linux kernel 2.6.18, still valid | ||
| 174 | * Changing these values requires support of multiple protocols via the rings | ||
| 175 | * as "old clients" will blindly use these values and the resulting structure | ||
| 176 | * sizes. | ||
| 177 | */ | ||
| 178 | #define VSCSIIF_MAX_COMMAND_SIZE 16 | ||
| 179 | #define VSCSIIF_SENSE_BUFFERSIZE 96 | ||
| 180 | |||
| 181 | struct scsiif_request_segment { | ||
| 182 | grant_ref_t gref; | ||
| 183 | uint16_t offset; | ||
| 184 | uint16_t length; | ||
| 185 | }; | ||
| 186 | |||
| 187 | #define VSCSIIF_SG_PER_PAGE (PAGE_SIZE / sizeof(struct scsiif_request_segment)) | ||
| 188 | |||
| 189 | /* Size of one request is 252 bytes */ | ||
| 190 | struct vscsiif_request { | ||
| 191 | uint16_t rqid; /* private guest value, echoed in resp */ | ||
| 192 | uint8_t act; /* command between backend and frontend */ | ||
| 193 | uint8_t cmd_len; /* valid CDB bytes */ | ||
| 194 | |||
| 195 | uint8_t cmnd[VSCSIIF_MAX_COMMAND_SIZE]; /* the CDB */ | ||
| 196 | uint16_t timeout_per_command; /* deprecated */ | ||
| 197 | uint16_t channel, id, lun; /* (virtual) device specification */ | ||
| 198 | uint16_t ref_rqid; /* command abort reference */ | ||
| 199 | uint8_t sc_data_direction; /* for DMA_TO_DEVICE(1) | ||
| 200 | DMA_FROM_DEVICE(2) | ||
| 201 | DMA_NONE(3) requests */ | ||
| 202 | uint8_t nr_segments; /* Number of pieces of scatter-gather */ | ||
| 203 | /* | ||
| 204 | * flag in nr_segments: SG elements via grant page | ||
| 205 | * | ||
| 206 | * If VSCSIIF_SG_GRANT is set, the low 7 bits of nr_segments specify the number | ||
| 207 | * of grant pages containing SG elements. Usable if "feature-sg-grant" set. | ||
| 208 | */ | ||
| 209 | #define VSCSIIF_SG_GRANT 0x80 | ||
| 210 | |||
| 211 | struct scsiif_request_segment seg[VSCSIIF_SG_TABLESIZE]; | ||
| 212 | uint32_t reserved[3]; | ||
| 213 | }; | ||
| 214 | |||
| 215 | /* Size of one response is 252 bytes */ | ||
| 216 | struct vscsiif_response { | ||
| 217 | uint16_t rqid; /* identifies request */ | ||
| 218 | uint8_t padding; | ||
| 219 | uint8_t sense_len; | ||
| 220 | uint8_t sense_buffer[VSCSIIF_SENSE_BUFFERSIZE]; | ||
| 221 | int32_t rslt; | ||
| 222 | uint32_t residual_len; /* request bufflen - | ||
| 223 | return the value from physical device */ | ||
| 224 | uint32_t reserved[36]; | ||
| 225 | }; | ||
| 226 | |||
| 227 | DEFINE_RING_TYPES(vscsiif, struct vscsiif_request, struct vscsiif_response); | ||
| 228 | |||
| 229 | #endif /*__XEN__PUBLIC_IO_SCSI_H__*/ | ||
