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