On Thu, Jul 09, 2026 at 12:13:19PM +0100, Catalin Marinas wrote:
quoted
quoted
For AMD/SME, on host with memory encryption we now end up setting the C
bit for DMA_ATTR_MMIO. This is fine for RAM but not sure whether
some other MMIO bus understands this attribute. Maybe we should stick to
something like __phys_to_dma() for the !CC_SHARED && MMIO path. Or,
since this is not universally defined, just use the old dma_addr = phys
if MMIO and ignore any unlikely DMA offsets.
Considering for AMD/SME system an unencrypted dma addr is one without C
bit, will this be good?
/*
* For host memory encryption and device requiring unencrypted DMA,
* MMIO memory is treated as shared by default.
*/
if (attrs & DMA_ATTR_MMIO) {
if (cc_platform_has(CC_ATTR_HOST_MEM_ENCRYPT) || force_dma_unencrypted(dev))
attrs |= DMA_ATTR_CC_SHARED;
}
Yes, I think it does the trick, preserves the current semantics for AMD.
I guess you could use a single 'if' for all checks (up to you).
Please don't change it, MMIO P2P is broken on CC systems today and it
should stay broken. Passing DMA_ATTR_MMIO with DMA_ATTR_CC_SHARED is
an error that we need to correct in the drivers not make work in the
core code.
Jason