History

powerpc/vfio: Implement IOMMU driver for VFIO

VFIO implements platform independent stuff such as a PCI driver, BAR access (via read/write on a file descriptor or direct mapping when possible) and IRQ signaling. The platform dependent part includes IOMMU initialization and handling. This implements an IOMMU driver for VFIO which does mapping/unmapping pages for the guest IO and provides information about DMA window (required by a POWER guest).

Alexey Kardashevskiy committed 13 years ago

Commit 5ffd2291 parent 4e13c1a6 files · +482 −0Browse files

Showing the changes to include/uapi (1 of 6 files). Show all

Unified · Split

include/uapi/linux/vfio.h+34−0
@@ -22,6 +22,7 @@ · 21 unmodified lines
22/* Extensions */22/* Extensions */
23 23
24#define VFIO_TYPE1_IOMMU 124#define VFIO_TYPE1_IOMMU 1
25#define VFIO_SPAPR_TCE_IOMMU 2
25 26
26/*27/*
27 * The IOCTL interface is designed for extensibility by embedding the28 * The IOCTL interface is designed for extensibility by embedding the
@@ -375,4 +376,37 @@ struct vfio_iommu_type1_dma_unmap { · 347 unmodified lines
375 376
376#define VFIO_IOMMU_UNMAP_DMA _IO(VFIO_TYPE, VFIO_BASE + 14)377#define VFIO_IOMMU_UNMAP_DMA _IO(VFIO_TYPE, VFIO_BASE + 14)
377 378
379/*
380 * IOCTLs to enable/disable IOMMU container usage.
381 * No parameters are supported.
382 */
383#define VFIO_IOMMU_ENABLE _IO(VFIO_TYPE, VFIO_BASE + 15)
384#define VFIO_IOMMU_DISABLE _IO(VFIO_TYPE, VFIO_BASE + 16)
385
386/* -------- Additional API for SPAPR TCE (Server POWERPC) IOMMU -------- */
387
388/*
389 * The SPAPR TCE info struct provides the information about the PCI bus
390 * address ranges available for DMA, these values are programmed into
391 * the hardware so the guest has to know that information.
392 *
393 * The DMA 32 bit window start is an absolute PCI bus address.
394 * The IOVA address passed via map/unmap ioctls are absolute PCI bus
395 * addresses too so the window works as a filter rather than an offset
396 * for IOVA addresses.
397 *
398 * A flag will need to be added if other page sizes are supported,
399 * so as defined here, it is always 4k.
400 */
401struct vfio_iommu_spapr_tce_info {
402 __u32 argsz;
403 __u32 flags; /* reserved for future use */
404 __u32 dma32_window_start; /* 32 bit window start (bytes) */
405 __u32 dma32_window_size; /* 32 bit window size (bytes) */
406};
407
408#define VFIO_IOMMU_SPAPR_TCE_GET_INFO _IO(VFIO_TYPE, VFIO_BASE + 12)
409
410/* ***************************************************************** */
411
378#endif /* _UAPIVFIO_H */412#endif /* _UAPIVFIO_H */