crypto: axis - give DMA the start of the status buffer
authorLars Persson <lars.persson@axis.com>
Wed, 23 Jan 2019 11:59:43 +0000 (12:59 +0100)
committerHerbert Xu <herbert@gondor.apana.org.au>
Fri, 1 Feb 2019 06:42:04 +0000 (14:42 +0800)
The driver was optimized to only do cache maintenance for the last
word of the dma descriptor status array. Unfortunately an omission
also passed the last word as the address of the array start to the DMA
engine. In most cases this goes unnoticed since the hardware aligns
the address to a 64 byte boundary.

Signed-off-by: Lars Persson <larper@axis.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
drivers/crypto/axis/artpec6_crypto.c

index da5a73944a78b29b68337b8dffc186f422f7cd1a..e8a57b9e1c7ab6d011b18af06d312de41acf7e15 100644 (file)
@@ -665,8 +665,8 @@ artpec6_crypto_dma_map_descs(struct artpec6_crypto_req_common *common)
         * to be written.
         */
        return artpec6_crypto_dma_map_single(common,
-                               dma->stat + dma->in_cnt - 1,
-                               sizeof(dma->stat[0]),
+                               dma->stat,
+                               sizeof(dma->stat[0]) * dma->in_cnt,
                                DMA_BIDIRECTIONAL,
                                &dma->stat_dma_addr);
 }
@@ -2087,9 +2087,12 @@ static void artpec6_crypto_task(unsigned long data)
        list_for_each_entry_safe(req, n, &ac->pending, list) {
                struct artpec6_crypto_dma_descriptors *dma = req->dma;
                u32 stat;
+               dma_addr_t stataddr;
 
-               dma_sync_single_for_cpu(artpec6_crypto_dev, dma->stat_dma_addr,
-                                       sizeof(dma->stat[0]),
+               stataddr = dma->stat_dma_addr + 4 * (req->dma->in_cnt - 1);
+               dma_sync_single_for_cpu(artpec6_crypto_dev,
+                                       stataddr,
+                                       4,
                                        DMA_BIDIRECTIONAL);
 
                stat = req->dma->stat[req->dma->in_cnt-1];