vfio_register_reserved_iova allows to register the reserved IOVA region, typically for MSI frame binding purpose. The kernel allows registering a single reserved IOVA region.
Unregistration is handled through legacy vfio_dma_unmap. The function will become static in subsequent patches. However, since there is no user yet, the compiler argues; the function is currently not static and a dummy declaration needs to be added. Signed-off-by: Eric Auger <eric.au...@linaro.org> --- hw/vfio/common.c | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/hw/vfio/common.c b/hw/vfio/common.c index 6797208..247c87b 100644 --- a/hw/vfio/common.c +++ b/hw/vfio/common.c @@ -208,6 +208,36 @@ static int vfio_dma_unmap(VFIOContainer *container, return 0; } +/** + * vfio_register_reserved_iova: registers the iova reserved region + * + * @container: container handle + * @iova: base iova of the reserved region + * @size: reserved region size + * + * unregistration is handled using vfio_dma_unmap + */ +int vfio_register_reserved_iova(VFIOContainer *container, hwaddr iova, + ram_addr_t size); +int vfio_register_reserved_iova(VFIOContainer *container, hwaddr iova, + ram_addr_t size) +{ + struct vfio_iommu_type1_dma_map map = { + .argsz = sizeof(map), + .flags = VFIO_DMA_MAP_FLAG_MSI_RESERVED_IOVA, + .iova = iova, + .size = size, + }; + + if (ioctl(container->fd, VFIO_IOMMU_MAP_DMA, &map) == 0) { + return 0; + } + + error_report("VFIO_MAP_DMA/MSI_RESERVED_IOVA: %d", -errno); + return -errno; + +} + static int vfio_dma_map(VFIOContainer *container, hwaddr iova, ram_addr_t size, void *vaddr, bool readonly) { -- 1.9.1