arm64: mm: Treat all devices as dma-coherent when CLIDR_EL1.LoC == 0
Will Deacon
maintainerPATCH 1/1 arm64: mm: Treat all devices as dma-coherent when CLIDR_EL1.LoC == 0
On systems where CLIDR_EL1.LoC == 0, no cache maintenance is required when cleaning or invalidating to the Point of Coherency and therefore all DMA agents can be treated as coherent.
Extend arch_setup_dma_ops() to take CLIDR_EL1.LoC into account when setting the DMA ops for a device, emitting a warning message if the firmware advertises a non-coherent device on a fully coherent system.
--- arch/arm64/mm/dma-mapping.c | 5 +++++ 1 file changed, 5 insertions(+)
arch/arm64/mm/dma-mapping.c +5 -0
@@ -42,6 +42,11 @@ void arch_setup_dma_ops(struct device *dev, bool coherent) {int cls =cache_line_size_of_cpu (); +if (!coherent && !CLIDR_LOC (read_sysreg (clidr_el1))) { +dev_warn (dev,"CLIDR_EL1.LoC == 0, treating as coherent\n" ); + coherent = true; + } + WARN_TAINT(!coherent && cls > ARCH_DMA_MINALIGN, TAINT_CPU_OUT_OF_SPEC, "%s %s: ARCH_DMA_MINALIGN smaller than CTR_EL0.CWG (%d < %d)",
Signature · 1 line
2.55.0.229.g6434b31f56-goog
Quoted 9 lines · Will Deacon
On systems where CLIDR_EL1.LoC == 0, no cache maintenance is required when cleaning or invalidating to the Point of Coherency and therefore all DMA agents can be treated as coherent.
Extend
arch_setup_dma_ops()to take CLIDR_EL1.LoC into account when setting the DMA ops for a device, emitting a warning message if the firmware advertises a non-coherent device on a fully coherent system.[...]
Applied to arm64 (for-next/mm), thanks!
[1/1] arm64: mm: Treat all devices as dma-coherent when CLIDR_EL1.LoC == 0
https://git.kernel.org/arm64/c/233b5554e07b
Cheers,
Signature · 5 lines
Will https://fixes.arm64.dev https://next.arm64.dev https://will.arm64.dev