diff --git a/patches.suse/iommu-vt-d-report-right-snoop-capability-when-using-fl-for-iova b/patches.suse/iommu-vt-d-report-right-snoop-capability-when-using-fl-for-iova new file mode 100644 index 0000000..e5b0a33 --- /dev/null +++ b/patches.suse/iommu-vt-d-report-right-snoop-capability-when-using-fl-for-iova @@ -0,0 +1,106 @@ +From: Lu Baolu +Date: Tue, 30 Mar 2021 10:11:45 +0800 +Subject: iommu/vt-d: Report right snoop capability when using FL for IOVA +Git-commit: 6c00612d0cba10f7d0917cf1f73c945003ed4cd7 +Patch-mainline: v5.13-rc1 +References: bsc#1187347 + +The Intel VT-d driver checks wrong register to report snoop capablility +when using first level page table for GPA to HPA translation. This might +lead the IOMMU driver to say that it supports snooping control, but in +reality, it does not. Fix this by always setting PASID-table-entry.PGSNP +whenever a pasid entry is setting up for GPA to HPA translation so that +the IOMMU driver could report snoop capability as long as it runs in the +scalable mode. + +Fixes: b802d070a52a1 ("iommu/vt-d: Use iova over first level") +Suggested-by: Rajesh Sankaran +Suggested-by: Kevin Tian +Suggested-by: Ashok Raj +Signed-off-by: Lu Baolu +Link: https://lore.kernel.org/r/20210330021145.13824-1-baolu.lu@linux.intel.com +Signed-off-by: Joerg Roedel +--- + drivers/iommu/intel/intel-pasid.h | 1 + + drivers/iommu/intel/iommu.c | 12 +++++++++++- + drivers/iommu/intel/pasid.c | 16 ++++++++++++++++ + 3 files changed, 28 insertions(+), 1 deletion(-) + +--- a/drivers/iommu/intel/intel-pasid.h ++++ b/drivers/iommu/intel/intel-pasid.h +@@ -48,6 +48,7 @@ + */ + #define PASID_FLAG_SUPERVISOR_MODE BIT(0) + #define PASID_FLAG_NESTED BIT(1) ++#define PASID_FLAG_PAGE_SNOOP BIT(2) + + /* + * The PASID_FLAG_FL5LP flag Indicates using 5-level paging for first- +--- a/drivers/iommu/intel/iommu.c ++++ b/drivers/iommu/intel/iommu.c +@@ -658,7 +658,14 @@ static int domain_update_iommu_snooping( + rcu_read_lock(); + for_each_active_iommu(iommu, drhd) { + if (iommu != skip) { +- if (!ecap_sc_support(iommu->ecap)) { ++ /* ++ * If the hardware is operating in the scalable mode, ++ * the snooping control is always supported since we ++ * always set PASID-table-entry.PGSNP bit if the domain ++ * is managed outside (UNMANAGED). ++ */ ++ if (!sm_supported(iommu) && ++ !ecap_sc_support(iommu->ecap)) { + ret = 0; + break; + } +@@ -2557,6 +2564,9 @@ static int domain_setup_first_level(stru + + flags |= (level == 5) ? PASID_FLAG_FL5LP : 0; + ++ if (domain->domain.type == IOMMU_DOMAIN_UNMANAGED) ++ flags |= PASID_FLAG_PAGE_SNOOP; ++ + return intel_pasid_setup_first_level(iommu, dev, (pgd_t *)pgd, pasid, + domain->iommu_did[iommu->seq_id], + flags); +--- a/drivers/iommu/intel/pasid.c ++++ b/drivers/iommu/intel/pasid.c +@@ -412,6 +412,16 @@ static inline void pasid_set_page_snoop( + } + + /* ++ * Setup the Page Snoop (PGSNP) field (Bit 88) of a scalable mode ++ * PASID entry. ++ */ ++static inline void ++pasid_set_pgsnp(struct pasid_entry *pe) ++{ ++ pasid_set_bits(&pe->val[1], 1ULL << 24, 1ULL << 24); ++} ++ ++/* + * Setup the First Level Page table Pointer field (Bit 140~191) + * of a scalable mode PASID entry. + */ +@@ -579,6 +589,9 @@ int intel_pasid_setup_first_level(struct + } + } + ++ if (flags & PASID_FLAG_PAGE_SNOOP) ++ pasid_set_pgsnp(pte); ++ + pasid_set_domain_id(pte, did); + pasid_set_address_width(pte, iommu->agaw); + pasid_set_page_snoop(pte, !!ecap_smpwc(iommu->ecap)); +@@ -657,6 +670,9 @@ int intel_pasid_setup_second_level(struc + pasid_set_fault_enable(pte); + pasid_set_page_snoop(pte, !!ecap_smpwc(iommu->ecap)); + ++ if (domain->domain.type == IOMMU_DOMAIN_UNMANAGED) ++ pasid_set_pgsnp(pte); ++ + /* + * Since it is a second level only translation setup, we should + * set SRE bit as well (addresses are expected to be GPAs). + diff --git a/series.conf b/series.conf index 879b9b9..f0502f6 100644 --- a/series.conf +++ b/series.conf @@ -49029,6 +49029,7 @@ patches.suse/RDMA-rtrs-clt-destroy-sysfs-after-removing-session-f.patch patches.suse/IB-hfi1-Rework-AIP-and-VNIC-dummy-netdev-usage.patch patches.suse/iommu-fix-a-boundary-issue-to-avoid-performance-drop + patches.suse/iommu-vt-d-report-right-snoop-capability-when-using-fl-for-iova patches.suse/KVM-s390-fix-guarded-storage-control-register-handli.patch patches.suse/0001-dm-rq-fix-double-free-of-blk_mq_tag_set-in-dev-remov.patch patches.suse/tracing-map-all-pids-to-command-lines.patch