• Tom Lendacky's avatar
    dma-direct: Force unencrypted DMA under SME for certain DMA masks · 9087c375
    Tom Lendacky authored
    If a device doesn't support DMA to a physical address that includes the
    encryption bit (currently bit 47, so 48-bit DMA), then the DMA must
    occur to unencrypted memory. SWIOTLB is used to satisfy that requirement
    if an IOMMU is not active (enabled or configured in passthrough mode).
    
    However, commit fafadcd1 ("swiotlb: don't dip into swiotlb pool for
    coherent allocations") modified the coherent allocation support in
    SWIOTLB to use the DMA direct coherent allocation support. When an IOMMU
    is not active, this resulted in dma_alloc_coherent() failing for devices
    that didn't support DMA addresses that included the encryption bit.
    
    Addressing this requires changes to the force_dma_unencrypted() function
    in kernel/dma/direct.c. Since the function is now non-trivial and
    SME/SEV specific, update the DMA direct support to add an arch override
    for the force_dma_unencrypted() function. The arch override is selected
    when CONFIG_AMD_MEM_ENCRYPT is set. The arch override function resides in
    the arch/x86/mm/mem_encrypt.c file and forces unencrypted DMA when either
    SEV is active or SME is active and the device does not support DMA to
    physical addresses that include the encryption bit.
    
    Fixes: fafadcd1 ("swiotlb: don't dip into swiotlb pool for coherent allocations")
    Suggested-by: default avatarChristoph Hellwig <hch@lst.de>
    Signed-off-by: default avatarTom Lendacky <thomas.lendacky@amd.com>
    Acked-by: default avatarThomas Gleixner <tglx@linutronix.de>
    [hch: moved the force_dma_unencrypted declaration to dma-mapping.h,
          fold the s390 fix from Halil Pasic]
    Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
    9087c375
direct.c 11.3 KB