4 * This module allows virtio devices to be used over a virtual PCI device.
5 * This can be used with QEMU based VMMs like KVM or Xen.
7 * Copyright IBM Corp. 2007
10 * Anthony Liguori <aliguori@us.ibm.com>
12 * This header is BSD licensed so anyone can use the definitions to implement
13 * compatible drivers/servers.
15 * Redistribution and use in source and binary forms, with or without
16 * modification, are permitted provided that the following conditions
18 * 1. Redistributions of source code must retain the above copyright
19 * notice, this list of conditions and the following disclaimer.
20 * 2. Redistributions in binary form must reproduce the above copyright
21 * notice, this list of conditions and the following disclaimer in the
22 * documentation and/or other materials provided with the distribution.
23 * 3. Neither the name of IBM nor the names of its contributors
24 * may be used to endorse or promote products derived from this software
25 * without specific prior written permission.
26 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND
27 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
28 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
29 * ARE DISCLAIMED. IN NO EVENT SHALL IBM OR CONTRIBUTORS BE LIABLE
30 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
31 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
32 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
33 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
34 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
35 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
39 #ifndef _LINUX_VIRTIO_PCI_H
40 #define _LINUX_VIRTIO_PCI_H
42 #include <linux/types.h>
43 #include <linux/kernel.h>
45 #ifndef VIRTIO_PCI_NO_LEGACY
47 /* A 32-bit r/o bitmask of the features supported by the host */
48 #define VIRTIO_PCI_HOST_FEATURES 0
50 /* A 32-bit r/w bitmask of features activated by the guest */
51 #define VIRTIO_PCI_GUEST_FEATURES 4
53 /* A 32-bit r/w PFN for the currently selected queue */
54 #define VIRTIO_PCI_QUEUE_PFN 8
56 /* A 16-bit r/o queue size for the currently selected queue */
57 #define VIRTIO_PCI_QUEUE_NUM 12
59 /* A 16-bit r/w queue selector */
60 #define VIRTIO_PCI_QUEUE_SEL 14
62 /* A 16-bit r/w queue notifier */
63 #define VIRTIO_PCI_QUEUE_NOTIFY 16
65 /* An 8-bit device status register. */
66 #define VIRTIO_PCI_STATUS 18
68 /* An 8-bit r/o interrupt status register. Reading the value will return the
69 * current contents of the ISR and will also clear it. This is effectively
70 * a read-and-acknowledge. */
71 #define VIRTIO_PCI_ISR 19
73 /* MSI-X registers: only enabled if MSI-X is enabled. */
74 /* A 16-bit vector for configuration changes. */
75 #define VIRTIO_MSI_CONFIG_VECTOR 20
76 /* A 16-bit vector for selected queue notifications. */
77 #define VIRTIO_MSI_QUEUE_VECTOR 22
79 /* The remaining space is defined by each driver as the per-driver
80 * configuration space */
81 #define VIRTIO_PCI_CONFIG_OFF(msix_enabled) ((msix_enabled) ? 24 : 20)
82 /* Deprecated: please use VIRTIO_PCI_CONFIG_OFF instead */
83 #define VIRTIO_PCI_CONFIG(dev) VIRTIO_PCI_CONFIG_OFF((dev)->msix_enabled)
85 /* Virtio ABI version, this must match exactly */
86 #define VIRTIO_PCI_ABI_VERSION 0
88 /* How many bits to shift physical queue address written to QUEUE_PFN.
89 * 12 is historical, and due to x86 page size. */
90 #define VIRTIO_PCI_QUEUE_ADDR_SHIFT 12
92 /* The alignment to use between consumer and producer parts of vring.
93 * x86 pagesize again. */
94 #define VIRTIO_PCI_VRING_ALIGN 4096
96 #endif /* VIRTIO_PCI_NO_LEGACY */
98 /* The bit of the ISR which indicates a device configuration change. */
99 #define VIRTIO_PCI_ISR_CONFIG 0x2
100 /* Vector value used to disable MSI for queue */
101 #define VIRTIO_MSI_NO_VECTOR 0xffff
103 #ifndef VIRTIO_PCI_NO_MODERN
105 /* IDs for different capabilities. Must all exist. */
107 /* Common configuration */
108 #define VIRTIO_PCI_CAP_COMMON_CFG 1
110 #define VIRTIO_PCI_CAP_NOTIFY_CFG 2
112 #define VIRTIO_PCI_CAP_ISR_CFG 3
113 /* Device specific configuration */
114 #define VIRTIO_PCI_CAP_DEVICE_CFG 4
115 /* PCI configuration access */
116 #define VIRTIO_PCI_CAP_PCI_CFG 5
117 /* Additional shared memory capability */
118 #define VIRTIO_PCI_CAP_SHARED_MEMORY_CFG 8
120 /* This is the PCI capability header: */
121 struct virtio_pci_cap
{
122 __u8 cap_vndr
; /* Generic PCI field: PCI_CAP_ID_VNDR */
123 __u8 cap_next
; /* Generic PCI field: next ptr. */
124 __u8 cap_len
; /* Generic PCI field: capability length */
125 __u8 cfg_type
; /* Identifies the structure. */
126 __u8 bar
; /* Where to find it. */
127 __u8 id
; /* Multiple capabilities of the same type */
128 __u8 padding
[2]; /* Pad to full dword. */
129 __le32 offset
; /* Offset within bar. */
130 __le32 length
; /* Length of the structure, in bytes. */
133 struct virtio_pci_cap64
{
134 struct virtio_pci_cap cap
;
135 __le32 offset_hi
; /* Most sig 32 bits of offset */
136 __le32 length_hi
; /* Most sig 32 bits of length */
139 struct virtio_pci_notify_cap
{
140 struct virtio_pci_cap cap
;
141 __le32 notify_off_multiplier
; /* Multiplier for queue_notify_off. */
144 /* Fields in VIRTIO_PCI_CAP_COMMON_CFG: */
145 struct virtio_pci_common_cfg
{
146 /* About the whole device. */
147 __le32 device_feature_select
; /* read-write */
148 __le32 device_feature
; /* read-only */
149 __le32 guest_feature_select
; /* read-write */
150 __le32 guest_feature
; /* read-write */
151 __le16 msix_config
; /* read-write */
152 __le16 num_queues
; /* read-only */
153 __u8 device_status
; /* read-write */
154 __u8 config_generation
; /* read-only */
156 /* About a specific virtqueue. */
157 __le16 queue_select
; /* read-write */
158 __le16 queue_size
; /* read-write, power of 2. */
159 __le16 queue_msix_vector
; /* read-write */
160 __le16 queue_enable
; /* read-write */
161 __le16 queue_notify_off
; /* read-only */
162 __le32 queue_desc_lo
; /* read-write */
163 __le32 queue_desc_hi
; /* read-write */
164 __le32 queue_avail_lo
; /* read-write */
165 __le32 queue_avail_hi
; /* read-write */
166 __le32 queue_used_lo
; /* read-write */
167 __le32 queue_used_hi
; /* read-write */
171 * Warning: do not use sizeof on this: use offsetofend for
172 * specific fields you need.
174 struct virtio_pci_modern_common_cfg
{
175 struct virtio_pci_common_cfg cfg
;
177 __le16 queue_notify_data
; /* read-write */
178 __le16 queue_reset
; /* read-write */
180 __le16 admin_queue_index
; /* read-only */
181 __le16 admin_queue_num
; /* read-only */
184 /* Fields in VIRTIO_PCI_CAP_PCI_CFG: */
185 struct virtio_pci_cfg_cap
{
186 struct virtio_pci_cap cap
;
187 __u8 pci_cfg_data
[4]; /* Data for BAR access. */
190 /* Macro versions of offsets for the Old Timers! */
191 #define VIRTIO_PCI_CAP_VNDR 0
192 #define VIRTIO_PCI_CAP_NEXT 1
193 #define VIRTIO_PCI_CAP_LEN 2
194 #define VIRTIO_PCI_CAP_CFG_TYPE 3
195 #define VIRTIO_PCI_CAP_BAR 4
196 #define VIRTIO_PCI_CAP_OFFSET 8
197 #define VIRTIO_PCI_CAP_LENGTH 12
199 #define VIRTIO_PCI_NOTIFY_CAP_MULT 16
201 #define VIRTIO_PCI_COMMON_DFSELECT 0
202 #define VIRTIO_PCI_COMMON_DF 4
203 #define VIRTIO_PCI_COMMON_GFSELECT 8
204 #define VIRTIO_PCI_COMMON_GF 12
205 #define VIRTIO_PCI_COMMON_MSIX 16
206 #define VIRTIO_PCI_COMMON_NUMQ 18
207 #define VIRTIO_PCI_COMMON_STATUS 20
208 #define VIRTIO_PCI_COMMON_CFGGENERATION 21
209 #define VIRTIO_PCI_COMMON_Q_SELECT 22
210 #define VIRTIO_PCI_COMMON_Q_SIZE 24
211 #define VIRTIO_PCI_COMMON_Q_MSIX 26
212 #define VIRTIO_PCI_COMMON_Q_ENABLE 28
213 #define VIRTIO_PCI_COMMON_Q_NOFF 30
214 #define VIRTIO_PCI_COMMON_Q_DESCLO 32
215 #define VIRTIO_PCI_COMMON_Q_DESCHI 36
216 #define VIRTIO_PCI_COMMON_Q_AVAILLO 40
217 #define VIRTIO_PCI_COMMON_Q_AVAILHI 44
218 #define VIRTIO_PCI_COMMON_Q_USEDLO 48
219 #define VIRTIO_PCI_COMMON_Q_USEDHI 52
220 #define VIRTIO_PCI_COMMON_Q_NDATA 56
221 #define VIRTIO_PCI_COMMON_Q_RESET 58
222 #define VIRTIO_PCI_COMMON_ADM_Q_IDX 60
223 #define VIRTIO_PCI_COMMON_ADM_Q_NUM 62
225 #endif /* VIRTIO_PCI_NO_MODERN */
227 /* Admin command status. */
228 #define VIRTIO_ADMIN_STATUS_OK 0
230 /* Admin command opcode. */
231 #define VIRTIO_ADMIN_CMD_LIST_QUERY 0x0
232 #define VIRTIO_ADMIN_CMD_LIST_USE 0x1
234 /* Admin command group type. */
235 #define VIRTIO_ADMIN_GROUP_TYPE_SRIOV 0x1
237 /* Transitional device admin command. */
238 #define VIRTIO_ADMIN_CMD_LEGACY_COMMON_CFG_WRITE 0x2
239 #define VIRTIO_ADMIN_CMD_LEGACY_COMMON_CFG_READ 0x3
240 #define VIRTIO_ADMIN_CMD_LEGACY_DEV_CFG_WRITE 0x4
241 #define VIRTIO_ADMIN_CMD_LEGACY_DEV_CFG_READ 0x5
242 #define VIRTIO_ADMIN_CMD_LEGACY_NOTIFY_INFO 0x6
244 /* Device parts access commands. */
245 #define VIRTIO_ADMIN_CMD_CAP_ID_LIST_QUERY 0x7
246 #define VIRTIO_ADMIN_CMD_DEVICE_CAP_GET 0x8
247 #define VIRTIO_ADMIN_CMD_DRIVER_CAP_SET 0x9
248 #define VIRTIO_ADMIN_CMD_RESOURCE_OBJ_CREATE 0xa
249 #define VIRTIO_ADMIN_CMD_RESOURCE_OBJ_DESTROY 0xd
250 #define VIRTIO_ADMIN_CMD_DEV_PARTS_METADATA_GET 0xe
251 #define VIRTIO_ADMIN_CMD_DEV_PARTS_GET 0xf
252 #define VIRTIO_ADMIN_CMD_DEV_PARTS_SET 0x10
253 #define VIRTIO_ADMIN_CMD_DEV_MODE_SET 0x11
255 struct virtio_admin_cmd_hdr
{
262 /* Unused, reserved for future extensions. */
264 __le64 group_member_id
;
267 struct virtio_admin_cmd_status
{
269 __le16 status_qualifier
;
270 /* Unused, reserved for future extensions. */
274 struct virtio_admin_cmd_legacy_wr_data
{
275 __u8 offset
; /* Starting offset of the register(s) to write. */
280 struct virtio_admin_cmd_legacy_rd_data
{
281 __u8 offset
; /* Starting offset of the register(s) to read. */
284 #define VIRTIO_ADMIN_CMD_NOTIFY_INFO_FLAGS_END 0
285 #define VIRTIO_ADMIN_CMD_NOTIFY_INFO_FLAGS_OWNER_DEV 0x1
286 #define VIRTIO_ADMIN_CMD_NOTIFY_INFO_FLAGS_OWNER_MEM 0x2
288 #define VIRTIO_ADMIN_CMD_MAX_NOTIFY_INFO 4
290 struct virtio_admin_cmd_notify_info_data
{
291 __u8 flags
; /* 0 = end of list, 1 = owner device, 2 = member device */
292 __u8 bar
; /* BAR of the member or the owner device */
294 __le64 offset
; /* Offset within bar. */
297 struct virtio_admin_cmd_notify_info_result
{
298 struct virtio_admin_cmd_notify_info_data entries
[VIRTIO_ADMIN_CMD_MAX_NOTIFY_INFO
];
301 #define VIRTIO_DEV_PARTS_CAP 0x0000
303 struct virtio_dev_parts_cap
{
304 __u8 get_parts_resource_objects_limit
;
305 __u8 set_parts_resource_objects_limit
;
308 #define MAX_CAP_ID __KERNEL_DIV_ROUND_UP(VIRTIO_DEV_PARTS_CAP + 1, 64)
310 struct virtio_admin_cmd_query_cap_id_result
{
311 __le64 supported_caps
[MAX_CAP_ID
];
314 struct virtio_admin_cmd_cap_get_data
{
319 struct virtio_admin_cmd_cap_set_data
{
322 __u8 cap_specific_data
[];
325 struct virtio_admin_cmd_resource_obj_cmd_hdr
{
328 __le32 id
; /* Indicates unique resource object id per resource object type */
331 struct virtio_admin_cmd_resource_obj_create_data
{
332 struct virtio_admin_cmd_resource_obj_cmd_hdr hdr
;
334 __u8 resource_obj_specific_data
[];
337 #define VIRTIO_RESOURCE_OBJ_DEV_PARTS 0
339 #define VIRTIO_RESOURCE_OBJ_DEV_PARTS_TYPE_GET 0
340 #define VIRTIO_RESOURCE_OBJ_DEV_PARTS_TYPE_SET 1
342 struct virtio_resource_obj_dev_parts
{
347 #define VIRTIO_ADMIN_CMD_DEV_PARTS_METADATA_TYPE_SIZE 0
348 #define VIRTIO_ADMIN_CMD_DEV_PARTS_METADATA_TYPE_COUNT 1
349 #define VIRTIO_ADMIN_CMD_DEV_PARTS_METADATA_TYPE_LIST 2
351 struct virtio_admin_cmd_dev_parts_metadata_data
{
352 struct virtio_admin_cmd_resource_obj_cmd_hdr hdr
;
357 #define VIRTIO_DEV_PART_F_OPTIONAL 0
359 struct virtio_dev_part_hdr
{
376 struct virtio_dev_part
{
377 struct virtio_dev_part_hdr hdr
;
381 struct virtio_admin_cmd_dev_parts_metadata_result
{
394 struct virtio_dev_part_hdr hdrs
[];
399 #define VIRTIO_ADMIN_CMD_DEV_PARTS_GET_TYPE_SELECTED 0
400 #define VIRTIO_ADMIN_CMD_DEV_PARTS_GET_TYPE_ALL 1
402 struct virtio_admin_cmd_dev_parts_get_data
{
403 struct virtio_admin_cmd_resource_obj_cmd_hdr hdr
;
406 struct virtio_dev_part_hdr hdr_list
[];
409 struct virtio_admin_cmd_dev_parts_set_data
{
410 struct virtio_admin_cmd_resource_obj_cmd_hdr hdr
;
411 struct virtio_dev_part parts
[];
414 #define VIRTIO_ADMIN_CMD_DEV_MODE_F_STOPPED 0
416 struct virtio_admin_cmd_dev_mode_set_data
{