xref: /openbsd-src/usr.sbin/vmd/vioscsi.h (revision a1f207244cebffa045bf20706d2ad00bdb962308)
1*a1f20724Skrw /*	$OpenBSD: vioscsi.h,v 1.3 2020/09/03 13:11:49 krw Exp $  */
295ab188fSccardenas 
395ab188fSccardenas /*
495ab188fSccardenas  * Copyright (c) 2017 Carlos Cardenas <ccardenas@openbsd.org>
595ab188fSccardenas  *
695ab188fSccardenas  * Permission to use, copy, modify, and distribute this software for any
795ab188fSccardenas  * purpose with or without fee is hereby granted, provided that the above
895ab188fSccardenas  * copyright notice and this permission notice appear in all copies.
995ab188fSccardenas  *
1095ab188fSccardenas  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
1195ab188fSccardenas  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
1295ab188fSccardenas  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
1395ab188fSccardenas  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
1495ab188fSccardenas  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
1595ab188fSccardenas  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
1695ab188fSccardenas  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
1795ab188fSccardenas  */
1895ab188fSccardenas 
1995ab188fSccardenas /* Constants */
2095ab188fSccardenas #define VIOSCSI_SEG_MAX			17
2195ab188fSccardenas #define VIOSCSI_CDB_LEN			32
2295ab188fSccardenas #define VIOSCSI_SENSE_LEN		96
2395ab188fSccardenas 
2495ab188fSccardenas #define VIOSCSI_NUM_QUEUES		1
2595ab188fSccardenas #define VIOSCSI_CMD_PER_LUN		1
2695ab188fSccardenas #define VIOSCSI_MAX_TARGET		1
2795ab188fSccardenas #define VIOSCSI_MAX_LUN			1
2895ab188fSccardenas 
2995ab188fSccardenas #define VIOSCSI_BLOCK_SIZE_CDROM	2048
3095ab188fSccardenas 
3195ab188fSccardenas #define READ_TOC_START_TRACK		0x01
3295ab188fSccardenas #define READ_TOC_LAST_TRACK		0x01
3395ab188fSccardenas #define READ_TOC_LEAD_OUT_TRACK		0xaa
3495ab188fSccardenas #define READ_TOC_ADR_CTL		0x14
3595ab188fSccardenas 
3695ab188fSccardenas #define SENSE_DEFAULT_ASCQ		0x00
3795ab188fSccardenas #define SENSE_LBA_OUT_OF_RANGE		0x21
3895ab188fSccardenas #define SENSE_ILLEGAL_CDB_FIELD		0x24
3995ab188fSccardenas #define SENSE_MEDIUM_NOT_PRESENT	0x3a
4095ab188fSccardenas 
4195ab188fSccardenas #define INQUIRY_VENDOR			"OpenBSD "
4295ab188fSccardenas #define INQUIRY_VENDOR_LEN		8
4395ab188fSccardenas #define INQUIRY_PRODUCT			"VMM CD-ROM      "
4495ab188fSccardenas #define INQUIRY_PRODUCT_LEN		16
4595ab188fSccardenas #define INQUIRY_REVISION		"001 "
4695ab188fSccardenas #define INQUIRY_REVISION_LEN		4
4795ab188fSccardenas 
4895ab188fSccardenas #define MODE_MEDIUM_TYPE_CODE		0x70
4995ab188fSccardenas #define MODE_ERR_RECOVERY_PAGE_CODE	0x01
5095ab188fSccardenas #define MODE_ERR_RECOVERY_PAGE_LEN	0x0a
5195ab188fSccardenas #define MODE_READ_RETRY_COUNT		0x05
5295ab188fSccardenas #define MODE_CDVD_CAP_PAGE_CODE		0x2a
5395ab188fSccardenas #define MODE_CDVD_CAP_READ_CODE		0x08
5495ab188fSccardenas #define MODE_CDVD_CAP_NUM_LEVELS	0x02
5595ab188fSccardenas 
5695ab188fSccardenas #define GESN_HEADER_LEN			0x06
5795ab188fSccardenas 
5895ab188fSccardenas #define G_CONFIG_REPLY_SIZE		56
5995ab188fSccardenas #define G_CONFIG_REPLY_SIZE_HEX		0x0034
6095ab188fSccardenas 
61845b4456Sccardenas #define RPL_MIN_SIZE			16
62845b4456Sccardenas 
6395ab188fSccardenas /* Opcodes not defined in scsi */
6495ab188fSccardenas #define GET_EVENT_STATUS_NOTIFICATION	0x4a
6595ab188fSccardenas #define GET_CONFIGURATION		0x46
6695ab188fSccardenas #define READ_DISC_INFORMATION		0x51
6795ab188fSccardenas #define MECHANISM_STATUS		0xbd
6895ab188fSccardenas 
6995ab188fSccardenas /* Sizes for reply structures */
7095ab188fSccardenas #define TOC_DATA_SIZE			20
7195ab188fSccardenas #define GESN_SIZE			8
7295ab188fSccardenas #define RESP_SENSE_LEN			14
7395ab188fSccardenas 
7495ab188fSccardenas /* Structures for Opcodes defined locally */
7595ab188fSccardenas struct scsi_mechanism_status {
7695ab188fSccardenas 	u_int8_t opcode;
7795ab188fSccardenas 	u_int8_t unused[7];
7895ab188fSccardenas 	u_int8_t length[2];
7995ab188fSccardenas 	u_int8_t unused1;
8095ab188fSccardenas 	u_int8_t control;
8195ab188fSccardenas };
8295ab188fSccardenas 
8395ab188fSccardenas struct scsi_mechanism_status_header {
8495ab188fSccardenas 	u_int8_t byte1;
8595ab188fSccardenas 	u_int8_t byte2;
8695ab188fSccardenas 	u_int8_t addr[3];
8795ab188fSccardenas 	u_int8_t num_slots;
8895ab188fSccardenas 	u_int8_t slot_len[2];
8995ab188fSccardenas };
9095ab188fSccardenas 
9195ab188fSccardenas struct scsi_read_disc_information {
9295ab188fSccardenas 	u_int8_t opcode;
9395ab188fSccardenas 	u_int8_t byte2;
9495ab188fSccardenas 	u_int8_t unused[5];
9595ab188fSccardenas 	u_int8_t length[2];
9695ab188fSccardenas 	u_int8_t control;
9795ab188fSccardenas };
9895ab188fSccardenas 
9995ab188fSccardenas struct scsi_gesn {
10095ab188fSccardenas 	u_int8_t opcode;
10195ab188fSccardenas 	u_int8_t byte2;
10295ab188fSccardenas 	u_int8_t unused[2];
10395ab188fSccardenas 	u_int8_t notify_class;
10495ab188fSccardenas 	u_int8_t unused1[2];
10595ab188fSccardenas 	u_int8_t length[2];
10695ab188fSccardenas 	u_int8_t control;
10795ab188fSccardenas };
10895ab188fSccardenas 
10995ab188fSccardenas struct scsi_gesn_event_header {
11095ab188fSccardenas 	u_int8_t length[2];
11195ab188fSccardenas 	u_int8_t notification;
11295ab188fSccardenas #define GESN_NOTIFY_NONE		0x0
11395ab188fSccardenas #define GESN_NOTIFY_OP_CHANGE		0x1
11495ab188fSccardenas #define GESN_NOTIFY_POWER_MGMT		0x2
11595ab188fSccardenas #define GESN_NOTIFY_EXT_REQUEST		0x3
11695ab188fSccardenas #define GESN_NOTIFY_MEDIA		0x4
11795ab188fSccardenas #define GESN_NOTIFY_MULTIPLE_HOSTS	0x5
11895ab188fSccardenas #define GESN_NOTIFY_DEVICE_BUSY		0x6
11995ab188fSccardenas #define GESN_NOTIFY_RESERVED		0x7
12095ab188fSccardenas 	u_int8_t supported_event;
12195ab188fSccardenas #define GESN_EVENT_NONE			0x1
12295ab188fSccardenas #define GESN_EVENT_OP_CHANGE		0x2
12395ab188fSccardenas #define GESN_EVENT_POWER_MGMT		0x4
12495ab188fSccardenas #define GESN_EVENT_EXT_REQUEST		0x8
12595ab188fSccardenas #define GESN_EVENT_MEDIA		0x10
12695ab188fSccardenas #define GESN_EVENT_MULTIPLE_HOSTS	0x20
12795ab188fSccardenas #define GESN_EVENT_DEVICE_BUSY		0x40
12895ab188fSccardenas #define GESN_EVENT_RESERVED		0x80
12995ab188fSccardenas };
13095ab188fSccardenas 
13195ab188fSccardenas struct scsi_gesn_power_event {
13295ab188fSccardenas 	u_int8_t event_code;
13395ab188fSccardenas #define GESN_CODE_NOCHG			0x0
13495ab188fSccardenas #define GESN_CODE_PWRCHG_SUCCESS	0x1
13595ab188fSccardenas #define GESN_CODE_PWRCHG_FAIL		0x2
13695ab188fSccardenas #define GESN_CODE_RESERVED		0x3
13795ab188fSccardenas 	u_int8_t status;
13895ab188fSccardenas #define GESN_STATUS_RESERVED		0x0
13995ab188fSccardenas #define GESN_STATUS_ACTIVE		0x1
14095ab188fSccardenas #define GESN_STATUS_IDLE		0x2
14195ab188fSccardenas #define GESN_STATUS_STANDBY		0x3
14295ab188fSccardenas #define GESN_STATUS_SLEEP		0x4
14395ab188fSccardenas 	u_int8_t unused[2];
14495ab188fSccardenas };
14595ab188fSccardenas 
14695ab188fSccardenas struct scsi_get_configuration {
14795ab188fSccardenas 	u_int8_t opcode;
14895ab188fSccardenas 	u_int8_t byte2;
14995ab188fSccardenas 	u_int8_t feature[2];
15095ab188fSccardenas 	u_int8_t unused[3];
15195ab188fSccardenas 	u_int8_t length[2];
15295ab188fSccardenas 	u_int8_t control;
15395ab188fSccardenas };
15495ab188fSccardenas 
15595ab188fSccardenas struct scsi_config_feature_header {
15695ab188fSccardenas 	u_int8_t length[4];
15795ab188fSccardenas 	u_int8_t unused[2];
15895ab188fSccardenas 	u_int8_t current_profile[2];
15995ab188fSccardenas 	/* Complete Profile List in MMC-5, 5.3.1, Table 89 */
16095ab188fSccardenas #define CONFIG_PROFILE_RESERVED		0x0000
16195ab188fSccardenas #define CONFIG_PROFILE_CD_ROM		0x0008
16295ab188fSccardenas #define CONFIG_PROFILE_NON_CONFORM	0xffff
16395ab188fSccardenas };
16495ab188fSccardenas 
16595ab188fSccardenas struct scsi_config_generic_descriptor {
16695ab188fSccardenas 	u_int8_t feature_code[2];
16795ab188fSccardenas 	/* Complete Feature Code List in MMC-5, 5.2.3, Table 86 */
16895ab188fSccardenas #define CONFIG_FEATURE_CODE_PROFILE		0x0000
16995ab188fSccardenas #define CONFIG_FEATURE_CODE_CORE		0x0001
17095ab188fSccardenas #define CONFIG_FEATURE_CODE_MORPHING		0x0002
17195ab188fSccardenas #define CONFIG_FEATURE_CODE_REMOVE_MEDIA	0x0004
17295ab188fSccardenas #define CONFIG_FEATURE_CODE_RANDOM_READ		0x0010
17395ab188fSccardenas 	u_int8_t byte3;
17495ab188fSccardenas #define CONFIG_PROFILELIST_BYTE3		0x03
17595ab188fSccardenas 	u_int8_t length;
17695ab188fSccardenas #define CONFIG_PROFILELIST_LENGTH		0x04
17795ab188fSccardenas };
17895ab188fSccardenas 
17995ab188fSccardenas struct scsi_config_profile_descriptor {
18095ab188fSccardenas 	u_int8_t profile_number[2];
18195ab188fSccardenas 	u_int8_t byte3;
18295ab188fSccardenas #define CONFIG_PROFILE_BYTE3			0x01
18395ab188fSccardenas 	u_int8_t unused;
18495ab188fSccardenas };
18595ab188fSccardenas 
18695ab188fSccardenas struct scsi_config_core_descriptor {
18795ab188fSccardenas 	u_int8_t feature_code[2];
18895ab188fSccardenas 	u_int8_t byte3;
18995ab188fSccardenas #define CONFIG_CORE_BYTE3		0x11
19095ab188fSccardenas 	u_int8_t length;
19195ab188fSccardenas #define CONFIG_CORE_LENGTH		0x08
19295ab188fSccardenas 	u_int8_t phy_std[4];
19395ab188fSccardenas 	/* Complete PHYs List in MMC-5, 5.3.2, Table 91 */
19495ab188fSccardenas #define CONFIG_CORE_PHY_SCSI		0x00000001
19595ab188fSccardenas 	u_int8_t unused[4];
19695ab188fSccardenas };
19795ab188fSccardenas 
19895ab188fSccardenas struct scsi_config_morphing_descriptor {
19995ab188fSccardenas 	u_int8_t feature_code[2];
20095ab188fSccardenas 	u_int8_t byte3;
20195ab188fSccardenas #define CONFIG_MORPHING_BYTE3		0x07
20295ab188fSccardenas 	u_int8_t length;
20395ab188fSccardenas #define CONFIG_MORPHING_LENGTH		0x04
20495ab188fSccardenas 	/* OCE (bit 1), always set and ASYNC (bit 0) Bit */
20595ab188fSccardenas 	u_int8_t byte5;
20695ab188fSccardenas #define CONFIG_MORPHING_BYTE5		0x2
20795ab188fSccardenas 	u_int8_t unused[3];
20895ab188fSccardenas };
20995ab188fSccardenas 
21095ab188fSccardenas struct scsi_config_remove_media_descriptor {
21195ab188fSccardenas 	u_int8_t feature_code[2];
21295ab188fSccardenas 	u_int8_t byte3;
21395ab188fSccardenas #define CONFIG_REMOVE_MEDIA_BYTE3	0x03
21495ab188fSccardenas 	u_int8_t length;
21595ab188fSccardenas #define CONFIG_REMOVE_MEDIA_LENGTH	0x04
21695ab188fSccardenas 	/* Ejection Type */
21795ab188fSccardenas 	u_int8_t byte5;
21895ab188fSccardenas #define CONFIG_REMOVE_MEDIA_BYTE5	0x09
21995ab188fSccardenas 	u_int8_t unused[3];
22095ab188fSccardenas };
22195ab188fSccardenas 
22295ab188fSccardenas struct scsi_config_random_read_descriptor {
22395ab188fSccardenas 	u_int8_t feature_code[2];
22495ab188fSccardenas 	u_int8_t byte3;
22595ab188fSccardenas #define CONFIG_RANDOM_READ_BYTE3	0x03
22695ab188fSccardenas 	u_int8_t length;
22795ab188fSccardenas #define CONFIG_RANDOM_READ_LENGTH	0x08
22895ab188fSccardenas 	u_int8_t block_size[4];
22995ab188fSccardenas 	u_int8_t blocking_type[2];
23095ab188fSccardenas #define CONFIG_RANDOM_READ_BLOCKING_TYPE	0x0010
23195ab188fSccardenas 	u_int8_t unused[2];
23295ab188fSccardenas };
233845b4456Sccardenas 
234845b4456Sccardenas /*
235845b4456Sccardenas  * Variant of scsi_report_luns_data in scsi_all.h
236845b4456Sccardenas  * but with only one lun in the lun list
237845b4456Sccardenas  */
238845b4456Sccardenas struct vioscsi_report_luns_data {
239845b4456Sccardenas 	u_int8_t length[4];
240845b4456Sccardenas 	u_int8_t reserved[4];
241845b4456Sccardenas #define RPL_SINGLE_LUN			8
242845b4456Sccardenas 	u_int8_t lun[RPL_SINGLE_LUN];
243845b4456Sccardenas };
244