Jason Gunthorpe <[email protected]> writes:
> On Tue, May 19, 2026 at 08:37:54PM +0530, Aneesh Kumar K.V wrote:
>
>> if we get force_dma_unencrypted(dev) correct, we won't need the above.
>>
>> for dma_direct_alloc and dma_direct_alloc_pages() we have
>>
>> if (force_dma_unencrypted(dev))
>> attrs |= DMA_ATTR_CC_SHARED;
>>
>>
>> for dma_direct_map_phys(), if we have swiotlb bouncing forced,
>>
>> swiotlb_tbl_map_single():
>>
>> if ((attrs & DMA_ATTR_CC_SHARED) || force_dma_unencrypted(dev))
>> require_decrypted = true;
>
> IMHO I really do prefer the DMA_ATTR_CC_SHARED flows closer to the
> thing that did the decryption. While the above is possibly sound it is
> very obtuse to be guessing what kind of memory swiotlb decided to
> return..
>
> Can we pass a pointer to the attrs into the swiotlb stuff and it can
> update it based on the kind of memory it has allocated?
>
Yes, that also resulted in simpler and cleaner code.
swiotlb_tbl_map_single
/*
* If the physical address is encrypted but the device requires
* decrypted DMA, use a decrypted io_tlb_mem and update the
* attributes so the caller knows that a decrypted io_tlb_mem
* was used.
*/
if (!(*attrs & DMA_ATTR_CC_SHARED) && force_dma_unencrypted(dev))
*attrs |= DMA_ATTR_CC_SHARED;
if (mem->unencrypted != !!(*attrs & DMA_ATTR_CC_SHARED))
return (phys_addr_t)DMA_MAPPING_ERROR;
and
@@ -1640,19 +1654,14 @@ dma_addr_t swiotlb_map(struct device *dev, phys_addr_t
paddr, size_t size,
trace_swiotlb_bounced(dev, phys_to_dma(dev, paddr), size);
- swiotlb_addr = swiotlb_tbl_map_single(dev, paddr, size, 0, dir, attrs);
+ swiotlb_addr = swiotlb_tbl_map_single(dev, paddr, size, 0, dir, &attrs);
if (swiotlb_addr == (phys_addr_t)DMA_MAPPING_ERROR)
return DMA_MAPPING_ERROR;
- /*
- * Use the allocated io_tlb_mem encryption type to determine dma addr.
- */
- if (dev->dma_io_tlb_mem->unencrypted) {
+ if (attrs & DMA_ATTR_CC_SHARED)
dma_addr = phys_to_dma_unencrypted(dev, swiotlb_addr);
- attrs |= DMA_ATTR_CC_SHARED;
- } else {
+ else
dma_addr = phys_to_dma_encrypted(dev, swiotlb_addr);
- }
if (unlikely(!dma_capable(dev, dma_addr, size, true, attrs))) {
__swiotlb_tbl_unmap_single(dev, swiotlb_addr, size, dir,