Hi Cedric, On 9/13/23 14:43, Cédric Le Goater wrote: > On 9/13/23 10:01, Eric Auger wrote: >> This helper will allow to convey information about valid >> IOVA ranges to virtual IOMMUS. >> >> Signed-off-by: Eric Auger <eric.au...@redhat.com> > > > Reviewed-by: Cédric Le Goater <c...@redhat.com> Thanks!
Eric > > Thanks, > > C. > >> --- >> 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) >> { >