]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
dma: Fix encryption bit clearing for dma_to_phys
authorSuzuki K Poulose <suzuki.poulose@arm.com>
Thu, 27 Feb 2025 14:41:48 +0000 (14:41 +0000)
committerCatalin Marinas <catalin.marinas@arm.com>
Tue, 11 Mar 2025 15:23:28 +0000 (15:23 +0000)
phys_to_dma() sets the encryption bit on the translated DMA address. But
dma_to_phys() clears the encryption bit after it has been translated back
to the physical address, which could fail if the device uses DMA ranges.

AMD SME doesn't use the DMA ranges and thus this is harmless. But as we
are about to add support for other architectures, let us fix this.

Reported-by: Aneesh Kumar K.V <aneesh.kumar@kernel.org>
Link: https://lkml.kernel.org/r/yq5amsen9stc.fsf@kernel.org
Cc: Will Deacon <will@kernel.org>
Cc: Jean-Philippe Brucker <jean-philippe@linaro.org>
Cc: Robin Murphy <robin.murphy@arm.com>
Cc: Steven Price <steven.price@arm.com>
Cc: Christoph Hellwig <hch@lst.de>
Cc: Marek Szyprowski <m.szyprowski@samsung.com>
Cc: Tom Lendacky <thomas.lendacky@amd.com>
Reviewed-by: Robin Murphy <robin.murphy@arm.com>
Acked-by: Tom Lendacky <thomas.lendacky@amd.com>
Signed-off-by: Suzuki K Poulose <suzuki.poulose@arm.com>
Reviewed-by: Gavin Shan <gshan@redhat.com>
Acked-by: Marek Szyprowski <m.szyprowski@samsung.com>
Fixes: 42be24a4178f ("arm64: Enable memory encrypt for Realms")
Acked-by: Will Deacon <will@kernel.org>
Link: https://lore.kernel.org/r/20250227144150.1667735-2-suzuki.poulose@arm.com
Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
include/linux/dma-direct.h

index d7e30d4f7503a898a456df8eedf6a2cd284c35ff..d20ecc24cb0f54cb0e7dae3c6afcc7e8a39a6485 100644 (file)
@@ -101,12 +101,13 @@ static inline phys_addr_t dma_to_phys(struct device *dev, dma_addr_t dma_addr)
 {
        phys_addr_t paddr;
 
+       dma_addr = __sme_clr(dma_addr);
        if (dev->dma_range_map)
                paddr = translate_dma_to_phys(dev, dma_addr);
        else
                paddr = dma_addr;
 
-       return __sme_clr(paddr);
+       return paddr;
 }
 #endif /* !CONFIG_ARCH_HAS_PHYS_TO_DMA */