• Jason Gunthorpe's avatar
    iommu: Allow ATS to work on VFs when the PF uses IDENTITY · 6c17c7d5
    Jason Gunthorpe authored
    PCI ATS has a global Smallest Translation Unit field that is located in
    the PF but shared by all of the VFs.
    
    The expectation is that the STU will be set to the root port's global STU
    capability which is driven by the IO page table configuration of the iommu
    HW. Today it becomes set when the iommu driver first enables ATS.
    
    Thus, to enable ATS on the VF, the PF must have already had the correct
    STU programmed, even if ATS is off on the PF.
    
    Unfortunately the PF only programs the STU when the PF enables ATS. The
    iommu drivers tend to leave ATS disabled when IDENTITY translation is
    being used.
    
    Thus we can get into a state where the PF is setup to use IDENTITY with
    the DMA API while the VF would like to use VFIO with a PAGING domain and
    have ATS turned on. This fails because the PF never loaded a PAGING domain
    and so it never setup the STU, and the VF can't do it.
    
    The simplest solution is to have the iommu driver set the ATS STU when it
    probes the device. This way the ATS STU is loaded immediately at boot time
    to all PFs and there is no issue when a VF comes to use it.
    
    Add a new call pci_prepare_ats() which should be called by iommu drivers
    in their probe_device() op for every PCI device if the iommu driver
    supports ATS. This will setup the STU based on whatever page size
    capability the iommu HW has.
    Signed-off-by: default avatarJason Gunthorpe <jgg@nvidia.com>
    Acked-by: default avatarBjorn Helgaas <bhelgaas@google.com>
    Reviewed-by: default avatarKevin Tian <kevin.tian@intel.com>
    Reviewed-by: default avatarLu Baolu <baolu.lu@linux.intel.com>
    Link: https://lore.kernel.org/r/0-v1-0fb4d2ab6770+7e706-ats_vf_jgg@nvidia.comSigned-off-by: default avatarJoerg Roedel <jroedel@suse.de>
    6c17c7d5
ats.c 11.7 KB