Linux-ARM-Kernel Archive on lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] crypto: atmel-tdes - sync output bounce buffer before DMA
@ 2026-08-29  4:53 Karl Mehltretter
  0 siblings, 0 replies; only message in thread
From: Karl Mehltretter @ 2026-08-29  4:53 UTC (permalink / raw)
  To: Herbert Xu
  Cc: Karl Mehltretter, David S. Miller, Thorsten Blum, Nicolas Ferre,
	Alexandre Belloni, Claudiu Beznea, linux-crypto, linux-arm-kernel,
	linux-kernel

The slow path DMAs into a bounce buffer mapped once at probe with
DMA_FROM_DEVICE.  On reuse, nothing invalidates the CPU cache for it
before the DMA writes, so the copy-out can read stale data.

This was hidden by the copy-out calling dma_sync_single_for_device()
instead of dma_sync_single_for_cpu(): on ARM the misplaced for_device call
invalidates the cache, which is exactly what the missing pre-DMA sync
should have done.  Commit c8a9a647532f ("crypto: atmel-tdes - fix DMA sync
direction") corrected that call.  On ARM926 dma_unmap_area is a no-op, so
for_cpu does not invalidate and the SAM9X60 and SAM9X7 parts lost their
only invalidate.

With CONFIG_CRYPTO_SELFTESTS=y all four DES/TDES algorithms now fail on
SAM9X75:

  alg: skcipher: atmel-ecb-tdes encryption test failed (wrong result) on
  test vector 2, cfg="unaligned buffer, offset=1"

Sync the output buffer for the device before starting the DMA, in both
the PDC and DMA engine paths.

Fixes: c8a9a647532f ("crypto: atmel-tdes - fix DMA sync direction")
Cc: stable@vger.kernel.org
Assisted-by: LLM
Signed-off-by: Karl Mehltretter <kmehltretter@gmail.com>
---
Tested on top of:

  crypto: atmel-tdes - zero-initialize device state
  https://lore.kernel.org/r/20260829035821.67220-1-kmehltretter@gmail.com/

Without that fix, on the tested SAM9X75 the DES/TDES self-tests hang on
their first requests before reaching this test vector, so the failure
fixed here is not observable on an otherwise unpatched tree.

The two patches are independent and apply in either order.

 drivers/crypto/atmel-tdes.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/drivers/crypto/atmel-tdes.c b/drivers/crypto/atmel-tdes.c
index 2756dab3f4c7..ed80423b4209 100644
--- a/drivers/crypto/atmel-tdes.c
+++ b/drivers/crypto/atmel-tdes.c
@@ -370,6 +370,8 @@ static int atmel_tdes_crypt_pdc(struct atmel_tdes_dev *dd,
 	if (!(dd->flags & TDES_FLAGS_FAST)) {
 		dma_sync_single_for_device(dd->dev, dma_addr_in, length,
 					   DMA_TO_DEVICE);
+		dma_sync_single_for_device(dd->dev, dma_addr_out, length,
+					   DMA_FROM_DEVICE);
 	}
 
 	len32 = DIV_ROUND_UP(length, sizeof(u32));
@@ -402,6 +404,8 @@ static int atmel_tdes_crypt_dma(struct atmel_tdes_dev *dd,
 	if (!(dd->flags & TDES_FLAGS_FAST)) {
 		dma_sync_single_for_device(dd->dev, dma_addr_in, length,
 					   DMA_TO_DEVICE);
+		dma_sync_single_for_device(dd->dev, dma_addr_out, length,
+					   DMA_FROM_DEVICE);
 	}
 
 	addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
-- 
2.39.5 (Apple Git-154)



^ permalink raw reply related	[flat|nested] only message in thread

only message in thread, other threads:[~2026-08-29  4:54 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-08-29  4:53 [PATCH] crypto: atmel-tdes - sync output bounce buffer before DMA Karl Mehltretter

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox