This helper will allow to convey information about valid IOVA ranges to virtual IOMMUS.
Signed-off-by: Eric Auger <eric.au...@redhat.com> --- include/exec/memory.h | 26 ++++++++++++++++++++++++++ softmmu/memory.c | 15 +++++++++++++++ 2 files changed, 41 insertions(+) diff --git a/include/exec/memory.h b/include/exec/memory.h index 184cb3a01b..f6fb99dd3f 100644 --- a/include/exec/memory.h +++ b/include/exec/memory.h @@ -519,6 +519,27 @@ struct IOMMUMemoryRegionClass { int (*iommu_set_page_size_mask)(IOMMUMemoryRegion *iommu, uint64_t page_size_mask, Error **errp); + /** + * @iommu_set_iova_ranges: + * + * Propagate information about the usable IOVA ranges for a given IOMMU + * memory region. Used for example to propagate host physical device + * reserved memory region constraints to the virtual IOMMU. + * + * Optional method: if this method is not provided, then the default IOVA + * aperture is used. + * + * @nr_ranges: number of IOVA ranges + * + * @iova_ranges: an array of @nr_ranges usable IOVA ranges + * + * Returns 0 on success, or a negative error. In case of failure, the error + * object must be created. + */ + int (*iommu_set_iova_ranges)(IOMMUMemoryRegion *iommu, + uint32_t nr_ranges, + struct Range *iova_ranges, + Error **errp); }; typedef struct RamDiscardListener RamDiscardListener; @@ -1845,6 +1866,11 @@ int memory_region_iommu_set_page_size_mask(IOMMUMemoryRegion *iommu_mr, uint64_t page_size_mask, Error **errp); +int memory_region_iommu_set_iova_ranges(IOMMUMemoryRegion *iommu, + uint32_t nr_ranges, + struct Range *iova_ranges, + Error **errp); + /** * memory_region_name: get a memory region's name * diff --git a/softmmu/memory.c b/softmmu/memory.c index 7d9494ce70..07499457aa 100644 --- a/softmmu/memory.c +++ b/softmmu/memory.c @@ -1905,6 +1905,21 @@ int memory_region_iommu_set_page_size_mask(IOMMUMemoryRegion *iommu_mr, return ret; } +int memory_region_iommu_set_iova_ranges(IOMMUMemoryRegion *iommu_mr, + uint32_t nr_ranges, + struct Range *iova_ranges, + Error **errp) +{ + IOMMUMemoryRegionClass *imrc = IOMMU_MEMORY_REGION_GET_CLASS(iommu_mr); + int ret = 0; + + if (imrc->iommu_set_iova_ranges) { + ret = imrc->iommu_set_iova_ranges(iommu_mr, nr_ranges, + iova_ranges, errp); + } + return ret; +} + int memory_region_register_iommu_notifier(MemoryRegion *mr, IOMMUNotifier *n, Error **errp) { -- 2.41.0