This series propagates DMA_ATTR_CC_SHARED through the dma-direct, dma-pool, and swiotlb paths so that encrypted and decrypted DMA buffers are handled consistently.
Today, the direct DMA path mostly relies on force_dma_unencrypted() for shared/decrypted buffer handling. This series consolidates the force_dma_unencrypted() checks in the top-level functions and ensures that the remaining DMA interfaces use DMA attributes to make the correct decisions. The series: - moves swiotlb-backed allocations out of __dma_direct_alloc_pages(), - propagates DMA_ATTR_CC_SHARED through the dma-direct alloc/free paths - teaches the atomic DMA pools to track encrypted versus decrypted state - tracks swiotlb pool encryption state and enforces strict pool selection - centralizes encrypted/decrypted pgprot handling in dma_pgprot() using DMA attributes - passes DMA attributes down to dma_capable() so capability checks can validate whether the selected DMA address encoding matches DMA_ATTR_CC_SHARED - makes dma_direct_map_phys() choose the DMA address encoding from DMA_ATTR_CC_SHARED and fall back to swiotlb when a shared DMA request cannot use the direct mapping, which lets arm64 and x86 CCA guests stop relying on SWIOTLB_FORCE for DMA mappings - use the selected swiotlb pool state to derive the returned DMA address. Changes from v3: https://lore.kernel.org/all/[email protected] * Handle DMA_ATTR_MMIO correctly in dma_direct_map_phys() * Address most of sashiko review * Rebase to latest kernel * drop SWIOTLB_FORCE for s390 and powerpc secure guest. Changes from v2: https://lore.kernel.org/all/[email protected] * pass attrs to dma_capable() and update direct, swiotlb, Xen swiotlb, and x86 GART paths so the capability checks see the DMA address attr value DMA_ATTR_CC_SHARED. * rework dma_direct_map_phys() so DMA_ATTR_CC_SHARED selects phys_to_dma_unencrypted() while the default path uses phys_to_dma_encrypted(), with swiotlb fallback when the requested shared/private state cannot be satisfied by a direct DMA address. * stop relying on SWIOTLB_FORCE for arm64 and x86 CC guest DMA mappings; swiotlb is still enabled there, but shared mappings is now selected through the generic dma_direct_map_phys()/dma_capable() decision instead of a global force-bounce flag. Changes from v1: https://lore.kernel.org/all/[email protected] * rebased to latest kernel (change from DMA_ATTR_CC_DECRYPTED -> DMA_ATTR_CC_SHARED) * update the alloc path so DMA_ATTR_CC_SHARED is not a caller-visible attribute. Cc: Robin Murphy <[email protected]> Cc: Marek Szyprowski <[email protected]> Cc: Will Deacon <[email protected]> Cc: Marc Zyngier <[email protected]> Cc: Steven Price <[email protected]> Cc: Suzuki K Poulose <[email protected]> Cc: Catalin Marinas <[email protected]> Cc: Jiri Pirko <[email protected]> Cc: Jason Gunthorpe <[email protected]> Cc: Mostafa Saleh <[email protected]> Cc: Petr Tesarik <[email protected]> Cc: Alexey Kardashevskiy <[email protected]> Cc: Dan Williams <[email protected]> Cc: Xu Yilun <[email protected]> Cc: [email protected] Cc: [email protected] Cc: Madhavan Srinivasan <[email protected]> Cc: Michael Ellerman <[email protected]> Cc: Nicholas Piggin <[email protected]> Cc: "Christophe Leroy (CS GROUP)" <[email protected]> Cc: Alexander Gordeev <[email protected]> Cc: Gerald Schaefer <[email protected]> Cc: Heiko Carstens <[email protected]> Cc: Vasily Gorbik <[email protected]> Cc: Christian Borntraeger <[email protected]> Cc: Sven Schnelle <[email protected]> Cc: [email protected] Aneesh Kumar K.V (Arm) (13): dma-direct: swiotlb: handle swiotlb alloc/free outside __dma_direct_alloc_pages dma-direct: use DMA_ATTR_CC_SHARED in alloc/free paths dma-pool: track decrypted atomic pools and select them via attrs dma: swiotlb: track pool encryption state and honor DMA_ATTR_CC_SHARED dma-mapping: make dma_pgprot() honor DMA_ATTR_CC_SHARED dma-direct: pass attrs to dma_capable() for DMA_ATTR_CC_SHARED checks dma-direct: make dma_direct_map_phys() honor DMA_ATTR_CC_SHARED dma-direct: set decrypted flag for remapped DMA allocations dma-direct: select DMA address encoding from DMA_ATTR_CC_SHARED dma-pool: fix page leak in atomic_pool_expand() cleanup dma-direct: rename ret to cpu_addr in alloc helpers dma-direct: return struct page from dma_direct_alloc_from_pool() x86/amd-gart: preserve the direct DMA address until GART mapping succeeds arch/arm64/mm/init.c | 4 +- arch/powerpc/platforms/pseries/svm.c | 2 +- arch/s390/mm/init.c | 2 +- arch/x86/kernel/amd_gart_64.c | 36 ++-- arch/x86/kernel/pci-dma.c | 4 +- drivers/iommu/dma-iommu.c | 2 +- drivers/xen/swiotlb-xen.c | 10 +- include/linux/dma-direct.h | 19 ++- include/linux/dma-map-ops.h | 2 +- include/linux/swiotlb.h | 8 +- kernel/dma/direct.c | 243 ++++++++++++++++++++------- kernel/dma/direct.h | 40 ++--- kernel/dma/mapping.c | 16 +- kernel/dma/pool.c | 165 +++++++++++------- kernel/dma/swiotlb.c | 109 +++++++++--- 15 files changed, 459 insertions(+), 203 deletions(-) base-commit: 50897c955902c93ae71c38698abb910525ebdc89 -- 2.43.0
