Lines Matching full:iommu
40 .container_path = "/dev/iommu",
45 .container_path = "/dev/iommu",
67 VFIO_FAIL("Unrecognized IOMMU mode: %s\n", iommu_mode); in lookup_iommu_mode()
70 int __iommu_hva2iova(struct iommu *iommu, void *vaddr, iova_t *iova) in __iommu_hva2iova() argument
74 list_for_each_entry(region, &iommu->dma_regions, link) { in __iommu_hva2iova()
90 iova_t iommu_hva2iova(struct iommu *iommu, void *vaddr) in iommu_hva2iova() argument
95 ret = __iommu_hva2iova(iommu, vaddr, &iova); in iommu_hva2iova()
96 VFIO_ASSERT_EQ(ret, 0, "%p is not mapped into the iommu\n", vaddr); in iommu_hva2iova()
101 static int vfio_iommu_map(struct iommu *iommu, struct dma_region *region) in vfio_iommu_map() argument
111 if (ioctl(iommu->container_fd, VFIO_IOMMU_MAP_DMA, &args)) in vfio_iommu_map()
117 static int iommufd_map(struct iommu *iommu, struct dma_region *region) in iommufd_map() argument
127 .ioas_id = iommu->ioas_id, in iommufd_map()
130 if (ioctl(iommu->iommufd, IOMMU_IOAS_MAP, &args)) in iommufd_map()
136 int __iommu_map(struct iommu *iommu, struct dma_region *region) in __iommu_map() argument
140 if (iommu->iommufd) in __iommu_map()
141 ret = iommufd_map(iommu, region); in __iommu_map()
143 ret = vfio_iommu_map(iommu, region); in __iommu_map()
148 list_add(®ion->link, &iommu->dma_regions); in __iommu_map()
171 static int vfio_iommu_unmap(struct iommu *iommu, struct dma_region *region, in vfio_iommu_unmap() argument
174 return __vfio_iommu_unmap(iommu->container_fd, region->iova, in vfio_iommu_unmap()
196 static int iommufd_unmap(struct iommu *iommu, struct dma_region *region, in iommufd_unmap() argument
199 return __iommufd_unmap(iommu->iommufd, region->iova, region->size, in iommufd_unmap()
200 iommu->ioas_id, unmapped); in iommufd_unmap()
203 int __iommu_unmap(struct iommu *iommu, struct dma_region *region, u64 *unmapped) in __iommu_unmap() argument
207 if (iommu->iommufd) in __iommu_unmap()
208 ret = iommufd_unmap(iommu, region, unmapped); in __iommu_unmap()
210 ret = vfio_iommu_unmap(iommu, region, unmapped); in __iommu_unmap()
220 int __iommu_unmap_all(struct iommu *iommu, u64 *unmapped) in __iommu_unmap_all() argument
225 if (iommu->iommufd) in __iommu_unmap_all()
226 ret = __iommufd_unmap(iommu->iommufd, 0, UINT64_MAX, in __iommu_unmap_all()
227 iommu->ioas_id, unmapped); in __iommu_unmap_all()
229 ret = __vfio_iommu_unmap(iommu->container_fd, 0, 0, in __iommu_unmap_all()
235 list_for_each_entry_safe(curr, next, &iommu->dma_regions, link) in __iommu_unmap_all()
313 static struct iommu_iova_range *vfio_iommu_iova_ranges(struct iommu *iommu, in vfio_iommu_iova_ranges() argument
321 info = vfio_iommu_get_info(iommu->container_fd); in vfio_iommu_iova_ranges()
345 static struct iommu_iova_range *iommufd_iova_ranges(struct iommu *iommu, in iommufd_iova_ranges() argument
353 .ioas_id = iommu->ioas_id, in iommufd_iova_ranges()
356 ret = ioctl(iommu->iommufd, IOMMU_IOAS_IOVA_RANGES, &query); in iommufd_iova_ranges()
366 ioctl_assert(iommu->iommufd, IOMMU_IOAS_IOVA_RANGES, &query); in iommufd_iova_ranges()
386 struct iommu_iova_range *iommu_iova_ranges(struct iommu *iommu, u32 *nranges) in iommu_iova_ranges() argument
390 if (iommu->iommufd) in iommu_iova_ranges()
391 ranges = iommufd_iova_ranges(iommu, nranges); in iommu_iova_ranges()
393 ranges = vfio_iommu_iova_ranges(iommu, nranges); in iommu_iova_ranges()
422 struct iommu *iommu_init(const char *iommu_mode) in iommu_init()
425 struct iommu *iommu; in iommu_init() local
428 iommu = calloc(1, sizeof(*iommu)); in iommu_init()
429 VFIO_ASSERT_NOT_NULL(iommu); in iommu_init()
431 INIT_LIST_HEAD(&iommu->dma_regions); in iommu_init()
433 iommu->mode = lookup_iommu_mode(iommu_mode); in iommu_init()
435 container_path = iommu->mode->container_path; in iommu_init()
437 iommu->container_fd = open(container_path, O_RDWR); in iommu_init()
438 VFIO_ASSERT_GE(iommu->container_fd, 0, "open(%s) failed\n", container_path); in iommu_init()
440 version = ioctl(iommu->container_fd, VFIO_GET_API_VERSION); in iommu_init()
448 iommu->iommufd = open("/dev/iommu", O_RDWR); in iommu_init()
449 VFIO_ASSERT_GT(iommu->iommufd, 0); in iommu_init()
451 iommu->ioas_id = iommufd_ioas_alloc(iommu->iommufd); in iommu_init()
454 return iommu; in iommu_init()
457 void iommu_cleanup(struct iommu *iommu) in iommu_cleanup() argument
459 if (iommu->iommufd) in iommu_cleanup()
460 VFIO_ASSERT_EQ(close(iommu->iommufd), 0); in iommu_cleanup()
462 VFIO_ASSERT_EQ(close(iommu->container_fd), 0); in iommu_cleanup()
464 free(iommu); in iommu_cleanup()