/** @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 <IndustryStandard/Virtio.h> | |
// | |
// 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_ |