]> git.proxmox.com Git - mirror_edk2.git/blob - OvmfPkg/Include/IndustryStandard/Virtio095.h
UefiCpuPkg: Move AsmRelocateApLoopStart from Mpfuncs.nasm to AmdSev.nasm
[mirror_edk2.git] / OvmfPkg / Include / IndustryStandard / Virtio095.h
1 /** @file
2
3 Generic type and macro definitions corresponding to the virtio-0.9.5
4 specification.
5
6 Copyright (C) 2012-2016, Red Hat, Inc.
7 Portion of Copyright (C) 2013, ARM Ltd.
8
9 SPDX-License-Identifier: BSD-2-Clause-Patent
10
11 **/
12
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
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 // virtio-0.9.5, 2.3.5 Used Ring
108 //
109 #define VRING_USED_F_NO_NOTIFY BIT0
110
111 #pragma pack(1)
112 typedef struct {
113 UINT32 Id;
114 UINT32 Len;
115 } VRING_USED_ELEM;
116 #pragma pack()
117
118 typedef 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)
133 typedef struct {
134 UINT64 Addr;
135 UINT32 Len;
136 UINT16 Flags;
137 UINT16 Next;
138 } VRING_DESC;
139 #pragma pack()
140
141 typedef 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_