]> git.proxmox.com Git - mirror_edk2.git/blob - OvmfPkg/Include/IndustryStandard/Virtio.h
f1eb2ea120d09e88513f73c232ad47093ab81a62
[mirror_edk2.git] / OvmfPkg / Include / IndustryStandard / Virtio.h
1 /** @file
2
3 Generic type and macro definitions corresponding to the virtio-0.9.5
4 specification.
5
6 Copyright (C) 2012, Red Hat, Inc.
7 Portion of Copyright (C) 2013, ARM Ltd.
8
9 This program and the accompanying materials are licensed and made available
10 under the terms and conditions of the BSD License which accompanies this
11 distribution. The full text of the license may be found at
12 http://opensource.org/licenses/bsd-license.php
13
14 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, WITHOUT
15 WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
16
17 **/
18
19 #ifndef _VIRTIO_H_
20 #define _VIRTIO_H_
21
22 #include <Base.h>
23
24 //
25 // VirtIo Subsystem Device IDs
26 //
27 #define VIRTIO_SUBSYSTEM_NETWORK_CARD 1
28 #define VIRTIO_SUBSYSTEM_BLOCK_DEVICE 2
29 #define VIRTIO_SUBSYSTEM_CONSOLE 3
30 #define VIRTIO_SUBSYSTEM_ENTROPY_SOURCE 4
31 #define VIRTIO_SUBSYSTEM_MEMORY_BALLOONING 5
32 #define VIRTIO_SUBSYSTEM_IO_MEMORY 6
33 #define VIRTIO_SUBSYSTEM_RPMSG 7
34 #define VIRTIO_SUBSYSTEM_SCSI_HOST 8
35 #define VIRTIO_SUBSYSTEM_9P_TRANSPORT 9
36 #define VIRTIO_SUBSYSTEM_MAC80211_WLAN 10
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
98 typedef struct {
99 volatile UINT16 *Flags;
100 volatile UINT16 *Idx;
101
102 volatile UINT16 *Ring; // QueueSize elements
103 volatile UINT16 *UsedEvent; // unused as per negotiation
104 } VRING_AVAIL;
105
106
107 //
108 // virtio-0.9.5, 2.3.5 Used Ring
109 //
110 #define VRING_USED_F_NO_NOTIFY BIT0
111
112 #pragma pack(1)
113 typedef struct {
114 UINT32 Id;
115 UINT32 Len;
116 } VRING_USED_ELEM;
117 #pragma pack()
118
119 typedef struct {
120 volatile UINT16 *Flags;
121 volatile UINT16 *Idx;
122 volatile VRING_USED_ELEM *UsedElem; // QueueSize elements
123 volatile UINT16 *AvailEvent; // unused as per negotiation
124 } VRING_USED;
125
126
127 //
128 // virtio-0.9.5, 2.3.2 Descriptor Table
129 //
130 #define VRING_DESC_F_NEXT BIT0 // more descriptors in this request
131 #define VRING_DESC_F_WRITE BIT1 // buffer to be written *by the host*
132 #define VRING_DESC_F_INDIRECT BIT2 // unused
133
134 #pragma pack(1)
135 typedef struct {
136 UINT64 Addr;
137 UINT32 Len;
138 UINT16 Flags;
139 UINT16 Next;
140 } VRING_DESC;
141 #pragma pack()
142
143 typedef struct {
144 UINTN NumPages;
145 VOID *Base; // deallocate only this field
146 volatile VRING_DESC *Desc; // QueueSize elements
147 VRING_AVAIL Avail;
148 VRING_USED Used;
149 UINT16 QueueSize;
150 } VRING;
151
152
153 //
154 // virtio-0.9.5, 2.2.2 Virtio Header -- no MSI-X
155 //
156 #pragma pack(1)
157 typedef struct {
158 UINT32 VhdrDeviceFeatureBits;
159 UINT32 VhdrGuestFeatureBits;
160 UINT32 VhdrQueueAddress;
161 UINT16 VhdrQueueSize;
162 UINT16 VhdrQueueSelect;
163 UINT16 VhdrQueueNotify;
164 UINT8 VhdrDeviceStatus;
165 UINT8 VhdrISR;
166 } VIRTIO_HDR;
167 #pragma pack()
168
169
170 //
171 // virtio-0.9.5, 2.2.2.1 Device Status
172 //
173 #define VSTAT_ACK BIT0
174 #define VSTAT_DRIVER BIT1
175 #define VSTAT_DRIVER_OK BIT2
176 #define VSTAT_FAILED BIT7
177
178 //
179 // virtio-0.9.5, Appendix B: Reserved (Device-Independent) Feature Bits
180 //
181 #define VIRTIO_F_NOTIFY_ON_EMPTY BIT24
182 #define VIRTIO_F_RING_INDIRECT_DESC BIT28
183 #define VIRTIO_F_RING_EVENT_IDX BIT29
184
185
186 #endif // _VIRTIO_H_