[PATCH] arm64: mm: Treat all devices as dma-coherent when CLIDR_EL1.LoC == 0
Will Deacon
will at kernel.org
Thu Jul 23 06:03:21 PDT 2026
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.
Cc: Steffen Eiden <seiden at linux.ibm.com>
Cc: Andreas Grapentin <gra at linux.ibm.com>
Cc: Mark Rutland <mark.rutland at arm.com>
Cc: Marc Zyngier <maz at kernel.org>
Signed-off-by: Will Deacon <will at kernel.org>
---
arch/arm64/mm/dma-mapping.c | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/arch/arm64/mm/dma-mapping.c b/arch/arm64/mm/dma-mapping.c
index 994b7b36e2b9..7f6f2f40dba2 100644
--- a/arch/arm64/mm/dma-mapping.c
+++ b/arch/arm64/mm/dma-mapping.c
@@ -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)",
--
2.55.0.229.g6434b31f56-goog
More information about the linux-arm-kernel
mailing list