1 /* 2 * VFIO API definition 3 * 4 * Copyright (C) 2012 Red Hat, Inc. All rights reserved. 5 * Author: Alex Williamson <alex.williamson@redhat.com> 6 * 7 * This program is free software; you can redistribute it and/or modify 8 * it under the terms of the GNU General Public License version 2 as 9 * published by the Free Software Foundation. 10 */ 11 #ifndef VFIO_H 12 #define VFIO_H 13 14 #include <linux/types.h> 15 #include <linux/ioctl.h> 16 17 #define VFIO_API_VERSION 0 18 19 20 /* Kernel & User level defines for VFIO IOCTLs. */ 21 22 /* Extensions */ 23 24 #define VFIO_TYPE1_IOMMU 1 25 26 /* 27 * The IOCTL interface is designed for extensibility by embedding the 28 * structure length (argsz) and flags into structures passed between 29 * kernel and userspace. We therefore use the _IO() macro for these 30 * defines to avoid implicitly embedding a size into the ioctl request. 31 * As structure fields are added, argsz will increase to match and flag 32 * bits will be defined to indicate additional fields with valid data. 33 * It's *always* the caller's responsibility to indicate the size of 34 * the structure passed by setting argsz appropriately. 35 */ 36 37 #define VFIO_TYPE (';') 38 #define VFIO_BASE 100 39 40 /* -------- IOCTLs for VFIO file descriptor (/dev/vfio/vfio) -------- */ 41 42 /** 43 * VFIO_GET_API_VERSION - _IO(VFIO_TYPE, VFIO_BASE + 0) 44 * 45 * Report the version of the VFIO API. This allows us to bump the entire 46 * API version should we later need to add or change features in incompatible 47 * ways. 48 * Return: VFIO_API_VERSION 49 * Availability: Always 50 */ 51 #define VFIO_GET_API_VERSION _IO(VFIO_TYPE, VFIO_BASE + 0) 52 53 /** 54 * VFIO_CHECK_EXTENSION - _IOW(VFIO_TYPE, VFIO_BASE + 1, __u32) 55 * 56 * Check whether an extension is supported. 57 * Return: 0 if not supported, 1 (or some other positive integer) if supported. 58 * Availability: Always 59 */ 60 #define VFIO_CHECK_EXTENSION _IO(VFIO_TYPE, VFIO_BASE + 1) 61 62 /** 63 * VFIO_SET_IOMMU - _IOW(VFIO_TYPE, VFIO_BASE + 2, __s32) 64 * 65 * Set the iommu to the given type. The type must be supported by an 66 * iommu driver as verified by calling CHECK_EXTENSION using the same 67 * type. A group must be set to this file descriptor before this 68 * ioctl is available. The IOMMU interfaces enabled by this call are 69 * specific to the value set. 70 * Return: 0 on success, -errno on failure 71 * Availability: When VFIO group attached 72 */ 73 #define VFIO_SET_IOMMU _IO(VFIO_TYPE, VFIO_BASE + 2) 74 75 /* -------- IOCTLs for GROUP file descriptors (/dev/vfio/$GROUP) -------- */ 76 77 /** 78 * VFIO_GROUP_GET_STATUS - _IOR(VFIO_TYPE, VFIO_BASE + 3, 79 * struct vfio_group_status) 80 * 81 * Retrieve information about the group. Fills in provided 82 * struct vfio_group_info. Caller sets argsz. 83 * Return: 0 on succes, -errno on failure. 84 * Availability: Always 85 */ 86 struct vfio_group_status { 87 __u32 argsz; 88 __u32 flags; 89 #define VFIO_GROUP_FLAGS_VIABLE (1 << 0) 90 #define VFIO_GROUP_FLAGS_CONTAINER_SET (1 << 1) 91 }; 92 #define VFIO_GROUP_GET_STATUS _IO(VFIO_TYPE, VFIO_BASE + 3) 93 94 /** 95 * VFIO_GROUP_SET_CONTAINER - _IOW(VFIO_TYPE, VFIO_BASE + 4, __s32) 96 * 97 * Set the container for the VFIO group to the open VFIO file 98 * descriptor provided. Groups may only belong to a single 99 * container. Containers may, at their discretion, support multiple 100 * groups. Only when a container is set are all of the interfaces 101 * of the VFIO file descriptor and the VFIO group file descriptor 102 * available to the user. 103 * Return: 0 on success, -errno on failure. 104 * Availability: Always 105 */ 106 #define VFIO_GROUP_SET_CONTAINER _IO(VFIO_TYPE, VFIO_BASE + 4) 107 108 /** 109 * VFIO_GROUP_UNSET_CONTAINER - _IO(VFIO_TYPE, VFIO_BASE + 5) 110 * 111 * Remove the group from the attached container. This is the 112 * opposite of the SET_CONTAINER call and returns the group to 113 * an initial state. All device file descriptors must be released 114 * prior to calling this interface. When removing the last group 115 * from a container, the IOMMU will be disabled and all state lost, 116 * effectively also returning the VFIO file descriptor to an initial 117 * state. 118 * Return: 0 on success, -errno on failure. 119 * Availability: When attached to container 120 */ 121 #define VFIO_GROUP_UNSET_CONTAINER _IO(VFIO_TYPE, VFIO_BASE + 5) 122 123 /** 124 * VFIO_GROUP_GET_DEVICE_FD - _IOW(VFIO_TYPE, VFIO_BASE + 6, char) 125 * 126 * Return a new file descriptor for the device object described by 127 * the provided string. The string should match a device listed in 128 * the devices subdirectory of the IOMMU group sysfs entry. The 129 * group containing the device must already be added to this context. 130 * Return: new file descriptor on success, -errno on failure. 131 * Availability: When attached to container 132 */ 133 #define VFIO_GROUP_GET_DEVICE_FD _IO(VFIO_TYPE, VFIO_BASE + 6) 134 135 /* --------------- IOCTLs for DEVICE file descriptors --------------- */ 136 137 /** 138 * VFIO_DEVICE_GET_INFO - _IOR(VFIO_TYPE, VFIO_BASE + 7, 139 * struct vfio_device_info) 140 * 141 * Retrieve information about the device. Fills in provided 142 * struct vfio_device_info. Caller sets argsz. 143 * Return: 0 on success, -errno on failure. 144 */ 145 struct vfio_device_info { 146 __u32 argsz; 147 __u32 flags; 148 #define VFIO_DEVICE_FLAGS_RESET (1 << 0) /* Device supports reset */ 149 #define VFIO_DEVICE_FLAGS_PCI (1 << 1) /* vfio-pci device */ 150 __u32 num_regions; /* Max region index + 1 */ 151 __u32 num_irqs; /* Max IRQ index + 1 */ 152 }; 153 #define VFIO_DEVICE_GET_INFO _IO(VFIO_TYPE, VFIO_BASE + 7) 154 155 /** 156 * VFIO_DEVICE_GET_REGION_INFO - _IOWR(VFIO_TYPE, VFIO_BASE + 8, 157 * struct vfio_region_info) 158 * 159 * Retrieve information about a device region. Caller provides 160 * struct vfio_region_info with index value set. Caller sets argsz. 161 * Implementation of region mapping is bus driver specific. This is 162 * intended to describe MMIO, I/O port, as well as bus specific 163 * regions (ex. PCI config space). Zero sized regions may be used 164 * to describe unimplemented regions (ex. unimplemented PCI BARs). 165 * Return: 0 on success, -errno on failure. 166 */ 167 struct vfio_region_info { 168 __u32 argsz; 169 __u32 flags; 170 #define VFIO_REGION_INFO_FLAG_READ (1 << 0) /* Region supports read */ 171 #define VFIO_REGION_INFO_FLAG_WRITE (1 << 1) /* Region supports write */ 172 #define VFIO_REGION_INFO_FLAG_MMAP (1 << 2) /* Region supports mmap */ 173 __u32 index; /* Region index */ 174 __u32 resv; /* Reserved for alignment */ 175 __u64 size; /* Region size (bytes) */ 176 __u64 offset; /* Region offset from start of device fd */ 177 }; 178 #define VFIO_DEVICE_GET_REGION_INFO _IO(VFIO_TYPE, VFIO_BASE + 8) 179 180 /** 181 * VFIO_DEVICE_GET_IRQ_INFO - _IOWR(VFIO_TYPE, VFIO_BASE + 9, 182 * struct vfio_irq_info) 183 * 184 * Retrieve information about a device IRQ. Caller provides 185 * struct vfio_irq_info with index value set. Caller sets argsz. 186 * Implementation of IRQ mapping is bus driver specific. Indexes 187 * using multiple IRQs are primarily intended to support MSI-like 188 * interrupt blocks. Zero count irq blocks may be used to describe 189 * unimplemented interrupt types. 190 * 191 * The EVENTFD flag indicates the interrupt index supports eventfd based 192 * signaling. 193 * 194 * The MASKABLE flags indicates the index supports MASK and UNMASK 195 * actions described below. 196 * 197 * AUTOMASKED indicates that after signaling, the interrupt line is 198 * automatically masked by VFIO and the user needs to unmask the line 199 * to receive new interrupts. This is primarily intended to distinguish 200 * level triggered interrupts. 201 * 202 * The NORESIZE flag indicates that the interrupt lines within the index 203 * are setup as a set and new subindexes cannot be enabled without first 204 * disabling the entire index. This is used for interrupts like PCI MSI 205 * and MSI-X where the driver may only use a subset of the available 206 * indexes, but VFIO needs to enable a specific number of vectors 207 * upfront. In the case of MSI-X, where the user can enable MSI-X and 208 * then add and unmask vectors, it's up to userspace to make the decision 209 * whether to allocate the maximum supported number of vectors or tear 210 * down setup and incrementally increase the vectors as each is enabled. 211 */ 212 struct vfio_irq_info { 213 __u32 argsz; 214 __u32 flags; 215 #define VFIO_IRQ_INFO_EVENTFD (1 << 0) 216 #define VFIO_IRQ_INFO_MASKABLE (1 << 1) 217 #define VFIO_IRQ_INFO_AUTOMASKED (1 << 2) 218 #define VFIO_IRQ_INFO_NORESIZE (1 << 3) 219 __u32 index; /* IRQ index */ 220 __u32 count; /* Number of IRQs within this index */ 221 }; 222 #define VFIO_DEVICE_GET_IRQ_INFO _IO(VFIO_TYPE, VFIO_BASE + 9) 223 224 /** 225 * VFIO_DEVICE_SET_IRQS - _IOW(VFIO_TYPE, VFIO_BASE + 10, struct vfio_irq_set) 226 * 227 * Set signaling, masking, and unmasking of interrupts. Caller provides 228 * struct vfio_irq_set with all fields set. 'start' and 'count' indicate 229 * the range of subindexes being specified. 230 * 231 * The DATA flags specify the type of data provided. If DATA_NONE, the 232 * operation performs the specified action immediately on the specified 233 * interrupt(s). For example, to unmask AUTOMASKED interrupt [0,0]: 234 * flags = (DATA_NONE|ACTION_UNMASK), index = 0, start = 0, count = 1. 235 * 236 * DATA_BOOL allows sparse support for the same on arrays of interrupts. 237 * For example, to mask interrupts [0,1] and [0,3] (but not [0,2]): 238 * flags = (DATA_BOOL|ACTION_MASK), index = 0, start = 1, count = 3, 239 * data = {1,0,1} 240 * 241 * DATA_EVENTFD binds the specified ACTION to the provided __s32 eventfd. 242 * A value of -1 can be used to either de-assign interrupts if already 243 * assigned or skip un-assigned interrupts. For example, to set an eventfd 244 * to be trigger for interrupts [0,0] and [0,2]: 245 * flags = (DATA_EVENTFD|ACTION_TRIGGER), index = 0, start = 0, count = 3, 246 * data = {fd1, -1, fd2} 247 * If index [0,1] is previously set, two count = 1 ioctls calls would be 248 * required to set [0,0] and [0,2] without changing [0,1]. 249 * 250 * Once a signaling mechanism is set, DATA_BOOL or DATA_NONE can be used 251 * with ACTION_TRIGGER to perform kernel level interrupt loopback testing 252 * from userspace (ie. simulate hardware triggering). 253 * 254 * Setting of an event triggering mechanism to userspace for ACTION_TRIGGER 255 * enables the interrupt index for the device. Individual subindex interrupts 256 * can be disabled using the -1 value for DATA_EVENTFD or the index can be 257 * disabled as a whole with: flags = (DATA_NONE|ACTION_TRIGGER), count = 0. 258 * 259 * Note that ACTION_[UN]MASK specify user->kernel signaling (irqfds) while 260 * ACTION_TRIGGER specifies kernel->user signaling. 261 */ 262 struct vfio_irq_set { 263 __u32 argsz; 264 __u32 flags; 265 #define VFIO_IRQ_SET_DATA_NONE (1 << 0) /* Data not present */ 266 #define VFIO_IRQ_SET_DATA_BOOL (1 << 1) /* Data is bool (u8) */ 267 #define VFIO_IRQ_SET_DATA_EVENTFD (1 << 2) /* Data is eventfd (s32) */ 268 #define VFIO_IRQ_SET_ACTION_MASK (1 << 3) /* Mask interrupt */ 269 #define VFIO_IRQ_SET_ACTION_UNMASK (1 << 4) /* Unmask interrupt */ 270 #define VFIO_IRQ_SET_ACTION_TRIGGER (1 << 5) /* Trigger interrupt */ 271 __u32 index; 272 __u32 start; 273 __u32 count; 274 __u8 data[]; 275 }; 276 #define VFIO_DEVICE_SET_IRQS _IO(VFIO_TYPE, VFIO_BASE + 10) 277 278 #define VFIO_IRQ_SET_DATA_TYPE_MASK (VFIO_IRQ_SET_DATA_NONE | \ 279 VFIO_IRQ_SET_DATA_BOOL | \ 280 VFIO_IRQ_SET_DATA_EVENTFD) 281 #define VFIO_IRQ_SET_ACTION_TYPE_MASK (VFIO_IRQ_SET_ACTION_MASK | \ 282 VFIO_IRQ_SET_ACTION_UNMASK | \ 283 VFIO_IRQ_SET_ACTION_TRIGGER) 284 /** 285 * VFIO_DEVICE_RESET - _IO(VFIO_TYPE, VFIO_BASE + 11) 286 * 287 * Reset a device. 288 */ 289 #define VFIO_DEVICE_RESET _IO(VFIO_TYPE, VFIO_BASE + 11) 290 291 /* 292 * The VFIO-PCI bus driver makes use of the following fixed region and 293 * IRQ index mapping. Unimplemented regions return a size of zero. 294 * Unimplemented IRQ types return a count of zero. 295 */ 296 297 enum { 298 VFIO_PCI_BAR0_REGION_INDEX, 299 VFIO_PCI_BAR1_REGION_INDEX, 300 VFIO_PCI_BAR2_REGION_INDEX, 301 VFIO_PCI_BAR3_REGION_INDEX, 302 VFIO_PCI_BAR4_REGION_INDEX, 303 VFIO_PCI_BAR5_REGION_INDEX, 304 VFIO_PCI_ROM_REGION_INDEX, 305 VFIO_PCI_CONFIG_REGION_INDEX, 306 /* 307 * Expose VGA regions defined for PCI base class 03, subclass 00. 308 * This includes I/O port ranges 0x3b0 to 0x3bb and 0x3c0 to 0x3df 309 * as well as the MMIO range 0xa0000 to 0xbffff. Each implemented 310 * range is found at it's identity mapped offset from the region 311 * offset, for example 0x3b0 is region_info.offset + 0x3b0. Areas 312 * between described ranges are unimplemented. 313 */ 314 VFIO_PCI_VGA_REGION_INDEX, 315 VFIO_PCI_NUM_REGIONS 316 }; 317 318 enum { 319 VFIO_PCI_INTX_IRQ_INDEX, 320 VFIO_PCI_MSI_IRQ_INDEX, 321 VFIO_PCI_MSIX_IRQ_INDEX, 322 VFIO_PCI_NUM_IRQS 323 }; 324 325 /* -------- API for Type1 VFIO IOMMU -------- */ 326 327 /** 328 * VFIO_IOMMU_GET_INFO - _IOR(VFIO_TYPE, VFIO_BASE + 12, struct vfio_iommu_info) 329 * 330 * Retrieve information about the IOMMU object. Fills in provided 331 * struct vfio_iommu_info. Caller sets argsz. 332 * 333 * XXX Should we do these by CHECK_EXTENSION too? 334 */ 335 struct vfio_iommu_type1_info { 336 __u32 argsz; 337 __u32 flags; 338 #define VFIO_IOMMU_INFO_PGSIZES (1 << 0) /* supported page sizes info */ 339 __u64 iova_pgsizes; /* Bitmap of supported page sizes */ 340 }; 341 342 #define VFIO_IOMMU_GET_INFO _IO(VFIO_TYPE, VFIO_BASE + 12) 343 344 /** 345 * VFIO_IOMMU_MAP_DMA - _IOW(VFIO_TYPE, VFIO_BASE + 13, struct vfio_dma_map) 346 * 347 * Map process virtual addresses to IO virtual addresses using the 348 * provided struct vfio_dma_map. Caller sets argsz. READ &/ WRITE required. 349 */ 350 struct vfio_iommu_type1_dma_map { 351 __u32 argsz; 352 __u32 flags; 353 #define VFIO_DMA_MAP_FLAG_READ (1 << 0) /* readable from device */ 354 #define VFIO_DMA_MAP_FLAG_WRITE (1 << 1) /* writable from device */ 355 __u64 vaddr; /* Process virtual address */ 356 __u64 iova; /* IO virtual address */ 357 __u64 size; /* Size of mapping (bytes) */ 358 }; 359 360 #define VFIO_IOMMU_MAP_DMA _IO(VFIO_TYPE, VFIO_BASE + 13) 361 362 /** 363 * VFIO_IOMMU_UNMAP_DMA - _IOW(VFIO_TYPE, VFIO_BASE + 14, struct vfio_dma_unmap) 364 * 365 * Unmap IO virtual addresses using the provided struct vfio_dma_unmap. 366 * Caller sets argsz. 367 */ 368 struct vfio_iommu_type1_dma_unmap { 369 __u32 argsz; 370 __u32 flags; 371 __u64 iova; /* IO virtual address */ 372 __u64 size; /* Size of mapping (bytes) */ 373 }; 374 375 #define VFIO_IOMMU_UNMAP_DMA _IO(VFIO_TYPE, VFIO_BASE + 14) 376 377 #endif /* VFIO_H */ 378