Linux kernel mirror (for testing)
git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel
os
linux
1/* SPDX-License-Identifier: GPL-2.0-only */
2#ifndef SELFTESTS_VFIO_LIB_INCLUDE_LIBVFIO_IOMMU_H
3#define SELFTESTS_VFIO_LIB_INCLUDE_LIBVFIO_IOMMU_H
4
5#include <linux/list.h>
6#include <linux/types.h>
7
8#include <libvfio/assert.h>
9
10typedef u64 iova_t;
11
12struct iommu_mode {
13 const char *name;
14 const char *container_path;
15 unsigned long iommu_type;
16};
17
18extern const char *default_iommu_mode;
19
20struct dma_region {
21 struct list_head link;
22 void *vaddr;
23 iova_t iova;
24 u64 size;
25};
26
27struct iommu {
28 const struct iommu_mode *mode;
29 int container_fd;
30 int iommufd;
31 u32 ioas_id;
32 struct list_head dma_regions;
33};
34
35struct iommu *iommu_init(const char *iommu_mode);
36void iommu_cleanup(struct iommu *iommu);
37
38int __iommu_map(struct iommu *iommu, struct dma_region *region);
39
40static inline void iommu_map(struct iommu *iommu, struct dma_region *region)
41{
42 VFIO_ASSERT_EQ(__iommu_map(iommu, region), 0);
43}
44
45int __iommu_unmap(struct iommu *iommu, struct dma_region *region, u64 *unmapped);
46
47static inline void iommu_unmap(struct iommu *iommu, struct dma_region *region)
48{
49 VFIO_ASSERT_EQ(__iommu_unmap(iommu, region, NULL), 0);
50}
51
52int __iommu_unmap_all(struct iommu *iommu, u64 *unmapped);
53
54static inline void iommu_unmap_all(struct iommu *iommu)
55{
56 VFIO_ASSERT_EQ(__iommu_unmap_all(iommu, NULL), 0);
57}
58
59int __iommu_hva2iova(struct iommu *iommu, void *vaddr, iova_t *iova);
60iova_t iommu_hva2iova(struct iommu *iommu, void *vaddr);
61
62struct iommu_iova_range *iommu_iova_ranges(struct iommu *iommu, u32 *nranges);
63
64#define MODE_VFIO_TYPE1_IOMMU "vfio_type1_iommu"
65#define MODE_VFIO_TYPE1V2_IOMMU "vfio_type1v2_iommu"
66#define MODE_IOMMUFD_COMPAT_TYPE1 "iommufd_compat_type1"
67#define MODE_IOMMUFD_COMPAT_TYPE1V2 "iommufd_compat_type1v2"
68#define MODE_IOMMUFD "iommufd"
69
70/*
71 * Generator for VFIO selftests fixture variants that replicate across all
72 * possible IOMMU modes. Tests must define FIXTURE_VARIANT_ADD_IOMMU_MODE()
73 * which should then use FIXTURE_VARIANT_ADD() to create the variant.
74 */
75#define FIXTURE_VARIANT_ADD_ALL_IOMMU_MODES(...) \
76FIXTURE_VARIANT_ADD_IOMMU_MODE(vfio_type1_iommu, ##__VA_ARGS__); \
77FIXTURE_VARIANT_ADD_IOMMU_MODE(vfio_type1v2_iommu, ##__VA_ARGS__); \
78FIXTURE_VARIANT_ADD_IOMMU_MODE(iommufd_compat_type1, ##__VA_ARGS__); \
79FIXTURE_VARIANT_ADD_IOMMU_MODE(iommufd_compat_type1v2, ##__VA_ARGS__); \
80FIXTURE_VARIANT_ADD_IOMMU_MODE(iommufd, ##__VA_ARGS__)
81
82#endif /* SELFTESTS_VFIO_LIB_INCLUDE_LIBVFIO_IOMMU_H */