Linux cryptographic layer development
 help / color / mirror / Atom feed
* [PATCH] crypto: atmel-tdes - sync output bounce buffer before DMA
@ 2026-08-29  4:53 Karl Mehltretter
  2026-09-02 17:16 ` Thorsten Blum
  0 siblings, 1 reply; 2+ messages 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] 2+ messages in thread

* Re: [PATCH] crypto: atmel-tdes - sync output bounce buffer before DMA
  2026-08-29  4:53 [PATCH] crypto: atmel-tdes - sync output bounce buffer before DMA Karl Mehltretter
@ 2026-09-02 17:16 ` Thorsten Blum
  0 siblings, 0 replies; 2+ messages in thread
From: Thorsten Blum @ 2026-09-02 17:16 UTC (permalink / raw)
  To: Karl Mehltretter
  Cc: Herbert Xu, David S. Miller, Nicolas Ferre, Alexandre Belloni,
	Claudiu Beznea, linux-crypto, linux-arm-kernel, linux-kernel

On Sat, Aug 29, 2026 at 06:53:16AM +0200, Karl Mehltretter wrote:
> 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(+)

The code change looks correct to me.

However, I find the first two paragraphs of the changelog difficult to
understand. Could you please reword those and consistently use full
function names with trailing parentheses?

Thanks,
Thorsten

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2026-09-02 17:17 UTC | newest]

Thread overview: 2+ messages (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
2026-09-02 17:16 ` Thorsten Blum

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