/** @file Virtio SCSI Host Device specific type and macro definitions corresponding to the virtio-0.9.5 specification. Copyright (C) 2012, Red Hat, Inc. This program and the accompanying materials are licensed and made available under the terms and conditions of the BSD License which accompanies this distribution. The full text of the license may be found at http://opensource.org/licenses/bsd-license.php THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. **/ #ifndef _VIRTIO_SCSI_H_ #define _VIRTIO_SCSI_H_ #include // // virtio-0.9.5, Appendix I: SCSI Host Device // #pragma pack(1) typedef struct { VIRTIO_HDR Generic; UINT32 VhdrNumQueues; UINT32 VhdrSegMax; UINT32 VhdrMaxSectors; UINT32 VhdrCmdPerLun; UINT32 VhdrEventInfoSize; UINT32 VhdrSenseSize; UINT32 VhdrCdbSize; UINT16 VhdrMaxChannel; UINT16 VhdrMaxTarget; UINT32 VhdrMaxLun; } VSCSI_HDR; #pragma pack() #define OFFSET_OF_VSCSI(Field) OFFSET_OF (VSCSI_HDR, Field) #define SIZE_OF_VSCSI(Field) (sizeof ((VSCSI_HDR *) 0)->Field) #define VIRTIO_SCSI_F_INOUT BIT0 #define VIRTIO_SCSI_F_HOTPLUG BIT1 // // We expect these maximum sizes from the host. Also we force the CdbLength and // SenseDataLength parameters of EFI_EXT_SCSI_PASS_THRU_PROTOCOL.PassThru() not // to exceed these limits. See UEFI 2.3.1 errata C 14.7. // #define VIRTIO_SCSI_CDB_SIZE 32 #define VIRTIO_SCSI_SENSE_SIZE 96 // // We pass the dynamically sized buffers ("dataout", "datain") in separate ring // descriptors. // #pragma pack(1) typedef struct { UINT8 Lun[8]; UINT64 Id; UINT8 TaskAttr; UINT8 Prio; UINT8 Crn; UINT8 Cdb[VIRTIO_SCSI_CDB_SIZE]; } VIRTIO_SCSI_REQ; typedef struct { UINT32 SenseLen; UINT32 Residual; UINT16 StatusQualifier; UINT8 Status; UINT8 Response; UINT8 Sense[VIRTIO_SCSI_SENSE_SIZE]; } VIRTIO_SCSI_RESP; #pragma pack() // // selector of first virtio queue usable for request transfer // #define VIRTIO_SCSI_REQUEST_QUEUE 2 // // host response codes // #define VIRTIO_SCSI_S_OK 0 #define VIRTIO_SCSI_S_OVERRUN 1 #define VIRTIO_SCSI_S_ABORTED 2 #define VIRTIO_SCSI_S_BAD_TARGET 3 #define VIRTIO_SCSI_S_RESET 4 #define VIRTIO_SCSI_S_BUSY 5 #define VIRTIO_SCSI_S_TRANSPORT_FAILURE 6 #define VIRTIO_SCSI_S_TARGET_FAILURE 7 #define VIRTIO_SCSI_S_NEXUS_FAILURE 8 #define VIRTIO_SCSI_S_FAILURE 9 #endif // _VIRTIO_SCSI_H_