vioscsi.h revision 1.3
1/*	$OpenBSD: vioscsi.h,v 1.3 2020/09/03 13:11:49 krw Exp $  */
2
3/*
4 * Copyright (c) 2017 Carlos Cardenas <ccardenas@openbsd.org>
5 *
6 * Permission to use, copy, modify, and distribute this software for any
7 * purpose with or without fee is hereby granted, provided that the above
8 * copyright notice and this permission notice appear in all copies.
9 *
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 */
18
19/* Constants */
20#define VIOSCSI_SEG_MAX			17
21#define VIOSCSI_CDB_LEN			32
22#define VIOSCSI_SENSE_LEN		96
23
24#define VIOSCSI_NUM_QUEUES		1
25#define VIOSCSI_CMD_PER_LUN		1
26#define VIOSCSI_MAX_TARGET		1
27#define VIOSCSI_MAX_LUN			1
28
29#define VIOSCSI_BLOCK_SIZE_CDROM	2048
30
31#define READ_TOC_START_TRACK		0x01
32#define READ_TOC_LAST_TRACK		0x01
33#define READ_TOC_LEAD_OUT_TRACK		0xaa
34#define READ_TOC_ADR_CTL		0x14
35
36#define SENSE_DEFAULT_ASCQ		0x00
37#define SENSE_LBA_OUT_OF_RANGE		0x21
38#define SENSE_ILLEGAL_CDB_FIELD		0x24
39#define SENSE_MEDIUM_NOT_PRESENT	0x3a
40
41#define INQUIRY_VENDOR			"OpenBSD "
42#define INQUIRY_VENDOR_LEN		8
43#define INQUIRY_PRODUCT			"VMM CD-ROM      "
44#define INQUIRY_PRODUCT_LEN		16
45#define INQUIRY_REVISION		"001 "
46#define INQUIRY_REVISION_LEN		4
47
48#define MODE_MEDIUM_TYPE_CODE		0x70
49#define MODE_ERR_RECOVERY_PAGE_CODE	0x01
50#define MODE_ERR_RECOVERY_PAGE_LEN	0x0a
51#define MODE_READ_RETRY_COUNT		0x05
52#define MODE_CDVD_CAP_PAGE_CODE		0x2a
53#define MODE_CDVD_CAP_READ_CODE		0x08
54#define MODE_CDVD_CAP_NUM_LEVELS	0x02
55
56#define GESN_HEADER_LEN			0x06
57
58#define G_CONFIG_REPLY_SIZE		56
59#define G_CONFIG_REPLY_SIZE_HEX		0x0034
60
61#define RPL_MIN_SIZE			16
62
63/* Opcodes not defined in scsi */
64#define GET_EVENT_STATUS_NOTIFICATION	0x4a
65#define GET_CONFIGURATION		0x46
66#define READ_DISC_INFORMATION		0x51
67#define MECHANISM_STATUS		0xbd
68
69/* Sizes for reply structures */
70#define TOC_DATA_SIZE			20
71#define GESN_SIZE			8
72#define RESP_SENSE_LEN			14
73
74/* Structures for Opcodes defined locally */
75struct scsi_mechanism_status {
76	u_int8_t opcode;
77	u_int8_t unused[7];
78	u_int8_t length[2];
79	u_int8_t unused1;
80	u_int8_t control;
81};
82
83struct scsi_mechanism_status_header {
84	u_int8_t byte1;
85	u_int8_t byte2;
86	u_int8_t addr[3];
87	u_int8_t num_slots;
88	u_int8_t slot_len[2];
89};
90
91struct scsi_read_disc_information {
92	u_int8_t opcode;
93	u_int8_t byte2;
94	u_int8_t unused[5];
95	u_int8_t length[2];
96	u_int8_t control;
97};
98
99struct scsi_gesn {
100	u_int8_t opcode;
101	u_int8_t byte2;
102	u_int8_t unused[2];
103	u_int8_t notify_class;
104	u_int8_t unused1[2];
105	u_int8_t length[2];
106	u_int8_t control;
107};
108
109struct scsi_gesn_event_header {
110	u_int8_t length[2];
111	u_int8_t notification;
112#define GESN_NOTIFY_NONE		0x0
113#define GESN_NOTIFY_OP_CHANGE		0x1
114#define GESN_NOTIFY_POWER_MGMT		0x2
115#define GESN_NOTIFY_EXT_REQUEST		0x3
116#define GESN_NOTIFY_MEDIA		0x4
117#define GESN_NOTIFY_MULTIPLE_HOSTS	0x5
118#define GESN_NOTIFY_DEVICE_BUSY		0x6
119#define GESN_NOTIFY_RESERVED		0x7
120	u_int8_t supported_event;
121#define GESN_EVENT_NONE			0x1
122#define GESN_EVENT_OP_CHANGE		0x2
123#define GESN_EVENT_POWER_MGMT		0x4
124#define GESN_EVENT_EXT_REQUEST		0x8
125#define GESN_EVENT_MEDIA		0x10
126#define GESN_EVENT_MULTIPLE_HOSTS	0x20
127#define GESN_EVENT_DEVICE_BUSY		0x40
128#define GESN_EVENT_RESERVED		0x80
129};
130
131struct scsi_gesn_power_event {
132	u_int8_t event_code;
133#define GESN_CODE_NOCHG			0x0
134#define GESN_CODE_PWRCHG_SUCCESS	0x1
135#define GESN_CODE_PWRCHG_FAIL		0x2
136#define GESN_CODE_RESERVED		0x3
137	u_int8_t status;
138#define GESN_STATUS_RESERVED		0x0
139#define GESN_STATUS_ACTIVE		0x1
140#define GESN_STATUS_IDLE		0x2
141#define GESN_STATUS_STANDBY		0x3
142#define GESN_STATUS_SLEEP		0x4
143	u_int8_t unused[2];
144};
145
146struct scsi_get_configuration {
147	u_int8_t opcode;
148	u_int8_t byte2;
149	u_int8_t feature[2];
150	u_int8_t unused[3];
151	u_int8_t length[2];
152	u_int8_t control;
153};
154
155struct scsi_config_feature_header {
156	u_int8_t length[4];
157	u_int8_t unused[2];
158	u_int8_t current_profile[2];
159	/* Complete Profile List in MMC-5, 5.3.1, Table 89 */
160#define CONFIG_PROFILE_RESERVED		0x0000
161#define CONFIG_PROFILE_CD_ROM		0x0008
162#define CONFIG_PROFILE_NON_CONFORM	0xffff
163};
164
165struct scsi_config_generic_descriptor {
166	u_int8_t feature_code[2];
167	/* Complete Feature Code List in MMC-5, 5.2.3, Table 86 */
168#define CONFIG_FEATURE_CODE_PROFILE		0x0000
169#define CONFIG_FEATURE_CODE_CORE		0x0001
170#define CONFIG_FEATURE_CODE_MORPHING		0x0002
171#define CONFIG_FEATURE_CODE_REMOVE_MEDIA	0x0004
172#define CONFIG_FEATURE_CODE_RANDOM_READ		0x0010
173	u_int8_t byte3;
174#define CONFIG_PROFILELIST_BYTE3		0x03
175	u_int8_t length;
176#define CONFIG_PROFILELIST_LENGTH		0x04
177};
178
179struct scsi_config_profile_descriptor {
180	u_int8_t profile_number[2];
181	u_int8_t byte3;
182#define CONFIG_PROFILE_BYTE3			0x01
183	u_int8_t unused;
184};
185
186struct scsi_config_core_descriptor {
187	u_int8_t feature_code[2];
188	u_int8_t byte3;
189#define CONFIG_CORE_BYTE3		0x11
190	u_int8_t length;
191#define CONFIG_CORE_LENGTH		0x08
192	u_int8_t phy_std[4];
193	/* Complete PHYs List in MMC-5, 5.3.2, Table 91 */
194#define CONFIG_CORE_PHY_SCSI		0x00000001
195	u_int8_t unused[4];
196};
197
198struct scsi_config_morphing_descriptor {
199	u_int8_t feature_code[2];
200	u_int8_t byte3;
201#define CONFIG_MORPHING_BYTE3		0x07
202	u_int8_t length;
203#define CONFIG_MORPHING_LENGTH		0x04
204	/* OCE (bit 1), always set and ASYNC (bit 0) Bit */
205	u_int8_t byte5;
206#define CONFIG_MORPHING_BYTE5		0x2
207	u_int8_t unused[3];
208};
209
210struct scsi_config_remove_media_descriptor {
211	u_int8_t feature_code[2];
212	u_int8_t byte3;
213#define CONFIG_REMOVE_MEDIA_BYTE3	0x03
214	u_int8_t length;
215#define CONFIG_REMOVE_MEDIA_LENGTH	0x04
216	/* Ejection Type */
217	u_int8_t byte5;
218#define CONFIG_REMOVE_MEDIA_BYTE5	0x09
219	u_int8_t unused[3];
220};
221
222struct scsi_config_random_read_descriptor {
223	u_int8_t feature_code[2];
224	u_int8_t byte3;
225#define CONFIG_RANDOM_READ_BYTE3	0x03
226	u_int8_t length;
227#define CONFIG_RANDOM_READ_LENGTH	0x08
228	u_int8_t block_size[4];
229	u_int8_t blocking_type[2];
230#define CONFIG_RANDOM_READ_BLOCKING_TYPE	0x0010
231	u_int8_t unused[2];
232};
233
234/*
235 * Variant of scsi_report_luns_data in scsi_all.h
236 * but with only one lun in the lun list
237 */
238struct vioscsi_report_luns_data {
239	u_int8_t length[4];
240	u_int8_t reserved[4];
241#define RPL_SINGLE_LUN			8
242	u_int8_t lun[RPL_SINGLE_LUN];
243};
244