blob: 23da619d77a971d707f3551beb1a7b5a06f59c50 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
|
/** @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_
|