The latest VT-d specification states that the PGSNP field in the pasid
table entry should be treated as Reserved(0) for implementations not
supporting Snoop Control (SC=0 in the Extended Capability Register).
This adds a check before setting the field.

Signed-off-by: Lu Baolu <baolu...@linux.intel.com>
---
 drivers/iommu/intel/pasid.c | 13 ++++++++++---
 1 file changed, 10 insertions(+), 3 deletions(-)

diff --git a/drivers/iommu/intel/pasid.c b/drivers/iommu/intel/pasid.c
index f8d215d85695..5cb2daa2b8cb 100644
--- a/drivers/iommu/intel/pasid.c
+++ b/drivers/iommu/intel/pasid.c
@@ -625,8 +625,14 @@ int intel_pasid_setup_first_level(struct intel_iommu 
*iommu,
                }
        }
 
-       if (flags & PASID_FLAG_PAGE_SNOOP)
-               pasid_set_pgsnp(pte);
+       if (flags & PASID_FLAG_PAGE_SNOOP) {
+               if (ecap_sc_support(iommu->ecap)) {
+                       pasid_set_pgsnp(pte);
+               } else {
+                       pasid_clear_entry(pte);
+                       return -EINVAL;
+               }
+       }
 
        pasid_set_domain_id(pte, did);
        pasid_set_address_width(pte, iommu->agaw);
@@ -710,7 +716,8 @@ int intel_pasid_setup_second_level(struct intel_iommu 
*iommu,
        pasid_set_fault_enable(pte);
        pasid_set_page_snoop(pte, !!ecap_smpwc(iommu->ecap));
 
-       if (domain->domain.type == IOMMU_DOMAIN_UNMANAGED)
+       if (ecap_sc_support(iommu->ecap) &&
+           domain->domain.type == IOMMU_DOMAIN_UNMANAGED)
                pasid_set_pgsnp(pte);
 
        /*
-- 
2.25.1

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

Reply via email to