]> git.ipfire.org Git - thirdparty/kernel/linux.git/commit
iommupt/vtd: Allow VT-d to have a larger table top than the vasz requires
authorJason Gunthorpe <jgg@nvidia.com>
Thu, 27 Nov 2025 23:54:07 +0000 (19:54 -0400)
committerJoerg Roedel <joerg.roedel@amd.com>
Fri, 28 Nov 2025 07:43:03 +0000 (08:43 +0100)
commitd856f9d27885c499d96ab7fe506083346ccf145d
tree7a42d454bfd1f0e2f6aec9ffc87571fa7b9fae3d
parent416d9a220e678d6b1c5fc206226cfb7fa7efa80e
iommupt/vtd: Allow VT-d to have a larger table top than the vasz requires

VT-d second stage HW specifies both the maximum IOVA and the supported
table walk starting points. Weirdly there is HW that only supports a 4
level walk but has a maximum IOVA that only needs 3.

The current code miscalculates this and creates a wrongly sized page table
which ultimately fails the compatibility check for number of levels.

This is fixed by allowing the page table to be created with both a vasz
and top_level input. The vasz will set the aperture for the domain while
the top_level will set the page table geometry.

Add top_level to vtdss and correct the logic in VT-d to generate the right
top_level and vasz from mgaw and sagaw.

Fixes: d373449d8e97 ("iommu/vt-d: Use the generic iommu page table")
Reported-by: Calvin Owens <calvin@wbinvd.org>
Closes: https://lore.kernel.org/r/8f257d2651eb8a4358fcbd47b0145002e5f1d638.1764237717.git.calvin@wbinvd.org
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
Reviewed-by: Lu Baolu <baolu.lu@linux.intel.com>
Tested-by: Calvin Owens <calvin@wbinvd.org>
Signed-off-by: Joerg Roedel <joerg.roedel@amd.com>
drivers/iommu/generic_pt/fmt/vtdss.h
drivers/iommu/generic_pt/iommu_pt.h
drivers/iommu/intel/iommu.c
include/linux/generic_pt/iommu.h