Hello Olaf,
The mail arrived without any subject line in the email header.
There was only a subject line in the message body.
The patch cannot be processed by the tooling of the U-Boot project
without a proper subject line.
Please, resend your patch with a subject header line,
e.g. using `git email`.
Best regards
Heinrich
On 5/2/25 11:02, Baehring, Olaf wrote:
Internal
Subject: [PATCH] bugfix CAAM error on startup
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
In rare cases U-Boot returns an error message when intantiating the RNG
of the CAAM device:
"SEC0: RNG4 SH0 instantiation failed with error 0xffffffff"
This means, that even when the CAAM device reports a finished
descriptor, none is found in the output ring.
This might be caused by a missing cache invalidation before
reading the memory of the output ring
This patch moves the cache invalidation of the output ring from start of
the job to immediately after the notification from hardware where the
output ring will be read.
Signed-off-by: Baehring, Olaf <olaf.baehr...@draeger.com>
---
drivers/crypto/fsl/jr.c | 30 +++++++++++++++++-------------
drivers/crypto/fsl/jr.h | 4 ----
2 files changed, 17 insertions(+), 17 deletions(-)
diff --git a/drivers/crypto/fsl/jr.c b/drivers/crypto/fsl/jr.c
index 8f7a821ebf3..edf678d363e 100644
--- a/drivers/crypto/fsl/jr.c
+++ b/drivers/crypto/fsl/jr.c
@@ -217,13 +217,6 @@ static int jr_enqueue(uint32_t *desc_addr,
jr->head = (head + 1) & (jr->size - 1);
- /* Invalidate output ring */
- start = (unsigned long)jr->output_ring &
- ~(ARCH_DMA_MINALIGN - 1);
- end = ALIGN((unsigned long)jr->output_ring + jr->op_size,
- ARCH_DMA_MINALIGN);
- invalidate_dcache_range(start, end);
-
sec_out32(®s->irja, 1);
return 0;
@@ -243,6 +236,7 @@ static int jr_dequeue(int sec_idx, struct caam_regs *caam)
#else
uint32_t *addr;
#endif
+ unsigned long start, end;
while (sec_in32(®s->orsf) && CIRC_CNT(jr->head, jr->tail,
jr->size)) {
@@ -250,6 +244,14 @@ static int jr_dequeue(int sec_idx, struct caam_regs *caam)
found = 0;
caam_dma_addr_t op_desc;
+
+ /* Invalidate output ring */
+ start = (unsigned long)jr->output_ring &
+ ~(ARCH_DMA_MINALIGN - 1);
+ end = ALIGN((unsigned long)jr->output_ring
+ + jr->op_size, ARCH_DMA_MINALIGN);
+ invalidate_dcache_range(start, end);
+
#ifdef CONFIG_CAAM_64BIT
/* Read the 64 bit Descriptor address from Output Ring.
* The 32 bit hign and low part of the address will
@@ -283,28 +285,31 @@ static int jr_dequeue(int sec_idx, struct caam_regs *caam)
}
/* Error condition if match not found */
- if (!found)
+ if (!found) {
+ int slots_full = sec_in32(®s->orsf);
+
+ jr->tail = (jr->tail + slots_full) & (jr->size - 1);
+ sec_out32(®s->orjr, slots_full);
return -1;
+ }
jr->info[idx].op_done = 1;
callback = (void *)jr->info[idx].callback;
arg = jr->info[idx].arg;
/* When the job on tail idx gets done, increment
- * tail till the point where job completed out of oredr has
+ * tail till the point where job completed out of order has
* been taken into account
*/
if (idx == tail)
do {
+ jr->info[tail].op_done = 0;
tail = (tail + 1) & (jr->size - 1);
} while (jr->info[tail].op_done);
jr->tail = tail;
- jr->read_idx = (jr->read_idx + 1) & (jr->size - 1);
sec_out32(®s->orjr, 1);
- jr->info[idx].op_done = 0;
-
callback(status, arg);
}
@@ -378,7 +383,6 @@ static int jr_sw_cleanup(uint8_t sec_idx, struct caam_regs
*caam)
jr->head = 0;
jr->tail = 0;
- jr->read_idx = 0;
jr->write_idx = 0;
memset(jr->info, 0, sizeof(jr->info));
memset(jr->input_ring, 0, jr->size * sizeof(caam_dma_addr_t));
diff --git a/drivers/crypto/fsl/jr.h b/drivers/crypto/fsl/jr.h
index b136cd8d05a..8d5ca03e501 100644
--- a/drivers/crypto/fsl/jr.h
+++ b/drivers/crypto/fsl/jr.h
@@ -83,10 +83,6 @@ struct jobring {
* in-order job completion
*/
int tail;
- /* Read index of the output ring. It may not match with tail in case
- * of out of order completetion
- */
- int read_idx;
/* Write index to input ring. Would be always equal to head */
int write_idx;
/* Size of the rings. */
--
2.34.1
---
This communication contains confidential information. If you are not the
intended recipient please return this email to the sender and delete it from
your records.
Diese Nachricht enthaelt vertrauliche Informationen. Sollten Sie nicht der
beabsichtigte Empfaenger dieser E-mail sein, senden Sie bitte diese an den
Absender zurueck und loeschen Sie die E-mail aus Ihrem System.