/* SPDX-License-Identifier: GPL-2.0-only */ #ifndef SELFTESTS_VFIO_LIB_INCLUDE_LIBVFIO_IOMMU_H #define SELFTESTS_VFIO_LIB_INCLUDE_LIBVFIO_IOMMU_H #include #include #include typedef u64 iova_t; struct iommu_mode { const char *name; const char *container_path; unsigned long iommu_type; }; extern const char *default_iommu_mode; struct dma_region { struct list_head link; void *vaddr; iova_t iova; u64 size; }; struct iommu { const struct iommu_mode *mode; int container_fd; int iommufd; u32 ioas_id; struct list_head dma_regions; }; struct iommu *iommu_init(const char *iommu_mode); void iommu_cleanup(struct iommu *iommu); int __iommu_map(struct iommu *iommu, struct dma_region *region); static inline void iommu_map(struct iommu *iommu, struct dma_region *region) { VFIO_ASSERT_EQ(__iommu_map(iommu, region), 0); } int __iommu_unmap(struct iommu *iommu, struct dma_region *region, u64 *unmapped); static inline void iommu_unmap(struct iommu *iommu, struct dma_region *region) { VFIO_ASSERT_EQ(__iommu_unmap(iommu, region, NULL), 0); } int __iommu_unmap_all(struct iommu *iommu, u64 *unmapped); static inline void iommu_unmap_all(struct iommu *iommu) { VFIO_ASSERT_EQ(__iommu_unmap_all(iommu, NULL), 0); } int __iommu_hva2iova(struct iommu *iommu, void *vaddr, iova_t *iova); iova_t iommu_hva2iova(struct iommu *iommu, void *vaddr); struct iommu_iova_range *iommu_iova_ranges(struct iommu *iommu, u32 *nranges); /* * Generator for VFIO selftests fixture variants that replicate across all * possible IOMMU modes. Tests must define FIXTURE_VARIANT_ADD_IOMMU_MODE() * which should then use FIXTURE_VARIANT_ADD() to create the variant. */ #define FIXTURE_VARIANT_ADD_ALL_IOMMU_MODES(...) \ FIXTURE_VARIANT_ADD_IOMMU_MODE(vfio_type1_iommu, ##__VA_ARGS__); \ FIXTURE_VARIANT_ADD_IOMMU_MODE(vfio_type1v2_iommu, ##__VA_ARGS__); \ FIXTURE_VARIANT_ADD_IOMMU_MODE(iommufd_compat_type1, ##__VA_ARGS__); \ FIXTURE_VARIANT_ADD_IOMMU_MODE(iommufd_compat_type1v2, ##__VA_ARGS__); \ FIXTURE_VARIANT_ADD_IOMMU_MODE(iommufd, ##__VA_ARGS__) #endif /* SELFTESTS_VFIO_LIB_INCLUDE_LIBVFIO_IOMMU_H */