On Tue, Aug 19, 2025 at 08:36:51PM +0300, Leon Romanovsky wrote: > +static inline dma_addr_t dma_direct_map_phys(struct device *dev, > + phys_addr_t phys, size_t size, enum dma_data_direction dir, > + unsigned long attrs) > { > - phys_addr_t phys = page_to_phys(page) + offset; > - dma_addr_t dma_addr = phys_to_dma(dev, phys); > + dma_addr_t dma_addr; > + bool capable; > > if (is_swiotlb_force_bounce(dev)) { > - if (is_pci_p2pdma_page(page)) > - return DMA_MAPPING_ERROR; > + if (attrs & DMA_ATTR_MMIO) > + goto err_overflow; > + > return swiotlb_map(dev, phys, size, dir, attrs); > } > > - if (unlikely(!dma_capable(dev, dma_addr, size, true)) || > - dma_kmalloc_needs_bounce(dev, size, dir)) { > - if (is_pci_p2pdma_page(page)) > - return DMA_MAPPING_ERROR; > - if (is_swiotlb_active(dev)) > + if (attrs & DMA_ATTR_MMIO) > + dma_addr = phys; > + else > + dma_addr = phys_to_dma(dev, phys);
I've been trying to unpuzzle this CC related mess for a while and still am unsure what is right here... But judging from the comments I think this should always call phys_to_dma(). Though I understand the existing map_resource path didn't call it so it would also be fine to leave it like this.. Alexey do you know? The only time this seems to do anything is on AMD and I have no idea what AMD has done to their CC memory map with the iommu.. On ARM at least I would expect the DMA API to be dealing only with canonical IPA, ie if the memory is encrpyted it is in the protect IPA region, if it is decrypted then it is in the unprotected IPA region. I think some of this 'dma encrypted' 'dma unencrypted' stuff is a bit confused, at least on ARM, as I would expect the caller to have a correct phys_addr_t with the correct IPA aliases already. Passing in an ambiguous struct page for DMA mapping and then magically fixing it seems really weird to me. I would expect that a correct phys_addr_t should just translate 1:1 to a dma_addr_t or an iopte. Suzuki is that the right idea for ARM? To that end this series seems like a big improvment for CCA as the caller can now specify either the protected or unprotected IPA directly instead of an ambiguous struct page. One of the things we are going to need for bounce buffering devices like RDMA is to be able to allocate unencrypted folios, mmap them to userspace, come back and then dma map them as unencrypted into a MR. So it looks to me like this series will be important for this use case as well. It looks OK though: Reviewed-by: Jason Gunthorpe <j...@nvidia.com> Jason