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