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