| From a2fb3fd4b28ce8f72cdc87510cf238840b0e02d9 Mon Sep 17 00:00:00 2001 |
| From: Jacob Pan <jacob.jun.pan@linux.intel.com> |
| Date: Thu, 2 Jan 2020 08:18:04 +0800 |
| Subject: [PATCH] iommu/vt-d: Match CPU and IOMMU paging mode |
| |
| commit 79db7e1b4cf2a006f556099c13de3b12970fc6e3 upstream. |
| |
| When setting up first level page tables for sharing with CPU, we need |
| to ensure IOMMU can support no less than the levels supported by the |
| CPU. |
| |
| It is not adequate, as in the current code, to set up 5-level paging |
| in PASID entry First Level Paging Mode(FLPM) solely based on CPU. |
| |
| Currently, intel_pasid_setup_first_level() is only used by native SVM |
| code which already checks paging mode matches. However, future use of |
| this helper function may not be limited to native SVM. |
| https://lkml.org/lkml/2019/11/18/1037 |
| |
| Fixes: 437f35e1cd4c8 ("iommu/vt-d: Add first level page table interface") |
| Signed-off-by: Jacob Pan <jacob.jun.pan@linux.intel.com> |
| Reviewed-by: Eric Auger <eric.auger@redhat.com> |
| Signed-off-by: Lu Baolu <baolu.lu@linux.intel.com> |
| Signed-off-by: Joerg Roedel <jroedel@suse.de> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/drivers/iommu/intel-pasid.c b/drivers/iommu/intel-pasid.c |
| index fe51d8af457f..9328471d0d01 100644 |
| --- a/drivers/iommu/intel-pasid.c |
| +++ b/drivers/iommu/intel-pasid.c |
| @@ -516,8 +516,16 @@ int intel_pasid_setup_first_level(struct intel_iommu *iommu, |
| } |
| |
| #ifdef CONFIG_X86 |
| - if (cpu_feature_enabled(X86_FEATURE_LA57)) |
| - pasid_set_flpm(pte, 1); |
| + /* Both CPU and IOMMU paging mode need to match */ |
| + if (cpu_feature_enabled(X86_FEATURE_LA57)) { |
| + if (cap_5lp_support(iommu->cap)) { |
| + pasid_set_flpm(pte, 1); |
| + } else { |
| + pr_err("VT-d has no 5-level paging support for CPU\n"); |
| + pasid_clear_entry(pte); |
| + return -EINVAL; |
| + } |
| + } |
| #endif /* CONFIG_X86 */ |
| |
| pasid_set_domain_id(pte, did); |
| -- |
| 2.7.4 |
| |