Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

iommu/vt-d: Restore previous domain::aperture_end calculation

Commit d373449d8e97 ("iommu/vt-d: Use the generic iommu page table")
changed the calculation of domain::aperture_end. Previously, it was
calculated as:

domain->domain.geometry.aperture_end =
__DOMAIN_MAX_ADDR(domain->gaw - 1);

where domain->gaw was limited to less than MGAW.

Currently, it is calculated purely based on the max level of the page
table that the hardware supports. This is incorrect as stated in Section
3.6 of the VT-d spec:

"Software using first-stage translation structures to translate an IO
Virtual Address (IOVA) must use canonical addresses. Additionally,
software must limit addresses to less than the minimum of MGAW and the
lower canonical address width implied by FSPM (i.e., 47-bit when FSPM
is 4-level and 56-bit when FSPM is 5-level)."

Restore the previous calculation method for domain::aperture_end to avoid
violating the spec. Incorrect aperture calculation causes GPU hangs
without generating VT-d faults on some Intel client platforms.

Fixes: d373449d8e97 ("iommu/vt-d: Use the generic iommu page table")
Reported-by: Chaitanya Kumar Borah <chaitanya.kumar.borah@intel.com>
Closes: https://lore.kernel.org/r/4f15cf3b-6fad-4cd8-87e5-6d86c0082673@intel.com
Suggested-by: Jason Gunthorpe <jgg@nvidia.com>
Suggested-by: Kevin Tian <kevin.tian@intel.com>
Signed-off-by: Lu Baolu <baolu.lu@linux.intel.com>
Signed-off-by: Joerg Roedel <joerg.roedel@amd.com>

authored by

Lu Baolu and committed by
Joerg Roedel
6cbc09b7 c08934a6

+10
+10
drivers/iommu/intel/iommu.c
··· 2817 2817 cfg.common.hw_max_vasz_lg2 = 57; 2818 2818 else 2819 2819 cfg.common.hw_max_vasz_lg2 = 48; 2820 + 2821 + /* 2822 + * Spec 3.6 First-Stage Translation: 2823 + * 2824 + * Software must limit addresses to less than the minimum of MGAW 2825 + * and the lower canonical address width implied by FSPM (i.e., 2826 + * 47-bit when FSPM is 4-level and 56-bit when FSPM is 5-level). 2827 + */ 2828 + cfg.common.hw_max_vasz_lg2 = min(cap_mgaw(iommu->cap), 2829 + cfg.common.hw_max_vasz_lg2); 2820 2830 cfg.common.hw_max_oasz_lg2 = 52; 2821 2831 cfg.common.features = BIT(PT_FEAT_SIGN_EXTEND) | 2822 2832 BIT(PT_FEAT_FLUSH_RANGE);