/** @file Virtio Block Device specific type and macro definitions corresponding to the virtio-0.9.5 specification. Copyright (C) 2012, Red Hat, Inc. SPDX-License-Identifier: BSD-2-Clause-Patent **/ #ifndef _VIRTIO_BLK_H_ #define _VIRTIO_BLK_H_ #include // // virtio-0.9.5, Appendix D: Block Device // #pragma pack(1) typedef struct { UINT8 PhysicalBlockExp; // # of logical blocks per physical block (log2) UINT8 AlignmentOffset; // offset of first aligned logical block UINT16 MinIoSize; // suggested minimum I/O size in blocks UINT32 OptIoSize; // optimal (suggested maximum) I/O size in blocks } VIRTIO_BLK_TOPOLOGY; typedef struct { UINT64 Capacity; UINT32 SizeMax; UINT32 SegMax; UINT16 Cylinders; UINT8 Heads; UINT8 Sectors; UINT32 BlkSize; VIRTIO_BLK_TOPOLOGY Topology; } VIRTIO_BLK_CONFIG; #pragma pack() #define OFFSET_OF_VBLK(Field) OFFSET_OF (VIRTIO_BLK_CONFIG, Field) #define SIZE_OF_VBLK(Field) (sizeof ((VIRTIO_BLK_CONFIG *) 0)->Field) #define VIRTIO_BLK_F_BARRIER BIT0 #define VIRTIO_BLK_F_SIZE_MAX BIT1 #define VIRTIO_BLK_F_SEG_MAX BIT2 #define VIRTIO_BLK_F_GEOMETRY BIT4 #define VIRTIO_BLK_F_RO BIT5 #define VIRTIO_BLK_F_BLK_SIZE BIT6 // treated as "logical block size" in // practice; actual host side // implementation negotiates "optimal" // block size separately, via // VIRTIO_BLK_F_TOPOLOGY #define VIRTIO_BLK_F_SCSI BIT7 #define VIRTIO_BLK_F_FLUSH BIT9 // identical to "write cache enabled" #define VIRTIO_BLK_F_TOPOLOGY BIT10 // information on optimal I/O alignment // // We keep the status byte separate from the rest of the virtio-blk request // header. See description of historical scattering at the end of Appendix D: // we're going to put the status byte in a separate VRING_DESC. // #pragma pack(1) typedef struct { UINT32 Type; UINT32 IoPrio; UINT64 Sector; } VIRTIO_BLK_REQ; #pragma pack() #define VIRTIO_BLK_T_IN 0x00000000 #define VIRTIO_BLK_T_OUT 0x00000001 #define VIRTIO_BLK_T_SCSI_CMD 0x00000002 #define VIRTIO_BLK_T_SCSI_CMD_OUT 0x00000003 #define VIRTIO_BLK_T_FLUSH 0x00000004 #define VIRTIO_BLK_T_FLUSH_OUT 0x00000005 #define VIRTIO_BLK_T_BARRIER BIT31 #define VIRTIO_BLK_S_OK 0x00 #define VIRTIO_BLK_S_IOERR 0x01 #define VIRTIO_BLK_S_UNSUPP 0x02 #endif // _VIRTIO_BLK_H_