mirror of https://github.com/torvalds/linux.git
iommu/vt-d: Restore previous domain::aperture_end calculation
Commitd373449d8e("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:d373449d8e("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>
This commit is contained in:
parent
c08934a612
commit
6cbc09b771
|
|
@ -2817,6 +2817,16 @@ intel_iommu_domain_alloc_first_stage(struct device *dev,
|
||||||
cfg.common.hw_max_vasz_lg2 = 57;
|
cfg.common.hw_max_vasz_lg2 = 57;
|
||||||
else
|
else
|
||||||
cfg.common.hw_max_vasz_lg2 = 48;
|
cfg.common.hw_max_vasz_lg2 = 48;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Spec 3.6 First-Stage Translation:
|
||||||
|
*
|
||||||
|
* 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).
|
||||||
|
*/
|
||||||
|
cfg.common.hw_max_vasz_lg2 = min(cap_mgaw(iommu->cap),
|
||||||
|
cfg.common.hw_max_vasz_lg2);
|
||||||
cfg.common.hw_max_oasz_lg2 = 52;
|
cfg.common.hw_max_oasz_lg2 = 52;
|
||||||
cfg.common.features = BIT(PT_FEAT_SIGN_EXTEND) |
|
cfg.common.features = BIT(PT_FEAT_SIGN_EXTEND) |
|
||||||
BIT(PT_FEAT_FLUSH_RANGE);
|
BIT(PT_FEAT_FLUSH_RANGE);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue