crypto: api - Add crypto_tfm_ctx_dma
authorHerbert Xu <herbert@gondor.apana.org.au>
Fri, 25 Nov 2022 04:36:31 +0000 (12:36 +0800)
committerHerbert Xu <herbert@gondor.apana.org.au>
Fri, 2 Dec 2022 10:12:40 +0000 (18:12 +0800)
This patch adds the helpers crypto_tfm_ctx_aligned and
crypto_tfm_ctx_dma.  The first aligns the tfm context to the
value cra_alignmask.  The second sets the alignment according
to dma_cache_get_alignment();

This patch also moves crypto_tfm_ctx into algapi.h.

Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
include/crypto/algapi.h
include/linux/crypto.h

index f50c5d1725da5ad417989a1c7b9a8d38c35c8adc..4c99eb66e654c182fbaeda82c3790eace1142795 100644 (file)
@@ -7,6 +7,7 @@
 #ifndef _CRYPTO_ALGAPI_H
 #define _CRYPTO_ALGAPI_H
 
+#include <asm/cache.h>
 #include <linux/align.h>
 #include <linux/crypto.h>
 #include <linux/kconfig.h>
 #define MAX_CIPHER_BLOCKSIZE           16
 #define MAX_CIPHER_ALIGNMASK           15
 
+#ifdef ARCH_DMA_MINALIGN
+#define CRYPTO_DMA_ALIGN ARCH_DMA_MINALIGN
+#else
+#define CRYPTO_DMA_ALIGN CRYPTO_MINALIGN
+#endif
+
+#define CRYPTO_DMA_PADDING ((CRYPTO_DMA_ALIGN - 1) & ~(CRYPTO_MINALIGN - 1))
+
 struct crypto_aead;
 struct crypto_instance;
 struct module;
@@ -189,10 +198,38 @@ static inline void crypto_xor_cpy(u8 *dst, const u8 *src1, const u8 *src2,
        }
 }
 
+static inline void *crypto_tfm_ctx(struct crypto_tfm *tfm)
+{
+       return tfm->__crt_ctx;
+}
+
+static inline void *crypto_tfm_ctx_align(struct crypto_tfm *tfm,
+                                        unsigned int align)
+{
+       if (align <= crypto_tfm_ctx_alignment())
+               align = 1;
+
+       return PTR_ALIGN(crypto_tfm_ctx(tfm), align);
+}
+
 static inline void *crypto_tfm_ctx_aligned(struct crypto_tfm *tfm)
 {
-       return PTR_ALIGN(crypto_tfm_ctx(tfm),
-                        crypto_tfm_alg_alignmask(tfm) + 1);
+       return crypto_tfm_ctx_align(tfm, crypto_tfm_alg_alignmask(tfm) + 1);
+}
+
+static inline unsigned int crypto_dma_align(void)
+{
+       return CRYPTO_DMA_ALIGN;
+}
+
+static inline unsigned int crypto_dma_padding(void)
+{
+       return (crypto_dma_align() - 1) & ~(crypto_tfm_ctx_alignment() - 1);
+}
+
+static inline void *crypto_tfm_ctx_dma(struct crypto_tfm *tfm)
+{
+       return crypto_tfm_ctx_align(tfm, crypto_dma_align());
 }
 
 static inline struct crypto_instance *crypto_tfm_alg_instance(
index 2324ab6f1846b0b309607c2ae8191afd16268397..5d1e961f810ecb6fc797edae53eddc360243bb27 100644 (file)
@@ -714,11 +714,6 @@ static inline void crypto_tfm_clear_flags(struct crypto_tfm *tfm, u32 flags)
        tfm->crt_flags &= ~flags;
 }
 
-static inline void *crypto_tfm_ctx(struct crypto_tfm *tfm)
-{
-       return tfm->__crt_ctx;
-}
-
 static inline unsigned int crypto_tfm_ctx_alignment(void)
 {
        struct crypto_tfm *tfm;