• Lu Baolu's avatar
    iommu/vt-d: Support enforce_cache_coherency only for empty domains · e645c20e
    Lu Baolu authored
    The enforce_cache_coherency callback ensures DMA cache coherency for
    devices attached to the domain.
    
    Intel IOMMU supports enforced DMA cache coherency when the Snoop
    Control bit in the IOMMU's extended capability register is set.
    Supporting it differs between legacy and scalable modes.
    
    In legacy mode, it's supported page-level by setting the SNP field
    in second-stage page-table entries. In scalable mode, it's supported
    in PASID-table granularity by setting the PGSNP field in PASID-table
    entries.
    
    In legacy mode, mappings before attaching to a device have SNP
    fields cleared, while mappings after the callback have them set.
    This means partial DMAs are cache coherent while others are not.
    
    One possible fix is replaying mappings and flipping SNP bits when
    attaching a domain to a device. But this seems to be over-engineered,
    given that all real use cases just attach an empty domain to a device.
    
    To meet practical needs while reducing mode differences, only support
    enforce_cache_coherency on a domain without mappings if SNP field is
    used.
    
    Fixes: fc0051cb ("iommu/vt-d: Check domain force_snooping against attached devices")
    Signed-off-by: default avatarLu Baolu <baolu.lu@linux.intel.com>
    Reviewed-by: default avatarKevin Tian <kevin.tian@intel.com>
    Link: https://lore.kernel.org/r/20231114011036.70142-1-baolu.lu@linux.intel.comSigned-off-by: default avatarJoerg Roedel <jroedel@suse.de>
    e645c20e
iommu.c 135 KB