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 | SPDX-License-Identifier: BSD-2-Clause-Patent
|
---|
9 |
|
---|
10 | **/
|
---|
11 |
|
---|
12 | #ifndef _VIRTIO_BLK_H_
|
---|
13 | #define _VIRTIO_BLK_H_
|
---|
14 |
|
---|
15 | #include <IndustryStandard/Virtio.h>
|
---|
16 |
|
---|
17 | //
|
---|
18 | // virtio-0.9.5, Appendix D: Block Device
|
---|
19 | //
|
---|
20 | #pragma pack(1)
|
---|
21 | typedef struct {
|
---|
22 | UINT8 PhysicalBlockExp; // # of logical blocks per physical block (log2)
|
---|
23 | UINT8 AlignmentOffset; // offset of first aligned logical block
|
---|
24 | UINT16 MinIoSize; // suggested minimum I/O size in blocks
|
---|
25 | UINT32 OptIoSize; // optimal (suggested maximum) I/O size in blocks
|
---|
26 | } VIRTIO_BLK_TOPOLOGY;
|
---|
27 |
|
---|
28 | typedef struct {
|
---|
29 | UINT64 Capacity;
|
---|
30 | UINT32 SizeMax;
|
---|
31 | UINT32 SegMax;
|
---|
32 | UINT16 Cylinders;
|
---|
33 | UINT8 Heads;
|
---|
34 | UINT8 Sectors;
|
---|
35 | UINT32 BlkSize;
|
---|
36 | VIRTIO_BLK_TOPOLOGY Topology;
|
---|
37 | } VIRTIO_BLK_CONFIG;
|
---|
38 | #pragma pack()
|
---|
39 |
|
---|
40 | #define OFFSET_OF_VBLK(Field) OFFSET_OF (VIRTIO_BLK_CONFIG, Field)
|
---|
41 | #define SIZE_OF_VBLK(Field) (sizeof ((VIRTIO_BLK_CONFIG *) 0)->Field)
|
---|
42 |
|
---|
43 | #define VIRTIO_BLK_F_BARRIER BIT0
|
---|
44 | #define VIRTIO_BLK_F_SIZE_MAX BIT1
|
---|
45 | #define VIRTIO_BLK_F_SEG_MAX BIT2
|
---|
46 | #define VIRTIO_BLK_F_GEOMETRY BIT4
|
---|
47 | #define VIRTIO_BLK_F_RO BIT5
|
---|
48 | #define VIRTIO_BLK_F_BLK_SIZE BIT6 // treated as "logical block size" in
|
---|
49 | // practice; actual host side
|
---|
50 | // implementation negotiates "optimal"
|
---|
51 | // block size separately, via
|
---|
52 | // VIRTIO_BLK_F_TOPOLOGY
|
---|
53 | #define VIRTIO_BLK_F_SCSI BIT7
|
---|
54 | #define VIRTIO_BLK_F_FLUSH BIT9 // identical to "write cache enabled"
|
---|
55 | #define VIRTIO_BLK_F_TOPOLOGY BIT10 // information on optimal I/O alignment
|
---|
56 |
|
---|
57 | //
|
---|
58 | // We keep the status byte separate from the rest of the virtio-blk request
|
---|
59 | // header. See description of historical scattering at the end of Appendix D:
|
---|
60 | // we're going to put the status byte in a separate VRING_DESC.
|
---|
61 | //
|
---|
62 | #pragma pack(1)
|
---|
63 | typedef struct {
|
---|
64 | UINT32 Type;
|
---|
65 | UINT32 IoPrio;
|
---|
66 | UINT64 Sector;
|
---|
67 | } VIRTIO_BLK_REQ;
|
---|
68 | #pragma pack()
|
---|
69 |
|
---|
70 | #define VIRTIO_BLK_T_IN 0x00000000
|
---|
71 | #define VIRTIO_BLK_T_OUT 0x00000001
|
---|
72 | #define VIRTIO_BLK_T_SCSI_CMD 0x00000002
|
---|
73 | #define VIRTIO_BLK_T_SCSI_CMD_OUT 0x00000003
|
---|
74 | #define VIRTIO_BLK_T_FLUSH 0x00000004
|
---|
75 | #define VIRTIO_BLK_T_FLUSH_OUT 0x00000005
|
---|
76 | #define VIRTIO_BLK_T_BARRIER BIT31
|
---|
77 |
|
---|
78 | #define VIRTIO_BLK_S_OK 0x00
|
---|
79 | #define VIRTIO_BLK_S_IOERR 0x01
|
---|
80 | #define VIRTIO_BLK_S_UNSUPP 0x02
|
---|
81 |
|
---|
82 | #endif // _VIRTIO_BLK_H_
|
---|