This patch allows the user-space to know whether msi-pages
are automatically mapped with some magic iova or not.

Even if the msi-pages are automatically mapped, still user-space
wants to over-ride the automatic iova selection for msi-mapping.
For this user-space need to know whether it is allowed to change
the automatic mapping or not and this API provides this mechanism.
Follow up patches will provide how to over-ride this.

Signed-off-by: Bharat Bhushan <bharat.bhus...@freescale.com>
---
 drivers/vfio/vfio_iommu_type1.c | 32 ++++++++++++++++++++++++++++++++
 include/uapi/linux/vfio.h       |  3 +++
 2 files changed, 35 insertions(+)

diff --git a/drivers/vfio/vfio_iommu_type1.c b/drivers/vfio/vfio_iommu_type1.c
index fa5d3e4..3315fb6 100644
--- a/drivers/vfio/vfio_iommu_type1.c
+++ b/drivers/vfio/vfio_iommu_type1.c
@@ -59,6 +59,7 @@ struct vfio_iommu {
        struct rb_root          dma_list;
        bool                    v2;
        bool                    nesting;
+       bool                    allow_msi_reconfig;
        struct list_head        reserved_iova_list;
 };
 
@@ -1117,6 +1118,23 @@ static int vfio_domains_have_iommu_cache(struct 
vfio_iommu *iommu)
        return ret;
 }
 
+static
+int vfio_domains_get_msi_maps(struct vfio_iommu *iommu,
+                             struct iommu_domain_msi_maps *msi_maps)
+{
+       struct vfio_domain *d;
+       int ret;
+
+       mutex_lock(&iommu->lock);
+       /* All domains have same msi-automap property, pick first */
+       d = list_first_entry(&iommu->domain_list, struct vfio_domain, next);
+       ret = iommu_domain_get_attr(d->domain, DOMAIN_ATTR_MSI_MAPPING,
+                                   msi_maps);
+       mutex_unlock(&iommu->lock);
+
+       return ret;
+}
+
 static long vfio_iommu_type1_ioctl(void *iommu_data,
                                   unsigned int cmd, unsigned long arg)
 {
@@ -1138,6 +1156,8 @@ static long vfio_iommu_type1_ioctl(void *iommu_data,
                }
        } else if (cmd == VFIO_IOMMU_GET_INFO) {
                struct vfio_iommu_type1_info info;
+               struct iommu_domain_msi_maps msi_maps;
+               int ret;
 
                minsz = offsetofend(struct vfio_iommu_type1_info, iova_pgsizes);
 
@@ -1149,6 +1169,18 @@ static long vfio_iommu_type1_ioctl(void *iommu_data,
 
                info.flags = 0;
 
+               ret = vfio_domains_get_msi_maps(iommu, &msi_maps);
+               if (ret)
+                       return ret;
+
+               if (msi_maps.override_automap) {
+                       info.flags |= VFIO_IOMMU_INFO_MSI_ALLOW_RECONFIG;
+                       iommu->allow_msi_reconfig = true;
+               }
+
+               if (msi_maps.automap)
+                       info.flags |= VFIO_IOMMU_INFO_MSI_AUTOMAP;
+
                info.iova_pgsizes = vfio_pgsize_bitmap(iommu);
 
                return copy_to_user((void __user *)arg, &info, minsz);
diff --git a/include/uapi/linux/vfio.h b/include/uapi/linux/vfio.h
index 1abd1a9..9998f6e 100644
--- a/include/uapi/linux/vfio.h
+++ b/include/uapi/linux/vfio.h
@@ -391,6 +391,9 @@ struct vfio_iommu_type1_info {
        __u32   argsz;
        __u32   flags;
 #define VFIO_IOMMU_INFO_PGSIZES (1 << 0)       /* supported page sizes info */
+#define VFIO_IOMMU_INFO_MSI_AUTOMAP (1 << 1)   /* MSI pages are auto-mapped
+                                                  in iommu */
+#define VFIO_IOMMU_INFO_MSI_ALLOW_RECONFIG (1 << 2) /* Allows reconfig 
automap*/
        __u64   iova_pgsizes;           /* Bitmap of supported page sizes */
 };
 
-- 
1.9.3

--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to