18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause) 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * Copyright 2015-2016 Freescale Semiconductor Inc. 48c2ecf20Sopenharmony_ci * Copyright 2017-2019 NXP 58c2ecf20Sopenharmony_ci */ 68c2ecf20Sopenharmony_ci 78c2ecf20Sopenharmony_ci#include "compat.h" 88c2ecf20Sopenharmony_ci#include "regs.h" 98c2ecf20Sopenharmony_ci#include "caamalg_qi2.h" 108c2ecf20Sopenharmony_ci#include "dpseci_cmd.h" 118c2ecf20Sopenharmony_ci#include "desc_constr.h" 128c2ecf20Sopenharmony_ci#include "error.h" 138c2ecf20Sopenharmony_ci#include "sg_sw_sec4.h" 148c2ecf20Sopenharmony_ci#include "sg_sw_qm2.h" 158c2ecf20Sopenharmony_ci#include "key_gen.h" 168c2ecf20Sopenharmony_ci#include "caamalg_desc.h" 178c2ecf20Sopenharmony_ci#include "caamhash_desc.h" 188c2ecf20Sopenharmony_ci#include "dpseci-debugfs.h" 198c2ecf20Sopenharmony_ci#include <linux/fsl/mc.h> 208c2ecf20Sopenharmony_ci#include <soc/fsl/dpaa2-io.h> 218c2ecf20Sopenharmony_ci#include <soc/fsl/dpaa2-fd.h> 228c2ecf20Sopenharmony_ci#include <crypto/xts.h> 238c2ecf20Sopenharmony_ci#include <asm/unaligned.h> 248c2ecf20Sopenharmony_ci 258c2ecf20Sopenharmony_ci#define CAAM_CRA_PRIORITY 2000 268c2ecf20Sopenharmony_ci 278c2ecf20Sopenharmony_ci/* max key is sum of AES_MAX_KEY_SIZE, max split key size */ 288c2ecf20Sopenharmony_ci#define CAAM_MAX_KEY_SIZE (AES_MAX_KEY_SIZE + CTR_RFC3686_NONCE_SIZE + \ 298c2ecf20Sopenharmony_ci SHA512_DIGEST_SIZE * 2) 308c2ecf20Sopenharmony_ci 318c2ecf20Sopenharmony_ci/* 328c2ecf20Sopenharmony_ci * This is a a cache of buffers, from which the users of CAAM QI driver 338c2ecf20Sopenharmony_ci * can allocate short buffers. It's speedier than doing kmalloc on the hotpath. 348c2ecf20Sopenharmony_ci * NOTE: A more elegant solution would be to have some headroom in the frames 358c2ecf20Sopenharmony_ci * being processed. This can be added by the dpaa2-eth driver. This would 368c2ecf20Sopenharmony_ci * pose a problem for userspace application processing which cannot 378c2ecf20Sopenharmony_ci * know of this limitation. So for now, this will work. 388c2ecf20Sopenharmony_ci * NOTE: The memcache is SMP-safe. No need to handle spinlocks in-here 398c2ecf20Sopenharmony_ci */ 408c2ecf20Sopenharmony_cistatic struct kmem_cache *qi_cache; 418c2ecf20Sopenharmony_ci 428c2ecf20Sopenharmony_cistruct caam_alg_entry { 438c2ecf20Sopenharmony_ci struct device *dev; 448c2ecf20Sopenharmony_ci int class1_alg_type; 458c2ecf20Sopenharmony_ci int class2_alg_type; 468c2ecf20Sopenharmony_ci bool rfc3686; 478c2ecf20Sopenharmony_ci bool geniv; 488c2ecf20Sopenharmony_ci bool nodkp; 498c2ecf20Sopenharmony_ci}; 508c2ecf20Sopenharmony_ci 518c2ecf20Sopenharmony_cistruct caam_aead_alg { 528c2ecf20Sopenharmony_ci struct aead_alg aead; 538c2ecf20Sopenharmony_ci struct caam_alg_entry caam; 548c2ecf20Sopenharmony_ci bool registered; 558c2ecf20Sopenharmony_ci}; 568c2ecf20Sopenharmony_ci 578c2ecf20Sopenharmony_cistruct caam_skcipher_alg { 588c2ecf20Sopenharmony_ci struct skcipher_alg skcipher; 598c2ecf20Sopenharmony_ci struct caam_alg_entry caam; 608c2ecf20Sopenharmony_ci bool registered; 618c2ecf20Sopenharmony_ci}; 628c2ecf20Sopenharmony_ci 638c2ecf20Sopenharmony_ci/** 648c2ecf20Sopenharmony_ci * struct caam_ctx - per-session context 658c2ecf20Sopenharmony_ci * @flc: Flow Contexts array 668c2ecf20Sopenharmony_ci * @key: [authentication key], encryption key 678c2ecf20Sopenharmony_ci * @flc_dma: I/O virtual addresses of the Flow Contexts 688c2ecf20Sopenharmony_ci * @key_dma: I/O virtual address of the key 698c2ecf20Sopenharmony_ci * @dir: DMA direction for mapping key and Flow Contexts 708c2ecf20Sopenharmony_ci * @dev: dpseci device 718c2ecf20Sopenharmony_ci * @adata: authentication algorithm details 728c2ecf20Sopenharmony_ci * @cdata: encryption algorithm details 738c2ecf20Sopenharmony_ci * @authsize: authentication tag (a.k.a. ICV / MAC) size 748c2ecf20Sopenharmony_ci */ 758c2ecf20Sopenharmony_cistruct caam_ctx { 768c2ecf20Sopenharmony_ci struct caam_flc flc[NUM_OP]; 778c2ecf20Sopenharmony_ci u8 key[CAAM_MAX_KEY_SIZE]; 788c2ecf20Sopenharmony_ci dma_addr_t flc_dma[NUM_OP]; 798c2ecf20Sopenharmony_ci dma_addr_t key_dma; 808c2ecf20Sopenharmony_ci enum dma_data_direction dir; 818c2ecf20Sopenharmony_ci struct device *dev; 828c2ecf20Sopenharmony_ci struct alginfo adata; 838c2ecf20Sopenharmony_ci struct alginfo cdata; 848c2ecf20Sopenharmony_ci unsigned int authsize; 858c2ecf20Sopenharmony_ci bool xts_key_fallback; 868c2ecf20Sopenharmony_ci struct crypto_skcipher *fallback; 878c2ecf20Sopenharmony_ci}; 888c2ecf20Sopenharmony_ci 898c2ecf20Sopenharmony_cistatic void *dpaa2_caam_iova_to_virt(struct dpaa2_caam_priv *priv, 908c2ecf20Sopenharmony_ci dma_addr_t iova_addr) 918c2ecf20Sopenharmony_ci{ 928c2ecf20Sopenharmony_ci phys_addr_t phys_addr; 938c2ecf20Sopenharmony_ci 948c2ecf20Sopenharmony_ci phys_addr = priv->domain ? iommu_iova_to_phys(priv->domain, iova_addr) : 958c2ecf20Sopenharmony_ci iova_addr; 968c2ecf20Sopenharmony_ci 978c2ecf20Sopenharmony_ci return phys_to_virt(phys_addr); 988c2ecf20Sopenharmony_ci} 998c2ecf20Sopenharmony_ci 1008c2ecf20Sopenharmony_ci/* 1018c2ecf20Sopenharmony_ci * qi_cache_zalloc - Allocate buffers from CAAM-QI cache 1028c2ecf20Sopenharmony_ci * 1038c2ecf20Sopenharmony_ci * Allocate data on the hotpath. Instead of using kzalloc, one can use the 1048c2ecf20Sopenharmony_ci * services of the CAAM QI memory cache (backed by kmem_cache). The buffers 1058c2ecf20Sopenharmony_ci * will have a size of CAAM_QI_MEMCACHE_SIZE, which should be sufficient for 1068c2ecf20Sopenharmony_ci * hosting 16 SG entries. 1078c2ecf20Sopenharmony_ci * 1088c2ecf20Sopenharmony_ci * @flags - flags that would be used for the equivalent kmalloc(..) call 1098c2ecf20Sopenharmony_ci * 1108c2ecf20Sopenharmony_ci * Returns a pointer to a retrieved buffer on success or NULL on failure. 1118c2ecf20Sopenharmony_ci */ 1128c2ecf20Sopenharmony_cistatic inline void *qi_cache_zalloc(gfp_t flags) 1138c2ecf20Sopenharmony_ci{ 1148c2ecf20Sopenharmony_ci return kmem_cache_zalloc(qi_cache, flags); 1158c2ecf20Sopenharmony_ci} 1168c2ecf20Sopenharmony_ci 1178c2ecf20Sopenharmony_ci/* 1188c2ecf20Sopenharmony_ci * qi_cache_free - Frees buffers allocated from CAAM-QI cache 1198c2ecf20Sopenharmony_ci * 1208c2ecf20Sopenharmony_ci * @obj - buffer previously allocated by qi_cache_zalloc 1218c2ecf20Sopenharmony_ci * 1228c2ecf20Sopenharmony_ci * No checking is being done, the call is a passthrough call to 1238c2ecf20Sopenharmony_ci * kmem_cache_free(...) 1248c2ecf20Sopenharmony_ci */ 1258c2ecf20Sopenharmony_cistatic inline void qi_cache_free(void *obj) 1268c2ecf20Sopenharmony_ci{ 1278c2ecf20Sopenharmony_ci kmem_cache_free(qi_cache, obj); 1288c2ecf20Sopenharmony_ci} 1298c2ecf20Sopenharmony_ci 1308c2ecf20Sopenharmony_cistatic struct caam_request *to_caam_req(struct crypto_async_request *areq) 1318c2ecf20Sopenharmony_ci{ 1328c2ecf20Sopenharmony_ci switch (crypto_tfm_alg_type(areq->tfm)) { 1338c2ecf20Sopenharmony_ci case CRYPTO_ALG_TYPE_SKCIPHER: 1348c2ecf20Sopenharmony_ci return skcipher_request_ctx(skcipher_request_cast(areq)); 1358c2ecf20Sopenharmony_ci case CRYPTO_ALG_TYPE_AEAD: 1368c2ecf20Sopenharmony_ci return aead_request_ctx(container_of(areq, struct aead_request, 1378c2ecf20Sopenharmony_ci base)); 1388c2ecf20Sopenharmony_ci case CRYPTO_ALG_TYPE_AHASH: 1398c2ecf20Sopenharmony_ci return ahash_request_ctx(ahash_request_cast(areq)); 1408c2ecf20Sopenharmony_ci default: 1418c2ecf20Sopenharmony_ci return ERR_PTR(-EINVAL); 1428c2ecf20Sopenharmony_ci } 1438c2ecf20Sopenharmony_ci} 1448c2ecf20Sopenharmony_ci 1458c2ecf20Sopenharmony_cistatic void caam_unmap(struct device *dev, struct scatterlist *src, 1468c2ecf20Sopenharmony_ci struct scatterlist *dst, int src_nents, 1478c2ecf20Sopenharmony_ci int dst_nents, dma_addr_t iv_dma, int ivsize, 1488c2ecf20Sopenharmony_ci enum dma_data_direction iv_dir, dma_addr_t qm_sg_dma, 1498c2ecf20Sopenharmony_ci int qm_sg_bytes) 1508c2ecf20Sopenharmony_ci{ 1518c2ecf20Sopenharmony_ci if (dst != src) { 1528c2ecf20Sopenharmony_ci if (src_nents) 1538c2ecf20Sopenharmony_ci dma_unmap_sg(dev, src, src_nents, DMA_TO_DEVICE); 1548c2ecf20Sopenharmony_ci if (dst_nents) 1558c2ecf20Sopenharmony_ci dma_unmap_sg(dev, dst, dst_nents, DMA_FROM_DEVICE); 1568c2ecf20Sopenharmony_ci } else { 1578c2ecf20Sopenharmony_ci dma_unmap_sg(dev, src, src_nents, DMA_BIDIRECTIONAL); 1588c2ecf20Sopenharmony_ci } 1598c2ecf20Sopenharmony_ci 1608c2ecf20Sopenharmony_ci if (iv_dma) 1618c2ecf20Sopenharmony_ci dma_unmap_single(dev, iv_dma, ivsize, iv_dir); 1628c2ecf20Sopenharmony_ci 1638c2ecf20Sopenharmony_ci if (qm_sg_bytes) 1648c2ecf20Sopenharmony_ci dma_unmap_single(dev, qm_sg_dma, qm_sg_bytes, DMA_TO_DEVICE); 1658c2ecf20Sopenharmony_ci} 1668c2ecf20Sopenharmony_ci 1678c2ecf20Sopenharmony_cistatic int aead_set_sh_desc(struct crypto_aead *aead) 1688c2ecf20Sopenharmony_ci{ 1698c2ecf20Sopenharmony_ci struct caam_aead_alg *alg = container_of(crypto_aead_alg(aead), 1708c2ecf20Sopenharmony_ci typeof(*alg), aead); 1718c2ecf20Sopenharmony_ci struct caam_ctx *ctx = crypto_aead_ctx(aead); 1728c2ecf20Sopenharmony_ci unsigned int ivsize = crypto_aead_ivsize(aead); 1738c2ecf20Sopenharmony_ci struct device *dev = ctx->dev; 1748c2ecf20Sopenharmony_ci struct dpaa2_caam_priv *priv = dev_get_drvdata(dev); 1758c2ecf20Sopenharmony_ci struct caam_flc *flc; 1768c2ecf20Sopenharmony_ci u32 *desc; 1778c2ecf20Sopenharmony_ci u32 ctx1_iv_off = 0; 1788c2ecf20Sopenharmony_ci u32 *nonce = NULL; 1798c2ecf20Sopenharmony_ci unsigned int data_len[2]; 1808c2ecf20Sopenharmony_ci u32 inl_mask; 1818c2ecf20Sopenharmony_ci const bool ctr_mode = ((ctx->cdata.algtype & OP_ALG_AAI_MASK) == 1828c2ecf20Sopenharmony_ci OP_ALG_AAI_CTR_MOD128); 1838c2ecf20Sopenharmony_ci const bool is_rfc3686 = alg->caam.rfc3686; 1848c2ecf20Sopenharmony_ci 1858c2ecf20Sopenharmony_ci if (!ctx->cdata.keylen || !ctx->authsize) 1868c2ecf20Sopenharmony_ci return 0; 1878c2ecf20Sopenharmony_ci 1888c2ecf20Sopenharmony_ci /* 1898c2ecf20Sopenharmony_ci * AES-CTR needs to load IV in CONTEXT1 reg 1908c2ecf20Sopenharmony_ci * at an offset of 128bits (16bytes) 1918c2ecf20Sopenharmony_ci * CONTEXT1[255:128] = IV 1928c2ecf20Sopenharmony_ci */ 1938c2ecf20Sopenharmony_ci if (ctr_mode) 1948c2ecf20Sopenharmony_ci ctx1_iv_off = 16; 1958c2ecf20Sopenharmony_ci 1968c2ecf20Sopenharmony_ci /* 1978c2ecf20Sopenharmony_ci * RFC3686 specific: 1988c2ecf20Sopenharmony_ci * CONTEXT1[255:128] = {NONCE, IV, COUNTER} 1998c2ecf20Sopenharmony_ci */ 2008c2ecf20Sopenharmony_ci if (is_rfc3686) { 2018c2ecf20Sopenharmony_ci ctx1_iv_off = 16 + CTR_RFC3686_NONCE_SIZE; 2028c2ecf20Sopenharmony_ci nonce = (u32 *)((void *)ctx->key + ctx->adata.keylen_pad + 2038c2ecf20Sopenharmony_ci ctx->cdata.keylen - CTR_RFC3686_NONCE_SIZE); 2048c2ecf20Sopenharmony_ci } 2058c2ecf20Sopenharmony_ci 2068c2ecf20Sopenharmony_ci /* 2078c2ecf20Sopenharmony_ci * In case |user key| > |derived key|, using DKP<imm,imm> would result 2088c2ecf20Sopenharmony_ci * in invalid opcodes (last bytes of user key) in the resulting 2098c2ecf20Sopenharmony_ci * descriptor. Use DKP<ptr,imm> instead => both virtual and dma key 2108c2ecf20Sopenharmony_ci * addresses are needed. 2118c2ecf20Sopenharmony_ci */ 2128c2ecf20Sopenharmony_ci ctx->adata.key_virt = ctx->key; 2138c2ecf20Sopenharmony_ci ctx->adata.key_dma = ctx->key_dma; 2148c2ecf20Sopenharmony_ci 2158c2ecf20Sopenharmony_ci ctx->cdata.key_virt = ctx->key + ctx->adata.keylen_pad; 2168c2ecf20Sopenharmony_ci ctx->cdata.key_dma = ctx->key_dma + ctx->adata.keylen_pad; 2178c2ecf20Sopenharmony_ci 2188c2ecf20Sopenharmony_ci data_len[0] = ctx->adata.keylen_pad; 2198c2ecf20Sopenharmony_ci data_len[1] = ctx->cdata.keylen; 2208c2ecf20Sopenharmony_ci 2218c2ecf20Sopenharmony_ci /* aead_encrypt shared descriptor */ 2228c2ecf20Sopenharmony_ci if (desc_inline_query((alg->caam.geniv ? DESC_QI_AEAD_GIVENC_LEN : 2238c2ecf20Sopenharmony_ci DESC_QI_AEAD_ENC_LEN) + 2248c2ecf20Sopenharmony_ci (is_rfc3686 ? DESC_AEAD_CTR_RFC3686_LEN : 0), 2258c2ecf20Sopenharmony_ci DESC_JOB_IO_LEN, data_len, &inl_mask, 2268c2ecf20Sopenharmony_ci ARRAY_SIZE(data_len)) < 0) 2278c2ecf20Sopenharmony_ci return -EINVAL; 2288c2ecf20Sopenharmony_ci 2298c2ecf20Sopenharmony_ci ctx->adata.key_inline = !!(inl_mask & 1); 2308c2ecf20Sopenharmony_ci ctx->cdata.key_inline = !!(inl_mask & 2); 2318c2ecf20Sopenharmony_ci 2328c2ecf20Sopenharmony_ci flc = &ctx->flc[ENCRYPT]; 2338c2ecf20Sopenharmony_ci desc = flc->sh_desc; 2348c2ecf20Sopenharmony_ci 2358c2ecf20Sopenharmony_ci if (alg->caam.geniv) 2368c2ecf20Sopenharmony_ci cnstr_shdsc_aead_givencap(desc, &ctx->cdata, &ctx->adata, 2378c2ecf20Sopenharmony_ci ivsize, ctx->authsize, is_rfc3686, 2388c2ecf20Sopenharmony_ci nonce, ctx1_iv_off, true, 2398c2ecf20Sopenharmony_ci priv->sec_attr.era); 2408c2ecf20Sopenharmony_ci else 2418c2ecf20Sopenharmony_ci cnstr_shdsc_aead_encap(desc, &ctx->cdata, &ctx->adata, 2428c2ecf20Sopenharmony_ci ivsize, ctx->authsize, is_rfc3686, nonce, 2438c2ecf20Sopenharmony_ci ctx1_iv_off, true, priv->sec_attr.era); 2448c2ecf20Sopenharmony_ci 2458c2ecf20Sopenharmony_ci flc->flc[1] = cpu_to_caam32(desc_len(desc)); /* SDL */ 2468c2ecf20Sopenharmony_ci dma_sync_single_for_device(dev, ctx->flc_dma[ENCRYPT], 2478c2ecf20Sopenharmony_ci sizeof(flc->flc) + desc_bytes(desc), 2488c2ecf20Sopenharmony_ci ctx->dir); 2498c2ecf20Sopenharmony_ci 2508c2ecf20Sopenharmony_ci /* aead_decrypt shared descriptor */ 2518c2ecf20Sopenharmony_ci if (desc_inline_query(DESC_QI_AEAD_DEC_LEN + 2528c2ecf20Sopenharmony_ci (is_rfc3686 ? DESC_AEAD_CTR_RFC3686_LEN : 0), 2538c2ecf20Sopenharmony_ci DESC_JOB_IO_LEN, data_len, &inl_mask, 2548c2ecf20Sopenharmony_ci ARRAY_SIZE(data_len)) < 0) 2558c2ecf20Sopenharmony_ci return -EINVAL; 2568c2ecf20Sopenharmony_ci 2578c2ecf20Sopenharmony_ci ctx->adata.key_inline = !!(inl_mask & 1); 2588c2ecf20Sopenharmony_ci ctx->cdata.key_inline = !!(inl_mask & 2); 2598c2ecf20Sopenharmony_ci 2608c2ecf20Sopenharmony_ci flc = &ctx->flc[DECRYPT]; 2618c2ecf20Sopenharmony_ci desc = flc->sh_desc; 2628c2ecf20Sopenharmony_ci cnstr_shdsc_aead_decap(desc, &ctx->cdata, &ctx->adata, 2638c2ecf20Sopenharmony_ci ivsize, ctx->authsize, alg->caam.geniv, 2648c2ecf20Sopenharmony_ci is_rfc3686, nonce, ctx1_iv_off, true, 2658c2ecf20Sopenharmony_ci priv->sec_attr.era); 2668c2ecf20Sopenharmony_ci flc->flc[1] = cpu_to_caam32(desc_len(desc)); /* SDL */ 2678c2ecf20Sopenharmony_ci dma_sync_single_for_device(dev, ctx->flc_dma[DECRYPT], 2688c2ecf20Sopenharmony_ci sizeof(flc->flc) + desc_bytes(desc), 2698c2ecf20Sopenharmony_ci ctx->dir); 2708c2ecf20Sopenharmony_ci 2718c2ecf20Sopenharmony_ci return 0; 2728c2ecf20Sopenharmony_ci} 2738c2ecf20Sopenharmony_ci 2748c2ecf20Sopenharmony_cistatic int aead_setauthsize(struct crypto_aead *authenc, unsigned int authsize) 2758c2ecf20Sopenharmony_ci{ 2768c2ecf20Sopenharmony_ci struct caam_ctx *ctx = crypto_aead_ctx(authenc); 2778c2ecf20Sopenharmony_ci 2788c2ecf20Sopenharmony_ci ctx->authsize = authsize; 2798c2ecf20Sopenharmony_ci aead_set_sh_desc(authenc); 2808c2ecf20Sopenharmony_ci 2818c2ecf20Sopenharmony_ci return 0; 2828c2ecf20Sopenharmony_ci} 2838c2ecf20Sopenharmony_ci 2848c2ecf20Sopenharmony_cistatic int aead_setkey(struct crypto_aead *aead, const u8 *key, 2858c2ecf20Sopenharmony_ci unsigned int keylen) 2868c2ecf20Sopenharmony_ci{ 2878c2ecf20Sopenharmony_ci struct caam_ctx *ctx = crypto_aead_ctx(aead); 2888c2ecf20Sopenharmony_ci struct device *dev = ctx->dev; 2898c2ecf20Sopenharmony_ci struct crypto_authenc_keys keys; 2908c2ecf20Sopenharmony_ci 2918c2ecf20Sopenharmony_ci if (crypto_authenc_extractkeys(&keys, key, keylen) != 0) 2928c2ecf20Sopenharmony_ci goto badkey; 2938c2ecf20Sopenharmony_ci 2948c2ecf20Sopenharmony_ci dev_dbg(dev, "keylen %d enckeylen %d authkeylen %d\n", 2958c2ecf20Sopenharmony_ci keys.authkeylen + keys.enckeylen, keys.enckeylen, 2968c2ecf20Sopenharmony_ci keys.authkeylen); 2978c2ecf20Sopenharmony_ci print_hex_dump_debug("key in @" __stringify(__LINE__)": ", 2988c2ecf20Sopenharmony_ci DUMP_PREFIX_ADDRESS, 16, 4, key, keylen, 1); 2998c2ecf20Sopenharmony_ci 3008c2ecf20Sopenharmony_ci ctx->adata.keylen = keys.authkeylen; 3018c2ecf20Sopenharmony_ci ctx->adata.keylen_pad = split_key_len(ctx->adata.algtype & 3028c2ecf20Sopenharmony_ci OP_ALG_ALGSEL_MASK); 3038c2ecf20Sopenharmony_ci 3048c2ecf20Sopenharmony_ci if (ctx->adata.keylen_pad + keys.enckeylen > CAAM_MAX_KEY_SIZE) 3058c2ecf20Sopenharmony_ci goto badkey; 3068c2ecf20Sopenharmony_ci 3078c2ecf20Sopenharmony_ci memcpy(ctx->key, keys.authkey, keys.authkeylen); 3088c2ecf20Sopenharmony_ci memcpy(ctx->key + ctx->adata.keylen_pad, keys.enckey, keys.enckeylen); 3098c2ecf20Sopenharmony_ci dma_sync_single_for_device(dev, ctx->key_dma, ctx->adata.keylen_pad + 3108c2ecf20Sopenharmony_ci keys.enckeylen, ctx->dir); 3118c2ecf20Sopenharmony_ci print_hex_dump_debug("ctx.key@" __stringify(__LINE__)": ", 3128c2ecf20Sopenharmony_ci DUMP_PREFIX_ADDRESS, 16, 4, ctx->key, 3138c2ecf20Sopenharmony_ci ctx->adata.keylen_pad + keys.enckeylen, 1); 3148c2ecf20Sopenharmony_ci 3158c2ecf20Sopenharmony_ci ctx->cdata.keylen = keys.enckeylen; 3168c2ecf20Sopenharmony_ci 3178c2ecf20Sopenharmony_ci memzero_explicit(&keys, sizeof(keys)); 3188c2ecf20Sopenharmony_ci return aead_set_sh_desc(aead); 3198c2ecf20Sopenharmony_cibadkey: 3208c2ecf20Sopenharmony_ci memzero_explicit(&keys, sizeof(keys)); 3218c2ecf20Sopenharmony_ci return -EINVAL; 3228c2ecf20Sopenharmony_ci} 3238c2ecf20Sopenharmony_ci 3248c2ecf20Sopenharmony_cistatic int des3_aead_setkey(struct crypto_aead *aead, const u8 *key, 3258c2ecf20Sopenharmony_ci unsigned int keylen) 3268c2ecf20Sopenharmony_ci{ 3278c2ecf20Sopenharmony_ci struct crypto_authenc_keys keys; 3288c2ecf20Sopenharmony_ci int err; 3298c2ecf20Sopenharmony_ci 3308c2ecf20Sopenharmony_ci err = crypto_authenc_extractkeys(&keys, key, keylen); 3318c2ecf20Sopenharmony_ci if (unlikely(err)) 3328c2ecf20Sopenharmony_ci goto out; 3338c2ecf20Sopenharmony_ci 3348c2ecf20Sopenharmony_ci err = -EINVAL; 3358c2ecf20Sopenharmony_ci if (keys.enckeylen != DES3_EDE_KEY_SIZE) 3368c2ecf20Sopenharmony_ci goto out; 3378c2ecf20Sopenharmony_ci 3388c2ecf20Sopenharmony_ci err = crypto_des3_ede_verify_key(crypto_aead_tfm(aead), keys.enckey) ?: 3398c2ecf20Sopenharmony_ci aead_setkey(aead, key, keylen); 3408c2ecf20Sopenharmony_ci 3418c2ecf20Sopenharmony_ciout: 3428c2ecf20Sopenharmony_ci memzero_explicit(&keys, sizeof(keys)); 3438c2ecf20Sopenharmony_ci return err; 3448c2ecf20Sopenharmony_ci} 3458c2ecf20Sopenharmony_ci 3468c2ecf20Sopenharmony_cistatic struct aead_edesc *aead_edesc_alloc(struct aead_request *req, 3478c2ecf20Sopenharmony_ci bool encrypt) 3488c2ecf20Sopenharmony_ci{ 3498c2ecf20Sopenharmony_ci struct crypto_aead *aead = crypto_aead_reqtfm(req); 3508c2ecf20Sopenharmony_ci struct caam_request *req_ctx = aead_request_ctx(req); 3518c2ecf20Sopenharmony_ci struct dpaa2_fl_entry *in_fle = &req_ctx->fd_flt[1]; 3528c2ecf20Sopenharmony_ci struct dpaa2_fl_entry *out_fle = &req_ctx->fd_flt[0]; 3538c2ecf20Sopenharmony_ci struct caam_ctx *ctx = crypto_aead_ctx(aead); 3548c2ecf20Sopenharmony_ci struct caam_aead_alg *alg = container_of(crypto_aead_alg(aead), 3558c2ecf20Sopenharmony_ci typeof(*alg), aead); 3568c2ecf20Sopenharmony_ci struct device *dev = ctx->dev; 3578c2ecf20Sopenharmony_ci gfp_t flags = (req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP) ? 3588c2ecf20Sopenharmony_ci GFP_KERNEL : GFP_ATOMIC; 3598c2ecf20Sopenharmony_ci int src_nents, mapped_src_nents, dst_nents = 0, mapped_dst_nents = 0; 3608c2ecf20Sopenharmony_ci int src_len, dst_len = 0; 3618c2ecf20Sopenharmony_ci struct aead_edesc *edesc; 3628c2ecf20Sopenharmony_ci dma_addr_t qm_sg_dma, iv_dma = 0; 3638c2ecf20Sopenharmony_ci int ivsize = 0; 3648c2ecf20Sopenharmony_ci unsigned int authsize = ctx->authsize; 3658c2ecf20Sopenharmony_ci int qm_sg_index = 0, qm_sg_nents = 0, qm_sg_bytes; 3668c2ecf20Sopenharmony_ci int in_len, out_len; 3678c2ecf20Sopenharmony_ci struct dpaa2_sg_entry *sg_table; 3688c2ecf20Sopenharmony_ci 3698c2ecf20Sopenharmony_ci /* allocate space for base edesc, link tables and IV */ 3708c2ecf20Sopenharmony_ci edesc = qi_cache_zalloc(GFP_DMA | flags); 3718c2ecf20Sopenharmony_ci if (unlikely(!edesc)) { 3728c2ecf20Sopenharmony_ci dev_err(dev, "could not allocate extended descriptor\n"); 3738c2ecf20Sopenharmony_ci return ERR_PTR(-ENOMEM); 3748c2ecf20Sopenharmony_ci } 3758c2ecf20Sopenharmony_ci 3768c2ecf20Sopenharmony_ci if (unlikely(req->dst != req->src)) { 3778c2ecf20Sopenharmony_ci src_len = req->assoclen + req->cryptlen; 3788c2ecf20Sopenharmony_ci dst_len = src_len + (encrypt ? authsize : (-authsize)); 3798c2ecf20Sopenharmony_ci 3808c2ecf20Sopenharmony_ci src_nents = sg_nents_for_len(req->src, src_len); 3818c2ecf20Sopenharmony_ci if (unlikely(src_nents < 0)) { 3828c2ecf20Sopenharmony_ci dev_err(dev, "Insufficient bytes (%d) in src S/G\n", 3838c2ecf20Sopenharmony_ci src_len); 3848c2ecf20Sopenharmony_ci qi_cache_free(edesc); 3858c2ecf20Sopenharmony_ci return ERR_PTR(src_nents); 3868c2ecf20Sopenharmony_ci } 3878c2ecf20Sopenharmony_ci 3888c2ecf20Sopenharmony_ci dst_nents = sg_nents_for_len(req->dst, dst_len); 3898c2ecf20Sopenharmony_ci if (unlikely(dst_nents < 0)) { 3908c2ecf20Sopenharmony_ci dev_err(dev, "Insufficient bytes (%d) in dst S/G\n", 3918c2ecf20Sopenharmony_ci dst_len); 3928c2ecf20Sopenharmony_ci qi_cache_free(edesc); 3938c2ecf20Sopenharmony_ci return ERR_PTR(dst_nents); 3948c2ecf20Sopenharmony_ci } 3958c2ecf20Sopenharmony_ci 3968c2ecf20Sopenharmony_ci if (src_nents) { 3978c2ecf20Sopenharmony_ci mapped_src_nents = dma_map_sg(dev, req->src, src_nents, 3988c2ecf20Sopenharmony_ci DMA_TO_DEVICE); 3998c2ecf20Sopenharmony_ci if (unlikely(!mapped_src_nents)) { 4008c2ecf20Sopenharmony_ci dev_err(dev, "unable to map source\n"); 4018c2ecf20Sopenharmony_ci qi_cache_free(edesc); 4028c2ecf20Sopenharmony_ci return ERR_PTR(-ENOMEM); 4038c2ecf20Sopenharmony_ci } 4048c2ecf20Sopenharmony_ci } else { 4058c2ecf20Sopenharmony_ci mapped_src_nents = 0; 4068c2ecf20Sopenharmony_ci } 4078c2ecf20Sopenharmony_ci 4088c2ecf20Sopenharmony_ci if (dst_nents) { 4098c2ecf20Sopenharmony_ci mapped_dst_nents = dma_map_sg(dev, req->dst, dst_nents, 4108c2ecf20Sopenharmony_ci DMA_FROM_DEVICE); 4118c2ecf20Sopenharmony_ci if (unlikely(!mapped_dst_nents)) { 4128c2ecf20Sopenharmony_ci dev_err(dev, "unable to map destination\n"); 4138c2ecf20Sopenharmony_ci dma_unmap_sg(dev, req->src, src_nents, 4148c2ecf20Sopenharmony_ci DMA_TO_DEVICE); 4158c2ecf20Sopenharmony_ci qi_cache_free(edesc); 4168c2ecf20Sopenharmony_ci return ERR_PTR(-ENOMEM); 4178c2ecf20Sopenharmony_ci } 4188c2ecf20Sopenharmony_ci } else { 4198c2ecf20Sopenharmony_ci mapped_dst_nents = 0; 4208c2ecf20Sopenharmony_ci } 4218c2ecf20Sopenharmony_ci } else { 4228c2ecf20Sopenharmony_ci src_len = req->assoclen + req->cryptlen + 4238c2ecf20Sopenharmony_ci (encrypt ? authsize : 0); 4248c2ecf20Sopenharmony_ci 4258c2ecf20Sopenharmony_ci src_nents = sg_nents_for_len(req->src, src_len); 4268c2ecf20Sopenharmony_ci if (unlikely(src_nents < 0)) { 4278c2ecf20Sopenharmony_ci dev_err(dev, "Insufficient bytes (%d) in src S/G\n", 4288c2ecf20Sopenharmony_ci src_len); 4298c2ecf20Sopenharmony_ci qi_cache_free(edesc); 4308c2ecf20Sopenharmony_ci return ERR_PTR(src_nents); 4318c2ecf20Sopenharmony_ci } 4328c2ecf20Sopenharmony_ci 4338c2ecf20Sopenharmony_ci mapped_src_nents = dma_map_sg(dev, req->src, src_nents, 4348c2ecf20Sopenharmony_ci DMA_BIDIRECTIONAL); 4358c2ecf20Sopenharmony_ci if (unlikely(!mapped_src_nents)) { 4368c2ecf20Sopenharmony_ci dev_err(dev, "unable to map source\n"); 4378c2ecf20Sopenharmony_ci qi_cache_free(edesc); 4388c2ecf20Sopenharmony_ci return ERR_PTR(-ENOMEM); 4398c2ecf20Sopenharmony_ci } 4408c2ecf20Sopenharmony_ci } 4418c2ecf20Sopenharmony_ci 4428c2ecf20Sopenharmony_ci if ((alg->caam.rfc3686 && encrypt) || !alg->caam.geniv) 4438c2ecf20Sopenharmony_ci ivsize = crypto_aead_ivsize(aead); 4448c2ecf20Sopenharmony_ci 4458c2ecf20Sopenharmony_ci /* 4468c2ecf20Sopenharmony_ci * Create S/G table: req->assoclen, [IV,] req->src [, req->dst]. 4478c2ecf20Sopenharmony_ci * Input is not contiguous. 4488c2ecf20Sopenharmony_ci * HW reads 4 S/G entries at a time; make sure the reads don't go beyond 4498c2ecf20Sopenharmony_ci * the end of the table by allocating more S/G entries. Logic: 4508c2ecf20Sopenharmony_ci * if (src != dst && output S/G) 4518c2ecf20Sopenharmony_ci * pad output S/G, if needed 4528c2ecf20Sopenharmony_ci * else if (src == dst && S/G) 4538c2ecf20Sopenharmony_ci * overlapping S/Gs; pad one of them 4548c2ecf20Sopenharmony_ci * else if (input S/G) ... 4558c2ecf20Sopenharmony_ci * pad input S/G, if needed 4568c2ecf20Sopenharmony_ci */ 4578c2ecf20Sopenharmony_ci qm_sg_nents = 1 + !!ivsize + mapped_src_nents; 4588c2ecf20Sopenharmony_ci if (mapped_dst_nents > 1) 4598c2ecf20Sopenharmony_ci qm_sg_nents += pad_sg_nents(mapped_dst_nents); 4608c2ecf20Sopenharmony_ci else if ((req->src == req->dst) && (mapped_src_nents > 1)) 4618c2ecf20Sopenharmony_ci qm_sg_nents = max(pad_sg_nents(qm_sg_nents), 4628c2ecf20Sopenharmony_ci 1 + !!ivsize + 4638c2ecf20Sopenharmony_ci pad_sg_nents(mapped_src_nents)); 4648c2ecf20Sopenharmony_ci else 4658c2ecf20Sopenharmony_ci qm_sg_nents = pad_sg_nents(qm_sg_nents); 4668c2ecf20Sopenharmony_ci 4678c2ecf20Sopenharmony_ci sg_table = &edesc->sgt[0]; 4688c2ecf20Sopenharmony_ci qm_sg_bytes = qm_sg_nents * sizeof(*sg_table); 4698c2ecf20Sopenharmony_ci if (unlikely(offsetof(struct aead_edesc, sgt) + qm_sg_bytes + ivsize > 4708c2ecf20Sopenharmony_ci CAAM_QI_MEMCACHE_SIZE)) { 4718c2ecf20Sopenharmony_ci dev_err(dev, "No space for %d S/G entries and/or %dB IV\n", 4728c2ecf20Sopenharmony_ci qm_sg_nents, ivsize); 4738c2ecf20Sopenharmony_ci caam_unmap(dev, req->src, req->dst, src_nents, dst_nents, 0, 4748c2ecf20Sopenharmony_ci 0, DMA_NONE, 0, 0); 4758c2ecf20Sopenharmony_ci qi_cache_free(edesc); 4768c2ecf20Sopenharmony_ci return ERR_PTR(-ENOMEM); 4778c2ecf20Sopenharmony_ci } 4788c2ecf20Sopenharmony_ci 4798c2ecf20Sopenharmony_ci if (ivsize) { 4808c2ecf20Sopenharmony_ci u8 *iv = (u8 *)(sg_table + qm_sg_nents); 4818c2ecf20Sopenharmony_ci 4828c2ecf20Sopenharmony_ci /* Make sure IV is located in a DMAable area */ 4838c2ecf20Sopenharmony_ci memcpy(iv, req->iv, ivsize); 4848c2ecf20Sopenharmony_ci 4858c2ecf20Sopenharmony_ci iv_dma = dma_map_single(dev, iv, ivsize, DMA_TO_DEVICE); 4868c2ecf20Sopenharmony_ci if (dma_mapping_error(dev, iv_dma)) { 4878c2ecf20Sopenharmony_ci dev_err(dev, "unable to map IV\n"); 4888c2ecf20Sopenharmony_ci caam_unmap(dev, req->src, req->dst, src_nents, 4898c2ecf20Sopenharmony_ci dst_nents, 0, 0, DMA_NONE, 0, 0); 4908c2ecf20Sopenharmony_ci qi_cache_free(edesc); 4918c2ecf20Sopenharmony_ci return ERR_PTR(-ENOMEM); 4928c2ecf20Sopenharmony_ci } 4938c2ecf20Sopenharmony_ci } 4948c2ecf20Sopenharmony_ci 4958c2ecf20Sopenharmony_ci edesc->src_nents = src_nents; 4968c2ecf20Sopenharmony_ci edesc->dst_nents = dst_nents; 4978c2ecf20Sopenharmony_ci edesc->iv_dma = iv_dma; 4988c2ecf20Sopenharmony_ci 4998c2ecf20Sopenharmony_ci if ((alg->caam.class1_alg_type & OP_ALG_ALGSEL_MASK) == 5008c2ecf20Sopenharmony_ci OP_ALG_ALGSEL_CHACHA20 && ivsize != CHACHAPOLY_IV_SIZE) 5018c2ecf20Sopenharmony_ci /* 5028c2ecf20Sopenharmony_ci * The associated data comes already with the IV but we need 5038c2ecf20Sopenharmony_ci * to skip it when we authenticate or encrypt... 5048c2ecf20Sopenharmony_ci */ 5058c2ecf20Sopenharmony_ci edesc->assoclen = cpu_to_caam32(req->assoclen - ivsize); 5068c2ecf20Sopenharmony_ci else 5078c2ecf20Sopenharmony_ci edesc->assoclen = cpu_to_caam32(req->assoclen); 5088c2ecf20Sopenharmony_ci edesc->assoclen_dma = dma_map_single(dev, &edesc->assoclen, 4, 5098c2ecf20Sopenharmony_ci DMA_TO_DEVICE); 5108c2ecf20Sopenharmony_ci if (dma_mapping_error(dev, edesc->assoclen_dma)) { 5118c2ecf20Sopenharmony_ci dev_err(dev, "unable to map assoclen\n"); 5128c2ecf20Sopenharmony_ci caam_unmap(dev, req->src, req->dst, src_nents, dst_nents, 5138c2ecf20Sopenharmony_ci iv_dma, ivsize, DMA_TO_DEVICE, 0, 0); 5148c2ecf20Sopenharmony_ci qi_cache_free(edesc); 5158c2ecf20Sopenharmony_ci return ERR_PTR(-ENOMEM); 5168c2ecf20Sopenharmony_ci } 5178c2ecf20Sopenharmony_ci 5188c2ecf20Sopenharmony_ci dma_to_qm_sg_one(sg_table, edesc->assoclen_dma, 4, 0); 5198c2ecf20Sopenharmony_ci qm_sg_index++; 5208c2ecf20Sopenharmony_ci if (ivsize) { 5218c2ecf20Sopenharmony_ci dma_to_qm_sg_one(sg_table + qm_sg_index, iv_dma, ivsize, 0); 5228c2ecf20Sopenharmony_ci qm_sg_index++; 5238c2ecf20Sopenharmony_ci } 5248c2ecf20Sopenharmony_ci sg_to_qm_sg_last(req->src, src_len, sg_table + qm_sg_index, 0); 5258c2ecf20Sopenharmony_ci qm_sg_index += mapped_src_nents; 5268c2ecf20Sopenharmony_ci 5278c2ecf20Sopenharmony_ci if (mapped_dst_nents > 1) 5288c2ecf20Sopenharmony_ci sg_to_qm_sg_last(req->dst, dst_len, sg_table + qm_sg_index, 0); 5298c2ecf20Sopenharmony_ci 5308c2ecf20Sopenharmony_ci qm_sg_dma = dma_map_single(dev, sg_table, qm_sg_bytes, DMA_TO_DEVICE); 5318c2ecf20Sopenharmony_ci if (dma_mapping_error(dev, qm_sg_dma)) { 5328c2ecf20Sopenharmony_ci dev_err(dev, "unable to map S/G table\n"); 5338c2ecf20Sopenharmony_ci dma_unmap_single(dev, edesc->assoclen_dma, 4, DMA_TO_DEVICE); 5348c2ecf20Sopenharmony_ci caam_unmap(dev, req->src, req->dst, src_nents, dst_nents, 5358c2ecf20Sopenharmony_ci iv_dma, ivsize, DMA_TO_DEVICE, 0, 0); 5368c2ecf20Sopenharmony_ci qi_cache_free(edesc); 5378c2ecf20Sopenharmony_ci return ERR_PTR(-ENOMEM); 5388c2ecf20Sopenharmony_ci } 5398c2ecf20Sopenharmony_ci 5408c2ecf20Sopenharmony_ci edesc->qm_sg_dma = qm_sg_dma; 5418c2ecf20Sopenharmony_ci edesc->qm_sg_bytes = qm_sg_bytes; 5428c2ecf20Sopenharmony_ci 5438c2ecf20Sopenharmony_ci out_len = req->assoclen + req->cryptlen + 5448c2ecf20Sopenharmony_ci (encrypt ? ctx->authsize : (-ctx->authsize)); 5458c2ecf20Sopenharmony_ci in_len = 4 + ivsize + req->assoclen + req->cryptlen; 5468c2ecf20Sopenharmony_ci 5478c2ecf20Sopenharmony_ci memset(&req_ctx->fd_flt, 0, sizeof(req_ctx->fd_flt)); 5488c2ecf20Sopenharmony_ci dpaa2_fl_set_final(in_fle, true); 5498c2ecf20Sopenharmony_ci dpaa2_fl_set_format(in_fle, dpaa2_fl_sg); 5508c2ecf20Sopenharmony_ci dpaa2_fl_set_addr(in_fle, qm_sg_dma); 5518c2ecf20Sopenharmony_ci dpaa2_fl_set_len(in_fle, in_len); 5528c2ecf20Sopenharmony_ci 5538c2ecf20Sopenharmony_ci if (req->dst == req->src) { 5548c2ecf20Sopenharmony_ci if (mapped_src_nents == 1) { 5558c2ecf20Sopenharmony_ci dpaa2_fl_set_format(out_fle, dpaa2_fl_single); 5568c2ecf20Sopenharmony_ci dpaa2_fl_set_addr(out_fle, sg_dma_address(req->src)); 5578c2ecf20Sopenharmony_ci } else { 5588c2ecf20Sopenharmony_ci dpaa2_fl_set_format(out_fle, dpaa2_fl_sg); 5598c2ecf20Sopenharmony_ci dpaa2_fl_set_addr(out_fle, qm_sg_dma + 5608c2ecf20Sopenharmony_ci (1 + !!ivsize) * sizeof(*sg_table)); 5618c2ecf20Sopenharmony_ci } 5628c2ecf20Sopenharmony_ci } else if (!mapped_dst_nents) { 5638c2ecf20Sopenharmony_ci /* 5648c2ecf20Sopenharmony_ci * crypto engine requires the output entry to be present when 5658c2ecf20Sopenharmony_ci * "frame list" FD is used. 5668c2ecf20Sopenharmony_ci * Since engine does not support FMT=2'b11 (unused entry type), 5678c2ecf20Sopenharmony_ci * leaving out_fle zeroized is the best option. 5688c2ecf20Sopenharmony_ci */ 5698c2ecf20Sopenharmony_ci goto skip_out_fle; 5708c2ecf20Sopenharmony_ci } else if (mapped_dst_nents == 1) { 5718c2ecf20Sopenharmony_ci dpaa2_fl_set_format(out_fle, dpaa2_fl_single); 5728c2ecf20Sopenharmony_ci dpaa2_fl_set_addr(out_fle, sg_dma_address(req->dst)); 5738c2ecf20Sopenharmony_ci } else { 5748c2ecf20Sopenharmony_ci dpaa2_fl_set_format(out_fle, dpaa2_fl_sg); 5758c2ecf20Sopenharmony_ci dpaa2_fl_set_addr(out_fle, qm_sg_dma + qm_sg_index * 5768c2ecf20Sopenharmony_ci sizeof(*sg_table)); 5778c2ecf20Sopenharmony_ci } 5788c2ecf20Sopenharmony_ci 5798c2ecf20Sopenharmony_ci dpaa2_fl_set_len(out_fle, out_len); 5808c2ecf20Sopenharmony_ci 5818c2ecf20Sopenharmony_ciskip_out_fle: 5828c2ecf20Sopenharmony_ci return edesc; 5838c2ecf20Sopenharmony_ci} 5848c2ecf20Sopenharmony_ci 5858c2ecf20Sopenharmony_cistatic int chachapoly_set_sh_desc(struct crypto_aead *aead) 5868c2ecf20Sopenharmony_ci{ 5878c2ecf20Sopenharmony_ci struct caam_ctx *ctx = crypto_aead_ctx(aead); 5888c2ecf20Sopenharmony_ci unsigned int ivsize = crypto_aead_ivsize(aead); 5898c2ecf20Sopenharmony_ci struct device *dev = ctx->dev; 5908c2ecf20Sopenharmony_ci struct caam_flc *flc; 5918c2ecf20Sopenharmony_ci u32 *desc; 5928c2ecf20Sopenharmony_ci 5938c2ecf20Sopenharmony_ci if (!ctx->cdata.keylen || !ctx->authsize) 5948c2ecf20Sopenharmony_ci return 0; 5958c2ecf20Sopenharmony_ci 5968c2ecf20Sopenharmony_ci flc = &ctx->flc[ENCRYPT]; 5978c2ecf20Sopenharmony_ci desc = flc->sh_desc; 5988c2ecf20Sopenharmony_ci cnstr_shdsc_chachapoly(desc, &ctx->cdata, &ctx->adata, ivsize, 5998c2ecf20Sopenharmony_ci ctx->authsize, true, true); 6008c2ecf20Sopenharmony_ci flc->flc[1] = cpu_to_caam32(desc_len(desc)); /* SDL */ 6018c2ecf20Sopenharmony_ci dma_sync_single_for_device(dev, ctx->flc_dma[ENCRYPT], 6028c2ecf20Sopenharmony_ci sizeof(flc->flc) + desc_bytes(desc), 6038c2ecf20Sopenharmony_ci ctx->dir); 6048c2ecf20Sopenharmony_ci 6058c2ecf20Sopenharmony_ci flc = &ctx->flc[DECRYPT]; 6068c2ecf20Sopenharmony_ci desc = flc->sh_desc; 6078c2ecf20Sopenharmony_ci cnstr_shdsc_chachapoly(desc, &ctx->cdata, &ctx->adata, ivsize, 6088c2ecf20Sopenharmony_ci ctx->authsize, false, true); 6098c2ecf20Sopenharmony_ci flc->flc[1] = cpu_to_caam32(desc_len(desc)); /* SDL */ 6108c2ecf20Sopenharmony_ci dma_sync_single_for_device(dev, ctx->flc_dma[DECRYPT], 6118c2ecf20Sopenharmony_ci sizeof(flc->flc) + desc_bytes(desc), 6128c2ecf20Sopenharmony_ci ctx->dir); 6138c2ecf20Sopenharmony_ci 6148c2ecf20Sopenharmony_ci return 0; 6158c2ecf20Sopenharmony_ci} 6168c2ecf20Sopenharmony_ci 6178c2ecf20Sopenharmony_cistatic int chachapoly_setauthsize(struct crypto_aead *aead, 6188c2ecf20Sopenharmony_ci unsigned int authsize) 6198c2ecf20Sopenharmony_ci{ 6208c2ecf20Sopenharmony_ci struct caam_ctx *ctx = crypto_aead_ctx(aead); 6218c2ecf20Sopenharmony_ci 6228c2ecf20Sopenharmony_ci if (authsize != POLY1305_DIGEST_SIZE) 6238c2ecf20Sopenharmony_ci return -EINVAL; 6248c2ecf20Sopenharmony_ci 6258c2ecf20Sopenharmony_ci ctx->authsize = authsize; 6268c2ecf20Sopenharmony_ci return chachapoly_set_sh_desc(aead); 6278c2ecf20Sopenharmony_ci} 6288c2ecf20Sopenharmony_ci 6298c2ecf20Sopenharmony_cistatic int chachapoly_setkey(struct crypto_aead *aead, const u8 *key, 6308c2ecf20Sopenharmony_ci unsigned int keylen) 6318c2ecf20Sopenharmony_ci{ 6328c2ecf20Sopenharmony_ci struct caam_ctx *ctx = crypto_aead_ctx(aead); 6338c2ecf20Sopenharmony_ci unsigned int ivsize = crypto_aead_ivsize(aead); 6348c2ecf20Sopenharmony_ci unsigned int saltlen = CHACHAPOLY_IV_SIZE - ivsize; 6358c2ecf20Sopenharmony_ci 6368c2ecf20Sopenharmony_ci if (keylen != CHACHA_KEY_SIZE + saltlen) 6378c2ecf20Sopenharmony_ci return -EINVAL; 6388c2ecf20Sopenharmony_ci 6398c2ecf20Sopenharmony_ci memcpy(ctx->key, key, keylen); 6408c2ecf20Sopenharmony_ci ctx->cdata.key_virt = ctx->key; 6418c2ecf20Sopenharmony_ci ctx->cdata.keylen = keylen - saltlen; 6428c2ecf20Sopenharmony_ci 6438c2ecf20Sopenharmony_ci return chachapoly_set_sh_desc(aead); 6448c2ecf20Sopenharmony_ci} 6458c2ecf20Sopenharmony_ci 6468c2ecf20Sopenharmony_cistatic int gcm_set_sh_desc(struct crypto_aead *aead) 6478c2ecf20Sopenharmony_ci{ 6488c2ecf20Sopenharmony_ci struct caam_ctx *ctx = crypto_aead_ctx(aead); 6498c2ecf20Sopenharmony_ci struct device *dev = ctx->dev; 6508c2ecf20Sopenharmony_ci unsigned int ivsize = crypto_aead_ivsize(aead); 6518c2ecf20Sopenharmony_ci struct caam_flc *flc; 6528c2ecf20Sopenharmony_ci u32 *desc; 6538c2ecf20Sopenharmony_ci int rem_bytes = CAAM_DESC_BYTES_MAX - DESC_JOB_IO_LEN - 6548c2ecf20Sopenharmony_ci ctx->cdata.keylen; 6558c2ecf20Sopenharmony_ci 6568c2ecf20Sopenharmony_ci if (!ctx->cdata.keylen || !ctx->authsize) 6578c2ecf20Sopenharmony_ci return 0; 6588c2ecf20Sopenharmony_ci 6598c2ecf20Sopenharmony_ci /* 6608c2ecf20Sopenharmony_ci * AES GCM encrypt shared descriptor 6618c2ecf20Sopenharmony_ci * Job Descriptor and Shared Descriptor 6628c2ecf20Sopenharmony_ci * must fit into the 64-word Descriptor h/w Buffer 6638c2ecf20Sopenharmony_ci */ 6648c2ecf20Sopenharmony_ci if (rem_bytes >= DESC_QI_GCM_ENC_LEN) { 6658c2ecf20Sopenharmony_ci ctx->cdata.key_inline = true; 6668c2ecf20Sopenharmony_ci ctx->cdata.key_virt = ctx->key; 6678c2ecf20Sopenharmony_ci } else { 6688c2ecf20Sopenharmony_ci ctx->cdata.key_inline = false; 6698c2ecf20Sopenharmony_ci ctx->cdata.key_dma = ctx->key_dma; 6708c2ecf20Sopenharmony_ci } 6718c2ecf20Sopenharmony_ci 6728c2ecf20Sopenharmony_ci flc = &ctx->flc[ENCRYPT]; 6738c2ecf20Sopenharmony_ci desc = flc->sh_desc; 6748c2ecf20Sopenharmony_ci cnstr_shdsc_gcm_encap(desc, &ctx->cdata, ivsize, ctx->authsize, true); 6758c2ecf20Sopenharmony_ci flc->flc[1] = cpu_to_caam32(desc_len(desc)); /* SDL */ 6768c2ecf20Sopenharmony_ci dma_sync_single_for_device(dev, ctx->flc_dma[ENCRYPT], 6778c2ecf20Sopenharmony_ci sizeof(flc->flc) + desc_bytes(desc), 6788c2ecf20Sopenharmony_ci ctx->dir); 6798c2ecf20Sopenharmony_ci 6808c2ecf20Sopenharmony_ci /* 6818c2ecf20Sopenharmony_ci * Job Descriptor and Shared Descriptors 6828c2ecf20Sopenharmony_ci * must all fit into the 64-word Descriptor h/w Buffer 6838c2ecf20Sopenharmony_ci */ 6848c2ecf20Sopenharmony_ci if (rem_bytes >= DESC_QI_GCM_DEC_LEN) { 6858c2ecf20Sopenharmony_ci ctx->cdata.key_inline = true; 6868c2ecf20Sopenharmony_ci ctx->cdata.key_virt = ctx->key; 6878c2ecf20Sopenharmony_ci } else { 6888c2ecf20Sopenharmony_ci ctx->cdata.key_inline = false; 6898c2ecf20Sopenharmony_ci ctx->cdata.key_dma = ctx->key_dma; 6908c2ecf20Sopenharmony_ci } 6918c2ecf20Sopenharmony_ci 6928c2ecf20Sopenharmony_ci flc = &ctx->flc[DECRYPT]; 6938c2ecf20Sopenharmony_ci desc = flc->sh_desc; 6948c2ecf20Sopenharmony_ci cnstr_shdsc_gcm_decap(desc, &ctx->cdata, ivsize, ctx->authsize, true); 6958c2ecf20Sopenharmony_ci flc->flc[1] = cpu_to_caam32(desc_len(desc)); /* SDL */ 6968c2ecf20Sopenharmony_ci dma_sync_single_for_device(dev, ctx->flc_dma[DECRYPT], 6978c2ecf20Sopenharmony_ci sizeof(flc->flc) + desc_bytes(desc), 6988c2ecf20Sopenharmony_ci ctx->dir); 6998c2ecf20Sopenharmony_ci 7008c2ecf20Sopenharmony_ci return 0; 7018c2ecf20Sopenharmony_ci} 7028c2ecf20Sopenharmony_ci 7038c2ecf20Sopenharmony_cistatic int gcm_setauthsize(struct crypto_aead *authenc, unsigned int authsize) 7048c2ecf20Sopenharmony_ci{ 7058c2ecf20Sopenharmony_ci struct caam_ctx *ctx = crypto_aead_ctx(authenc); 7068c2ecf20Sopenharmony_ci int err; 7078c2ecf20Sopenharmony_ci 7088c2ecf20Sopenharmony_ci err = crypto_gcm_check_authsize(authsize); 7098c2ecf20Sopenharmony_ci if (err) 7108c2ecf20Sopenharmony_ci return err; 7118c2ecf20Sopenharmony_ci 7128c2ecf20Sopenharmony_ci ctx->authsize = authsize; 7138c2ecf20Sopenharmony_ci gcm_set_sh_desc(authenc); 7148c2ecf20Sopenharmony_ci 7158c2ecf20Sopenharmony_ci return 0; 7168c2ecf20Sopenharmony_ci} 7178c2ecf20Sopenharmony_ci 7188c2ecf20Sopenharmony_cistatic int gcm_setkey(struct crypto_aead *aead, 7198c2ecf20Sopenharmony_ci const u8 *key, unsigned int keylen) 7208c2ecf20Sopenharmony_ci{ 7218c2ecf20Sopenharmony_ci struct caam_ctx *ctx = crypto_aead_ctx(aead); 7228c2ecf20Sopenharmony_ci struct device *dev = ctx->dev; 7238c2ecf20Sopenharmony_ci int ret; 7248c2ecf20Sopenharmony_ci 7258c2ecf20Sopenharmony_ci ret = aes_check_keylen(keylen); 7268c2ecf20Sopenharmony_ci if (ret) 7278c2ecf20Sopenharmony_ci return ret; 7288c2ecf20Sopenharmony_ci print_hex_dump_debug("key in @" __stringify(__LINE__)": ", 7298c2ecf20Sopenharmony_ci DUMP_PREFIX_ADDRESS, 16, 4, key, keylen, 1); 7308c2ecf20Sopenharmony_ci 7318c2ecf20Sopenharmony_ci memcpy(ctx->key, key, keylen); 7328c2ecf20Sopenharmony_ci dma_sync_single_for_device(dev, ctx->key_dma, keylen, ctx->dir); 7338c2ecf20Sopenharmony_ci ctx->cdata.keylen = keylen; 7348c2ecf20Sopenharmony_ci 7358c2ecf20Sopenharmony_ci return gcm_set_sh_desc(aead); 7368c2ecf20Sopenharmony_ci} 7378c2ecf20Sopenharmony_ci 7388c2ecf20Sopenharmony_cistatic int rfc4106_set_sh_desc(struct crypto_aead *aead) 7398c2ecf20Sopenharmony_ci{ 7408c2ecf20Sopenharmony_ci struct caam_ctx *ctx = crypto_aead_ctx(aead); 7418c2ecf20Sopenharmony_ci struct device *dev = ctx->dev; 7428c2ecf20Sopenharmony_ci unsigned int ivsize = crypto_aead_ivsize(aead); 7438c2ecf20Sopenharmony_ci struct caam_flc *flc; 7448c2ecf20Sopenharmony_ci u32 *desc; 7458c2ecf20Sopenharmony_ci int rem_bytes = CAAM_DESC_BYTES_MAX - DESC_JOB_IO_LEN - 7468c2ecf20Sopenharmony_ci ctx->cdata.keylen; 7478c2ecf20Sopenharmony_ci 7488c2ecf20Sopenharmony_ci if (!ctx->cdata.keylen || !ctx->authsize) 7498c2ecf20Sopenharmony_ci return 0; 7508c2ecf20Sopenharmony_ci 7518c2ecf20Sopenharmony_ci ctx->cdata.key_virt = ctx->key; 7528c2ecf20Sopenharmony_ci 7538c2ecf20Sopenharmony_ci /* 7548c2ecf20Sopenharmony_ci * RFC4106 encrypt shared descriptor 7558c2ecf20Sopenharmony_ci * Job Descriptor and Shared Descriptor 7568c2ecf20Sopenharmony_ci * must fit into the 64-word Descriptor h/w Buffer 7578c2ecf20Sopenharmony_ci */ 7588c2ecf20Sopenharmony_ci if (rem_bytes >= DESC_QI_RFC4106_ENC_LEN) { 7598c2ecf20Sopenharmony_ci ctx->cdata.key_inline = true; 7608c2ecf20Sopenharmony_ci } else { 7618c2ecf20Sopenharmony_ci ctx->cdata.key_inline = false; 7628c2ecf20Sopenharmony_ci ctx->cdata.key_dma = ctx->key_dma; 7638c2ecf20Sopenharmony_ci } 7648c2ecf20Sopenharmony_ci 7658c2ecf20Sopenharmony_ci flc = &ctx->flc[ENCRYPT]; 7668c2ecf20Sopenharmony_ci desc = flc->sh_desc; 7678c2ecf20Sopenharmony_ci cnstr_shdsc_rfc4106_encap(desc, &ctx->cdata, ivsize, ctx->authsize, 7688c2ecf20Sopenharmony_ci true); 7698c2ecf20Sopenharmony_ci flc->flc[1] = cpu_to_caam32(desc_len(desc)); /* SDL */ 7708c2ecf20Sopenharmony_ci dma_sync_single_for_device(dev, ctx->flc_dma[ENCRYPT], 7718c2ecf20Sopenharmony_ci sizeof(flc->flc) + desc_bytes(desc), 7728c2ecf20Sopenharmony_ci ctx->dir); 7738c2ecf20Sopenharmony_ci 7748c2ecf20Sopenharmony_ci /* 7758c2ecf20Sopenharmony_ci * Job Descriptor and Shared Descriptors 7768c2ecf20Sopenharmony_ci * must all fit into the 64-word Descriptor h/w Buffer 7778c2ecf20Sopenharmony_ci */ 7788c2ecf20Sopenharmony_ci if (rem_bytes >= DESC_QI_RFC4106_DEC_LEN) { 7798c2ecf20Sopenharmony_ci ctx->cdata.key_inline = true; 7808c2ecf20Sopenharmony_ci } else { 7818c2ecf20Sopenharmony_ci ctx->cdata.key_inline = false; 7828c2ecf20Sopenharmony_ci ctx->cdata.key_dma = ctx->key_dma; 7838c2ecf20Sopenharmony_ci } 7848c2ecf20Sopenharmony_ci 7858c2ecf20Sopenharmony_ci flc = &ctx->flc[DECRYPT]; 7868c2ecf20Sopenharmony_ci desc = flc->sh_desc; 7878c2ecf20Sopenharmony_ci cnstr_shdsc_rfc4106_decap(desc, &ctx->cdata, ivsize, ctx->authsize, 7888c2ecf20Sopenharmony_ci true); 7898c2ecf20Sopenharmony_ci flc->flc[1] = cpu_to_caam32(desc_len(desc)); /* SDL */ 7908c2ecf20Sopenharmony_ci dma_sync_single_for_device(dev, ctx->flc_dma[DECRYPT], 7918c2ecf20Sopenharmony_ci sizeof(flc->flc) + desc_bytes(desc), 7928c2ecf20Sopenharmony_ci ctx->dir); 7938c2ecf20Sopenharmony_ci 7948c2ecf20Sopenharmony_ci return 0; 7958c2ecf20Sopenharmony_ci} 7968c2ecf20Sopenharmony_ci 7978c2ecf20Sopenharmony_cistatic int rfc4106_setauthsize(struct crypto_aead *authenc, 7988c2ecf20Sopenharmony_ci unsigned int authsize) 7998c2ecf20Sopenharmony_ci{ 8008c2ecf20Sopenharmony_ci struct caam_ctx *ctx = crypto_aead_ctx(authenc); 8018c2ecf20Sopenharmony_ci int err; 8028c2ecf20Sopenharmony_ci 8038c2ecf20Sopenharmony_ci err = crypto_rfc4106_check_authsize(authsize); 8048c2ecf20Sopenharmony_ci if (err) 8058c2ecf20Sopenharmony_ci return err; 8068c2ecf20Sopenharmony_ci 8078c2ecf20Sopenharmony_ci ctx->authsize = authsize; 8088c2ecf20Sopenharmony_ci rfc4106_set_sh_desc(authenc); 8098c2ecf20Sopenharmony_ci 8108c2ecf20Sopenharmony_ci return 0; 8118c2ecf20Sopenharmony_ci} 8128c2ecf20Sopenharmony_ci 8138c2ecf20Sopenharmony_cistatic int rfc4106_setkey(struct crypto_aead *aead, 8148c2ecf20Sopenharmony_ci const u8 *key, unsigned int keylen) 8158c2ecf20Sopenharmony_ci{ 8168c2ecf20Sopenharmony_ci struct caam_ctx *ctx = crypto_aead_ctx(aead); 8178c2ecf20Sopenharmony_ci struct device *dev = ctx->dev; 8188c2ecf20Sopenharmony_ci int ret; 8198c2ecf20Sopenharmony_ci 8208c2ecf20Sopenharmony_ci ret = aes_check_keylen(keylen - 4); 8218c2ecf20Sopenharmony_ci if (ret) 8228c2ecf20Sopenharmony_ci return ret; 8238c2ecf20Sopenharmony_ci 8248c2ecf20Sopenharmony_ci print_hex_dump_debug("key in @" __stringify(__LINE__)": ", 8258c2ecf20Sopenharmony_ci DUMP_PREFIX_ADDRESS, 16, 4, key, keylen, 1); 8268c2ecf20Sopenharmony_ci 8278c2ecf20Sopenharmony_ci memcpy(ctx->key, key, keylen); 8288c2ecf20Sopenharmony_ci /* 8298c2ecf20Sopenharmony_ci * The last four bytes of the key material are used as the salt value 8308c2ecf20Sopenharmony_ci * in the nonce. Update the AES key length. 8318c2ecf20Sopenharmony_ci */ 8328c2ecf20Sopenharmony_ci ctx->cdata.keylen = keylen - 4; 8338c2ecf20Sopenharmony_ci dma_sync_single_for_device(dev, ctx->key_dma, ctx->cdata.keylen, 8348c2ecf20Sopenharmony_ci ctx->dir); 8358c2ecf20Sopenharmony_ci 8368c2ecf20Sopenharmony_ci return rfc4106_set_sh_desc(aead); 8378c2ecf20Sopenharmony_ci} 8388c2ecf20Sopenharmony_ci 8398c2ecf20Sopenharmony_cistatic int rfc4543_set_sh_desc(struct crypto_aead *aead) 8408c2ecf20Sopenharmony_ci{ 8418c2ecf20Sopenharmony_ci struct caam_ctx *ctx = crypto_aead_ctx(aead); 8428c2ecf20Sopenharmony_ci struct device *dev = ctx->dev; 8438c2ecf20Sopenharmony_ci unsigned int ivsize = crypto_aead_ivsize(aead); 8448c2ecf20Sopenharmony_ci struct caam_flc *flc; 8458c2ecf20Sopenharmony_ci u32 *desc; 8468c2ecf20Sopenharmony_ci int rem_bytes = CAAM_DESC_BYTES_MAX - DESC_JOB_IO_LEN - 8478c2ecf20Sopenharmony_ci ctx->cdata.keylen; 8488c2ecf20Sopenharmony_ci 8498c2ecf20Sopenharmony_ci if (!ctx->cdata.keylen || !ctx->authsize) 8508c2ecf20Sopenharmony_ci return 0; 8518c2ecf20Sopenharmony_ci 8528c2ecf20Sopenharmony_ci ctx->cdata.key_virt = ctx->key; 8538c2ecf20Sopenharmony_ci 8548c2ecf20Sopenharmony_ci /* 8558c2ecf20Sopenharmony_ci * RFC4543 encrypt shared descriptor 8568c2ecf20Sopenharmony_ci * Job Descriptor and Shared Descriptor 8578c2ecf20Sopenharmony_ci * must fit into the 64-word Descriptor h/w Buffer 8588c2ecf20Sopenharmony_ci */ 8598c2ecf20Sopenharmony_ci if (rem_bytes >= DESC_QI_RFC4543_ENC_LEN) { 8608c2ecf20Sopenharmony_ci ctx->cdata.key_inline = true; 8618c2ecf20Sopenharmony_ci } else { 8628c2ecf20Sopenharmony_ci ctx->cdata.key_inline = false; 8638c2ecf20Sopenharmony_ci ctx->cdata.key_dma = ctx->key_dma; 8648c2ecf20Sopenharmony_ci } 8658c2ecf20Sopenharmony_ci 8668c2ecf20Sopenharmony_ci flc = &ctx->flc[ENCRYPT]; 8678c2ecf20Sopenharmony_ci desc = flc->sh_desc; 8688c2ecf20Sopenharmony_ci cnstr_shdsc_rfc4543_encap(desc, &ctx->cdata, ivsize, ctx->authsize, 8698c2ecf20Sopenharmony_ci true); 8708c2ecf20Sopenharmony_ci flc->flc[1] = cpu_to_caam32(desc_len(desc)); /* SDL */ 8718c2ecf20Sopenharmony_ci dma_sync_single_for_device(dev, ctx->flc_dma[ENCRYPT], 8728c2ecf20Sopenharmony_ci sizeof(flc->flc) + desc_bytes(desc), 8738c2ecf20Sopenharmony_ci ctx->dir); 8748c2ecf20Sopenharmony_ci 8758c2ecf20Sopenharmony_ci /* 8768c2ecf20Sopenharmony_ci * Job Descriptor and Shared Descriptors 8778c2ecf20Sopenharmony_ci * must all fit into the 64-word Descriptor h/w Buffer 8788c2ecf20Sopenharmony_ci */ 8798c2ecf20Sopenharmony_ci if (rem_bytes >= DESC_QI_RFC4543_DEC_LEN) { 8808c2ecf20Sopenharmony_ci ctx->cdata.key_inline = true; 8818c2ecf20Sopenharmony_ci } else { 8828c2ecf20Sopenharmony_ci ctx->cdata.key_inline = false; 8838c2ecf20Sopenharmony_ci ctx->cdata.key_dma = ctx->key_dma; 8848c2ecf20Sopenharmony_ci } 8858c2ecf20Sopenharmony_ci 8868c2ecf20Sopenharmony_ci flc = &ctx->flc[DECRYPT]; 8878c2ecf20Sopenharmony_ci desc = flc->sh_desc; 8888c2ecf20Sopenharmony_ci cnstr_shdsc_rfc4543_decap(desc, &ctx->cdata, ivsize, ctx->authsize, 8898c2ecf20Sopenharmony_ci true); 8908c2ecf20Sopenharmony_ci flc->flc[1] = cpu_to_caam32(desc_len(desc)); /* SDL */ 8918c2ecf20Sopenharmony_ci dma_sync_single_for_device(dev, ctx->flc_dma[DECRYPT], 8928c2ecf20Sopenharmony_ci sizeof(flc->flc) + desc_bytes(desc), 8938c2ecf20Sopenharmony_ci ctx->dir); 8948c2ecf20Sopenharmony_ci 8958c2ecf20Sopenharmony_ci return 0; 8968c2ecf20Sopenharmony_ci} 8978c2ecf20Sopenharmony_ci 8988c2ecf20Sopenharmony_cistatic int rfc4543_setauthsize(struct crypto_aead *authenc, 8998c2ecf20Sopenharmony_ci unsigned int authsize) 9008c2ecf20Sopenharmony_ci{ 9018c2ecf20Sopenharmony_ci struct caam_ctx *ctx = crypto_aead_ctx(authenc); 9028c2ecf20Sopenharmony_ci 9038c2ecf20Sopenharmony_ci if (authsize != 16) 9048c2ecf20Sopenharmony_ci return -EINVAL; 9058c2ecf20Sopenharmony_ci 9068c2ecf20Sopenharmony_ci ctx->authsize = authsize; 9078c2ecf20Sopenharmony_ci rfc4543_set_sh_desc(authenc); 9088c2ecf20Sopenharmony_ci 9098c2ecf20Sopenharmony_ci return 0; 9108c2ecf20Sopenharmony_ci} 9118c2ecf20Sopenharmony_ci 9128c2ecf20Sopenharmony_cistatic int rfc4543_setkey(struct crypto_aead *aead, 9138c2ecf20Sopenharmony_ci const u8 *key, unsigned int keylen) 9148c2ecf20Sopenharmony_ci{ 9158c2ecf20Sopenharmony_ci struct caam_ctx *ctx = crypto_aead_ctx(aead); 9168c2ecf20Sopenharmony_ci struct device *dev = ctx->dev; 9178c2ecf20Sopenharmony_ci int ret; 9188c2ecf20Sopenharmony_ci 9198c2ecf20Sopenharmony_ci ret = aes_check_keylen(keylen - 4); 9208c2ecf20Sopenharmony_ci if (ret) 9218c2ecf20Sopenharmony_ci return ret; 9228c2ecf20Sopenharmony_ci 9238c2ecf20Sopenharmony_ci print_hex_dump_debug("key in @" __stringify(__LINE__)": ", 9248c2ecf20Sopenharmony_ci DUMP_PREFIX_ADDRESS, 16, 4, key, keylen, 1); 9258c2ecf20Sopenharmony_ci 9268c2ecf20Sopenharmony_ci memcpy(ctx->key, key, keylen); 9278c2ecf20Sopenharmony_ci /* 9288c2ecf20Sopenharmony_ci * The last four bytes of the key material are used as the salt value 9298c2ecf20Sopenharmony_ci * in the nonce. Update the AES key length. 9308c2ecf20Sopenharmony_ci */ 9318c2ecf20Sopenharmony_ci ctx->cdata.keylen = keylen - 4; 9328c2ecf20Sopenharmony_ci dma_sync_single_for_device(dev, ctx->key_dma, ctx->cdata.keylen, 9338c2ecf20Sopenharmony_ci ctx->dir); 9348c2ecf20Sopenharmony_ci 9358c2ecf20Sopenharmony_ci return rfc4543_set_sh_desc(aead); 9368c2ecf20Sopenharmony_ci} 9378c2ecf20Sopenharmony_ci 9388c2ecf20Sopenharmony_cistatic int skcipher_setkey(struct crypto_skcipher *skcipher, const u8 *key, 9398c2ecf20Sopenharmony_ci unsigned int keylen, const u32 ctx1_iv_off) 9408c2ecf20Sopenharmony_ci{ 9418c2ecf20Sopenharmony_ci struct caam_ctx *ctx = crypto_skcipher_ctx(skcipher); 9428c2ecf20Sopenharmony_ci struct caam_skcipher_alg *alg = 9438c2ecf20Sopenharmony_ci container_of(crypto_skcipher_alg(skcipher), 9448c2ecf20Sopenharmony_ci struct caam_skcipher_alg, skcipher); 9458c2ecf20Sopenharmony_ci struct device *dev = ctx->dev; 9468c2ecf20Sopenharmony_ci struct caam_flc *flc; 9478c2ecf20Sopenharmony_ci unsigned int ivsize = crypto_skcipher_ivsize(skcipher); 9488c2ecf20Sopenharmony_ci u32 *desc; 9498c2ecf20Sopenharmony_ci const bool is_rfc3686 = alg->caam.rfc3686; 9508c2ecf20Sopenharmony_ci 9518c2ecf20Sopenharmony_ci print_hex_dump_debug("key in @" __stringify(__LINE__)": ", 9528c2ecf20Sopenharmony_ci DUMP_PREFIX_ADDRESS, 16, 4, key, keylen, 1); 9538c2ecf20Sopenharmony_ci 9548c2ecf20Sopenharmony_ci ctx->cdata.keylen = keylen; 9558c2ecf20Sopenharmony_ci ctx->cdata.key_virt = key; 9568c2ecf20Sopenharmony_ci ctx->cdata.key_inline = true; 9578c2ecf20Sopenharmony_ci 9588c2ecf20Sopenharmony_ci /* skcipher_encrypt shared descriptor */ 9598c2ecf20Sopenharmony_ci flc = &ctx->flc[ENCRYPT]; 9608c2ecf20Sopenharmony_ci desc = flc->sh_desc; 9618c2ecf20Sopenharmony_ci cnstr_shdsc_skcipher_encap(desc, &ctx->cdata, ivsize, is_rfc3686, 9628c2ecf20Sopenharmony_ci ctx1_iv_off); 9638c2ecf20Sopenharmony_ci flc->flc[1] = cpu_to_caam32(desc_len(desc)); /* SDL */ 9648c2ecf20Sopenharmony_ci dma_sync_single_for_device(dev, ctx->flc_dma[ENCRYPT], 9658c2ecf20Sopenharmony_ci sizeof(flc->flc) + desc_bytes(desc), 9668c2ecf20Sopenharmony_ci ctx->dir); 9678c2ecf20Sopenharmony_ci 9688c2ecf20Sopenharmony_ci /* skcipher_decrypt shared descriptor */ 9698c2ecf20Sopenharmony_ci flc = &ctx->flc[DECRYPT]; 9708c2ecf20Sopenharmony_ci desc = flc->sh_desc; 9718c2ecf20Sopenharmony_ci cnstr_shdsc_skcipher_decap(desc, &ctx->cdata, ivsize, is_rfc3686, 9728c2ecf20Sopenharmony_ci ctx1_iv_off); 9738c2ecf20Sopenharmony_ci flc->flc[1] = cpu_to_caam32(desc_len(desc)); /* SDL */ 9748c2ecf20Sopenharmony_ci dma_sync_single_for_device(dev, ctx->flc_dma[DECRYPT], 9758c2ecf20Sopenharmony_ci sizeof(flc->flc) + desc_bytes(desc), 9768c2ecf20Sopenharmony_ci ctx->dir); 9778c2ecf20Sopenharmony_ci 9788c2ecf20Sopenharmony_ci return 0; 9798c2ecf20Sopenharmony_ci} 9808c2ecf20Sopenharmony_ci 9818c2ecf20Sopenharmony_cistatic int aes_skcipher_setkey(struct crypto_skcipher *skcipher, 9828c2ecf20Sopenharmony_ci const u8 *key, unsigned int keylen) 9838c2ecf20Sopenharmony_ci{ 9848c2ecf20Sopenharmony_ci int err; 9858c2ecf20Sopenharmony_ci 9868c2ecf20Sopenharmony_ci err = aes_check_keylen(keylen); 9878c2ecf20Sopenharmony_ci if (err) 9888c2ecf20Sopenharmony_ci return err; 9898c2ecf20Sopenharmony_ci 9908c2ecf20Sopenharmony_ci return skcipher_setkey(skcipher, key, keylen, 0); 9918c2ecf20Sopenharmony_ci} 9928c2ecf20Sopenharmony_ci 9938c2ecf20Sopenharmony_cistatic int rfc3686_skcipher_setkey(struct crypto_skcipher *skcipher, 9948c2ecf20Sopenharmony_ci const u8 *key, unsigned int keylen) 9958c2ecf20Sopenharmony_ci{ 9968c2ecf20Sopenharmony_ci u32 ctx1_iv_off; 9978c2ecf20Sopenharmony_ci int err; 9988c2ecf20Sopenharmony_ci 9998c2ecf20Sopenharmony_ci /* 10008c2ecf20Sopenharmony_ci * RFC3686 specific: 10018c2ecf20Sopenharmony_ci * | CONTEXT1[255:128] = {NONCE, IV, COUNTER} 10028c2ecf20Sopenharmony_ci * | *key = {KEY, NONCE} 10038c2ecf20Sopenharmony_ci */ 10048c2ecf20Sopenharmony_ci ctx1_iv_off = 16 + CTR_RFC3686_NONCE_SIZE; 10058c2ecf20Sopenharmony_ci keylen -= CTR_RFC3686_NONCE_SIZE; 10068c2ecf20Sopenharmony_ci 10078c2ecf20Sopenharmony_ci err = aes_check_keylen(keylen); 10088c2ecf20Sopenharmony_ci if (err) 10098c2ecf20Sopenharmony_ci return err; 10108c2ecf20Sopenharmony_ci 10118c2ecf20Sopenharmony_ci return skcipher_setkey(skcipher, key, keylen, ctx1_iv_off); 10128c2ecf20Sopenharmony_ci} 10138c2ecf20Sopenharmony_ci 10148c2ecf20Sopenharmony_cistatic int ctr_skcipher_setkey(struct crypto_skcipher *skcipher, 10158c2ecf20Sopenharmony_ci const u8 *key, unsigned int keylen) 10168c2ecf20Sopenharmony_ci{ 10178c2ecf20Sopenharmony_ci u32 ctx1_iv_off; 10188c2ecf20Sopenharmony_ci int err; 10198c2ecf20Sopenharmony_ci 10208c2ecf20Sopenharmony_ci /* 10218c2ecf20Sopenharmony_ci * AES-CTR needs to load IV in CONTEXT1 reg 10228c2ecf20Sopenharmony_ci * at an offset of 128bits (16bytes) 10238c2ecf20Sopenharmony_ci * CONTEXT1[255:128] = IV 10248c2ecf20Sopenharmony_ci */ 10258c2ecf20Sopenharmony_ci ctx1_iv_off = 16; 10268c2ecf20Sopenharmony_ci 10278c2ecf20Sopenharmony_ci err = aes_check_keylen(keylen); 10288c2ecf20Sopenharmony_ci if (err) 10298c2ecf20Sopenharmony_ci return err; 10308c2ecf20Sopenharmony_ci 10318c2ecf20Sopenharmony_ci return skcipher_setkey(skcipher, key, keylen, ctx1_iv_off); 10328c2ecf20Sopenharmony_ci} 10338c2ecf20Sopenharmony_ci 10348c2ecf20Sopenharmony_cistatic int chacha20_skcipher_setkey(struct crypto_skcipher *skcipher, 10358c2ecf20Sopenharmony_ci const u8 *key, unsigned int keylen) 10368c2ecf20Sopenharmony_ci{ 10378c2ecf20Sopenharmony_ci if (keylen != CHACHA_KEY_SIZE) 10388c2ecf20Sopenharmony_ci return -EINVAL; 10398c2ecf20Sopenharmony_ci 10408c2ecf20Sopenharmony_ci return skcipher_setkey(skcipher, key, keylen, 0); 10418c2ecf20Sopenharmony_ci} 10428c2ecf20Sopenharmony_ci 10438c2ecf20Sopenharmony_cistatic int des_skcipher_setkey(struct crypto_skcipher *skcipher, 10448c2ecf20Sopenharmony_ci const u8 *key, unsigned int keylen) 10458c2ecf20Sopenharmony_ci{ 10468c2ecf20Sopenharmony_ci return verify_skcipher_des_key(skcipher, key) ?: 10478c2ecf20Sopenharmony_ci skcipher_setkey(skcipher, key, keylen, 0); 10488c2ecf20Sopenharmony_ci} 10498c2ecf20Sopenharmony_ci 10508c2ecf20Sopenharmony_cistatic int des3_skcipher_setkey(struct crypto_skcipher *skcipher, 10518c2ecf20Sopenharmony_ci const u8 *key, unsigned int keylen) 10528c2ecf20Sopenharmony_ci{ 10538c2ecf20Sopenharmony_ci return verify_skcipher_des3_key(skcipher, key) ?: 10548c2ecf20Sopenharmony_ci skcipher_setkey(skcipher, key, keylen, 0); 10558c2ecf20Sopenharmony_ci} 10568c2ecf20Sopenharmony_ci 10578c2ecf20Sopenharmony_cistatic int xts_skcipher_setkey(struct crypto_skcipher *skcipher, const u8 *key, 10588c2ecf20Sopenharmony_ci unsigned int keylen) 10598c2ecf20Sopenharmony_ci{ 10608c2ecf20Sopenharmony_ci struct caam_ctx *ctx = crypto_skcipher_ctx(skcipher); 10618c2ecf20Sopenharmony_ci struct device *dev = ctx->dev; 10628c2ecf20Sopenharmony_ci struct dpaa2_caam_priv *priv = dev_get_drvdata(dev); 10638c2ecf20Sopenharmony_ci struct caam_flc *flc; 10648c2ecf20Sopenharmony_ci u32 *desc; 10658c2ecf20Sopenharmony_ci int err; 10668c2ecf20Sopenharmony_ci 10678c2ecf20Sopenharmony_ci err = xts_verify_key(skcipher, key, keylen); 10688c2ecf20Sopenharmony_ci if (err) { 10698c2ecf20Sopenharmony_ci dev_dbg(dev, "key size mismatch\n"); 10708c2ecf20Sopenharmony_ci return err; 10718c2ecf20Sopenharmony_ci } 10728c2ecf20Sopenharmony_ci 10738c2ecf20Sopenharmony_ci if (keylen != 2 * AES_KEYSIZE_128 && keylen != 2 * AES_KEYSIZE_256) 10748c2ecf20Sopenharmony_ci ctx->xts_key_fallback = true; 10758c2ecf20Sopenharmony_ci 10768c2ecf20Sopenharmony_ci if (priv->sec_attr.era <= 8 || ctx->xts_key_fallback) { 10778c2ecf20Sopenharmony_ci err = crypto_skcipher_setkey(ctx->fallback, key, keylen); 10788c2ecf20Sopenharmony_ci if (err) 10798c2ecf20Sopenharmony_ci return err; 10808c2ecf20Sopenharmony_ci } 10818c2ecf20Sopenharmony_ci 10828c2ecf20Sopenharmony_ci ctx->cdata.keylen = keylen; 10838c2ecf20Sopenharmony_ci ctx->cdata.key_virt = key; 10848c2ecf20Sopenharmony_ci ctx->cdata.key_inline = true; 10858c2ecf20Sopenharmony_ci 10868c2ecf20Sopenharmony_ci /* xts_skcipher_encrypt shared descriptor */ 10878c2ecf20Sopenharmony_ci flc = &ctx->flc[ENCRYPT]; 10888c2ecf20Sopenharmony_ci desc = flc->sh_desc; 10898c2ecf20Sopenharmony_ci cnstr_shdsc_xts_skcipher_encap(desc, &ctx->cdata); 10908c2ecf20Sopenharmony_ci flc->flc[1] = cpu_to_caam32(desc_len(desc)); /* SDL */ 10918c2ecf20Sopenharmony_ci dma_sync_single_for_device(dev, ctx->flc_dma[ENCRYPT], 10928c2ecf20Sopenharmony_ci sizeof(flc->flc) + desc_bytes(desc), 10938c2ecf20Sopenharmony_ci ctx->dir); 10948c2ecf20Sopenharmony_ci 10958c2ecf20Sopenharmony_ci /* xts_skcipher_decrypt shared descriptor */ 10968c2ecf20Sopenharmony_ci flc = &ctx->flc[DECRYPT]; 10978c2ecf20Sopenharmony_ci desc = flc->sh_desc; 10988c2ecf20Sopenharmony_ci cnstr_shdsc_xts_skcipher_decap(desc, &ctx->cdata); 10998c2ecf20Sopenharmony_ci flc->flc[1] = cpu_to_caam32(desc_len(desc)); /* SDL */ 11008c2ecf20Sopenharmony_ci dma_sync_single_for_device(dev, ctx->flc_dma[DECRYPT], 11018c2ecf20Sopenharmony_ci sizeof(flc->flc) + desc_bytes(desc), 11028c2ecf20Sopenharmony_ci ctx->dir); 11038c2ecf20Sopenharmony_ci 11048c2ecf20Sopenharmony_ci return 0; 11058c2ecf20Sopenharmony_ci} 11068c2ecf20Sopenharmony_ci 11078c2ecf20Sopenharmony_cistatic struct skcipher_edesc *skcipher_edesc_alloc(struct skcipher_request *req) 11088c2ecf20Sopenharmony_ci{ 11098c2ecf20Sopenharmony_ci struct crypto_skcipher *skcipher = crypto_skcipher_reqtfm(req); 11108c2ecf20Sopenharmony_ci struct caam_request *req_ctx = skcipher_request_ctx(req); 11118c2ecf20Sopenharmony_ci struct dpaa2_fl_entry *in_fle = &req_ctx->fd_flt[1]; 11128c2ecf20Sopenharmony_ci struct dpaa2_fl_entry *out_fle = &req_ctx->fd_flt[0]; 11138c2ecf20Sopenharmony_ci struct caam_ctx *ctx = crypto_skcipher_ctx(skcipher); 11148c2ecf20Sopenharmony_ci struct device *dev = ctx->dev; 11158c2ecf20Sopenharmony_ci gfp_t flags = (req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP) ? 11168c2ecf20Sopenharmony_ci GFP_KERNEL : GFP_ATOMIC; 11178c2ecf20Sopenharmony_ci int src_nents, mapped_src_nents, dst_nents = 0, mapped_dst_nents = 0; 11188c2ecf20Sopenharmony_ci struct skcipher_edesc *edesc; 11198c2ecf20Sopenharmony_ci dma_addr_t iv_dma; 11208c2ecf20Sopenharmony_ci u8 *iv; 11218c2ecf20Sopenharmony_ci int ivsize = crypto_skcipher_ivsize(skcipher); 11228c2ecf20Sopenharmony_ci int dst_sg_idx, qm_sg_ents, qm_sg_bytes; 11238c2ecf20Sopenharmony_ci struct dpaa2_sg_entry *sg_table; 11248c2ecf20Sopenharmony_ci 11258c2ecf20Sopenharmony_ci src_nents = sg_nents_for_len(req->src, req->cryptlen); 11268c2ecf20Sopenharmony_ci if (unlikely(src_nents < 0)) { 11278c2ecf20Sopenharmony_ci dev_err(dev, "Insufficient bytes (%d) in src S/G\n", 11288c2ecf20Sopenharmony_ci req->cryptlen); 11298c2ecf20Sopenharmony_ci return ERR_PTR(src_nents); 11308c2ecf20Sopenharmony_ci } 11318c2ecf20Sopenharmony_ci 11328c2ecf20Sopenharmony_ci if (unlikely(req->dst != req->src)) { 11338c2ecf20Sopenharmony_ci dst_nents = sg_nents_for_len(req->dst, req->cryptlen); 11348c2ecf20Sopenharmony_ci if (unlikely(dst_nents < 0)) { 11358c2ecf20Sopenharmony_ci dev_err(dev, "Insufficient bytes (%d) in dst S/G\n", 11368c2ecf20Sopenharmony_ci req->cryptlen); 11378c2ecf20Sopenharmony_ci return ERR_PTR(dst_nents); 11388c2ecf20Sopenharmony_ci } 11398c2ecf20Sopenharmony_ci 11408c2ecf20Sopenharmony_ci mapped_src_nents = dma_map_sg(dev, req->src, src_nents, 11418c2ecf20Sopenharmony_ci DMA_TO_DEVICE); 11428c2ecf20Sopenharmony_ci if (unlikely(!mapped_src_nents)) { 11438c2ecf20Sopenharmony_ci dev_err(dev, "unable to map source\n"); 11448c2ecf20Sopenharmony_ci return ERR_PTR(-ENOMEM); 11458c2ecf20Sopenharmony_ci } 11468c2ecf20Sopenharmony_ci 11478c2ecf20Sopenharmony_ci mapped_dst_nents = dma_map_sg(dev, req->dst, dst_nents, 11488c2ecf20Sopenharmony_ci DMA_FROM_DEVICE); 11498c2ecf20Sopenharmony_ci if (unlikely(!mapped_dst_nents)) { 11508c2ecf20Sopenharmony_ci dev_err(dev, "unable to map destination\n"); 11518c2ecf20Sopenharmony_ci dma_unmap_sg(dev, req->src, src_nents, DMA_TO_DEVICE); 11528c2ecf20Sopenharmony_ci return ERR_PTR(-ENOMEM); 11538c2ecf20Sopenharmony_ci } 11548c2ecf20Sopenharmony_ci } else { 11558c2ecf20Sopenharmony_ci mapped_src_nents = dma_map_sg(dev, req->src, src_nents, 11568c2ecf20Sopenharmony_ci DMA_BIDIRECTIONAL); 11578c2ecf20Sopenharmony_ci if (unlikely(!mapped_src_nents)) { 11588c2ecf20Sopenharmony_ci dev_err(dev, "unable to map source\n"); 11598c2ecf20Sopenharmony_ci return ERR_PTR(-ENOMEM); 11608c2ecf20Sopenharmony_ci } 11618c2ecf20Sopenharmony_ci } 11628c2ecf20Sopenharmony_ci 11638c2ecf20Sopenharmony_ci qm_sg_ents = 1 + mapped_src_nents; 11648c2ecf20Sopenharmony_ci dst_sg_idx = qm_sg_ents; 11658c2ecf20Sopenharmony_ci 11668c2ecf20Sopenharmony_ci /* 11678c2ecf20Sopenharmony_ci * Input, output HW S/G tables: [IV, src][dst, IV] 11688c2ecf20Sopenharmony_ci * IV entries point to the same buffer 11698c2ecf20Sopenharmony_ci * If src == dst, S/G entries are reused (S/G tables overlap) 11708c2ecf20Sopenharmony_ci * 11718c2ecf20Sopenharmony_ci * HW reads 4 S/G entries at a time; make sure the reads don't go beyond 11728c2ecf20Sopenharmony_ci * the end of the table by allocating more S/G entries. 11738c2ecf20Sopenharmony_ci */ 11748c2ecf20Sopenharmony_ci if (req->src != req->dst) 11758c2ecf20Sopenharmony_ci qm_sg_ents += pad_sg_nents(mapped_dst_nents + 1); 11768c2ecf20Sopenharmony_ci else 11778c2ecf20Sopenharmony_ci qm_sg_ents = 1 + pad_sg_nents(qm_sg_ents); 11788c2ecf20Sopenharmony_ci 11798c2ecf20Sopenharmony_ci qm_sg_bytes = qm_sg_ents * sizeof(struct dpaa2_sg_entry); 11808c2ecf20Sopenharmony_ci if (unlikely(offsetof(struct skcipher_edesc, sgt) + qm_sg_bytes + 11818c2ecf20Sopenharmony_ci ivsize > CAAM_QI_MEMCACHE_SIZE)) { 11828c2ecf20Sopenharmony_ci dev_err(dev, "No space for %d S/G entries and/or %dB IV\n", 11838c2ecf20Sopenharmony_ci qm_sg_ents, ivsize); 11848c2ecf20Sopenharmony_ci caam_unmap(dev, req->src, req->dst, src_nents, dst_nents, 0, 11858c2ecf20Sopenharmony_ci 0, DMA_NONE, 0, 0); 11868c2ecf20Sopenharmony_ci return ERR_PTR(-ENOMEM); 11878c2ecf20Sopenharmony_ci } 11888c2ecf20Sopenharmony_ci 11898c2ecf20Sopenharmony_ci /* allocate space for base edesc, link tables and IV */ 11908c2ecf20Sopenharmony_ci edesc = qi_cache_zalloc(GFP_DMA | flags); 11918c2ecf20Sopenharmony_ci if (unlikely(!edesc)) { 11928c2ecf20Sopenharmony_ci dev_err(dev, "could not allocate extended descriptor\n"); 11938c2ecf20Sopenharmony_ci caam_unmap(dev, req->src, req->dst, src_nents, dst_nents, 0, 11948c2ecf20Sopenharmony_ci 0, DMA_NONE, 0, 0); 11958c2ecf20Sopenharmony_ci return ERR_PTR(-ENOMEM); 11968c2ecf20Sopenharmony_ci } 11978c2ecf20Sopenharmony_ci 11988c2ecf20Sopenharmony_ci /* Make sure IV is located in a DMAable area */ 11998c2ecf20Sopenharmony_ci sg_table = &edesc->sgt[0]; 12008c2ecf20Sopenharmony_ci iv = (u8 *)(sg_table + qm_sg_ents); 12018c2ecf20Sopenharmony_ci memcpy(iv, req->iv, ivsize); 12028c2ecf20Sopenharmony_ci 12038c2ecf20Sopenharmony_ci iv_dma = dma_map_single(dev, iv, ivsize, DMA_BIDIRECTIONAL); 12048c2ecf20Sopenharmony_ci if (dma_mapping_error(dev, iv_dma)) { 12058c2ecf20Sopenharmony_ci dev_err(dev, "unable to map IV\n"); 12068c2ecf20Sopenharmony_ci caam_unmap(dev, req->src, req->dst, src_nents, dst_nents, 0, 12078c2ecf20Sopenharmony_ci 0, DMA_NONE, 0, 0); 12088c2ecf20Sopenharmony_ci qi_cache_free(edesc); 12098c2ecf20Sopenharmony_ci return ERR_PTR(-ENOMEM); 12108c2ecf20Sopenharmony_ci } 12118c2ecf20Sopenharmony_ci 12128c2ecf20Sopenharmony_ci edesc->src_nents = src_nents; 12138c2ecf20Sopenharmony_ci edesc->dst_nents = dst_nents; 12148c2ecf20Sopenharmony_ci edesc->iv_dma = iv_dma; 12158c2ecf20Sopenharmony_ci edesc->qm_sg_bytes = qm_sg_bytes; 12168c2ecf20Sopenharmony_ci 12178c2ecf20Sopenharmony_ci dma_to_qm_sg_one(sg_table, iv_dma, ivsize, 0); 12188c2ecf20Sopenharmony_ci sg_to_qm_sg(req->src, req->cryptlen, sg_table + 1, 0); 12198c2ecf20Sopenharmony_ci 12208c2ecf20Sopenharmony_ci if (req->src != req->dst) 12218c2ecf20Sopenharmony_ci sg_to_qm_sg(req->dst, req->cryptlen, sg_table + dst_sg_idx, 0); 12228c2ecf20Sopenharmony_ci 12238c2ecf20Sopenharmony_ci dma_to_qm_sg_one(sg_table + dst_sg_idx + mapped_dst_nents, iv_dma, 12248c2ecf20Sopenharmony_ci ivsize, 0); 12258c2ecf20Sopenharmony_ci 12268c2ecf20Sopenharmony_ci edesc->qm_sg_dma = dma_map_single(dev, sg_table, edesc->qm_sg_bytes, 12278c2ecf20Sopenharmony_ci DMA_TO_DEVICE); 12288c2ecf20Sopenharmony_ci if (dma_mapping_error(dev, edesc->qm_sg_dma)) { 12298c2ecf20Sopenharmony_ci dev_err(dev, "unable to map S/G table\n"); 12308c2ecf20Sopenharmony_ci caam_unmap(dev, req->src, req->dst, src_nents, dst_nents, 12318c2ecf20Sopenharmony_ci iv_dma, ivsize, DMA_BIDIRECTIONAL, 0, 0); 12328c2ecf20Sopenharmony_ci qi_cache_free(edesc); 12338c2ecf20Sopenharmony_ci return ERR_PTR(-ENOMEM); 12348c2ecf20Sopenharmony_ci } 12358c2ecf20Sopenharmony_ci 12368c2ecf20Sopenharmony_ci memset(&req_ctx->fd_flt, 0, sizeof(req_ctx->fd_flt)); 12378c2ecf20Sopenharmony_ci dpaa2_fl_set_final(in_fle, true); 12388c2ecf20Sopenharmony_ci dpaa2_fl_set_len(in_fle, req->cryptlen + ivsize); 12398c2ecf20Sopenharmony_ci dpaa2_fl_set_len(out_fle, req->cryptlen + ivsize); 12408c2ecf20Sopenharmony_ci 12418c2ecf20Sopenharmony_ci dpaa2_fl_set_format(in_fle, dpaa2_fl_sg); 12428c2ecf20Sopenharmony_ci dpaa2_fl_set_addr(in_fle, edesc->qm_sg_dma); 12438c2ecf20Sopenharmony_ci 12448c2ecf20Sopenharmony_ci dpaa2_fl_set_format(out_fle, dpaa2_fl_sg); 12458c2ecf20Sopenharmony_ci 12468c2ecf20Sopenharmony_ci if (req->src == req->dst) 12478c2ecf20Sopenharmony_ci dpaa2_fl_set_addr(out_fle, edesc->qm_sg_dma + 12488c2ecf20Sopenharmony_ci sizeof(*sg_table)); 12498c2ecf20Sopenharmony_ci else 12508c2ecf20Sopenharmony_ci dpaa2_fl_set_addr(out_fle, edesc->qm_sg_dma + dst_sg_idx * 12518c2ecf20Sopenharmony_ci sizeof(*sg_table)); 12528c2ecf20Sopenharmony_ci 12538c2ecf20Sopenharmony_ci return edesc; 12548c2ecf20Sopenharmony_ci} 12558c2ecf20Sopenharmony_ci 12568c2ecf20Sopenharmony_cistatic void aead_unmap(struct device *dev, struct aead_edesc *edesc, 12578c2ecf20Sopenharmony_ci struct aead_request *req) 12588c2ecf20Sopenharmony_ci{ 12598c2ecf20Sopenharmony_ci struct crypto_aead *aead = crypto_aead_reqtfm(req); 12608c2ecf20Sopenharmony_ci int ivsize = crypto_aead_ivsize(aead); 12618c2ecf20Sopenharmony_ci 12628c2ecf20Sopenharmony_ci caam_unmap(dev, req->src, req->dst, edesc->src_nents, edesc->dst_nents, 12638c2ecf20Sopenharmony_ci edesc->iv_dma, ivsize, DMA_TO_DEVICE, edesc->qm_sg_dma, 12648c2ecf20Sopenharmony_ci edesc->qm_sg_bytes); 12658c2ecf20Sopenharmony_ci dma_unmap_single(dev, edesc->assoclen_dma, 4, DMA_TO_DEVICE); 12668c2ecf20Sopenharmony_ci} 12678c2ecf20Sopenharmony_ci 12688c2ecf20Sopenharmony_cistatic void skcipher_unmap(struct device *dev, struct skcipher_edesc *edesc, 12698c2ecf20Sopenharmony_ci struct skcipher_request *req) 12708c2ecf20Sopenharmony_ci{ 12718c2ecf20Sopenharmony_ci struct crypto_skcipher *skcipher = crypto_skcipher_reqtfm(req); 12728c2ecf20Sopenharmony_ci int ivsize = crypto_skcipher_ivsize(skcipher); 12738c2ecf20Sopenharmony_ci 12748c2ecf20Sopenharmony_ci caam_unmap(dev, req->src, req->dst, edesc->src_nents, edesc->dst_nents, 12758c2ecf20Sopenharmony_ci edesc->iv_dma, ivsize, DMA_BIDIRECTIONAL, edesc->qm_sg_dma, 12768c2ecf20Sopenharmony_ci edesc->qm_sg_bytes); 12778c2ecf20Sopenharmony_ci} 12788c2ecf20Sopenharmony_ci 12798c2ecf20Sopenharmony_cistatic void aead_encrypt_done(void *cbk_ctx, u32 status) 12808c2ecf20Sopenharmony_ci{ 12818c2ecf20Sopenharmony_ci struct crypto_async_request *areq = cbk_ctx; 12828c2ecf20Sopenharmony_ci struct aead_request *req = container_of(areq, struct aead_request, 12838c2ecf20Sopenharmony_ci base); 12848c2ecf20Sopenharmony_ci struct caam_request *req_ctx = to_caam_req(areq); 12858c2ecf20Sopenharmony_ci struct aead_edesc *edesc = req_ctx->edesc; 12868c2ecf20Sopenharmony_ci struct crypto_aead *aead = crypto_aead_reqtfm(req); 12878c2ecf20Sopenharmony_ci struct caam_ctx *ctx = crypto_aead_ctx(aead); 12888c2ecf20Sopenharmony_ci int ecode = 0; 12898c2ecf20Sopenharmony_ci 12908c2ecf20Sopenharmony_ci dev_dbg(ctx->dev, "%s %d: err 0x%x\n", __func__, __LINE__, status); 12918c2ecf20Sopenharmony_ci 12928c2ecf20Sopenharmony_ci if (unlikely(status)) 12938c2ecf20Sopenharmony_ci ecode = caam_qi2_strstatus(ctx->dev, status); 12948c2ecf20Sopenharmony_ci 12958c2ecf20Sopenharmony_ci aead_unmap(ctx->dev, edesc, req); 12968c2ecf20Sopenharmony_ci qi_cache_free(edesc); 12978c2ecf20Sopenharmony_ci aead_request_complete(req, ecode); 12988c2ecf20Sopenharmony_ci} 12998c2ecf20Sopenharmony_ci 13008c2ecf20Sopenharmony_cistatic void aead_decrypt_done(void *cbk_ctx, u32 status) 13018c2ecf20Sopenharmony_ci{ 13028c2ecf20Sopenharmony_ci struct crypto_async_request *areq = cbk_ctx; 13038c2ecf20Sopenharmony_ci struct aead_request *req = container_of(areq, struct aead_request, 13048c2ecf20Sopenharmony_ci base); 13058c2ecf20Sopenharmony_ci struct caam_request *req_ctx = to_caam_req(areq); 13068c2ecf20Sopenharmony_ci struct aead_edesc *edesc = req_ctx->edesc; 13078c2ecf20Sopenharmony_ci struct crypto_aead *aead = crypto_aead_reqtfm(req); 13088c2ecf20Sopenharmony_ci struct caam_ctx *ctx = crypto_aead_ctx(aead); 13098c2ecf20Sopenharmony_ci int ecode = 0; 13108c2ecf20Sopenharmony_ci 13118c2ecf20Sopenharmony_ci dev_dbg(ctx->dev, "%s %d: err 0x%x\n", __func__, __LINE__, status); 13128c2ecf20Sopenharmony_ci 13138c2ecf20Sopenharmony_ci if (unlikely(status)) 13148c2ecf20Sopenharmony_ci ecode = caam_qi2_strstatus(ctx->dev, status); 13158c2ecf20Sopenharmony_ci 13168c2ecf20Sopenharmony_ci aead_unmap(ctx->dev, edesc, req); 13178c2ecf20Sopenharmony_ci qi_cache_free(edesc); 13188c2ecf20Sopenharmony_ci aead_request_complete(req, ecode); 13198c2ecf20Sopenharmony_ci} 13208c2ecf20Sopenharmony_ci 13218c2ecf20Sopenharmony_cistatic int aead_encrypt(struct aead_request *req) 13228c2ecf20Sopenharmony_ci{ 13238c2ecf20Sopenharmony_ci struct aead_edesc *edesc; 13248c2ecf20Sopenharmony_ci struct crypto_aead *aead = crypto_aead_reqtfm(req); 13258c2ecf20Sopenharmony_ci struct caam_ctx *ctx = crypto_aead_ctx(aead); 13268c2ecf20Sopenharmony_ci struct caam_request *caam_req = aead_request_ctx(req); 13278c2ecf20Sopenharmony_ci int ret; 13288c2ecf20Sopenharmony_ci 13298c2ecf20Sopenharmony_ci /* allocate extended descriptor */ 13308c2ecf20Sopenharmony_ci edesc = aead_edesc_alloc(req, true); 13318c2ecf20Sopenharmony_ci if (IS_ERR(edesc)) 13328c2ecf20Sopenharmony_ci return PTR_ERR(edesc); 13338c2ecf20Sopenharmony_ci 13348c2ecf20Sopenharmony_ci caam_req->flc = &ctx->flc[ENCRYPT]; 13358c2ecf20Sopenharmony_ci caam_req->flc_dma = ctx->flc_dma[ENCRYPT]; 13368c2ecf20Sopenharmony_ci caam_req->cbk = aead_encrypt_done; 13378c2ecf20Sopenharmony_ci caam_req->ctx = &req->base; 13388c2ecf20Sopenharmony_ci caam_req->edesc = edesc; 13398c2ecf20Sopenharmony_ci ret = dpaa2_caam_enqueue(ctx->dev, caam_req); 13408c2ecf20Sopenharmony_ci if (ret != -EINPROGRESS && 13418c2ecf20Sopenharmony_ci !(ret == -EBUSY && req->base.flags & CRYPTO_TFM_REQ_MAY_BACKLOG)) { 13428c2ecf20Sopenharmony_ci aead_unmap(ctx->dev, edesc, req); 13438c2ecf20Sopenharmony_ci qi_cache_free(edesc); 13448c2ecf20Sopenharmony_ci } 13458c2ecf20Sopenharmony_ci 13468c2ecf20Sopenharmony_ci return ret; 13478c2ecf20Sopenharmony_ci} 13488c2ecf20Sopenharmony_ci 13498c2ecf20Sopenharmony_cistatic int aead_decrypt(struct aead_request *req) 13508c2ecf20Sopenharmony_ci{ 13518c2ecf20Sopenharmony_ci struct aead_edesc *edesc; 13528c2ecf20Sopenharmony_ci struct crypto_aead *aead = crypto_aead_reqtfm(req); 13538c2ecf20Sopenharmony_ci struct caam_ctx *ctx = crypto_aead_ctx(aead); 13548c2ecf20Sopenharmony_ci struct caam_request *caam_req = aead_request_ctx(req); 13558c2ecf20Sopenharmony_ci int ret; 13568c2ecf20Sopenharmony_ci 13578c2ecf20Sopenharmony_ci /* allocate extended descriptor */ 13588c2ecf20Sopenharmony_ci edesc = aead_edesc_alloc(req, false); 13598c2ecf20Sopenharmony_ci if (IS_ERR(edesc)) 13608c2ecf20Sopenharmony_ci return PTR_ERR(edesc); 13618c2ecf20Sopenharmony_ci 13628c2ecf20Sopenharmony_ci caam_req->flc = &ctx->flc[DECRYPT]; 13638c2ecf20Sopenharmony_ci caam_req->flc_dma = ctx->flc_dma[DECRYPT]; 13648c2ecf20Sopenharmony_ci caam_req->cbk = aead_decrypt_done; 13658c2ecf20Sopenharmony_ci caam_req->ctx = &req->base; 13668c2ecf20Sopenharmony_ci caam_req->edesc = edesc; 13678c2ecf20Sopenharmony_ci ret = dpaa2_caam_enqueue(ctx->dev, caam_req); 13688c2ecf20Sopenharmony_ci if (ret != -EINPROGRESS && 13698c2ecf20Sopenharmony_ci !(ret == -EBUSY && req->base.flags & CRYPTO_TFM_REQ_MAY_BACKLOG)) { 13708c2ecf20Sopenharmony_ci aead_unmap(ctx->dev, edesc, req); 13718c2ecf20Sopenharmony_ci qi_cache_free(edesc); 13728c2ecf20Sopenharmony_ci } 13738c2ecf20Sopenharmony_ci 13748c2ecf20Sopenharmony_ci return ret; 13758c2ecf20Sopenharmony_ci} 13768c2ecf20Sopenharmony_ci 13778c2ecf20Sopenharmony_cistatic int ipsec_gcm_encrypt(struct aead_request *req) 13788c2ecf20Sopenharmony_ci{ 13798c2ecf20Sopenharmony_ci return crypto_ipsec_check_assoclen(req->assoclen) ? : aead_encrypt(req); 13808c2ecf20Sopenharmony_ci} 13818c2ecf20Sopenharmony_ci 13828c2ecf20Sopenharmony_cistatic int ipsec_gcm_decrypt(struct aead_request *req) 13838c2ecf20Sopenharmony_ci{ 13848c2ecf20Sopenharmony_ci return crypto_ipsec_check_assoclen(req->assoclen) ? : aead_decrypt(req); 13858c2ecf20Sopenharmony_ci} 13868c2ecf20Sopenharmony_ci 13878c2ecf20Sopenharmony_cistatic void skcipher_encrypt_done(void *cbk_ctx, u32 status) 13888c2ecf20Sopenharmony_ci{ 13898c2ecf20Sopenharmony_ci struct crypto_async_request *areq = cbk_ctx; 13908c2ecf20Sopenharmony_ci struct skcipher_request *req = skcipher_request_cast(areq); 13918c2ecf20Sopenharmony_ci struct caam_request *req_ctx = to_caam_req(areq); 13928c2ecf20Sopenharmony_ci struct crypto_skcipher *skcipher = crypto_skcipher_reqtfm(req); 13938c2ecf20Sopenharmony_ci struct caam_ctx *ctx = crypto_skcipher_ctx(skcipher); 13948c2ecf20Sopenharmony_ci struct skcipher_edesc *edesc = req_ctx->edesc; 13958c2ecf20Sopenharmony_ci int ecode = 0; 13968c2ecf20Sopenharmony_ci int ivsize = crypto_skcipher_ivsize(skcipher); 13978c2ecf20Sopenharmony_ci 13988c2ecf20Sopenharmony_ci dev_dbg(ctx->dev, "%s %d: err 0x%x\n", __func__, __LINE__, status); 13998c2ecf20Sopenharmony_ci 14008c2ecf20Sopenharmony_ci if (unlikely(status)) 14018c2ecf20Sopenharmony_ci ecode = caam_qi2_strstatus(ctx->dev, status); 14028c2ecf20Sopenharmony_ci 14038c2ecf20Sopenharmony_ci print_hex_dump_debug("dstiv @" __stringify(__LINE__)": ", 14048c2ecf20Sopenharmony_ci DUMP_PREFIX_ADDRESS, 16, 4, req->iv, 14058c2ecf20Sopenharmony_ci edesc->src_nents > 1 ? 100 : ivsize, 1); 14068c2ecf20Sopenharmony_ci caam_dump_sg("dst @" __stringify(__LINE__)": ", 14078c2ecf20Sopenharmony_ci DUMP_PREFIX_ADDRESS, 16, 4, req->dst, 14088c2ecf20Sopenharmony_ci edesc->dst_nents > 1 ? 100 : req->cryptlen, 1); 14098c2ecf20Sopenharmony_ci 14108c2ecf20Sopenharmony_ci skcipher_unmap(ctx->dev, edesc, req); 14118c2ecf20Sopenharmony_ci 14128c2ecf20Sopenharmony_ci /* 14138c2ecf20Sopenharmony_ci * The crypto API expects us to set the IV (req->iv) to the last 14148c2ecf20Sopenharmony_ci * ciphertext block (CBC mode) or last counter (CTR mode). 14158c2ecf20Sopenharmony_ci * This is used e.g. by the CTS mode. 14168c2ecf20Sopenharmony_ci */ 14178c2ecf20Sopenharmony_ci if (!ecode) 14188c2ecf20Sopenharmony_ci memcpy(req->iv, (u8 *)&edesc->sgt[0] + edesc->qm_sg_bytes, 14198c2ecf20Sopenharmony_ci ivsize); 14208c2ecf20Sopenharmony_ci 14218c2ecf20Sopenharmony_ci qi_cache_free(edesc); 14228c2ecf20Sopenharmony_ci skcipher_request_complete(req, ecode); 14238c2ecf20Sopenharmony_ci} 14248c2ecf20Sopenharmony_ci 14258c2ecf20Sopenharmony_cistatic void skcipher_decrypt_done(void *cbk_ctx, u32 status) 14268c2ecf20Sopenharmony_ci{ 14278c2ecf20Sopenharmony_ci struct crypto_async_request *areq = cbk_ctx; 14288c2ecf20Sopenharmony_ci struct skcipher_request *req = skcipher_request_cast(areq); 14298c2ecf20Sopenharmony_ci struct caam_request *req_ctx = to_caam_req(areq); 14308c2ecf20Sopenharmony_ci struct crypto_skcipher *skcipher = crypto_skcipher_reqtfm(req); 14318c2ecf20Sopenharmony_ci struct caam_ctx *ctx = crypto_skcipher_ctx(skcipher); 14328c2ecf20Sopenharmony_ci struct skcipher_edesc *edesc = req_ctx->edesc; 14338c2ecf20Sopenharmony_ci int ecode = 0; 14348c2ecf20Sopenharmony_ci int ivsize = crypto_skcipher_ivsize(skcipher); 14358c2ecf20Sopenharmony_ci 14368c2ecf20Sopenharmony_ci dev_dbg(ctx->dev, "%s %d: err 0x%x\n", __func__, __LINE__, status); 14378c2ecf20Sopenharmony_ci 14388c2ecf20Sopenharmony_ci if (unlikely(status)) 14398c2ecf20Sopenharmony_ci ecode = caam_qi2_strstatus(ctx->dev, status); 14408c2ecf20Sopenharmony_ci 14418c2ecf20Sopenharmony_ci print_hex_dump_debug("dstiv @" __stringify(__LINE__)": ", 14428c2ecf20Sopenharmony_ci DUMP_PREFIX_ADDRESS, 16, 4, req->iv, 14438c2ecf20Sopenharmony_ci edesc->src_nents > 1 ? 100 : ivsize, 1); 14448c2ecf20Sopenharmony_ci caam_dump_sg("dst @" __stringify(__LINE__)": ", 14458c2ecf20Sopenharmony_ci DUMP_PREFIX_ADDRESS, 16, 4, req->dst, 14468c2ecf20Sopenharmony_ci edesc->dst_nents > 1 ? 100 : req->cryptlen, 1); 14478c2ecf20Sopenharmony_ci 14488c2ecf20Sopenharmony_ci skcipher_unmap(ctx->dev, edesc, req); 14498c2ecf20Sopenharmony_ci 14508c2ecf20Sopenharmony_ci /* 14518c2ecf20Sopenharmony_ci * The crypto API expects us to set the IV (req->iv) to the last 14528c2ecf20Sopenharmony_ci * ciphertext block (CBC mode) or last counter (CTR mode). 14538c2ecf20Sopenharmony_ci * This is used e.g. by the CTS mode. 14548c2ecf20Sopenharmony_ci */ 14558c2ecf20Sopenharmony_ci if (!ecode) 14568c2ecf20Sopenharmony_ci memcpy(req->iv, (u8 *)&edesc->sgt[0] + edesc->qm_sg_bytes, 14578c2ecf20Sopenharmony_ci ivsize); 14588c2ecf20Sopenharmony_ci 14598c2ecf20Sopenharmony_ci qi_cache_free(edesc); 14608c2ecf20Sopenharmony_ci skcipher_request_complete(req, ecode); 14618c2ecf20Sopenharmony_ci} 14628c2ecf20Sopenharmony_ci 14638c2ecf20Sopenharmony_cistatic inline bool xts_skcipher_ivsize(struct skcipher_request *req) 14648c2ecf20Sopenharmony_ci{ 14658c2ecf20Sopenharmony_ci struct crypto_skcipher *skcipher = crypto_skcipher_reqtfm(req); 14668c2ecf20Sopenharmony_ci unsigned int ivsize = crypto_skcipher_ivsize(skcipher); 14678c2ecf20Sopenharmony_ci 14688c2ecf20Sopenharmony_ci return !!get_unaligned((u64 *)(req->iv + (ivsize / 2))); 14698c2ecf20Sopenharmony_ci} 14708c2ecf20Sopenharmony_ci 14718c2ecf20Sopenharmony_cistatic int skcipher_encrypt(struct skcipher_request *req) 14728c2ecf20Sopenharmony_ci{ 14738c2ecf20Sopenharmony_ci struct skcipher_edesc *edesc; 14748c2ecf20Sopenharmony_ci struct crypto_skcipher *skcipher = crypto_skcipher_reqtfm(req); 14758c2ecf20Sopenharmony_ci struct caam_ctx *ctx = crypto_skcipher_ctx(skcipher); 14768c2ecf20Sopenharmony_ci struct caam_request *caam_req = skcipher_request_ctx(req); 14778c2ecf20Sopenharmony_ci struct dpaa2_caam_priv *priv = dev_get_drvdata(ctx->dev); 14788c2ecf20Sopenharmony_ci int ret; 14798c2ecf20Sopenharmony_ci 14808c2ecf20Sopenharmony_ci /* 14818c2ecf20Sopenharmony_ci * XTS is expected to return an error even for input length = 0 14828c2ecf20Sopenharmony_ci * Note that the case input length < block size will be caught during 14838c2ecf20Sopenharmony_ci * HW offloading and return an error. 14848c2ecf20Sopenharmony_ci */ 14858c2ecf20Sopenharmony_ci if (!req->cryptlen && !ctx->fallback) 14868c2ecf20Sopenharmony_ci return 0; 14878c2ecf20Sopenharmony_ci 14888c2ecf20Sopenharmony_ci if (ctx->fallback && ((priv->sec_attr.era <= 8 && xts_skcipher_ivsize(req)) || 14898c2ecf20Sopenharmony_ci ctx->xts_key_fallback)) { 14908c2ecf20Sopenharmony_ci skcipher_request_set_tfm(&caam_req->fallback_req, ctx->fallback); 14918c2ecf20Sopenharmony_ci skcipher_request_set_callback(&caam_req->fallback_req, 14928c2ecf20Sopenharmony_ci req->base.flags, 14938c2ecf20Sopenharmony_ci req->base.complete, 14948c2ecf20Sopenharmony_ci req->base.data); 14958c2ecf20Sopenharmony_ci skcipher_request_set_crypt(&caam_req->fallback_req, req->src, 14968c2ecf20Sopenharmony_ci req->dst, req->cryptlen, req->iv); 14978c2ecf20Sopenharmony_ci 14988c2ecf20Sopenharmony_ci return crypto_skcipher_encrypt(&caam_req->fallback_req); 14998c2ecf20Sopenharmony_ci } 15008c2ecf20Sopenharmony_ci 15018c2ecf20Sopenharmony_ci /* allocate extended descriptor */ 15028c2ecf20Sopenharmony_ci edesc = skcipher_edesc_alloc(req); 15038c2ecf20Sopenharmony_ci if (IS_ERR(edesc)) 15048c2ecf20Sopenharmony_ci return PTR_ERR(edesc); 15058c2ecf20Sopenharmony_ci 15068c2ecf20Sopenharmony_ci caam_req->flc = &ctx->flc[ENCRYPT]; 15078c2ecf20Sopenharmony_ci caam_req->flc_dma = ctx->flc_dma[ENCRYPT]; 15088c2ecf20Sopenharmony_ci caam_req->cbk = skcipher_encrypt_done; 15098c2ecf20Sopenharmony_ci caam_req->ctx = &req->base; 15108c2ecf20Sopenharmony_ci caam_req->edesc = edesc; 15118c2ecf20Sopenharmony_ci ret = dpaa2_caam_enqueue(ctx->dev, caam_req); 15128c2ecf20Sopenharmony_ci if (ret != -EINPROGRESS && 15138c2ecf20Sopenharmony_ci !(ret == -EBUSY && req->base.flags & CRYPTO_TFM_REQ_MAY_BACKLOG)) { 15148c2ecf20Sopenharmony_ci skcipher_unmap(ctx->dev, edesc, req); 15158c2ecf20Sopenharmony_ci qi_cache_free(edesc); 15168c2ecf20Sopenharmony_ci } 15178c2ecf20Sopenharmony_ci 15188c2ecf20Sopenharmony_ci return ret; 15198c2ecf20Sopenharmony_ci} 15208c2ecf20Sopenharmony_ci 15218c2ecf20Sopenharmony_cistatic int skcipher_decrypt(struct skcipher_request *req) 15228c2ecf20Sopenharmony_ci{ 15238c2ecf20Sopenharmony_ci struct skcipher_edesc *edesc; 15248c2ecf20Sopenharmony_ci struct crypto_skcipher *skcipher = crypto_skcipher_reqtfm(req); 15258c2ecf20Sopenharmony_ci struct caam_ctx *ctx = crypto_skcipher_ctx(skcipher); 15268c2ecf20Sopenharmony_ci struct caam_request *caam_req = skcipher_request_ctx(req); 15278c2ecf20Sopenharmony_ci struct dpaa2_caam_priv *priv = dev_get_drvdata(ctx->dev); 15288c2ecf20Sopenharmony_ci int ret; 15298c2ecf20Sopenharmony_ci 15308c2ecf20Sopenharmony_ci /* 15318c2ecf20Sopenharmony_ci * XTS is expected to return an error even for input length = 0 15328c2ecf20Sopenharmony_ci * Note that the case input length < block size will be caught during 15338c2ecf20Sopenharmony_ci * HW offloading and return an error. 15348c2ecf20Sopenharmony_ci */ 15358c2ecf20Sopenharmony_ci if (!req->cryptlen && !ctx->fallback) 15368c2ecf20Sopenharmony_ci return 0; 15378c2ecf20Sopenharmony_ci 15388c2ecf20Sopenharmony_ci if (ctx->fallback && ((priv->sec_attr.era <= 8 && xts_skcipher_ivsize(req)) || 15398c2ecf20Sopenharmony_ci ctx->xts_key_fallback)) { 15408c2ecf20Sopenharmony_ci skcipher_request_set_tfm(&caam_req->fallback_req, ctx->fallback); 15418c2ecf20Sopenharmony_ci skcipher_request_set_callback(&caam_req->fallback_req, 15428c2ecf20Sopenharmony_ci req->base.flags, 15438c2ecf20Sopenharmony_ci req->base.complete, 15448c2ecf20Sopenharmony_ci req->base.data); 15458c2ecf20Sopenharmony_ci skcipher_request_set_crypt(&caam_req->fallback_req, req->src, 15468c2ecf20Sopenharmony_ci req->dst, req->cryptlen, req->iv); 15478c2ecf20Sopenharmony_ci 15488c2ecf20Sopenharmony_ci return crypto_skcipher_decrypt(&caam_req->fallback_req); 15498c2ecf20Sopenharmony_ci } 15508c2ecf20Sopenharmony_ci 15518c2ecf20Sopenharmony_ci /* allocate extended descriptor */ 15528c2ecf20Sopenharmony_ci edesc = skcipher_edesc_alloc(req); 15538c2ecf20Sopenharmony_ci if (IS_ERR(edesc)) 15548c2ecf20Sopenharmony_ci return PTR_ERR(edesc); 15558c2ecf20Sopenharmony_ci 15568c2ecf20Sopenharmony_ci caam_req->flc = &ctx->flc[DECRYPT]; 15578c2ecf20Sopenharmony_ci caam_req->flc_dma = ctx->flc_dma[DECRYPT]; 15588c2ecf20Sopenharmony_ci caam_req->cbk = skcipher_decrypt_done; 15598c2ecf20Sopenharmony_ci caam_req->ctx = &req->base; 15608c2ecf20Sopenharmony_ci caam_req->edesc = edesc; 15618c2ecf20Sopenharmony_ci ret = dpaa2_caam_enqueue(ctx->dev, caam_req); 15628c2ecf20Sopenharmony_ci if (ret != -EINPROGRESS && 15638c2ecf20Sopenharmony_ci !(ret == -EBUSY && req->base.flags & CRYPTO_TFM_REQ_MAY_BACKLOG)) { 15648c2ecf20Sopenharmony_ci skcipher_unmap(ctx->dev, edesc, req); 15658c2ecf20Sopenharmony_ci qi_cache_free(edesc); 15668c2ecf20Sopenharmony_ci } 15678c2ecf20Sopenharmony_ci 15688c2ecf20Sopenharmony_ci return ret; 15698c2ecf20Sopenharmony_ci} 15708c2ecf20Sopenharmony_ci 15718c2ecf20Sopenharmony_cistatic int caam_cra_init(struct caam_ctx *ctx, struct caam_alg_entry *caam, 15728c2ecf20Sopenharmony_ci bool uses_dkp) 15738c2ecf20Sopenharmony_ci{ 15748c2ecf20Sopenharmony_ci dma_addr_t dma_addr; 15758c2ecf20Sopenharmony_ci int i; 15768c2ecf20Sopenharmony_ci 15778c2ecf20Sopenharmony_ci /* copy descriptor header template value */ 15788c2ecf20Sopenharmony_ci ctx->cdata.algtype = OP_TYPE_CLASS1_ALG | caam->class1_alg_type; 15798c2ecf20Sopenharmony_ci ctx->adata.algtype = OP_TYPE_CLASS2_ALG | caam->class2_alg_type; 15808c2ecf20Sopenharmony_ci 15818c2ecf20Sopenharmony_ci ctx->dev = caam->dev; 15828c2ecf20Sopenharmony_ci ctx->dir = uses_dkp ? DMA_BIDIRECTIONAL : DMA_TO_DEVICE; 15838c2ecf20Sopenharmony_ci 15848c2ecf20Sopenharmony_ci dma_addr = dma_map_single_attrs(ctx->dev, ctx->flc, 15858c2ecf20Sopenharmony_ci offsetof(struct caam_ctx, flc_dma), 15868c2ecf20Sopenharmony_ci ctx->dir, DMA_ATTR_SKIP_CPU_SYNC); 15878c2ecf20Sopenharmony_ci if (dma_mapping_error(ctx->dev, dma_addr)) { 15888c2ecf20Sopenharmony_ci dev_err(ctx->dev, "unable to map key, shared descriptors\n"); 15898c2ecf20Sopenharmony_ci return -ENOMEM; 15908c2ecf20Sopenharmony_ci } 15918c2ecf20Sopenharmony_ci 15928c2ecf20Sopenharmony_ci for (i = 0; i < NUM_OP; i++) 15938c2ecf20Sopenharmony_ci ctx->flc_dma[i] = dma_addr + i * sizeof(ctx->flc[i]); 15948c2ecf20Sopenharmony_ci ctx->key_dma = dma_addr + NUM_OP * sizeof(ctx->flc[0]); 15958c2ecf20Sopenharmony_ci 15968c2ecf20Sopenharmony_ci return 0; 15978c2ecf20Sopenharmony_ci} 15988c2ecf20Sopenharmony_ci 15998c2ecf20Sopenharmony_cistatic int caam_cra_init_skcipher(struct crypto_skcipher *tfm) 16008c2ecf20Sopenharmony_ci{ 16018c2ecf20Sopenharmony_ci struct skcipher_alg *alg = crypto_skcipher_alg(tfm); 16028c2ecf20Sopenharmony_ci struct caam_skcipher_alg *caam_alg = 16038c2ecf20Sopenharmony_ci container_of(alg, typeof(*caam_alg), skcipher); 16048c2ecf20Sopenharmony_ci struct caam_ctx *ctx = crypto_skcipher_ctx(tfm); 16058c2ecf20Sopenharmony_ci u32 alg_aai = caam_alg->caam.class1_alg_type & OP_ALG_AAI_MASK; 16068c2ecf20Sopenharmony_ci int ret = 0; 16078c2ecf20Sopenharmony_ci 16088c2ecf20Sopenharmony_ci if (alg_aai == OP_ALG_AAI_XTS) { 16098c2ecf20Sopenharmony_ci const char *tfm_name = crypto_tfm_alg_name(&tfm->base); 16108c2ecf20Sopenharmony_ci struct crypto_skcipher *fallback; 16118c2ecf20Sopenharmony_ci 16128c2ecf20Sopenharmony_ci fallback = crypto_alloc_skcipher(tfm_name, 0, 16138c2ecf20Sopenharmony_ci CRYPTO_ALG_NEED_FALLBACK); 16148c2ecf20Sopenharmony_ci if (IS_ERR(fallback)) { 16158c2ecf20Sopenharmony_ci dev_err(caam_alg->caam.dev, 16168c2ecf20Sopenharmony_ci "Failed to allocate %s fallback: %ld\n", 16178c2ecf20Sopenharmony_ci tfm_name, PTR_ERR(fallback)); 16188c2ecf20Sopenharmony_ci return PTR_ERR(fallback); 16198c2ecf20Sopenharmony_ci } 16208c2ecf20Sopenharmony_ci 16218c2ecf20Sopenharmony_ci ctx->fallback = fallback; 16228c2ecf20Sopenharmony_ci crypto_skcipher_set_reqsize(tfm, sizeof(struct caam_request) + 16238c2ecf20Sopenharmony_ci crypto_skcipher_reqsize(fallback)); 16248c2ecf20Sopenharmony_ci } else { 16258c2ecf20Sopenharmony_ci crypto_skcipher_set_reqsize(tfm, sizeof(struct caam_request)); 16268c2ecf20Sopenharmony_ci } 16278c2ecf20Sopenharmony_ci 16288c2ecf20Sopenharmony_ci ret = caam_cra_init(ctx, &caam_alg->caam, false); 16298c2ecf20Sopenharmony_ci if (ret && ctx->fallback) 16308c2ecf20Sopenharmony_ci crypto_free_skcipher(ctx->fallback); 16318c2ecf20Sopenharmony_ci 16328c2ecf20Sopenharmony_ci return ret; 16338c2ecf20Sopenharmony_ci} 16348c2ecf20Sopenharmony_ci 16358c2ecf20Sopenharmony_cistatic int caam_cra_init_aead(struct crypto_aead *tfm) 16368c2ecf20Sopenharmony_ci{ 16378c2ecf20Sopenharmony_ci struct aead_alg *alg = crypto_aead_alg(tfm); 16388c2ecf20Sopenharmony_ci struct caam_aead_alg *caam_alg = container_of(alg, typeof(*caam_alg), 16398c2ecf20Sopenharmony_ci aead); 16408c2ecf20Sopenharmony_ci 16418c2ecf20Sopenharmony_ci crypto_aead_set_reqsize(tfm, sizeof(struct caam_request)); 16428c2ecf20Sopenharmony_ci return caam_cra_init(crypto_aead_ctx(tfm), &caam_alg->caam, 16438c2ecf20Sopenharmony_ci !caam_alg->caam.nodkp); 16448c2ecf20Sopenharmony_ci} 16458c2ecf20Sopenharmony_ci 16468c2ecf20Sopenharmony_cistatic void caam_exit_common(struct caam_ctx *ctx) 16478c2ecf20Sopenharmony_ci{ 16488c2ecf20Sopenharmony_ci dma_unmap_single_attrs(ctx->dev, ctx->flc_dma[0], 16498c2ecf20Sopenharmony_ci offsetof(struct caam_ctx, flc_dma), ctx->dir, 16508c2ecf20Sopenharmony_ci DMA_ATTR_SKIP_CPU_SYNC); 16518c2ecf20Sopenharmony_ci} 16528c2ecf20Sopenharmony_ci 16538c2ecf20Sopenharmony_cistatic void caam_cra_exit(struct crypto_skcipher *tfm) 16548c2ecf20Sopenharmony_ci{ 16558c2ecf20Sopenharmony_ci struct caam_ctx *ctx = crypto_skcipher_ctx(tfm); 16568c2ecf20Sopenharmony_ci 16578c2ecf20Sopenharmony_ci if (ctx->fallback) 16588c2ecf20Sopenharmony_ci crypto_free_skcipher(ctx->fallback); 16598c2ecf20Sopenharmony_ci caam_exit_common(ctx); 16608c2ecf20Sopenharmony_ci} 16618c2ecf20Sopenharmony_ci 16628c2ecf20Sopenharmony_cistatic void caam_cra_exit_aead(struct crypto_aead *tfm) 16638c2ecf20Sopenharmony_ci{ 16648c2ecf20Sopenharmony_ci caam_exit_common(crypto_aead_ctx(tfm)); 16658c2ecf20Sopenharmony_ci} 16668c2ecf20Sopenharmony_ci 16678c2ecf20Sopenharmony_cistatic struct caam_skcipher_alg driver_algs[] = { 16688c2ecf20Sopenharmony_ci { 16698c2ecf20Sopenharmony_ci .skcipher = { 16708c2ecf20Sopenharmony_ci .base = { 16718c2ecf20Sopenharmony_ci .cra_name = "cbc(aes)", 16728c2ecf20Sopenharmony_ci .cra_driver_name = "cbc-aes-caam-qi2", 16738c2ecf20Sopenharmony_ci .cra_blocksize = AES_BLOCK_SIZE, 16748c2ecf20Sopenharmony_ci }, 16758c2ecf20Sopenharmony_ci .setkey = aes_skcipher_setkey, 16768c2ecf20Sopenharmony_ci .encrypt = skcipher_encrypt, 16778c2ecf20Sopenharmony_ci .decrypt = skcipher_decrypt, 16788c2ecf20Sopenharmony_ci .min_keysize = AES_MIN_KEY_SIZE, 16798c2ecf20Sopenharmony_ci .max_keysize = AES_MAX_KEY_SIZE, 16808c2ecf20Sopenharmony_ci .ivsize = AES_BLOCK_SIZE, 16818c2ecf20Sopenharmony_ci }, 16828c2ecf20Sopenharmony_ci .caam.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC, 16838c2ecf20Sopenharmony_ci }, 16848c2ecf20Sopenharmony_ci { 16858c2ecf20Sopenharmony_ci .skcipher = { 16868c2ecf20Sopenharmony_ci .base = { 16878c2ecf20Sopenharmony_ci .cra_name = "cbc(des3_ede)", 16888c2ecf20Sopenharmony_ci .cra_driver_name = "cbc-3des-caam-qi2", 16898c2ecf20Sopenharmony_ci .cra_blocksize = DES3_EDE_BLOCK_SIZE, 16908c2ecf20Sopenharmony_ci }, 16918c2ecf20Sopenharmony_ci .setkey = des3_skcipher_setkey, 16928c2ecf20Sopenharmony_ci .encrypt = skcipher_encrypt, 16938c2ecf20Sopenharmony_ci .decrypt = skcipher_decrypt, 16948c2ecf20Sopenharmony_ci .min_keysize = DES3_EDE_KEY_SIZE, 16958c2ecf20Sopenharmony_ci .max_keysize = DES3_EDE_KEY_SIZE, 16968c2ecf20Sopenharmony_ci .ivsize = DES3_EDE_BLOCK_SIZE, 16978c2ecf20Sopenharmony_ci }, 16988c2ecf20Sopenharmony_ci .caam.class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC, 16998c2ecf20Sopenharmony_ci }, 17008c2ecf20Sopenharmony_ci { 17018c2ecf20Sopenharmony_ci .skcipher = { 17028c2ecf20Sopenharmony_ci .base = { 17038c2ecf20Sopenharmony_ci .cra_name = "cbc(des)", 17048c2ecf20Sopenharmony_ci .cra_driver_name = "cbc-des-caam-qi2", 17058c2ecf20Sopenharmony_ci .cra_blocksize = DES_BLOCK_SIZE, 17068c2ecf20Sopenharmony_ci }, 17078c2ecf20Sopenharmony_ci .setkey = des_skcipher_setkey, 17088c2ecf20Sopenharmony_ci .encrypt = skcipher_encrypt, 17098c2ecf20Sopenharmony_ci .decrypt = skcipher_decrypt, 17108c2ecf20Sopenharmony_ci .min_keysize = DES_KEY_SIZE, 17118c2ecf20Sopenharmony_ci .max_keysize = DES_KEY_SIZE, 17128c2ecf20Sopenharmony_ci .ivsize = DES_BLOCK_SIZE, 17138c2ecf20Sopenharmony_ci }, 17148c2ecf20Sopenharmony_ci .caam.class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC, 17158c2ecf20Sopenharmony_ci }, 17168c2ecf20Sopenharmony_ci { 17178c2ecf20Sopenharmony_ci .skcipher = { 17188c2ecf20Sopenharmony_ci .base = { 17198c2ecf20Sopenharmony_ci .cra_name = "ctr(aes)", 17208c2ecf20Sopenharmony_ci .cra_driver_name = "ctr-aes-caam-qi2", 17218c2ecf20Sopenharmony_ci .cra_blocksize = 1, 17228c2ecf20Sopenharmony_ci }, 17238c2ecf20Sopenharmony_ci .setkey = ctr_skcipher_setkey, 17248c2ecf20Sopenharmony_ci .encrypt = skcipher_encrypt, 17258c2ecf20Sopenharmony_ci .decrypt = skcipher_decrypt, 17268c2ecf20Sopenharmony_ci .min_keysize = AES_MIN_KEY_SIZE, 17278c2ecf20Sopenharmony_ci .max_keysize = AES_MAX_KEY_SIZE, 17288c2ecf20Sopenharmony_ci .ivsize = AES_BLOCK_SIZE, 17298c2ecf20Sopenharmony_ci .chunksize = AES_BLOCK_SIZE, 17308c2ecf20Sopenharmony_ci }, 17318c2ecf20Sopenharmony_ci .caam.class1_alg_type = OP_ALG_ALGSEL_AES | 17328c2ecf20Sopenharmony_ci OP_ALG_AAI_CTR_MOD128, 17338c2ecf20Sopenharmony_ci }, 17348c2ecf20Sopenharmony_ci { 17358c2ecf20Sopenharmony_ci .skcipher = { 17368c2ecf20Sopenharmony_ci .base = { 17378c2ecf20Sopenharmony_ci .cra_name = "rfc3686(ctr(aes))", 17388c2ecf20Sopenharmony_ci .cra_driver_name = "rfc3686-ctr-aes-caam-qi2", 17398c2ecf20Sopenharmony_ci .cra_blocksize = 1, 17408c2ecf20Sopenharmony_ci }, 17418c2ecf20Sopenharmony_ci .setkey = rfc3686_skcipher_setkey, 17428c2ecf20Sopenharmony_ci .encrypt = skcipher_encrypt, 17438c2ecf20Sopenharmony_ci .decrypt = skcipher_decrypt, 17448c2ecf20Sopenharmony_ci .min_keysize = AES_MIN_KEY_SIZE + 17458c2ecf20Sopenharmony_ci CTR_RFC3686_NONCE_SIZE, 17468c2ecf20Sopenharmony_ci .max_keysize = AES_MAX_KEY_SIZE + 17478c2ecf20Sopenharmony_ci CTR_RFC3686_NONCE_SIZE, 17488c2ecf20Sopenharmony_ci .ivsize = CTR_RFC3686_IV_SIZE, 17498c2ecf20Sopenharmony_ci .chunksize = AES_BLOCK_SIZE, 17508c2ecf20Sopenharmony_ci }, 17518c2ecf20Sopenharmony_ci .caam = { 17528c2ecf20Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_AES | 17538c2ecf20Sopenharmony_ci OP_ALG_AAI_CTR_MOD128, 17548c2ecf20Sopenharmony_ci .rfc3686 = true, 17558c2ecf20Sopenharmony_ci }, 17568c2ecf20Sopenharmony_ci }, 17578c2ecf20Sopenharmony_ci { 17588c2ecf20Sopenharmony_ci .skcipher = { 17598c2ecf20Sopenharmony_ci .base = { 17608c2ecf20Sopenharmony_ci .cra_name = "xts(aes)", 17618c2ecf20Sopenharmony_ci .cra_driver_name = "xts-aes-caam-qi2", 17628c2ecf20Sopenharmony_ci .cra_flags = CRYPTO_ALG_NEED_FALLBACK, 17638c2ecf20Sopenharmony_ci .cra_blocksize = AES_BLOCK_SIZE, 17648c2ecf20Sopenharmony_ci }, 17658c2ecf20Sopenharmony_ci .setkey = xts_skcipher_setkey, 17668c2ecf20Sopenharmony_ci .encrypt = skcipher_encrypt, 17678c2ecf20Sopenharmony_ci .decrypt = skcipher_decrypt, 17688c2ecf20Sopenharmony_ci .min_keysize = 2 * AES_MIN_KEY_SIZE, 17698c2ecf20Sopenharmony_ci .max_keysize = 2 * AES_MAX_KEY_SIZE, 17708c2ecf20Sopenharmony_ci .ivsize = AES_BLOCK_SIZE, 17718c2ecf20Sopenharmony_ci }, 17728c2ecf20Sopenharmony_ci .caam.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_XTS, 17738c2ecf20Sopenharmony_ci }, 17748c2ecf20Sopenharmony_ci { 17758c2ecf20Sopenharmony_ci .skcipher = { 17768c2ecf20Sopenharmony_ci .base = { 17778c2ecf20Sopenharmony_ci .cra_name = "chacha20", 17788c2ecf20Sopenharmony_ci .cra_driver_name = "chacha20-caam-qi2", 17798c2ecf20Sopenharmony_ci .cra_blocksize = 1, 17808c2ecf20Sopenharmony_ci }, 17818c2ecf20Sopenharmony_ci .setkey = chacha20_skcipher_setkey, 17828c2ecf20Sopenharmony_ci .encrypt = skcipher_encrypt, 17838c2ecf20Sopenharmony_ci .decrypt = skcipher_decrypt, 17848c2ecf20Sopenharmony_ci .min_keysize = CHACHA_KEY_SIZE, 17858c2ecf20Sopenharmony_ci .max_keysize = CHACHA_KEY_SIZE, 17868c2ecf20Sopenharmony_ci .ivsize = CHACHA_IV_SIZE, 17878c2ecf20Sopenharmony_ci }, 17888c2ecf20Sopenharmony_ci .caam.class1_alg_type = OP_ALG_ALGSEL_CHACHA20, 17898c2ecf20Sopenharmony_ci }, 17908c2ecf20Sopenharmony_ci}; 17918c2ecf20Sopenharmony_ci 17928c2ecf20Sopenharmony_cistatic struct caam_aead_alg driver_aeads[] = { 17938c2ecf20Sopenharmony_ci { 17948c2ecf20Sopenharmony_ci .aead = { 17958c2ecf20Sopenharmony_ci .base = { 17968c2ecf20Sopenharmony_ci .cra_name = "rfc4106(gcm(aes))", 17978c2ecf20Sopenharmony_ci .cra_driver_name = "rfc4106-gcm-aes-caam-qi2", 17988c2ecf20Sopenharmony_ci .cra_blocksize = 1, 17998c2ecf20Sopenharmony_ci }, 18008c2ecf20Sopenharmony_ci .setkey = rfc4106_setkey, 18018c2ecf20Sopenharmony_ci .setauthsize = rfc4106_setauthsize, 18028c2ecf20Sopenharmony_ci .encrypt = ipsec_gcm_encrypt, 18038c2ecf20Sopenharmony_ci .decrypt = ipsec_gcm_decrypt, 18048c2ecf20Sopenharmony_ci .ivsize = 8, 18058c2ecf20Sopenharmony_ci .maxauthsize = AES_BLOCK_SIZE, 18068c2ecf20Sopenharmony_ci }, 18078c2ecf20Sopenharmony_ci .caam = { 18088c2ecf20Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_GCM, 18098c2ecf20Sopenharmony_ci .nodkp = true, 18108c2ecf20Sopenharmony_ci }, 18118c2ecf20Sopenharmony_ci }, 18128c2ecf20Sopenharmony_ci { 18138c2ecf20Sopenharmony_ci .aead = { 18148c2ecf20Sopenharmony_ci .base = { 18158c2ecf20Sopenharmony_ci .cra_name = "rfc4543(gcm(aes))", 18168c2ecf20Sopenharmony_ci .cra_driver_name = "rfc4543-gcm-aes-caam-qi2", 18178c2ecf20Sopenharmony_ci .cra_blocksize = 1, 18188c2ecf20Sopenharmony_ci }, 18198c2ecf20Sopenharmony_ci .setkey = rfc4543_setkey, 18208c2ecf20Sopenharmony_ci .setauthsize = rfc4543_setauthsize, 18218c2ecf20Sopenharmony_ci .encrypt = ipsec_gcm_encrypt, 18228c2ecf20Sopenharmony_ci .decrypt = ipsec_gcm_decrypt, 18238c2ecf20Sopenharmony_ci .ivsize = 8, 18248c2ecf20Sopenharmony_ci .maxauthsize = AES_BLOCK_SIZE, 18258c2ecf20Sopenharmony_ci }, 18268c2ecf20Sopenharmony_ci .caam = { 18278c2ecf20Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_GCM, 18288c2ecf20Sopenharmony_ci .nodkp = true, 18298c2ecf20Sopenharmony_ci }, 18308c2ecf20Sopenharmony_ci }, 18318c2ecf20Sopenharmony_ci /* Galois Counter Mode */ 18328c2ecf20Sopenharmony_ci { 18338c2ecf20Sopenharmony_ci .aead = { 18348c2ecf20Sopenharmony_ci .base = { 18358c2ecf20Sopenharmony_ci .cra_name = "gcm(aes)", 18368c2ecf20Sopenharmony_ci .cra_driver_name = "gcm-aes-caam-qi2", 18378c2ecf20Sopenharmony_ci .cra_blocksize = 1, 18388c2ecf20Sopenharmony_ci }, 18398c2ecf20Sopenharmony_ci .setkey = gcm_setkey, 18408c2ecf20Sopenharmony_ci .setauthsize = gcm_setauthsize, 18418c2ecf20Sopenharmony_ci .encrypt = aead_encrypt, 18428c2ecf20Sopenharmony_ci .decrypt = aead_decrypt, 18438c2ecf20Sopenharmony_ci .ivsize = 12, 18448c2ecf20Sopenharmony_ci .maxauthsize = AES_BLOCK_SIZE, 18458c2ecf20Sopenharmony_ci }, 18468c2ecf20Sopenharmony_ci .caam = { 18478c2ecf20Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_GCM, 18488c2ecf20Sopenharmony_ci .nodkp = true, 18498c2ecf20Sopenharmony_ci } 18508c2ecf20Sopenharmony_ci }, 18518c2ecf20Sopenharmony_ci /* single-pass ipsec_esp descriptor */ 18528c2ecf20Sopenharmony_ci { 18538c2ecf20Sopenharmony_ci .aead = { 18548c2ecf20Sopenharmony_ci .base = { 18558c2ecf20Sopenharmony_ci .cra_name = "authenc(hmac(md5),cbc(aes))", 18568c2ecf20Sopenharmony_ci .cra_driver_name = "authenc-hmac-md5-" 18578c2ecf20Sopenharmony_ci "cbc-aes-caam-qi2", 18588c2ecf20Sopenharmony_ci .cra_blocksize = AES_BLOCK_SIZE, 18598c2ecf20Sopenharmony_ci }, 18608c2ecf20Sopenharmony_ci .setkey = aead_setkey, 18618c2ecf20Sopenharmony_ci .setauthsize = aead_setauthsize, 18628c2ecf20Sopenharmony_ci .encrypt = aead_encrypt, 18638c2ecf20Sopenharmony_ci .decrypt = aead_decrypt, 18648c2ecf20Sopenharmony_ci .ivsize = AES_BLOCK_SIZE, 18658c2ecf20Sopenharmony_ci .maxauthsize = MD5_DIGEST_SIZE, 18668c2ecf20Sopenharmony_ci }, 18678c2ecf20Sopenharmony_ci .caam = { 18688c2ecf20Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC, 18698c2ecf20Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_MD5 | 18708c2ecf20Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 18718c2ecf20Sopenharmony_ci } 18728c2ecf20Sopenharmony_ci }, 18738c2ecf20Sopenharmony_ci { 18748c2ecf20Sopenharmony_ci .aead = { 18758c2ecf20Sopenharmony_ci .base = { 18768c2ecf20Sopenharmony_ci .cra_name = "echainiv(authenc(hmac(md5)," 18778c2ecf20Sopenharmony_ci "cbc(aes)))", 18788c2ecf20Sopenharmony_ci .cra_driver_name = "echainiv-authenc-hmac-md5-" 18798c2ecf20Sopenharmony_ci "cbc-aes-caam-qi2", 18808c2ecf20Sopenharmony_ci .cra_blocksize = AES_BLOCK_SIZE, 18818c2ecf20Sopenharmony_ci }, 18828c2ecf20Sopenharmony_ci .setkey = aead_setkey, 18838c2ecf20Sopenharmony_ci .setauthsize = aead_setauthsize, 18848c2ecf20Sopenharmony_ci .encrypt = aead_encrypt, 18858c2ecf20Sopenharmony_ci .decrypt = aead_decrypt, 18868c2ecf20Sopenharmony_ci .ivsize = AES_BLOCK_SIZE, 18878c2ecf20Sopenharmony_ci .maxauthsize = MD5_DIGEST_SIZE, 18888c2ecf20Sopenharmony_ci }, 18898c2ecf20Sopenharmony_ci .caam = { 18908c2ecf20Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC, 18918c2ecf20Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_MD5 | 18928c2ecf20Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 18938c2ecf20Sopenharmony_ci .geniv = true, 18948c2ecf20Sopenharmony_ci } 18958c2ecf20Sopenharmony_ci }, 18968c2ecf20Sopenharmony_ci { 18978c2ecf20Sopenharmony_ci .aead = { 18988c2ecf20Sopenharmony_ci .base = { 18998c2ecf20Sopenharmony_ci .cra_name = "authenc(hmac(sha1),cbc(aes))", 19008c2ecf20Sopenharmony_ci .cra_driver_name = "authenc-hmac-sha1-" 19018c2ecf20Sopenharmony_ci "cbc-aes-caam-qi2", 19028c2ecf20Sopenharmony_ci .cra_blocksize = AES_BLOCK_SIZE, 19038c2ecf20Sopenharmony_ci }, 19048c2ecf20Sopenharmony_ci .setkey = aead_setkey, 19058c2ecf20Sopenharmony_ci .setauthsize = aead_setauthsize, 19068c2ecf20Sopenharmony_ci .encrypt = aead_encrypt, 19078c2ecf20Sopenharmony_ci .decrypt = aead_decrypt, 19088c2ecf20Sopenharmony_ci .ivsize = AES_BLOCK_SIZE, 19098c2ecf20Sopenharmony_ci .maxauthsize = SHA1_DIGEST_SIZE, 19108c2ecf20Sopenharmony_ci }, 19118c2ecf20Sopenharmony_ci .caam = { 19128c2ecf20Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC, 19138c2ecf20Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA1 | 19148c2ecf20Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 19158c2ecf20Sopenharmony_ci } 19168c2ecf20Sopenharmony_ci }, 19178c2ecf20Sopenharmony_ci { 19188c2ecf20Sopenharmony_ci .aead = { 19198c2ecf20Sopenharmony_ci .base = { 19208c2ecf20Sopenharmony_ci .cra_name = "echainiv(authenc(hmac(sha1)," 19218c2ecf20Sopenharmony_ci "cbc(aes)))", 19228c2ecf20Sopenharmony_ci .cra_driver_name = "echainiv-authenc-" 19238c2ecf20Sopenharmony_ci "hmac-sha1-cbc-aes-caam-qi2", 19248c2ecf20Sopenharmony_ci .cra_blocksize = AES_BLOCK_SIZE, 19258c2ecf20Sopenharmony_ci }, 19268c2ecf20Sopenharmony_ci .setkey = aead_setkey, 19278c2ecf20Sopenharmony_ci .setauthsize = aead_setauthsize, 19288c2ecf20Sopenharmony_ci .encrypt = aead_encrypt, 19298c2ecf20Sopenharmony_ci .decrypt = aead_decrypt, 19308c2ecf20Sopenharmony_ci .ivsize = AES_BLOCK_SIZE, 19318c2ecf20Sopenharmony_ci .maxauthsize = SHA1_DIGEST_SIZE, 19328c2ecf20Sopenharmony_ci }, 19338c2ecf20Sopenharmony_ci .caam = { 19348c2ecf20Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC, 19358c2ecf20Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA1 | 19368c2ecf20Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 19378c2ecf20Sopenharmony_ci .geniv = true, 19388c2ecf20Sopenharmony_ci }, 19398c2ecf20Sopenharmony_ci }, 19408c2ecf20Sopenharmony_ci { 19418c2ecf20Sopenharmony_ci .aead = { 19428c2ecf20Sopenharmony_ci .base = { 19438c2ecf20Sopenharmony_ci .cra_name = "authenc(hmac(sha224),cbc(aes))", 19448c2ecf20Sopenharmony_ci .cra_driver_name = "authenc-hmac-sha224-" 19458c2ecf20Sopenharmony_ci "cbc-aes-caam-qi2", 19468c2ecf20Sopenharmony_ci .cra_blocksize = AES_BLOCK_SIZE, 19478c2ecf20Sopenharmony_ci }, 19488c2ecf20Sopenharmony_ci .setkey = aead_setkey, 19498c2ecf20Sopenharmony_ci .setauthsize = aead_setauthsize, 19508c2ecf20Sopenharmony_ci .encrypt = aead_encrypt, 19518c2ecf20Sopenharmony_ci .decrypt = aead_decrypt, 19528c2ecf20Sopenharmony_ci .ivsize = AES_BLOCK_SIZE, 19538c2ecf20Sopenharmony_ci .maxauthsize = SHA224_DIGEST_SIZE, 19548c2ecf20Sopenharmony_ci }, 19558c2ecf20Sopenharmony_ci .caam = { 19568c2ecf20Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC, 19578c2ecf20Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA224 | 19588c2ecf20Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 19598c2ecf20Sopenharmony_ci } 19608c2ecf20Sopenharmony_ci }, 19618c2ecf20Sopenharmony_ci { 19628c2ecf20Sopenharmony_ci .aead = { 19638c2ecf20Sopenharmony_ci .base = { 19648c2ecf20Sopenharmony_ci .cra_name = "echainiv(authenc(hmac(sha224)," 19658c2ecf20Sopenharmony_ci "cbc(aes)))", 19668c2ecf20Sopenharmony_ci .cra_driver_name = "echainiv-authenc-" 19678c2ecf20Sopenharmony_ci "hmac-sha224-cbc-aes-caam-qi2", 19688c2ecf20Sopenharmony_ci .cra_blocksize = AES_BLOCK_SIZE, 19698c2ecf20Sopenharmony_ci }, 19708c2ecf20Sopenharmony_ci .setkey = aead_setkey, 19718c2ecf20Sopenharmony_ci .setauthsize = aead_setauthsize, 19728c2ecf20Sopenharmony_ci .encrypt = aead_encrypt, 19738c2ecf20Sopenharmony_ci .decrypt = aead_decrypt, 19748c2ecf20Sopenharmony_ci .ivsize = AES_BLOCK_SIZE, 19758c2ecf20Sopenharmony_ci .maxauthsize = SHA224_DIGEST_SIZE, 19768c2ecf20Sopenharmony_ci }, 19778c2ecf20Sopenharmony_ci .caam = { 19788c2ecf20Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC, 19798c2ecf20Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA224 | 19808c2ecf20Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 19818c2ecf20Sopenharmony_ci .geniv = true, 19828c2ecf20Sopenharmony_ci } 19838c2ecf20Sopenharmony_ci }, 19848c2ecf20Sopenharmony_ci { 19858c2ecf20Sopenharmony_ci .aead = { 19868c2ecf20Sopenharmony_ci .base = { 19878c2ecf20Sopenharmony_ci .cra_name = "authenc(hmac(sha256),cbc(aes))", 19888c2ecf20Sopenharmony_ci .cra_driver_name = "authenc-hmac-sha256-" 19898c2ecf20Sopenharmony_ci "cbc-aes-caam-qi2", 19908c2ecf20Sopenharmony_ci .cra_blocksize = AES_BLOCK_SIZE, 19918c2ecf20Sopenharmony_ci }, 19928c2ecf20Sopenharmony_ci .setkey = aead_setkey, 19938c2ecf20Sopenharmony_ci .setauthsize = aead_setauthsize, 19948c2ecf20Sopenharmony_ci .encrypt = aead_encrypt, 19958c2ecf20Sopenharmony_ci .decrypt = aead_decrypt, 19968c2ecf20Sopenharmony_ci .ivsize = AES_BLOCK_SIZE, 19978c2ecf20Sopenharmony_ci .maxauthsize = SHA256_DIGEST_SIZE, 19988c2ecf20Sopenharmony_ci }, 19998c2ecf20Sopenharmony_ci .caam = { 20008c2ecf20Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC, 20018c2ecf20Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA256 | 20028c2ecf20Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 20038c2ecf20Sopenharmony_ci } 20048c2ecf20Sopenharmony_ci }, 20058c2ecf20Sopenharmony_ci { 20068c2ecf20Sopenharmony_ci .aead = { 20078c2ecf20Sopenharmony_ci .base = { 20088c2ecf20Sopenharmony_ci .cra_name = "echainiv(authenc(hmac(sha256)," 20098c2ecf20Sopenharmony_ci "cbc(aes)))", 20108c2ecf20Sopenharmony_ci .cra_driver_name = "echainiv-authenc-" 20118c2ecf20Sopenharmony_ci "hmac-sha256-cbc-aes-" 20128c2ecf20Sopenharmony_ci "caam-qi2", 20138c2ecf20Sopenharmony_ci .cra_blocksize = AES_BLOCK_SIZE, 20148c2ecf20Sopenharmony_ci }, 20158c2ecf20Sopenharmony_ci .setkey = aead_setkey, 20168c2ecf20Sopenharmony_ci .setauthsize = aead_setauthsize, 20178c2ecf20Sopenharmony_ci .encrypt = aead_encrypt, 20188c2ecf20Sopenharmony_ci .decrypt = aead_decrypt, 20198c2ecf20Sopenharmony_ci .ivsize = AES_BLOCK_SIZE, 20208c2ecf20Sopenharmony_ci .maxauthsize = SHA256_DIGEST_SIZE, 20218c2ecf20Sopenharmony_ci }, 20228c2ecf20Sopenharmony_ci .caam = { 20238c2ecf20Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC, 20248c2ecf20Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA256 | 20258c2ecf20Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 20268c2ecf20Sopenharmony_ci .geniv = true, 20278c2ecf20Sopenharmony_ci } 20288c2ecf20Sopenharmony_ci }, 20298c2ecf20Sopenharmony_ci { 20308c2ecf20Sopenharmony_ci .aead = { 20318c2ecf20Sopenharmony_ci .base = { 20328c2ecf20Sopenharmony_ci .cra_name = "authenc(hmac(sha384),cbc(aes))", 20338c2ecf20Sopenharmony_ci .cra_driver_name = "authenc-hmac-sha384-" 20348c2ecf20Sopenharmony_ci "cbc-aes-caam-qi2", 20358c2ecf20Sopenharmony_ci .cra_blocksize = AES_BLOCK_SIZE, 20368c2ecf20Sopenharmony_ci }, 20378c2ecf20Sopenharmony_ci .setkey = aead_setkey, 20388c2ecf20Sopenharmony_ci .setauthsize = aead_setauthsize, 20398c2ecf20Sopenharmony_ci .encrypt = aead_encrypt, 20408c2ecf20Sopenharmony_ci .decrypt = aead_decrypt, 20418c2ecf20Sopenharmony_ci .ivsize = AES_BLOCK_SIZE, 20428c2ecf20Sopenharmony_ci .maxauthsize = SHA384_DIGEST_SIZE, 20438c2ecf20Sopenharmony_ci }, 20448c2ecf20Sopenharmony_ci .caam = { 20458c2ecf20Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC, 20468c2ecf20Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA384 | 20478c2ecf20Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 20488c2ecf20Sopenharmony_ci } 20498c2ecf20Sopenharmony_ci }, 20508c2ecf20Sopenharmony_ci { 20518c2ecf20Sopenharmony_ci .aead = { 20528c2ecf20Sopenharmony_ci .base = { 20538c2ecf20Sopenharmony_ci .cra_name = "echainiv(authenc(hmac(sha384)," 20548c2ecf20Sopenharmony_ci "cbc(aes)))", 20558c2ecf20Sopenharmony_ci .cra_driver_name = "echainiv-authenc-" 20568c2ecf20Sopenharmony_ci "hmac-sha384-cbc-aes-" 20578c2ecf20Sopenharmony_ci "caam-qi2", 20588c2ecf20Sopenharmony_ci .cra_blocksize = AES_BLOCK_SIZE, 20598c2ecf20Sopenharmony_ci }, 20608c2ecf20Sopenharmony_ci .setkey = aead_setkey, 20618c2ecf20Sopenharmony_ci .setauthsize = aead_setauthsize, 20628c2ecf20Sopenharmony_ci .encrypt = aead_encrypt, 20638c2ecf20Sopenharmony_ci .decrypt = aead_decrypt, 20648c2ecf20Sopenharmony_ci .ivsize = AES_BLOCK_SIZE, 20658c2ecf20Sopenharmony_ci .maxauthsize = SHA384_DIGEST_SIZE, 20668c2ecf20Sopenharmony_ci }, 20678c2ecf20Sopenharmony_ci .caam = { 20688c2ecf20Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC, 20698c2ecf20Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA384 | 20708c2ecf20Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 20718c2ecf20Sopenharmony_ci .geniv = true, 20728c2ecf20Sopenharmony_ci } 20738c2ecf20Sopenharmony_ci }, 20748c2ecf20Sopenharmony_ci { 20758c2ecf20Sopenharmony_ci .aead = { 20768c2ecf20Sopenharmony_ci .base = { 20778c2ecf20Sopenharmony_ci .cra_name = "authenc(hmac(sha512),cbc(aes))", 20788c2ecf20Sopenharmony_ci .cra_driver_name = "authenc-hmac-sha512-" 20798c2ecf20Sopenharmony_ci "cbc-aes-caam-qi2", 20808c2ecf20Sopenharmony_ci .cra_blocksize = AES_BLOCK_SIZE, 20818c2ecf20Sopenharmony_ci }, 20828c2ecf20Sopenharmony_ci .setkey = aead_setkey, 20838c2ecf20Sopenharmony_ci .setauthsize = aead_setauthsize, 20848c2ecf20Sopenharmony_ci .encrypt = aead_encrypt, 20858c2ecf20Sopenharmony_ci .decrypt = aead_decrypt, 20868c2ecf20Sopenharmony_ci .ivsize = AES_BLOCK_SIZE, 20878c2ecf20Sopenharmony_ci .maxauthsize = SHA512_DIGEST_SIZE, 20888c2ecf20Sopenharmony_ci }, 20898c2ecf20Sopenharmony_ci .caam = { 20908c2ecf20Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC, 20918c2ecf20Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA512 | 20928c2ecf20Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 20938c2ecf20Sopenharmony_ci } 20948c2ecf20Sopenharmony_ci }, 20958c2ecf20Sopenharmony_ci { 20968c2ecf20Sopenharmony_ci .aead = { 20978c2ecf20Sopenharmony_ci .base = { 20988c2ecf20Sopenharmony_ci .cra_name = "echainiv(authenc(hmac(sha512)," 20998c2ecf20Sopenharmony_ci "cbc(aes)))", 21008c2ecf20Sopenharmony_ci .cra_driver_name = "echainiv-authenc-" 21018c2ecf20Sopenharmony_ci "hmac-sha512-cbc-aes-" 21028c2ecf20Sopenharmony_ci "caam-qi2", 21038c2ecf20Sopenharmony_ci .cra_blocksize = AES_BLOCK_SIZE, 21048c2ecf20Sopenharmony_ci }, 21058c2ecf20Sopenharmony_ci .setkey = aead_setkey, 21068c2ecf20Sopenharmony_ci .setauthsize = aead_setauthsize, 21078c2ecf20Sopenharmony_ci .encrypt = aead_encrypt, 21088c2ecf20Sopenharmony_ci .decrypt = aead_decrypt, 21098c2ecf20Sopenharmony_ci .ivsize = AES_BLOCK_SIZE, 21108c2ecf20Sopenharmony_ci .maxauthsize = SHA512_DIGEST_SIZE, 21118c2ecf20Sopenharmony_ci }, 21128c2ecf20Sopenharmony_ci .caam = { 21138c2ecf20Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC, 21148c2ecf20Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA512 | 21158c2ecf20Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 21168c2ecf20Sopenharmony_ci .geniv = true, 21178c2ecf20Sopenharmony_ci } 21188c2ecf20Sopenharmony_ci }, 21198c2ecf20Sopenharmony_ci { 21208c2ecf20Sopenharmony_ci .aead = { 21218c2ecf20Sopenharmony_ci .base = { 21228c2ecf20Sopenharmony_ci .cra_name = "authenc(hmac(md5),cbc(des3_ede))", 21238c2ecf20Sopenharmony_ci .cra_driver_name = "authenc-hmac-md5-" 21248c2ecf20Sopenharmony_ci "cbc-des3_ede-caam-qi2", 21258c2ecf20Sopenharmony_ci .cra_blocksize = DES3_EDE_BLOCK_SIZE, 21268c2ecf20Sopenharmony_ci }, 21278c2ecf20Sopenharmony_ci .setkey = des3_aead_setkey, 21288c2ecf20Sopenharmony_ci .setauthsize = aead_setauthsize, 21298c2ecf20Sopenharmony_ci .encrypt = aead_encrypt, 21308c2ecf20Sopenharmony_ci .decrypt = aead_decrypt, 21318c2ecf20Sopenharmony_ci .ivsize = DES3_EDE_BLOCK_SIZE, 21328c2ecf20Sopenharmony_ci .maxauthsize = MD5_DIGEST_SIZE, 21338c2ecf20Sopenharmony_ci }, 21348c2ecf20Sopenharmony_ci .caam = { 21358c2ecf20Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC, 21368c2ecf20Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_MD5 | 21378c2ecf20Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 21388c2ecf20Sopenharmony_ci } 21398c2ecf20Sopenharmony_ci }, 21408c2ecf20Sopenharmony_ci { 21418c2ecf20Sopenharmony_ci .aead = { 21428c2ecf20Sopenharmony_ci .base = { 21438c2ecf20Sopenharmony_ci .cra_name = "echainiv(authenc(hmac(md5)," 21448c2ecf20Sopenharmony_ci "cbc(des3_ede)))", 21458c2ecf20Sopenharmony_ci .cra_driver_name = "echainiv-authenc-hmac-md5-" 21468c2ecf20Sopenharmony_ci "cbc-des3_ede-caam-qi2", 21478c2ecf20Sopenharmony_ci .cra_blocksize = DES3_EDE_BLOCK_SIZE, 21488c2ecf20Sopenharmony_ci }, 21498c2ecf20Sopenharmony_ci .setkey = des3_aead_setkey, 21508c2ecf20Sopenharmony_ci .setauthsize = aead_setauthsize, 21518c2ecf20Sopenharmony_ci .encrypt = aead_encrypt, 21528c2ecf20Sopenharmony_ci .decrypt = aead_decrypt, 21538c2ecf20Sopenharmony_ci .ivsize = DES3_EDE_BLOCK_SIZE, 21548c2ecf20Sopenharmony_ci .maxauthsize = MD5_DIGEST_SIZE, 21558c2ecf20Sopenharmony_ci }, 21568c2ecf20Sopenharmony_ci .caam = { 21578c2ecf20Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC, 21588c2ecf20Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_MD5 | 21598c2ecf20Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 21608c2ecf20Sopenharmony_ci .geniv = true, 21618c2ecf20Sopenharmony_ci } 21628c2ecf20Sopenharmony_ci }, 21638c2ecf20Sopenharmony_ci { 21648c2ecf20Sopenharmony_ci .aead = { 21658c2ecf20Sopenharmony_ci .base = { 21668c2ecf20Sopenharmony_ci .cra_name = "authenc(hmac(sha1)," 21678c2ecf20Sopenharmony_ci "cbc(des3_ede))", 21688c2ecf20Sopenharmony_ci .cra_driver_name = "authenc-hmac-sha1-" 21698c2ecf20Sopenharmony_ci "cbc-des3_ede-caam-qi2", 21708c2ecf20Sopenharmony_ci .cra_blocksize = DES3_EDE_BLOCK_SIZE, 21718c2ecf20Sopenharmony_ci }, 21728c2ecf20Sopenharmony_ci .setkey = des3_aead_setkey, 21738c2ecf20Sopenharmony_ci .setauthsize = aead_setauthsize, 21748c2ecf20Sopenharmony_ci .encrypt = aead_encrypt, 21758c2ecf20Sopenharmony_ci .decrypt = aead_decrypt, 21768c2ecf20Sopenharmony_ci .ivsize = DES3_EDE_BLOCK_SIZE, 21778c2ecf20Sopenharmony_ci .maxauthsize = SHA1_DIGEST_SIZE, 21788c2ecf20Sopenharmony_ci }, 21798c2ecf20Sopenharmony_ci .caam = { 21808c2ecf20Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC, 21818c2ecf20Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA1 | 21828c2ecf20Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 21838c2ecf20Sopenharmony_ci }, 21848c2ecf20Sopenharmony_ci }, 21858c2ecf20Sopenharmony_ci { 21868c2ecf20Sopenharmony_ci .aead = { 21878c2ecf20Sopenharmony_ci .base = { 21888c2ecf20Sopenharmony_ci .cra_name = "echainiv(authenc(hmac(sha1)," 21898c2ecf20Sopenharmony_ci "cbc(des3_ede)))", 21908c2ecf20Sopenharmony_ci .cra_driver_name = "echainiv-authenc-" 21918c2ecf20Sopenharmony_ci "hmac-sha1-" 21928c2ecf20Sopenharmony_ci "cbc-des3_ede-caam-qi2", 21938c2ecf20Sopenharmony_ci .cra_blocksize = DES3_EDE_BLOCK_SIZE, 21948c2ecf20Sopenharmony_ci }, 21958c2ecf20Sopenharmony_ci .setkey = des3_aead_setkey, 21968c2ecf20Sopenharmony_ci .setauthsize = aead_setauthsize, 21978c2ecf20Sopenharmony_ci .encrypt = aead_encrypt, 21988c2ecf20Sopenharmony_ci .decrypt = aead_decrypt, 21998c2ecf20Sopenharmony_ci .ivsize = DES3_EDE_BLOCK_SIZE, 22008c2ecf20Sopenharmony_ci .maxauthsize = SHA1_DIGEST_SIZE, 22018c2ecf20Sopenharmony_ci }, 22028c2ecf20Sopenharmony_ci .caam = { 22038c2ecf20Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC, 22048c2ecf20Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA1 | 22058c2ecf20Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 22068c2ecf20Sopenharmony_ci .geniv = true, 22078c2ecf20Sopenharmony_ci } 22088c2ecf20Sopenharmony_ci }, 22098c2ecf20Sopenharmony_ci { 22108c2ecf20Sopenharmony_ci .aead = { 22118c2ecf20Sopenharmony_ci .base = { 22128c2ecf20Sopenharmony_ci .cra_name = "authenc(hmac(sha224)," 22138c2ecf20Sopenharmony_ci "cbc(des3_ede))", 22148c2ecf20Sopenharmony_ci .cra_driver_name = "authenc-hmac-sha224-" 22158c2ecf20Sopenharmony_ci "cbc-des3_ede-caam-qi2", 22168c2ecf20Sopenharmony_ci .cra_blocksize = DES3_EDE_BLOCK_SIZE, 22178c2ecf20Sopenharmony_ci }, 22188c2ecf20Sopenharmony_ci .setkey = des3_aead_setkey, 22198c2ecf20Sopenharmony_ci .setauthsize = aead_setauthsize, 22208c2ecf20Sopenharmony_ci .encrypt = aead_encrypt, 22218c2ecf20Sopenharmony_ci .decrypt = aead_decrypt, 22228c2ecf20Sopenharmony_ci .ivsize = DES3_EDE_BLOCK_SIZE, 22238c2ecf20Sopenharmony_ci .maxauthsize = SHA224_DIGEST_SIZE, 22248c2ecf20Sopenharmony_ci }, 22258c2ecf20Sopenharmony_ci .caam = { 22268c2ecf20Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC, 22278c2ecf20Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA224 | 22288c2ecf20Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 22298c2ecf20Sopenharmony_ci }, 22308c2ecf20Sopenharmony_ci }, 22318c2ecf20Sopenharmony_ci { 22328c2ecf20Sopenharmony_ci .aead = { 22338c2ecf20Sopenharmony_ci .base = { 22348c2ecf20Sopenharmony_ci .cra_name = "echainiv(authenc(hmac(sha224)," 22358c2ecf20Sopenharmony_ci "cbc(des3_ede)))", 22368c2ecf20Sopenharmony_ci .cra_driver_name = "echainiv-authenc-" 22378c2ecf20Sopenharmony_ci "hmac-sha224-" 22388c2ecf20Sopenharmony_ci "cbc-des3_ede-caam-qi2", 22398c2ecf20Sopenharmony_ci .cra_blocksize = DES3_EDE_BLOCK_SIZE, 22408c2ecf20Sopenharmony_ci }, 22418c2ecf20Sopenharmony_ci .setkey = des3_aead_setkey, 22428c2ecf20Sopenharmony_ci .setauthsize = aead_setauthsize, 22438c2ecf20Sopenharmony_ci .encrypt = aead_encrypt, 22448c2ecf20Sopenharmony_ci .decrypt = aead_decrypt, 22458c2ecf20Sopenharmony_ci .ivsize = DES3_EDE_BLOCK_SIZE, 22468c2ecf20Sopenharmony_ci .maxauthsize = SHA224_DIGEST_SIZE, 22478c2ecf20Sopenharmony_ci }, 22488c2ecf20Sopenharmony_ci .caam = { 22498c2ecf20Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC, 22508c2ecf20Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA224 | 22518c2ecf20Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 22528c2ecf20Sopenharmony_ci .geniv = true, 22538c2ecf20Sopenharmony_ci } 22548c2ecf20Sopenharmony_ci }, 22558c2ecf20Sopenharmony_ci { 22568c2ecf20Sopenharmony_ci .aead = { 22578c2ecf20Sopenharmony_ci .base = { 22588c2ecf20Sopenharmony_ci .cra_name = "authenc(hmac(sha256)," 22598c2ecf20Sopenharmony_ci "cbc(des3_ede))", 22608c2ecf20Sopenharmony_ci .cra_driver_name = "authenc-hmac-sha256-" 22618c2ecf20Sopenharmony_ci "cbc-des3_ede-caam-qi2", 22628c2ecf20Sopenharmony_ci .cra_blocksize = DES3_EDE_BLOCK_SIZE, 22638c2ecf20Sopenharmony_ci }, 22648c2ecf20Sopenharmony_ci .setkey = des3_aead_setkey, 22658c2ecf20Sopenharmony_ci .setauthsize = aead_setauthsize, 22668c2ecf20Sopenharmony_ci .encrypt = aead_encrypt, 22678c2ecf20Sopenharmony_ci .decrypt = aead_decrypt, 22688c2ecf20Sopenharmony_ci .ivsize = DES3_EDE_BLOCK_SIZE, 22698c2ecf20Sopenharmony_ci .maxauthsize = SHA256_DIGEST_SIZE, 22708c2ecf20Sopenharmony_ci }, 22718c2ecf20Sopenharmony_ci .caam = { 22728c2ecf20Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC, 22738c2ecf20Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA256 | 22748c2ecf20Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 22758c2ecf20Sopenharmony_ci }, 22768c2ecf20Sopenharmony_ci }, 22778c2ecf20Sopenharmony_ci { 22788c2ecf20Sopenharmony_ci .aead = { 22798c2ecf20Sopenharmony_ci .base = { 22808c2ecf20Sopenharmony_ci .cra_name = "echainiv(authenc(hmac(sha256)," 22818c2ecf20Sopenharmony_ci "cbc(des3_ede)))", 22828c2ecf20Sopenharmony_ci .cra_driver_name = "echainiv-authenc-" 22838c2ecf20Sopenharmony_ci "hmac-sha256-" 22848c2ecf20Sopenharmony_ci "cbc-des3_ede-caam-qi2", 22858c2ecf20Sopenharmony_ci .cra_blocksize = DES3_EDE_BLOCK_SIZE, 22868c2ecf20Sopenharmony_ci }, 22878c2ecf20Sopenharmony_ci .setkey = des3_aead_setkey, 22888c2ecf20Sopenharmony_ci .setauthsize = aead_setauthsize, 22898c2ecf20Sopenharmony_ci .encrypt = aead_encrypt, 22908c2ecf20Sopenharmony_ci .decrypt = aead_decrypt, 22918c2ecf20Sopenharmony_ci .ivsize = DES3_EDE_BLOCK_SIZE, 22928c2ecf20Sopenharmony_ci .maxauthsize = SHA256_DIGEST_SIZE, 22938c2ecf20Sopenharmony_ci }, 22948c2ecf20Sopenharmony_ci .caam = { 22958c2ecf20Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC, 22968c2ecf20Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA256 | 22978c2ecf20Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 22988c2ecf20Sopenharmony_ci .geniv = true, 22998c2ecf20Sopenharmony_ci } 23008c2ecf20Sopenharmony_ci }, 23018c2ecf20Sopenharmony_ci { 23028c2ecf20Sopenharmony_ci .aead = { 23038c2ecf20Sopenharmony_ci .base = { 23048c2ecf20Sopenharmony_ci .cra_name = "authenc(hmac(sha384)," 23058c2ecf20Sopenharmony_ci "cbc(des3_ede))", 23068c2ecf20Sopenharmony_ci .cra_driver_name = "authenc-hmac-sha384-" 23078c2ecf20Sopenharmony_ci "cbc-des3_ede-caam-qi2", 23088c2ecf20Sopenharmony_ci .cra_blocksize = DES3_EDE_BLOCK_SIZE, 23098c2ecf20Sopenharmony_ci }, 23108c2ecf20Sopenharmony_ci .setkey = des3_aead_setkey, 23118c2ecf20Sopenharmony_ci .setauthsize = aead_setauthsize, 23128c2ecf20Sopenharmony_ci .encrypt = aead_encrypt, 23138c2ecf20Sopenharmony_ci .decrypt = aead_decrypt, 23148c2ecf20Sopenharmony_ci .ivsize = DES3_EDE_BLOCK_SIZE, 23158c2ecf20Sopenharmony_ci .maxauthsize = SHA384_DIGEST_SIZE, 23168c2ecf20Sopenharmony_ci }, 23178c2ecf20Sopenharmony_ci .caam = { 23188c2ecf20Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC, 23198c2ecf20Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA384 | 23208c2ecf20Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 23218c2ecf20Sopenharmony_ci }, 23228c2ecf20Sopenharmony_ci }, 23238c2ecf20Sopenharmony_ci { 23248c2ecf20Sopenharmony_ci .aead = { 23258c2ecf20Sopenharmony_ci .base = { 23268c2ecf20Sopenharmony_ci .cra_name = "echainiv(authenc(hmac(sha384)," 23278c2ecf20Sopenharmony_ci "cbc(des3_ede)))", 23288c2ecf20Sopenharmony_ci .cra_driver_name = "echainiv-authenc-" 23298c2ecf20Sopenharmony_ci "hmac-sha384-" 23308c2ecf20Sopenharmony_ci "cbc-des3_ede-caam-qi2", 23318c2ecf20Sopenharmony_ci .cra_blocksize = DES3_EDE_BLOCK_SIZE, 23328c2ecf20Sopenharmony_ci }, 23338c2ecf20Sopenharmony_ci .setkey = des3_aead_setkey, 23348c2ecf20Sopenharmony_ci .setauthsize = aead_setauthsize, 23358c2ecf20Sopenharmony_ci .encrypt = aead_encrypt, 23368c2ecf20Sopenharmony_ci .decrypt = aead_decrypt, 23378c2ecf20Sopenharmony_ci .ivsize = DES3_EDE_BLOCK_SIZE, 23388c2ecf20Sopenharmony_ci .maxauthsize = SHA384_DIGEST_SIZE, 23398c2ecf20Sopenharmony_ci }, 23408c2ecf20Sopenharmony_ci .caam = { 23418c2ecf20Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC, 23428c2ecf20Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA384 | 23438c2ecf20Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 23448c2ecf20Sopenharmony_ci .geniv = true, 23458c2ecf20Sopenharmony_ci } 23468c2ecf20Sopenharmony_ci }, 23478c2ecf20Sopenharmony_ci { 23488c2ecf20Sopenharmony_ci .aead = { 23498c2ecf20Sopenharmony_ci .base = { 23508c2ecf20Sopenharmony_ci .cra_name = "authenc(hmac(sha512)," 23518c2ecf20Sopenharmony_ci "cbc(des3_ede))", 23528c2ecf20Sopenharmony_ci .cra_driver_name = "authenc-hmac-sha512-" 23538c2ecf20Sopenharmony_ci "cbc-des3_ede-caam-qi2", 23548c2ecf20Sopenharmony_ci .cra_blocksize = DES3_EDE_BLOCK_SIZE, 23558c2ecf20Sopenharmony_ci }, 23568c2ecf20Sopenharmony_ci .setkey = des3_aead_setkey, 23578c2ecf20Sopenharmony_ci .setauthsize = aead_setauthsize, 23588c2ecf20Sopenharmony_ci .encrypt = aead_encrypt, 23598c2ecf20Sopenharmony_ci .decrypt = aead_decrypt, 23608c2ecf20Sopenharmony_ci .ivsize = DES3_EDE_BLOCK_SIZE, 23618c2ecf20Sopenharmony_ci .maxauthsize = SHA512_DIGEST_SIZE, 23628c2ecf20Sopenharmony_ci }, 23638c2ecf20Sopenharmony_ci .caam = { 23648c2ecf20Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC, 23658c2ecf20Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA512 | 23668c2ecf20Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 23678c2ecf20Sopenharmony_ci }, 23688c2ecf20Sopenharmony_ci }, 23698c2ecf20Sopenharmony_ci { 23708c2ecf20Sopenharmony_ci .aead = { 23718c2ecf20Sopenharmony_ci .base = { 23728c2ecf20Sopenharmony_ci .cra_name = "echainiv(authenc(hmac(sha512)," 23738c2ecf20Sopenharmony_ci "cbc(des3_ede)))", 23748c2ecf20Sopenharmony_ci .cra_driver_name = "echainiv-authenc-" 23758c2ecf20Sopenharmony_ci "hmac-sha512-" 23768c2ecf20Sopenharmony_ci "cbc-des3_ede-caam-qi2", 23778c2ecf20Sopenharmony_ci .cra_blocksize = DES3_EDE_BLOCK_SIZE, 23788c2ecf20Sopenharmony_ci }, 23798c2ecf20Sopenharmony_ci .setkey = des3_aead_setkey, 23808c2ecf20Sopenharmony_ci .setauthsize = aead_setauthsize, 23818c2ecf20Sopenharmony_ci .encrypt = aead_encrypt, 23828c2ecf20Sopenharmony_ci .decrypt = aead_decrypt, 23838c2ecf20Sopenharmony_ci .ivsize = DES3_EDE_BLOCK_SIZE, 23848c2ecf20Sopenharmony_ci .maxauthsize = SHA512_DIGEST_SIZE, 23858c2ecf20Sopenharmony_ci }, 23868c2ecf20Sopenharmony_ci .caam = { 23878c2ecf20Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC, 23888c2ecf20Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA512 | 23898c2ecf20Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 23908c2ecf20Sopenharmony_ci .geniv = true, 23918c2ecf20Sopenharmony_ci } 23928c2ecf20Sopenharmony_ci }, 23938c2ecf20Sopenharmony_ci { 23948c2ecf20Sopenharmony_ci .aead = { 23958c2ecf20Sopenharmony_ci .base = { 23968c2ecf20Sopenharmony_ci .cra_name = "authenc(hmac(md5),cbc(des))", 23978c2ecf20Sopenharmony_ci .cra_driver_name = "authenc-hmac-md5-" 23988c2ecf20Sopenharmony_ci "cbc-des-caam-qi2", 23998c2ecf20Sopenharmony_ci .cra_blocksize = DES_BLOCK_SIZE, 24008c2ecf20Sopenharmony_ci }, 24018c2ecf20Sopenharmony_ci .setkey = aead_setkey, 24028c2ecf20Sopenharmony_ci .setauthsize = aead_setauthsize, 24038c2ecf20Sopenharmony_ci .encrypt = aead_encrypt, 24048c2ecf20Sopenharmony_ci .decrypt = aead_decrypt, 24058c2ecf20Sopenharmony_ci .ivsize = DES_BLOCK_SIZE, 24068c2ecf20Sopenharmony_ci .maxauthsize = MD5_DIGEST_SIZE, 24078c2ecf20Sopenharmony_ci }, 24088c2ecf20Sopenharmony_ci .caam = { 24098c2ecf20Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC, 24108c2ecf20Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_MD5 | 24118c2ecf20Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 24128c2ecf20Sopenharmony_ci }, 24138c2ecf20Sopenharmony_ci }, 24148c2ecf20Sopenharmony_ci { 24158c2ecf20Sopenharmony_ci .aead = { 24168c2ecf20Sopenharmony_ci .base = { 24178c2ecf20Sopenharmony_ci .cra_name = "echainiv(authenc(hmac(md5)," 24188c2ecf20Sopenharmony_ci "cbc(des)))", 24198c2ecf20Sopenharmony_ci .cra_driver_name = "echainiv-authenc-hmac-md5-" 24208c2ecf20Sopenharmony_ci "cbc-des-caam-qi2", 24218c2ecf20Sopenharmony_ci .cra_blocksize = DES_BLOCK_SIZE, 24228c2ecf20Sopenharmony_ci }, 24238c2ecf20Sopenharmony_ci .setkey = aead_setkey, 24248c2ecf20Sopenharmony_ci .setauthsize = aead_setauthsize, 24258c2ecf20Sopenharmony_ci .encrypt = aead_encrypt, 24268c2ecf20Sopenharmony_ci .decrypt = aead_decrypt, 24278c2ecf20Sopenharmony_ci .ivsize = DES_BLOCK_SIZE, 24288c2ecf20Sopenharmony_ci .maxauthsize = MD5_DIGEST_SIZE, 24298c2ecf20Sopenharmony_ci }, 24308c2ecf20Sopenharmony_ci .caam = { 24318c2ecf20Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC, 24328c2ecf20Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_MD5 | 24338c2ecf20Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 24348c2ecf20Sopenharmony_ci .geniv = true, 24358c2ecf20Sopenharmony_ci } 24368c2ecf20Sopenharmony_ci }, 24378c2ecf20Sopenharmony_ci { 24388c2ecf20Sopenharmony_ci .aead = { 24398c2ecf20Sopenharmony_ci .base = { 24408c2ecf20Sopenharmony_ci .cra_name = "authenc(hmac(sha1),cbc(des))", 24418c2ecf20Sopenharmony_ci .cra_driver_name = "authenc-hmac-sha1-" 24428c2ecf20Sopenharmony_ci "cbc-des-caam-qi2", 24438c2ecf20Sopenharmony_ci .cra_blocksize = DES_BLOCK_SIZE, 24448c2ecf20Sopenharmony_ci }, 24458c2ecf20Sopenharmony_ci .setkey = aead_setkey, 24468c2ecf20Sopenharmony_ci .setauthsize = aead_setauthsize, 24478c2ecf20Sopenharmony_ci .encrypt = aead_encrypt, 24488c2ecf20Sopenharmony_ci .decrypt = aead_decrypt, 24498c2ecf20Sopenharmony_ci .ivsize = DES_BLOCK_SIZE, 24508c2ecf20Sopenharmony_ci .maxauthsize = SHA1_DIGEST_SIZE, 24518c2ecf20Sopenharmony_ci }, 24528c2ecf20Sopenharmony_ci .caam = { 24538c2ecf20Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC, 24548c2ecf20Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA1 | 24558c2ecf20Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 24568c2ecf20Sopenharmony_ci }, 24578c2ecf20Sopenharmony_ci }, 24588c2ecf20Sopenharmony_ci { 24598c2ecf20Sopenharmony_ci .aead = { 24608c2ecf20Sopenharmony_ci .base = { 24618c2ecf20Sopenharmony_ci .cra_name = "echainiv(authenc(hmac(sha1)," 24628c2ecf20Sopenharmony_ci "cbc(des)))", 24638c2ecf20Sopenharmony_ci .cra_driver_name = "echainiv-authenc-" 24648c2ecf20Sopenharmony_ci "hmac-sha1-cbc-des-caam-qi2", 24658c2ecf20Sopenharmony_ci .cra_blocksize = DES_BLOCK_SIZE, 24668c2ecf20Sopenharmony_ci }, 24678c2ecf20Sopenharmony_ci .setkey = aead_setkey, 24688c2ecf20Sopenharmony_ci .setauthsize = aead_setauthsize, 24698c2ecf20Sopenharmony_ci .encrypt = aead_encrypt, 24708c2ecf20Sopenharmony_ci .decrypt = aead_decrypt, 24718c2ecf20Sopenharmony_ci .ivsize = DES_BLOCK_SIZE, 24728c2ecf20Sopenharmony_ci .maxauthsize = SHA1_DIGEST_SIZE, 24738c2ecf20Sopenharmony_ci }, 24748c2ecf20Sopenharmony_ci .caam = { 24758c2ecf20Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC, 24768c2ecf20Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA1 | 24778c2ecf20Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 24788c2ecf20Sopenharmony_ci .geniv = true, 24798c2ecf20Sopenharmony_ci } 24808c2ecf20Sopenharmony_ci }, 24818c2ecf20Sopenharmony_ci { 24828c2ecf20Sopenharmony_ci .aead = { 24838c2ecf20Sopenharmony_ci .base = { 24848c2ecf20Sopenharmony_ci .cra_name = "authenc(hmac(sha224),cbc(des))", 24858c2ecf20Sopenharmony_ci .cra_driver_name = "authenc-hmac-sha224-" 24868c2ecf20Sopenharmony_ci "cbc-des-caam-qi2", 24878c2ecf20Sopenharmony_ci .cra_blocksize = DES_BLOCK_SIZE, 24888c2ecf20Sopenharmony_ci }, 24898c2ecf20Sopenharmony_ci .setkey = aead_setkey, 24908c2ecf20Sopenharmony_ci .setauthsize = aead_setauthsize, 24918c2ecf20Sopenharmony_ci .encrypt = aead_encrypt, 24928c2ecf20Sopenharmony_ci .decrypt = aead_decrypt, 24938c2ecf20Sopenharmony_ci .ivsize = DES_BLOCK_SIZE, 24948c2ecf20Sopenharmony_ci .maxauthsize = SHA224_DIGEST_SIZE, 24958c2ecf20Sopenharmony_ci }, 24968c2ecf20Sopenharmony_ci .caam = { 24978c2ecf20Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC, 24988c2ecf20Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA224 | 24998c2ecf20Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 25008c2ecf20Sopenharmony_ci }, 25018c2ecf20Sopenharmony_ci }, 25028c2ecf20Sopenharmony_ci { 25038c2ecf20Sopenharmony_ci .aead = { 25048c2ecf20Sopenharmony_ci .base = { 25058c2ecf20Sopenharmony_ci .cra_name = "echainiv(authenc(hmac(sha224)," 25068c2ecf20Sopenharmony_ci "cbc(des)))", 25078c2ecf20Sopenharmony_ci .cra_driver_name = "echainiv-authenc-" 25088c2ecf20Sopenharmony_ci "hmac-sha224-cbc-des-" 25098c2ecf20Sopenharmony_ci "caam-qi2", 25108c2ecf20Sopenharmony_ci .cra_blocksize = DES_BLOCK_SIZE, 25118c2ecf20Sopenharmony_ci }, 25128c2ecf20Sopenharmony_ci .setkey = aead_setkey, 25138c2ecf20Sopenharmony_ci .setauthsize = aead_setauthsize, 25148c2ecf20Sopenharmony_ci .encrypt = aead_encrypt, 25158c2ecf20Sopenharmony_ci .decrypt = aead_decrypt, 25168c2ecf20Sopenharmony_ci .ivsize = DES_BLOCK_SIZE, 25178c2ecf20Sopenharmony_ci .maxauthsize = SHA224_DIGEST_SIZE, 25188c2ecf20Sopenharmony_ci }, 25198c2ecf20Sopenharmony_ci .caam = { 25208c2ecf20Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC, 25218c2ecf20Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA224 | 25228c2ecf20Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 25238c2ecf20Sopenharmony_ci .geniv = true, 25248c2ecf20Sopenharmony_ci } 25258c2ecf20Sopenharmony_ci }, 25268c2ecf20Sopenharmony_ci { 25278c2ecf20Sopenharmony_ci .aead = { 25288c2ecf20Sopenharmony_ci .base = { 25298c2ecf20Sopenharmony_ci .cra_name = "authenc(hmac(sha256),cbc(des))", 25308c2ecf20Sopenharmony_ci .cra_driver_name = "authenc-hmac-sha256-" 25318c2ecf20Sopenharmony_ci "cbc-des-caam-qi2", 25328c2ecf20Sopenharmony_ci .cra_blocksize = DES_BLOCK_SIZE, 25338c2ecf20Sopenharmony_ci }, 25348c2ecf20Sopenharmony_ci .setkey = aead_setkey, 25358c2ecf20Sopenharmony_ci .setauthsize = aead_setauthsize, 25368c2ecf20Sopenharmony_ci .encrypt = aead_encrypt, 25378c2ecf20Sopenharmony_ci .decrypt = aead_decrypt, 25388c2ecf20Sopenharmony_ci .ivsize = DES_BLOCK_SIZE, 25398c2ecf20Sopenharmony_ci .maxauthsize = SHA256_DIGEST_SIZE, 25408c2ecf20Sopenharmony_ci }, 25418c2ecf20Sopenharmony_ci .caam = { 25428c2ecf20Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC, 25438c2ecf20Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA256 | 25448c2ecf20Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 25458c2ecf20Sopenharmony_ci }, 25468c2ecf20Sopenharmony_ci }, 25478c2ecf20Sopenharmony_ci { 25488c2ecf20Sopenharmony_ci .aead = { 25498c2ecf20Sopenharmony_ci .base = { 25508c2ecf20Sopenharmony_ci .cra_name = "echainiv(authenc(hmac(sha256)," 25518c2ecf20Sopenharmony_ci "cbc(des)))", 25528c2ecf20Sopenharmony_ci .cra_driver_name = "echainiv-authenc-" 25538c2ecf20Sopenharmony_ci "hmac-sha256-cbc-des-" 25548c2ecf20Sopenharmony_ci "caam-qi2", 25558c2ecf20Sopenharmony_ci .cra_blocksize = DES_BLOCK_SIZE, 25568c2ecf20Sopenharmony_ci }, 25578c2ecf20Sopenharmony_ci .setkey = aead_setkey, 25588c2ecf20Sopenharmony_ci .setauthsize = aead_setauthsize, 25598c2ecf20Sopenharmony_ci .encrypt = aead_encrypt, 25608c2ecf20Sopenharmony_ci .decrypt = aead_decrypt, 25618c2ecf20Sopenharmony_ci .ivsize = DES_BLOCK_SIZE, 25628c2ecf20Sopenharmony_ci .maxauthsize = SHA256_DIGEST_SIZE, 25638c2ecf20Sopenharmony_ci }, 25648c2ecf20Sopenharmony_ci .caam = { 25658c2ecf20Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC, 25668c2ecf20Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA256 | 25678c2ecf20Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 25688c2ecf20Sopenharmony_ci .geniv = true, 25698c2ecf20Sopenharmony_ci }, 25708c2ecf20Sopenharmony_ci }, 25718c2ecf20Sopenharmony_ci { 25728c2ecf20Sopenharmony_ci .aead = { 25738c2ecf20Sopenharmony_ci .base = { 25748c2ecf20Sopenharmony_ci .cra_name = "authenc(hmac(sha384),cbc(des))", 25758c2ecf20Sopenharmony_ci .cra_driver_name = "authenc-hmac-sha384-" 25768c2ecf20Sopenharmony_ci "cbc-des-caam-qi2", 25778c2ecf20Sopenharmony_ci .cra_blocksize = DES_BLOCK_SIZE, 25788c2ecf20Sopenharmony_ci }, 25798c2ecf20Sopenharmony_ci .setkey = aead_setkey, 25808c2ecf20Sopenharmony_ci .setauthsize = aead_setauthsize, 25818c2ecf20Sopenharmony_ci .encrypt = aead_encrypt, 25828c2ecf20Sopenharmony_ci .decrypt = aead_decrypt, 25838c2ecf20Sopenharmony_ci .ivsize = DES_BLOCK_SIZE, 25848c2ecf20Sopenharmony_ci .maxauthsize = SHA384_DIGEST_SIZE, 25858c2ecf20Sopenharmony_ci }, 25868c2ecf20Sopenharmony_ci .caam = { 25878c2ecf20Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC, 25888c2ecf20Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA384 | 25898c2ecf20Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 25908c2ecf20Sopenharmony_ci }, 25918c2ecf20Sopenharmony_ci }, 25928c2ecf20Sopenharmony_ci { 25938c2ecf20Sopenharmony_ci .aead = { 25948c2ecf20Sopenharmony_ci .base = { 25958c2ecf20Sopenharmony_ci .cra_name = "echainiv(authenc(hmac(sha384)," 25968c2ecf20Sopenharmony_ci "cbc(des)))", 25978c2ecf20Sopenharmony_ci .cra_driver_name = "echainiv-authenc-" 25988c2ecf20Sopenharmony_ci "hmac-sha384-cbc-des-" 25998c2ecf20Sopenharmony_ci "caam-qi2", 26008c2ecf20Sopenharmony_ci .cra_blocksize = DES_BLOCK_SIZE, 26018c2ecf20Sopenharmony_ci }, 26028c2ecf20Sopenharmony_ci .setkey = aead_setkey, 26038c2ecf20Sopenharmony_ci .setauthsize = aead_setauthsize, 26048c2ecf20Sopenharmony_ci .encrypt = aead_encrypt, 26058c2ecf20Sopenharmony_ci .decrypt = aead_decrypt, 26068c2ecf20Sopenharmony_ci .ivsize = DES_BLOCK_SIZE, 26078c2ecf20Sopenharmony_ci .maxauthsize = SHA384_DIGEST_SIZE, 26088c2ecf20Sopenharmony_ci }, 26098c2ecf20Sopenharmony_ci .caam = { 26108c2ecf20Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC, 26118c2ecf20Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA384 | 26128c2ecf20Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 26138c2ecf20Sopenharmony_ci .geniv = true, 26148c2ecf20Sopenharmony_ci } 26158c2ecf20Sopenharmony_ci }, 26168c2ecf20Sopenharmony_ci { 26178c2ecf20Sopenharmony_ci .aead = { 26188c2ecf20Sopenharmony_ci .base = { 26198c2ecf20Sopenharmony_ci .cra_name = "authenc(hmac(sha512),cbc(des))", 26208c2ecf20Sopenharmony_ci .cra_driver_name = "authenc-hmac-sha512-" 26218c2ecf20Sopenharmony_ci "cbc-des-caam-qi2", 26228c2ecf20Sopenharmony_ci .cra_blocksize = DES_BLOCK_SIZE, 26238c2ecf20Sopenharmony_ci }, 26248c2ecf20Sopenharmony_ci .setkey = aead_setkey, 26258c2ecf20Sopenharmony_ci .setauthsize = aead_setauthsize, 26268c2ecf20Sopenharmony_ci .encrypt = aead_encrypt, 26278c2ecf20Sopenharmony_ci .decrypt = aead_decrypt, 26288c2ecf20Sopenharmony_ci .ivsize = DES_BLOCK_SIZE, 26298c2ecf20Sopenharmony_ci .maxauthsize = SHA512_DIGEST_SIZE, 26308c2ecf20Sopenharmony_ci }, 26318c2ecf20Sopenharmony_ci .caam = { 26328c2ecf20Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC, 26338c2ecf20Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA512 | 26348c2ecf20Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 26358c2ecf20Sopenharmony_ci } 26368c2ecf20Sopenharmony_ci }, 26378c2ecf20Sopenharmony_ci { 26388c2ecf20Sopenharmony_ci .aead = { 26398c2ecf20Sopenharmony_ci .base = { 26408c2ecf20Sopenharmony_ci .cra_name = "echainiv(authenc(hmac(sha512)," 26418c2ecf20Sopenharmony_ci "cbc(des)))", 26428c2ecf20Sopenharmony_ci .cra_driver_name = "echainiv-authenc-" 26438c2ecf20Sopenharmony_ci "hmac-sha512-cbc-des-" 26448c2ecf20Sopenharmony_ci "caam-qi2", 26458c2ecf20Sopenharmony_ci .cra_blocksize = DES_BLOCK_SIZE, 26468c2ecf20Sopenharmony_ci }, 26478c2ecf20Sopenharmony_ci .setkey = aead_setkey, 26488c2ecf20Sopenharmony_ci .setauthsize = aead_setauthsize, 26498c2ecf20Sopenharmony_ci .encrypt = aead_encrypt, 26508c2ecf20Sopenharmony_ci .decrypt = aead_decrypt, 26518c2ecf20Sopenharmony_ci .ivsize = DES_BLOCK_SIZE, 26528c2ecf20Sopenharmony_ci .maxauthsize = SHA512_DIGEST_SIZE, 26538c2ecf20Sopenharmony_ci }, 26548c2ecf20Sopenharmony_ci .caam = { 26558c2ecf20Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC, 26568c2ecf20Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA512 | 26578c2ecf20Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 26588c2ecf20Sopenharmony_ci .geniv = true, 26598c2ecf20Sopenharmony_ci } 26608c2ecf20Sopenharmony_ci }, 26618c2ecf20Sopenharmony_ci { 26628c2ecf20Sopenharmony_ci .aead = { 26638c2ecf20Sopenharmony_ci .base = { 26648c2ecf20Sopenharmony_ci .cra_name = "authenc(hmac(md5)," 26658c2ecf20Sopenharmony_ci "rfc3686(ctr(aes)))", 26668c2ecf20Sopenharmony_ci .cra_driver_name = "authenc-hmac-md5-" 26678c2ecf20Sopenharmony_ci "rfc3686-ctr-aes-caam-qi2", 26688c2ecf20Sopenharmony_ci .cra_blocksize = 1, 26698c2ecf20Sopenharmony_ci }, 26708c2ecf20Sopenharmony_ci .setkey = aead_setkey, 26718c2ecf20Sopenharmony_ci .setauthsize = aead_setauthsize, 26728c2ecf20Sopenharmony_ci .encrypt = aead_encrypt, 26738c2ecf20Sopenharmony_ci .decrypt = aead_decrypt, 26748c2ecf20Sopenharmony_ci .ivsize = CTR_RFC3686_IV_SIZE, 26758c2ecf20Sopenharmony_ci .maxauthsize = MD5_DIGEST_SIZE, 26768c2ecf20Sopenharmony_ci }, 26778c2ecf20Sopenharmony_ci .caam = { 26788c2ecf20Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_AES | 26798c2ecf20Sopenharmony_ci OP_ALG_AAI_CTR_MOD128, 26808c2ecf20Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_MD5 | 26818c2ecf20Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 26828c2ecf20Sopenharmony_ci .rfc3686 = true, 26838c2ecf20Sopenharmony_ci }, 26848c2ecf20Sopenharmony_ci }, 26858c2ecf20Sopenharmony_ci { 26868c2ecf20Sopenharmony_ci .aead = { 26878c2ecf20Sopenharmony_ci .base = { 26888c2ecf20Sopenharmony_ci .cra_name = "seqiv(authenc(" 26898c2ecf20Sopenharmony_ci "hmac(md5),rfc3686(ctr(aes))))", 26908c2ecf20Sopenharmony_ci .cra_driver_name = "seqiv-authenc-hmac-md5-" 26918c2ecf20Sopenharmony_ci "rfc3686-ctr-aes-caam-qi2", 26928c2ecf20Sopenharmony_ci .cra_blocksize = 1, 26938c2ecf20Sopenharmony_ci }, 26948c2ecf20Sopenharmony_ci .setkey = aead_setkey, 26958c2ecf20Sopenharmony_ci .setauthsize = aead_setauthsize, 26968c2ecf20Sopenharmony_ci .encrypt = aead_encrypt, 26978c2ecf20Sopenharmony_ci .decrypt = aead_decrypt, 26988c2ecf20Sopenharmony_ci .ivsize = CTR_RFC3686_IV_SIZE, 26998c2ecf20Sopenharmony_ci .maxauthsize = MD5_DIGEST_SIZE, 27008c2ecf20Sopenharmony_ci }, 27018c2ecf20Sopenharmony_ci .caam = { 27028c2ecf20Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_AES | 27038c2ecf20Sopenharmony_ci OP_ALG_AAI_CTR_MOD128, 27048c2ecf20Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_MD5 | 27058c2ecf20Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 27068c2ecf20Sopenharmony_ci .rfc3686 = true, 27078c2ecf20Sopenharmony_ci .geniv = true, 27088c2ecf20Sopenharmony_ci }, 27098c2ecf20Sopenharmony_ci }, 27108c2ecf20Sopenharmony_ci { 27118c2ecf20Sopenharmony_ci .aead = { 27128c2ecf20Sopenharmony_ci .base = { 27138c2ecf20Sopenharmony_ci .cra_name = "authenc(hmac(sha1)," 27148c2ecf20Sopenharmony_ci "rfc3686(ctr(aes)))", 27158c2ecf20Sopenharmony_ci .cra_driver_name = "authenc-hmac-sha1-" 27168c2ecf20Sopenharmony_ci "rfc3686-ctr-aes-caam-qi2", 27178c2ecf20Sopenharmony_ci .cra_blocksize = 1, 27188c2ecf20Sopenharmony_ci }, 27198c2ecf20Sopenharmony_ci .setkey = aead_setkey, 27208c2ecf20Sopenharmony_ci .setauthsize = aead_setauthsize, 27218c2ecf20Sopenharmony_ci .encrypt = aead_encrypt, 27228c2ecf20Sopenharmony_ci .decrypt = aead_decrypt, 27238c2ecf20Sopenharmony_ci .ivsize = CTR_RFC3686_IV_SIZE, 27248c2ecf20Sopenharmony_ci .maxauthsize = SHA1_DIGEST_SIZE, 27258c2ecf20Sopenharmony_ci }, 27268c2ecf20Sopenharmony_ci .caam = { 27278c2ecf20Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_AES | 27288c2ecf20Sopenharmony_ci OP_ALG_AAI_CTR_MOD128, 27298c2ecf20Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA1 | 27308c2ecf20Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 27318c2ecf20Sopenharmony_ci .rfc3686 = true, 27328c2ecf20Sopenharmony_ci }, 27338c2ecf20Sopenharmony_ci }, 27348c2ecf20Sopenharmony_ci { 27358c2ecf20Sopenharmony_ci .aead = { 27368c2ecf20Sopenharmony_ci .base = { 27378c2ecf20Sopenharmony_ci .cra_name = "seqiv(authenc(" 27388c2ecf20Sopenharmony_ci "hmac(sha1),rfc3686(ctr(aes))))", 27398c2ecf20Sopenharmony_ci .cra_driver_name = "seqiv-authenc-hmac-sha1-" 27408c2ecf20Sopenharmony_ci "rfc3686-ctr-aes-caam-qi2", 27418c2ecf20Sopenharmony_ci .cra_blocksize = 1, 27428c2ecf20Sopenharmony_ci }, 27438c2ecf20Sopenharmony_ci .setkey = aead_setkey, 27448c2ecf20Sopenharmony_ci .setauthsize = aead_setauthsize, 27458c2ecf20Sopenharmony_ci .encrypt = aead_encrypt, 27468c2ecf20Sopenharmony_ci .decrypt = aead_decrypt, 27478c2ecf20Sopenharmony_ci .ivsize = CTR_RFC3686_IV_SIZE, 27488c2ecf20Sopenharmony_ci .maxauthsize = SHA1_DIGEST_SIZE, 27498c2ecf20Sopenharmony_ci }, 27508c2ecf20Sopenharmony_ci .caam = { 27518c2ecf20Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_AES | 27528c2ecf20Sopenharmony_ci OP_ALG_AAI_CTR_MOD128, 27538c2ecf20Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA1 | 27548c2ecf20Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 27558c2ecf20Sopenharmony_ci .rfc3686 = true, 27568c2ecf20Sopenharmony_ci .geniv = true, 27578c2ecf20Sopenharmony_ci }, 27588c2ecf20Sopenharmony_ci }, 27598c2ecf20Sopenharmony_ci { 27608c2ecf20Sopenharmony_ci .aead = { 27618c2ecf20Sopenharmony_ci .base = { 27628c2ecf20Sopenharmony_ci .cra_name = "authenc(hmac(sha224)," 27638c2ecf20Sopenharmony_ci "rfc3686(ctr(aes)))", 27648c2ecf20Sopenharmony_ci .cra_driver_name = "authenc-hmac-sha224-" 27658c2ecf20Sopenharmony_ci "rfc3686-ctr-aes-caam-qi2", 27668c2ecf20Sopenharmony_ci .cra_blocksize = 1, 27678c2ecf20Sopenharmony_ci }, 27688c2ecf20Sopenharmony_ci .setkey = aead_setkey, 27698c2ecf20Sopenharmony_ci .setauthsize = aead_setauthsize, 27708c2ecf20Sopenharmony_ci .encrypt = aead_encrypt, 27718c2ecf20Sopenharmony_ci .decrypt = aead_decrypt, 27728c2ecf20Sopenharmony_ci .ivsize = CTR_RFC3686_IV_SIZE, 27738c2ecf20Sopenharmony_ci .maxauthsize = SHA224_DIGEST_SIZE, 27748c2ecf20Sopenharmony_ci }, 27758c2ecf20Sopenharmony_ci .caam = { 27768c2ecf20Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_AES | 27778c2ecf20Sopenharmony_ci OP_ALG_AAI_CTR_MOD128, 27788c2ecf20Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA224 | 27798c2ecf20Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 27808c2ecf20Sopenharmony_ci .rfc3686 = true, 27818c2ecf20Sopenharmony_ci }, 27828c2ecf20Sopenharmony_ci }, 27838c2ecf20Sopenharmony_ci { 27848c2ecf20Sopenharmony_ci .aead = { 27858c2ecf20Sopenharmony_ci .base = { 27868c2ecf20Sopenharmony_ci .cra_name = "seqiv(authenc(" 27878c2ecf20Sopenharmony_ci "hmac(sha224),rfc3686(ctr(aes))))", 27888c2ecf20Sopenharmony_ci .cra_driver_name = "seqiv-authenc-hmac-sha224-" 27898c2ecf20Sopenharmony_ci "rfc3686-ctr-aes-caam-qi2", 27908c2ecf20Sopenharmony_ci .cra_blocksize = 1, 27918c2ecf20Sopenharmony_ci }, 27928c2ecf20Sopenharmony_ci .setkey = aead_setkey, 27938c2ecf20Sopenharmony_ci .setauthsize = aead_setauthsize, 27948c2ecf20Sopenharmony_ci .encrypt = aead_encrypt, 27958c2ecf20Sopenharmony_ci .decrypt = aead_decrypt, 27968c2ecf20Sopenharmony_ci .ivsize = CTR_RFC3686_IV_SIZE, 27978c2ecf20Sopenharmony_ci .maxauthsize = SHA224_DIGEST_SIZE, 27988c2ecf20Sopenharmony_ci }, 27998c2ecf20Sopenharmony_ci .caam = { 28008c2ecf20Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_AES | 28018c2ecf20Sopenharmony_ci OP_ALG_AAI_CTR_MOD128, 28028c2ecf20Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA224 | 28038c2ecf20Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 28048c2ecf20Sopenharmony_ci .rfc3686 = true, 28058c2ecf20Sopenharmony_ci .geniv = true, 28068c2ecf20Sopenharmony_ci }, 28078c2ecf20Sopenharmony_ci }, 28088c2ecf20Sopenharmony_ci { 28098c2ecf20Sopenharmony_ci .aead = { 28108c2ecf20Sopenharmony_ci .base = { 28118c2ecf20Sopenharmony_ci .cra_name = "authenc(hmac(sha256)," 28128c2ecf20Sopenharmony_ci "rfc3686(ctr(aes)))", 28138c2ecf20Sopenharmony_ci .cra_driver_name = "authenc-hmac-sha256-" 28148c2ecf20Sopenharmony_ci "rfc3686-ctr-aes-caam-qi2", 28158c2ecf20Sopenharmony_ci .cra_blocksize = 1, 28168c2ecf20Sopenharmony_ci }, 28178c2ecf20Sopenharmony_ci .setkey = aead_setkey, 28188c2ecf20Sopenharmony_ci .setauthsize = aead_setauthsize, 28198c2ecf20Sopenharmony_ci .encrypt = aead_encrypt, 28208c2ecf20Sopenharmony_ci .decrypt = aead_decrypt, 28218c2ecf20Sopenharmony_ci .ivsize = CTR_RFC3686_IV_SIZE, 28228c2ecf20Sopenharmony_ci .maxauthsize = SHA256_DIGEST_SIZE, 28238c2ecf20Sopenharmony_ci }, 28248c2ecf20Sopenharmony_ci .caam = { 28258c2ecf20Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_AES | 28268c2ecf20Sopenharmony_ci OP_ALG_AAI_CTR_MOD128, 28278c2ecf20Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA256 | 28288c2ecf20Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 28298c2ecf20Sopenharmony_ci .rfc3686 = true, 28308c2ecf20Sopenharmony_ci }, 28318c2ecf20Sopenharmony_ci }, 28328c2ecf20Sopenharmony_ci { 28338c2ecf20Sopenharmony_ci .aead = { 28348c2ecf20Sopenharmony_ci .base = { 28358c2ecf20Sopenharmony_ci .cra_name = "seqiv(authenc(hmac(sha256)," 28368c2ecf20Sopenharmony_ci "rfc3686(ctr(aes))))", 28378c2ecf20Sopenharmony_ci .cra_driver_name = "seqiv-authenc-hmac-sha256-" 28388c2ecf20Sopenharmony_ci "rfc3686-ctr-aes-caam-qi2", 28398c2ecf20Sopenharmony_ci .cra_blocksize = 1, 28408c2ecf20Sopenharmony_ci }, 28418c2ecf20Sopenharmony_ci .setkey = aead_setkey, 28428c2ecf20Sopenharmony_ci .setauthsize = aead_setauthsize, 28438c2ecf20Sopenharmony_ci .encrypt = aead_encrypt, 28448c2ecf20Sopenharmony_ci .decrypt = aead_decrypt, 28458c2ecf20Sopenharmony_ci .ivsize = CTR_RFC3686_IV_SIZE, 28468c2ecf20Sopenharmony_ci .maxauthsize = SHA256_DIGEST_SIZE, 28478c2ecf20Sopenharmony_ci }, 28488c2ecf20Sopenharmony_ci .caam = { 28498c2ecf20Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_AES | 28508c2ecf20Sopenharmony_ci OP_ALG_AAI_CTR_MOD128, 28518c2ecf20Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA256 | 28528c2ecf20Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 28538c2ecf20Sopenharmony_ci .rfc3686 = true, 28548c2ecf20Sopenharmony_ci .geniv = true, 28558c2ecf20Sopenharmony_ci }, 28568c2ecf20Sopenharmony_ci }, 28578c2ecf20Sopenharmony_ci { 28588c2ecf20Sopenharmony_ci .aead = { 28598c2ecf20Sopenharmony_ci .base = { 28608c2ecf20Sopenharmony_ci .cra_name = "authenc(hmac(sha384)," 28618c2ecf20Sopenharmony_ci "rfc3686(ctr(aes)))", 28628c2ecf20Sopenharmony_ci .cra_driver_name = "authenc-hmac-sha384-" 28638c2ecf20Sopenharmony_ci "rfc3686-ctr-aes-caam-qi2", 28648c2ecf20Sopenharmony_ci .cra_blocksize = 1, 28658c2ecf20Sopenharmony_ci }, 28668c2ecf20Sopenharmony_ci .setkey = aead_setkey, 28678c2ecf20Sopenharmony_ci .setauthsize = aead_setauthsize, 28688c2ecf20Sopenharmony_ci .encrypt = aead_encrypt, 28698c2ecf20Sopenharmony_ci .decrypt = aead_decrypt, 28708c2ecf20Sopenharmony_ci .ivsize = CTR_RFC3686_IV_SIZE, 28718c2ecf20Sopenharmony_ci .maxauthsize = SHA384_DIGEST_SIZE, 28728c2ecf20Sopenharmony_ci }, 28738c2ecf20Sopenharmony_ci .caam = { 28748c2ecf20Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_AES | 28758c2ecf20Sopenharmony_ci OP_ALG_AAI_CTR_MOD128, 28768c2ecf20Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA384 | 28778c2ecf20Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 28788c2ecf20Sopenharmony_ci .rfc3686 = true, 28798c2ecf20Sopenharmony_ci }, 28808c2ecf20Sopenharmony_ci }, 28818c2ecf20Sopenharmony_ci { 28828c2ecf20Sopenharmony_ci .aead = { 28838c2ecf20Sopenharmony_ci .base = { 28848c2ecf20Sopenharmony_ci .cra_name = "seqiv(authenc(hmac(sha384)," 28858c2ecf20Sopenharmony_ci "rfc3686(ctr(aes))))", 28868c2ecf20Sopenharmony_ci .cra_driver_name = "seqiv-authenc-hmac-sha384-" 28878c2ecf20Sopenharmony_ci "rfc3686-ctr-aes-caam-qi2", 28888c2ecf20Sopenharmony_ci .cra_blocksize = 1, 28898c2ecf20Sopenharmony_ci }, 28908c2ecf20Sopenharmony_ci .setkey = aead_setkey, 28918c2ecf20Sopenharmony_ci .setauthsize = aead_setauthsize, 28928c2ecf20Sopenharmony_ci .encrypt = aead_encrypt, 28938c2ecf20Sopenharmony_ci .decrypt = aead_decrypt, 28948c2ecf20Sopenharmony_ci .ivsize = CTR_RFC3686_IV_SIZE, 28958c2ecf20Sopenharmony_ci .maxauthsize = SHA384_DIGEST_SIZE, 28968c2ecf20Sopenharmony_ci }, 28978c2ecf20Sopenharmony_ci .caam = { 28988c2ecf20Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_AES | 28998c2ecf20Sopenharmony_ci OP_ALG_AAI_CTR_MOD128, 29008c2ecf20Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA384 | 29018c2ecf20Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 29028c2ecf20Sopenharmony_ci .rfc3686 = true, 29038c2ecf20Sopenharmony_ci .geniv = true, 29048c2ecf20Sopenharmony_ci }, 29058c2ecf20Sopenharmony_ci }, 29068c2ecf20Sopenharmony_ci { 29078c2ecf20Sopenharmony_ci .aead = { 29088c2ecf20Sopenharmony_ci .base = { 29098c2ecf20Sopenharmony_ci .cra_name = "rfc7539(chacha20,poly1305)", 29108c2ecf20Sopenharmony_ci .cra_driver_name = "rfc7539-chacha20-poly1305-" 29118c2ecf20Sopenharmony_ci "caam-qi2", 29128c2ecf20Sopenharmony_ci .cra_blocksize = 1, 29138c2ecf20Sopenharmony_ci }, 29148c2ecf20Sopenharmony_ci .setkey = chachapoly_setkey, 29158c2ecf20Sopenharmony_ci .setauthsize = chachapoly_setauthsize, 29168c2ecf20Sopenharmony_ci .encrypt = aead_encrypt, 29178c2ecf20Sopenharmony_ci .decrypt = aead_decrypt, 29188c2ecf20Sopenharmony_ci .ivsize = CHACHAPOLY_IV_SIZE, 29198c2ecf20Sopenharmony_ci .maxauthsize = POLY1305_DIGEST_SIZE, 29208c2ecf20Sopenharmony_ci }, 29218c2ecf20Sopenharmony_ci .caam = { 29228c2ecf20Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_CHACHA20 | 29238c2ecf20Sopenharmony_ci OP_ALG_AAI_AEAD, 29248c2ecf20Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_POLY1305 | 29258c2ecf20Sopenharmony_ci OP_ALG_AAI_AEAD, 29268c2ecf20Sopenharmony_ci .nodkp = true, 29278c2ecf20Sopenharmony_ci }, 29288c2ecf20Sopenharmony_ci }, 29298c2ecf20Sopenharmony_ci { 29308c2ecf20Sopenharmony_ci .aead = { 29318c2ecf20Sopenharmony_ci .base = { 29328c2ecf20Sopenharmony_ci .cra_name = "rfc7539esp(chacha20,poly1305)", 29338c2ecf20Sopenharmony_ci .cra_driver_name = "rfc7539esp-chacha20-" 29348c2ecf20Sopenharmony_ci "poly1305-caam-qi2", 29358c2ecf20Sopenharmony_ci .cra_blocksize = 1, 29368c2ecf20Sopenharmony_ci }, 29378c2ecf20Sopenharmony_ci .setkey = chachapoly_setkey, 29388c2ecf20Sopenharmony_ci .setauthsize = chachapoly_setauthsize, 29398c2ecf20Sopenharmony_ci .encrypt = aead_encrypt, 29408c2ecf20Sopenharmony_ci .decrypt = aead_decrypt, 29418c2ecf20Sopenharmony_ci .ivsize = 8, 29428c2ecf20Sopenharmony_ci .maxauthsize = POLY1305_DIGEST_SIZE, 29438c2ecf20Sopenharmony_ci }, 29448c2ecf20Sopenharmony_ci .caam = { 29458c2ecf20Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_CHACHA20 | 29468c2ecf20Sopenharmony_ci OP_ALG_AAI_AEAD, 29478c2ecf20Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_POLY1305 | 29488c2ecf20Sopenharmony_ci OP_ALG_AAI_AEAD, 29498c2ecf20Sopenharmony_ci .nodkp = true, 29508c2ecf20Sopenharmony_ci }, 29518c2ecf20Sopenharmony_ci }, 29528c2ecf20Sopenharmony_ci { 29538c2ecf20Sopenharmony_ci .aead = { 29548c2ecf20Sopenharmony_ci .base = { 29558c2ecf20Sopenharmony_ci .cra_name = "authenc(hmac(sha512)," 29568c2ecf20Sopenharmony_ci "rfc3686(ctr(aes)))", 29578c2ecf20Sopenharmony_ci .cra_driver_name = "authenc-hmac-sha512-" 29588c2ecf20Sopenharmony_ci "rfc3686-ctr-aes-caam-qi2", 29598c2ecf20Sopenharmony_ci .cra_blocksize = 1, 29608c2ecf20Sopenharmony_ci }, 29618c2ecf20Sopenharmony_ci .setkey = aead_setkey, 29628c2ecf20Sopenharmony_ci .setauthsize = aead_setauthsize, 29638c2ecf20Sopenharmony_ci .encrypt = aead_encrypt, 29648c2ecf20Sopenharmony_ci .decrypt = aead_decrypt, 29658c2ecf20Sopenharmony_ci .ivsize = CTR_RFC3686_IV_SIZE, 29668c2ecf20Sopenharmony_ci .maxauthsize = SHA512_DIGEST_SIZE, 29678c2ecf20Sopenharmony_ci }, 29688c2ecf20Sopenharmony_ci .caam = { 29698c2ecf20Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_AES | 29708c2ecf20Sopenharmony_ci OP_ALG_AAI_CTR_MOD128, 29718c2ecf20Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA512 | 29728c2ecf20Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 29738c2ecf20Sopenharmony_ci .rfc3686 = true, 29748c2ecf20Sopenharmony_ci }, 29758c2ecf20Sopenharmony_ci }, 29768c2ecf20Sopenharmony_ci { 29778c2ecf20Sopenharmony_ci .aead = { 29788c2ecf20Sopenharmony_ci .base = { 29798c2ecf20Sopenharmony_ci .cra_name = "seqiv(authenc(hmac(sha512)," 29808c2ecf20Sopenharmony_ci "rfc3686(ctr(aes))))", 29818c2ecf20Sopenharmony_ci .cra_driver_name = "seqiv-authenc-hmac-sha512-" 29828c2ecf20Sopenharmony_ci "rfc3686-ctr-aes-caam-qi2", 29838c2ecf20Sopenharmony_ci .cra_blocksize = 1, 29848c2ecf20Sopenharmony_ci }, 29858c2ecf20Sopenharmony_ci .setkey = aead_setkey, 29868c2ecf20Sopenharmony_ci .setauthsize = aead_setauthsize, 29878c2ecf20Sopenharmony_ci .encrypt = aead_encrypt, 29888c2ecf20Sopenharmony_ci .decrypt = aead_decrypt, 29898c2ecf20Sopenharmony_ci .ivsize = CTR_RFC3686_IV_SIZE, 29908c2ecf20Sopenharmony_ci .maxauthsize = SHA512_DIGEST_SIZE, 29918c2ecf20Sopenharmony_ci }, 29928c2ecf20Sopenharmony_ci .caam = { 29938c2ecf20Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_AES | 29948c2ecf20Sopenharmony_ci OP_ALG_AAI_CTR_MOD128, 29958c2ecf20Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA512 | 29968c2ecf20Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 29978c2ecf20Sopenharmony_ci .rfc3686 = true, 29988c2ecf20Sopenharmony_ci .geniv = true, 29998c2ecf20Sopenharmony_ci }, 30008c2ecf20Sopenharmony_ci }, 30018c2ecf20Sopenharmony_ci}; 30028c2ecf20Sopenharmony_ci 30038c2ecf20Sopenharmony_cistatic void caam_skcipher_alg_init(struct caam_skcipher_alg *t_alg) 30048c2ecf20Sopenharmony_ci{ 30058c2ecf20Sopenharmony_ci struct skcipher_alg *alg = &t_alg->skcipher; 30068c2ecf20Sopenharmony_ci 30078c2ecf20Sopenharmony_ci alg->base.cra_module = THIS_MODULE; 30088c2ecf20Sopenharmony_ci alg->base.cra_priority = CAAM_CRA_PRIORITY; 30098c2ecf20Sopenharmony_ci alg->base.cra_ctxsize = sizeof(struct caam_ctx); 30108c2ecf20Sopenharmony_ci alg->base.cra_flags |= (CRYPTO_ALG_ASYNC | CRYPTO_ALG_ALLOCATES_MEMORY | 30118c2ecf20Sopenharmony_ci CRYPTO_ALG_KERN_DRIVER_ONLY); 30128c2ecf20Sopenharmony_ci 30138c2ecf20Sopenharmony_ci alg->init = caam_cra_init_skcipher; 30148c2ecf20Sopenharmony_ci alg->exit = caam_cra_exit; 30158c2ecf20Sopenharmony_ci} 30168c2ecf20Sopenharmony_ci 30178c2ecf20Sopenharmony_cistatic void caam_aead_alg_init(struct caam_aead_alg *t_alg) 30188c2ecf20Sopenharmony_ci{ 30198c2ecf20Sopenharmony_ci struct aead_alg *alg = &t_alg->aead; 30208c2ecf20Sopenharmony_ci 30218c2ecf20Sopenharmony_ci alg->base.cra_module = THIS_MODULE; 30228c2ecf20Sopenharmony_ci alg->base.cra_priority = CAAM_CRA_PRIORITY; 30238c2ecf20Sopenharmony_ci alg->base.cra_ctxsize = sizeof(struct caam_ctx); 30248c2ecf20Sopenharmony_ci alg->base.cra_flags = CRYPTO_ALG_ASYNC | CRYPTO_ALG_ALLOCATES_MEMORY | 30258c2ecf20Sopenharmony_ci CRYPTO_ALG_KERN_DRIVER_ONLY; 30268c2ecf20Sopenharmony_ci 30278c2ecf20Sopenharmony_ci alg->init = caam_cra_init_aead; 30288c2ecf20Sopenharmony_ci alg->exit = caam_cra_exit_aead; 30298c2ecf20Sopenharmony_ci} 30308c2ecf20Sopenharmony_ci 30318c2ecf20Sopenharmony_ci/* max hash key is max split key size */ 30328c2ecf20Sopenharmony_ci#define CAAM_MAX_HASH_KEY_SIZE (SHA512_DIGEST_SIZE * 2) 30338c2ecf20Sopenharmony_ci 30348c2ecf20Sopenharmony_ci#define CAAM_MAX_HASH_BLOCK_SIZE SHA512_BLOCK_SIZE 30358c2ecf20Sopenharmony_ci 30368c2ecf20Sopenharmony_ci/* caam context sizes for hashes: running digest + 8 */ 30378c2ecf20Sopenharmony_ci#define HASH_MSG_LEN 8 30388c2ecf20Sopenharmony_ci#define MAX_CTX_LEN (HASH_MSG_LEN + SHA512_DIGEST_SIZE) 30398c2ecf20Sopenharmony_ci 30408c2ecf20Sopenharmony_cienum hash_optype { 30418c2ecf20Sopenharmony_ci UPDATE = 0, 30428c2ecf20Sopenharmony_ci UPDATE_FIRST, 30438c2ecf20Sopenharmony_ci FINALIZE, 30448c2ecf20Sopenharmony_ci DIGEST, 30458c2ecf20Sopenharmony_ci HASH_NUM_OP 30468c2ecf20Sopenharmony_ci}; 30478c2ecf20Sopenharmony_ci 30488c2ecf20Sopenharmony_ci/** 30498c2ecf20Sopenharmony_ci * struct caam_hash_ctx - ahash per-session context 30508c2ecf20Sopenharmony_ci * @flc: Flow Contexts array 30518c2ecf20Sopenharmony_ci * @key: authentication key 30528c2ecf20Sopenharmony_ci * @flc_dma: I/O virtual addresses of the Flow Contexts 30538c2ecf20Sopenharmony_ci * @dev: dpseci device 30548c2ecf20Sopenharmony_ci * @ctx_len: size of Context Register 30558c2ecf20Sopenharmony_ci * @adata: hashing algorithm details 30568c2ecf20Sopenharmony_ci */ 30578c2ecf20Sopenharmony_cistruct caam_hash_ctx { 30588c2ecf20Sopenharmony_ci struct caam_flc flc[HASH_NUM_OP]; 30598c2ecf20Sopenharmony_ci u8 key[CAAM_MAX_HASH_BLOCK_SIZE] ____cacheline_aligned; 30608c2ecf20Sopenharmony_ci dma_addr_t flc_dma[HASH_NUM_OP]; 30618c2ecf20Sopenharmony_ci struct device *dev; 30628c2ecf20Sopenharmony_ci int ctx_len; 30638c2ecf20Sopenharmony_ci struct alginfo adata; 30648c2ecf20Sopenharmony_ci}; 30658c2ecf20Sopenharmony_ci 30668c2ecf20Sopenharmony_ci/* ahash state */ 30678c2ecf20Sopenharmony_cistruct caam_hash_state { 30688c2ecf20Sopenharmony_ci struct caam_request caam_req; 30698c2ecf20Sopenharmony_ci dma_addr_t buf_dma; 30708c2ecf20Sopenharmony_ci dma_addr_t ctx_dma; 30718c2ecf20Sopenharmony_ci int ctx_dma_len; 30728c2ecf20Sopenharmony_ci u8 buf[CAAM_MAX_HASH_BLOCK_SIZE] ____cacheline_aligned; 30738c2ecf20Sopenharmony_ci int buflen; 30748c2ecf20Sopenharmony_ci int next_buflen; 30758c2ecf20Sopenharmony_ci u8 caam_ctx[MAX_CTX_LEN] ____cacheline_aligned; 30768c2ecf20Sopenharmony_ci int (*update)(struct ahash_request *req); 30778c2ecf20Sopenharmony_ci int (*final)(struct ahash_request *req); 30788c2ecf20Sopenharmony_ci int (*finup)(struct ahash_request *req); 30798c2ecf20Sopenharmony_ci}; 30808c2ecf20Sopenharmony_ci 30818c2ecf20Sopenharmony_cistruct caam_export_state { 30828c2ecf20Sopenharmony_ci u8 buf[CAAM_MAX_HASH_BLOCK_SIZE]; 30838c2ecf20Sopenharmony_ci u8 caam_ctx[MAX_CTX_LEN]; 30848c2ecf20Sopenharmony_ci int buflen; 30858c2ecf20Sopenharmony_ci int (*update)(struct ahash_request *req); 30868c2ecf20Sopenharmony_ci int (*final)(struct ahash_request *req); 30878c2ecf20Sopenharmony_ci int (*finup)(struct ahash_request *req); 30888c2ecf20Sopenharmony_ci}; 30898c2ecf20Sopenharmony_ci 30908c2ecf20Sopenharmony_ci/* Map current buffer in state (if length > 0) and put it in link table */ 30918c2ecf20Sopenharmony_cistatic inline int buf_map_to_qm_sg(struct device *dev, 30928c2ecf20Sopenharmony_ci struct dpaa2_sg_entry *qm_sg, 30938c2ecf20Sopenharmony_ci struct caam_hash_state *state) 30948c2ecf20Sopenharmony_ci{ 30958c2ecf20Sopenharmony_ci int buflen = state->buflen; 30968c2ecf20Sopenharmony_ci 30978c2ecf20Sopenharmony_ci if (!buflen) 30988c2ecf20Sopenharmony_ci return 0; 30998c2ecf20Sopenharmony_ci 31008c2ecf20Sopenharmony_ci state->buf_dma = dma_map_single(dev, state->buf, buflen, 31018c2ecf20Sopenharmony_ci DMA_TO_DEVICE); 31028c2ecf20Sopenharmony_ci if (dma_mapping_error(dev, state->buf_dma)) { 31038c2ecf20Sopenharmony_ci dev_err(dev, "unable to map buf\n"); 31048c2ecf20Sopenharmony_ci state->buf_dma = 0; 31058c2ecf20Sopenharmony_ci return -ENOMEM; 31068c2ecf20Sopenharmony_ci } 31078c2ecf20Sopenharmony_ci 31088c2ecf20Sopenharmony_ci dma_to_qm_sg_one(qm_sg, state->buf_dma, buflen, 0); 31098c2ecf20Sopenharmony_ci 31108c2ecf20Sopenharmony_ci return 0; 31118c2ecf20Sopenharmony_ci} 31128c2ecf20Sopenharmony_ci 31138c2ecf20Sopenharmony_ci/* Map state->caam_ctx, and add it to link table */ 31148c2ecf20Sopenharmony_cistatic inline int ctx_map_to_qm_sg(struct device *dev, 31158c2ecf20Sopenharmony_ci struct caam_hash_state *state, int ctx_len, 31168c2ecf20Sopenharmony_ci struct dpaa2_sg_entry *qm_sg, u32 flag) 31178c2ecf20Sopenharmony_ci{ 31188c2ecf20Sopenharmony_ci state->ctx_dma_len = ctx_len; 31198c2ecf20Sopenharmony_ci state->ctx_dma = dma_map_single(dev, state->caam_ctx, ctx_len, flag); 31208c2ecf20Sopenharmony_ci if (dma_mapping_error(dev, state->ctx_dma)) { 31218c2ecf20Sopenharmony_ci dev_err(dev, "unable to map ctx\n"); 31228c2ecf20Sopenharmony_ci state->ctx_dma = 0; 31238c2ecf20Sopenharmony_ci return -ENOMEM; 31248c2ecf20Sopenharmony_ci } 31258c2ecf20Sopenharmony_ci 31268c2ecf20Sopenharmony_ci dma_to_qm_sg_one(qm_sg, state->ctx_dma, ctx_len, 0); 31278c2ecf20Sopenharmony_ci 31288c2ecf20Sopenharmony_ci return 0; 31298c2ecf20Sopenharmony_ci} 31308c2ecf20Sopenharmony_ci 31318c2ecf20Sopenharmony_cistatic int ahash_set_sh_desc(struct crypto_ahash *ahash) 31328c2ecf20Sopenharmony_ci{ 31338c2ecf20Sopenharmony_ci struct caam_hash_ctx *ctx = crypto_ahash_ctx(ahash); 31348c2ecf20Sopenharmony_ci int digestsize = crypto_ahash_digestsize(ahash); 31358c2ecf20Sopenharmony_ci struct dpaa2_caam_priv *priv = dev_get_drvdata(ctx->dev); 31368c2ecf20Sopenharmony_ci struct caam_flc *flc; 31378c2ecf20Sopenharmony_ci u32 *desc; 31388c2ecf20Sopenharmony_ci 31398c2ecf20Sopenharmony_ci /* ahash_update shared descriptor */ 31408c2ecf20Sopenharmony_ci flc = &ctx->flc[UPDATE]; 31418c2ecf20Sopenharmony_ci desc = flc->sh_desc; 31428c2ecf20Sopenharmony_ci cnstr_shdsc_ahash(desc, &ctx->adata, OP_ALG_AS_UPDATE, ctx->ctx_len, 31438c2ecf20Sopenharmony_ci ctx->ctx_len, true, priv->sec_attr.era); 31448c2ecf20Sopenharmony_ci flc->flc[1] = cpu_to_caam32(desc_len(desc)); /* SDL */ 31458c2ecf20Sopenharmony_ci dma_sync_single_for_device(ctx->dev, ctx->flc_dma[UPDATE], 31468c2ecf20Sopenharmony_ci desc_bytes(desc), DMA_BIDIRECTIONAL); 31478c2ecf20Sopenharmony_ci print_hex_dump_debug("ahash update shdesc@" __stringify(__LINE__)": ", 31488c2ecf20Sopenharmony_ci DUMP_PREFIX_ADDRESS, 16, 4, desc, desc_bytes(desc), 31498c2ecf20Sopenharmony_ci 1); 31508c2ecf20Sopenharmony_ci 31518c2ecf20Sopenharmony_ci /* ahash_update_first shared descriptor */ 31528c2ecf20Sopenharmony_ci flc = &ctx->flc[UPDATE_FIRST]; 31538c2ecf20Sopenharmony_ci desc = flc->sh_desc; 31548c2ecf20Sopenharmony_ci cnstr_shdsc_ahash(desc, &ctx->adata, OP_ALG_AS_INIT, ctx->ctx_len, 31558c2ecf20Sopenharmony_ci ctx->ctx_len, false, priv->sec_attr.era); 31568c2ecf20Sopenharmony_ci flc->flc[1] = cpu_to_caam32(desc_len(desc)); /* SDL */ 31578c2ecf20Sopenharmony_ci dma_sync_single_for_device(ctx->dev, ctx->flc_dma[UPDATE_FIRST], 31588c2ecf20Sopenharmony_ci desc_bytes(desc), DMA_BIDIRECTIONAL); 31598c2ecf20Sopenharmony_ci print_hex_dump_debug("ahash update first shdesc@" __stringify(__LINE__)": ", 31608c2ecf20Sopenharmony_ci DUMP_PREFIX_ADDRESS, 16, 4, desc, desc_bytes(desc), 31618c2ecf20Sopenharmony_ci 1); 31628c2ecf20Sopenharmony_ci 31638c2ecf20Sopenharmony_ci /* ahash_final shared descriptor */ 31648c2ecf20Sopenharmony_ci flc = &ctx->flc[FINALIZE]; 31658c2ecf20Sopenharmony_ci desc = flc->sh_desc; 31668c2ecf20Sopenharmony_ci cnstr_shdsc_ahash(desc, &ctx->adata, OP_ALG_AS_FINALIZE, digestsize, 31678c2ecf20Sopenharmony_ci ctx->ctx_len, true, priv->sec_attr.era); 31688c2ecf20Sopenharmony_ci flc->flc[1] = cpu_to_caam32(desc_len(desc)); /* SDL */ 31698c2ecf20Sopenharmony_ci dma_sync_single_for_device(ctx->dev, ctx->flc_dma[FINALIZE], 31708c2ecf20Sopenharmony_ci desc_bytes(desc), DMA_BIDIRECTIONAL); 31718c2ecf20Sopenharmony_ci print_hex_dump_debug("ahash final shdesc@" __stringify(__LINE__)": ", 31728c2ecf20Sopenharmony_ci DUMP_PREFIX_ADDRESS, 16, 4, desc, desc_bytes(desc), 31738c2ecf20Sopenharmony_ci 1); 31748c2ecf20Sopenharmony_ci 31758c2ecf20Sopenharmony_ci /* ahash_digest shared descriptor */ 31768c2ecf20Sopenharmony_ci flc = &ctx->flc[DIGEST]; 31778c2ecf20Sopenharmony_ci desc = flc->sh_desc; 31788c2ecf20Sopenharmony_ci cnstr_shdsc_ahash(desc, &ctx->adata, OP_ALG_AS_INITFINAL, digestsize, 31798c2ecf20Sopenharmony_ci ctx->ctx_len, false, priv->sec_attr.era); 31808c2ecf20Sopenharmony_ci flc->flc[1] = cpu_to_caam32(desc_len(desc)); /* SDL */ 31818c2ecf20Sopenharmony_ci dma_sync_single_for_device(ctx->dev, ctx->flc_dma[DIGEST], 31828c2ecf20Sopenharmony_ci desc_bytes(desc), DMA_BIDIRECTIONAL); 31838c2ecf20Sopenharmony_ci print_hex_dump_debug("ahash digest shdesc@" __stringify(__LINE__)": ", 31848c2ecf20Sopenharmony_ci DUMP_PREFIX_ADDRESS, 16, 4, desc, desc_bytes(desc), 31858c2ecf20Sopenharmony_ci 1); 31868c2ecf20Sopenharmony_ci 31878c2ecf20Sopenharmony_ci return 0; 31888c2ecf20Sopenharmony_ci} 31898c2ecf20Sopenharmony_ci 31908c2ecf20Sopenharmony_cistruct split_key_sh_result { 31918c2ecf20Sopenharmony_ci struct completion completion; 31928c2ecf20Sopenharmony_ci int err; 31938c2ecf20Sopenharmony_ci struct device *dev; 31948c2ecf20Sopenharmony_ci}; 31958c2ecf20Sopenharmony_ci 31968c2ecf20Sopenharmony_cistatic void split_key_sh_done(void *cbk_ctx, u32 err) 31978c2ecf20Sopenharmony_ci{ 31988c2ecf20Sopenharmony_ci struct split_key_sh_result *res = cbk_ctx; 31998c2ecf20Sopenharmony_ci 32008c2ecf20Sopenharmony_ci dev_dbg(res->dev, "%s %d: err 0x%x\n", __func__, __LINE__, err); 32018c2ecf20Sopenharmony_ci 32028c2ecf20Sopenharmony_ci res->err = err ? caam_qi2_strstatus(res->dev, err) : 0; 32038c2ecf20Sopenharmony_ci complete(&res->completion); 32048c2ecf20Sopenharmony_ci} 32058c2ecf20Sopenharmony_ci 32068c2ecf20Sopenharmony_ci/* Digest hash size if it is too large */ 32078c2ecf20Sopenharmony_cistatic int hash_digest_key(struct caam_hash_ctx *ctx, u32 *keylen, u8 *key, 32088c2ecf20Sopenharmony_ci u32 digestsize) 32098c2ecf20Sopenharmony_ci{ 32108c2ecf20Sopenharmony_ci struct caam_request *req_ctx; 32118c2ecf20Sopenharmony_ci u32 *desc; 32128c2ecf20Sopenharmony_ci struct split_key_sh_result result; 32138c2ecf20Sopenharmony_ci dma_addr_t key_dma; 32148c2ecf20Sopenharmony_ci struct caam_flc *flc; 32158c2ecf20Sopenharmony_ci dma_addr_t flc_dma; 32168c2ecf20Sopenharmony_ci int ret = -ENOMEM; 32178c2ecf20Sopenharmony_ci struct dpaa2_fl_entry *in_fle, *out_fle; 32188c2ecf20Sopenharmony_ci 32198c2ecf20Sopenharmony_ci req_ctx = kzalloc(sizeof(*req_ctx), GFP_KERNEL | GFP_DMA); 32208c2ecf20Sopenharmony_ci if (!req_ctx) 32218c2ecf20Sopenharmony_ci return -ENOMEM; 32228c2ecf20Sopenharmony_ci 32238c2ecf20Sopenharmony_ci in_fle = &req_ctx->fd_flt[1]; 32248c2ecf20Sopenharmony_ci out_fle = &req_ctx->fd_flt[0]; 32258c2ecf20Sopenharmony_ci 32268c2ecf20Sopenharmony_ci flc = kzalloc(sizeof(*flc), GFP_KERNEL | GFP_DMA); 32278c2ecf20Sopenharmony_ci if (!flc) 32288c2ecf20Sopenharmony_ci goto err_flc; 32298c2ecf20Sopenharmony_ci 32308c2ecf20Sopenharmony_ci key_dma = dma_map_single(ctx->dev, key, *keylen, DMA_BIDIRECTIONAL); 32318c2ecf20Sopenharmony_ci if (dma_mapping_error(ctx->dev, key_dma)) { 32328c2ecf20Sopenharmony_ci dev_err(ctx->dev, "unable to map key memory\n"); 32338c2ecf20Sopenharmony_ci goto err_key_dma; 32348c2ecf20Sopenharmony_ci } 32358c2ecf20Sopenharmony_ci 32368c2ecf20Sopenharmony_ci desc = flc->sh_desc; 32378c2ecf20Sopenharmony_ci 32388c2ecf20Sopenharmony_ci init_sh_desc(desc, 0); 32398c2ecf20Sopenharmony_ci 32408c2ecf20Sopenharmony_ci /* descriptor to perform unkeyed hash on key_in */ 32418c2ecf20Sopenharmony_ci append_operation(desc, ctx->adata.algtype | OP_ALG_ENCRYPT | 32428c2ecf20Sopenharmony_ci OP_ALG_AS_INITFINAL); 32438c2ecf20Sopenharmony_ci append_seq_fifo_load(desc, *keylen, FIFOLD_CLASS_CLASS2 | 32448c2ecf20Sopenharmony_ci FIFOLD_TYPE_LAST2 | FIFOLD_TYPE_MSG); 32458c2ecf20Sopenharmony_ci append_seq_store(desc, digestsize, LDST_CLASS_2_CCB | 32468c2ecf20Sopenharmony_ci LDST_SRCDST_BYTE_CONTEXT); 32478c2ecf20Sopenharmony_ci 32488c2ecf20Sopenharmony_ci flc->flc[1] = cpu_to_caam32(desc_len(desc)); /* SDL */ 32498c2ecf20Sopenharmony_ci flc_dma = dma_map_single(ctx->dev, flc, sizeof(flc->flc) + 32508c2ecf20Sopenharmony_ci desc_bytes(desc), DMA_TO_DEVICE); 32518c2ecf20Sopenharmony_ci if (dma_mapping_error(ctx->dev, flc_dma)) { 32528c2ecf20Sopenharmony_ci dev_err(ctx->dev, "unable to map shared descriptor\n"); 32538c2ecf20Sopenharmony_ci goto err_flc_dma; 32548c2ecf20Sopenharmony_ci } 32558c2ecf20Sopenharmony_ci 32568c2ecf20Sopenharmony_ci dpaa2_fl_set_final(in_fle, true); 32578c2ecf20Sopenharmony_ci dpaa2_fl_set_format(in_fle, dpaa2_fl_single); 32588c2ecf20Sopenharmony_ci dpaa2_fl_set_addr(in_fle, key_dma); 32598c2ecf20Sopenharmony_ci dpaa2_fl_set_len(in_fle, *keylen); 32608c2ecf20Sopenharmony_ci dpaa2_fl_set_format(out_fle, dpaa2_fl_single); 32618c2ecf20Sopenharmony_ci dpaa2_fl_set_addr(out_fle, key_dma); 32628c2ecf20Sopenharmony_ci dpaa2_fl_set_len(out_fle, digestsize); 32638c2ecf20Sopenharmony_ci 32648c2ecf20Sopenharmony_ci print_hex_dump_debug("key_in@" __stringify(__LINE__)": ", 32658c2ecf20Sopenharmony_ci DUMP_PREFIX_ADDRESS, 16, 4, key, *keylen, 1); 32668c2ecf20Sopenharmony_ci print_hex_dump_debug("shdesc@" __stringify(__LINE__)": ", 32678c2ecf20Sopenharmony_ci DUMP_PREFIX_ADDRESS, 16, 4, desc, desc_bytes(desc), 32688c2ecf20Sopenharmony_ci 1); 32698c2ecf20Sopenharmony_ci 32708c2ecf20Sopenharmony_ci result.err = 0; 32718c2ecf20Sopenharmony_ci init_completion(&result.completion); 32728c2ecf20Sopenharmony_ci result.dev = ctx->dev; 32738c2ecf20Sopenharmony_ci 32748c2ecf20Sopenharmony_ci req_ctx->flc = flc; 32758c2ecf20Sopenharmony_ci req_ctx->flc_dma = flc_dma; 32768c2ecf20Sopenharmony_ci req_ctx->cbk = split_key_sh_done; 32778c2ecf20Sopenharmony_ci req_ctx->ctx = &result; 32788c2ecf20Sopenharmony_ci 32798c2ecf20Sopenharmony_ci ret = dpaa2_caam_enqueue(ctx->dev, req_ctx); 32808c2ecf20Sopenharmony_ci if (ret == -EINPROGRESS) { 32818c2ecf20Sopenharmony_ci /* in progress */ 32828c2ecf20Sopenharmony_ci wait_for_completion(&result.completion); 32838c2ecf20Sopenharmony_ci ret = result.err; 32848c2ecf20Sopenharmony_ci print_hex_dump_debug("digested key@" __stringify(__LINE__)": ", 32858c2ecf20Sopenharmony_ci DUMP_PREFIX_ADDRESS, 16, 4, key, 32868c2ecf20Sopenharmony_ci digestsize, 1); 32878c2ecf20Sopenharmony_ci } 32888c2ecf20Sopenharmony_ci 32898c2ecf20Sopenharmony_ci dma_unmap_single(ctx->dev, flc_dma, sizeof(flc->flc) + desc_bytes(desc), 32908c2ecf20Sopenharmony_ci DMA_TO_DEVICE); 32918c2ecf20Sopenharmony_cierr_flc_dma: 32928c2ecf20Sopenharmony_ci dma_unmap_single(ctx->dev, key_dma, *keylen, DMA_BIDIRECTIONAL); 32938c2ecf20Sopenharmony_cierr_key_dma: 32948c2ecf20Sopenharmony_ci kfree(flc); 32958c2ecf20Sopenharmony_cierr_flc: 32968c2ecf20Sopenharmony_ci kfree(req_ctx); 32978c2ecf20Sopenharmony_ci 32988c2ecf20Sopenharmony_ci *keylen = digestsize; 32998c2ecf20Sopenharmony_ci 33008c2ecf20Sopenharmony_ci return ret; 33018c2ecf20Sopenharmony_ci} 33028c2ecf20Sopenharmony_ci 33038c2ecf20Sopenharmony_cistatic int ahash_setkey(struct crypto_ahash *ahash, const u8 *key, 33048c2ecf20Sopenharmony_ci unsigned int keylen) 33058c2ecf20Sopenharmony_ci{ 33068c2ecf20Sopenharmony_ci struct caam_hash_ctx *ctx = crypto_ahash_ctx(ahash); 33078c2ecf20Sopenharmony_ci unsigned int blocksize = crypto_tfm_alg_blocksize(&ahash->base); 33088c2ecf20Sopenharmony_ci unsigned int digestsize = crypto_ahash_digestsize(ahash); 33098c2ecf20Sopenharmony_ci int ret; 33108c2ecf20Sopenharmony_ci u8 *hashed_key = NULL; 33118c2ecf20Sopenharmony_ci 33128c2ecf20Sopenharmony_ci dev_dbg(ctx->dev, "keylen %d blocksize %d\n", keylen, blocksize); 33138c2ecf20Sopenharmony_ci 33148c2ecf20Sopenharmony_ci if (keylen > blocksize) { 33158c2ecf20Sopenharmony_ci hashed_key = kmemdup(key, keylen, GFP_KERNEL | GFP_DMA); 33168c2ecf20Sopenharmony_ci if (!hashed_key) 33178c2ecf20Sopenharmony_ci return -ENOMEM; 33188c2ecf20Sopenharmony_ci ret = hash_digest_key(ctx, &keylen, hashed_key, digestsize); 33198c2ecf20Sopenharmony_ci if (ret) 33208c2ecf20Sopenharmony_ci goto bad_free_key; 33218c2ecf20Sopenharmony_ci key = hashed_key; 33228c2ecf20Sopenharmony_ci } 33238c2ecf20Sopenharmony_ci 33248c2ecf20Sopenharmony_ci ctx->adata.keylen = keylen; 33258c2ecf20Sopenharmony_ci ctx->adata.keylen_pad = split_key_len(ctx->adata.algtype & 33268c2ecf20Sopenharmony_ci OP_ALG_ALGSEL_MASK); 33278c2ecf20Sopenharmony_ci if (ctx->adata.keylen_pad > CAAM_MAX_HASH_KEY_SIZE) 33288c2ecf20Sopenharmony_ci goto bad_free_key; 33298c2ecf20Sopenharmony_ci 33308c2ecf20Sopenharmony_ci ctx->adata.key_virt = key; 33318c2ecf20Sopenharmony_ci ctx->adata.key_inline = true; 33328c2ecf20Sopenharmony_ci 33338c2ecf20Sopenharmony_ci /* 33348c2ecf20Sopenharmony_ci * In case |user key| > |derived key|, using DKP<imm,imm> would result 33358c2ecf20Sopenharmony_ci * in invalid opcodes (last bytes of user key) in the resulting 33368c2ecf20Sopenharmony_ci * descriptor. Use DKP<ptr,imm> instead => both virtual and dma key 33378c2ecf20Sopenharmony_ci * addresses are needed. 33388c2ecf20Sopenharmony_ci */ 33398c2ecf20Sopenharmony_ci if (keylen > ctx->adata.keylen_pad) { 33408c2ecf20Sopenharmony_ci memcpy(ctx->key, key, keylen); 33418c2ecf20Sopenharmony_ci dma_sync_single_for_device(ctx->dev, ctx->adata.key_dma, 33428c2ecf20Sopenharmony_ci ctx->adata.keylen_pad, 33438c2ecf20Sopenharmony_ci DMA_TO_DEVICE); 33448c2ecf20Sopenharmony_ci } 33458c2ecf20Sopenharmony_ci 33468c2ecf20Sopenharmony_ci ret = ahash_set_sh_desc(ahash); 33478c2ecf20Sopenharmony_ci kfree(hashed_key); 33488c2ecf20Sopenharmony_ci return ret; 33498c2ecf20Sopenharmony_cibad_free_key: 33508c2ecf20Sopenharmony_ci kfree(hashed_key); 33518c2ecf20Sopenharmony_ci return -EINVAL; 33528c2ecf20Sopenharmony_ci} 33538c2ecf20Sopenharmony_ci 33548c2ecf20Sopenharmony_cistatic inline void ahash_unmap(struct device *dev, struct ahash_edesc *edesc, 33558c2ecf20Sopenharmony_ci struct ahash_request *req) 33568c2ecf20Sopenharmony_ci{ 33578c2ecf20Sopenharmony_ci struct caam_hash_state *state = ahash_request_ctx(req); 33588c2ecf20Sopenharmony_ci 33598c2ecf20Sopenharmony_ci if (edesc->src_nents) 33608c2ecf20Sopenharmony_ci dma_unmap_sg(dev, req->src, edesc->src_nents, DMA_TO_DEVICE); 33618c2ecf20Sopenharmony_ci 33628c2ecf20Sopenharmony_ci if (edesc->qm_sg_bytes) 33638c2ecf20Sopenharmony_ci dma_unmap_single(dev, edesc->qm_sg_dma, edesc->qm_sg_bytes, 33648c2ecf20Sopenharmony_ci DMA_TO_DEVICE); 33658c2ecf20Sopenharmony_ci 33668c2ecf20Sopenharmony_ci if (state->buf_dma) { 33678c2ecf20Sopenharmony_ci dma_unmap_single(dev, state->buf_dma, state->buflen, 33688c2ecf20Sopenharmony_ci DMA_TO_DEVICE); 33698c2ecf20Sopenharmony_ci state->buf_dma = 0; 33708c2ecf20Sopenharmony_ci } 33718c2ecf20Sopenharmony_ci} 33728c2ecf20Sopenharmony_ci 33738c2ecf20Sopenharmony_cistatic inline void ahash_unmap_ctx(struct device *dev, 33748c2ecf20Sopenharmony_ci struct ahash_edesc *edesc, 33758c2ecf20Sopenharmony_ci struct ahash_request *req, u32 flag) 33768c2ecf20Sopenharmony_ci{ 33778c2ecf20Sopenharmony_ci struct caam_hash_state *state = ahash_request_ctx(req); 33788c2ecf20Sopenharmony_ci 33798c2ecf20Sopenharmony_ci if (state->ctx_dma) { 33808c2ecf20Sopenharmony_ci dma_unmap_single(dev, state->ctx_dma, state->ctx_dma_len, flag); 33818c2ecf20Sopenharmony_ci state->ctx_dma = 0; 33828c2ecf20Sopenharmony_ci } 33838c2ecf20Sopenharmony_ci ahash_unmap(dev, edesc, req); 33848c2ecf20Sopenharmony_ci} 33858c2ecf20Sopenharmony_ci 33868c2ecf20Sopenharmony_cistatic void ahash_done(void *cbk_ctx, u32 status) 33878c2ecf20Sopenharmony_ci{ 33888c2ecf20Sopenharmony_ci struct crypto_async_request *areq = cbk_ctx; 33898c2ecf20Sopenharmony_ci struct ahash_request *req = ahash_request_cast(areq); 33908c2ecf20Sopenharmony_ci struct crypto_ahash *ahash = crypto_ahash_reqtfm(req); 33918c2ecf20Sopenharmony_ci struct caam_hash_state *state = ahash_request_ctx(req); 33928c2ecf20Sopenharmony_ci struct ahash_edesc *edesc = state->caam_req.edesc; 33938c2ecf20Sopenharmony_ci struct caam_hash_ctx *ctx = crypto_ahash_ctx(ahash); 33948c2ecf20Sopenharmony_ci int digestsize = crypto_ahash_digestsize(ahash); 33958c2ecf20Sopenharmony_ci int ecode = 0; 33968c2ecf20Sopenharmony_ci 33978c2ecf20Sopenharmony_ci dev_dbg(ctx->dev, "%s %d: err 0x%x\n", __func__, __LINE__, status); 33988c2ecf20Sopenharmony_ci 33998c2ecf20Sopenharmony_ci if (unlikely(status)) 34008c2ecf20Sopenharmony_ci ecode = caam_qi2_strstatus(ctx->dev, status); 34018c2ecf20Sopenharmony_ci 34028c2ecf20Sopenharmony_ci ahash_unmap_ctx(ctx->dev, edesc, req, DMA_FROM_DEVICE); 34038c2ecf20Sopenharmony_ci memcpy(req->result, state->caam_ctx, digestsize); 34048c2ecf20Sopenharmony_ci qi_cache_free(edesc); 34058c2ecf20Sopenharmony_ci 34068c2ecf20Sopenharmony_ci print_hex_dump_debug("ctx@" __stringify(__LINE__)": ", 34078c2ecf20Sopenharmony_ci DUMP_PREFIX_ADDRESS, 16, 4, state->caam_ctx, 34088c2ecf20Sopenharmony_ci ctx->ctx_len, 1); 34098c2ecf20Sopenharmony_ci 34108c2ecf20Sopenharmony_ci req->base.complete(&req->base, ecode); 34118c2ecf20Sopenharmony_ci} 34128c2ecf20Sopenharmony_ci 34138c2ecf20Sopenharmony_cistatic void ahash_done_bi(void *cbk_ctx, u32 status) 34148c2ecf20Sopenharmony_ci{ 34158c2ecf20Sopenharmony_ci struct crypto_async_request *areq = cbk_ctx; 34168c2ecf20Sopenharmony_ci struct ahash_request *req = ahash_request_cast(areq); 34178c2ecf20Sopenharmony_ci struct crypto_ahash *ahash = crypto_ahash_reqtfm(req); 34188c2ecf20Sopenharmony_ci struct caam_hash_state *state = ahash_request_ctx(req); 34198c2ecf20Sopenharmony_ci struct ahash_edesc *edesc = state->caam_req.edesc; 34208c2ecf20Sopenharmony_ci struct caam_hash_ctx *ctx = crypto_ahash_ctx(ahash); 34218c2ecf20Sopenharmony_ci int ecode = 0; 34228c2ecf20Sopenharmony_ci 34238c2ecf20Sopenharmony_ci dev_dbg(ctx->dev, "%s %d: err 0x%x\n", __func__, __LINE__, status); 34248c2ecf20Sopenharmony_ci 34258c2ecf20Sopenharmony_ci if (unlikely(status)) 34268c2ecf20Sopenharmony_ci ecode = caam_qi2_strstatus(ctx->dev, status); 34278c2ecf20Sopenharmony_ci 34288c2ecf20Sopenharmony_ci ahash_unmap_ctx(ctx->dev, edesc, req, DMA_BIDIRECTIONAL); 34298c2ecf20Sopenharmony_ci qi_cache_free(edesc); 34308c2ecf20Sopenharmony_ci 34318c2ecf20Sopenharmony_ci scatterwalk_map_and_copy(state->buf, req->src, 34328c2ecf20Sopenharmony_ci req->nbytes - state->next_buflen, 34338c2ecf20Sopenharmony_ci state->next_buflen, 0); 34348c2ecf20Sopenharmony_ci state->buflen = state->next_buflen; 34358c2ecf20Sopenharmony_ci 34368c2ecf20Sopenharmony_ci print_hex_dump_debug("buf@" __stringify(__LINE__)": ", 34378c2ecf20Sopenharmony_ci DUMP_PREFIX_ADDRESS, 16, 4, state->buf, 34388c2ecf20Sopenharmony_ci state->buflen, 1); 34398c2ecf20Sopenharmony_ci 34408c2ecf20Sopenharmony_ci print_hex_dump_debug("ctx@" __stringify(__LINE__)": ", 34418c2ecf20Sopenharmony_ci DUMP_PREFIX_ADDRESS, 16, 4, state->caam_ctx, 34428c2ecf20Sopenharmony_ci ctx->ctx_len, 1); 34438c2ecf20Sopenharmony_ci if (req->result) 34448c2ecf20Sopenharmony_ci print_hex_dump_debug("result@" __stringify(__LINE__)": ", 34458c2ecf20Sopenharmony_ci DUMP_PREFIX_ADDRESS, 16, 4, req->result, 34468c2ecf20Sopenharmony_ci crypto_ahash_digestsize(ahash), 1); 34478c2ecf20Sopenharmony_ci 34488c2ecf20Sopenharmony_ci req->base.complete(&req->base, ecode); 34498c2ecf20Sopenharmony_ci} 34508c2ecf20Sopenharmony_ci 34518c2ecf20Sopenharmony_cistatic void ahash_done_ctx_src(void *cbk_ctx, u32 status) 34528c2ecf20Sopenharmony_ci{ 34538c2ecf20Sopenharmony_ci struct crypto_async_request *areq = cbk_ctx; 34548c2ecf20Sopenharmony_ci struct ahash_request *req = ahash_request_cast(areq); 34558c2ecf20Sopenharmony_ci struct crypto_ahash *ahash = crypto_ahash_reqtfm(req); 34568c2ecf20Sopenharmony_ci struct caam_hash_state *state = ahash_request_ctx(req); 34578c2ecf20Sopenharmony_ci struct ahash_edesc *edesc = state->caam_req.edesc; 34588c2ecf20Sopenharmony_ci struct caam_hash_ctx *ctx = crypto_ahash_ctx(ahash); 34598c2ecf20Sopenharmony_ci int digestsize = crypto_ahash_digestsize(ahash); 34608c2ecf20Sopenharmony_ci int ecode = 0; 34618c2ecf20Sopenharmony_ci 34628c2ecf20Sopenharmony_ci dev_dbg(ctx->dev, "%s %d: err 0x%x\n", __func__, __LINE__, status); 34638c2ecf20Sopenharmony_ci 34648c2ecf20Sopenharmony_ci if (unlikely(status)) 34658c2ecf20Sopenharmony_ci ecode = caam_qi2_strstatus(ctx->dev, status); 34668c2ecf20Sopenharmony_ci 34678c2ecf20Sopenharmony_ci ahash_unmap_ctx(ctx->dev, edesc, req, DMA_BIDIRECTIONAL); 34688c2ecf20Sopenharmony_ci memcpy(req->result, state->caam_ctx, digestsize); 34698c2ecf20Sopenharmony_ci qi_cache_free(edesc); 34708c2ecf20Sopenharmony_ci 34718c2ecf20Sopenharmony_ci print_hex_dump_debug("ctx@" __stringify(__LINE__)": ", 34728c2ecf20Sopenharmony_ci DUMP_PREFIX_ADDRESS, 16, 4, state->caam_ctx, 34738c2ecf20Sopenharmony_ci ctx->ctx_len, 1); 34748c2ecf20Sopenharmony_ci 34758c2ecf20Sopenharmony_ci req->base.complete(&req->base, ecode); 34768c2ecf20Sopenharmony_ci} 34778c2ecf20Sopenharmony_ci 34788c2ecf20Sopenharmony_cistatic void ahash_done_ctx_dst(void *cbk_ctx, u32 status) 34798c2ecf20Sopenharmony_ci{ 34808c2ecf20Sopenharmony_ci struct crypto_async_request *areq = cbk_ctx; 34818c2ecf20Sopenharmony_ci struct ahash_request *req = ahash_request_cast(areq); 34828c2ecf20Sopenharmony_ci struct crypto_ahash *ahash = crypto_ahash_reqtfm(req); 34838c2ecf20Sopenharmony_ci struct caam_hash_state *state = ahash_request_ctx(req); 34848c2ecf20Sopenharmony_ci struct ahash_edesc *edesc = state->caam_req.edesc; 34858c2ecf20Sopenharmony_ci struct caam_hash_ctx *ctx = crypto_ahash_ctx(ahash); 34868c2ecf20Sopenharmony_ci int ecode = 0; 34878c2ecf20Sopenharmony_ci 34888c2ecf20Sopenharmony_ci dev_dbg(ctx->dev, "%s %d: err 0x%x\n", __func__, __LINE__, status); 34898c2ecf20Sopenharmony_ci 34908c2ecf20Sopenharmony_ci if (unlikely(status)) 34918c2ecf20Sopenharmony_ci ecode = caam_qi2_strstatus(ctx->dev, status); 34928c2ecf20Sopenharmony_ci 34938c2ecf20Sopenharmony_ci ahash_unmap_ctx(ctx->dev, edesc, req, DMA_FROM_DEVICE); 34948c2ecf20Sopenharmony_ci qi_cache_free(edesc); 34958c2ecf20Sopenharmony_ci 34968c2ecf20Sopenharmony_ci scatterwalk_map_and_copy(state->buf, req->src, 34978c2ecf20Sopenharmony_ci req->nbytes - state->next_buflen, 34988c2ecf20Sopenharmony_ci state->next_buflen, 0); 34998c2ecf20Sopenharmony_ci state->buflen = state->next_buflen; 35008c2ecf20Sopenharmony_ci 35018c2ecf20Sopenharmony_ci print_hex_dump_debug("buf@" __stringify(__LINE__)": ", 35028c2ecf20Sopenharmony_ci DUMP_PREFIX_ADDRESS, 16, 4, state->buf, 35038c2ecf20Sopenharmony_ci state->buflen, 1); 35048c2ecf20Sopenharmony_ci 35058c2ecf20Sopenharmony_ci print_hex_dump_debug("ctx@" __stringify(__LINE__)": ", 35068c2ecf20Sopenharmony_ci DUMP_PREFIX_ADDRESS, 16, 4, state->caam_ctx, 35078c2ecf20Sopenharmony_ci ctx->ctx_len, 1); 35088c2ecf20Sopenharmony_ci if (req->result) 35098c2ecf20Sopenharmony_ci print_hex_dump_debug("result@" __stringify(__LINE__)": ", 35108c2ecf20Sopenharmony_ci DUMP_PREFIX_ADDRESS, 16, 4, req->result, 35118c2ecf20Sopenharmony_ci crypto_ahash_digestsize(ahash), 1); 35128c2ecf20Sopenharmony_ci 35138c2ecf20Sopenharmony_ci req->base.complete(&req->base, ecode); 35148c2ecf20Sopenharmony_ci} 35158c2ecf20Sopenharmony_ci 35168c2ecf20Sopenharmony_cistatic int ahash_update_ctx(struct ahash_request *req) 35178c2ecf20Sopenharmony_ci{ 35188c2ecf20Sopenharmony_ci struct crypto_ahash *ahash = crypto_ahash_reqtfm(req); 35198c2ecf20Sopenharmony_ci struct caam_hash_ctx *ctx = crypto_ahash_ctx(ahash); 35208c2ecf20Sopenharmony_ci struct caam_hash_state *state = ahash_request_ctx(req); 35218c2ecf20Sopenharmony_ci struct caam_request *req_ctx = &state->caam_req; 35228c2ecf20Sopenharmony_ci struct dpaa2_fl_entry *in_fle = &req_ctx->fd_flt[1]; 35238c2ecf20Sopenharmony_ci struct dpaa2_fl_entry *out_fle = &req_ctx->fd_flt[0]; 35248c2ecf20Sopenharmony_ci gfp_t flags = (req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP) ? 35258c2ecf20Sopenharmony_ci GFP_KERNEL : GFP_ATOMIC; 35268c2ecf20Sopenharmony_ci u8 *buf = state->buf; 35278c2ecf20Sopenharmony_ci int *buflen = &state->buflen; 35288c2ecf20Sopenharmony_ci int *next_buflen = &state->next_buflen; 35298c2ecf20Sopenharmony_ci int in_len = *buflen + req->nbytes, to_hash; 35308c2ecf20Sopenharmony_ci int src_nents, mapped_nents, qm_sg_bytes, qm_sg_src_index; 35318c2ecf20Sopenharmony_ci struct ahash_edesc *edesc; 35328c2ecf20Sopenharmony_ci int ret = 0; 35338c2ecf20Sopenharmony_ci 35348c2ecf20Sopenharmony_ci *next_buflen = in_len & (crypto_tfm_alg_blocksize(&ahash->base) - 1); 35358c2ecf20Sopenharmony_ci to_hash = in_len - *next_buflen; 35368c2ecf20Sopenharmony_ci 35378c2ecf20Sopenharmony_ci if (to_hash) { 35388c2ecf20Sopenharmony_ci struct dpaa2_sg_entry *sg_table; 35398c2ecf20Sopenharmony_ci int src_len = req->nbytes - *next_buflen; 35408c2ecf20Sopenharmony_ci 35418c2ecf20Sopenharmony_ci src_nents = sg_nents_for_len(req->src, src_len); 35428c2ecf20Sopenharmony_ci if (src_nents < 0) { 35438c2ecf20Sopenharmony_ci dev_err(ctx->dev, "Invalid number of src SG.\n"); 35448c2ecf20Sopenharmony_ci return src_nents; 35458c2ecf20Sopenharmony_ci } 35468c2ecf20Sopenharmony_ci 35478c2ecf20Sopenharmony_ci if (src_nents) { 35488c2ecf20Sopenharmony_ci mapped_nents = dma_map_sg(ctx->dev, req->src, src_nents, 35498c2ecf20Sopenharmony_ci DMA_TO_DEVICE); 35508c2ecf20Sopenharmony_ci if (!mapped_nents) { 35518c2ecf20Sopenharmony_ci dev_err(ctx->dev, "unable to DMA map source\n"); 35528c2ecf20Sopenharmony_ci return -ENOMEM; 35538c2ecf20Sopenharmony_ci } 35548c2ecf20Sopenharmony_ci } else { 35558c2ecf20Sopenharmony_ci mapped_nents = 0; 35568c2ecf20Sopenharmony_ci } 35578c2ecf20Sopenharmony_ci 35588c2ecf20Sopenharmony_ci /* allocate space for base edesc and link tables */ 35598c2ecf20Sopenharmony_ci edesc = qi_cache_zalloc(GFP_DMA | flags); 35608c2ecf20Sopenharmony_ci if (!edesc) { 35618c2ecf20Sopenharmony_ci dma_unmap_sg(ctx->dev, req->src, src_nents, 35628c2ecf20Sopenharmony_ci DMA_TO_DEVICE); 35638c2ecf20Sopenharmony_ci return -ENOMEM; 35648c2ecf20Sopenharmony_ci } 35658c2ecf20Sopenharmony_ci 35668c2ecf20Sopenharmony_ci edesc->src_nents = src_nents; 35678c2ecf20Sopenharmony_ci qm_sg_src_index = 1 + (*buflen ? 1 : 0); 35688c2ecf20Sopenharmony_ci qm_sg_bytes = pad_sg_nents(qm_sg_src_index + mapped_nents) * 35698c2ecf20Sopenharmony_ci sizeof(*sg_table); 35708c2ecf20Sopenharmony_ci sg_table = &edesc->sgt[0]; 35718c2ecf20Sopenharmony_ci 35728c2ecf20Sopenharmony_ci ret = ctx_map_to_qm_sg(ctx->dev, state, ctx->ctx_len, sg_table, 35738c2ecf20Sopenharmony_ci DMA_BIDIRECTIONAL); 35748c2ecf20Sopenharmony_ci if (ret) 35758c2ecf20Sopenharmony_ci goto unmap_ctx; 35768c2ecf20Sopenharmony_ci 35778c2ecf20Sopenharmony_ci ret = buf_map_to_qm_sg(ctx->dev, sg_table + 1, state); 35788c2ecf20Sopenharmony_ci if (ret) 35798c2ecf20Sopenharmony_ci goto unmap_ctx; 35808c2ecf20Sopenharmony_ci 35818c2ecf20Sopenharmony_ci if (mapped_nents) { 35828c2ecf20Sopenharmony_ci sg_to_qm_sg_last(req->src, src_len, 35838c2ecf20Sopenharmony_ci sg_table + qm_sg_src_index, 0); 35848c2ecf20Sopenharmony_ci } else { 35858c2ecf20Sopenharmony_ci dpaa2_sg_set_final(sg_table + qm_sg_src_index - 1, 35868c2ecf20Sopenharmony_ci true); 35878c2ecf20Sopenharmony_ci } 35888c2ecf20Sopenharmony_ci 35898c2ecf20Sopenharmony_ci edesc->qm_sg_dma = dma_map_single(ctx->dev, sg_table, 35908c2ecf20Sopenharmony_ci qm_sg_bytes, DMA_TO_DEVICE); 35918c2ecf20Sopenharmony_ci if (dma_mapping_error(ctx->dev, edesc->qm_sg_dma)) { 35928c2ecf20Sopenharmony_ci dev_err(ctx->dev, "unable to map S/G table\n"); 35938c2ecf20Sopenharmony_ci ret = -ENOMEM; 35948c2ecf20Sopenharmony_ci goto unmap_ctx; 35958c2ecf20Sopenharmony_ci } 35968c2ecf20Sopenharmony_ci edesc->qm_sg_bytes = qm_sg_bytes; 35978c2ecf20Sopenharmony_ci 35988c2ecf20Sopenharmony_ci memset(&req_ctx->fd_flt, 0, sizeof(req_ctx->fd_flt)); 35998c2ecf20Sopenharmony_ci dpaa2_fl_set_final(in_fle, true); 36008c2ecf20Sopenharmony_ci dpaa2_fl_set_format(in_fle, dpaa2_fl_sg); 36018c2ecf20Sopenharmony_ci dpaa2_fl_set_addr(in_fle, edesc->qm_sg_dma); 36028c2ecf20Sopenharmony_ci dpaa2_fl_set_len(in_fle, ctx->ctx_len + to_hash); 36038c2ecf20Sopenharmony_ci dpaa2_fl_set_format(out_fle, dpaa2_fl_single); 36048c2ecf20Sopenharmony_ci dpaa2_fl_set_addr(out_fle, state->ctx_dma); 36058c2ecf20Sopenharmony_ci dpaa2_fl_set_len(out_fle, ctx->ctx_len); 36068c2ecf20Sopenharmony_ci 36078c2ecf20Sopenharmony_ci req_ctx->flc = &ctx->flc[UPDATE]; 36088c2ecf20Sopenharmony_ci req_ctx->flc_dma = ctx->flc_dma[UPDATE]; 36098c2ecf20Sopenharmony_ci req_ctx->cbk = ahash_done_bi; 36108c2ecf20Sopenharmony_ci req_ctx->ctx = &req->base; 36118c2ecf20Sopenharmony_ci req_ctx->edesc = edesc; 36128c2ecf20Sopenharmony_ci 36138c2ecf20Sopenharmony_ci ret = dpaa2_caam_enqueue(ctx->dev, req_ctx); 36148c2ecf20Sopenharmony_ci if (ret != -EINPROGRESS && 36158c2ecf20Sopenharmony_ci !(ret == -EBUSY && 36168c2ecf20Sopenharmony_ci req->base.flags & CRYPTO_TFM_REQ_MAY_BACKLOG)) 36178c2ecf20Sopenharmony_ci goto unmap_ctx; 36188c2ecf20Sopenharmony_ci } else if (*next_buflen) { 36198c2ecf20Sopenharmony_ci scatterwalk_map_and_copy(buf + *buflen, req->src, 0, 36208c2ecf20Sopenharmony_ci req->nbytes, 0); 36218c2ecf20Sopenharmony_ci *buflen = *next_buflen; 36228c2ecf20Sopenharmony_ci 36238c2ecf20Sopenharmony_ci print_hex_dump_debug("buf@" __stringify(__LINE__)": ", 36248c2ecf20Sopenharmony_ci DUMP_PREFIX_ADDRESS, 16, 4, buf, 36258c2ecf20Sopenharmony_ci *buflen, 1); 36268c2ecf20Sopenharmony_ci } 36278c2ecf20Sopenharmony_ci 36288c2ecf20Sopenharmony_ci return ret; 36298c2ecf20Sopenharmony_ciunmap_ctx: 36308c2ecf20Sopenharmony_ci ahash_unmap_ctx(ctx->dev, edesc, req, DMA_BIDIRECTIONAL); 36318c2ecf20Sopenharmony_ci qi_cache_free(edesc); 36328c2ecf20Sopenharmony_ci return ret; 36338c2ecf20Sopenharmony_ci} 36348c2ecf20Sopenharmony_ci 36358c2ecf20Sopenharmony_cistatic int ahash_final_ctx(struct ahash_request *req) 36368c2ecf20Sopenharmony_ci{ 36378c2ecf20Sopenharmony_ci struct crypto_ahash *ahash = crypto_ahash_reqtfm(req); 36388c2ecf20Sopenharmony_ci struct caam_hash_ctx *ctx = crypto_ahash_ctx(ahash); 36398c2ecf20Sopenharmony_ci struct caam_hash_state *state = ahash_request_ctx(req); 36408c2ecf20Sopenharmony_ci struct caam_request *req_ctx = &state->caam_req; 36418c2ecf20Sopenharmony_ci struct dpaa2_fl_entry *in_fle = &req_ctx->fd_flt[1]; 36428c2ecf20Sopenharmony_ci struct dpaa2_fl_entry *out_fle = &req_ctx->fd_flt[0]; 36438c2ecf20Sopenharmony_ci gfp_t flags = (req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP) ? 36448c2ecf20Sopenharmony_ci GFP_KERNEL : GFP_ATOMIC; 36458c2ecf20Sopenharmony_ci int buflen = state->buflen; 36468c2ecf20Sopenharmony_ci int qm_sg_bytes; 36478c2ecf20Sopenharmony_ci int digestsize = crypto_ahash_digestsize(ahash); 36488c2ecf20Sopenharmony_ci struct ahash_edesc *edesc; 36498c2ecf20Sopenharmony_ci struct dpaa2_sg_entry *sg_table; 36508c2ecf20Sopenharmony_ci int ret; 36518c2ecf20Sopenharmony_ci 36528c2ecf20Sopenharmony_ci /* allocate space for base edesc and link tables */ 36538c2ecf20Sopenharmony_ci edesc = qi_cache_zalloc(GFP_DMA | flags); 36548c2ecf20Sopenharmony_ci if (!edesc) 36558c2ecf20Sopenharmony_ci return -ENOMEM; 36568c2ecf20Sopenharmony_ci 36578c2ecf20Sopenharmony_ci qm_sg_bytes = pad_sg_nents(1 + (buflen ? 1 : 0)) * sizeof(*sg_table); 36588c2ecf20Sopenharmony_ci sg_table = &edesc->sgt[0]; 36598c2ecf20Sopenharmony_ci 36608c2ecf20Sopenharmony_ci ret = ctx_map_to_qm_sg(ctx->dev, state, ctx->ctx_len, sg_table, 36618c2ecf20Sopenharmony_ci DMA_BIDIRECTIONAL); 36628c2ecf20Sopenharmony_ci if (ret) 36638c2ecf20Sopenharmony_ci goto unmap_ctx; 36648c2ecf20Sopenharmony_ci 36658c2ecf20Sopenharmony_ci ret = buf_map_to_qm_sg(ctx->dev, sg_table + 1, state); 36668c2ecf20Sopenharmony_ci if (ret) 36678c2ecf20Sopenharmony_ci goto unmap_ctx; 36688c2ecf20Sopenharmony_ci 36698c2ecf20Sopenharmony_ci dpaa2_sg_set_final(sg_table + (buflen ? 1 : 0), true); 36708c2ecf20Sopenharmony_ci 36718c2ecf20Sopenharmony_ci edesc->qm_sg_dma = dma_map_single(ctx->dev, sg_table, qm_sg_bytes, 36728c2ecf20Sopenharmony_ci DMA_TO_DEVICE); 36738c2ecf20Sopenharmony_ci if (dma_mapping_error(ctx->dev, edesc->qm_sg_dma)) { 36748c2ecf20Sopenharmony_ci dev_err(ctx->dev, "unable to map S/G table\n"); 36758c2ecf20Sopenharmony_ci ret = -ENOMEM; 36768c2ecf20Sopenharmony_ci goto unmap_ctx; 36778c2ecf20Sopenharmony_ci } 36788c2ecf20Sopenharmony_ci edesc->qm_sg_bytes = qm_sg_bytes; 36798c2ecf20Sopenharmony_ci 36808c2ecf20Sopenharmony_ci memset(&req_ctx->fd_flt, 0, sizeof(req_ctx->fd_flt)); 36818c2ecf20Sopenharmony_ci dpaa2_fl_set_final(in_fle, true); 36828c2ecf20Sopenharmony_ci dpaa2_fl_set_format(in_fle, dpaa2_fl_sg); 36838c2ecf20Sopenharmony_ci dpaa2_fl_set_addr(in_fle, edesc->qm_sg_dma); 36848c2ecf20Sopenharmony_ci dpaa2_fl_set_len(in_fle, ctx->ctx_len + buflen); 36858c2ecf20Sopenharmony_ci dpaa2_fl_set_format(out_fle, dpaa2_fl_single); 36868c2ecf20Sopenharmony_ci dpaa2_fl_set_addr(out_fle, state->ctx_dma); 36878c2ecf20Sopenharmony_ci dpaa2_fl_set_len(out_fle, digestsize); 36888c2ecf20Sopenharmony_ci 36898c2ecf20Sopenharmony_ci req_ctx->flc = &ctx->flc[FINALIZE]; 36908c2ecf20Sopenharmony_ci req_ctx->flc_dma = ctx->flc_dma[FINALIZE]; 36918c2ecf20Sopenharmony_ci req_ctx->cbk = ahash_done_ctx_src; 36928c2ecf20Sopenharmony_ci req_ctx->ctx = &req->base; 36938c2ecf20Sopenharmony_ci req_ctx->edesc = edesc; 36948c2ecf20Sopenharmony_ci 36958c2ecf20Sopenharmony_ci ret = dpaa2_caam_enqueue(ctx->dev, req_ctx); 36968c2ecf20Sopenharmony_ci if (ret == -EINPROGRESS || 36978c2ecf20Sopenharmony_ci (ret == -EBUSY && req->base.flags & CRYPTO_TFM_REQ_MAY_BACKLOG)) 36988c2ecf20Sopenharmony_ci return ret; 36998c2ecf20Sopenharmony_ci 37008c2ecf20Sopenharmony_ciunmap_ctx: 37018c2ecf20Sopenharmony_ci ahash_unmap_ctx(ctx->dev, edesc, req, DMA_BIDIRECTIONAL); 37028c2ecf20Sopenharmony_ci qi_cache_free(edesc); 37038c2ecf20Sopenharmony_ci return ret; 37048c2ecf20Sopenharmony_ci} 37058c2ecf20Sopenharmony_ci 37068c2ecf20Sopenharmony_cistatic int ahash_finup_ctx(struct ahash_request *req) 37078c2ecf20Sopenharmony_ci{ 37088c2ecf20Sopenharmony_ci struct crypto_ahash *ahash = crypto_ahash_reqtfm(req); 37098c2ecf20Sopenharmony_ci struct caam_hash_ctx *ctx = crypto_ahash_ctx(ahash); 37108c2ecf20Sopenharmony_ci struct caam_hash_state *state = ahash_request_ctx(req); 37118c2ecf20Sopenharmony_ci struct caam_request *req_ctx = &state->caam_req; 37128c2ecf20Sopenharmony_ci struct dpaa2_fl_entry *in_fle = &req_ctx->fd_flt[1]; 37138c2ecf20Sopenharmony_ci struct dpaa2_fl_entry *out_fle = &req_ctx->fd_flt[0]; 37148c2ecf20Sopenharmony_ci gfp_t flags = (req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP) ? 37158c2ecf20Sopenharmony_ci GFP_KERNEL : GFP_ATOMIC; 37168c2ecf20Sopenharmony_ci int buflen = state->buflen; 37178c2ecf20Sopenharmony_ci int qm_sg_bytes, qm_sg_src_index; 37188c2ecf20Sopenharmony_ci int src_nents, mapped_nents; 37198c2ecf20Sopenharmony_ci int digestsize = crypto_ahash_digestsize(ahash); 37208c2ecf20Sopenharmony_ci struct ahash_edesc *edesc; 37218c2ecf20Sopenharmony_ci struct dpaa2_sg_entry *sg_table; 37228c2ecf20Sopenharmony_ci int ret; 37238c2ecf20Sopenharmony_ci 37248c2ecf20Sopenharmony_ci src_nents = sg_nents_for_len(req->src, req->nbytes); 37258c2ecf20Sopenharmony_ci if (src_nents < 0) { 37268c2ecf20Sopenharmony_ci dev_err(ctx->dev, "Invalid number of src SG.\n"); 37278c2ecf20Sopenharmony_ci return src_nents; 37288c2ecf20Sopenharmony_ci } 37298c2ecf20Sopenharmony_ci 37308c2ecf20Sopenharmony_ci if (src_nents) { 37318c2ecf20Sopenharmony_ci mapped_nents = dma_map_sg(ctx->dev, req->src, src_nents, 37328c2ecf20Sopenharmony_ci DMA_TO_DEVICE); 37338c2ecf20Sopenharmony_ci if (!mapped_nents) { 37348c2ecf20Sopenharmony_ci dev_err(ctx->dev, "unable to DMA map source\n"); 37358c2ecf20Sopenharmony_ci return -ENOMEM; 37368c2ecf20Sopenharmony_ci } 37378c2ecf20Sopenharmony_ci } else { 37388c2ecf20Sopenharmony_ci mapped_nents = 0; 37398c2ecf20Sopenharmony_ci } 37408c2ecf20Sopenharmony_ci 37418c2ecf20Sopenharmony_ci /* allocate space for base edesc and link tables */ 37428c2ecf20Sopenharmony_ci edesc = qi_cache_zalloc(GFP_DMA | flags); 37438c2ecf20Sopenharmony_ci if (!edesc) { 37448c2ecf20Sopenharmony_ci dma_unmap_sg(ctx->dev, req->src, src_nents, DMA_TO_DEVICE); 37458c2ecf20Sopenharmony_ci return -ENOMEM; 37468c2ecf20Sopenharmony_ci } 37478c2ecf20Sopenharmony_ci 37488c2ecf20Sopenharmony_ci edesc->src_nents = src_nents; 37498c2ecf20Sopenharmony_ci qm_sg_src_index = 1 + (buflen ? 1 : 0); 37508c2ecf20Sopenharmony_ci qm_sg_bytes = pad_sg_nents(qm_sg_src_index + mapped_nents) * 37518c2ecf20Sopenharmony_ci sizeof(*sg_table); 37528c2ecf20Sopenharmony_ci sg_table = &edesc->sgt[0]; 37538c2ecf20Sopenharmony_ci 37548c2ecf20Sopenharmony_ci ret = ctx_map_to_qm_sg(ctx->dev, state, ctx->ctx_len, sg_table, 37558c2ecf20Sopenharmony_ci DMA_BIDIRECTIONAL); 37568c2ecf20Sopenharmony_ci if (ret) 37578c2ecf20Sopenharmony_ci goto unmap_ctx; 37588c2ecf20Sopenharmony_ci 37598c2ecf20Sopenharmony_ci ret = buf_map_to_qm_sg(ctx->dev, sg_table + 1, state); 37608c2ecf20Sopenharmony_ci if (ret) 37618c2ecf20Sopenharmony_ci goto unmap_ctx; 37628c2ecf20Sopenharmony_ci 37638c2ecf20Sopenharmony_ci sg_to_qm_sg_last(req->src, req->nbytes, sg_table + qm_sg_src_index, 0); 37648c2ecf20Sopenharmony_ci 37658c2ecf20Sopenharmony_ci edesc->qm_sg_dma = dma_map_single(ctx->dev, sg_table, qm_sg_bytes, 37668c2ecf20Sopenharmony_ci DMA_TO_DEVICE); 37678c2ecf20Sopenharmony_ci if (dma_mapping_error(ctx->dev, edesc->qm_sg_dma)) { 37688c2ecf20Sopenharmony_ci dev_err(ctx->dev, "unable to map S/G table\n"); 37698c2ecf20Sopenharmony_ci ret = -ENOMEM; 37708c2ecf20Sopenharmony_ci goto unmap_ctx; 37718c2ecf20Sopenharmony_ci } 37728c2ecf20Sopenharmony_ci edesc->qm_sg_bytes = qm_sg_bytes; 37738c2ecf20Sopenharmony_ci 37748c2ecf20Sopenharmony_ci memset(&req_ctx->fd_flt, 0, sizeof(req_ctx->fd_flt)); 37758c2ecf20Sopenharmony_ci dpaa2_fl_set_final(in_fle, true); 37768c2ecf20Sopenharmony_ci dpaa2_fl_set_format(in_fle, dpaa2_fl_sg); 37778c2ecf20Sopenharmony_ci dpaa2_fl_set_addr(in_fle, edesc->qm_sg_dma); 37788c2ecf20Sopenharmony_ci dpaa2_fl_set_len(in_fle, ctx->ctx_len + buflen + req->nbytes); 37798c2ecf20Sopenharmony_ci dpaa2_fl_set_format(out_fle, dpaa2_fl_single); 37808c2ecf20Sopenharmony_ci dpaa2_fl_set_addr(out_fle, state->ctx_dma); 37818c2ecf20Sopenharmony_ci dpaa2_fl_set_len(out_fle, digestsize); 37828c2ecf20Sopenharmony_ci 37838c2ecf20Sopenharmony_ci req_ctx->flc = &ctx->flc[FINALIZE]; 37848c2ecf20Sopenharmony_ci req_ctx->flc_dma = ctx->flc_dma[FINALIZE]; 37858c2ecf20Sopenharmony_ci req_ctx->cbk = ahash_done_ctx_src; 37868c2ecf20Sopenharmony_ci req_ctx->ctx = &req->base; 37878c2ecf20Sopenharmony_ci req_ctx->edesc = edesc; 37888c2ecf20Sopenharmony_ci 37898c2ecf20Sopenharmony_ci ret = dpaa2_caam_enqueue(ctx->dev, req_ctx); 37908c2ecf20Sopenharmony_ci if (ret == -EINPROGRESS || 37918c2ecf20Sopenharmony_ci (ret == -EBUSY && req->base.flags & CRYPTO_TFM_REQ_MAY_BACKLOG)) 37928c2ecf20Sopenharmony_ci return ret; 37938c2ecf20Sopenharmony_ci 37948c2ecf20Sopenharmony_ciunmap_ctx: 37958c2ecf20Sopenharmony_ci ahash_unmap_ctx(ctx->dev, edesc, req, DMA_BIDIRECTIONAL); 37968c2ecf20Sopenharmony_ci qi_cache_free(edesc); 37978c2ecf20Sopenharmony_ci return ret; 37988c2ecf20Sopenharmony_ci} 37998c2ecf20Sopenharmony_ci 38008c2ecf20Sopenharmony_cistatic int ahash_digest(struct ahash_request *req) 38018c2ecf20Sopenharmony_ci{ 38028c2ecf20Sopenharmony_ci struct crypto_ahash *ahash = crypto_ahash_reqtfm(req); 38038c2ecf20Sopenharmony_ci struct caam_hash_ctx *ctx = crypto_ahash_ctx(ahash); 38048c2ecf20Sopenharmony_ci struct caam_hash_state *state = ahash_request_ctx(req); 38058c2ecf20Sopenharmony_ci struct caam_request *req_ctx = &state->caam_req; 38068c2ecf20Sopenharmony_ci struct dpaa2_fl_entry *in_fle = &req_ctx->fd_flt[1]; 38078c2ecf20Sopenharmony_ci struct dpaa2_fl_entry *out_fle = &req_ctx->fd_flt[0]; 38088c2ecf20Sopenharmony_ci gfp_t flags = (req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP) ? 38098c2ecf20Sopenharmony_ci GFP_KERNEL : GFP_ATOMIC; 38108c2ecf20Sopenharmony_ci int digestsize = crypto_ahash_digestsize(ahash); 38118c2ecf20Sopenharmony_ci int src_nents, mapped_nents; 38128c2ecf20Sopenharmony_ci struct ahash_edesc *edesc; 38138c2ecf20Sopenharmony_ci int ret = -ENOMEM; 38148c2ecf20Sopenharmony_ci 38158c2ecf20Sopenharmony_ci state->buf_dma = 0; 38168c2ecf20Sopenharmony_ci 38178c2ecf20Sopenharmony_ci src_nents = sg_nents_for_len(req->src, req->nbytes); 38188c2ecf20Sopenharmony_ci if (src_nents < 0) { 38198c2ecf20Sopenharmony_ci dev_err(ctx->dev, "Invalid number of src SG.\n"); 38208c2ecf20Sopenharmony_ci return src_nents; 38218c2ecf20Sopenharmony_ci } 38228c2ecf20Sopenharmony_ci 38238c2ecf20Sopenharmony_ci if (src_nents) { 38248c2ecf20Sopenharmony_ci mapped_nents = dma_map_sg(ctx->dev, req->src, src_nents, 38258c2ecf20Sopenharmony_ci DMA_TO_DEVICE); 38268c2ecf20Sopenharmony_ci if (!mapped_nents) { 38278c2ecf20Sopenharmony_ci dev_err(ctx->dev, "unable to map source for DMA\n"); 38288c2ecf20Sopenharmony_ci return ret; 38298c2ecf20Sopenharmony_ci } 38308c2ecf20Sopenharmony_ci } else { 38318c2ecf20Sopenharmony_ci mapped_nents = 0; 38328c2ecf20Sopenharmony_ci } 38338c2ecf20Sopenharmony_ci 38348c2ecf20Sopenharmony_ci /* allocate space for base edesc and link tables */ 38358c2ecf20Sopenharmony_ci edesc = qi_cache_zalloc(GFP_DMA | flags); 38368c2ecf20Sopenharmony_ci if (!edesc) { 38378c2ecf20Sopenharmony_ci dma_unmap_sg(ctx->dev, req->src, src_nents, DMA_TO_DEVICE); 38388c2ecf20Sopenharmony_ci return ret; 38398c2ecf20Sopenharmony_ci } 38408c2ecf20Sopenharmony_ci 38418c2ecf20Sopenharmony_ci edesc->src_nents = src_nents; 38428c2ecf20Sopenharmony_ci memset(&req_ctx->fd_flt, 0, sizeof(req_ctx->fd_flt)); 38438c2ecf20Sopenharmony_ci 38448c2ecf20Sopenharmony_ci if (mapped_nents > 1) { 38458c2ecf20Sopenharmony_ci int qm_sg_bytes; 38468c2ecf20Sopenharmony_ci struct dpaa2_sg_entry *sg_table = &edesc->sgt[0]; 38478c2ecf20Sopenharmony_ci 38488c2ecf20Sopenharmony_ci qm_sg_bytes = pad_sg_nents(mapped_nents) * sizeof(*sg_table); 38498c2ecf20Sopenharmony_ci sg_to_qm_sg_last(req->src, req->nbytes, sg_table, 0); 38508c2ecf20Sopenharmony_ci edesc->qm_sg_dma = dma_map_single(ctx->dev, sg_table, 38518c2ecf20Sopenharmony_ci qm_sg_bytes, DMA_TO_DEVICE); 38528c2ecf20Sopenharmony_ci if (dma_mapping_error(ctx->dev, edesc->qm_sg_dma)) { 38538c2ecf20Sopenharmony_ci dev_err(ctx->dev, "unable to map S/G table\n"); 38548c2ecf20Sopenharmony_ci goto unmap; 38558c2ecf20Sopenharmony_ci } 38568c2ecf20Sopenharmony_ci edesc->qm_sg_bytes = qm_sg_bytes; 38578c2ecf20Sopenharmony_ci dpaa2_fl_set_format(in_fle, dpaa2_fl_sg); 38588c2ecf20Sopenharmony_ci dpaa2_fl_set_addr(in_fle, edesc->qm_sg_dma); 38598c2ecf20Sopenharmony_ci } else { 38608c2ecf20Sopenharmony_ci dpaa2_fl_set_format(in_fle, dpaa2_fl_single); 38618c2ecf20Sopenharmony_ci dpaa2_fl_set_addr(in_fle, sg_dma_address(req->src)); 38628c2ecf20Sopenharmony_ci } 38638c2ecf20Sopenharmony_ci 38648c2ecf20Sopenharmony_ci state->ctx_dma_len = digestsize; 38658c2ecf20Sopenharmony_ci state->ctx_dma = dma_map_single(ctx->dev, state->caam_ctx, digestsize, 38668c2ecf20Sopenharmony_ci DMA_FROM_DEVICE); 38678c2ecf20Sopenharmony_ci if (dma_mapping_error(ctx->dev, state->ctx_dma)) { 38688c2ecf20Sopenharmony_ci dev_err(ctx->dev, "unable to map ctx\n"); 38698c2ecf20Sopenharmony_ci state->ctx_dma = 0; 38708c2ecf20Sopenharmony_ci goto unmap; 38718c2ecf20Sopenharmony_ci } 38728c2ecf20Sopenharmony_ci 38738c2ecf20Sopenharmony_ci dpaa2_fl_set_final(in_fle, true); 38748c2ecf20Sopenharmony_ci dpaa2_fl_set_len(in_fle, req->nbytes); 38758c2ecf20Sopenharmony_ci dpaa2_fl_set_format(out_fle, dpaa2_fl_single); 38768c2ecf20Sopenharmony_ci dpaa2_fl_set_addr(out_fle, state->ctx_dma); 38778c2ecf20Sopenharmony_ci dpaa2_fl_set_len(out_fle, digestsize); 38788c2ecf20Sopenharmony_ci 38798c2ecf20Sopenharmony_ci req_ctx->flc = &ctx->flc[DIGEST]; 38808c2ecf20Sopenharmony_ci req_ctx->flc_dma = ctx->flc_dma[DIGEST]; 38818c2ecf20Sopenharmony_ci req_ctx->cbk = ahash_done; 38828c2ecf20Sopenharmony_ci req_ctx->ctx = &req->base; 38838c2ecf20Sopenharmony_ci req_ctx->edesc = edesc; 38848c2ecf20Sopenharmony_ci ret = dpaa2_caam_enqueue(ctx->dev, req_ctx); 38858c2ecf20Sopenharmony_ci if (ret == -EINPROGRESS || 38868c2ecf20Sopenharmony_ci (ret == -EBUSY && req->base.flags & CRYPTO_TFM_REQ_MAY_BACKLOG)) 38878c2ecf20Sopenharmony_ci return ret; 38888c2ecf20Sopenharmony_ci 38898c2ecf20Sopenharmony_ciunmap: 38908c2ecf20Sopenharmony_ci ahash_unmap_ctx(ctx->dev, edesc, req, DMA_FROM_DEVICE); 38918c2ecf20Sopenharmony_ci qi_cache_free(edesc); 38928c2ecf20Sopenharmony_ci return ret; 38938c2ecf20Sopenharmony_ci} 38948c2ecf20Sopenharmony_ci 38958c2ecf20Sopenharmony_cistatic int ahash_final_no_ctx(struct ahash_request *req) 38968c2ecf20Sopenharmony_ci{ 38978c2ecf20Sopenharmony_ci struct crypto_ahash *ahash = crypto_ahash_reqtfm(req); 38988c2ecf20Sopenharmony_ci struct caam_hash_ctx *ctx = crypto_ahash_ctx(ahash); 38998c2ecf20Sopenharmony_ci struct caam_hash_state *state = ahash_request_ctx(req); 39008c2ecf20Sopenharmony_ci struct caam_request *req_ctx = &state->caam_req; 39018c2ecf20Sopenharmony_ci struct dpaa2_fl_entry *in_fle = &req_ctx->fd_flt[1]; 39028c2ecf20Sopenharmony_ci struct dpaa2_fl_entry *out_fle = &req_ctx->fd_flt[0]; 39038c2ecf20Sopenharmony_ci gfp_t flags = (req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP) ? 39048c2ecf20Sopenharmony_ci GFP_KERNEL : GFP_ATOMIC; 39058c2ecf20Sopenharmony_ci u8 *buf = state->buf; 39068c2ecf20Sopenharmony_ci int buflen = state->buflen; 39078c2ecf20Sopenharmony_ci int digestsize = crypto_ahash_digestsize(ahash); 39088c2ecf20Sopenharmony_ci struct ahash_edesc *edesc; 39098c2ecf20Sopenharmony_ci int ret = -ENOMEM; 39108c2ecf20Sopenharmony_ci 39118c2ecf20Sopenharmony_ci /* allocate space for base edesc and link tables */ 39128c2ecf20Sopenharmony_ci edesc = qi_cache_zalloc(GFP_DMA | flags); 39138c2ecf20Sopenharmony_ci if (!edesc) 39148c2ecf20Sopenharmony_ci return ret; 39158c2ecf20Sopenharmony_ci 39168c2ecf20Sopenharmony_ci if (buflen) { 39178c2ecf20Sopenharmony_ci state->buf_dma = dma_map_single(ctx->dev, buf, buflen, 39188c2ecf20Sopenharmony_ci DMA_TO_DEVICE); 39198c2ecf20Sopenharmony_ci if (dma_mapping_error(ctx->dev, state->buf_dma)) { 39208c2ecf20Sopenharmony_ci dev_err(ctx->dev, "unable to map src\n"); 39218c2ecf20Sopenharmony_ci goto unmap; 39228c2ecf20Sopenharmony_ci } 39238c2ecf20Sopenharmony_ci } 39248c2ecf20Sopenharmony_ci 39258c2ecf20Sopenharmony_ci state->ctx_dma_len = digestsize; 39268c2ecf20Sopenharmony_ci state->ctx_dma = dma_map_single(ctx->dev, state->caam_ctx, digestsize, 39278c2ecf20Sopenharmony_ci DMA_FROM_DEVICE); 39288c2ecf20Sopenharmony_ci if (dma_mapping_error(ctx->dev, state->ctx_dma)) { 39298c2ecf20Sopenharmony_ci dev_err(ctx->dev, "unable to map ctx\n"); 39308c2ecf20Sopenharmony_ci state->ctx_dma = 0; 39318c2ecf20Sopenharmony_ci goto unmap; 39328c2ecf20Sopenharmony_ci } 39338c2ecf20Sopenharmony_ci 39348c2ecf20Sopenharmony_ci memset(&req_ctx->fd_flt, 0, sizeof(req_ctx->fd_flt)); 39358c2ecf20Sopenharmony_ci dpaa2_fl_set_final(in_fle, true); 39368c2ecf20Sopenharmony_ci /* 39378c2ecf20Sopenharmony_ci * crypto engine requires the input entry to be present when 39388c2ecf20Sopenharmony_ci * "frame list" FD is used. 39398c2ecf20Sopenharmony_ci * Since engine does not support FMT=2'b11 (unused entry type), leaving 39408c2ecf20Sopenharmony_ci * in_fle zeroized (except for "Final" flag) is the best option. 39418c2ecf20Sopenharmony_ci */ 39428c2ecf20Sopenharmony_ci if (buflen) { 39438c2ecf20Sopenharmony_ci dpaa2_fl_set_format(in_fle, dpaa2_fl_single); 39448c2ecf20Sopenharmony_ci dpaa2_fl_set_addr(in_fle, state->buf_dma); 39458c2ecf20Sopenharmony_ci dpaa2_fl_set_len(in_fle, buflen); 39468c2ecf20Sopenharmony_ci } 39478c2ecf20Sopenharmony_ci dpaa2_fl_set_format(out_fle, dpaa2_fl_single); 39488c2ecf20Sopenharmony_ci dpaa2_fl_set_addr(out_fle, state->ctx_dma); 39498c2ecf20Sopenharmony_ci dpaa2_fl_set_len(out_fle, digestsize); 39508c2ecf20Sopenharmony_ci 39518c2ecf20Sopenharmony_ci req_ctx->flc = &ctx->flc[DIGEST]; 39528c2ecf20Sopenharmony_ci req_ctx->flc_dma = ctx->flc_dma[DIGEST]; 39538c2ecf20Sopenharmony_ci req_ctx->cbk = ahash_done; 39548c2ecf20Sopenharmony_ci req_ctx->ctx = &req->base; 39558c2ecf20Sopenharmony_ci req_ctx->edesc = edesc; 39568c2ecf20Sopenharmony_ci 39578c2ecf20Sopenharmony_ci ret = dpaa2_caam_enqueue(ctx->dev, req_ctx); 39588c2ecf20Sopenharmony_ci if (ret == -EINPROGRESS || 39598c2ecf20Sopenharmony_ci (ret == -EBUSY && req->base.flags & CRYPTO_TFM_REQ_MAY_BACKLOG)) 39608c2ecf20Sopenharmony_ci return ret; 39618c2ecf20Sopenharmony_ci 39628c2ecf20Sopenharmony_ciunmap: 39638c2ecf20Sopenharmony_ci ahash_unmap_ctx(ctx->dev, edesc, req, DMA_FROM_DEVICE); 39648c2ecf20Sopenharmony_ci qi_cache_free(edesc); 39658c2ecf20Sopenharmony_ci return ret; 39668c2ecf20Sopenharmony_ci} 39678c2ecf20Sopenharmony_ci 39688c2ecf20Sopenharmony_cistatic int ahash_update_no_ctx(struct ahash_request *req) 39698c2ecf20Sopenharmony_ci{ 39708c2ecf20Sopenharmony_ci struct crypto_ahash *ahash = crypto_ahash_reqtfm(req); 39718c2ecf20Sopenharmony_ci struct caam_hash_ctx *ctx = crypto_ahash_ctx(ahash); 39728c2ecf20Sopenharmony_ci struct caam_hash_state *state = ahash_request_ctx(req); 39738c2ecf20Sopenharmony_ci struct caam_request *req_ctx = &state->caam_req; 39748c2ecf20Sopenharmony_ci struct dpaa2_fl_entry *in_fle = &req_ctx->fd_flt[1]; 39758c2ecf20Sopenharmony_ci struct dpaa2_fl_entry *out_fle = &req_ctx->fd_flt[0]; 39768c2ecf20Sopenharmony_ci gfp_t flags = (req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP) ? 39778c2ecf20Sopenharmony_ci GFP_KERNEL : GFP_ATOMIC; 39788c2ecf20Sopenharmony_ci u8 *buf = state->buf; 39798c2ecf20Sopenharmony_ci int *buflen = &state->buflen; 39808c2ecf20Sopenharmony_ci int *next_buflen = &state->next_buflen; 39818c2ecf20Sopenharmony_ci int in_len = *buflen + req->nbytes, to_hash; 39828c2ecf20Sopenharmony_ci int qm_sg_bytes, src_nents, mapped_nents; 39838c2ecf20Sopenharmony_ci struct ahash_edesc *edesc; 39848c2ecf20Sopenharmony_ci int ret = 0; 39858c2ecf20Sopenharmony_ci 39868c2ecf20Sopenharmony_ci *next_buflen = in_len & (crypto_tfm_alg_blocksize(&ahash->base) - 1); 39878c2ecf20Sopenharmony_ci to_hash = in_len - *next_buflen; 39888c2ecf20Sopenharmony_ci 39898c2ecf20Sopenharmony_ci if (to_hash) { 39908c2ecf20Sopenharmony_ci struct dpaa2_sg_entry *sg_table; 39918c2ecf20Sopenharmony_ci int src_len = req->nbytes - *next_buflen; 39928c2ecf20Sopenharmony_ci 39938c2ecf20Sopenharmony_ci src_nents = sg_nents_for_len(req->src, src_len); 39948c2ecf20Sopenharmony_ci if (src_nents < 0) { 39958c2ecf20Sopenharmony_ci dev_err(ctx->dev, "Invalid number of src SG.\n"); 39968c2ecf20Sopenharmony_ci return src_nents; 39978c2ecf20Sopenharmony_ci } 39988c2ecf20Sopenharmony_ci 39998c2ecf20Sopenharmony_ci if (src_nents) { 40008c2ecf20Sopenharmony_ci mapped_nents = dma_map_sg(ctx->dev, req->src, src_nents, 40018c2ecf20Sopenharmony_ci DMA_TO_DEVICE); 40028c2ecf20Sopenharmony_ci if (!mapped_nents) { 40038c2ecf20Sopenharmony_ci dev_err(ctx->dev, "unable to DMA map source\n"); 40048c2ecf20Sopenharmony_ci return -ENOMEM; 40058c2ecf20Sopenharmony_ci } 40068c2ecf20Sopenharmony_ci } else { 40078c2ecf20Sopenharmony_ci mapped_nents = 0; 40088c2ecf20Sopenharmony_ci } 40098c2ecf20Sopenharmony_ci 40108c2ecf20Sopenharmony_ci /* allocate space for base edesc and link tables */ 40118c2ecf20Sopenharmony_ci edesc = qi_cache_zalloc(GFP_DMA | flags); 40128c2ecf20Sopenharmony_ci if (!edesc) { 40138c2ecf20Sopenharmony_ci dma_unmap_sg(ctx->dev, req->src, src_nents, 40148c2ecf20Sopenharmony_ci DMA_TO_DEVICE); 40158c2ecf20Sopenharmony_ci return -ENOMEM; 40168c2ecf20Sopenharmony_ci } 40178c2ecf20Sopenharmony_ci 40188c2ecf20Sopenharmony_ci edesc->src_nents = src_nents; 40198c2ecf20Sopenharmony_ci qm_sg_bytes = pad_sg_nents(1 + mapped_nents) * 40208c2ecf20Sopenharmony_ci sizeof(*sg_table); 40218c2ecf20Sopenharmony_ci sg_table = &edesc->sgt[0]; 40228c2ecf20Sopenharmony_ci 40238c2ecf20Sopenharmony_ci ret = buf_map_to_qm_sg(ctx->dev, sg_table, state); 40248c2ecf20Sopenharmony_ci if (ret) 40258c2ecf20Sopenharmony_ci goto unmap_ctx; 40268c2ecf20Sopenharmony_ci 40278c2ecf20Sopenharmony_ci sg_to_qm_sg_last(req->src, src_len, sg_table + 1, 0); 40288c2ecf20Sopenharmony_ci 40298c2ecf20Sopenharmony_ci edesc->qm_sg_dma = dma_map_single(ctx->dev, sg_table, 40308c2ecf20Sopenharmony_ci qm_sg_bytes, DMA_TO_DEVICE); 40318c2ecf20Sopenharmony_ci if (dma_mapping_error(ctx->dev, edesc->qm_sg_dma)) { 40328c2ecf20Sopenharmony_ci dev_err(ctx->dev, "unable to map S/G table\n"); 40338c2ecf20Sopenharmony_ci ret = -ENOMEM; 40348c2ecf20Sopenharmony_ci goto unmap_ctx; 40358c2ecf20Sopenharmony_ci } 40368c2ecf20Sopenharmony_ci edesc->qm_sg_bytes = qm_sg_bytes; 40378c2ecf20Sopenharmony_ci 40388c2ecf20Sopenharmony_ci state->ctx_dma_len = ctx->ctx_len; 40398c2ecf20Sopenharmony_ci state->ctx_dma = dma_map_single(ctx->dev, state->caam_ctx, 40408c2ecf20Sopenharmony_ci ctx->ctx_len, DMA_FROM_DEVICE); 40418c2ecf20Sopenharmony_ci if (dma_mapping_error(ctx->dev, state->ctx_dma)) { 40428c2ecf20Sopenharmony_ci dev_err(ctx->dev, "unable to map ctx\n"); 40438c2ecf20Sopenharmony_ci state->ctx_dma = 0; 40448c2ecf20Sopenharmony_ci ret = -ENOMEM; 40458c2ecf20Sopenharmony_ci goto unmap_ctx; 40468c2ecf20Sopenharmony_ci } 40478c2ecf20Sopenharmony_ci 40488c2ecf20Sopenharmony_ci memset(&req_ctx->fd_flt, 0, sizeof(req_ctx->fd_flt)); 40498c2ecf20Sopenharmony_ci dpaa2_fl_set_final(in_fle, true); 40508c2ecf20Sopenharmony_ci dpaa2_fl_set_format(in_fle, dpaa2_fl_sg); 40518c2ecf20Sopenharmony_ci dpaa2_fl_set_addr(in_fle, edesc->qm_sg_dma); 40528c2ecf20Sopenharmony_ci dpaa2_fl_set_len(in_fle, to_hash); 40538c2ecf20Sopenharmony_ci dpaa2_fl_set_format(out_fle, dpaa2_fl_single); 40548c2ecf20Sopenharmony_ci dpaa2_fl_set_addr(out_fle, state->ctx_dma); 40558c2ecf20Sopenharmony_ci dpaa2_fl_set_len(out_fle, ctx->ctx_len); 40568c2ecf20Sopenharmony_ci 40578c2ecf20Sopenharmony_ci req_ctx->flc = &ctx->flc[UPDATE_FIRST]; 40588c2ecf20Sopenharmony_ci req_ctx->flc_dma = ctx->flc_dma[UPDATE_FIRST]; 40598c2ecf20Sopenharmony_ci req_ctx->cbk = ahash_done_ctx_dst; 40608c2ecf20Sopenharmony_ci req_ctx->ctx = &req->base; 40618c2ecf20Sopenharmony_ci req_ctx->edesc = edesc; 40628c2ecf20Sopenharmony_ci 40638c2ecf20Sopenharmony_ci ret = dpaa2_caam_enqueue(ctx->dev, req_ctx); 40648c2ecf20Sopenharmony_ci if (ret != -EINPROGRESS && 40658c2ecf20Sopenharmony_ci !(ret == -EBUSY && 40668c2ecf20Sopenharmony_ci req->base.flags & CRYPTO_TFM_REQ_MAY_BACKLOG)) 40678c2ecf20Sopenharmony_ci goto unmap_ctx; 40688c2ecf20Sopenharmony_ci 40698c2ecf20Sopenharmony_ci state->update = ahash_update_ctx; 40708c2ecf20Sopenharmony_ci state->finup = ahash_finup_ctx; 40718c2ecf20Sopenharmony_ci state->final = ahash_final_ctx; 40728c2ecf20Sopenharmony_ci } else if (*next_buflen) { 40738c2ecf20Sopenharmony_ci scatterwalk_map_and_copy(buf + *buflen, req->src, 0, 40748c2ecf20Sopenharmony_ci req->nbytes, 0); 40758c2ecf20Sopenharmony_ci *buflen = *next_buflen; 40768c2ecf20Sopenharmony_ci 40778c2ecf20Sopenharmony_ci print_hex_dump_debug("buf@" __stringify(__LINE__)": ", 40788c2ecf20Sopenharmony_ci DUMP_PREFIX_ADDRESS, 16, 4, buf, 40798c2ecf20Sopenharmony_ci *buflen, 1); 40808c2ecf20Sopenharmony_ci } 40818c2ecf20Sopenharmony_ci 40828c2ecf20Sopenharmony_ci return ret; 40838c2ecf20Sopenharmony_ciunmap_ctx: 40848c2ecf20Sopenharmony_ci ahash_unmap_ctx(ctx->dev, edesc, req, DMA_TO_DEVICE); 40858c2ecf20Sopenharmony_ci qi_cache_free(edesc); 40868c2ecf20Sopenharmony_ci return ret; 40878c2ecf20Sopenharmony_ci} 40888c2ecf20Sopenharmony_ci 40898c2ecf20Sopenharmony_cistatic int ahash_finup_no_ctx(struct ahash_request *req) 40908c2ecf20Sopenharmony_ci{ 40918c2ecf20Sopenharmony_ci struct crypto_ahash *ahash = crypto_ahash_reqtfm(req); 40928c2ecf20Sopenharmony_ci struct caam_hash_ctx *ctx = crypto_ahash_ctx(ahash); 40938c2ecf20Sopenharmony_ci struct caam_hash_state *state = ahash_request_ctx(req); 40948c2ecf20Sopenharmony_ci struct caam_request *req_ctx = &state->caam_req; 40958c2ecf20Sopenharmony_ci struct dpaa2_fl_entry *in_fle = &req_ctx->fd_flt[1]; 40968c2ecf20Sopenharmony_ci struct dpaa2_fl_entry *out_fle = &req_ctx->fd_flt[0]; 40978c2ecf20Sopenharmony_ci gfp_t flags = (req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP) ? 40988c2ecf20Sopenharmony_ci GFP_KERNEL : GFP_ATOMIC; 40998c2ecf20Sopenharmony_ci int buflen = state->buflen; 41008c2ecf20Sopenharmony_ci int qm_sg_bytes, src_nents, mapped_nents; 41018c2ecf20Sopenharmony_ci int digestsize = crypto_ahash_digestsize(ahash); 41028c2ecf20Sopenharmony_ci struct ahash_edesc *edesc; 41038c2ecf20Sopenharmony_ci struct dpaa2_sg_entry *sg_table; 41048c2ecf20Sopenharmony_ci int ret = -ENOMEM; 41058c2ecf20Sopenharmony_ci 41068c2ecf20Sopenharmony_ci src_nents = sg_nents_for_len(req->src, req->nbytes); 41078c2ecf20Sopenharmony_ci if (src_nents < 0) { 41088c2ecf20Sopenharmony_ci dev_err(ctx->dev, "Invalid number of src SG.\n"); 41098c2ecf20Sopenharmony_ci return src_nents; 41108c2ecf20Sopenharmony_ci } 41118c2ecf20Sopenharmony_ci 41128c2ecf20Sopenharmony_ci if (src_nents) { 41138c2ecf20Sopenharmony_ci mapped_nents = dma_map_sg(ctx->dev, req->src, src_nents, 41148c2ecf20Sopenharmony_ci DMA_TO_DEVICE); 41158c2ecf20Sopenharmony_ci if (!mapped_nents) { 41168c2ecf20Sopenharmony_ci dev_err(ctx->dev, "unable to DMA map source\n"); 41178c2ecf20Sopenharmony_ci return ret; 41188c2ecf20Sopenharmony_ci } 41198c2ecf20Sopenharmony_ci } else { 41208c2ecf20Sopenharmony_ci mapped_nents = 0; 41218c2ecf20Sopenharmony_ci } 41228c2ecf20Sopenharmony_ci 41238c2ecf20Sopenharmony_ci /* allocate space for base edesc and link tables */ 41248c2ecf20Sopenharmony_ci edesc = qi_cache_zalloc(GFP_DMA | flags); 41258c2ecf20Sopenharmony_ci if (!edesc) { 41268c2ecf20Sopenharmony_ci dma_unmap_sg(ctx->dev, req->src, src_nents, DMA_TO_DEVICE); 41278c2ecf20Sopenharmony_ci return ret; 41288c2ecf20Sopenharmony_ci } 41298c2ecf20Sopenharmony_ci 41308c2ecf20Sopenharmony_ci edesc->src_nents = src_nents; 41318c2ecf20Sopenharmony_ci qm_sg_bytes = pad_sg_nents(2 + mapped_nents) * sizeof(*sg_table); 41328c2ecf20Sopenharmony_ci sg_table = &edesc->sgt[0]; 41338c2ecf20Sopenharmony_ci 41348c2ecf20Sopenharmony_ci ret = buf_map_to_qm_sg(ctx->dev, sg_table, state); 41358c2ecf20Sopenharmony_ci if (ret) 41368c2ecf20Sopenharmony_ci goto unmap; 41378c2ecf20Sopenharmony_ci 41388c2ecf20Sopenharmony_ci sg_to_qm_sg_last(req->src, req->nbytes, sg_table + 1, 0); 41398c2ecf20Sopenharmony_ci 41408c2ecf20Sopenharmony_ci edesc->qm_sg_dma = dma_map_single(ctx->dev, sg_table, qm_sg_bytes, 41418c2ecf20Sopenharmony_ci DMA_TO_DEVICE); 41428c2ecf20Sopenharmony_ci if (dma_mapping_error(ctx->dev, edesc->qm_sg_dma)) { 41438c2ecf20Sopenharmony_ci dev_err(ctx->dev, "unable to map S/G table\n"); 41448c2ecf20Sopenharmony_ci ret = -ENOMEM; 41458c2ecf20Sopenharmony_ci goto unmap; 41468c2ecf20Sopenharmony_ci } 41478c2ecf20Sopenharmony_ci edesc->qm_sg_bytes = qm_sg_bytes; 41488c2ecf20Sopenharmony_ci 41498c2ecf20Sopenharmony_ci state->ctx_dma_len = digestsize; 41508c2ecf20Sopenharmony_ci state->ctx_dma = dma_map_single(ctx->dev, state->caam_ctx, digestsize, 41518c2ecf20Sopenharmony_ci DMA_FROM_DEVICE); 41528c2ecf20Sopenharmony_ci if (dma_mapping_error(ctx->dev, state->ctx_dma)) { 41538c2ecf20Sopenharmony_ci dev_err(ctx->dev, "unable to map ctx\n"); 41548c2ecf20Sopenharmony_ci state->ctx_dma = 0; 41558c2ecf20Sopenharmony_ci ret = -ENOMEM; 41568c2ecf20Sopenharmony_ci goto unmap; 41578c2ecf20Sopenharmony_ci } 41588c2ecf20Sopenharmony_ci 41598c2ecf20Sopenharmony_ci memset(&req_ctx->fd_flt, 0, sizeof(req_ctx->fd_flt)); 41608c2ecf20Sopenharmony_ci dpaa2_fl_set_final(in_fle, true); 41618c2ecf20Sopenharmony_ci dpaa2_fl_set_format(in_fle, dpaa2_fl_sg); 41628c2ecf20Sopenharmony_ci dpaa2_fl_set_addr(in_fle, edesc->qm_sg_dma); 41638c2ecf20Sopenharmony_ci dpaa2_fl_set_len(in_fle, buflen + req->nbytes); 41648c2ecf20Sopenharmony_ci dpaa2_fl_set_format(out_fle, dpaa2_fl_single); 41658c2ecf20Sopenharmony_ci dpaa2_fl_set_addr(out_fle, state->ctx_dma); 41668c2ecf20Sopenharmony_ci dpaa2_fl_set_len(out_fle, digestsize); 41678c2ecf20Sopenharmony_ci 41688c2ecf20Sopenharmony_ci req_ctx->flc = &ctx->flc[DIGEST]; 41698c2ecf20Sopenharmony_ci req_ctx->flc_dma = ctx->flc_dma[DIGEST]; 41708c2ecf20Sopenharmony_ci req_ctx->cbk = ahash_done; 41718c2ecf20Sopenharmony_ci req_ctx->ctx = &req->base; 41728c2ecf20Sopenharmony_ci req_ctx->edesc = edesc; 41738c2ecf20Sopenharmony_ci ret = dpaa2_caam_enqueue(ctx->dev, req_ctx); 41748c2ecf20Sopenharmony_ci if (ret != -EINPROGRESS && 41758c2ecf20Sopenharmony_ci !(ret == -EBUSY && req->base.flags & CRYPTO_TFM_REQ_MAY_BACKLOG)) 41768c2ecf20Sopenharmony_ci goto unmap; 41778c2ecf20Sopenharmony_ci 41788c2ecf20Sopenharmony_ci return ret; 41798c2ecf20Sopenharmony_ciunmap: 41808c2ecf20Sopenharmony_ci ahash_unmap_ctx(ctx->dev, edesc, req, DMA_FROM_DEVICE); 41818c2ecf20Sopenharmony_ci qi_cache_free(edesc); 41828c2ecf20Sopenharmony_ci return ret; 41838c2ecf20Sopenharmony_ci} 41848c2ecf20Sopenharmony_ci 41858c2ecf20Sopenharmony_cistatic int ahash_update_first(struct ahash_request *req) 41868c2ecf20Sopenharmony_ci{ 41878c2ecf20Sopenharmony_ci struct crypto_ahash *ahash = crypto_ahash_reqtfm(req); 41888c2ecf20Sopenharmony_ci struct caam_hash_ctx *ctx = crypto_ahash_ctx(ahash); 41898c2ecf20Sopenharmony_ci struct caam_hash_state *state = ahash_request_ctx(req); 41908c2ecf20Sopenharmony_ci struct caam_request *req_ctx = &state->caam_req; 41918c2ecf20Sopenharmony_ci struct dpaa2_fl_entry *in_fle = &req_ctx->fd_flt[1]; 41928c2ecf20Sopenharmony_ci struct dpaa2_fl_entry *out_fle = &req_ctx->fd_flt[0]; 41938c2ecf20Sopenharmony_ci gfp_t flags = (req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP) ? 41948c2ecf20Sopenharmony_ci GFP_KERNEL : GFP_ATOMIC; 41958c2ecf20Sopenharmony_ci u8 *buf = state->buf; 41968c2ecf20Sopenharmony_ci int *buflen = &state->buflen; 41978c2ecf20Sopenharmony_ci int *next_buflen = &state->next_buflen; 41988c2ecf20Sopenharmony_ci int to_hash; 41998c2ecf20Sopenharmony_ci int src_nents, mapped_nents; 42008c2ecf20Sopenharmony_ci struct ahash_edesc *edesc; 42018c2ecf20Sopenharmony_ci int ret = 0; 42028c2ecf20Sopenharmony_ci 42038c2ecf20Sopenharmony_ci *next_buflen = req->nbytes & (crypto_tfm_alg_blocksize(&ahash->base) - 42048c2ecf20Sopenharmony_ci 1); 42058c2ecf20Sopenharmony_ci to_hash = req->nbytes - *next_buflen; 42068c2ecf20Sopenharmony_ci 42078c2ecf20Sopenharmony_ci if (to_hash) { 42088c2ecf20Sopenharmony_ci struct dpaa2_sg_entry *sg_table; 42098c2ecf20Sopenharmony_ci int src_len = req->nbytes - *next_buflen; 42108c2ecf20Sopenharmony_ci 42118c2ecf20Sopenharmony_ci src_nents = sg_nents_for_len(req->src, src_len); 42128c2ecf20Sopenharmony_ci if (src_nents < 0) { 42138c2ecf20Sopenharmony_ci dev_err(ctx->dev, "Invalid number of src SG.\n"); 42148c2ecf20Sopenharmony_ci return src_nents; 42158c2ecf20Sopenharmony_ci } 42168c2ecf20Sopenharmony_ci 42178c2ecf20Sopenharmony_ci if (src_nents) { 42188c2ecf20Sopenharmony_ci mapped_nents = dma_map_sg(ctx->dev, req->src, src_nents, 42198c2ecf20Sopenharmony_ci DMA_TO_DEVICE); 42208c2ecf20Sopenharmony_ci if (!mapped_nents) { 42218c2ecf20Sopenharmony_ci dev_err(ctx->dev, "unable to map source for DMA\n"); 42228c2ecf20Sopenharmony_ci return -ENOMEM; 42238c2ecf20Sopenharmony_ci } 42248c2ecf20Sopenharmony_ci } else { 42258c2ecf20Sopenharmony_ci mapped_nents = 0; 42268c2ecf20Sopenharmony_ci } 42278c2ecf20Sopenharmony_ci 42288c2ecf20Sopenharmony_ci /* allocate space for base edesc and link tables */ 42298c2ecf20Sopenharmony_ci edesc = qi_cache_zalloc(GFP_DMA | flags); 42308c2ecf20Sopenharmony_ci if (!edesc) { 42318c2ecf20Sopenharmony_ci dma_unmap_sg(ctx->dev, req->src, src_nents, 42328c2ecf20Sopenharmony_ci DMA_TO_DEVICE); 42338c2ecf20Sopenharmony_ci return -ENOMEM; 42348c2ecf20Sopenharmony_ci } 42358c2ecf20Sopenharmony_ci 42368c2ecf20Sopenharmony_ci edesc->src_nents = src_nents; 42378c2ecf20Sopenharmony_ci sg_table = &edesc->sgt[0]; 42388c2ecf20Sopenharmony_ci 42398c2ecf20Sopenharmony_ci memset(&req_ctx->fd_flt, 0, sizeof(req_ctx->fd_flt)); 42408c2ecf20Sopenharmony_ci dpaa2_fl_set_final(in_fle, true); 42418c2ecf20Sopenharmony_ci dpaa2_fl_set_len(in_fle, to_hash); 42428c2ecf20Sopenharmony_ci 42438c2ecf20Sopenharmony_ci if (mapped_nents > 1) { 42448c2ecf20Sopenharmony_ci int qm_sg_bytes; 42458c2ecf20Sopenharmony_ci 42468c2ecf20Sopenharmony_ci sg_to_qm_sg_last(req->src, src_len, sg_table, 0); 42478c2ecf20Sopenharmony_ci qm_sg_bytes = pad_sg_nents(mapped_nents) * 42488c2ecf20Sopenharmony_ci sizeof(*sg_table); 42498c2ecf20Sopenharmony_ci edesc->qm_sg_dma = dma_map_single(ctx->dev, sg_table, 42508c2ecf20Sopenharmony_ci qm_sg_bytes, 42518c2ecf20Sopenharmony_ci DMA_TO_DEVICE); 42528c2ecf20Sopenharmony_ci if (dma_mapping_error(ctx->dev, edesc->qm_sg_dma)) { 42538c2ecf20Sopenharmony_ci dev_err(ctx->dev, "unable to map S/G table\n"); 42548c2ecf20Sopenharmony_ci ret = -ENOMEM; 42558c2ecf20Sopenharmony_ci goto unmap_ctx; 42568c2ecf20Sopenharmony_ci } 42578c2ecf20Sopenharmony_ci edesc->qm_sg_bytes = qm_sg_bytes; 42588c2ecf20Sopenharmony_ci dpaa2_fl_set_format(in_fle, dpaa2_fl_sg); 42598c2ecf20Sopenharmony_ci dpaa2_fl_set_addr(in_fle, edesc->qm_sg_dma); 42608c2ecf20Sopenharmony_ci } else { 42618c2ecf20Sopenharmony_ci dpaa2_fl_set_format(in_fle, dpaa2_fl_single); 42628c2ecf20Sopenharmony_ci dpaa2_fl_set_addr(in_fle, sg_dma_address(req->src)); 42638c2ecf20Sopenharmony_ci } 42648c2ecf20Sopenharmony_ci 42658c2ecf20Sopenharmony_ci state->ctx_dma_len = ctx->ctx_len; 42668c2ecf20Sopenharmony_ci state->ctx_dma = dma_map_single(ctx->dev, state->caam_ctx, 42678c2ecf20Sopenharmony_ci ctx->ctx_len, DMA_FROM_DEVICE); 42688c2ecf20Sopenharmony_ci if (dma_mapping_error(ctx->dev, state->ctx_dma)) { 42698c2ecf20Sopenharmony_ci dev_err(ctx->dev, "unable to map ctx\n"); 42708c2ecf20Sopenharmony_ci state->ctx_dma = 0; 42718c2ecf20Sopenharmony_ci ret = -ENOMEM; 42728c2ecf20Sopenharmony_ci goto unmap_ctx; 42738c2ecf20Sopenharmony_ci } 42748c2ecf20Sopenharmony_ci 42758c2ecf20Sopenharmony_ci dpaa2_fl_set_format(out_fle, dpaa2_fl_single); 42768c2ecf20Sopenharmony_ci dpaa2_fl_set_addr(out_fle, state->ctx_dma); 42778c2ecf20Sopenharmony_ci dpaa2_fl_set_len(out_fle, ctx->ctx_len); 42788c2ecf20Sopenharmony_ci 42798c2ecf20Sopenharmony_ci req_ctx->flc = &ctx->flc[UPDATE_FIRST]; 42808c2ecf20Sopenharmony_ci req_ctx->flc_dma = ctx->flc_dma[UPDATE_FIRST]; 42818c2ecf20Sopenharmony_ci req_ctx->cbk = ahash_done_ctx_dst; 42828c2ecf20Sopenharmony_ci req_ctx->ctx = &req->base; 42838c2ecf20Sopenharmony_ci req_ctx->edesc = edesc; 42848c2ecf20Sopenharmony_ci 42858c2ecf20Sopenharmony_ci ret = dpaa2_caam_enqueue(ctx->dev, req_ctx); 42868c2ecf20Sopenharmony_ci if (ret != -EINPROGRESS && 42878c2ecf20Sopenharmony_ci !(ret == -EBUSY && req->base.flags & 42888c2ecf20Sopenharmony_ci CRYPTO_TFM_REQ_MAY_BACKLOG)) 42898c2ecf20Sopenharmony_ci goto unmap_ctx; 42908c2ecf20Sopenharmony_ci 42918c2ecf20Sopenharmony_ci state->update = ahash_update_ctx; 42928c2ecf20Sopenharmony_ci state->finup = ahash_finup_ctx; 42938c2ecf20Sopenharmony_ci state->final = ahash_final_ctx; 42948c2ecf20Sopenharmony_ci } else if (*next_buflen) { 42958c2ecf20Sopenharmony_ci state->update = ahash_update_no_ctx; 42968c2ecf20Sopenharmony_ci state->finup = ahash_finup_no_ctx; 42978c2ecf20Sopenharmony_ci state->final = ahash_final_no_ctx; 42988c2ecf20Sopenharmony_ci scatterwalk_map_and_copy(buf, req->src, 0, 42998c2ecf20Sopenharmony_ci req->nbytes, 0); 43008c2ecf20Sopenharmony_ci *buflen = *next_buflen; 43018c2ecf20Sopenharmony_ci 43028c2ecf20Sopenharmony_ci print_hex_dump_debug("buf@" __stringify(__LINE__)": ", 43038c2ecf20Sopenharmony_ci DUMP_PREFIX_ADDRESS, 16, 4, buf, 43048c2ecf20Sopenharmony_ci *buflen, 1); 43058c2ecf20Sopenharmony_ci } 43068c2ecf20Sopenharmony_ci 43078c2ecf20Sopenharmony_ci return ret; 43088c2ecf20Sopenharmony_ciunmap_ctx: 43098c2ecf20Sopenharmony_ci ahash_unmap_ctx(ctx->dev, edesc, req, DMA_TO_DEVICE); 43108c2ecf20Sopenharmony_ci qi_cache_free(edesc); 43118c2ecf20Sopenharmony_ci return ret; 43128c2ecf20Sopenharmony_ci} 43138c2ecf20Sopenharmony_ci 43148c2ecf20Sopenharmony_cistatic int ahash_finup_first(struct ahash_request *req) 43158c2ecf20Sopenharmony_ci{ 43168c2ecf20Sopenharmony_ci return ahash_digest(req); 43178c2ecf20Sopenharmony_ci} 43188c2ecf20Sopenharmony_ci 43198c2ecf20Sopenharmony_cistatic int ahash_init(struct ahash_request *req) 43208c2ecf20Sopenharmony_ci{ 43218c2ecf20Sopenharmony_ci struct caam_hash_state *state = ahash_request_ctx(req); 43228c2ecf20Sopenharmony_ci 43238c2ecf20Sopenharmony_ci state->update = ahash_update_first; 43248c2ecf20Sopenharmony_ci state->finup = ahash_finup_first; 43258c2ecf20Sopenharmony_ci state->final = ahash_final_no_ctx; 43268c2ecf20Sopenharmony_ci 43278c2ecf20Sopenharmony_ci state->ctx_dma = 0; 43288c2ecf20Sopenharmony_ci state->ctx_dma_len = 0; 43298c2ecf20Sopenharmony_ci state->buf_dma = 0; 43308c2ecf20Sopenharmony_ci state->buflen = 0; 43318c2ecf20Sopenharmony_ci state->next_buflen = 0; 43328c2ecf20Sopenharmony_ci 43338c2ecf20Sopenharmony_ci return 0; 43348c2ecf20Sopenharmony_ci} 43358c2ecf20Sopenharmony_ci 43368c2ecf20Sopenharmony_cistatic int ahash_update(struct ahash_request *req) 43378c2ecf20Sopenharmony_ci{ 43388c2ecf20Sopenharmony_ci struct caam_hash_state *state = ahash_request_ctx(req); 43398c2ecf20Sopenharmony_ci 43408c2ecf20Sopenharmony_ci return state->update(req); 43418c2ecf20Sopenharmony_ci} 43428c2ecf20Sopenharmony_ci 43438c2ecf20Sopenharmony_cistatic int ahash_finup(struct ahash_request *req) 43448c2ecf20Sopenharmony_ci{ 43458c2ecf20Sopenharmony_ci struct caam_hash_state *state = ahash_request_ctx(req); 43468c2ecf20Sopenharmony_ci 43478c2ecf20Sopenharmony_ci return state->finup(req); 43488c2ecf20Sopenharmony_ci} 43498c2ecf20Sopenharmony_ci 43508c2ecf20Sopenharmony_cistatic int ahash_final(struct ahash_request *req) 43518c2ecf20Sopenharmony_ci{ 43528c2ecf20Sopenharmony_ci struct caam_hash_state *state = ahash_request_ctx(req); 43538c2ecf20Sopenharmony_ci 43548c2ecf20Sopenharmony_ci return state->final(req); 43558c2ecf20Sopenharmony_ci} 43568c2ecf20Sopenharmony_ci 43578c2ecf20Sopenharmony_cistatic int ahash_export(struct ahash_request *req, void *out) 43588c2ecf20Sopenharmony_ci{ 43598c2ecf20Sopenharmony_ci struct caam_hash_state *state = ahash_request_ctx(req); 43608c2ecf20Sopenharmony_ci struct caam_export_state *export = out; 43618c2ecf20Sopenharmony_ci u8 *buf = state->buf; 43628c2ecf20Sopenharmony_ci int len = state->buflen; 43638c2ecf20Sopenharmony_ci 43648c2ecf20Sopenharmony_ci memcpy(export->buf, buf, len); 43658c2ecf20Sopenharmony_ci memcpy(export->caam_ctx, state->caam_ctx, sizeof(export->caam_ctx)); 43668c2ecf20Sopenharmony_ci export->buflen = len; 43678c2ecf20Sopenharmony_ci export->update = state->update; 43688c2ecf20Sopenharmony_ci export->final = state->final; 43698c2ecf20Sopenharmony_ci export->finup = state->finup; 43708c2ecf20Sopenharmony_ci 43718c2ecf20Sopenharmony_ci return 0; 43728c2ecf20Sopenharmony_ci} 43738c2ecf20Sopenharmony_ci 43748c2ecf20Sopenharmony_cistatic int ahash_import(struct ahash_request *req, const void *in) 43758c2ecf20Sopenharmony_ci{ 43768c2ecf20Sopenharmony_ci struct caam_hash_state *state = ahash_request_ctx(req); 43778c2ecf20Sopenharmony_ci const struct caam_export_state *export = in; 43788c2ecf20Sopenharmony_ci 43798c2ecf20Sopenharmony_ci memset(state, 0, sizeof(*state)); 43808c2ecf20Sopenharmony_ci memcpy(state->buf, export->buf, export->buflen); 43818c2ecf20Sopenharmony_ci memcpy(state->caam_ctx, export->caam_ctx, sizeof(state->caam_ctx)); 43828c2ecf20Sopenharmony_ci state->buflen = export->buflen; 43838c2ecf20Sopenharmony_ci state->update = export->update; 43848c2ecf20Sopenharmony_ci state->final = export->final; 43858c2ecf20Sopenharmony_ci state->finup = export->finup; 43868c2ecf20Sopenharmony_ci 43878c2ecf20Sopenharmony_ci return 0; 43888c2ecf20Sopenharmony_ci} 43898c2ecf20Sopenharmony_ci 43908c2ecf20Sopenharmony_cistruct caam_hash_template { 43918c2ecf20Sopenharmony_ci char name[CRYPTO_MAX_ALG_NAME]; 43928c2ecf20Sopenharmony_ci char driver_name[CRYPTO_MAX_ALG_NAME]; 43938c2ecf20Sopenharmony_ci char hmac_name[CRYPTO_MAX_ALG_NAME]; 43948c2ecf20Sopenharmony_ci char hmac_driver_name[CRYPTO_MAX_ALG_NAME]; 43958c2ecf20Sopenharmony_ci unsigned int blocksize; 43968c2ecf20Sopenharmony_ci struct ahash_alg template_ahash; 43978c2ecf20Sopenharmony_ci u32 alg_type; 43988c2ecf20Sopenharmony_ci}; 43998c2ecf20Sopenharmony_ci 44008c2ecf20Sopenharmony_ci/* ahash descriptors */ 44018c2ecf20Sopenharmony_cistatic struct caam_hash_template driver_hash[] = { 44028c2ecf20Sopenharmony_ci { 44038c2ecf20Sopenharmony_ci .name = "sha1", 44048c2ecf20Sopenharmony_ci .driver_name = "sha1-caam-qi2", 44058c2ecf20Sopenharmony_ci .hmac_name = "hmac(sha1)", 44068c2ecf20Sopenharmony_ci .hmac_driver_name = "hmac-sha1-caam-qi2", 44078c2ecf20Sopenharmony_ci .blocksize = SHA1_BLOCK_SIZE, 44088c2ecf20Sopenharmony_ci .template_ahash = { 44098c2ecf20Sopenharmony_ci .init = ahash_init, 44108c2ecf20Sopenharmony_ci .update = ahash_update, 44118c2ecf20Sopenharmony_ci .final = ahash_final, 44128c2ecf20Sopenharmony_ci .finup = ahash_finup, 44138c2ecf20Sopenharmony_ci .digest = ahash_digest, 44148c2ecf20Sopenharmony_ci .export = ahash_export, 44158c2ecf20Sopenharmony_ci .import = ahash_import, 44168c2ecf20Sopenharmony_ci .setkey = ahash_setkey, 44178c2ecf20Sopenharmony_ci .halg = { 44188c2ecf20Sopenharmony_ci .digestsize = SHA1_DIGEST_SIZE, 44198c2ecf20Sopenharmony_ci .statesize = sizeof(struct caam_export_state), 44208c2ecf20Sopenharmony_ci }, 44218c2ecf20Sopenharmony_ci }, 44228c2ecf20Sopenharmony_ci .alg_type = OP_ALG_ALGSEL_SHA1, 44238c2ecf20Sopenharmony_ci }, { 44248c2ecf20Sopenharmony_ci .name = "sha224", 44258c2ecf20Sopenharmony_ci .driver_name = "sha224-caam-qi2", 44268c2ecf20Sopenharmony_ci .hmac_name = "hmac(sha224)", 44278c2ecf20Sopenharmony_ci .hmac_driver_name = "hmac-sha224-caam-qi2", 44288c2ecf20Sopenharmony_ci .blocksize = SHA224_BLOCK_SIZE, 44298c2ecf20Sopenharmony_ci .template_ahash = { 44308c2ecf20Sopenharmony_ci .init = ahash_init, 44318c2ecf20Sopenharmony_ci .update = ahash_update, 44328c2ecf20Sopenharmony_ci .final = ahash_final, 44338c2ecf20Sopenharmony_ci .finup = ahash_finup, 44348c2ecf20Sopenharmony_ci .digest = ahash_digest, 44358c2ecf20Sopenharmony_ci .export = ahash_export, 44368c2ecf20Sopenharmony_ci .import = ahash_import, 44378c2ecf20Sopenharmony_ci .setkey = ahash_setkey, 44388c2ecf20Sopenharmony_ci .halg = { 44398c2ecf20Sopenharmony_ci .digestsize = SHA224_DIGEST_SIZE, 44408c2ecf20Sopenharmony_ci .statesize = sizeof(struct caam_export_state), 44418c2ecf20Sopenharmony_ci }, 44428c2ecf20Sopenharmony_ci }, 44438c2ecf20Sopenharmony_ci .alg_type = OP_ALG_ALGSEL_SHA224, 44448c2ecf20Sopenharmony_ci }, { 44458c2ecf20Sopenharmony_ci .name = "sha256", 44468c2ecf20Sopenharmony_ci .driver_name = "sha256-caam-qi2", 44478c2ecf20Sopenharmony_ci .hmac_name = "hmac(sha256)", 44488c2ecf20Sopenharmony_ci .hmac_driver_name = "hmac-sha256-caam-qi2", 44498c2ecf20Sopenharmony_ci .blocksize = SHA256_BLOCK_SIZE, 44508c2ecf20Sopenharmony_ci .template_ahash = { 44518c2ecf20Sopenharmony_ci .init = ahash_init, 44528c2ecf20Sopenharmony_ci .update = ahash_update, 44538c2ecf20Sopenharmony_ci .final = ahash_final, 44548c2ecf20Sopenharmony_ci .finup = ahash_finup, 44558c2ecf20Sopenharmony_ci .digest = ahash_digest, 44568c2ecf20Sopenharmony_ci .export = ahash_export, 44578c2ecf20Sopenharmony_ci .import = ahash_import, 44588c2ecf20Sopenharmony_ci .setkey = ahash_setkey, 44598c2ecf20Sopenharmony_ci .halg = { 44608c2ecf20Sopenharmony_ci .digestsize = SHA256_DIGEST_SIZE, 44618c2ecf20Sopenharmony_ci .statesize = sizeof(struct caam_export_state), 44628c2ecf20Sopenharmony_ci }, 44638c2ecf20Sopenharmony_ci }, 44648c2ecf20Sopenharmony_ci .alg_type = OP_ALG_ALGSEL_SHA256, 44658c2ecf20Sopenharmony_ci }, { 44668c2ecf20Sopenharmony_ci .name = "sha384", 44678c2ecf20Sopenharmony_ci .driver_name = "sha384-caam-qi2", 44688c2ecf20Sopenharmony_ci .hmac_name = "hmac(sha384)", 44698c2ecf20Sopenharmony_ci .hmac_driver_name = "hmac-sha384-caam-qi2", 44708c2ecf20Sopenharmony_ci .blocksize = SHA384_BLOCK_SIZE, 44718c2ecf20Sopenharmony_ci .template_ahash = { 44728c2ecf20Sopenharmony_ci .init = ahash_init, 44738c2ecf20Sopenharmony_ci .update = ahash_update, 44748c2ecf20Sopenharmony_ci .final = ahash_final, 44758c2ecf20Sopenharmony_ci .finup = ahash_finup, 44768c2ecf20Sopenharmony_ci .digest = ahash_digest, 44778c2ecf20Sopenharmony_ci .export = ahash_export, 44788c2ecf20Sopenharmony_ci .import = ahash_import, 44798c2ecf20Sopenharmony_ci .setkey = ahash_setkey, 44808c2ecf20Sopenharmony_ci .halg = { 44818c2ecf20Sopenharmony_ci .digestsize = SHA384_DIGEST_SIZE, 44828c2ecf20Sopenharmony_ci .statesize = sizeof(struct caam_export_state), 44838c2ecf20Sopenharmony_ci }, 44848c2ecf20Sopenharmony_ci }, 44858c2ecf20Sopenharmony_ci .alg_type = OP_ALG_ALGSEL_SHA384, 44868c2ecf20Sopenharmony_ci }, { 44878c2ecf20Sopenharmony_ci .name = "sha512", 44888c2ecf20Sopenharmony_ci .driver_name = "sha512-caam-qi2", 44898c2ecf20Sopenharmony_ci .hmac_name = "hmac(sha512)", 44908c2ecf20Sopenharmony_ci .hmac_driver_name = "hmac-sha512-caam-qi2", 44918c2ecf20Sopenharmony_ci .blocksize = SHA512_BLOCK_SIZE, 44928c2ecf20Sopenharmony_ci .template_ahash = { 44938c2ecf20Sopenharmony_ci .init = ahash_init, 44948c2ecf20Sopenharmony_ci .update = ahash_update, 44958c2ecf20Sopenharmony_ci .final = ahash_final, 44968c2ecf20Sopenharmony_ci .finup = ahash_finup, 44978c2ecf20Sopenharmony_ci .digest = ahash_digest, 44988c2ecf20Sopenharmony_ci .export = ahash_export, 44998c2ecf20Sopenharmony_ci .import = ahash_import, 45008c2ecf20Sopenharmony_ci .setkey = ahash_setkey, 45018c2ecf20Sopenharmony_ci .halg = { 45028c2ecf20Sopenharmony_ci .digestsize = SHA512_DIGEST_SIZE, 45038c2ecf20Sopenharmony_ci .statesize = sizeof(struct caam_export_state), 45048c2ecf20Sopenharmony_ci }, 45058c2ecf20Sopenharmony_ci }, 45068c2ecf20Sopenharmony_ci .alg_type = OP_ALG_ALGSEL_SHA512, 45078c2ecf20Sopenharmony_ci }, { 45088c2ecf20Sopenharmony_ci .name = "md5", 45098c2ecf20Sopenharmony_ci .driver_name = "md5-caam-qi2", 45108c2ecf20Sopenharmony_ci .hmac_name = "hmac(md5)", 45118c2ecf20Sopenharmony_ci .hmac_driver_name = "hmac-md5-caam-qi2", 45128c2ecf20Sopenharmony_ci .blocksize = MD5_BLOCK_WORDS * 4, 45138c2ecf20Sopenharmony_ci .template_ahash = { 45148c2ecf20Sopenharmony_ci .init = ahash_init, 45158c2ecf20Sopenharmony_ci .update = ahash_update, 45168c2ecf20Sopenharmony_ci .final = ahash_final, 45178c2ecf20Sopenharmony_ci .finup = ahash_finup, 45188c2ecf20Sopenharmony_ci .digest = ahash_digest, 45198c2ecf20Sopenharmony_ci .export = ahash_export, 45208c2ecf20Sopenharmony_ci .import = ahash_import, 45218c2ecf20Sopenharmony_ci .setkey = ahash_setkey, 45228c2ecf20Sopenharmony_ci .halg = { 45238c2ecf20Sopenharmony_ci .digestsize = MD5_DIGEST_SIZE, 45248c2ecf20Sopenharmony_ci .statesize = sizeof(struct caam_export_state), 45258c2ecf20Sopenharmony_ci }, 45268c2ecf20Sopenharmony_ci }, 45278c2ecf20Sopenharmony_ci .alg_type = OP_ALG_ALGSEL_MD5, 45288c2ecf20Sopenharmony_ci } 45298c2ecf20Sopenharmony_ci}; 45308c2ecf20Sopenharmony_ci 45318c2ecf20Sopenharmony_cistruct caam_hash_alg { 45328c2ecf20Sopenharmony_ci struct list_head entry; 45338c2ecf20Sopenharmony_ci struct device *dev; 45348c2ecf20Sopenharmony_ci int alg_type; 45358c2ecf20Sopenharmony_ci struct ahash_alg ahash_alg; 45368c2ecf20Sopenharmony_ci}; 45378c2ecf20Sopenharmony_ci 45388c2ecf20Sopenharmony_cistatic int caam_hash_cra_init(struct crypto_tfm *tfm) 45398c2ecf20Sopenharmony_ci{ 45408c2ecf20Sopenharmony_ci struct crypto_ahash *ahash = __crypto_ahash_cast(tfm); 45418c2ecf20Sopenharmony_ci struct crypto_alg *base = tfm->__crt_alg; 45428c2ecf20Sopenharmony_ci struct hash_alg_common *halg = 45438c2ecf20Sopenharmony_ci container_of(base, struct hash_alg_common, base); 45448c2ecf20Sopenharmony_ci struct ahash_alg *alg = 45458c2ecf20Sopenharmony_ci container_of(halg, struct ahash_alg, halg); 45468c2ecf20Sopenharmony_ci struct caam_hash_alg *caam_hash = 45478c2ecf20Sopenharmony_ci container_of(alg, struct caam_hash_alg, ahash_alg); 45488c2ecf20Sopenharmony_ci struct caam_hash_ctx *ctx = crypto_tfm_ctx(tfm); 45498c2ecf20Sopenharmony_ci /* Sizes for MDHA running digests: MD5, SHA1, 224, 256, 384, 512 */ 45508c2ecf20Sopenharmony_ci static const u8 runninglen[] = { HASH_MSG_LEN + MD5_DIGEST_SIZE, 45518c2ecf20Sopenharmony_ci HASH_MSG_LEN + SHA1_DIGEST_SIZE, 45528c2ecf20Sopenharmony_ci HASH_MSG_LEN + 32, 45538c2ecf20Sopenharmony_ci HASH_MSG_LEN + SHA256_DIGEST_SIZE, 45548c2ecf20Sopenharmony_ci HASH_MSG_LEN + 64, 45558c2ecf20Sopenharmony_ci HASH_MSG_LEN + SHA512_DIGEST_SIZE }; 45568c2ecf20Sopenharmony_ci dma_addr_t dma_addr; 45578c2ecf20Sopenharmony_ci int i; 45588c2ecf20Sopenharmony_ci 45598c2ecf20Sopenharmony_ci ctx->dev = caam_hash->dev; 45608c2ecf20Sopenharmony_ci 45618c2ecf20Sopenharmony_ci if (alg->setkey) { 45628c2ecf20Sopenharmony_ci ctx->adata.key_dma = dma_map_single_attrs(ctx->dev, ctx->key, 45638c2ecf20Sopenharmony_ci ARRAY_SIZE(ctx->key), 45648c2ecf20Sopenharmony_ci DMA_TO_DEVICE, 45658c2ecf20Sopenharmony_ci DMA_ATTR_SKIP_CPU_SYNC); 45668c2ecf20Sopenharmony_ci if (dma_mapping_error(ctx->dev, ctx->adata.key_dma)) { 45678c2ecf20Sopenharmony_ci dev_err(ctx->dev, "unable to map key\n"); 45688c2ecf20Sopenharmony_ci return -ENOMEM; 45698c2ecf20Sopenharmony_ci } 45708c2ecf20Sopenharmony_ci } 45718c2ecf20Sopenharmony_ci 45728c2ecf20Sopenharmony_ci dma_addr = dma_map_single_attrs(ctx->dev, ctx->flc, sizeof(ctx->flc), 45738c2ecf20Sopenharmony_ci DMA_BIDIRECTIONAL, 45748c2ecf20Sopenharmony_ci DMA_ATTR_SKIP_CPU_SYNC); 45758c2ecf20Sopenharmony_ci if (dma_mapping_error(ctx->dev, dma_addr)) { 45768c2ecf20Sopenharmony_ci dev_err(ctx->dev, "unable to map shared descriptors\n"); 45778c2ecf20Sopenharmony_ci if (ctx->adata.key_dma) 45788c2ecf20Sopenharmony_ci dma_unmap_single_attrs(ctx->dev, ctx->adata.key_dma, 45798c2ecf20Sopenharmony_ci ARRAY_SIZE(ctx->key), 45808c2ecf20Sopenharmony_ci DMA_TO_DEVICE, 45818c2ecf20Sopenharmony_ci DMA_ATTR_SKIP_CPU_SYNC); 45828c2ecf20Sopenharmony_ci return -ENOMEM; 45838c2ecf20Sopenharmony_ci } 45848c2ecf20Sopenharmony_ci 45858c2ecf20Sopenharmony_ci for (i = 0; i < HASH_NUM_OP; i++) 45868c2ecf20Sopenharmony_ci ctx->flc_dma[i] = dma_addr + i * sizeof(ctx->flc[i]); 45878c2ecf20Sopenharmony_ci 45888c2ecf20Sopenharmony_ci /* copy descriptor header template value */ 45898c2ecf20Sopenharmony_ci ctx->adata.algtype = OP_TYPE_CLASS2_ALG | caam_hash->alg_type; 45908c2ecf20Sopenharmony_ci 45918c2ecf20Sopenharmony_ci ctx->ctx_len = runninglen[(ctx->adata.algtype & 45928c2ecf20Sopenharmony_ci OP_ALG_ALGSEL_SUBMASK) >> 45938c2ecf20Sopenharmony_ci OP_ALG_ALGSEL_SHIFT]; 45948c2ecf20Sopenharmony_ci 45958c2ecf20Sopenharmony_ci crypto_ahash_set_reqsize(__crypto_ahash_cast(tfm), 45968c2ecf20Sopenharmony_ci sizeof(struct caam_hash_state)); 45978c2ecf20Sopenharmony_ci 45988c2ecf20Sopenharmony_ci /* 45998c2ecf20Sopenharmony_ci * For keyed hash algorithms shared descriptors 46008c2ecf20Sopenharmony_ci * will be created later in setkey() callback 46018c2ecf20Sopenharmony_ci */ 46028c2ecf20Sopenharmony_ci return alg->setkey ? 0 : ahash_set_sh_desc(ahash); 46038c2ecf20Sopenharmony_ci} 46048c2ecf20Sopenharmony_ci 46058c2ecf20Sopenharmony_cistatic void caam_hash_cra_exit(struct crypto_tfm *tfm) 46068c2ecf20Sopenharmony_ci{ 46078c2ecf20Sopenharmony_ci struct caam_hash_ctx *ctx = crypto_tfm_ctx(tfm); 46088c2ecf20Sopenharmony_ci 46098c2ecf20Sopenharmony_ci dma_unmap_single_attrs(ctx->dev, ctx->flc_dma[0], sizeof(ctx->flc), 46108c2ecf20Sopenharmony_ci DMA_BIDIRECTIONAL, DMA_ATTR_SKIP_CPU_SYNC); 46118c2ecf20Sopenharmony_ci if (ctx->adata.key_dma) 46128c2ecf20Sopenharmony_ci dma_unmap_single_attrs(ctx->dev, ctx->adata.key_dma, 46138c2ecf20Sopenharmony_ci ARRAY_SIZE(ctx->key), DMA_TO_DEVICE, 46148c2ecf20Sopenharmony_ci DMA_ATTR_SKIP_CPU_SYNC); 46158c2ecf20Sopenharmony_ci} 46168c2ecf20Sopenharmony_ci 46178c2ecf20Sopenharmony_cistatic struct caam_hash_alg *caam_hash_alloc(struct device *dev, 46188c2ecf20Sopenharmony_ci struct caam_hash_template *template, bool keyed) 46198c2ecf20Sopenharmony_ci{ 46208c2ecf20Sopenharmony_ci struct caam_hash_alg *t_alg; 46218c2ecf20Sopenharmony_ci struct ahash_alg *halg; 46228c2ecf20Sopenharmony_ci struct crypto_alg *alg; 46238c2ecf20Sopenharmony_ci 46248c2ecf20Sopenharmony_ci t_alg = kzalloc(sizeof(*t_alg), GFP_KERNEL); 46258c2ecf20Sopenharmony_ci if (!t_alg) 46268c2ecf20Sopenharmony_ci return ERR_PTR(-ENOMEM); 46278c2ecf20Sopenharmony_ci 46288c2ecf20Sopenharmony_ci t_alg->ahash_alg = template->template_ahash; 46298c2ecf20Sopenharmony_ci halg = &t_alg->ahash_alg; 46308c2ecf20Sopenharmony_ci alg = &halg->halg.base; 46318c2ecf20Sopenharmony_ci 46328c2ecf20Sopenharmony_ci if (keyed) { 46338c2ecf20Sopenharmony_ci snprintf(alg->cra_name, CRYPTO_MAX_ALG_NAME, "%s", 46348c2ecf20Sopenharmony_ci template->hmac_name); 46358c2ecf20Sopenharmony_ci snprintf(alg->cra_driver_name, CRYPTO_MAX_ALG_NAME, "%s", 46368c2ecf20Sopenharmony_ci template->hmac_driver_name); 46378c2ecf20Sopenharmony_ci } else { 46388c2ecf20Sopenharmony_ci snprintf(alg->cra_name, CRYPTO_MAX_ALG_NAME, "%s", 46398c2ecf20Sopenharmony_ci template->name); 46408c2ecf20Sopenharmony_ci snprintf(alg->cra_driver_name, CRYPTO_MAX_ALG_NAME, "%s", 46418c2ecf20Sopenharmony_ci template->driver_name); 46428c2ecf20Sopenharmony_ci t_alg->ahash_alg.setkey = NULL; 46438c2ecf20Sopenharmony_ci } 46448c2ecf20Sopenharmony_ci alg->cra_module = THIS_MODULE; 46458c2ecf20Sopenharmony_ci alg->cra_init = caam_hash_cra_init; 46468c2ecf20Sopenharmony_ci alg->cra_exit = caam_hash_cra_exit; 46478c2ecf20Sopenharmony_ci alg->cra_ctxsize = sizeof(struct caam_hash_ctx); 46488c2ecf20Sopenharmony_ci alg->cra_priority = CAAM_CRA_PRIORITY; 46498c2ecf20Sopenharmony_ci alg->cra_blocksize = template->blocksize; 46508c2ecf20Sopenharmony_ci alg->cra_alignmask = 0; 46518c2ecf20Sopenharmony_ci alg->cra_flags = CRYPTO_ALG_ASYNC | CRYPTO_ALG_ALLOCATES_MEMORY; 46528c2ecf20Sopenharmony_ci 46538c2ecf20Sopenharmony_ci t_alg->alg_type = template->alg_type; 46548c2ecf20Sopenharmony_ci t_alg->dev = dev; 46558c2ecf20Sopenharmony_ci 46568c2ecf20Sopenharmony_ci return t_alg; 46578c2ecf20Sopenharmony_ci} 46588c2ecf20Sopenharmony_ci 46598c2ecf20Sopenharmony_cistatic void dpaa2_caam_fqdan_cb(struct dpaa2_io_notification_ctx *nctx) 46608c2ecf20Sopenharmony_ci{ 46618c2ecf20Sopenharmony_ci struct dpaa2_caam_priv_per_cpu *ppriv; 46628c2ecf20Sopenharmony_ci 46638c2ecf20Sopenharmony_ci ppriv = container_of(nctx, struct dpaa2_caam_priv_per_cpu, nctx); 46648c2ecf20Sopenharmony_ci napi_schedule_irqoff(&ppriv->napi); 46658c2ecf20Sopenharmony_ci} 46668c2ecf20Sopenharmony_ci 46678c2ecf20Sopenharmony_cistatic int __cold dpaa2_dpseci_dpio_setup(struct dpaa2_caam_priv *priv) 46688c2ecf20Sopenharmony_ci{ 46698c2ecf20Sopenharmony_ci struct device *dev = priv->dev; 46708c2ecf20Sopenharmony_ci struct dpaa2_io_notification_ctx *nctx; 46718c2ecf20Sopenharmony_ci struct dpaa2_caam_priv_per_cpu *ppriv; 46728c2ecf20Sopenharmony_ci int err, i = 0, cpu; 46738c2ecf20Sopenharmony_ci 46748c2ecf20Sopenharmony_ci for_each_online_cpu(cpu) { 46758c2ecf20Sopenharmony_ci ppriv = per_cpu_ptr(priv->ppriv, cpu); 46768c2ecf20Sopenharmony_ci ppriv->priv = priv; 46778c2ecf20Sopenharmony_ci nctx = &ppriv->nctx; 46788c2ecf20Sopenharmony_ci nctx->is_cdan = 0; 46798c2ecf20Sopenharmony_ci nctx->id = ppriv->rsp_fqid; 46808c2ecf20Sopenharmony_ci nctx->desired_cpu = cpu; 46818c2ecf20Sopenharmony_ci nctx->cb = dpaa2_caam_fqdan_cb; 46828c2ecf20Sopenharmony_ci 46838c2ecf20Sopenharmony_ci /* Register notification callbacks */ 46848c2ecf20Sopenharmony_ci ppriv->dpio = dpaa2_io_service_select(cpu); 46858c2ecf20Sopenharmony_ci err = dpaa2_io_service_register(ppriv->dpio, nctx, dev); 46868c2ecf20Sopenharmony_ci if (unlikely(err)) { 46878c2ecf20Sopenharmony_ci dev_dbg(dev, "No affine DPIO for cpu %d\n", cpu); 46888c2ecf20Sopenharmony_ci nctx->cb = NULL; 46898c2ecf20Sopenharmony_ci /* 46908c2ecf20Sopenharmony_ci * If no affine DPIO for this core, there's probably 46918c2ecf20Sopenharmony_ci * none available for next cores either. Signal we want 46928c2ecf20Sopenharmony_ci * to retry later, in case the DPIO devices weren't 46938c2ecf20Sopenharmony_ci * probed yet. 46948c2ecf20Sopenharmony_ci */ 46958c2ecf20Sopenharmony_ci err = -EPROBE_DEFER; 46968c2ecf20Sopenharmony_ci goto err; 46978c2ecf20Sopenharmony_ci } 46988c2ecf20Sopenharmony_ci 46998c2ecf20Sopenharmony_ci ppriv->store = dpaa2_io_store_create(DPAA2_CAAM_STORE_SIZE, 47008c2ecf20Sopenharmony_ci dev); 47018c2ecf20Sopenharmony_ci if (unlikely(!ppriv->store)) { 47028c2ecf20Sopenharmony_ci dev_err(dev, "dpaa2_io_store_create() failed\n"); 47038c2ecf20Sopenharmony_ci err = -ENOMEM; 47048c2ecf20Sopenharmony_ci goto err; 47058c2ecf20Sopenharmony_ci } 47068c2ecf20Sopenharmony_ci 47078c2ecf20Sopenharmony_ci if (++i == priv->num_pairs) 47088c2ecf20Sopenharmony_ci break; 47098c2ecf20Sopenharmony_ci } 47108c2ecf20Sopenharmony_ci 47118c2ecf20Sopenharmony_ci return 0; 47128c2ecf20Sopenharmony_ci 47138c2ecf20Sopenharmony_cierr: 47148c2ecf20Sopenharmony_ci for_each_online_cpu(cpu) { 47158c2ecf20Sopenharmony_ci ppriv = per_cpu_ptr(priv->ppriv, cpu); 47168c2ecf20Sopenharmony_ci if (!ppriv->nctx.cb) 47178c2ecf20Sopenharmony_ci break; 47188c2ecf20Sopenharmony_ci dpaa2_io_service_deregister(ppriv->dpio, &ppriv->nctx, dev); 47198c2ecf20Sopenharmony_ci } 47208c2ecf20Sopenharmony_ci 47218c2ecf20Sopenharmony_ci for_each_online_cpu(cpu) { 47228c2ecf20Sopenharmony_ci ppriv = per_cpu_ptr(priv->ppriv, cpu); 47238c2ecf20Sopenharmony_ci if (!ppriv->store) 47248c2ecf20Sopenharmony_ci break; 47258c2ecf20Sopenharmony_ci dpaa2_io_store_destroy(ppriv->store); 47268c2ecf20Sopenharmony_ci } 47278c2ecf20Sopenharmony_ci 47288c2ecf20Sopenharmony_ci return err; 47298c2ecf20Sopenharmony_ci} 47308c2ecf20Sopenharmony_ci 47318c2ecf20Sopenharmony_cistatic void __cold dpaa2_dpseci_dpio_free(struct dpaa2_caam_priv *priv) 47328c2ecf20Sopenharmony_ci{ 47338c2ecf20Sopenharmony_ci struct dpaa2_caam_priv_per_cpu *ppriv; 47348c2ecf20Sopenharmony_ci int i = 0, cpu; 47358c2ecf20Sopenharmony_ci 47368c2ecf20Sopenharmony_ci for_each_online_cpu(cpu) { 47378c2ecf20Sopenharmony_ci ppriv = per_cpu_ptr(priv->ppriv, cpu); 47388c2ecf20Sopenharmony_ci dpaa2_io_service_deregister(ppriv->dpio, &ppriv->nctx, 47398c2ecf20Sopenharmony_ci priv->dev); 47408c2ecf20Sopenharmony_ci dpaa2_io_store_destroy(ppriv->store); 47418c2ecf20Sopenharmony_ci 47428c2ecf20Sopenharmony_ci if (++i == priv->num_pairs) 47438c2ecf20Sopenharmony_ci return; 47448c2ecf20Sopenharmony_ci } 47458c2ecf20Sopenharmony_ci} 47468c2ecf20Sopenharmony_ci 47478c2ecf20Sopenharmony_cistatic int dpaa2_dpseci_bind(struct dpaa2_caam_priv *priv) 47488c2ecf20Sopenharmony_ci{ 47498c2ecf20Sopenharmony_ci struct dpseci_rx_queue_cfg rx_queue_cfg; 47508c2ecf20Sopenharmony_ci struct device *dev = priv->dev; 47518c2ecf20Sopenharmony_ci struct fsl_mc_device *ls_dev = to_fsl_mc_device(dev); 47528c2ecf20Sopenharmony_ci struct dpaa2_caam_priv_per_cpu *ppriv; 47538c2ecf20Sopenharmony_ci int err = 0, i = 0, cpu; 47548c2ecf20Sopenharmony_ci 47558c2ecf20Sopenharmony_ci /* Configure Rx queues */ 47568c2ecf20Sopenharmony_ci for_each_online_cpu(cpu) { 47578c2ecf20Sopenharmony_ci ppriv = per_cpu_ptr(priv->ppriv, cpu); 47588c2ecf20Sopenharmony_ci 47598c2ecf20Sopenharmony_ci rx_queue_cfg.options = DPSECI_QUEUE_OPT_DEST | 47608c2ecf20Sopenharmony_ci DPSECI_QUEUE_OPT_USER_CTX; 47618c2ecf20Sopenharmony_ci rx_queue_cfg.order_preservation_en = 0; 47628c2ecf20Sopenharmony_ci rx_queue_cfg.dest_cfg.dest_type = DPSECI_DEST_DPIO; 47638c2ecf20Sopenharmony_ci rx_queue_cfg.dest_cfg.dest_id = ppriv->nctx.dpio_id; 47648c2ecf20Sopenharmony_ci /* 47658c2ecf20Sopenharmony_ci * Rx priority (WQ) doesn't really matter, since we use 47668c2ecf20Sopenharmony_ci * pull mode, i.e. volatile dequeues from specific FQs 47678c2ecf20Sopenharmony_ci */ 47688c2ecf20Sopenharmony_ci rx_queue_cfg.dest_cfg.priority = 0; 47698c2ecf20Sopenharmony_ci rx_queue_cfg.user_ctx = ppriv->nctx.qman64; 47708c2ecf20Sopenharmony_ci 47718c2ecf20Sopenharmony_ci err = dpseci_set_rx_queue(priv->mc_io, 0, ls_dev->mc_handle, i, 47728c2ecf20Sopenharmony_ci &rx_queue_cfg); 47738c2ecf20Sopenharmony_ci if (err) { 47748c2ecf20Sopenharmony_ci dev_err(dev, "dpseci_set_rx_queue() failed with err %d\n", 47758c2ecf20Sopenharmony_ci err); 47768c2ecf20Sopenharmony_ci return err; 47778c2ecf20Sopenharmony_ci } 47788c2ecf20Sopenharmony_ci 47798c2ecf20Sopenharmony_ci if (++i == priv->num_pairs) 47808c2ecf20Sopenharmony_ci break; 47818c2ecf20Sopenharmony_ci } 47828c2ecf20Sopenharmony_ci 47838c2ecf20Sopenharmony_ci return err; 47848c2ecf20Sopenharmony_ci} 47858c2ecf20Sopenharmony_ci 47868c2ecf20Sopenharmony_cistatic void dpaa2_dpseci_congestion_free(struct dpaa2_caam_priv *priv) 47878c2ecf20Sopenharmony_ci{ 47888c2ecf20Sopenharmony_ci struct device *dev = priv->dev; 47898c2ecf20Sopenharmony_ci 47908c2ecf20Sopenharmony_ci if (!priv->cscn_mem) 47918c2ecf20Sopenharmony_ci return; 47928c2ecf20Sopenharmony_ci 47938c2ecf20Sopenharmony_ci dma_unmap_single(dev, priv->cscn_dma, DPAA2_CSCN_SIZE, DMA_FROM_DEVICE); 47948c2ecf20Sopenharmony_ci kfree(priv->cscn_mem); 47958c2ecf20Sopenharmony_ci} 47968c2ecf20Sopenharmony_ci 47978c2ecf20Sopenharmony_cistatic void dpaa2_dpseci_free(struct dpaa2_caam_priv *priv) 47988c2ecf20Sopenharmony_ci{ 47998c2ecf20Sopenharmony_ci struct device *dev = priv->dev; 48008c2ecf20Sopenharmony_ci struct fsl_mc_device *ls_dev = to_fsl_mc_device(dev); 48018c2ecf20Sopenharmony_ci int err; 48028c2ecf20Sopenharmony_ci 48038c2ecf20Sopenharmony_ci if (DPSECI_VER(priv->major_ver, priv->minor_ver) > DPSECI_VER(5, 3)) { 48048c2ecf20Sopenharmony_ci err = dpseci_reset(priv->mc_io, 0, ls_dev->mc_handle); 48058c2ecf20Sopenharmony_ci if (err) 48068c2ecf20Sopenharmony_ci dev_err(dev, "dpseci_reset() failed\n"); 48078c2ecf20Sopenharmony_ci } 48088c2ecf20Sopenharmony_ci 48098c2ecf20Sopenharmony_ci dpaa2_dpseci_congestion_free(priv); 48108c2ecf20Sopenharmony_ci dpseci_close(priv->mc_io, 0, ls_dev->mc_handle); 48118c2ecf20Sopenharmony_ci} 48128c2ecf20Sopenharmony_ci 48138c2ecf20Sopenharmony_cistatic void dpaa2_caam_process_fd(struct dpaa2_caam_priv *priv, 48148c2ecf20Sopenharmony_ci const struct dpaa2_fd *fd) 48158c2ecf20Sopenharmony_ci{ 48168c2ecf20Sopenharmony_ci struct caam_request *req; 48178c2ecf20Sopenharmony_ci u32 fd_err; 48188c2ecf20Sopenharmony_ci 48198c2ecf20Sopenharmony_ci if (dpaa2_fd_get_format(fd) != dpaa2_fd_list) { 48208c2ecf20Sopenharmony_ci dev_err(priv->dev, "Only Frame List FD format is supported!\n"); 48218c2ecf20Sopenharmony_ci return; 48228c2ecf20Sopenharmony_ci } 48238c2ecf20Sopenharmony_ci 48248c2ecf20Sopenharmony_ci fd_err = dpaa2_fd_get_ctrl(fd) & FD_CTRL_ERR_MASK; 48258c2ecf20Sopenharmony_ci if (unlikely(fd_err)) 48268c2ecf20Sopenharmony_ci dev_err_ratelimited(priv->dev, "FD error: %08x\n", fd_err); 48278c2ecf20Sopenharmony_ci 48288c2ecf20Sopenharmony_ci /* 48298c2ecf20Sopenharmony_ci * FD[ADDR] is guaranteed to be valid, irrespective of errors reported 48308c2ecf20Sopenharmony_ci * in FD[ERR] or FD[FRC]. 48318c2ecf20Sopenharmony_ci */ 48328c2ecf20Sopenharmony_ci req = dpaa2_caam_iova_to_virt(priv, dpaa2_fd_get_addr(fd)); 48338c2ecf20Sopenharmony_ci dma_unmap_single(priv->dev, req->fd_flt_dma, sizeof(req->fd_flt), 48348c2ecf20Sopenharmony_ci DMA_BIDIRECTIONAL); 48358c2ecf20Sopenharmony_ci req->cbk(req->ctx, dpaa2_fd_get_frc(fd)); 48368c2ecf20Sopenharmony_ci} 48378c2ecf20Sopenharmony_ci 48388c2ecf20Sopenharmony_cistatic int dpaa2_caam_pull_fq(struct dpaa2_caam_priv_per_cpu *ppriv) 48398c2ecf20Sopenharmony_ci{ 48408c2ecf20Sopenharmony_ci int err; 48418c2ecf20Sopenharmony_ci 48428c2ecf20Sopenharmony_ci /* Retry while portal is busy */ 48438c2ecf20Sopenharmony_ci do { 48448c2ecf20Sopenharmony_ci err = dpaa2_io_service_pull_fq(ppriv->dpio, ppriv->rsp_fqid, 48458c2ecf20Sopenharmony_ci ppriv->store); 48468c2ecf20Sopenharmony_ci } while (err == -EBUSY); 48478c2ecf20Sopenharmony_ci 48488c2ecf20Sopenharmony_ci if (unlikely(err)) 48498c2ecf20Sopenharmony_ci dev_err(ppriv->priv->dev, "dpaa2_io_service_pull err %d", err); 48508c2ecf20Sopenharmony_ci 48518c2ecf20Sopenharmony_ci return err; 48528c2ecf20Sopenharmony_ci} 48538c2ecf20Sopenharmony_ci 48548c2ecf20Sopenharmony_cistatic int dpaa2_caam_store_consume(struct dpaa2_caam_priv_per_cpu *ppriv) 48558c2ecf20Sopenharmony_ci{ 48568c2ecf20Sopenharmony_ci struct dpaa2_dq *dq; 48578c2ecf20Sopenharmony_ci int cleaned = 0, is_last; 48588c2ecf20Sopenharmony_ci 48598c2ecf20Sopenharmony_ci do { 48608c2ecf20Sopenharmony_ci dq = dpaa2_io_store_next(ppriv->store, &is_last); 48618c2ecf20Sopenharmony_ci if (unlikely(!dq)) { 48628c2ecf20Sopenharmony_ci if (unlikely(!is_last)) { 48638c2ecf20Sopenharmony_ci dev_dbg(ppriv->priv->dev, 48648c2ecf20Sopenharmony_ci "FQ %d returned no valid frames\n", 48658c2ecf20Sopenharmony_ci ppriv->rsp_fqid); 48668c2ecf20Sopenharmony_ci /* 48678c2ecf20Sopenharmony_ci * MUST retry until we get some sort of 48688c2ecf20Sopenharmony_ci * valid response token (be it "empty dequeue" 48698c2ecf20Sopenharmony_ci * or a valid frame). 48708c2ecf20Sopenharmony_ci */ 48718c2ecf20Sopenharmony_ci continue; 48728c2ecf20Sopenharmony_ci } 48738c2ecf20Sopenharmony_ci break; 48748c2ecf20Sopenharmony_ci } 48758c2ecf20Sopenharmony_ci 48768c2ecf20Sopenharmony_ci /* Process FD */ 48778c2ecf20Sopenharmony_ci dpaa2_caam_process_fd(ppriv->priv, dpaa2_dq_fd(dq)); 48788c2ecf20Sopenharmony_ci cleaned++; 48798c2ecf20Sopenharmony_ci } while (!is_last); 48808c2ecf20Sopenharmony_ci 48818c2ecf20Sopenharmony_ci return cleaned; 48828c2ecf20Sopenharmony_ci} 48838c2ecf20Sopenharmony_ci 48848c2ecf20Sopenharmony_cistatic int dpaa2_dpseci_poll(struct napi_struct *napi, int budget) 48858c2ecf20Sopenharmony_ci{ 48868c2ecf20Sopenharmony_ci struct dpaa2_caam_priv_per_cpu *ppriv; 48878c2ecf20Sopenharmony_ci struct dpaa2_caam_priv *priv; 48888c2ecf20Sopenharmony_ci int err, cleaned = 0, store_cleaned; 48898c2ecf20Sopenharmony_ci 48908c2ecf20Sopenharmony_ci ppriv = container_of(napi, struct dpaa2_caam_priv_per_cpu, napi); 48918c2ecf20Sopenharmony_ci priv = ppriv->priv; 48928c2ecf20Sopenharmony_ci 48938c2ecf20Sopenharmony_ci if (unlikely(dpaa2_caam_pull_fq(ppriv))) 48948c2ecf20Sopenharmony_ci return 0; 48958c2ecf20Sopenharmony_ci 48968c2ecf20Sopenharmony_ci do { 48978c2ecf20Sopenharmony_ci store_cleaned = dpaa2_caam_store_consume(ppriv); 48988c2ecf20Sopenharmony_ci cleaned += store_cleaned; 48998c2ecf20Sopenharmony_ci 49008c2ecf20Sopenharmony_ci if (store_cleaned == 0 || 49018c2ecf20Sopenharmony_ci cleaned > budget - DPAA2_CAAM_STORE_SIZE) 49028c2ecf20Sopenharmony_ci break; 49038c2ecf20Sopenharmony_ci 49048c2ecf20Sopenharmony_ci /* Try to dequeue some more */ 49058c2ecf20Sopenharmony_ci err = dpaa2_caam_pull_fq(ppriv); 49068c2ecf20Sopenharmony_ci if (unlikely(err)) 49078c2ecf20Sopenharmony_ci break; 49088c2ecf20Sopenharmony_ci } while (1); 49098c2ecf20Sopenharmony_ci 49108c2ecf20Sopenharmony_ci if (cleaned < budget) { 49118c2ecf20Sopenharmony_ci napi_complete_done(napi, cleaned); 49128c2ecf20Sopenharmony_ci err = dpaa2_io_service_rearm(ppriv->dpio, &ppriv->nctx); 49138c2ecf20Sopenharmony_ci if (unlikely(err)) 49148c2ecf20Sopenharmony_ci dev_err(priv->dev, "Notification rearm failed: %d\n", 49158c2ecf20Sopenharmony_ci err); 49168c2ecf20Sopenharmony_ci } 49178c2ecf20Sopenharmony_ci 49188c2ecf20Sopenharmony_ci return cleaned; 49198c2ecf20Sopenharmony_ci} 49208c2ecf20Sopenharmony_ci 49218c2ecf20Sopenharmony_cistatic int dpaa2_dpseci_congestion_setup(struct dpaa2_caam_priv *priv, 49228c2ecf20Sopenharmony_ci u16 token) 49238c2ecf20Sopenharmony_ci{ 49248c2ecf20Sopenharmony_ci struct dpseci_congestion_notification_cfg cong_notif_cfg = { 0 }; 49258c2ecf20Sopenharmony_ci struct device *dev = priv->dev; 49268c2ecf20Sopenharmony_ci int err; 49278c2ecf20Sopenharmony_ci 49288c2ecf20Sopenharmony_ci /* 49298c2ecf20Sopenharmony_ci * Congestion group feature supported starting with DPSECI API v5.1 49308c2ecf20Sopenharmony_ci * and only when object has been created with this capability. 49318c2ecf20Sopenharmony_ci */ 49328c2ecf20Sopenharmony_ci if ((DPSECI_VER(priv->major_ver, priv->minor_ver) < DPSECI_VER(5, 1)) || 49338c2ecf20Sopenharmony_ci !(priv->dpseci_attr.options & DPSECI_OPT_HAS_CG)) 49348c2ecf20Sopenharmony_ci return 0; 49358c2ecf20Sopenharmony_ci 49368c2ecf20Sopenharmony_ci priv->cscn_mem = kzalloc(DPAA2_CSCN_SIZE + DPAA2_CSCN_ALIGN, 49378c2ecf20Sopenharmony_ci GFP_KERNEL | GFP_DMA); 49388c2ecf20Sopenharmony_ci if (!priv->cscn_mem) 49398c2ecf20Sopenharmony_ci return -ENOMEM; 49408c2ecf20Sopenharmony_ci 49418c2ecf20Sopenharmony_ci priv->cscn_mem_aligned = PTR_ALIGN(priv->cscn_mem, DPAA2_CSCN_ALIGN); 49428c2ecf20Sopenharmony_ci priv->cscn_dma = dma_map_single(dev, priv->cscn_mem_aligned, 49438c2ecf20Sopenharmony_ci DPAA2_CSCN_SIZE, DMA_FROM_DEVICE); 49448c2ecf20Sopenharmony_ci if (dma_mapping_error(dev, priv->cscn_dma)) { 49458c2ecf20Sopenharmony_ci dev_err(dev, "Error mapping CSCN memory area\n"); 49468c2ecf20Sopenharmony_ci err = -ENOMEM; 49478c2ecf20Sopenharmony_ci goto err_dma_map; 49488c2ecf20Sopenharmony_ci } 49498c2ecf20Sopenharmony_ci 49508c2ecf20Sopenharmony_ci cong_notif_cfg.units = DPSECI_CONGESTION_UNIT_BYTES; 49518c2ecf20Sopenharmony_ci cong_notif_cfg.threshold_entry = DPAA2_SEC_CONG_ENTRY_THRESH; 49528c2ecf20Sopenharmony_ci cong_notif_cfg.threshold_exit = DPAA2_SEC_CONG_EXIT_THRESH; 49538c2ecf20Sopenharmony_ci cong_notif_cfg.message_ctx = (uintptr_t)priv; 49548c2ecf20Sopenharmony_ci cong_notif_cfg.message_iova = priv->cscn_dma; 49558c2ecf20Sopenharmony_ci cong_notif_cfg.notification_mode = DPSECI_CGN_MODE_WRITE_MEM_ON_ENTER | 49568c2ecf20Sopenharmony_ci DPSECI_CGN_MODE_WRITE_MEM_ON_EXIT | 49578c2ecf20Sopenharmony_ci DPSECI_CGN_MODE_COHERENT_WRITE; 49588c2ecf20Sopenharmony_ci 49598c2ecf20Sopenharmony_ci err = dpseci_set_congestion_notification(priv->mc_io, 0, token, 49608c2ecf20Sopenharmony_ci &cong_notif_cfg); 49618c2ecf20Sopenharmony_ci if (err) { 49628c2ecf20Sopenharmony_ci dev_err(dev, "dpseci_set_congestion_notification failed\n"); 49638c2ecf20Sopenharmony_ci goto err_set_cong; 49648c2ecf20Sopenharmony_ci } 49658c2ecf20Sopenharmony_ci 49668c2ecf20Sopenharmony_ci return 0; 49678c2ecf20Sopenharmony_ci 49688c2ecf20Sopenharmony_cierr_set_cong: 49698c2ecf20Sopenharmony_ci dma_unmap_single(dev, priv->cscn_dma, DPAA2_CSCN_SIZE, DMA_FROM_DEVICE); 49708c2ecf20Sopenharmony_cierr_dma_map: 49718c2ecf20Sopenharmony_ci kfree(priv->cscn_mem); 49728c2ecf20Sopenharmony_ci 49738c2ecf20Sopenharmony_ci return err; 49748c2ecf20Sopenharmony_ci} 49758c2ecf20Sopenharmony_ci 49768c2ecf20Sopenharmony_cistatic int __cold dpaa2_dpseci_setup(struct fsl_mc_device *ls_dev) 49778c2ecf20Sopenharmony_ci{ 49788c2ecf20Sopenharmony_ci struct device *dev = &ls_dev->dev; 49798c2ecf20Sopenharmony_ci struct dpaa2_caam_priv *priv; 49808c2ecf20Sopenharmony_ci struct dpaa2_caam_priv_per_cpu *ppriv; 49818c2ecf20Sopenharmony_ci int err, cpu; 49828c2ecf20Sopenharmony_ci u8 i; 49838c2ecf20Sopenharmony_ci 49848c2ecf20Sopenharmony_ci priv = dev_get_drvdata(dev); 49858c2ecf20Sopenharmony_ci 49868c2ecf20Sopenharmony_ci priv->dev = dev; 49878c2ecf20Sopenharmony_ci priv->dpsec_id = ls_dev->obj_desc.id; 49888c2ecf20Sopenharmony_ci 49898c2ecf20Sopenharmony_ci /* Get a handle for the DPSECI this interface is associate with */ 49908c2ecf20Sopenharmony_ci err = dpseci_open(priv->mc_io, 0, priv->dpsec_id, &ls_dev->mc_handle); 49918c2ecf20Sopenharmony_ci if (err) { 49928c2ecf20Sopenharmony_ci dev_err(dev, "dpseci_open() failed: %d\n", err); 49938c2ecf20Sopenharmony_ci goto err_open; 49948c2ecf20Sopenharmony_ci } 49958c2ecf20Sopenharmony_ci 49968c2ecf20Sopenharmony_ci err = dpseci_get_api_version(priv->mc_io, 0, &priv->major_ver, 49978c2ecf20Sopenharmony_ci &priv->minor_ver); 49988c2ecf20Sopenharmony_ci if (err) { 49998c2ecf20Sopenharmony_ci dev_err(dev, "dpseci_get_api_version() failed\n"); 50008c2ecf20Sopenharmony_ci goto err_get_vers; 50018c2ecf20Sopenharmony_ci } 50028c2ecf20Sopenharmony_ci 50038c2ecf20Sopenharmony_ci dev_info(dev, "dpseci v%d.%d\n", priv->major_ver, priv->minor_ver); 50048c2ecf20Sopenharmony_ci 50058c2ecf20Sopenharmony_ci if (DPSECI_VER(priv->major_ver, priv->minor_ver) > DPSECI_VER(5, 3)) { 50068c2ecf20Sopenharmony_ci err = dpseci_reset(priv->mc_io, 0, ls_dev->mc_handle); 50078c2ecf20Sopenharmony_ci if (err) { 50088c2ecf20Sopenharmony_ci dev_err(dev, "dpseci_reset() failed\n"); 50098c2ecf20Sopenharmony_ci goto err_get_vers; 50108c2ecf20Sopenharmony_ci } 50118c2ecf20Sopenharmony_ci } 50128c2ecf20Sopenharmony_ci 50138c2ecf20Sopenharmony_ci err = dpseci_get_attributes(priv->mc_io, 0, ls_dev->mc_handle, 50148c2ecf20Sopenharmony_ci &priv->dpseci_attr); 50158c2ecf20Sopenharmony_ci if (err) { 50168c2ecf20Sopenharmony_ci dev_err(dev, "dpseci_get_attributes() failed\n"); 50178c2ecf20Sopenharmony_ci goto err_get_vers; 50188c2ecf20Sopenharmony_ci } 50198c2ecf20Sopenharmony_ci 50208c2ecf20Sopenharmony_ci err = dpseci_get_sec_attr(priv->mc_io, 0, ls_dev->mc_handle, 50218c2ecf20Sopenharmony_ci &priv->sec_attr); 50228c2ecf20Sopenharmony_ci if (err) { 50238c2ecf20Sopenharmony_ci dev_err(dev, "dpseci_get_sec_attr() failed\n"); 50248c2ecf20Sopenharmony_ci goto err_get_vers; 50258c2ecf20Sopenharmony_ci } 50268c2ecf20Sopenharmony_ci 50278c2ecf20Sopenharmony_ci err = dpaa2_dpseci_congestion_setup(priv, ls_dev->mc_handle); 50288c2ecf20Sopenharmony_ci if (err) { 50298c2ecf20Sopenharmony_ci dev_err(dev, "setup_congestion() failed\n"); 50308c2ecf20Sopenharmony_ci goto err_get_vers; 50318c2ecf20Sopenharmony_ci } 50328c2ecf20Sopenharmony_ci 50338c2ecf20Sopenharmony_ci priv->num_pairs = min(priv->dpseci_attr.num_rx_queues, 50348c2ecf20Sopenharmony_ci priv->dpseci_attr.num_tx_queues); 50358c2ecf20Sopenharmony_ci if (priv->num_pairs > num_online_cpus()) { 50368c2ecf20Sopenharmony_ci dev_warn(dev, "%d queues won't be used\n", 50378c2ecf20Sopenharmony_ci priv->num_pairs - num_online_cpus()); 50388c2ecf20Sopenharmony_ci priv->num_pairs = num_online_cpus(); 50398c2ecf20Sopenharmony_ci } 50408c2ecf20Sopenharmony_ci 50418c2ecf20Sopenharmony_ci for (i = 0; i < priv->dpseci_attr.num_rx_queues; i++) { 50428c2ecf20Sopenharmony_ci err = dpseci_get_rx_queue(priv->mc_io, 0, ls_dev->mc_handle, i, 50438c2ecf20Sopenharmony_ci &priv->rx_queue_attr[i]); 50448c2ecf20Sopenharmony_ci if (err) { 50458c2ecf20Sopenharmony_ci dev_err(dev, "dpseci_get_rx_queue() failed\n"); 50468c2ecf20Sopenharmony_ci goto err_get_rx_queue; 50478c2ecf20Sopenharmony_ci } 50488c2ecf20Sopenharmony_ci } 50498c2ecf20Sopenharmony_ci 50508c2ecf20Sopenharmony_ci for (i = 0; i < priv->dpseci_attr.num_tx_queues; i++) { 50518c2ecf20Sopenharmony_ci err = dpseci_get_tx_queue(priv->mc_io, 0, ls_dev->mc_handle, i, 50528c2ecf20Sopenharmony_ci &priv->tx_queue_attr[i]); 50538c2ecf20Sopenharmony_ci if (err) { 50548c2ecf20Sopenharmony_ci dev_err(dev, "dpseci_get_tx_queue() failed\n"); 50558c2ecf20Sopenharmony_ci goto err_get_rx_queue; 50568c2ecf20Sopenharmony_ci } 50578c2ecf20Sopenharmony_ci } 50588c2ecf20Sopenharmony_ci 50598c2ecf20Sopenharmony_ci i = 0; 50608c2ecf20Sopenharmony_ci for_each_online_cpu(cpu) { 50618c2ecf20Sopenharmony_ci u8 j; 50628c2ecf20Sopenharmony_ci 50638c2ecf20Sopenharmony_ci j = i % priv->num_pairs; 50648c2ecf20Sopenharmony_ci 50658c2ecf20Sopenharmony_ci ppriv = per_cpu_ptr(priv->ppriv, cpu); 50668c2ecf20Sopenharmony_ci ppriv->req_fqid = priv->tx_queue_attr[j].fqid; 50678c2ecf20Sopenharmony_ci 50688c2ecf20Sopenharmony_ci /* 50698c2ecf20Sopenharmony_ci * Allow all cores to enqueue, while only some of them 50708c2ecf20Sopenharmony_ci * will take part in dequeuing. 50718c2ecf20Sopenharmony_ci */ 50728c2ecf20Sopenharmony_ci if (++i > priv->num_pairs) 50738c2ecf20Sopenharmony_ci continue; 50748c2ecf20Sopenharmony_ci 50758c2ecf20Sopenharmony_ci ppriv->rsp_fqid = priv->rx_queue_attr[j].fqid; 50768c2ecf20Sopenharmony_ci ppriv->prio = j; 50778c2ecf20Sopenharmony_ci 50788c2ecf20Sopenharmony_ci dev_dbg(dev, "pair %d: rx queue %d, tx queue %d\n", j, 50798c2ecf20Sopenharmony_ci priv->rx_queue_attr[j].fqid, 50808c2ecf20Sopenharmony_ci priv->tx_queue_attr[j].fqid); 50818c2ecf20Sopenharmony_ci 50828c2ecf20Sopenharmony_ci ppriv->net_dev.dev = *dev; 50838c2ecf20Sopenharmony_ci INIT_LIST_HEAD(&ppriv->net_dev.napi_list); 50848c2ecf20Sopenharmony_ci netif_napi_add(&ppriv->net_dev, &ppriv->napi, dpaa2_dpseci_poll, 50858c2ecf20Sopenharmony_ci DPAA2_CAAM_NAPI_WEIGHT); 50868c2ecf20Sopenharmony_ci } 50878c2ecf20Sopenharmony_ci 50888c2ecf20Sopenharmony_ci return 0; 50898c2ecf20Sopenharmony_ci 50908c2ecf20Sopenharmony_cierr_get_rx_queue: 50918c2ecf20Sopenharmony_ci dpaa2_dpseci_congestion_free(priv); 50928c2ecf20Sopenharmony_cierr_get_vers: 50938c2ecf20Sopenharmony_ci dpseci_close(priv->mc_io, 0, ls_dev->mc_handle); 50948c2ecf20Sopenharmony_cierr_open: 50958c2ecf20Sopenharmony_ci return err; 50968c2ecf20Sopenharmony_ci} 50978c2ecf20Sopenharmony_ci 50988c2ecf20Sopenharmony_cistatic int dpaa2_dpseci_enable(struct dpaa2_caam_priv *priv) 50998c2ecf20Sopenharmony_ci{ 51008c2ecf20Sopenharmony_ci struct device *dev = priv->dev; 51018c2ecf20Sopenharmony_ci struct fsl_mc_device *ls_dev = to_fsl_mc_device(dev); 51028c2ecf20Sopenharmony_ci struct dpaa2_caam_priv_per_cpu *ppriv; 51038c2ecf20Sopenharmony_ci int i; 51048c2ecf20Sopenharmony_ci 51058c2ecf20Sopenharmony_ci for (i = 0; i < priv->num_pairs; i++) { 51068c2ecf20Sopenharmony_ci ppriv = per_cpu_ptr(priv->ppriv, i); 51078c2ecf20Sopenharmony_ci napi_enable(&ppriv->napi); 51088c2ecf20Sopenharmony_ci } 51098c2ecf20Sopenharmony_ci 51108c2ecf20Sopenharmony_ci return dpseci_enable(priv->mc_io, 0, ls_dev->mc_handle); 51118c2ecf20Sopenharmony_ci} 51128c2ecf20Sopenharmony_ci 51138c2ecf20Sopenharmony_cistatic int __cold dpaa2_dpseci_disable(struct dpaa2_caam_priv *priv) 51148c2ecf20Sopenharmony_ci{ 51158c2ecf20Sopenharmony_ci struct device *dev = priv->dev; 51168c2ecf20Sopenharmony_ci struct dpaa2_caam_priv_per_cpu *ppriv; 51178c2ecf20Sopenharmony_ci struct fsl_mc_device *ls_dev = to_fsl_mc_device(dev); 51188c2ecf20Sopenharmony_ci int i, err = 0, enabled; 51198c2ecf20Sopenharmony_ci 51208c2ecf20Sopenharmony_ci err = dpseci_disable(priv->mc_io, 0, ls_dev->mc_handle); 51218c2ecf20Sopenharmony_ci if (err) { 51228c2ecf20Sopenharmony_ci dev_err(dev, "dpseci_disable() failed\n"); 51238c2ecf20Sopenharmony_ci return err; 51248c2ecf20Sopenharmony_ci } 51258c2ecf20Sopenharmony_ci 51268c2ecf20Sopenharmony_ci err = dpseci_is_enabled(priv->mc_io, 0, ls_dev->mc_handle, &enabled); 51278c2ecf20Sopenharmony_ci if (err) { 51288c2ecf20Sopenharmony_ci dev_err(dev, "dpseci_is_enabled() failed\n"); 51298c2ecf20Sopenharmony_ci return err; 51308c2ecf20Sopenharmony_ci } 51318c2ecf20Sopenharmony_ci 51328c2ecf20Sopenharmony_ci dev_dbg(dev, "disable: %s\n", enabled ? "false" : "true"); 51338c2ecf20Sopenharmony_ci 51348c2ecf20Sopenharmony_ci for (i = 0; i < priv->num_pairs; i++) { 51358c2ecf20Sopenharmony_ci ppriv = per_cpu_ptr(priv->ppriv, i); 51368c2ecf20Sopenharmony_ci napi_disable(&ppriv->napi); 51378c2ecf20Sopenharmony_ci netif_napi_del(&ppriv->napi); 51388c2ecf20Sopenharmony_ci } 51398c2ecf20Sopenharmony_ci 51408c2ecf20Sopenharmony_ci return 0; 51418c2ecf20Sopenharmony_ci} 51428c2ecf20Sopenharmony_ci 51438c2ecf20Sopenharmony_cistatic struct list_head hash_list; 51448c2ecf20Sopenharmony_ci 51458c2ecf20Sopenharmony_cistatic int dpaa2_caam_probe(struct fsl_mc_device *dpseci_dev) 51468c2ecf20Sopenharmony_ci{ 51478c2ecf20Sopenharmony_ci struct device *dev; 51488c2ecf20Sopenharmony_ci struct dpaa2_caam_priv *priv; 51498c2ecf20Sopenharmony_ci int i, err = 0; 51508c2ecf20Sopenharmony_ci bool registered = false; 51518c2ecf20Sopenharmony_ci 51528c2ecf20Sopenharmony_ci /* 51538c2ecf20Sopenharmony_ci * There is no way to get CAAM endianness - there is no direct register 51548c2ecf20Sopenharmony_ci * space access and MC f/w does not provide this attribute. 51558c2ecf20Sopenharmony_ci * All DPAA2-based SoCs have little endian CAAM, thus hard-code this 51568c2ecf20Sopenharmony_ci * property. 51578c2ecf20Sopenharmony_ci */ 51588c2ecf20Sopenharmony_ci caam_little_end = true; 51598c2ecf20Sopenharmony_ci 51608c2ecf20Sopenharmony_ci caam_imx = false; 51618c2ecf20Sopenharmony_ci 51628c2ecf20Sopenharmony_ci dev = &dpseci_dev->dev; 51638c2ecf20Sopenharmony_ci 51648c2ecf20Sopenharmony_ci priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); 51658c2ecf20Sopenharmony_ci if (!priv) 51668c2ecf20Sopenharmony_ci return -ENOMEM; 51678c2ecf20Sopenharmony_ci 51688c2ecf20Sopenharmony_ci dev_set_drvdata(dev, priv); 51698c2ecf20Sopenharmony_ci 51708c2ecf20Sopenharmony_ci priv->domain = iommu_get_domain_for_dev(dev); 51718c2ecf20Sopenharmony_ci 51728c2ecf20Sopenharmony_ci qi_cache = kmem_cache_create("dpaa2_caamqicache", CAAM_QI_MEMCACHE_SIZE, 51738c2ecf20Sopenharmony_ci 0, SLAB_CACHE_DMA, NULL); 51748c2ecf20Sopenharmony_ci if (!qi_cache) { 51758c2ecf20Sopenharmony_ci dev_err(dev, "Can't allocate SEC cache\n"); 51768c2ecf20Sopenharmony_ci return -ENOMEM; 51778c2ecf20Sopenharmony_ci } 51788c2ecf20Sopenharmony_ci 51798c2ecf20Sopenharmony_ci err = dma_set_mask_and_coherent(dev, DMA_BIT_MASK(49)); 51808c2ecf20Sopenharmony_ci if (err) { 51818c2ecf20Sopenharmony_ci dev_err(dev, "dma_set_mask_and_coherent() failed\n"); 51828c2ecf20Sopenharmony_ci goto err_dma_mask; 51838c2ecf20Sopenharmony_ci } 51848c2ecf20Sopenharmony_ci 51858c2ecf20Sopenharmony_ci /* Obtain a MC portal */ 51868c2ecf20Sopenharmony_ci err = fsl_mc_portal_allocate(dpseci_dev, 0, &priv->mc_io); 51878c2ecf20Sopenharmony_ci if (err) { 51888c2ecf20Sopenharmony_ci if (err == -ENXIO) 51898c2ecf20Sopenharmony_ci err = -EPROBE_DEFER; 51908c2ecf20Sopenharmony_ci else 51918c2ecf20Sopenharmony_ci dev_err(dev, "MC portal allocation failed\n"); 51928c2ecf20Sopenharmony_ci 51938c2ecf20Sopenharmony_ci goto err_dma_mask; 51948c2ecf20Sopenharmony_ci } 51958c2ecf20Sopenharmony_ci 51968c2ecf20Sopenharmony_ci priv->ppriv = alloc_percpu(*priv->ppriv); 51978c2ecf20Sopenharmony_ci if (!priv->ppriv) { 51988c2ecf20Sopenharmony_ci dev_err(dev, "alloc_percpu() failed\n"); 51998c2ecf20Sopenharmony_ci err = -ENOMEM; 52008c2ecf20Sopenharmony_ci goto err_alloc_ppriv; 52018c2ecf20Sopenharmony_ci } 52028c2ecf20Sopenharmony_ci 52038c2ecf20Sopenharmony_ci /* DPSECI initialization */ 52048c2ecf20Sopenharmony_ci err = dpaa2_dpseci_setup(dpseci_dev); 52058c2ecf20Sopenharmony_ci if (err) { 52068c2ecf20Sopenharmony_ci dev_err(dev, "dpaa2_dpseci_setup() failed\n"); 52078c2ecf20Sopenharmony_ci goto err_dpseci_setup; 52088c2ecf20Sopenharmony_ci } 52098c2ecf20Sopenharmony_ci 52108c2ecf20Sopenharmony_ci /* DPIO */ 52118c2ecf20Sopenharmony_ci err = dpaa2_dpseci_dpio_setup(priv); 52128c2ecf20Sopenharmony_ci if (err) { 52138c2ecf20Sopenharmony_ci dev_err_probe(dev, err, "dpaa2_dpseci_dpio_setup() failed\n"); 52148c2ecf20Sopenharmony_ci goto err_dpio_setup; 52158c2ecf20Sopenharmony_ci } 52168c2ecf20Sopenharmony_ci 52178c2ecf20Sopenharmony_ci /* DPSECI binding to DPIO */ 52188c2ecf20Sopenharmony_ci err = dpaa2_dpseci_bind(priv); 52198c2ecf20Sopenharmony_ci if (err) { 52208c2ecf20Sopenharmony_ci dev_err(dev, "dpaa2_dpseci_bind() failed\n"); 52218c2ecf20Sopenharmony_ci goto err_bind; 52228c2ecf20Sopenharmony_ci } 52238c2ecf20Sopenharmony_ci 52248c2ecf20Sopenharmony_ci /* DPSECI enable */ 52258c2ecf20Sopenharmony_ci err = dpaa2_dpseci_enable(priv); 52268c2ecf20Sopenharmony_ci if (err) { 52278c2ecf20Sopenharmony_ci dev_err(dev, "dpaa2_dpseci_enable() failed\n"); 52288c2ecf20Sopenharmony_ci goto err_bind; 52298c2ecf20Sopenharmony_ci } 52308c2ecf20Sopenharmony_ci 52318c2ecf20Sopenharmony_ci dpaa2_dpseci_debugfs_init(priv); 52328c2ecf20Sopenharmony_ci 52338c2ecf20Sopenharmony_ci /* register crypto algorithms the device supports */ 52348c2ecf20Sopenharmony_ci for (i = 0; i < ARRAY_SIZE(driver_algs); i++) { 52358c2ecf20Sopenharmony_ci struct caam_skcipher_alg *t_alg = driver_algs + i; 52368c2ecf20Sopenharmony_ci u32 alg_sel = t_alg->caam.class1_alg_type & OP_ALG_ALGSEL_MASK; 52378c2ecf20Sopenharmony_ci 52388c2ecf20Sopenharmony_ci /* Skip DES algorithms if not supported by device */ 52398c2ecf20Sopenharmony_ci if (!priv->sec_attr.des_acc_num && 52408c2ecf20Sopenharmony_ci (alg_sel == OP_ALG_ALGSEL_3DES || 52418c2ecf20Sopenharmony_ci alg_sel == OP_ALG_ALGSEL_DES)) 52428c2ecf20Sopenharmony_ci continue; 52438c2ecf20Sopenharmony_ci 52448c2ecf20Sopenharmony_ci /* Skip AES algorithms if not supported by device */ 52458c2ecf20Sopenharmony_ci if (!priv->sec_attr.aes_acc_num && 52468c2ecf20Sopenharmony_ci alg_sel == OP_ALG_ALGSEL_AES) 52478c2ecf20Sopenharmony_ci continue; 52488c2ecf20Sopenharmony_ci 52498c2ecf20Sopenharmony_ci /* Skip CHACHA20 algorithms if not supported by device */ 52508c2ecf20Sopenharmony_ci if (alg_sel == OP_ALG_ALGSEL_CHACHA20 && 52518c2ecf20Sopenharmony_ci !priv->sec_attr.ccha_acc_num) 52528c2ecf20Sopenharmony_ci continue; 52538c2ecf20Sopenharmony_ci 52548c2ecf20Sopenharmony_ci t_alg->caam.dev = dev; 52558c2ecf20Sopenharmony_ci caam_skcipher_alg_init(t_alg); 52568c2ecf20Sopenharmony_ci 52578c2ecf20Sopenharmony_ci err = crypto_register_skcipher(&t_alg->skcipher); 52588c2ecf20Sopenharmony_ci if (err) { 52598c2ecf20Sopenharmony_ci dev_warn(dev, "%s alg registration failed: %d\n", 52608c2ecf20Sopenharmony_ci t_alg->skcipher.base.cra_driver_name, err); 52618c2ecf20Sopenharmony_ci continue; 52628c2ecf20Sopenharmony_ci } 52638c2ecf20Sopenharmony_ci 52648c2ecf20Sopenharmony_ci t_alg->registered = true; 52658c2ecf20Sopenharmony_ci registered = true; 52668c2ecf20Sopenharmony_ci } 52678c2ecf20Sopenharmony_ci 52688c2ecf20Sopenharmony_ci for (i = 0; i < ARRAY_SIZE(driver_aeads); i++) { 52698c2ecf20Sopenharmony_ci struct caam_aead_alg *t_alg = driver_aeads + i; 52708c2ecf20Sopenharmony_ci u32 c1_alg_sel = t_alg->caam.class1_alg_type & 52718c2ecf20Sopenharmony_ci OP_ALG_ALGSEL_MASK; 52728c2ecf20Sopenharmony_ci u32 c2_alg_sel = t_alg->caam.class2_alg_type & 52738c2ecf20Sopenharmony_ci OP_ALG_ALGSEL_MASK; 52748c2ecf20Sopenharmony_ci 52758c2ecf20Sopenharmony_ci /* Skip DES algorithms if not supported by device */ 52768c2ecf20Sopenharmony_ci if (!priv->sec_attr.des_acc_num && 52778c2ecf20Sopenharmony_ci (c1_alg_sel == OP_ALG_ALGSEL_3DES || 52788c2ecf20Sopenharmony_ci c1_alg_sel == OP_ALG_ALGSEL_DES)) 52798c2ecf20Sopenharmony_ci continue; 52808c2ecf20Sopenharmony_ci 52818c2ecf20Sopenharmony_ci /* Skip AES algorithms if not supported by device */ 52828c2ecf20Sopenharmony_ci if (!priv->sec_attr.aes_acc_num && 52838c2ecf20Sopenharmony_ci c1_alg_sel == OP_ALG_ALGSEL_AES) 52848c2ecf20Sopenharmony_ci continue; 52858c2ecf20Sopenharmony_ci 52868c2ecf20Sopenharmony_ci /* Skip CHACHA20 algorithms if not supported by device */ 52878c2ecf20Sopenharmony_ci if (c1_alg_sel == OP_ALG_ALGSEL_CHACHA20 && 52888c2ecf20Sopenharmony_ci !priv->sec_attr.ccha_acc_num) 52898c2ecf20Sopenharmony_ci continue; 52908c2ecf20Sopenharmony_ci 52918c2ecf20Sopenharmony_ci /* Skip POLY1305 algorithms if not supported by device */ 52928c2ecf20Sopenharmony_ci if (c2_alg_sel == OP_ALG_ALGSEL_POLY1305 && 52938c2ecf20Sopenharmony_ci !priv->sec_attr.ptha_acc_num) 52948c2ecf20Sopenharmony_ci continue; 52958c2ecf20Sopenharmony_ci 52968c2ecf20Sopenharmony_ci /* 52978c2ecf20Sopenharmony_ci * Skip algorithms requiring message digests 52988c2ecf20Sopenharmony_ci * if MD not supported by device. 52998c2ecf20Sopenharmony_ci */ 53008c2ecf20Sopenharmony_ci if ((c2_alg_sel & ~OP_ALG_ALGSEL_SUBMASK) == 0x40 && 53018c2ecf20Sopenharmony_ci !priv->sec_attr.md_acc_num) 53028c2ecf20Sopenharmony_ci continue; 53038c2ecf20Sopenharmony_ci 53048c2ecf20Sopenharmony_ci t_alg->caam.dev = dev; 53058c2ecf20Sopenharmony_ci caam_aead_alg_init(t_alg); 53068c2ecf20Sopenharmony_ci 53078c2ecf20Sopenharmony_ci err = crypto_register_aead(&t_alg->aead); 53088c2ecf20Sopenharmony_ci if (err) { 53098c2ecf20Sopenharmony_ci dev_warn(dev, "%s alg registration failed: %d\n", 53108c2ecf20Sopenharmony_ci t_alg->aead.base.cra_driver_name, err); 53118c2ecf20Sopenharmony_ci continue; 53128c2ecf20Sopenharmony_ci } 53138c2ecf20Sopenharmony_ci 53148c2ecf20Sopenharmony_ci t_alg->registered = true; 53158c2ecf20Sopenharmony_ci registered = true; 53168c2ecf20Sopenharmony_ci } 53178c2ecf20Sopenharmony_ci if (registered) 53188c2ecf20Sopenharmony_ci dev_info(dev, "algorithms registered in /proc/crypto\n"); 53198c2ecf20Sopenharmony_ci 53208c2ecf20Sopenharmony_ci /* register hash algorithms the device supports */ 53218c2ecf20Sopenharmony_ci INIT_LIST_HEAD(&hash_list); 53228c2ecf20Sopenharmony_ci 53238c2ecf20Sopenharmony_ci /* 53248c2ecf20Sopenharmony_ci * Skip registration of any hashing algorithms if MD block 53258c2ecf20Sopenharmony_ci * is not present. 53268c2ecf20Sopenharmony_ci */ 53278c2ecf20Sopenharmony_ci if (!priv->sec_attr.md_acc_num) 53288c2ecf20Sopenharmony_ci return 0; 53298c2ecf20Sopenharmony_ci 53308c2ecf20Sopenharmony_ci for (i = 0; i < ARRAY_SIZE(driver_hash); i++) { 53318c2ecf20Sopenharmony_ci struct caam_hash_alg *t_alg; 53328c2ecf20Sopenharmony_ci struct caam_hash_template *alg = driver_hash + i; 53338c2ecf20Sopenharmony_ci 53348c2ecf20Sopenharmony_ci /* register hmac version */ 53358c2ecf20Sopenharmony_ci t_alg = caam_hash_alloc(dev, alg, true); 53368c2ecf20Sopenharmony_ci if (IS_ERR(t_alg)) { 53378c2ecf20Sopenharmony_ci err = PTR_ERR(t_alg); 53388c2ecf20Sopenharmony_ci dev_warn(dev, "%s hash alg allocation failed: %d\n", 53398c2ecf20Sopenharmony_ci alg->hmac_driver_name, err); 53408c2ecf20Sopenharmony_ci continue; 53418c2ecf20Sopenharmony_ci } 53428c2ecf20Sopenharmony_ci 53438c2ecf20Sopenharmony_ci err = crypto_register_ahash(&t_alg->ahash_alg); 53448c2ecf20Sopenharmony_ci if (err) { 53458c2ecf20Sopenharmony_ci dev_warn(dev, "%s alg registration failed: %d\n", 53468c2ecf20Sopenharmony_ci t_alg->ahash_alg.halg.base.cra_driver_name, 53478c2ecf20Sopenharmony_ci err); 53488c2ecf20Sopenharmony_ci kfree(t_alg); 53498c2ecf20Sopenharmony_ci } else { 53508c2ecf20Sopenharmony_ci list_add_tail(&t_alg->entry, &hash_list); 53518c2ecf20Sopenharmony_ci } 53528c2ecf20Sopenharmony_ci 53538c2ecf20Sopenharmony_ci /* register unkeyed version */ 53548c2ecf20Sopenharmony_ci t_alg = caam_hash_alloc(dev, alg, false); 53558c2ecf20Sopenharmony_ci if (IS_ERR(t_alg)) { 53568c2ecf20Sopenharmony_ci err = PTR_ERR(t_alg); 53578c2ecf20Sopenharmony_ci dev_warn(dev, "%s alg allocation failed: %d\n", 53588c2ecf20Sopenharmony_ci alg->driver_name, err); 53598c2ecf20Sopenharmony_ci continue; 53608c2ecf20Sopenharmony_ci } 53618c2ecf20Sopenharmony_ci 53628c2ecf20Sopenharmony_ci err = crypto_register_ahash(&t_alg->ahash_alg); 53638c2ecf20Sopenharmony_ci if (err) { 53648c2ecf20Sopenharmony_ci dev_warn(dev, "%s alg registration failed: %d\n", 53658c2ecf20Sopenharmony_ci t_alg->ahash_alg.halg.base.cra_driver_name, 53668c2ecf20Sopenharmony_ci err); 53678c2ecf20Sopenharmony_ci kfree(t_alg); 53688c2ecf20Sopenharmony_ci } else { 53698c2ecf20Sopenharmony_ci list_add_tail(&t_alg->entry, &hash_list); 53708c2ecf20Sopenharmony_ci } 53718c2ecf20Sopenharmony_ci } 53728c2ecf20Sopenharmony_ci if (!list_empty(&hash_list)) 53738c2ecf20Sopenharmony_ci dev_info(dev, "hash algorithms registered in /proc/crypto\n"); 53748c2ecf20Sopenharmony_ci 53758c2ecf20Sopenharmony_ci return err; 53768c2ecf20Sopenharmony_ci 53778c2ecf20Sopenharmony_cierr_bind: 53788c2ecf20Sopenharmony_ci dpaa2_dpseci_dpio_free(priv); 53798c2ecf20Sopenharmony_cierr_dpio_setup: 53808c2ecf20Sopenharmony_ci dpaa2_dpseci_free(priv); 53818c2ecf20Sopenharmony_cierr_dpseci_setup: 53828c2ecf20Sopenharmony_ci free_percpu(priv->ppriv); 53838c2ecf20Sopenharmony_cierr_alloc_ppriv: 53848c2ecf20Sopenharmony_ci fsl_mc_portal_free(priv->mc_io); 53858c2ecf20Sopenharmony_cierr_dma_mask: 53868c2ecf20Sopenharmony_ci kmem_cache_destroy(qi_cache); 53878c2ecf20Sopenharmony_ci 53888c2ecf20Sopenharmony_ci return err; 53898c2ecf20Sopenharmony_ci} 53908c2ecf20Sopenharmony_ci 53918c2ecf20Sopenharmony_cistatic int __cold dpaa2_caam_remove(struct fsl_mc_device *ls_dev) 53928c2ecf20Sopenharmony_ci{ 53938c2ecf20Sopenharmony_ci struct device *dev; 53948c2ecf20Sopenharmony_ci struct dpaa2_caam_priv *priv; 53958c2ecf20Sopenharmony_ci int i; 53968c2ecf20Sopenharmony_ci 53978c2ecf20Sopenharmony_ci dev = &ls_dev->dev; 53988c2ecf20Sopenharmony_ci priv = dev_get_drvdata(dev); 53998c2ecf20Sopenharmony_ci 54008c2ecf20Sopenharmony_ci dpaa2_dpseci_debugfs_exit(priv); 54018c2ecf20Sopenharmony_ci 54028c2ecf20Sopenharmony_ci for (i = 0; i < ARRAY_SIZE(driver_aeads); i++) { 54038c2ecf20Sopenharmony_ci struct caam_aead_alg *t_alg = driver_aeads + i; 54048c2ecf20Sopenharmony_ci 54058c2ecf20Sopenharmony_ci if (t_alg->registered) 54068c2ecf20Sopenharmony_ci crypto_unregister_aead(&t_alg->aead); 54078c2ecf20Sopenharmony_ci } 54088c2ecf20Sopenharmony_ci 54098c2ecf20Sopenharmony_ci for (i = 0; i < ARRAY_SIZE(driver_algs); i++) { 54108c2ecf20Sopenharmony_ci struct caam_skcipher_alg *t_alg = driver_algs + i; 54118c2ecf20Sopenharmony_ci 54128c2ecf20Sopenharmony_ci if (t_alg->registered) 54138c2ecf20Sopenharmony_ci crypto_unregister_skcipher(&t_alg->skcipher); 54148c2ecf20Sopenharmony_ci } 54158c2ecf20Sopenharmony_ci 54168c2ecf20Sopenharmony_ci if (hash_list.next) { 54178c2ecf20Sopenharmony_ci struct caam_hash_alg *t_hash_alg, *p; 54188c2ecf20Sopenharmony_ci 54198c2ecf20Sopenharmony_ci list_for_each_entry_safe(t_hash_alg, p, &hash_list, entry) { 54208c2ecf20Sopenharmony_ci crypto_unregister_ahash(&t_hash_alg->ahash_alg); 54218c2ecf20Sopenharmony_ci list_del(&t_hash_alg->entry); 54228c2ecf20Sopenharmony_ci kfree(t_hash_alg); 54238c2ecf20Sopenharmony_ci } 54248c2ecf20Sopenharmony_ci } 54258c2ecf20Sopenharmony_ci 54268c2ecf20Sopenharmony_ci dpaa2_dpseci_disable(priv); 54278c2ecf20Sopenharmony_ci dpaa2_dpseci_dpio_free(priv); 54288c2ecf20Sopenharmony_ci dpaa2_dpseci_free(priv); 54298c2ecf20Sopenharmony_ci free_percpu(priv->ppriv); 54308c2ecf20Sopenharmony_ci fsl_mc_portal_free(priv->mc_io); 54318c2ecf20Sopenharmony_ci kmem_cache_destroy(qi_cache); 54328c2ecf20Sopenharmony_ci 54338c2ecf20Sopenharmony_ci return 0; 54348c2ecf20Sopenharmony_ci} 54358c2ecf20Sopenharmony_ci 54368c2ecf20Sopenharmony_ciint dpaa2_caam_enqueue(struct device *dev, struct caam_request *req) 54378c2ecf20Sopenharmony_ci{ 54388c2ecf20Sopenharmony_ci struct dpaa2_fd fd; 54398c2ecf20Sopenharmony_ci struct dpaa2_caam_priv *priv = dev_get_drvdata(dev); 54408c2ecf20Sopenharmony_ci struct dpaa2_caam_priv_per_cpu *ppriv; 54418c2ecf20Sopenharmony_ci int err = 0, i; 54428c2ecf20Sopenharmony_ci 54438c2ecf20Sopenharmony_ci if (IS_ERR(req)) 54448c2ecf20Sopenharmony_ci return PTR_ERR(req); 54458c2ecf20Sopenharmony_ci 54468c2ecf20Sopenharmony_ci if (priv->cscn_mem) { 54478c2ecf20Sopenharmony_ci dma_sync_single_for_cpu(priv->dev, priv->cscn_dma, 54488c2ecf20Sopenharmony_ci DPAA2_CSCN_SIZE, 54498c2ecf20Sopenharmony_ci DMA_FROM_DEVICE); 54508c2ecf20Sopenharmony_ci if (unlikely(dpaa2_cscn_state_congested(priv->cscn_mem_aligned))) { 54518c2ecf20Sopenharmony_ci dev_dbg_ratelimited(dev, "Dropping request\n"); 54528c2ecf20Sopenharmony_ci return -EBUSY; 54538c2ecf20Sopenharmony_ci } 54548c2ecf20Sopenharmony_ci } 54558c2ecf20Sopenharmony_ci 54568c2ecf20Sopenharmony_ci dpaa2_fl_set_flc(&req->fd_flt[1], req->flc_dma); 54578c2ecf20Sopenharmony_ci 54588c2ecf20Sopenharmony_ci req->fd_flt_dma = dma_map_single(dev, req->fd_flt, sizeof(req->fd_flt), 54598c2ecf20Sopenharmony_ci DMA_BIDIRECTIONAL); 54608c2ecf20Sopenharmony_ci if (dma_mapping_error(dev, req->fd_flt_dma)) { 54618c2ecf20Sopenharmony_ci dev_err(dev, "DMA mapping error for QI enqueue request\n"); 54628c2ecf20Sopenharmony_ci goto err_out; 54638c2ecf20Sopenharmony_ci } 54648c2ecf20Sopenharmony_ci 54658c2ecf20Sopenharmony_ci memset(&fd, 0, sizeof(fd)); 54668c2ecf20Sopenharmony_ci dpaa2_fd_set_format(&fd, dpaa2_fd_list); 54678c2ecf20Sopenharmony_ci dpaa2_fd_set_addr(&fd, req->fd_flt_dma); 54688c2ecf20Sopenharmony_ci dpaa2_fd_set_len(&fd, dpaa2_fl_get_len(&req->fd_flt[1])); 54698c2ecf20Sopenharmony_ci dpaa2_fd_set_flc(&fd, req->flc_dma); 54708c2ecf20Sopenharmony_ci 54718c2ecf20Sopenharmony_ci ppriv = raw_cpu_ptr(priv->ppriv); 54728c2ecf20Sopenharmony_ci for (i = 0; i < (priv->dpseci_attr.num_tx_queues << 1); i++) { 54738c2ecf20Sopenharmony_ci err = dpaa2_io_service_enqueue_fq(ppriv->dpio, ppriv->req_fqid, 54748c2ecf20Sopenharmony_ci &fd); 54758c2ecf20Sopenharmony_ci if (err != -EBUSY) 54768c2ecf20Sopenharmony_ci break; 54778c2ecf20Sopenharmony_ci 54788c2ecf20Sopenharmony_ci cpu_relax(); 54798c2ecf20Sopenharmony_ci } 54808c2ecf20Sopenharmony_ci 54818c2ecf20Sopenharmony_ci if (unlikely(err)) { 54828c2ecf20Sopenharmony_ci dev_err_ratelimited(dev, "Error enqueuing frame: %d\n", err); 54838c2ecf20Sopenharmony_ci goto err_out; 54848c2ecf20Sopenharmony_ci } 54858c2ecf20Sopenharmony_ci 54868c2ecf20Sopenharmony_ci return -EINPROGRESS; 54878c2ecf20Sopenharmony_ci 54888c2ecf20Sopenharmony_cierr_out: 54898c2ecf20Sopenharmony_ci dma_unmap_single(dev, req->fd_flt_dma, sizeof(req->fd_flt), 54908c2ecf20Sopenharmony_ci DMA_BIDIRECTIONAL); 54918c2ecf20Sopenharmony_ci return -EIO; 54928c2ecf20Sopenharmony_ci} 54938c2ecf20Sopenharmony_ciEXPORT_SYMBOL(dpaa2_caam_enqueue); 54948c2ecf20Sopenharmony_ci 54958c2ecf20Sopenharmony_cistatic const struct fsl_mc_device_id dpaa2_caam_match_id_table[] = { 54968c2ecf20Sopenharmony_ci { 54978c2ecf20Sopenharmony_ci .vendor = FSL_MC_VENDOR_FREESCALE, 54988c2ecf20Sopenharmony_ci .obj_type = "dpseci", 54998c2ecf20Sopenharmony_ci }, 55008c2ecf20Sopenharmony_ci { .vendor = 0x0 } 55018c2ecf20Sopenharmony_ci}; 55028c2ecf20Sopenharmony_ciMODULE_DEVICE_TABLE(fslmc, dpaa2_caam_match_id_table); 55038c2ecf20Sopenharmony_ci 55048c2ecf20Sopenharmony_cistatic struct fsl_mc_driver dpaa2_caam_driver = { 55058c2ecf20Sopenharmony_ci .driver = { 55068c2ecf20Sopenharmony_ci .name = KBUILD_MODNAME, 55078c2ecf20Sopenharmony_ci .owner = THIS_MODULE, 55088c2ecf20Sopenharmony_ci }, 55098c2ecf20Sopenharmony_ci .probe = dpaa2_caam_probe, 55108c2ecf20Sopenharmony_ci .remove = dpaa2_caam_remove, 55118c2ecf20Sopenharmony_ci .match_id_table = dpaa2_caam_match_id_table 55128c2ecf20Sopenharmony_ci}; 55138c2ecf20Sopenharmony_ci 55148c2ecf20Sopenharmony_ciMODULE_LICENSE("Dual BSD/GPL"); 55158c2ecf20Sopenharmony_ciMODULE_AUTHOR("Freescale Semiconductor, Inc"); 55168c2ecf20Sopenharmony_ciMODULE_DESCRIPTION("Freescale DPAA2 CAAM Driver"); 55178c2ecf20Sopenharmony_ci 55188c2ecf20Sopenharmony_cimodule_fsl_mc_driver(dpaa2_caam_driver); 5519