Hello,
+int iommufd_backend_map_dma(IOMMUFDBackend *be, uint32_t ioas_id, hwaddr iova, + ram_addr_t size, void *vaddr, bool readonly) +{ + int ret, fd = be->fd; + struct iommu_ioas_map map = { + .size = sizeof(map), + .flags = IOMMU_IOAS_MAP_READABLE | + IOMMU_IOAS_MAP_FIXED_IOVA, + .ioas_id = ioas_id, + .__reserved = 0, + .user_va = (uintptr_t)vaddr, + .iova = iova, + .length = size, + }; + + if (!readonly) { + map.flags |= IOMMU_IOAS_MAP_WRITEABLE; + } + + ret = ioctl(fd, IOMMU_IOAS_MAP, &map); + trace_iommufd_backend_map_dma(fd, ioas_id, iova, size, + vaddr, readonly, ret); + if (ret) { + ret = -errno; + error_report("IOMMU_IOAS_MAP failed: %m"); + } + return ret; +}
When using a UEFI guest, QEMU reports errors when mapping regions in the top PCI space : iommufd_backend_map_dma iommufd=10 ioas=2 iova=0x380000001000 size=0x3000 addr=0x7fce2c28b000 readonly=0 (-1) qemu-system-x86_64: IOMMU_IOAS_MAP failed: Invalid argument qemu-system-x86_64: vfio_container_dma_map(0x55a21b03a150, 0x380000001000, 0x3000, 0x7fce2c28b000) = -22 (Invalid argument) iommufd_backend_map_dma iommufd=10 ioas=2 iova=0x380000004000 size=0x4000 addr=0x7fce2c980000 readonly=0 (-1) qemu-system-x86_64: IOMMU_IOAS_MAP failed: Invalid argument qemu-system-x86_64: vfio_container_dma_map(0x55a21b03a150, 0x380000004000, 0x4000, 0x7fce2c980000) = -22 (Invalid argument) This is because IOMMUFD reserved IOVAs areas are : [ fee00000 - feefffff ] [ 8000000000 - ffffffffffffffff ] (39 bits address space) which were allocated when the device was initially attached. The topology is basic. Something is wrong. Thanks, C.