• Joao Martins's avatar
    iommu/vt-d: Access/Dirty bit support for SS domains · f35f22cc
    Joao Martins authored
    IOMMU advertises Access/Dirty bits for second-stage page table if the
    extended capability DMAR register reports it (ECAP, mnemonic ECAP.SSADS).
    The first stage table is compatible with CPU page table thus A/D bits are
    implicitly supported. Relevant Intel IOMMU SDM ref for first stage table
    "3.6.2 Accessed, Extended Accessed, and Dirty Flags" and second stage table
    "3.7.2 Accessed and Dirty Flags".
    
    First stage page table is enabled by default so it's allowed to set dirty
    tracking and no control bits needed, it just returns 0. To use SSADS, set
    bit 9 (SSADE) in the scalable-mode PASID table entry and flush the IOTLB
    via pasid_flush_caches() following the manual. Relevant SDM refs:
    
    "3.7.2 Accessed and Dirty Flags"
    "6.5.3.3 Guidance to Software for Invalidations,
     Table 23. Guidance to Software for Invalidations"
    
    PTE dirty bit is located in bit 9 and it's cached in the IOTLB so flush
    IOTLB to make sure IOMMU attempts to set the dirty bit again. Note that
    iommu_dirty_bitmap_record() will add the IOVA to iotlb_gather and thus the
    caller of the iommu op will flush the IOTLB. Relevant manuals over the
    hardware translation is chapter 6 with some special mention to:
    
    "6.2.3.1 Scalable-Mode PASID-Table Entry Programming Considerations"
    "6.2.4 IOTLB"
    
    Select IOMMUFD_DRIVER only if IOMMUFD is enabled, given that IOMMU dirty
    tracking requires IOMMUFD.
    
    Link: https://lore.kernel.org/r/20231024135109.73787-13-joao.m.martins@oracle.comSigned-off-by: default avatarJoao Martins <joao.m.martins@oracle.com>
    Reviewed-by: default avatarLu Baolu <baolu.lu@linux.intel.com>
    Reviewed-by: default avatarKevin Tian <kevin.tian@intel.com>
    Signed-off-by: default avatarJason Gunthorpe <jgg@nvidia.com>
    f35f22cc
iommu.c 134 KB