aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/vfio
diff options
context:
space:
mode:
authorAlex Williamson <alex.williamson@redhat.com>2014-02-26 13:38:37 -0500
committerAlex Williamson <alex.williamson@redhat.com>2014-02-26 13:38:37 -0500
commitaa429318279b90192f35a97e9ccdc1e83b3a9624 (patch)
treeb27ec47dd53413e02c81376f80c10fd57ba4a334 /drivers/vfio
parent1ef3e2bc04223ff956dc62abaf2dff1f3322a431 (diff)
vfio/type1: Add extension to test DMA cache coherence of IOMMU
Now that the type1 IOMMU backend can support IOMMU_CACHE, we need to be able to test whether coherency is currently enforced. Add an extension for this. Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
Diffstat (limited to 'drivers/vfio')
-rw-r--r--drivers/vfio/vfio_iommu_type1.c21
1 files changed, 21 insertions, 0 deletions
diff --git a/drivers/vfio/vfio_iommu_type1.c b/drivers/vfio/vfio_iommu_type1.c
index 8c7bb9befdab..1f90344d3e2c 100644
--- a/drivers/vfio/vfio_iommu_type1.c
+++ b/drivers/vfio/vfio_iommu_type1.c
@@ -867,6 +867,23 @@ static void vfio_iommu_type1_release(void *iommu_data)
867 kfree(iommu); 867 kfree(iommu);
868} 868}
869 869
870static int vfio_domains_have_iommu_cache(struct vfio_iommu *iommu)
871{
872 struct vfio_domain *domain;
873 int ret = 1;
874
875 mutex_lock(&iommu->lock);
876 list_for_each_entry(domain, &iommu->domain_list, next) {
877 if (!(domain->prot & IOMMU_CACHE)) {
878 ret = 0;
879 break;
880 }
881 }
882 mutex_unlock(&iommu->lock);
883
884 return ret;
885}
886
870static long vfio_iommu_type1_ioctl(void *iommu_data, 887static long vfio_iommu_type1_ioctl(void *iommu_data,
871 unsigned int cmd, unsigned long arg) 888 unsigned int cmd, unsigned long arg)
872{ 889{
@@ -878,6 +895,10 @@ static long vfio_iommu_type1_ioctl(void *iommu_data,
878 case VFIO_TYPE1_IOMMU: 895 case VFIO_TYPE1_IOMMU:
879 case VFIO_TYPE1v2_IOMMU: 896 case VFIO_TYPE1v2_IOMMU:
880 return 1; 897 return 1;
898 case VFIO_DMA_CC_IOMMU:
899 if (!iommu)
900 return 0;
901 return vfio_domains_have_iommu_cache(iommu);
881 default: 902 default:
882 return 0; 903 return 0;
883 } 904 }