TianoCore EDK2 master
Loading...
Searching...
No Matches
Virtio095.h
Go to the documentation of this file.
1
13#ifndef _VIRTIO_0_9_5_H_
14#define _VIRTIO_0_9_5_H_
15
16#include <Base.h>
17
18//
19// VirtIo Subsystem Device IDs
20//
21#define VIRTIO_SUBSYSTEM_NETWORK_CARD 1
22#define VIRTIO_SUBSYSTEM_BLOCK_DEVICE 2
23#define VIRTIO_SUBSYSTEM_CONSOLE 3
24#define VIRTIO_SUBSYSTEM_ENTROPY_SOURCE 4
25#define VIRTIO_SUBSYSTEM_MEMORY_BALLOONING 5
26#define VIRTIO_SUBSYSTEM_IO_MEMORY 6
27#define VIRTIO_SUBSYSTEM_RPMSG 7
28#define VIRTIO_SUBSYSTEM_SCSI_HOST 8
29#define VIRTIO_SUBSYSTEM_9P_TRANSPORT 9
30#define VIRTIO_SUBSYSTEM_MAC80211_WLAN 10
31
32//
33// Virtio IDs
34//
35#define VIRTIO_VENDOR_ID 0x1AF4
36#define VIRTIO_MMIO_MAGIC 0x74726976 // "virt"
37
38//
39// VirtIo Device Specific Configuration Offsets
40//
41#define VIRTIO_DEVICE_SPECIFIC_CONFIGURATION_OFFSET_PCI 20
42#define VIRTIO_DEVICE_SPECIFIC_CONFIGURATION_OFFSET_PCI_WITH_MSI_X 24
43#define VIRTIO_DEVICE_SPECIFIC_CONFIGURATION_OFFSET_MMIO 0x100
44
45//
46// PCI VirtIo Header Offsets
47//
48#define VIRTIO_PCI_OFFSET_DEVICE_FEATURES 0x00
49#define VIRTIO_PCI_OFFSET_GUEST_FEATURES 0x04
50#define VIRTIO_PCI_OFFSET_QUEUE_ADDRESS 0x08
51#define VIRTIO_PCI_OFFSET_QUEUE_SIZE 0x0C
52#define VIRTIO_PCI_OFFSET_QUEUE_SELECT 0x0E
53#define VIRTIO_PCI_OFFSET_QUEUE_NOTIFY 0x10
54#define VIRTIO_PCI_OFFSET_QUEUE_DEVICE_STATUS 0x12
55#define VIRTIO_PCI_OFFSET_QUEUE_DEVICE_ISR 0x13
56
57//
58// MMIO VirtIo Header Offsets
59//
60#define VIRTIO_MMIO_OFFSET_MAGIC 0x00
61#define VIRTIO_MMIO_OFFSET_VERSION 0x04
62#define VIRTIO_MMIO_OFFSET_DEVICE_ID 0x08
63#define VIRTIO_MMIO_OFFSET_VENDOR_ID 0x0C
64#define VIRTIO_MMIO_OFFSET_HOST_FEATURES 0x10
65#define VIRTIO_MMIO_OFFSET_HOST_FEATURES_SEL 0x14
66#define VIRTIO_MMIO_OFFSET_GUEST_FEATURES 0x20
67#define VIRTIO_MMIO_OFFSET_GUEST_FEATURES_SEL 0x24
68#define VIRTIO_MMIO_OFFSET_GUEST_PAGE_SIZE 0x28
69#define VIRTIO_MMIO_OFFSET_QUEUE_SEL 0x30
70#define VIRTIO_MMIO_OFFSET_QUEUE_NUM_MAX 0x34
71#define VIRTIO_MMIO_OFFSET_QUEUE_NUM 0x38
72#define VIRTIO_MMIO_OFFSET_QUEUE_ALIGN 0x3C
73#define VIRTIO_MMIO_OFFSET_QUEUE_PFN 0x40
74#define VIRTIO_MMIO_OFFSET_QUEUE_NOTIFY 0x50
75#define VIRTIO_MMIO_OFFSET_INTERRUPT_STATUS 0x60
76#define VIRTIO_MMIO_OFFSET_INTERRUPT_ACK 0x64
77#define VIRTIO_MMIO_OFFSET_STATUS 0x70
78
79//
80// Data in the communication area is defined as packed and accessed as
81// volatile.
82//
83// Some structures contain arrays with dynamically determined size. In such
84// cases the array and its sibling fields are replaced with pointers.
85//
86// All indices (variables and fields named *Idx) are free-running and wrap
87// around after 0xFFFF. The queue size reported by the host is always an
88// integral power of 2, not greater than 32768. Actual array indices are
89// consistently calculated by taking the remainder of a given Idx object modulo
90// QueueSize. Since 0x10000 is an integral multiple of the QueueSize, UINT16
91// wraparound is a correct wraparound modulo QueueSize too (it doesn't offset
92// the remainder class).
93//
94// virtio-0.9.5, 2.3.4 Available Ring
95//
96#define VRING_AVAIL_F_NO_INTERRUPT BIT0
97
98typedef struct {
99 volatile UINT16 *Flags;
100 volatile UINT16 *Idx;
101
102 volatile UINT16 *Ring; // QueueSize elements
103 volatile UINT16 *UsedEvent; // unused as per negotiation
105
106//
107// virtio-0.9.5, 2.3.5 Used Ring
108//
109#define VRING_USED_F_NO_NOTIFY BIT0
110
111#pragma pack(1)
112typedef struct {
113 UINT32 Id;
114 UINT32 Len;
116#pragma pack()
117
118typedef struct {
119 volatile UINT16 *Flags;
120 volatile UINT16 *Idx;
121 volatile VRING_USED_ELEM *UsedElem; // QueueSize elements
122 volatile UINT16 *AvailEvent; // unused as per negotiation
123} VRING_USED;
124
125//
126// virtio-0.9.5, 2.3.2 Descriptor Table
127//
128#define VRING_DESC_F_NEXT BIT0 // more descriptors in this request
129#define VRING_DESC_F_WRITE BIT1 // buffer to be written *by the host*
130#define VRING_DESC_F_INDIRECT BIT2 // unused
131
132#pragma pack(1)
133typedef struct {
134 UINT64 Addr;
135 UINT32 Len;
136 UINT16 Flags;
137 UINT16 Next;
138} VRING_DESC;
139#pragma pack()
140
141typedef struct {
142 UINTN NumPages;
143 VOID *Base; // deallocate only this field
144 volatile VRING_DESC *Desc; // QueueSize elements
145 VRING_AVAIL Avail;
146 VRING_USED Used;
147 UINT16 QueueSize;
148} VRING;
149
150//
151// virtio-0.9.5, 2.2.2.1 Device Status
152//
153#define VSTAT_ACK BIT0
154#define VSTAT_DRIVER BIT1
155#define VSTAT_DRIVER_OK BIT2
156#define VSTAT_FAILED BIT7
157
158//
159// virtio-0.9.5, Appendix B: Reserved (Device-Independent) Feature Bits
160//
161#define VIRTIO_F_NOTIFY_ON_EMPTY BIT24
162#define VIRTIO_F_RING_INDIRECT_DESC BIT28
163#define VIRTIO_F_RING_EVENT_IDX BIT29
164
165#endif // _VIRTIO_0_9_5_H_
UINT64 UINTN