This patch makes change to only supports the case where all the physical iommu
units have the same CAP/ECAP MASKS for nested translation.

Cc: Kevin Tian <kevin.t...@intel.com>
CC: Jacob Pan <jacob.jun....@linux.intel.com>
Cc: Alex Williamson <alex.william...@redhat.com>
Cc: Eric Auger <eric.au...@redhat.com>
Cc: Jean-Philippe Brucker <jean-phili...@linaro.org>
Cc: Joerg Roedel <j...@8bytes.org>
Cc: Lu Baolu <baolu...@linux.intel.com>
Signed-off-by: Liu Yi L <yi.l....@intel.com>
Signed-off-by: Jacob Pan <jacob.jun....@linux.intel.com>
---
v6 - > v7:
*) added per comment from Eric.
   https://lore.kernel.org/kvm/7fe337fa-abbc-82be-c8e8-b9e2a6179...@redhat.com/
---
 drivers/iommu/intel/iommu.c |  8 ++++++--
 include/linux/intel-iommu.h | 16 ++++++++++++++++
 2 files changed, 22 insertions(+), 2 deletions(-)

diff --git a/drivers/iommu/intel/iommu.c b/drivers/iommu/intel/iommu.c
index 95740b9..38c6c9b 100644
--- a/drivers/iommu/intel/iommu.c
+++ b/drivers/iommu/intel/iommu.c
@@ -5675,12 +5675,16 @@ static inline bool iommu_pasid_support(void)
 static inline bool nested_mode_support(void)
 {
        struct dmar_drhd_unit *drhd;
-       struct intel_iommu *iommu;
+       struct intel_iommu *iommu, *prev = NULL;
        bool ret = true;
 
        rcu_read_lock();
        for_each_active_iommu(iommu, drhd) {
-               if (!sm_supported(iommu) || !ecap_nest(iommu->ecap)) {
+               if (!prev)
+                       prev = iommu;
+               if (!sm_supported(iommu) || !ecap_nest(iommu->ecap) ||
+                   (VTD_CAP_MASK & (iommu->cap ^ prev->cap)) ||
+                   (VTD_ECAP_MASK & (iommu->ecap ^ prev->ecap))) {
                        ret = false;
                        break;
                }
diff --git a/include/linux/intel-iommu.h b/include/linux/intel-iommu.h
index db7fc59..e7b7512 100644
--- a/include/linux/intel-iommu.h
+++ b/include/linux/intel-iommu.h
@@ -197,6 +197,22 @@
 #define ecap_max_handle_mask(e) ((e >> 20) & 0xf)
 #define ecap_sc_support(e)     ((e >> 7) & 0x1) /* Snooping Control */
 
+/* Nesting Support Capability Alignment */
+#define VTD_CAP_FL1GP          BIT_ULL(56)
+#define VTD_CAP_FL5LP          BIT_ULL(60)
+#define VTD_ECAP_PRS           BIT_ULL(29)
+#define VTD_ECAP_ERS           BIT_ULL(30)
+#define VTD_ECAP_SRS           BIT_ULL(31)
+#define VTD_ECAP_EAFS          BIT_ULL(34)
+#define VTD_ECAP_PASID         BIT_ULL(40)
+
+/* Only capabilities marked in below MASKs are reported */
+#define VTD_CAP_MASK           (VTD_CAP_FL1GP | VTD_CAP_FL5LP)
+
+#define VTD_ECAP_MASK          (VTD_ECAP_PRS | VTD_ECAP_ERS | \
+                                VTD_ECAP_SRS | VTD_ECAP_EAFS | \
+                                VTD_ECAP_PASID)
+
 /* Virtual command interface capability */
 #define vccap_pasid(v)         (((v) & DMA_VCS_PAS)) /* PASID allocation */
 
-- 
2.7.4

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

Reply via email to