crypto: caam - treat SGT address pointer as u64
authorTudor Ambarus <tudor-dan.ambarus@nxp.com>
Fri, 30 Sep 2016 09:09:39 +0000 (12:09 +0300)
committerHerbert Xu <herbert@gondor.apana.org.au>
Sun, 2 Oct 2016 14:33:45 +0000 (22:33 +0800)
Even for i.MX, CAAM is able to use address pointers greater than
32 bits, the address pointer field being interpreted as a double word.
Enforce u64 address pointer in the sec4_sg_entry struct.

This patch fixes the SGT address pointer endianness issue for
32bit platforms where core endianness != caam endianness.

Signed-off-by: Tudor Ambarus <tudor-dan.ambarus@nxp.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
drivers/crypto/caam/desc.h
drivers/crypto/caam/regs.h
drivers/crypto/caam/sg_sw_sec4.h

index 26427c1..513b664 100644 (file)
 #define SEC4_SG_OFFSET_MASK    0x00001fff
 
 struct sec4_sg_entry {
-#if !defined(CONFIG_ARCH_DMA_ADDR_T_64BIT) && \
-       defined(CONFIG_CRYPTO_DEV_FSL_CAAM_IMX)
-       u32 rsvd1;
-       dma_addr_t ptr;
-#else
        u64 ptr;
-#endif /* CONFIG_CRYPTO_DEV_FSL_CAAM_IMX */
        u32 len;
        u32 bpid_offset;
 };
index b3c5016..84d2f83 100644 (file)
@@ -196,6 +196,14 @@ static inline u64 rd_reg64(void __iomem *reg)
 #define caam_dma_to_cpu(value) caam32_to_cpu(value)
 #endif /* CONFIG_ARCH_DMA_ADDR_T_64BIT  */
 
+#ifdef CONFIG_CRYPTO_DEV_FSL_CAAM_IMX
+#define cpu_to_caam_dma64(value) \
+               (((u64)cpu_to_caam32(lower_32_bits(value)) << 32) | \
+                (u64)cpu_to_caam32(upper_32_bits(value)))
+#else
+#define cpu_to_caam_dma64(value) cpu_to_caam64(value)
+#endif
+
 /*
  * jr_outentry
  * Represents each entry in a JobR output ring
index 19dc64f..41cd5a3 100644 (file)
@@ -15,7 +15,7 @@ struct sec4_sg_entry;
 static inline void dma_to_sec4_sg_one(struct sec4_sg_entry *sec4_sg_ptr,
                                      dma_addr_t dma, u32 len, u16 offset)
 {
-       sec4_sg_ptr->ptr = cpu_to_caam_dma(dma);
+       sec4_sg_ptr->ptr = cpu_to_caam_dma64(dma);
        sec4_sg_ptr->len = cpu_to_caam32(len);
        sec4_sg_ptr->bpid_offset = cpu_to_caam32(offset & SEC4_SG_OFFSET_MASK);
 #ifdef DEBUG