]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
crypto: caam - keep both virtual and dma key addresses
authorHoria Geantă <horia.geanta@nxp.com>
Wed, 31 Jul 2019 13:08:10 +0000 (16:08 +0300)
committerHerbert Xu <herbert@gondor.apana.org.au>
Fri, 9 Aug 2019 05:11:49 +0000 (15:11 +1000)
Update alginfo struct to keep both virtual and dma key addresses,
so that descriptors have them at hand.
One example where this is needed is in the xcbc(aes) shared descriptors,
which are updated in current patch.
Another example is the upcoming fix for DKP.

Signed-off-by: Horia Geantă <horia.geanta@nxp.com>
Reviewed-by: Iuliana Prodan <iuliana.prodan@nxp.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
drivers/crypto/caam/caamhash.c
drivers/crypto/caam/caamhash_desc.c
drivers/crypto/caam/caamhash_desc.h
drivers/crypto/caam/desc_constr.h

index d6ef3c0d9b9492f8387b2551cb0bbd57b86c1648..d19373e6ed4a4bb5b75f8a7308b0ae8168a37dd4 100644 (file)
@@ -95,7 +95,6 @@ struct caam_hash_ctx {
        dma_addr_t sh_desc_update_first_dma;
        dma_addr_t sh_desc_fin_dma;
        dma_addr_t sh_desc_digest_dma;
-       dma_addr_t key_dma;
        enum dma_data_direction dir;
        struct device *jrdev;
        int ctx_len;
@@ -282,13 +281,10 @@ static int axcbc_set_sh_desc(struct crypto_ahash *ahash)
        struct device *jrdev = ctx->jrdev;
        u32 *desc;
 
-       /* key is loaded from memory for UPDATE and FINALIZE states */
-       ctx->adata.key_dma = ctx->key_dma;
-
        /* shared descriptor for ahash_update */
        desc = ctx->sh_desc_update;
        cnstr_shdsc_sk_hash(desc, &ctx->adata, OP_ALG_AS_UPDATE,
-                           ctx->ctx_len, ctx->ctx_len, 0);
+                           ctx->ctx_len, ctx->ctx_len);
        dma_sync_single_for_device(jrdev, ctx->sh_desc_update_dma,
                                   desc_bytes(desc), ctx->dir);
        print_hex_dump_debug("axcbc update shdesc@" __stringify(__LINE__)" : ",
@@ -298,7 +294,7 @@ static int axcbc_set_sh_desc(struct crypto_ahash *ahash)
        /* shared descriptor for ahash_{final,finup} */
        desc = ctx->sh_desc_fin;
        cnstr_shdsc_sk_hash(desc, &ctx->adata, OP_ALG_AS_FINALIZE,
-                           digestsize, ctx->ctx_len, 0);
+                           digestsize, ctx->ctx_len);
        dma_sync_single_for_device(jrdev, ctx->sh_desc_fin_dma,
                                   desc_bytes(desc), ctx->dir);
        print_hex_dump_debug("axcbc finup shdesc@" __stringify(__LINE__)" : ",
@@ -311,7 +307,7 @@ static int axcbc_set_sh_desc(struct crypto_ahash *ahash)
        /* shared descriptor for first invocation of ahash_update */
        desc = ctx->sh_desc_update_first;
        cnstr_shdsc_sk_hash(desc, &ctx->adata, OP_ALG_AS_INIT, ctx->ctx_len,
-                           ctx->ctx_len, ctx->key_dma);
+                           ctx->ctx_len);
        dma_sync_single_for_device(jrdev, ctx->sh_desc_update_first_dma,
                                   desc_bytes(desc), ctx->dir);
        print_hex_dump_debug("axcbc update first shdesc@" __stringify(__LINE__)
@@ -321,7 +317,7 @@ static int axcbc_set_sh_desc(struct crypto_ahash *ahash)
        /* shared descriptor for ahash_digest */
        desc = ctx->sh_desc_digest;
        cnstr_shdsc_sk_hash(desc, &ctx->adata, OP_ALG_AS_INITFINAL,
-                           digestsize, ctx->ctx_len, 0);
+                           digestsize, ctx->ctx_len);
        dma_sync_single_for_device(jrdev, ctx->sh_desc_digest_dma,
                                   desc_bytes(desc), ctx->dir);
        print_hex_dump_debug("axcbc digest shdesc@" __stringify(__LINE__)" : ",
@@ -340,7 +336,7 @@ static int acmac_set_sh_desc(struct crypto_ahash *ahash)
        /* shared descriptor for ahash_update */
        desc = ctx->sh_desc_update;
        cnstr_shdsc_sk_hash(desc, &ctx->adata, OP_ALG_AS_UPDATE,
-                           ctx->ctx_len, ctx->ctx_len, 0);
+                           ctx->ctx_len, ctx->ctx_len);
        dma_sync_single_for_device(jrdev, ctx->sh_desc_update_dma,
                                   desc_bytes(desc), ctx->dir);
        print_hex_dump_debug("acmac update shdesc@" __stringify(__LINE__)" : ",
@@ -350,7 +346,7 @@ static int acmac_set_sh_desc(struct crypto_ahash *ahash)
        /* shared descriptor for ahash_{final,finup} */
        desc = ctx->sh_desc_fin;
        cnstr_shdsc_sk_hash(desc, &ctx->adata, OP_ALG_AS_FINALIZE,
-                           digestsize, ctx->ctx_len, 0);
+                           digestsize, ctx->ctx_len);
        dma_sync_single_for_device(jrdev, ctx->sh_desc_fin_dma,
                                   desc_bytes(desc), ctx->dir);
        print_hex_dump_debug("acmac finup shdesc@" __stringify(__LINE__)" : ",
@@ -360,7 +356,7 @@ static int acmac_set_sh_desc(struct crypto_ahash *ahash)
        /* shared descriptor for first invocation of ahash_update */
        desc = ctx->sh_desc_update_first;
        cnstr_shdsc_sk_hash(desc, &ctx->adata, OP_ALG_AS_INIT, ctx->ctx_len,
-                           ctx->ctx_len, 0);
+                           ctx->ctx_len);
        dma_sync_single_for_device(jrdev, ctx->sh_desc_update_first_dma,
                                   desc_bytes(desc), ctx->dir);
        print_hex_dump_debug("acmac update first shdesc@" __stringify(__LINE__)
@@ -370,7 +366,7 @@ static int acmac_set_sh_desc(struct crypto_ahash *ahash)
        /* shared descriptor for ahash_digest */
        desc = ctx->sh_desc_digest;
        cnstr_shdsc_sk_hash(desc, &ctx->adata, OP_ALG_AS_INITFINAL,
-                           digestsize, ctx->ctx_len, 0);
+                           digestsize, ctx->ctx_len);
        dma_sync_single_for_device(jrdev, ctx->sh_desc_digest_dma,
                                   desc_bytes(desc), ctx->dir);
        print_hex_dump_debug("acmac digest shdesc@" __stringify(__LINE__)" : ",
@@ -507,7 +503,8 @@ static int axcbc_setkey(struct crypto_ahash *ahash, const u8 *key,
        }
 
        memcpy(ctx->key, key, keylen);
-       dma_sync_single_for_device(jrdev, ctx->key_dma, keylen, DMA_TO_DEVICE);
+       dma_sync_single_for_device(jrdev, ctx->adata.key_dma, keylen,
+                                  DMA_TO_DEVICE);
        ctx->adata.keylen = keylen;
 
        print_hex_dump_debug("axcbc ctx.key@" __stringify(__LINE__)" : ",
@@ -1831,11 +1828,11 @@ static int caam_hash_cra_init(struct crypto_tfm *tfm)
                ctx->adata.algtype = OP_TYPE_CLASS1_ALG | caam_hash->alg_type;
                ctx->ctx_len = 48;
 
-               ctx->key_dma = dma_map_single_attrs(ctx->jrdev, ctx->key,
-                                                   ARRAY_SIZE(ctx->key),
-                                                   DMA_BIDIRECTIONAL,
-                                                   DMA_ATTR_SKIP_CPU_SYNC);
-               if (dma_mapping_error(ctx->jrdev, ctx->key_dma)) {
+               ctx->adata.key_dma = dma_map_single_attrs(ctx->jrdev, ctx->key,
+                                                         ARRAY_SIZE(ctx->key),
+                                                         DMA_BIDIRECTIONAL,
+                                                         DMA_ATTR_SKIP_CPU_SYNC);
+               if (dma_mapping_error(ctx->jrdev, ctx->adata.key_dma)) {
                        dev_err(ctx->jrdev, "unable to map key\n");
                        caam_jr_free(ctx->jrdev);
                        return -ENOMEM;
@@ -1859,7 +1856,7 @@ static int caam_hash_cra_init(struct crypto_tfm *tfm)
                dev_err(ctx->jrdev, "unable to map shared descriptors\n");
 
                if (is_xcbc_aes(caam_hash->alg_type))
-                       dma_unmap_single_attrs(ctx->jrdev, ctx->key_dma,
+                       dma_unmap_single_attrs(ctx->jrdev, ctx->adata.key_dma,
                                               ARRAY_SIZE(ctx->key),
                                               DMA_BIDIRECTIONAL,
                                               DMA_ATTR_SKIP_CPU_SYNC);
@@ -1895,7 +1892,7 @@ static void caam_hash_cra_exit(struct crypto_tfm *tfm)
                               offsetof(struct caam_hash_ctx, key),
                               ctx->dir, DMA_ATTR_SKIP_CPU_SYNC);
        if (is_xcbc_aes(ctx->adata.algtype))
-               dma_unmap_single_attrs(ctx->jrdev, ctx->key_dma,
+               dma_unmap_single_attrs(ctx->jrdev, ctx->adata.key_dma,
                                       ARRAY_SIZE(ctx->key), DMA_BIDIRECTIONAL,
                                       DMA_ATTR_SKIP_CPU_SYNC);
        caam_jr_free(ctx->jrdev);
index 71d018343ee453f595d2bba88e668f04b63672e0..78383d77da99dc61b70c8950863a925446c182f1 100644 (file)
@@ -83,10 +83,9 @@ EXPORT_SYMBOL(cnstr_shdsc_ahash);
  * @state: algorithm state OP_ALG_AS_{INIT, FINALIZE, INITFINALIZE, UPDATE}
  * @digestsize: algorithm's digest size
  * @ctx_len: size of Context Register
- * @key_dma: I/O Virtual Address of the key
  */
 void cnstr_shdsc_sk_hash(u32 * const desc, struct alginfo *adata, u32 state,
-                        int digestsize, int ctx_len, dma_addr_t key_dma)
+                        int digestsize, int ctx_len)
 {
        u32 *skip_key_load;
 
@@ -136,7 +135,7 @@ void cnstr_shdsc_sk_hash(u32 * const desc, struct alginfo *adata, u32 state,
                         LDST_SRCDST_BYTE_CONTEXT);
        if (is_xcbc_aes(adata->algtype) && state == OP_ALG_AS_INIT)
                /* Save K1 */
-               append_fifo_store(desc, key_dma, adata->keylen,
+               append_fifo_store(desc, adata->key_dma, adata->keylen,
                                  LDST_CLASS_1_CCB | FIFOST_TYPE_KEY_KEK);
 }
 EXPORT_SYMBOL(cnstr_shdsc_sk_hash);
index 6947ee1f200c2a224681eff7ea289b386fb73266..4f369b8cb6aee72346e24372346a3c9e42fdab63 100644 (file)
@@ -25,5 +25,5 @@ void cnstr_shdsc_ahash(u32 * const desc, struct alginfo *adata, u32 state,
                       int digestsize, int ctx_len, bool import_ctx, int era);
 
 void cnstr_shdsc_sk_hash(u32 * const desc, struct alginfo *adata, u32 state,
-                        int digestsize, int ctx_len, dma_addr_t key_dma);
+                        int digestsize, int ctx_len);
 #endif /* _CAAMHASH_DESC_H_ */
index 5988a26a2441a5841ebe35026bcf6e94a72c3b29..815417411a1801c99ba96e50b417648924d898f9 100644 (file)
@@ -457,8 +457,8 @@ do { \
  *           functions where it is used.
  * @keylen: length of the provided algorithm key, in bytes
  * @keylen_pad: padded length of the provided algorithm key, in bytes
- * @key: address where algorithm key resides; virtual address if key_inline
- *       is true, dma (bus) address if key_inline is false.
+ * @key_dma: dma (bus) address where algorithm key resides
+ * @key_virt: virtual address where algorithm key resides
  * @key_inline: true - key can be inlined in the descriptor; false - key is
  *              referenced by the descriptor
  */
@@ -466,10 +466,8 @@ struct alginfo {
        u32 algtype;
        unsigned int keylen;
        unsigned int keylen_pad;
-       union {
-               dma_addr_t key_dma;
-               const void *key_virt;
-       };
+       dma_addr_t key_dma;
+       const void *key_virt;
        bool key_inline;
 };