1/** @file
2
3  Virtio Block Device specific type and macro definitions corresponding to the
4  virtio-0.9.5 specification.
5
6  Copyright (C) 2012, Red Hat, Inc.
7
8  This program and the accompanying materials are licensed and made available
9  under the terms and conditions of the BSD License which accompanies this
10  distribution. The full text of the license may be found at
11  http://opensource.org/licenses/bsd-license.php
12
13  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, WITHOUT
14  WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
15
16**/
17
18#ifndef _VIRTIO_BLK_H_
19#define _VIRTIO_BLK_H_
20
21#include <IndustryStandard/Virtio.h>
22
23
24//
25// virtio-0.9.5, Appendix D: Block Device
26//
27#pragma pack(1)
28typedef struct {
29  UINT8  PhysicalBlockExp; // # of logical blocks per physical block (log2)
30  UINT8  AlignmentOffset;  // offset of first aligned logical block
31  UINT16 MinIoSize;        // suggested minimum I/O size in blocks
32  UINT32 OptIoSize;        // optimal (suggested maximum) I/O size in blocks
33} VIRTIO_BLK_TOPOLOGY;
34
35typedef struct {
36  UINT64              Capacity;
37  UINT32              SizeMax;
38  UINT32              SegMax;
39  UINT16              Cylinders;
40  UINT8               Heads;
41  UINT8               Sectors;
42  UINT32              BlkSize;
43  VIRTIO_BLK_TOPOLOGY Topology;
44} VIRTIO_BLK_CONFIG;
45#pragma pack()
46
47#define OFFSET_OF_VBLK(Field) OFFSET_OF (VIRTIO_BLK_CONFIG, Field)
48#define SIZE_OF_VBLK(Field)   (sizeof ((VIRTIO_BLK_CONFIG *) 0)->Field)
49
50#define VIRTIO_BLK_F_BARRIER  BIT0
51#define VIRTIO_BLK_F_SIZE_MAX BIT1
52#define VIRTIO_BLK_F_SEG_MAX  BIT2
53#define VIRTIO_BLK_F_GEOMETRY BIT4
54#define VIRTIO_BLK_F_RO       BIT5
55#define VIRTIO_BLK_F_BLK_SIZE BIT6  // treated as "logical block size" in
56                                    // practice; actual host side
57                                    // implementation negotiates "optimal"
58                                    // block size separately, via
59                                    // VIRTIO_BLK_F_TOPOLOGY
60#define VIRTIO_BLK_F_SCSI     BIT7
61#define VIRTIO_BLK_F_FLUSH    BIT9  // identical to "write cache enabled"
62#define VIRTIO_BLK_F_TOPOLOGY BIT10 // information on optimal I/O alignment
63
64//
65// We keep the status byte separate from the rest of the virtio-blk request
66// header. See description of historical scattering at the end of Appendix D:
67// we're going to put the status byte in a separate VRING_DESC.
68//
69#pragma pack(1)
70typedef struct {
71  UINT32 Type;
72  UINT32 IoPrio;
73  UINT64 Sector;
74} VIRTIO_BLK_REQ;
75#pragma pack()
76
77#define VIRTIO_BLK_T_IN           0x00000000
78#define VIRTIO_BLK_T_OUT          0x00000001
79#define VIRTIO_BLK_T_SCSI_CMD     0x00000002
80#define VIRTIO_BLK_T_SCSI_CMD_OUT 0x00000003
81#define VIRTIO_BLK_T_FLUSH        0x00000004
82#define VIRTIO_BLK_T_FLUSH_OUT    0x00000005
83#define VIRTIO_BLK_T_BARRIER      BIT31
84
85#define VIRTIO_BLK_S_OK           0x00
86#define VIRTIO_BLK_S_IOERR        0x01
87#define VIRTIO_BLK_S_UNSUPP       0x02
88
89#endif // _VIRTIO_BLK_H_
90