On devices with CONFIG_SYS_FSL_SEC_BE an endianess swap is done before
sending descriptor to SEC/CAAM engine. A cache flush needs to be
performed to ensure that the updated descriptor is taken into account.

Signed-off-by: Pawel Kochanowski <pkochanow...@sii.pl>
---
 drivers/crypto/fsl/jr.c | 11 +++++++++--
 1 file changed, 9 insertions(+), 2 deletions(-)

diff --git a/drivers/crypto/fsl/jr.c b/drivers/crypto/fsl/jr.c
index 8f7a821ebf3..5a69e1f6bd8 100644
--- a/drivers/crypto/fsl/jr.c
+++ b/drivers/crypto/fsl/jr.c
@@ -162,6 +162,8 @@ static int jr_enqueue(uint32_t *desc_addr,
        uint32_t desc_word;
        int length = desc_len(desc_addr);
        int i;
+       unsigned long start;
+       unsigned long end;
 #ifdef CONFIG_CAAM_64BIT
        uint32_t *addr_hi, *addr_lo;
 #endif
@@ -176,6 +178,11 @@ static int jr_enqueue(uint32_t *desc_addr,
                sec_out32((uint32_t *)&desc_addr[i], desc_word);
        }
 
+       start = (unsigned long)desc_addr & ~(ARCH_DMA_MINALIGN - 1);
+       end = ALIGN((unsigned long)desc_addr +
+                               length * sizeof(desc_addr[0]), 
ARCH_DMA_MINALIGN);
+       flush_dcache_range(start, end);
+
        caam_dma_addr_t desc_phys_addr = virt_to_phys(desc_addr);
 
        jr->info[head].desc_phys_addr = desc_phys_addr;
@@ -183,9 +190,9 @@ static int jr_enqueue(uint32_t *desc_addr,
        jr->info[head].arg = arg;
        jr->info[head].op_done = 0;
 
-       unsigned long start = (unsigned long)&jr->info[head] &
+       start = (unsigned long)&jr->info[head] &
                                        ~(ARCH_DMA_MINALIGN - 1);
-       unsigned long end = ALIGN((unsigned long)&jr->info[head] +
+       end = ALIGN((unsigned long)&jr->info[head] +
                                  sizeof(struct jr_info), ARCH_DMA_MINALIGN);
        flush_dcache_range(start, end);
 
-- 
2.43.0

Reply via email to