s390x will introduce a new IOMMU domain type where the mappings are
managed by KVM rather than in response to userspace mapping ioctls.  Allow
for specifying this type on the VFIO_SET_IOMMU ioctl and triggering the
appropriate iommu interface for overriding the default domain.

Signed-off-by: Matthew Rosato <mjros...@linux.ibm.com>
---
 drivers/vfio/vfio_iommu_type1.c | 12 +++++++++++-
 include/uapi/linux/vfio.h       |  6 ++++++
 2 files changed, 17 insertions(+), 1 deletion(-)

diff --git a/drivers/vfio/vfio_iommu_type1.c b/drivers/vfio/vfio_iommu_type1.c
index 9394aa9444c1..0bec97077d61 100644
--- a/drivers/vfio/vfio_iommu_type1.c
+++ b/drivers/vfio/vfio_iommu_type1.c
@@ -77,6 +77,7 @@ struct vfio_iommu {
        bool                    nesting;
        bool                    dirty_page_tracking;
        bool                    container_open;
+       bool                    kvm;
        struct list_head        emulated_iommu_groups;
 };
 
@@ -2203,7 +2204,12 @@ static int vfio_iommu_type1_attach_group(void 
*iommu_data,
                goto out_free_group;
 
        ret = -EIO;
-       domain->domain = iommu_domain_alloc(bus);
+
+       if (iommu->kvm)
+               domain->domain = iommu_domain_alloc_type(bus, IOMMU_DOMAIN_KVM);
+       else
+               domain->domain = iommu_domain_alloc(bus);
+
        if (!domain->domain)
                goto out_free_domain;
 
@@ -2552,6 +2558,9 @@ static void *vfio_iommu_type1_open(unsigned long arg)
        case VFIO_TYPE1v2_IOMMU:
                iommu->v2 = true;
                break;
+       case VFIO_KVM_IOMMU:
+               iommu->kvm = true;
+               break;
        default:
                kfree(iommu);
                return ERR_PTR(-EINVAL);
@@ -2637,6 +2646,7 @@ static int vfio_iommu_type1_check_extension(struct 
vfio_iommu *iommu,
        case VFIO_TYPE1_NESTING_IOMMU:
        case VFIO_UNMAP_ALL:
        case VFIO_UPDATE_VADDR:
+       case VFIO_KVM_IOMMU:
                return 1;
        case VFIO_DMA_CC_IOMMU:
                if (!iommu)
diff --git a/include/uapi/linux/vfio.h b/include/uapi/linux/vfio.h
index ef33ea002b0b..666edb6957ac 100644
--- a/include/uapi/linux/vfio.h
+++ b/include/uapi/linux/vfio.h
@@ -52,6 +52,12 @@
 /* Supports the vaddr flag for DMA map and unmap */
 #define VFIO_UPDATE_VADDR              10
 
+/*
+ * The KVM_IOMMU type implies that the hypervisor will control the mappings
+ * rather than userspace
+ */
+#define VFIO_KVM_IOMMU                 11
+
 /*
  * The IOCTL interface is designed for extensibility by embedding the
  * structure length (argsz) and flags into structures passed between
-- 
2.27.0

_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu

Reply via email to