xref: /openbmc/linux/drivers/crypto/caam/caamalg.c (revision 14d52e6b)
1618b5dc4SHoria Geantă // SPDX-License-Identifier: GPL-2.0+
28e8ec596SKim Phillips /*
38e8ec596SKim Phillips  * caam - Freescale FSL CAAM support for crypto API
48e8ec596SKim Phillips  *
58e8ec596SKim Phillips  * Copyright 2008-2011 Freescale Semiconductor, Inc.
6ae1dd17dSHoria GeantA  * Copyright 2016-2019, 2023 NXP
78e8ec596SKim Phillips  *
88e8ec596SKim Phillips  * Based on talitos crypto API driver.
98e8ec596SKim Phillips  *
108e8ec596SKim Phillips  * relationship of job descriptors to shared descriptors (SteveC Dec 10 2008):
118e8ec596SKim Phillips  *
128e8ec596SKim Phillips  * ---------------                     ---------------
138e8ec596SKim Phillips  * | JobDesc #1  |-------------------->|  ShareDesc  |
148e8ec596SKim Phillips  * | *(packet 1) |                     |   (PDB)     |
158e8ec596SKim Phillips  * ---------------      |------------->|  (hashKey)  |
168e8ec596SKim Phillips  *       .              |              | (cipherKey) |
178e8ec596SKim Phillips  *       .              |    |-------->| (operation) |
188e8ec596SKim Phillips  * ---------------      |    |         ---------------
198e8ec596SKim Phillips  * | JobDesc #2  |------|    |
208e8ec596SKim Phillips  * | *(packet 2) |           |
218e8ec596SKim Phillips  * ---------------           |
228e8ec596SKim Phillips  *       .                   |
238e8ec596SKim Phillips  *       .                   |
248e8ec596SKim Phillips  * ---------------           |
258e8ec596SKim Phillips  * | JobDesc #3  |------------
268e8ec596SKim Phillips  * | *(packet 3) |
278e8ec596SKim Phillips  * ---------------
288e8ec596SKim Phillips  *
298e8ec596SKim Phillips  * The SharedDesc never changes for a connection unless rekeyed, but
308e8ec596SKim Phillips  * each packet will likely be in a different place. So all we need
318e8ec596SKim Phillips  * to know to process the packet is where the input is, where the
328e8ec596SKim Phillips  * output goes, and what context we want to process with. Context is
338e8ec596SKim Phillips  * in the SharedDesc, packet references in the JobDesc.
348e8ec596SKim Phillips  *
358e8ec596SKim Phillips  * So, a job desc looks like:
368e8ec596SKim Phillips  *
378e8ec596SKim Phillips  * ---------------------
388e8ec596SKim Phillips  * | Header            |
398e8ec596SKim Phillips  * | ShareDesc Pointer |
408e8ec596SKim Phillips  * | SEQ_OUT_PTR       |
418e8ec596SKim Phillips  * | (output buffer)   |
426ec47334SYuan Kang  * | (output length)   |
438e8ec596SKim Phillips  * | SEQ_IN_PTR        |
448e8ec596SKim Phillips  * | (input buffer)    |
456ec47334SYuan Kang  * | (input length)    |
468e8ec596SKim Phillips  * ---------------------
478e8ec596SKim Phillips  */
488e8ec596SKim Phillips 
498e8ec596SKim Phillips #include "compat.h"
508e8ec596SKim Phillips 
518e8ec596SKim Phillips #include "regs.h"
528e8ec596SKim Phillips #include "intern.h"
538e8ec596SKim Phillips #include "desc_constr.h"
548e8ec596SKim Phillips #include "jr.h"
558e8ec596SKim Phillips #include "error.h"
56a299c837SYuan Kang #include "sg_sw_sec4.h"
574c1ec1f9SYuan Kang #include "key_gen.h"
588cea7b66SHoria Geantă #include "caamalg_desc.h"
599d9b14dbSAndrei Botila #include <asm/unaligned.h>
60623814c0SHerbert Xu #include <crypto/internal/aead.h>
614ac1a2d8SHerbert Xu #include <crypto/internal/engine.h>
62623814c0SHerbert Xu #include <crypto/internal/skcipher.h>
634ac1a2d8SHerbert Xu #include <crypto/xts.h>
64199354d7SHerbert Xu #include <linux/dma-mapping.h>
65660ca947SHerbert Xu #include <linux/device.h>
66660ca947SHerbert Xu #include <linux/err.h>
67623814c0SHerbert Xu #include <linux/module.h>
68199354d7SHerbert Xu #include <linux/kernel.h>
69660ca947SHerbert Xu #include <linux/slab.h>
70660ca947SHerbert Xu #include <linux/string.h>
718e8ec596SKim Phillips 
728e8ec596SKim Phillips /*
738e8ec596SKim Phillips  * crypto alg
748e8ec596SKim Phillips  */
758e8ec596SKim Phillips #define CAAM_CRA_PRIORITY		3000
768e8ec596SKim Phillips /* max key is sum of AES_MAX_KEY_SIZE, max split key size */
778e8ec596SKim Phillips #define CAAM_MAX_KEY_SIZE		(AES_MAX_KEY_SIZE + \
78daebc465SCatalin Vasile 					 CTR_RFC3686_NONCE_SIZE + \
798e8ec596SKim Phillips 					 SHA512_DIGEST_SIZE * 2)
808e8ec596SKim Phillips 
81f2147b88SHerbert Xu #define AEAD_DESC_JOB_IO_LEN		(DESC_JOB_IO_LEN + CAAM_CMD_SZ * 2)
82f2147b88SHerbert Xu #define GCM_DESC_JOB_IO_LEN		(AEAD_DESC_JOB_IO_LEN + \
83f2147b88SHerbert Xu 					 CAAM_CMD_SZ * 4)
84479bcc7cSHerbert Xu #define AUTHENC_DESC_JOB_IO_LEN		(AEAD_DESC_JOB_IO_LEN + \
85479bcc7cSHerbert Xu 					 CAAM_CMD_SZ * 5)
86f2147b88SHerbert Xu 
87d6bbd4eeSHoria Geantă #define CHACHAPOLY_DESC_JOB_IO_LEN	(AEAD_DESC_JOB_IO_LEN + CAAM_CMD_SZ * 6)
88d6bbd4eeSHoria Geantă 
891a3daadcSAndrey Smirnov #define DESC_MAX_USED_BYTES		(CAAM_DESC_BYTES_MAX - DESC_JOB_IO_LEN_MIN)
9087e51b07SHerbert Xu #define DESC_MAX_USED_LEN		(DESC_MAX_USED_BYTES / CAAM_CMD_SZ)
914427b1b4SKim Phillips 
92479bcc7cSHerbert Xu struct caam_alg_entry {
93479bcc7cSHerbert Xu 	int class1_alg_type;
94479bcc7cSHerbert Xu 	int class2_alg_type;
95479bcc7cSHerbert Xu 	bool rfc3686;
96479bcc7cSHerbert Xu 	bool geniv;
9724586b5fSHerbert Xu 	bool nodkp;
98479bcc7cSHerbert Xu };
99479bcc7cSHerbert Xu 
100479bcc7cSHerbert Xu struct caam_aead_alg {
101623814c0SHerbert Xu 	struct aead_engine_alg aead;
102479bcc7cSHerbert Xu 	struct caam_alg_entry caam;
103479bcc7cSHerbert Xu 	bool registered;
104479bcc7cSHerbert Xu };
105479bcc7cSHerbert Xu 
1065ca7badbSHoria Geantă struct caam_skcipher_alg {
107623814c0SHerbert Xu 	struct skcipher_engine_alg skcipher;
1085ca7badbSHoria Geantă 	struct caam_alg_entry caam;
1095ca7badbSHoria Geantă 	bool registered;
1105ca7badbSHoria Geantă };
1115ca7badbSHoria Geantă 
112acdca31dSYuan Kang /*
1138e8ec596SKim Phillips  * per-session context
1148e8ec596SKim Phillips  */
1158e8ec596SKim Phillips struct caam_ctx {
1161acebad3SYuan Kang 	u32 sh_desc_enc[DESC_MAX_USED_LEN];
1171acebad3SYuan Kang 	u32 sh_desc_dec[DESC_MAX_USED_LEN];
118bbf22344SHoria Geantă 	u8 key[CAAM_MAX_KEY_SIZE];
1191acebad3SYuan Kang 	dma_addr_t sh_desc_enc_dma;
1201acebad3SYuan Kang 	dma_addr_t sh_desc_dec_dma;
121885e9e2fSYuan Kang 	dma_addr_t key_dma;
1227e0880b9SHoria Geantă 	enum dma_data_direction dir;
123bbf22344SHoria Geantă 	struct device *jrdev;
124db57656bSHoria Geantă 	struct alginfo adata;
125db57656bSHoria Geantă 	struct alginfo cdata;
1268e8ec596SKim Phillips 	unsigned int authsize;
127c91f7348SAndrei Botila 	bool xts_key_fallback;
1289d9b14dbSAndrei Botila 	struct crypto_skcipher *fallback;
1298e8ec596SKim Phillips };
1308e8ec596SKim Phillips 
131ee38767fSIuliana Prodan struct caam_skcipher_req_ctx {
132ee38767fSIuliana Prodan 	struct skcipher_edesc *edesc;
1339d9b14dbSAndrei Botila 	struct skcipher_request fallback_req;
134ee38767fSIuliana Prodan };
135ee38767fSIuliana Prodan 
1361c240226SIuliana Prodan struct caam_aead_req_ctx {
1371c240226SIuliana Prodan 	struct aead_edesc *edesc;
1381c240226SIuliana Prodan };
1391c240226SIuliana Prodan 
aead_null_set_sh_desc(struct crypto_aead * aead)140ae4a825fSHoria Geanta static int aead_null_set_sh_desc(struct crypto_aead *aead)
141ae4a825fSHoria Geanta {
1424cb4f7c1SHerbert Xu 	struct caam_ctx *ctx = crypto_aead_ctx_dma(aead);
143ae4a825fSHoria Geanta 	struct device *jrdev = ctx->jrdev;
1447e0880b9SHoria Geantă 	struct caam_drv_private *ctrlpriv = dev_get_drvdata(jrdev->parent);
145ae4a825fSHoria Geanta 	u32 *desc;
1464cbe79ccSHoria Geantă 	int rem_bytes = CAAM_DESC_BYTES_MAX - AEAD_DESC_JOB_IO_LEN -
1474cbe79ccSHoria Geantă 			ctx->adata.keylen_pad;
148ae4a825fSHoria Geanta 
149ae4a825fSHoria Geanta 	/*
150ae4a825fSHoria Geanta 	 * Job Descriptor and Shared Descriptors
151ae4a825fSHoria Geanta 	 * must all fit into the 64-word Descriptor h/w Buffer
152ae4a825fSHoria Geanta 	 */
1534cbe79ccSHoria Geantă 	if (rem_bytes >= DESC_AEAD_NULL_ENC_LEN) {
154db57656bSHoria Geantă 		ctx->adata.key_inline = true;
1559c0bc511SArnd Bergmann 		ctx->adata.key_virt = ctx->key;
156db57656bSHoria Geantă 	} else {
157db57656bSHoria Geantă 		ctx->adata.key_inline = false;
1589c0bc511SArnd Bergmann 		ctx->adata.key_dma = ctx->key_dma;
159db57656bSHoria Geantă 	}
160ae4a825fSHoria Geanta 
161479bcc7cSHerbert Xu 	/* aead_encrypt shared descriptor */
162ae4a825fSHoria Geanta 	desc = ctx->sh_desc_enc;
1637e0880b9SHoria Geantă 	cnstr_shdsc_aead_null_encap(desc, &ctx->adata, ctx->authsize,
1647e0880b9SHoria Geantă 				    ctrlpriv->era);
165bbf22344SHoria Geantă 	dma_sync_single_for_device(jrdev, ctx->sh_desc_enc_dma,
1667e0880b9SHoria Geantă 				   desc_bytes(desc), ctx->dir);
167ae4a825fSHoria Geanta 
168ae4a825fSHoria Geanta 	/*
169ae4a825fSHoria Geanta 	 * Job Descriptor and Shared Descriptors
170ae4a825fSHoria Geanta 	 * must all fit into the 64-word Descriptor h/w Buffer
171ae4a825fSHoria Geanta 	 */
1724cbe79ccSHoria Geantă 	if (rem_bytes >= DESC_AEAD_NULL_DEC_LEN) {
173db57656bSHoria Geantă 		ctx->adata.key_inline = true;
1749c0bc511SArnd Bergmann 		ctx->adata.key_virt = ctx->key;
175db57656bSHoria Geantă 	} else {
176db57656bSHoria Geantă 		ctx->adata.key_inline = false;
1779c0bc511SArnd Bergmann 		ctx->adata.key_dma = ctx->key_dma;
178db57656bSHoria Geantă 	}
179ae4a825fSHoria Geanta 
180479bcc7cSHerbert Xu 	/* aead_decrypt shared descriptor */
1818cea7b66SHoria Geantă 	desc = ctx->sh_desc_dec;
1827e0880b9SHoria Geantă 	cnstr_shdsc_aead_null_decap(desc, &ctx->adata, ctx->authsize,
1837e0880b9SHoria Geantă 				    ctrlpriv->era);
184bbf22344SHoria Geantă 	dma_sync_single_for_device(jrdev, ctx->sh_desc_dec_dma,
1857e0880b9SHoria Geantă 				   desc_bytes(desc), ctx->dir);
186ae4a825fSHoria Geanta 
187ae4a825fSHoria Geanta 	return 0;
188ae4a825fSHoria Geanta }
189ae4a825fSHoria Geanta 
aead_set_sh_desc(struct crypto_aead * aead)1901acebad3SYuan Kang static int aead_set_sh_desc(struct crypto_aead *aead)
1911acebad3SYuan Kang {
192479bcc7cSHerbert Xu 	struct caam_aead_alg *alg = container_of(crypto_aead_alg(aead),
193623814c0SHerbert Xu 						 struct caam_aead_alg,
194623814c0SHerbert Xu 						 aead.base);
195add86d55SHerbert Xu 	unsigned int ivsize = crypto_aead_ivsize(aead);
1964cb4f7c1SHerbert Xu 	struct caam_ctx *ctx = crypto_aead_ctx_dma(aead);
1971acebad3SYuan Kang 	struct device *jrdev = ctx->jrdev;
1987e0880b9SHoria Geantă 	struct caam_drv_private *ctrlpriv = dev_get_drvdata(jrdev->parent);
199daebc465SCatalin Vasile 	u32 ctx1_iv_off = 0;
2008cea7b66SHoria Geantă 	u32 *desc, *nonce = NULL;
2014cbe79ccSHoria Geantă 	u32 inl_mask;
2024cbe79ccSHoria Geantă 	unsigned int data_len[2];
203db57656bSHoria Geantă 	const bool ctr_mode = ((ctx->cdata.algtype & OP_ALG_AAI_MASK) ==
204daebc465SCatalin Vasile 			       OP_ALG_AAI_CTR_MOD128);
205479bcc7cSHerbert Xu 	const bool is_rfc3686 = alg->caam.rfc3686;
2061acebad3SYuan Kang 
2072fdea258SHoria Geantă 	if (!ctx->authsize)
2082fdea258SHoria Geantă 		return 0;
2092fdea258SHoria Geantă 
210ae4a825fSHoria Geanta 	/* NULL encryption / decryption */
211db57656bSHoria Geantă 	if (!ctx->cdata.keylen)
212ae4a825fSHoria Geanta 		return aead_null_set_sh_desc(aead);
213ae4a825fSHoria Geanta 
2141acebad3SYuan Kang 	/*
215daebc465SCatalin Vasile 	 * AES-CTR needs to load IV in CONTEXT1 reg
216daebc465SCatalin Vasile 	 * at an offset of 128bits (16bytes)
217daebc465SCatalin Vasile 	 * CONTEXT1[255:128] = IV
218daebc465SCatalin Vasile 	 */
219daebc465SCatalin Vasile 	if (ctr_mode)
220daebc465SCatalin Vasile 		ctx1_iv_off = 16;
221daebc465SCatalin Vasile 
222daebc465SCatalin Vasile 	/*
223daebc465SCatalin Vasile 	 * RFC3686 specific:
224daebc465SCatalin Vasile 	 *	CONTEXT1[255:128] = {NONCE, IV, COUNTER}
225daebc465SCatalin Vasile 	 */
2268cea7b66SHoria Geantă 	if (is_rfc3686) {
227daebc465SCatalin Vasile 		ctx1_iv_off = 16 + CTR_RFC3686_NONCE_SIZE;
2288cea7b66SHoria Geantă 		nonce = (u32 *)((void *)ctx->key + ctx->adata.keylen_pad +
2298cea7b66SHoria Geantă 				ctx->cdata.keylen - CTR_RFC3686_NONCE_SIZE);
2308cea7b66SHoria Geantă 	}
231daebc465SCatalin Vasile 
232e9b4913aSHoria Geantă 	/*
233e9b4913aSHoria Geantă 	 * In case |user key| > |derived key|, using DKP<imm,imm>
234e9b4913aSHoria Geantă 	 * would result in invalid opcodes (last bytes of user key) in
235e9b4913aSHoria Geantă 	 * the resulting descriptor. Use DKP<ptr,imm> instead => both
236e9b4913aSHoria Geantă 	 * virtual and dma key addresses are needed.
237e9b4913aSHoria Geantă 	 */
238e9b4913aSHoria Geantă 	ctx->adata.key_virt = ctx->key;
239e9b4913aSHoria Geantă 	ctx->adata.key_dma = ctx->key_dma;
240e9b4913aSHoria Geantă 
241e9b4913aSHoria Geantă 	ctx->cdata.key_virt = ctx->key + ctx->adata.keylen_pad;
242e9b4913aSHoria Geantă 	ctx->cdata.key_dma = ctx->key_dma + ctx->adata.keylen_pad;
243e9b4913aSHoria Geantă 
2444cbe79ccSHoria Geantă 	data_len[0] = ctx->adata.keylen_pad;
2454cbe79ccSHoria Geantă 	data_len[1] = ctx->cdata.keylen;
2464cbe79ccSHoria Geantă 
247479bcc7cSHerbert Xu 	if (alg->caam.geniv)
248479bcc7cSHerbert Xu 		goto skip_enc;
249479bcc7cSHerbert Xu 
250daebc465SCatalin Vasile 	/*
2511acebad3SYuan Kang 	 * Job Descriptor and Shared Descriptors
2521acebad3SYuan Kang 	 * must all fit into the 64-word Descriptor h/w Buffer
2531acebad3SYuan Kang 	 */
2544cbe79ccSHoria Geantă 	if (desc_inline_query(DESC_AEAD_ENC_LEN +
2554cbe79ccSHoria Geantă 			      (is_rfc3686 ? DESC_AEAD_CTR_RFC3686_LEN : 0),
2564cbe79ccSHoria Geantă 			      AUTHENC_DESC_JOB_IO_LEN, data_len, &inl_mask,
2574cbe79ccSHoria Geantă 			      ARRAY_SIZE(data_len)) < 0)
2584cbe79ccSHoria Geantă 		return -EINVAL;
2594cbe79ccSHoria Geantă 
2604cbe79ccSHoria Geantă 	ctx->adata.key_inline = !!(inl_mask & 1);
2614cbe79ccSHoria Geantă 	ctx->cdata.key_inline = !!(inl_mask & 2);
2621acebad3SYuan Kang 
263479bcc7cSHerbert Xu 	/* aead_encrypt shared descriptor */
2641acebad3SYuan Kang 	desc = ctx->sh_desc_enc;
265b189817cSHoria Geantă 	cnstr_shdsc_aead_encap(desc, &ctx->cdata, &ctx->adata, ivsize,
266b189817cSHoria Geantă 			       ctx->authsize, is_rfc3686, nonce, ctx1_iv_off,
2677e0880b9SHoria Geantă 			       false, ctrlpriv->era);
268bbf22344SHoria Geantă 	dma_sync_single_for_device(jrdev, ctx->sh_desc_enc_dma,
2697e0880b9SHoria Geantă 				   desc_bytes(desc), ctx->dir);
2701acebad3SYuan Kang 
271479bcc7cSHerbert Xu skip_enc:
2721acebad3SYuan Kang 	/*
2731acebad3SYuan Kang 	 * Job Descriptor and Shared Descriptors
2741acebad3SYuan Kang 	 * must all fit into the 64-word Descriptor h/w Buffer
2751acebad3SYuan Kang 	 */
2764cbe79ccSHoria Geantă 	if (desc_inline_query(DESC_AEAD_DEC_LEN +
2774cbe79ccSHoria Geantă 			      (is_rfc3686 ? DESC_AEAD_CTR_RFC3686_LEN : 0),
2784cbe79ccSHoria Geantă 			      AUTHENC_DESC_JOB_IO_LEN, data_len, &inl_mask,
2794cbe79ccSHoria Geantă 			      ARRAY_SIZE(data_len)) < 0)
2804cbe79ccSHoria Geantă 		return -EINVAL;
2814cbe79ccSHoria Geantă 
2824cbe79ccSHoria Geantă 	ctx->adata.key_inline = !!(inl_mask & 1);
2834cbe79ccSHoria Geantă 	ctx->cdata.key_inline = !!(inl_mask & 2);
2841acebad3SYuan Kang 
285479bcc7cSHerbert Xu 	/* aead_decrypt shared descriptor */
2861acebad3SYuan Kang 	desc = ctx->sh_desc_dec;
2878cea7b66SHoria Geantă 	cnstr_shdsc_aead_decap(desc, &ctx->cdata, &ctx->adata, ivsize,
2888cea7b66SHoria Geantă 			       ctx->authsize, alg->caam.geniv, is_rfc3686,
2897e0880b9SHoria Geantă 			       nonce, ctx1_iv_off, false, ctrlpriv->era);
290bbf22344SHoria Geantă 	dma_sync_single_for_device(jrdev, ctx->sh_desc_dec_dma,
2917e0880b9SHoria Geantă 				   desc_bytes(desc), ctx->dir);
2921acebad3SYuan Kang 
293479bcc7cSHerbert Xu 	if (!alg->caam.geniv)
294479bcc7cSHerbert Xu 		goto skip_givenc;
295479bcc7cSHerbert Xu 
2961acebad3SYuan Kang 	/*
2971acebad3SYuan Kang 	 * Job Descriptor and Shared Descriptors
2981acebad3SYuan Kang 	 * must all fit into the 64-word Descriptor h/w Buffer
2991acebad3SYuan Kang 	 */
3004cbe79ccSHoria Geantă 	if (desc_inline_query(DESC_AEAD_GIVENC_LEN +
3014cbe79ccSHoria Geantă 			      (is_rfc3686 ? DESC_AEAD_CTR_RFC3686_LEN : 0),
3024cbe79ccSHoria Geantă 			      AUTHENC_DESC_JOB_IO_LEN, data_len, &inl_mask,
3034cbe79ccSHoria Geantă 			      ARRAY_SIZE(data_len)) < 0)
3044cbe79ccSHoria Geantă 		return -EINVAL;
3054cbe79ccSHoria Geantă 
3064cbe79ccSHoria Geantă 	ctx->adata.key_inline = !!(inl_mask & 1);
3074cbe79ccSHoria Geantă 	ctx->cdata.key_inline = !!(inl_mask & 2);
3081acebad3SYuan Kang 
3091acebad3SYuan Kang 	/* aead_givencrypt shared descriptor */
3101d2d87e8SHoria Geantă 	desc = ctx->sh_desc_enc;
3118cea7b66SHoria Geantă 	cnstr_shdsc_aead_givencap(desc, &ctx->cdata, &ctx->adata, ivsize,
3128cea7b66SHoria Geantă 				  ctx->authsize, is_rfc3686, nonce,
3137e0880b9SHoria Geantă 				  ctx1_iv_off, false, ctrlpriv->era);
314bbf22344SHoria Geantă 	dma_sync_single_for_device(jrdev, ctx->sh_desc_enc_dma,
3157e0880b9SHoria Geantă 				   desc_bytes(desc), ctx->dir);
3161acebad3SYuan Kang 
317479bcc7cSHerbert Xu skip_givenc:
3181acebad3SYuan Kang 	return 0;
3191acebad3SYuan Kang }
3201acebad3SYuan Kang 
aead_setauthsize(struct crypto_aead * authenc,unsigned int authsize)3210e479300SYuan Kang static int aead_setauthsize(struct crypto_aead *authenc,
3228e8ec596SKim Phillips 				    unsigned int authsize)
3238e8ec596SKim Phillips {
3244cb4f7c1SHerbert Xu 	struct caam_ctx *ctx = crypto_aead_ctx_dma(authenc);
3258e8ec596SKim Phillips 
3268e8ec596SKim Phillips 	ctx->authsize = authsize;
3271acebad3SYuan Kang 	aead_set_sh_desc(authenc);
3288e8ec596SKim Phillips 
3298e8ec596SKim Phillips 	return 0;
3308e8ec596SKim Phillips }
3318e8ec596SKim Phillips 
gcm_set_sh_desc(struct crypto_aead * aead)3323ef8d945STudor Ambarus static int gcm_set_sh_desc(struct crypto_aead *aead)
3333ef8d945STudor Ambarus {
3344cb4f7c1SHerbert Xu 	struct caam_ctx *ctx = crypto_aead_ctx_dma(aead);
3353ef8d945STudor Ambarus 	struct device *jrdev = ctx->jrdev;
33687ec3a0bSHoria Geantă 	unsigned int ivsize = crypto_aead_ivsize(aead);
3373ef8d945STudor Ambarus 	u32 *desc;
3384cbe79ccSHoria Geantă 	int rem_bytes = CAAM_DESC_BYTES_MAX - GCM_DESC_JOB_IO_LEN -
3394cbe79ccSHoria Geantă 			ctx->cdata.keylen;
3403ef8d945STudor Ambarus 
341db57656bSHoria Geantă 	if (!ctx->cdata.keylen || !ctx->authsize)
3423ef8d945STudor Ambarus 		return 0;
3433ef8d945STudor Ambarus 
3443ef8d945STudor Ambarus 	/*
3453ef8d945STudor Ambarus 	 * AES GCM encrypt shared descriptor
3463ef8d945STudor Ambarus 	 * Job Descriptor and Shared Descriptor
3473ef8d945STudor Ambarus 	 * must fit into the 64-word Descriptor h/w Buffer
3483ef8d945STudor Ambarus 	 */
3494cbe79ccSHoria Geantă 	if (rem_bytes >= DESC_GCM_ENC_LEN) {
350db57656bSHoria Geantă 		ctx->cdata.key_inline = true;
3519c0bc511SArnd Bergmann 		ctx->cdata.key_virt = ctx->key;
352db57656bSHoria Geantă 	} else {
353db57656bSHoria Geantă 		ctx->cdata.key_inline = false;
3549c0bc511SArnd Bergmann 		ctx->cdata.key_dma = ctx->key_dma;
355db57656bSHoria Geantă 	}
3563ef8d945STudor Ambarus 
3573ef8d945STudor Ambarus 	desc = ctx->sh_desc_enc;
35887ec3a0bSHoria Geantă 	cnstr_shdsc_gcm_encap(desc, &ctx->cdata, ivsize, ctx->authsize, false);
359bbf22344SHoria Geantă 	dma_sync_single_for_device(jrdev, ctx->sh_desc_enc_dma,
3607e0880b9SHoria Geantă 				   desc_bytes(desc), ctx->dir);
3613ef8d945STudor Ambarus 
3623ef8d945STudor Ambarus 	/*
3633ef8d945STudor Ambarus 	 * Job Descriptor and Shared Descriptors
3643ef8d945STudor Ambarus 	 * must all fit into the 64-word Descriptor h/w Buffer
3653ef8d945STudor Ambarus 	 */
3664cbe79ccSHoria Geantă 	if (rem_bytes >= DESC_GCM_DEC_LEN) {
367db57656bSHoria Geantă 		ctx->cdata.key_inline = true;
3689c0bc511SArnd Bergmann 		ctx->cdata.key_virt = ctx->key;
369db57656bSHoria Geantă 	} else {
370db57656bSHoria Geantă 		ctx->cdata.key_inline = false;
3719c0bc511SArnd Bergmann 		ctx->cdata.key_dma = ctx->key_dma;
372db57656bSHoria Geantă 	}
3733ef8d945STudor Ambarus 
3743ef8d945STudor Ambarus 	desc = ctx->sh_desc_dec;
37587ec3a0bSHoria Geantă 	cnstr_shdsc_gcm_decap(desc, &ctx->cdata, ivsize, ctx->authsize, false);
376bbf22344SHoria Geantă 	dma_sync_single_for_device(jrdev, ctx->sh_desc_dec_dma,
3777e0880b9SHoria Geantă 				   desc_bytes(desc), ctx->dir);
3783ef8d945STudor Ambarus 
3793ef8d945STudor Ambarus 	return 0;
3803ef8d945STudor Ambarus }
3813ef8d945STudor Ambarus 
gcm_setauthsize(struct crypto_aead * authenc,unsigned int authsize)3823ef8d945STudor Ambarus static int gcm_setauthsize(struct crypto_aead *authenc, unsigned int authsize)
3833ef8d945STudor Ambarus {
3844cb4f7c1SHerbert Xu 	struct caam_ctx *ctx = crypto_aead_ctx_dma(authenc);
38568a51394SIuliana Prodan 	int err;
38668a51394SIuliana Prodan 
38768a51394SIuliana Prodan 	err = crypto_gcm_check_authsize(authsize);
38868a51394SIuliana Prodan 	if (err)
38968a51394SIuliana Prodan 		return err;
3903ef8d945STudor Ambarus 
3913ef8d945STudor Ambarus 	ctx->authsize = authsize;
3923ef8d945STudor Ambarus 	gcm_set_sh_desc(authenc);
3933ef8d945STudor Ambarus 
3943ef8d945STudor Ambarus 	return 0;
3953ef8d945STudor Ambarus }
3963ef8d945STudor Ambarus 
rfc4106_set_sh_desc(struct crypto_aead * aead)397bac68f2cSTudor Ambarus static int rfc4106_set_sh_desc(struct crypto_aead *aead)
398bac68f2cSTudor Ambarus {
3994cb4f7c1SHerbert Xu 	struct caam_ctx *ctx = crypto_aead_ctx_dma(aead);
400bac68f2cSTudor Ambarus 	struct device *jrdev = ctx->jrdev;
40187ec3a0bSHoria Geantă 	unsigned int ivsize = crypto_aead_ivsize(aead);
402bac68f2cSTudor Ambarus 	u32 *desc;
4034cbe79ccSHoria Geantă 	int rem_bytes = CAAM_DESC_BYTES_MAX - GCM_DESC_JOB_IO_LEN -
4044cbe79ccSHoria Geantă 			ctx->cdata.keylen;
405bac68f2cSTudor Ambarus 
406db57656bSHoria Geantă 	if (!ctx->cdata.keylen || !ctx->authsize)
407bac68f2cSTudor Ambarus 		return 0;
408bac68f2cSTudor Ambarus 
409bac68f2cSTudor Ambarus 	/*
410bac68f2cSTudor Ambarus 	 * RFC4106 encrypt shared descriptor
411bac68f2cSTudor Ambarus 	 * Job Descriptor and Shared Descriptor
412bac68f2cSTudor Ambarus 	 * must fit into the 64-word Descriptor h/w Buffer
413bac68f2cSTudor Ambarus 	 */
4144cbe79ccSHoria Geantă 	if (rem_bytes >= DESC_RFC4106_ENC_LEN) {
415db57656bSHoria Geantă 		ctx->cdata.key_inline = true;
4169c0bc511SArnd Bergmann 		ctx->cdata.key_virt = ctx->key;
417db57656bSHoria Geantă 	} else {
418db57656bSHoria Geantă 		ctx->cdata.key_inline = false;
4199c0bc511SArnd Bergmann 		ctx->cdata.key_dma = ctx->key_dma;
420db57656bSHoria Geantă 	}
421bac68f2cSTudor Ambarus 
422bac68f2cSTudor Ambarus 	desc = ctx->sh_desc_enc;
42387ec3a0bSHoria Geantă 	cnstr_shdsc_rfc4106_encap(desc, &ctx->cdata, ivsize, ctx->authsize,
42487ec3a0bSHoria Geantă 				  false);
425bbf22344SHoria Geantă 	dma_sync_single_for_device(jrdev, ctx->sh_desc_enc_dma,
4267e0880b9SHoria Geantă 				   desc_bytes(desc), ctx->dir);
427bac68f2cSTudor Ambarus 
428bac68f2cSTudor Ambarus 	/*
429bac68f2cSTudor Ambarus 	 * Job Descriptor and Shared Descriptors
430bac68f2cSTudor Ambarus 	 * must all fit into the 64-word Descriptor h/w Buffer
431bac68f2cSTudor Ambarus 	 */
4324cbe79ccSHoria Geantă 	if (rem_bytes >= DESC_RFC4106_DEC_LEN) {
433db57656bSHoria Geantă 		ctx->cdata.key_inline = true;
4349c0bc511SArnd Bergmann 		ctx->cdata.key_virt = ctx->key;
435db57656bSHoria Geantă 	} else {
436db57656bSHoria Geantă 		ctx->cdata.key_inline = false;
4379c0bc511SArnd Bergmann 		ctx->cdata.key_dma = ctx->key_dma;
438db57656bSHoria Geantă 	}
439bac68f2cSTudor Ambarus 
440bac68f2cSTudor Ambarus 	desc = ctx->sh_desc_dec;
44187ec3a0bSHoria Geantă 	cnstr_shdsc_rfc4106_decap(desc, &ctx->cdata, ivsize, ctx->authsize,
44287ec3a0bSHoria Geantă 				  false);
443bbf22344SHoria Geantă 	dma_sync_single_for_device(jrdev, ctx->sh_desc_dec_dma,
4447e0880b9SHoria Geantă 				   desc_bytes(desc), ctx->dir);
445bac68f2cSTudor Ambarus 
446bac68f2cSTudor Ambarus 	return 0;
447bac68f2cSTudor Ambarus }
448bac68f2cSTudor Ambarus 
rfc4106_setauthsize(struct crypto_aead * authenc,unsigned int authsize)449bac68f2cSTudor Ambarus static int rfc4106_setauthsize(struct crypto_aead *authenc,
450bac68f2cSTudor Ambarus 			       unsigned int authsize)
451bac68f2cSTudor Ambarus {
4524cb4f7c1SHerbert Xu 	struct caam_ctx *ctx = crypto_aead_ctx_dma(authenc);
45368a51394SIuliana Prodan 	int err;
45468a51394SIuliana Prodan 
45568a51394SIuliana Prodan 	err = crypto_rfc4106_check_authsize(authsize);
45668a51394SIuliana Prodan 	if (err)
45768a51394SIuliana Prodan 		return err;
458bac68f2cSTudor Ambarus 
459bac68f2cSTudor Ambarus 	ctx->authsize = authsize;
460bac68f2cSTudor Ambarus 	rfc4106_set_sh_desc(authenc);
461bac68f2cSTudor Ambarus 
462bac68f2cSTudor Ambarus 	return 0;
463bac68f2cSTudor Ambarus }
464bac68f2cSTudor Ambarus 
rfc4543_set_sh_desc(struct crypto_aead * aead)4655d0429a3STudor Ambarus static int rfc4543_set_sh_desc(struct crypto_aead *aead)
4665d0429a3STudor Ambarus {
4674cb4f7c1SHerbert Xu 	struct caam_ctx *ctx = crypto_aead_ctx_dma(aead);
4685d0429a3STudor Ambarus 	struct device *jrdev = ctx->jrdev;
46987ec3a0bSHoria Geantă 	unsigned int ivsize = crypto_aead_ivsize(aead);
4705d0429a3STudor Ambarus 	u32 *desc;
4714cbe79ccSHoria Geantă 	int rem_bytes = CAAM_DESC_BYTES_MAX - GCM_DESC_JOB_IO_LEN -
4724cbe79ccSHoria Geantă 			ctx->cdata.keylen;
4735d0429a3STudor Ambarus 
474db57656bSHoria Geantă 	if (!ctx->cdata.keylen || !ctx->authsize)
4755d0429a3STudor Ambarus 		return 0;
4765d0429a3STudor Ambarus 
4775d0429a3STudor Ambarus 	/*
4785d0429a3STudor Ambarus 	 * RFC4543 encrypt shared descriptor
4795d0429a3STudor Ambarus 	 * Job Descriptor and Shared Descriptor
4805d0429a3STudor Ambarus 	 * must fit into the 64-word Descriptor h/w Buffer
4815d0429a3STudor Ambarus 	 */
4824cbe79ccSHoria Geantă 	if (rem_bytes >= DESC_RFC4543_ENC_LEN) {
483db57656bSHoria Geantă 		ctx->cdata.key_inline = true;
4849c0bc511SArnd Bergmann 		ctx->cdata.key_virt = ctx->key;
485db57656bSHoria Geantă 	} else {
486db57656bSHoria Geantă 		ctx->cdata.key_inline = false;
4879c0bc511SArnd Bergmann 		ctx->cdata.key_dma = ctx->key_dma;
488db57656bSHoria Geantă 	}
4895d0429a3STudor Ambarus 
4905d0429a3STudor Ambarus 	desc = ctx->sh_desc_enc;
49187ec3a0bSHoria Geantă 	cnstr_shdsc_rfc4543_encap(desc, &ctx->cdata, ivsize, ctx->authsize,
49287ec3a0bSHoria Geantă 				  false);
493bbf22344SHoria Geantă 	dma_sync_single_for_device(jrdev, ctx->sh_desc_enc_dma,
4947e0880b9SHoria Geantă 				   desc_bytes(desc), ctx->dir);
4955d0429a3STudor Ambarus 
4965d0429a3STudor Ambarus 	/*
4975d0429a3STudor Ambarus 	 * Job Descriptor and Shared Descriptors
4985d0429a3STudor Ambarus 	 * must all fit into the 64-word Descriptor h/w Buffer
4995d0429a3STudor Ambarus 	 */
5004cbe79ccSHoria Geantă 	if (rem_bytes >= DESC_RFC4543_DEC_LEN) {
501db57656bSHoria Geantă 		ctx->cdata.key_inline = true;
5029c0bc511SArnd Bergmann 		ctx->cdata.key_virt = ctx->key;
503db57656bSHoria Geantă 	} else {
504db57656bSHoria Geantă 		ctx->cdata.key_inline = false;
5059c0bc511SArnd Bergmann 		ctx->cdata.key_dma = ctx->key_dma;
506db57656bSHoria Geantă 	}
5075d0429a3STudor Ambarus 
5085d0429a3STudor Ambarus 	desc = ctx->sh_desc_dec;
50987ec3a0bSHoria Geantă 	cnstr_shdsc_rfc4543_decap(desc, &ctx->cdata, ivsize, ctx->authsize,
51087ec3a0bSHoria Geantă 				  false);
511bbf22344SHoria Geantă 	dma_sync_single_for_device(jrdev, ctx->sh_desc_dec_dma,
5127e0880b9SHoria Geantă 				   desc_bytes(desc), ctx->dir);
5135d0429a3STudor Ambarus 
5145d0429a3STudor Ambarus 	return 0;
5155d0429a3STudor Ambarus }
5165d0429a3STudor Ambarus 
rfc4543_setauthsize(struct crypto_aead * authenc,unsigned int authsize)5175d0429a3STudor Ambarus static int rfc4543_setauthsize(struct crypto_aead *authenc,
5185d0429a3STudor Ambarus 			       unsigned int authsize)
5195d0429a3STudor Ambarus {
5204cb4f7c1SHerbert Xu 	struct caam_ctx *ctx = crypto_aead_ctx_dma(authenc);
5215d0429a3STudor Ambarus 
52268a51394SIuliana Prodan 	if (authsize != 16)
52368a51394SIuliana Prodan 		return -EINVAL;
52468a51394SIuliana Prodan 
5255d0429a3STudor Ambarus 	ctx->authsize = authsize;
5265d0429a3STudor Ambarus 	rfc4543_set_sh_desc(authenc);
5275d0429a3STudor Ambarus 
5285d0429a3STudor Ambarus 	return 0;
5295d0429a3STudor Ambarus }
5305d0429a3STudor Ambarus 
chachapoly_set_sh_desc(struct crypto_aead * aead)531d6bbd4eeSHoria Geantă static int chachapoly_set_sh_desc(struct crypto_aead *aead)
532d6bbd4eeSHoria Geantă {
5334cb4f7c1SHerbert Xu 	struct caam_ctx *ctx = crypto_aead_ctx_dma(aead);
534d6bbd4eeSHoria Geantă 	struct device *jrdev = ctx->jrdev;
535d6bbd4eeSHoria Geantă 	unsigned int ivsize = crypto_aead_ivsize(aead);
536d6bbd4eeSHoria Geantă 	u32 *desc;
537d6bbd4eeSHoria Geantă 
538d6bbd4eeSHoria Geantă 	if (!ctx->cdata.keylen || !ctx->authsize)
539d6bbd4eeSHoria Geantă 		return 0;
540d6bbd4eeSHoria Geantă 
541d6bbd4eeSHoria Geantă 	desc = ctx->sh_desc_enc;
542d6bbd4eeSHoria Geantă 	cnstr_shdsc_chachapoly(desc, &ctx->cdata, &ctx->adata, ivsize,
543c10a5336SHoria Geantă 			       ctx->authsize, true, false);
544d6bbd4eeSHoria Geantă 	dma_sync_single_for_device(jrdev, ctx->sh_desc_enc_dma,
545d6bbd4eeSHoria Geantă 				   desc_bytes(desc), ctx->dir);
546d6bbd4eeSHoria Geantă 
547d6bbd4eeSHoria Geantă 	desc = ctx->sh_desc_dec;
548d6bbd4eeSHoria Geantă 	cnstr_shdsc_chachapoly(desc, &ctx->cdata, &ctx->adata, ivsize,
549c10a5336SHoria Geantă 			       ctx->authsize, false, false);
550d6bbd4eeSHoria Geantă 	dma_sync_single_for_device(jrdev, ctx->sh_desc_dec_dma,
551d6bbd4eeSHoria Geantă 				   desc_bytes(desc), ctx->dir);
552d6bbd4eeSHoria Geantă 
553d6bbd4eeSHoria Geantă 	return 0;
554d6bbd4eeSHoria Geantă }
555d6bbd4eeSHoria Geantă 
chachapoly_setauthsize(struct crypto_aead * aead,unsigned int authsize)556d6bbd4eeSHoria Geantă static int chachapoly_setauthsize(struct crypto_aead *aead,
557d6bbd4eeSHoria Geantă 				  unsigned int authsize)
558d6bbd4eeSHoria Geantă {
5594cb4f7c1SHerbert Xu 	struct caam_ctx *ctx = crypto_aead_ctx_dma(aead);
560d6bbd4eeSHoria Geantă 
561d6bbd4eeSHoria Geantă 	if (authsize != POLY1305_DIGEST_SIZE)
562d6bbd4eeSHoria Geantă 		return -EINVAL;
563d6bbd4eeSHoria Geantă 
564d6bbd4eeSHoria Geantă 	ctx->authsize = authsize;
565d6bbd4eeSHoria Geantă 	return chachapoly_set_sh_desc(aead);
566d6bbd4eeSHoria Geantă }
567d6bbd4eeSHoria Geantă 
chachapoly_setkey(struct crypto_aead * aead,const u8 * key,unsigned int keylen)568d6bbd4eeSHoria Geantă static int chachapoly_setkey(struct crypto_aead *aead, const u8 *key,
569d6bbd4eeSHoria Geantă 			     unsigned int keylen)
570d6bbd4eeSHoria Geantă {
5714cb4f7c1SHerbert Xu 	struct caam_ctx *ctx = crypto_aead_ctx_dma(aead);
572d6bbd4eeSHoria Geantă 	unsigned int ivsize = crypto_aead_ivsize(aead);
573d6bbd4eeSHoria Geantă 	unsigned int saltlen = CHACHAPOLY_IV_SIZE - ivsize;
574d6bbd4eeSHoria Geantă 
575674f368aSEric Biggers 	if (keylen != CHACHA_KEY_SIZE + saltlen)
576d6bbd4eeSHoria Geantă 		return -EINVAL;
577d6bbd4eeSHoria Geantă 
578*14d52e6bSGaurav Jain 	memcpy(ctx->key, key, keylen);
579*14d52e6bSGaurav Jain 	ctx->cdata.key_virt = ctx->key;
580d6bbd4eeSHoria Geantă 	ctx->cdata.keylen = keylen - saltlen;
581d6bbd4eeSHoria Geantă 
582d6bbd4eeSHoria Geantă 	return chachapoly_set_sh_desc(aead);
583d6bbd4eeSHoria Geantă }
584d6bbd4eeSHoria Geantă 
aead_setkey(struct crypto_aead * aead,const u8 * key,unsigned int keylen)5850e479300SYuan Kang static int aead_setkey(struct crypto_aead *aead,
5868e8ec596SKim Phillips 			       const u8 *key, unsigned int keylen)
5878e8ec596SKim Phillips {
5884cb4f7c1SHerbert Xu 	struct caam_ctx *ctx = crypto_aead_ctx_dma(aead);
5898e8ec596SKim Phillips 	struct device *jrdev = ctx->jrdev;
5907e0880b9SHoria Geantă 	struct caam_drv_private *ctrlpriv = dev_get_drvdata(jrdev->parent);
5914e6e0b27SHoria Geanta 	struct crypto_authenc_keys keys;
5928e8ec596SKim Phillips 	int ret = 0;
5938e8ec596SKim Phillips 
5944e6e0b27SHoria Geanta 	if (crypto_authenc_extractkeys(&keys, key, keylen) != 0)
5958e8ec596SKim Phillips 		goto badkey;
5968e8ec596SKim Phillips 
5976e005503SSascha Hauer 	dev_dbg(jrdev, "keylen %d enckeylen %d authkeylen %d\n",
5984e6e0b27SHoria Geanta 	       keys.authkeylen + keys.enckeylen, keys.enckeylen,
5994e6e0b27SHoria Geanta 	       keys.authkeylen);
6006e005503SSascha Hauer 	print_hex_dump_debug("key in @"__stringify(__LINE__)": ",
6018e8ec596SKim Phillips 			     DUMP_PREFIX_ADDRESS, 16, 4, key, keylen, 1);
6028e8ec596SKim Phillips 
6037e0880b9SHoria Geantă 	/*
6047e0880b9SHoria Geantă 	 * If DKP is supported, use it in the shared descriptor to generate
6057e0880b9SHoria Geantă 	 * the split key.
6067e0880b9SHoria Geantă 	 */
6077e0880b9SHoria Geantă 	if (ctrlpriv->era >= 6) {
6087e0880b9SHoria Geantă 		ctx->adata.keylen = keys.authkeylen;
6097e0880b9SHoria Geantă 		ctx->adata.keylen_pad = split_key_len(ctx->adata.algtype &
6107e0880b9SHoria Geantă 						      OP_ALG_ALGSEL_MASK);
6117e0880b9SHoria Geantă 
6127e0880b9SHoria Geantă 		if (ctx->adata.keylen_pad + keys.enckeylen > CAAM_MAX_KEY_SIZE)
6137e0880b9SHoria Geantă 			goto badkey;
6147e0880b9SHoria Geantă 
6157e0880b9SHoria Geantă 		memcpy(ctx->key, keys.authkey, keys.authkeylen);
6167e0880b9SHoria Geantă 		memcpy(ctx->key + ctx->adata.keylen_pad, keys.enckey,
6177e0880b9SHoria Geantă 		       keys.enckeylen);
6187e0880b9SHoria Geantă 		dma_sync_single_for_device(jrdev, ctx->key_dma,
6197e0880b9SHoria Geantă 					   ctx->adata.keylen_pad +
6207e0880b9SHoria Geantă 					   keys.enckeylen, ctx->dir);
6217e0880b9SHoria Geantă 		goto skip_split_key;
6227e0880b9SHoria Geantă 	}
6237e0880b9SHoria Geantă 
6246655cb8eSHoria Geantă 	ret = gen_split_key(ctx->jrdev, ctx->key, &ctx->adata, keys.authkey,
6256655cb8eSHoria Geantă 			    keys.authkeylen, CAAM_MAX_KEY_SIZE -
6266655cb8eSHoria Geantă 			    keys.enckeylen);
6278e8ec596SKim Phillips 	if (ret) {
6288e8ec596SKim Phillips 		goto badkey;
6298e8ec596SKim Phillips 	}
6308e8ec596SKim Phillips 
6318e8ec596SKim Phillips 	/* postpend encryption key to auth split key */
632db57656bSHoria Geantă 	memcpy(ctx->key + ctx->adata.keylen_pad, keys.enckey, keys.enckeylen);
633bbf22344SHoria Geantă 	dma_sync_single_for_device(jrdev, ctx->key_dma, ctx->adata.keylen_pad +
6347e0880b9SHoria Geantă 				   keys.enckeylen, ctx->dir);
6356e005503SSascha Hauer 
6366e005503SSascha Hauer 	print_hex_dump_debug("ctx.key@"__stringify(__LINE__)": ",
6378e8ec596SKim Phillips 			     DUMP_PREFIX_ADDRESS, 16, 4, ctx->key,
638db57656bSHoria Geantă 			     ctx->adata.keylen_pad + keys.enckeylen, 1);
6397e0880b9SHoria Geantă 
6407e0880b9SHoria Geantă skip_split_key:
641db57656bSHoria Geantă 	ctx->cdata.keylen = keys.enckeylen;
64261dab972STudor-Dan Ambarus 	memzero_explicit(&keys, sizeof(keys));
643bbf22344SHoria Geantă 	return aead_set_sh_desc(aead);
6448e8ec596SKim Phillips badkey:
64561dab972STudor-Dan Ambarus 	memzero_explicit(&keys, sizeof(keys));
6468e8ec596SKim Phillips 	return -EINVAL;
6478e8ec596SKim Phillips }
6488e8ec596SKim Phillips 
des3_aead_setkey(struct crypto_aead * aead,const u8 * key,unsigned int keylen)6491b52c409SHerbert Xu static int des3_aead_setkey(struct crypto_aead *aead, const u8 *key,
6501b52c409SHerbert Xu 			    unsigned int keylen)
6511b52c409SHerbert Xu {
6521b52c409SHerbert Xu 	struct crypto_authenc_keys keys;
6531b52c409SHerbert Xu 	int err;
6541b52c409SHerbert Xu 
6551b52c409SHerbert Xu 	err = crypto_authenc_extractkeys(&keys, key, keylen);
6561b52c409SHerbert Xu 	if (unlikely(err))
6571b52c409SHerbert Xu 		return err;
6581b52c409SHerbert Xu 
659a628c5a1SArd Biesheuvel 	err = verify_aead_des3_key(aead, keys.enckey, keys.enckeylen) ?:
660a628c5a1SArd Biesheuvel 	      aead_setkey(aead, key, keylen);
661a628c5a1SArd Biesheuvel 
662a628c5a1SArd Biesheuvel 	memzero_explicit(&keys, sizeof(keys));
663a628c5a1SArd Biesheuvel 	return err;
6641b52c409SHerbert Xu }
6651b52c409SHerbert Xu 
gcm_setkey(struct crypto_aead * aead,const u8 * key,unsigned int keylen)6663ef8d945STudor Ambarus static int gcm_setkey(struct crypto_aead *aead,
6673ef8d945STudor Ambarus 		      const u8 *key, unsigned int keylen)
6683ef8d945STudor Ambarus {
6694cb4f7c1SHerbert Xu 	struct caam_ctx *ctx = crypto_aead_ctx_dma(aead);
6703ef8d945STudor Ambarus 	struct device *jrdev = ctx->jrdev;
671836d8f43SIuliana Prodan 	int err;
672836d8f43SIuliana Prodan 
673836d8f43SIuliana Prodan 	err = aes_check_keylen(keylen);
674674f368aSEric Biggers 	if (err)
675836d8f43SIuliana Prodan 		return err;
6763ef8d945STudor Ambarus 
6776e005503SSascha Hauer 	print_hex_dump_debug("key in @"__stringify(__LINE__)": ",
6783ef8d945STudor Ambarus 			     DUMP_PREFIX_ADDRESS, 16, 4, key, keylen, 1);
6793ef8d945STudor Ambarus 
6803ef8d945STudor Ambarus 	memcpy(ctx->key, key, keylen);
6817e0880b9SHoria Geantă 	dma_sync_single_for_device(jrdev, ctx->key_dma, keylen, ctx->dir);
682db57656bSHoria Geantă 	ctx->cdata.keylen = keylen;
6833ef8d945STudor Ambarus 
684bbf22344SHoria Geantă 	return gcm_set_sh_desc(aead);
6853ef8d945STudor Ambarus }
6863ef8d945STudor Ambarus 
rfc4106_setkey(struct crypto_aead * aead,const u8 * key,unsigned int keylen)687bac68f2cSTudor Ambarus static int rfc4106_setkey(struct crypto_aead *aead,
688bac68f2cSTudor Ambarus 			  const u8 *key, unsigned int keylen)
689bac68f2cSTudor Ambarus {
6904cb4f7c1SHerbert Xu 	struct caam_ctx *ctx = crypto_aead_ctx_dma(aead);
691bac68f2cSTudor Ambarus 	struct device *jrdev = ctx->jrdev;
692836d8f43SIuliana Prodan 	int err;
693bac68f2cSTudor Ambarus 
694836d8f43SIuliana Prodan 	err = aes_check_keylen(keylen - 4);
695674f368aSEric Biggers 	if (err)
696836d8f43SIuliana Prodan 		return err;
697bac68f2cSTudor Ambarus 
6986e005503SSascha Hauer 	print_hex_dump_debug("key in @"__stringify(__LINE__)": ",
699bac68f2cSTudor Ambarus 			     DUMP_PREFIX_ADDRESS, 16, 4, key, keylen, 1);
700bac68f2cSTudor Ambarus 
701bac68f2cSTudor Ambarus 	memcpy(ctx->key, key, keylen);
702bac68f2cSTudor Ambarus 
703bac68f2cSTudor Ambarus 	/*
704bac68f2cSTudor Ambarus 	 * The last four bytes of the key material are used as the salt value
705bac68f2cSTudor Ambarus 	 * in the nonce. Update the AES key length.
706bac68f2cSTudor Ambarus 	 */
707db57656bSHoria Geantă 	ctx->cdata.keylen = keylen - 4;
708bbf22344SHoria Geantă 	dma_sync_single_for_device(jrdev, ctx->key_dma, ctx->cdata.keylen,
7097e0880b9SHoria Geantă 				   ctx->dir);
710bbf22344SHoria Geantă 	return rfc4106_set_sh_desc(aead);
711bac68f2cSTudor Ambarus }
712bac68f2cSTudor Ambarus 
rfc4543_setkey(struct crypto_aead * aead,const u8 * key,unsigned int keylen)7135d0429a3STudor Ambarus static int rfc4543_setkey(struct crypto_aead *aead,
7145d0429a3STudor Ambarus 			  const u8 *key, unsigned int keylen)
7155d0429a3STudor Ambarus {
7164cb4f7c1SHerbert Xu 	struct caam_ctx *ctx = crypto_aead_ctx_dma(aead);
7175d0429a3STudor Ambarus 	struct device *jrdev = ctx->jrdev;
718836d8f43SIuliana Prodan 	int err;
7195d0429a3STudor Ambarus 
720836d8f43SIuliana Prodan 	err = aes_check_keylen(keylen - 4);
721674f368aSEric Biggers 	if (err)
722836d8f43SIuliana Prodan 		return err;
7235d0429a3STudor Ambarus 
7246e005503SSascha Hauer 	print_hex_dump_debug("key in @"__stringify(__LINE__)": ",
7255d0429a3STudor Ambarus 			     DUMP_PREFIX_ADDRESS, 16, 4, key, keylen, 1);
7265d0429a3STudor Ambarus 
7275d0429a3STudor Ambarus 	memcpy(ctx->key, key, keylen);
7285d0429a3STudor Ambarus 
7295d0429a3STudor Ambarus 	/*
7305d0429a3STudor Ambarus 	 * The last four bytes of the key material are used as the salt value
7315d0429a3STudor Ambarus 	 * in the nonce. Update the AES key length.
7325d0429a3STudor Ambarus 	 */
733db57656bSHoria Geantă 	ctx->cdata.keylen = keylen - 4;
734bbf22344SHoria Geantă 	dma_sync_single_for_device(jrdev, ctx->key_dma, ctx->cdata.keylen,
7357e0880b9SHoria Geantă 				   ctx->dir);
736bbf22344SHoria Geantă 	return rfc4543_set_sh_desc(aead);
7375d0429a3STudor Ambarus }
7385d0429a3STudor Ambarus 
skcipher_setkey(struct crypto_skcipher * skcipher,const u8 * key,unsigned int keylen,const u32 ctx1_iv_off)7395ca7badbSHoria Geantă static int skcipher_setkey(struct crypto_skcipher *skcipher, const u8 *key,
740836d8f43SIuliana Prodan 			   unsigned int keylen, const u32 ctx1_iv_off)
741acdca31dSYuan Kang {
7424cb4f7c1SHerbert Xu 	struct caam_ctx *ctx = crypto_skcipher_ctx_dma(skcipher);
7435ca7badbSHoria Geantă 	struct caam_skcipher_alg *alg =
7445ca7badbSHoria Geantă 		container_of(crypto_skcipher_alg(skcipher), typeof(*alg),
745623814c0SHerbert Xu 			     skcipher.base);
746acdca31dSYuan Kang 	struct device *jrdev = ctx->jrdev;
7475ca7badbSHoria Geantă 	unsigned int ivsize = crypto_skcipher_ivsize(skcipher);
748acdca31dSYuan Kang 	u32 *desc;
7495ca7badbSHoria Geantă 	const bool is_rfc3686 = alg->caam.rfc3686;
750acdca31dSYuan Kang 
7516e005503SSascha Hauer 	print_hex_dump_debug("key in @"__stringify(__LINE__)": ",
752acdca31dSYuan Kang 			     DUMP_PREFIX_ADDRESS, 16, 4, key, keylen, 1);
753a5f57cffSCatalin Vasile 
754db57656bSHoria Geantă 	ctx->cdata.keylen = keylen;
755662f70edSHoria Geantă 	ctx->cdata.key_virt = key;
756db57656bSHoria Geantă 	ctx->cdata.key_inline = true;
757acdca31dSYuan Kang 
7585ca7badbSHoria Geantă 	/* skcipher_encrypt shared descriptor */
759acdca31dSYuan Kang 	desc = ctx->sh_desc_enc;
7609dbe3072SHoria Geantă 	cnstr_shdsc_skcipher_encap(desc, &ctx->cdata, ivsize, is_rfc3686,
7618cea7b66SHoria Geantă 				   ctx1_iv_off);
762bbf22344SHoria Geantă 	dma_sync_single_for_device(jrdev, ctx->sh_desc_enc_dma,
7637e0880b9SHoria Geantă 				   desc_bytes(desc), ctx->dir);
7648cea7b66SHoria Geantă 
7655ca7badbSHoria Geantă 	/* skcipher_decrypt shared descriptor */
766acdca31dSYuan Kang 	desc = ctx->sh_desc_dec;
7679dbe3072SHoria Geantă 	cnstr_shdsc_skcipher_decap(desc, &ctx->cdata, ivsize, is_rfc3686,
7688cea7b66SHoria Geantă 				   ctx1_iv_off);
769bbf22344SHoria Geantă 	dma_sync_single_for_device(jrdev, ctx->sh_desc_dec_dma,
7707e0880b9SHoria Geantă 				   desc_bytes(desc), ctx->dir);
771acdca31dSYuan Kang 
7728cea7b66SHoria Geantă 	return 0;
773acdca31dSYuan Kang }
774acdca31dSYuan Kang 
aes_skcipher_setkey(struct crypto_skcipher * skcipher,const u8 * key,unsigned int keylen)775836d8f43SIuliana Prodan static int aes_skcipher_setkey(struct crypto_skcipher *skcipher,
776836d8f43SIuliana Prodan 			       const u8 *key, unsigned int keylen)
777836d8f43SIuliana Prodan {
778836d8f43SIuliana Prodan 	int err;
779836d8f43SIuliana Prodan 
780836d8f43SIuliana Prodan 	err = aes_check_keylen(keylen);
781674f368aSEric Biggers 	if (err)
782836d8f43SIuliana Prodan 		return err;
783836d8f43SIuliana Prodan 
784836d8f43SIuliana Prodan 	return skcipher_setkey(skcipher, key, keylen, 0);
785836d8f43SIuliana Prodan }
786836d8f43SIuliana Prodan 
rfc3686_skcipher_setkey(struct crypto_skcipher * skcipher,const u8 * key,unsigned int keylen)787836d8f43SIuliana Prodan static int rfc3686_skcipher_setkey(struct crypto_skcipher *skcipher,
788836d8f43SIuliana Prodan 				   const u8 *key, unsigned int keylen)
789836d8f43SIuliana Prodan {
790836d8f43SIuliana Prodan 	u32 ctx1_iv_off;
791836d8f43SIuliana Prodan 	int err;
792836d8f43SIuliana Prodan 
793836d8f43SIuliana Prodan 	/*
794836d8f43SIuliana Prodan 	 * RFC3686 specific:
795836d8f43SIuliana Prodan 	 *	| CONTEXT1[255:128] = {NONCE, IV, COUNTER}
796836d8f43SIuliana Prodan 	 *	| *key = {KEY, NONCE}
797836d8f43SIuliana Prodan 	 */
798836d8f43SIuliana Prodan 	ctx1_iv_off = 16 + CTR_RFC3686_NONCE_SIZE;
799836d8f43SIuliana Prodan 	keylen -= CTR_RFC3686_NONCE_SIZE;
800836d8f43SIuliana Prodan 
801836d8f43SIuliana Prodan 	err = aes_check_keylen(keylen);
802674f368aSEric Biggers 	if (err)
803836d8f43SIuliana Prodan 		return err;
804836d8f43SIuliana Prodan 
805836d8f43SIuliana Prodan 	return skcipher_setkey(skcipher, key, keylen, ctx1_iv_off);
806836d8f43SIuliana Prodan }
807836d8f43SIuliana Prodan 
ctr_skcipher_setkey(struct crypto_skcipher * skcipher,const u8 * key,unsigned int keylen)808836d8f43SIuliana Prodan static int ctr_skcipher_setkey(struct crypto_skcipher *skcipher,
809836d8f43SIuliana Prodan 			       const u8 *key, unsigned int keylen)
810836d8f43SIuliana Prodan {
811836d8f43SIuliana Prodan 	u32 ctx1_iv_off;
812836d8f43SIuliana Prodan 	int err;
813836d8f43SIuliana Prodan 
814836d8f43SIuliana Prodan 	/*
815836d8f43SIuliana Prodan 	 * AES-CTR needs to load IV in CONTEXT1 reg
816836d8f43SIuliana Prodan 	 * at an offset of 128bits (16bytes)
817836d8f43SIuliana Prodan 	 * CONTEXT1[255:128] = IV
818836d8f43SIuliana Prodan 	 */
819836d8f43SIuliana Prodan 	ctx1_iv_off = 16;
820836d8f43SIuliana Prodan 
821836d8f43SIuliana Prodan 	err = aes_check_keylen(keylen);
822674f368aSEric Biggers 	if (err)
823836d8f43SIuliana Prodan 		return err;
824836d8f43SIuliana Prodan 
825836d8f43SIuliana Prodan 	return skcipher_setkey(skcipher, key, keylen, ctx1_iv_off);
826836d8f43SIuliana Prodan }
827836d8f43SIuliana Prodan 
des_skcipher_setkey(struct crypto_skcipher * skcipher,const u8 * key,unsigned int keylen)828eaed71a4SIuliana Prodan static int des_skcipher_setkey(struct crypto_skcipher *skcipher,
829eaed71a4SIuliana Prodan 			       const u8 *key, unsigned int keylen)
830eaed71a4SIuliana Prodan {
831a628c5a1SArd Biesheuvel 	return verify_skcipher_des_key(skcipher, key) ?:
832a628c5a1SArd Biesheuvel 	       skcipher_setkey(skcipher, key, keylen, 0);
833eaed71a4SIuliana Prodan }
834eaed71a4SIuliana Prodan 
des3_skcipher_setkey(struct crypto_skcipher * skcipher,const u8 * key,unsigned int keylen)835a628c5a1SArd Biesheuvel static int des3_skcipher_setkey(struct crypto_skcipher *skcipher,
836a628c5a1SArd Biesheuvel 				const u8 *key, unsigned int keylen)
837a628c5a1SArd Biesheuvel {
838a628c5a1SArd Biesheuvel 	return verify_skcipher_des3_key(skcipher, key) ?:
839a628c5a1SArd Biesheuvel 	       skcipher_setkey(skcipher, key, keylen, 0);
840eaed71a4SIuliana Prodan }
841eaed71a4SIuliana Prodan 
xts_skcipher_setkey(struct crypto_skcipher * skcipher,const u8 * key,unsigned int keylen)8425ca7badbSHoria Geantă static int xts_skcipher_setkey(struct crypto_skcipher *skcipher, const u8 *key,
8435ca7badbSHoria Geantă 			       unsigned int keylen)
844c6415a60SCatalin Vasile {
8454cb4f7c1SHerbert Xu 	struct caam_ctx *ctx = crypto_skcipher_ctx_dma(skcipher);
846c6415a60SCatalin Vasile 	struct device *jrdev = ctx->jrdev;
84778eebbfaSAndrei Botila 	struct caam_drv_private *ctrlpriv = dev_get_drvdata(jrdev->parent);
8488cea7b66SHoria Geantă 	u32 *desc;
8499d9b14dbSAndrei Botila 	int err;
850c6415a60SCatalin Vasile 
851c91f7348SAndrei Botila 	err = xts_verify_key(skcipher, key, keylen);
852c91f7348SAndrei Botila 	if (err) {
853da6a6685SHoria Geantă 		dev_dbg(jrdev, "key size mismatch\n");
854c91f7348SAndrei Botila 		return err;
855c6415a60SCatalin Vasile 	}
856c6415a60SCatalin Vasile 
857c91f7348SAndrei Botila 	if (keylen != 2 * AES_KEYSIZE_128 && keylen != 2 * AES_KEYSIZE_256)
858c91f7348SAndrei Botila 		ctx->xts_key_fallback = true;
859c91f7348SAndrei Botila 
86078eebbfaSAndrei Botila 	if (ctrlpriv->era <= 8 || ctx->xts_key_fallback) {
8619d9b14dbSAndrei Botila 		err = crypto_skcipher_setkey(ctx->fallback, key, keylen);
8629d9b14dbSAndrei Botila 		if (err)
8639d9b14dbSAndrei Botila 			return err;
86478eebbfaSAndrei Botila 	}
8659d9b14dbSAndrei Botila 
866db57656bSHoria Geantă 	ctx->cdata.keylen = keylen;
867662f70edSHoria Geantă 	ctx->cdata.key_virt = key;
868db57656bSHoria Geantă 	ctx->cdata.key_inline = true;
869c6415a60SCatalin Vasile 
8705ca7badbSHoria Geantă 	/* xts_skcipher_encrypt shared descriptor */
871c6415a60SCatalin Vasile 	desc = ctx->sh_desc_enc;
8729dbe3072SHoria Geantă 	cnstr_shdsc_xts_skcipher_encap(desc, &ctx->cdata);
873bbf22344SHoria Geantă 	dma_sync_single_for_device(jrdev, ctx->sh_desc_enc_dma,
8747e0880b9SHoria Geantă 				   desc_bytes(desc), ctx->dir);
875c6415a60SCatalin Vasile 
8765ca7badbSHoria Geantă 	/* xts_skcipher_decrypt shared descriptor */
877c6415a60SCatalin Vasile 	desc = ctx->sh_desc_dec;
8789dbe3072SHoria Geantă 	cnstr_shdsc_xts_skcipher_decap(desc, &ctx->cdata);
879bbf22344SHoria Geantă 	dma_sync_single_for_device(jrdev, ctx->sh_desc_dec_dma,
8807e0880b9SHoria Geantă 				   desc_bytes(desc), ctx->dir);
881c6415a60SCatalin Vasile 
882c6415a60SCatalin Vasile 	return 0;
883c6415a60SCatalin Vasile }
884c6415a60SCatalin Vasile 
8858e8ec596SKim Phillips /*
8861acebad3SYuan Kang  * aead_edesc - s/w-extended aead descriptor
887fa0c92dbSHoria Geantă  * @src_nents: number of segments in input s/w scatterlist
888fa0c92dbSHoria Geantă  * @dst_nents: number of segments in output s/w scatterlist
889ba4cf71bSIuliana Prodan  * @mapped_src_nents: number of segments in input h/w link table
890ba4cf71bSIuliana Prodan  * @mapped_dst_nents: number of segments in output h/w link table
891a299c837SYuan Kang  * @sec4_sg_bytes: length of dma mapped sec4_sg space
8921c240226SIuliana Prodan  * @bklog: stored to determine if the request needs backlog
893a299c837SYuan Kang  * @sec4_sg_dma: bus physical mapped address of h/w link table
8944ca7c7d8SHoria Geantă  * @sec4_sg: pointer to h/w link table
8958e8ec596SKim Phillips  * @hw_desc: the h/w job descriptor followed by any referenced link tables
8968e8ec596SKim Phillips  */
8970e479300SYuan Kang struct aead_edesc {
8988e8ec596SKim Phillips 	int src_nents;
8998e8ec596SKim Phillips 	int dst_nents;
900ba4cf71bSIuliana Prodan 	int mapped_src_nents;
901ba4cf71bSIuliana Prodan 	int mapped_dst_nents;
902a299c837SYuan Kang 	int sec4_sg_bytes;
9031c240226SIuliana Prodan 	bool bklog;
904a299c837SYuan Kang 	dma_addr_t sec4_sg_dma;
905a299c837SYuan Kang 	struct sec4_sg_entry *sec4_sg;
906f2147b88SHerbert Xu 	u32 hw_desc[];
9078e8ec596SKim Phillips };
9088e8ec596SKim Phillips 
909acdca31dSYuan Kang /*
9105ca7badbSHoria Geantă  * skcipher_edesc - s/w-extended skcipher descriptor
911fa0c92dbSHoria Geantă  * @src_nents: number of segments in input s/w scatterlist
912fa0c92dbSHoria Geantă  * @dst_nents: number of segments in output s/w scatterlist
913ba4cf71bSIuliana Prodan  * @mapped_src_nents: number of segments in input h/w link table
914ba4cf71bSIuliana Prodan  * @mapped_dst_nents: number of segments in output h/w link table
915acdca31dSYuan Kang  * @iv_dma: dma address of iv for checking continuity and link table
916a299c837SYuan Kang  * @sec4_sg_bytes: length of dma mapped sec4_sg space
917ee38767fSIuliana Prodan  * @bklog: stored to determine if the request needs backlog
918a299c837SYuan Kang  * @sec4_sg_dma: bus physical mapped address of h/w link table
9194ca7c7d8SHoria Geantă  * @sec4_sg: pointer to h/w link table
920acdca31dSYuan Kang  * @hw_desc: the h/w job descriptor followed by any referenced link tables
921115957bbSHoria Geantă  *	     and IV
922acdca31dSYuan Kang  */
9235ca7badbSHoria Geantă struct skcipher_edesc {
924acdca31dSYuan Kang 	int src_nents;
925acdca31dSYuan Kang 	int dst_nents;
926ba4cf71bSIuliana Prodan 	int mapped_src_nents;
927ba4cf71bSIuliana Prodan 	int mapped_dst_nents;
928acdca31dSYuan Kang 	dma_addr_t iv_dma;
929a299c837SYuan Kang 	int sec4_sg_bytes;
930ee38767fSIuliana Prodan 	bool bklog;
931a299c837SYuan Kang 	dma_addr_t sec4_sg_dma;
932a299c837SYuan Kang 	struct sec4_sg_entry *sec4_sg;
9335a8a0765SGustavo A. R. Silva 	u32 hw_desc[];
934acdca31dSYuan Kang };
935acdca31dSYuan Kang 
caam_unmap(struct device * dev,struct scatterlist * src,struct scatterlist * dst,int src_nents,int dst_nents,dma_addr_t iv_dma,int ivsize,dma_addr_t sec4_sg_dma,int sec4_sg_bytes)9361acebad3SYuan Kang static void caam_unmap(struct device *dev, struct scatterlist *src,
937643b39b0SYuan Kang 		       struct scatterlist *dst, int src_nents,
93813fb8fd7SLABBE Corentin 		       int dst_nents,
939cf5448b5SHoria Geantă 		       dma_addr_t iv_dma, int ivsize, dma_addr_t sec4_sg_dma,
940a299c837SYuan Kang 		       int sec4_sg_bytes)
9411acebad3SYuan Kang {
942643b39b0SYuan Kang 	if (dst != src) {
943fa0c92dbSHoria Geantă 		if (src_nents)
944fa0c92dbSHoria Geantă 			dma_unmap_sg(dev, src, src_nents, DMA_TO_DEVICE);
945763069baSHoria Geantă 		if (dst_nents)
946fa0c92dbSHoria Geantă 			dma_unmap_sg(dev, dst, dst_nents, DMA_FROM_DEVICE);
9471acebad3SYuan Kang 	} else {
948fa0c92dbSHoria Geantă 		dma_unmap_sg(dev, src, src_nents, DMA_BIDIRECTIONAL);
9491acebad3SYuan Kang 	}
9501acebad3SYuan Kang 
9511acebad3SYuan Kang 	if (iv_dma)
952334d37c9SHoria Geantă 		dma_unmap_single(dev, iv_dma, ivsize, DMA_BIDIRECTIONAL);
953a299c837SYuan Kang 	if (sec4_sg_bytes)
954a299c837SYuan Kang 		dma_unmap_single(dev, sec4_sg_dma, sec4_sg_bytes,
9551acebad3SYuan Kang 				 DMA_TO_DEVICE);
9561acebad3SYuan Kang }
9571acebad3SYuan Kang 
aead_unmap(struct device * dev,struct aead_edesc * edesc,struct aead_request * req)9580e479300SYuan Kang static void aead_unmap(struct device *dev,
9590e479300SYuan Kang 		       struct aead_edesc *edesc,
9600e479300SYuan Kang 		       struct aead_request *req)
9618e8ec596SKim Phillips {
962f2147b88SHerbert Xu 	caam_unmap(dev, req->src, req->dst,
963cf5448b5SHoria Geantă 		   edesc->src_nents, edesc->dst_nents, 0, 0,
964f2147b88SHerbert Xu 		   edesc->sec4_sg_dma, edesc->sec4_sg_bytes);
965f2147b88SHerbert Xu }
966f2147b88SHerbert Xu 
skcipher_unmap(struct device * dev,struct skcipher_edesc * edesc,struct skcipher_request * req)9675ca7badbSHoria Geantă static void skcipher_unmap(struct device *dev, struct skcipher_edesc *edesc,
9685ca7badbSHoria Geantă 			   struct skcipher_request *req)
969acdca31dSYuan Kang {
9705ca7badbSHoria Geantă 	struct crypto_skcipher *skcipher = crypto_skcipher_reqtfm(req);
9715ca7badbSHoria Geantă 	int ivsize = crypto_skcipher_ivsize(skcipher);
972acdca31dSYuan Kang 
973acdca31dSYuan Kang 	caam_unmap(dev, req->src, req->dst,
97413fb8fd7SLABBE Corentin 		   edesc->src_nents, edesc->dst_nents,
975cf5448b5SHoria Geantă 		   edesc->iv_dma, ivsize,
976643b39b0SYuan Kang 		   edesc->sec4_sg_dma, edesc->sec4_sg_bytes);
977acdca31dSYuan Kang }
978acdca31dSYuan Kang 
aead_crypt_done(struct device * jrdev,u32 * desc,u32 err,void * context)979b7f17fe2SIuliana Prodan static void aead_crypt_done(struct device *jrdev, u32 *desc, u32 err,
9808e8ec596SKim Phillips 			    void *context)
9818e8ec596SKim Phillips {
9820e479300SYuan Kang 	struct aead_request *req = context;
9831c240226SIuliana Prodan 	struct caam_aead_req_ctx *rctx = aead_request_ctx(req);
9841c240226SIuliana Prodan 	struct caam_drv_private_jr *jrp = dev_get_drvdata(jrdev);
9850e479300SYuan Kang 	struct aead_edesc *edesc;
9861984aaeeSHoria Geantă 	int ecode = 0;
9875ed1e8b8SIuliana Prodan 	bool has_bklog;
988f2147b88SHerbert Xu 
9896e005503SSascha Hauer 	dev_dbg(jrdev, "%s %d: err 0x%x\n", __func__, __LINE__, err);
990f2147b88SHerbert Xu 
9911c240226SIuliana Prodan 	edesc = rctx->edesc;
9925ed1e8b8SIuliana Prodan 	has_bklog = edesc->bklog;
993f2147b88SHerbert Xu 
994f2147b88SHerbert Xu 	if (err)
9951984aaeeSHoria Geantă 		ecode = caam_jr_strstatus(jrdev, err);
996f2147b88SHerbert Xu 
997f2147b88SHerbert Xu 	aead_unmap(jrdev, edesc, req);
998f2147b88SHerbert Xu 
999f2147b88SHerbert Xu 	kfree(edesc);
1000f2147b88SHerbert Xu 
10011c240226SIuliana Prodan 	/*
10021c240226SIuliana Prodan 	 * If no backlog flag, the completion of the request is done
10031c240226SIuliana Prodan 	 * by CAAM, not crypto engine.
10041c240226SIuliana Prodan 	 */
10055ed1e8b8SIuliana Prodan 	if (!has_bklog)
10061984aaeeSHoria Geantă 		aead_request_complete(req, ecode);
10071c240226SIuliana Prodan 	else
10081c240226SIuliana Prodan 		crypto_finalize_aead_request(jrp->engine, req, ecode);
1009f2147b88SHerbert Xu }
1010f2147b88SHerbert Xu 
skcipher_edesc_iv(struct skcipher_edesc * edesc)1011660ca947SHerbert Xu static inline u8 *skcipher_edesc_iv(struct skcipher_edesc *edesc)
1012660ca947SHerbert Xu {
1013660ca947SHerbert Xu 
1014660ca947SHerbert Xu 	return PTR_ALIGN((u8 *)edesc->sec4_sg + edesc->sec4_sg_bytes,
1015660ca947SHerbert Xu 			 dma_get_cache_alignment());
1016660ca947SHerbert Xu }
1017660ca947SHerbert Xu 
skcipher_crypt_done(struct device * jrdev,u32 * desc,u32 err,void * context)1018b7f17fe2SIuliana Prodan static void skcipher_crypt_done(struct device *jrdev, u32 *desc, u32 err,
1019acdca31dSYuan Kang 				void *context)
1020acdca31dSYuan Kang {
10215ca7badbSHoria Geantă 	struct skcipher_request *req = context;
10225ca7badbSHoria Geantă 	struct skcipher_edesc *edesc;
1023ee38767fSIuliana Prodan 	struct caam_skcipher_req_ctx *rctx = skcipher_request_ctx(req);
10245ca7badbSHoria Geantă 	struct crypto_skcipher *skcipher = crypto_skcipher_reqtfm(req);
1025ee38767fSIuliana Prodan 	struct caam_drv_private_jr *jrp = dev_get_drvdata(jrdev);
10265ca7badbSHoria Geantă 	int ivsize = crypto_skcipher_ivsize(skcipher);
10271984aaeeSHoria Geantă 	int ecode = 0;
10285af4e8d4SIuliana Prodan 	bool has_bklog;
1029acdca31dSYuan Kang 
10306e005503SSascha Hauer 	dev_dbg(jrdev, "%s %d: err 0x%x\n", __func__, __LINE__, err);
1031acdca31dSYuan Kang 
1032ee38767fSIuliana Prodan 	edesc = rctx->edesc;
10335af4e8d4SIuliana Prodan 	has_bklog = edesc->bklog;
1034fa9659cdSMarek Vasut 	if (err)
10351984aaeeSHoria Geantă 		ecode = caam_jr_strstatus(jrdev, err);
1036acdca31dSYuan Kang 
1037bb992bc4SSascha Hauer 	skcipher_unmap(jrdev, edesc, req);
1038bb992bc4SSascha Hauer 
1039334d37c9SHoria Geantă 	/*
1040334d37c9SHoria Geantă 	 * The crypto API expects us to set the IV (req->iv) to the last
1041334d37c9SHoria Geantă 	 * ciphertext block (CBC mode) or last counter (CTR mode).
1042334d37c9SHoria Geantă 	 * This is used e.g. by the CTS mode.
1043334d37c9SHoria Geantă 	 */
10441ccb39ebSHoria Geantă 	if (ivsize && !ecode) {
1045660ca947SHerbert Xu 		memcpy(req->iv, skcipher_edesc_iv(edesc), ivsize);
1046334d37c9SHoria Geantă 
10476e005503SSascha Hauer 		print_hex_dump_debug("dstiv  @" __stringify(__LINE__)": ",
1048334d37c9SHoria Geantă 				     DUMP_PREFIX_ADDRESS, 16, 4, req->iv,
1049334d37c9SHoria Geantă 				     ivsize, 1);
1050334d37c9SHoria Geantă 	}
1051334d37c9SHoria Geantă 
10528a82451bSSascha Hauer 	caam_dump_sg("dst    @" __stringify(__LINE__)": ",
10535ecf8ef9SCatalin Vasile 		     DUMP_PREFIX_ADDRESS, 16, 4, req->dst,
10545ca7badbSHoria Geantă 		     edesc->dst_nents > 1 ? 100 : req->cryptlen, 1);
1055acdca31dSYuan Kang 
1056acdca31dSYuan Kang 	kfree(edesc);
1057acdca31dSYuan Kang 
1058ee38767fSIuliana Prodan 	/*
1059ee38767fSIuliana Prodan 	 * If no backlog flag, the completion of the request is done
1060ee38767fSIuliana Prodan 	 * by CAAM, not crypto engine.
1061ee38767fSIuliana Prodan 	 */
10625af4e8d4SIuliana Prodan 	if (!has_bklog)
10631984aaeeSHoria Geantă 		skcipher_request_complete(req, ecode);
1064ee38767fSIuliana Prodan 	else
1065ee38767fSIuliana Prodan 		crypto_finalize_skcipher_request(jrp->engine, req, ecode);
1066acdca31dSYuan Kang }
1067acdca31dSYuan Kang 
10688e8ec596SKim Phillips /*
10691acebad3SYuan Kang  * Fill in aead job descriptor
10708e8ec596SKim Phillips  */
init_aead_job(struct aead_request * req,struct aead_edesc * edesc,bool all_contig,bool encrypt)1071f2147b88SHerbert Xu static void init_aead_job(struct aead_request *req,
1072f2147b88SHerbert Xu 			  struct aead_edesc *edesc,
1073f2147b88SHerbert Xu 			  bool all_contig, bool encrypt)
1074f2147b88SHerbert Xu {
1075f2147b88SHerbert Xu 	struct crypto_aead *aead = crypto_aead_reqtfm(req);
10764cb4f7c1SHerbert Xu 	struct caam_ctx *ctx = crypto_aead_ctx_dma(aead);
1077f2147b88SHerbert Xu 	int authsize = ctx->authsize;
1078f2147b88SHerbert Xu 	u32 *desc = edesc->hw_desc;
1079f2147b88SHerbert Xu 	u32 out_options, in_options;
1080f2147b88SHerbert Xu 	dma_addr_t dst_dma, src_dma;
1081f2147b88SHerbert Xu 	int len, sec4_sg_index = 0;
1082f2147b88SHerbert Xu 	dma_addr_t ptr;
1083f2147b88SHerbert Xu 	u32 *sh_desc;
1084f2147b88SHerbert Xu 
1085f2147b88SHerbert Xu 	sh_desc = encrypt ? ctx->sh_desc_enc : ctx->sh_desc_dec;
1086f2147b88SHerbert Xu 	ptr = encrypt ? ctx->sh_desc_enc_dma : ctx->sh_desc_dec_dma;
1087f2147b88SHerbert Xu 
1088f2147b88SHerbert Xu 	len = desc_len(sh_desc);
1089f2147b88SHerbert Xu 	init_job_desc_shared(desc, ptr, len, HDR_SHARE_DEFER | HDR_REVERSE);
1090f2147b88SHerbert Xu 
1091f2147b88SHerbert Xu 	if (all_contig) {
1092ba4cf71bSIuliana Prodan 		src_dma = edesc->mapped_src_nents ? sg_dma_address(req->src) :
1093ba4cf71bSIuliana Prodan 						    0;
1094f2147b88SHerbert Xu 		in_options = 0;
1095f2147b88SHerbert Xu 	} else {
1096f2147b88SHerbert Xu 		src_dma = edesc->sec4_sg_dma;
1097ba4cf71bSIuliana Prodan 		sec4_sg_index += edesc->mapped_src_nents;
1098f2147b88SHerbert Xu 		in_options = LDST_SGF;
1099f2147b88SHerbert Xu 	}
1100f2147b88SHerbert Xu 
1101f2147b88SHerbert Xu 	append_seq_in_ptr(desc, src_dma, req->assoclen + req->cryptlen,
1102f2147b88SHerbert Xu 			  in_options);
1103f2147b88SHerbert Xu 
1104f2147b88SHerbert Xu 	dst_dma = src_dma;
1105f2147b88SHerbert Xu 	out_options = in_options;
1106f2147b88SHerbert Xu 
1107f2147b88SHerbert Xu 	if (unlikely(req->src != req->dst)) {
1108ba4cf71bSIuliana Prodan 		if (!edesc->mapped_dst_nents) {
1109763069baSHoria Geantă 			dst_dma = 0;
1110dcd9c76eSHoria Geantă 			out_options = 0;
1111ba4cf71bSIuliana Prodan 		} else if (edesc->mapped_dst_nents == 1) {
1112f2147b88SHerbert Xu 			dst_dma = sg_dma_address(req->dst);
111342e95d1fSPankaj Gupta 			out_options = 0;
1114f2147b88SHerbert Xu 		} else {
1115f2147b88SHerbert Xu 			dst_dma = edesc->sec4_sg_dma +
1116f2147b88SHerbert Xu 				  sec4_sg_index *
1117f2147b88SHerbert Xu 				  sizeof(struct sec4_sg_entry);
1118f2147b88SHerbert Xu 			out_options = LDST_SGF;
1119f2147b88SHerbert Xu 		}
1120f2147b88SHerbert Xu 	}
1121f2147b88SHerbert Xu 
1122f2147b88SHerbert Xu 	if (encrypt)
1123f2147b88SHerbert Xu 		append_seq_out_ptr(desc, dst_dma,
1124f2147b88SHerbert Xu 				   req->assoclen + req->cryptlen + authsize,
1125f2147b88SHerbert Xu 				   out_options);
1126f2147b88SHerbert Xu 	else
1127f2147b88SHerbert Xu 		append_seq_out_ptr(desc, dst_dma,
1128f2147b88SHerbert Xu 				   req->assoclen + req->cryptlen - authsize,
1129f2147b88SHerbert Xu 				   out_options);
1130f2147b88SHerbert Xu }
1131f2147b88SHerbert Xu 
init_gcm_job(struct aead_request * req,struct aead_edesc * edesc,bool all_contig,bool encrypt)1132f2147b88SHerbert Xu static void init_gcm_job(struct aead_request *req,
1133f2147b88SHerbert Xu 			 struct aead_edesc *edesc,
1134f2147b88SHerbert Xu 			 bool all_contig, bool encrypt)
1135f2147b88SHerbert Xu {
1136f2147b88SHerbert Xu 	struct crypto_aead *aead = crypto_aead_reqtfm(req);
11374cb4f7c1SHerbert Xu 	struct caam_ctx *ctx = crypto_aead_ctx_dma(aead);
1138f2147b88SHerbert Xu 	unsigned int ivsize = crypto_aead_ivsize(aead);
1139f2147b88SHerbert Xu 	u32 *desc = edesc->hw_desc;
11407545e166SCorentin LABBE 	bool generic_gcm = (ivsize == GCM_AES_IV_SIZE);
1141f2147b88SHerbert Xu 	unsigned int last;
1142f2147b88SHerbert Xu 
1143f2147b88SHerbert Xu 	init_aead_job(req, edesc, all_contig, encrypt);
11447e0880b9SHoria Geantă 	append_math_add_imm_u32(desc, REG3, ZERO, IMM, req->assoclen);
1145f2147b88SHerbert Xu 
1146f2147b88SHerbert Xu 	/* BUG This should not be specific to generic GCM. */
1147f2147b88SHerbert Xu 	last = 0;
1148f2147b88SHerbert Xu 	if (encrypt && generic_gcm && !(req->assoclen + req->cryptlen))
1149f2147b88SHerbert Xu 		last = FIFOLD_TYPE_LAST1;
1150f2147b88SHerbert Xu 
1151f2147b88SHerbert Xu 	/* Read GCM IV */
1152f2147b88SHerbert Xu 	append_cmd(desc, CMD_FIFO_LOAD | FIFOLD_CLASS_CLASS1 | IMMEDIATE |
11537545e166SCorentin LABBE 			 FIFOLD_TYPE_IV | FIFOLD_TYPE_FLUSH1 | GCM_AES_IV_SIZE | last);
1154f2147b88SHerbert Xu 	/* Append Salt */
1155f2147b88SHerbert Xu 	if (!generic_gcm)
1156db57656bSHoria Geantă 		append_data(desc, ctx->key + ctx->cdata.keylen, 4);
1157f2147b88SHerbert Xu 	/* Append IV */
1158f2147b88SHerbert Xu 	append_data(desc, req->iv, ivsize);
1159f2147b88SHerbert Xu 	/* End of blank commands */
1160f2147b88SHerbert Xu }
1161f2147b88SHerbert Xu 
init_chachapoly_job(struct aead_request * req,struct aead_edesc * edesc,bool all_contig,bool encrypt)1162d6bbd4eeSHoria Geantă static void init_chachapoly_job(struct aead_request *req,
1163d6bbd4eeSHoria Geantă 				struct aead_edesc *edesc, bool all_contig,
1164d6bbd4eeSHoria Geantă 				bool encrypt)
1165d6bbd4eeSHoria Geantă {
1166d6bbd4eeSHoria Geantă 	struct crypto_aead *aead = crypto_aead_reqtfm(req);
1167d6bbd4eeSHoria Geantă 	unsigned int ivsize = crypto_aead_ivsize(aead);
1168d6bbd4eeSHoria Geantă 	unsigned int assoclen = req->assoclen;
1169d6bbd4eeSHoria Geantă 	u32 *desc = edesc->hw_desc;
1170d6bbd4eeSHoria Geantă 	u32 ctx_iv_off = 4;
1171d6bbd4eeSHoria Geantă 
1172d6bbd4eeSHoria Geantă 	init_aead_job(req, edesc, all_contig, encrypt);
1173d6bbd4eeSHoria Geantă 
1174d6bbd4eeSHoria Geantă 	if (ivsize != CHACHAPOLY_IV_SIZE) {
1175d6bbd4eeSHoria Geantă 		/* IPsec specific: CONTEXT1[223:128] = {NONCE, IV} */
1176d6bbd4eeSHoria Geantă 		ctx_iv_off += 4;
1177d6bbd4eeSHoria Geantă 
1178d6bbd4eeSHoria Geantă 		/*
1179d6bbd4eeSHoria Geantă 		 * The associated data comes already with the IV but we need
1180d6bbd4eeSHoria Geantă 		 * to skip it when we authenticate or encrypt...
1181d6bbd4eeSHoria Geantă 		 */
1182d6bbd4eeSHoria Geantă 		assoclen -= ivsize;
1183d6bbd4eeSHoria Geantă 	}
1184d6bbd4eeSHoria Geantă 
1185d6bbd4eeSHoria Geantă 	append_math_add_imm_u32(desc, REG3, ZERO, IMM, assoclen);
1186d6bbd4eeSHoria Geantă 
1187d6bbd4eeSHoria Geantă 	/*
1188d6bbd4eeSHoria Geantă 	 * For IPsec load the IV further in the same register.
1189d6bbd4eeSHoria Geantă 	 * For RFC7539 simply load the 12 bytes nonce in a single operation
1190d6bbd4eeSHoria Geantă 	 */
1191d6bbd4eeSHoria Geantă 	append_load_as_imm(desc, req->iv, ivsize, LDST_CLASS_1_CCB |
1192d6bbd4eeSHoria Geantă 			   LDST_SRCDST_BYTE_CONTEXT |
1193d6bbd4eeSHoria Geantă 			   ctx_iv_off << LDST_OFFSET_SHIFT);
1194d6bbd4eeSHoria Geantă }
1195d6bbd4eeSHoria Geantă 
init_authenc_job(struct aead_request * req,struct aead_edesc * edesc,bool all_contig,bool encrypt)1196479bcc7cSHerbert Xu static void init_authenc_job(struct aead_request *req,
11971acebad3SYuan Kang 			     struct aead_edesc *edesc,
1198479bcc7cSHerbert Xu 			     bool all_contig, bool encrypt)
11991acebad3SYuan Kang {
12001acebad3SYuan Kang 	struct crypto_aead *aead = crypto_aead_reqtfm(req);
1201479bcc7cSHerbert Xu 	struct caam_aead_alg *alg = container_of(crypto_aead_alg(aead),
1202623814c0SHerbert Xu 						 struct caam_aead_alg,
1203623814c0SHerbert Xu 						 aead.base);
1204479bcc7cSHerbert Xu 	unsigned int ivsize = crypto_aead_ivsize(aead);
12054cb4f7c1SHerbert Xu 	struct caam_ctx *ctx = crypto_aead_ctx_dma(aead);
12067e0880b9SHoria Geantă 	struct caam_drv_private *ctrlpriv = dev_get_drvdata(ctx->jrdev->parent);
1207db57656bSHoria Geantă 	const bool ctr_mode = ((ctx->cdata.algtype & OP_ALG_AAI_MASK) ==
1208479bcc7cSHerbert Xu 			       OP_ALG_AAI_CTR_MOD128);
1209479bcc7cSHerbert Xu 	const bool is_rfc3686 = alg->caam.rfc3686;
12101acebad3SYuan Kang 	u32 *desc = edesc->hw_desc;
1211479bcc7cSHerbert Xu 	u32 ivoffset = 0;
12128e8ec596SKim Phillips 
1213479bcc7cSHerbert Xu 	/*
1214479bcc7cSHerbert Xu 	 * AES-CTR needs to load IV in CONTEXT1 reg
1215479bcc7cSHerbert Xu 	 * at an offset of 128bits (16bytes)
1216479bcc7cSHerbert Xu 	 * CONTEXT1[255:128] = IV
1217479bcc7cSHerbert Xu 	 */
1218479bcc7cSHerbert Xu 	if (ctr_mode)
1219479bcc7cSHerbert Xu 		ivoffset = 16;
12208e8ec596SKim Phillips 
1221479bcc7cSHerbert Xu 	/*
1222479bcc7cSHerbert Xu 	 * RFC3686 specific:
1223479bcc7cSHerbert Xu 	 *	CONTEXT1[255:128] = {NONCE, IV, COUNTER}
1224479bcc7cSHerbert Xu 	 */
1225479bcc7cSHerbert Xu 	if (is_rfc3686)
1226479bcc7cSHerbert Xu 		ivoffset = 16 + CTR_RFC3686_NONCE_SIZE;
1227bac68f2cSTudor Ambarus 
1228479bcc7cSHerbert Xu 	init_aead_job(req, edesc, all_contig, encrypt);
12291acebad3SYuan Kang 
12307e0880b9SHoria Geantă 	/*
12317e0880b9SHoria Geantă 	 * {REG3, DPOVRD} = assoclen, depending on whether MATH command supports
12327e0880b9SHoria Geantă 	 * having DPOVRD as destination.
12337e0880b9SHoria Geantă 	 */
12347e0880b9SHoria Geantă 	if (ctrlpriv->era < 3)
12357e0880b9SHoria Geantă 		append_math_add_imm_u32(desc, REG3, ZERO, IMM, req->assoclen);
12367e0880b9SHoria Geantă 	else
12377e0880b9SHoria Geantă 		append_math_add_imm_u32(desc, DPOVRD, ZERO, IMM, req->assoclen);
12387e0880b9SHoria Geantă 
12398b18e235SHoria Geantă 	if (ivsize && ((is_rfc3686 && encrypt) || !alg->caam.geniv))
1240479bcc7cSHerbert Xu 		append_load_as_imm(desc, req->iv, ivsize,
1241479bcc7cSHerbert Xu 				   LDST_CLASS_1_CCB |
1242479bcc7cSHerbert Xu 				   LDST_SRCDST_BYTE_CONTEXT |
1243479bcc7cSHerbert Xu 				   (ivoffset << LDST_OFFSET_SHIFT));
12448e8ec596SKim Phillips }
12458e8ec596SKim Phillips 
12468e8ec596SKim Phillips /*
12475ca7badbSHoria Geantă  * Fill in skcipher job descriptor
1248acdca31dSYuan Kang  */
init_skcipher_job(struct skcipher_request * req,struct skcipher_edesc * edesc,const bool encrypt)12495ca7badbSHoria Geantă static void init_skcipher_job(struct skcipher_request *req,
12505ca7badbSHoria Geantă 			      struct skcipher_edesc *edesc,
12515ca7badbSHoria Geantă 			      const bool encrypt)
1252acdca31dSYuan Kang {
12535ca7badbSHoria Geantă 	struct crypto_skcipher *skcipher = crypto_skcipher_reqtfm(req);
12544cb4f7c1SHerbert Xu 	struct caam_ctx *ctx = crypto_skcipher_ctx_dma(skcipher);
12556e005503SSascha Hauer 	struct device *jrdev = ctx->jrdev;
12565ca7badbSHoria Geantă 	int ivsize = crypto_skcipher_ivsize(skcipher);
1257acdca31dSYuan Kang 	u32 *desc = edesc->hw_desc;
12585ca7badbSHoria Geantă 	u32 *sh_desc;
1259eaed71a4SIuliana Prodan 	u32 in_options = 0, out_options = 0;
1260eaed71a4SIuliana Prodan 	dma_addr_t src_dma, dst_dma, ptr;
1261eaed71a4SIuliana Prodan 	int len, sec4_sg_index = 0;
1262acdca31dSYuan Kang 
12636e005503SSascha Hauer 	print_hex_dump_debug("presciv@"__stringify(__LINE__)": ",
12645ca7badbSHoria Geantă 			     DUMP_PREFIX_ADDRESS, 16, 4, req->iv, ivsize, 1);
12656e005503SSascha Hauer 	dev_dbg(jrdev, "asked=%d, cryptlen%d\n",
12665ca7badbSHoria Geantă 	       (int)edesc->src_nents > 1 ? 100 : req->cryptlen, req->cryptlen);
12676e005503SSascha Hauer 
12688a82451bSSascha Hauer 	caam_dump_sg("src    @" __stringify(__LINE__)": ",
12695ecf8ef9SCatalin Vasile 		     DUMP_PREFIX_ADDRESS, 16, 4, req->src,
12705ca7badbSHoria Geantă 		     edesc->src_nents > 1 ? 100 : req->cryptlen, 1);
12715ca7badbSHoria Geantă 
12725ca7badbSHoria Geantă 	sh_desc = encrypt ? ctx->sh_desc_enc : ctx->sh_desc_dec;
12735ca7badbSHoria Geantă 	ptr = encrypt ? ctx->sh_desc_enc_dma : ctx->sh_desc_dec_dma;
1274acdca31dSYuan Kang 
1275acdca31dSYuan Kang 	len = desc_len(sh_desc);
1276acdca31dSYuan Kang 	init_job_desc_shared(desc, ptr, len, HDR_SHARE_DEFER | HDR_REVERSE);
1277acdca31dSYuan Kang 
1278eaed71a4SIuliana Prodan 	if (ivsize || edesc->mapped_src_nents > 1) {
1279eaed71a4SIuliana Prodan 		src_dma = edesc->sec4_sg_dma;
1280eaed71a4SIuliana Prodan 		sec4_sg_index = edesc->mapped_src_nents + !!ivsize;
1281eaed71a4SIuliana Prodan 		in_options = LDST_SGF;
1282eaed71a4SIuliana Prodan 	} else {
1283eaed71a4SIuliana Prodan 		src_dma = sg_dma_address(req->src);
1284eaed71a4SIuliana Prodan 	}
1285eaed71a4SIuliana Prodan 
1286eaed71a4SIuliana Prodan 	append_seq_in_ptr(desc, src_dma, req->cryptlen + ivsize, in_options);
1287acdca31dSYuan Kang 
1288acdca31dSYuan Kang 	if (likely(req->src == req->dst)) {
1289eaed71a4SIuliana Prodan 		dst_dma = src_dma + !!ivsize * sizeof(struct sec4_sg_entry);
1290eaed71a4SIuliana Prodan 		out_options = in_options;
1291334d37c9SHoria Geantă 	} else if (!ivsize && edesc->mapped_dst_nents == 1) {
1292acdca31dSYuan Kang 		dst_dma = sg_dma_address(req->dst);
1293acdca31dSYuan Kang 	} else {
1294eaed71a4SIuliana Prodan 		dst_dma = edesc->sec4_sg_dma + sec4_sg_index *
1295eaed71a4SIuliana Prodan 			  sizeof(struct sec4_sg_entry);
1296acdca31dSYuan Kang 		out_options = LDST_SGF;
1297acdca31dSYuan Kang 	}
1298eaed71a4SIuliana Prodan 
1299334d37c9SHoria Geantă 	append_seq_out_ptr(desc, dst_dma, req->cryptlen + ivsize, out_options);
1300acdca31dSYuan Kang }
1301acdca31dSYuan Kang 
1302acdca31dSYuan Kang /*
13031acebad3SYuan Kang  * allocate and map the aead extended descriptor
13048e8ec596SKim Phillips  */
aead_edesc_alloc(struct aead_request * req,int desc_bytes,bool * all_contig_ptr,bool encrypt)1305f2147b88SHerbert Xu static struct aead_edesc *aead_edesc_alloc(struct aead_request *req,
1306f2147b88SHerbert Xu 					   int desc_bytes, bool *all_contig_ptr,
1307f2147b88SHerbert Xu 					   bool encrypt)
1308f2147b88SHerbert Xu {
1309f2147b88SHerbert Xu 	struct crypto_aead *aead = crypto_aead_reqtfm(req);
13104cb4f7c1SHerbert Xu 	struct caam_ctx *ctx = crypto_aead_ctx_dma(aead);
1311f2147b88SHerbert Xu 	struct device *jrdev = ctx->jrdev;
13121c240226SIuliana Prodan 	struct caam_aead_req_ctx *rctx = aead_request_ctx(req);
1313019d62dbSHoria Geantă 	gfp_t flags = (req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP) ?
1314019d62dbSHoria Geantă 		       GFP_KERNEL : GFP_ATOMIC;
1315838e0a89SHoria Geantă 	int src_nents, mapped_src_nents, dst_nents = 0, mapped_dst_nents = 0;
1316059d73eeSHoria Geantă 	int src_len, dst_len = 0;
1317f2147b88SHerbert Xu 	struct aead_edesc *edesc;
1318fa0c92dbSHoria Geantă 	int sec4_sg_index, sec4_sg_len, sec4_sg_bytes;
1319f2147b88SHerbert Xu 	unsigned int authsize = ctx->authsize;
1320f2147b88SHerbert Xu 
1321f2147b88SHerbert Xu 	if (unlikely(req->dst != req->src)) {
1322059d73eeSHoria Geantă 		src_len = req->assoclen + req->cryptlen;
1323059d73eeSHoria Geantă 		dst_len = src_len + (encrypt ? authsize : (-authsize));
1324059d73eeSHoria Geantă 
1325059d73eeSHoria Geantă 		src_nents = sg_nents_for_len(req->src, src_len);
1326fd144d83SHoria Geantă 		if (unlikely(src_nents < 0)) {
1327fd144d83SHoria Geantă 			dev_err(jrdev, "Insufficient bytes (%d) in src S/G\n",
1328059d73eeSHoria Geantă 				src_len);
1329fd144d83SHoria Geantă 			return ERR_PTR(src_nents);
1330fd144d83SHoria Geantă 		}
1331fd144d83SHoria Geantă 
1332059d73eeSHoria Geantă 		dst_nents = sg_nents_for_len(req->dst, dst_len);
1333fd144d83SHoria Geantă 		if (unlikely(dst_nents < 0)) {
1334fd144d83SHoria Geantă 			dev_err(jrdev, "Insufficient bytes (%d) in dst S/G\n",
1335059d73eeSHoria Geantă 				dst_len);
1336fd144d83SHoria Geantă 			return ERR_PTR(dst_nents);
1337fd144d83SHoria Geantă 		}
1338f2147b88SHerbert Xu 	} else {
1339059d73eeSHoria Geantă 		src_len = req->assoclen + req->cryptlen +
1340059d73eeSHoria Geantă 			  (encrypt ? authsize : 0);
1341059d73eeSHoria Geantă 
1342059d73eeSHoria Geantă 		src_nents = sg_nents_for_len(req->src, src_len);
1343fd144d83SHoria Geantă 		if (unlikely(src_nents < 0)) {
1344fd144d83SHoria Geantă 			dev_err(jrdev, "Insufficient bytes (%d) in src S/G\n",
1345059d73eeSHoria Geantă 				src_len);
1346fd144d83SHoria Geantă 			return ERR_PTR(src_nents);
1347fd144d83SHoria Geantă 		}
1348f2147b88SHerbert Xu 	}
1349f2147b88SHerbert Xu 
1350838e0a89SHoria Geantă 	if (likely(req->src == req->dst)) {
1351838e0a89SHoria Geantă 		mapped_src_nents = dma_map_sg(jrdev, req->src, src_nents,
1352838e0a89SHoria Geantă 					      DMA_BIDIRECTIONAL);
1353838e0a89SHoria Geantă 		if (unlikely(!mapped_src_nents)) {
1354838e0a89SHoria Geantă 			dev_err(jrdev, "unable to map source\n");
1355838e0a89SHoria Geantă 			return ERR_PTR(-ENOMEM);
1356838e0a89SHoria Geantă 		}
1357838e0a89SHoria Geantă 	} else {
1358838e0a89SHoria Geantă 		/* Cover also the case of null (zero length) input data */
1359838e0a89SHoria Geantă 		if (src_nents) {
1360838e0a89SHoria Geantă 			mapped_src_nents = dma_map_sg(jrdev, req->src,
1361838e0a89SHoria Geantă 						      src_nents, DMA_TO_DEVICE);
1362838e0a89SHoria Geantă 			if (unlikely(!mapped_src_nents)) {
1363838e0a89SHoria Geantă 				dev_err(jrdev, "unable to map source\n");
1364838e0a89SHoria Geantă 				return ERR_PTR(-ENOMEM);
1365838e0a89SHoria Geantă 			}
1366838e0a89SHoria Geantă 		} else {
1367838e0a89SHoria Geantă 			mapped_src_nents = 0;
1368838e0a89SHoria Geantă 		}
1369838e0a89SHoria Geantă 
1370763069baSHoria Geantă 		/* Cover also the case of null (zero length) output data */
1371763069baSHoria Geantă 		if (dst_nents) {
1372763069baSHoria Geantă 			mapped_dst_nents = dma_map_sg(jrdev, req->dst,
1373763069baSHoria Geantă 						      dst_nents,
1374838e0a89SHoria Geantă 						      DMA_FROM_DEVICE);
1375838e0a89SHoria Geantă 			if (unlikely(!mapped_dst_nents)) {
1376838e0a89SHoria Geantă 				dev_err(jrdev, "unable to map destination\n");
1377763069baSHoria Geantă 				dma_unmap_sg(jrdev, req->src, src_nents,
1378763069baSHoria Geantă 					     DMA_TO_DEVICE);
1379838e0a89SHoria Geantă 				return ERR_PTR(-ENOMEM);
1380838e0a89SHoria Geantă 			}
1381763069baSHoria Geantă 		} else {
1382763069baSHoria Geantă 			mapped_dst_nents = 0;
1383763069baSHoria Geantă 		}
1384838e0a89SHoria Geantă 	}
1385838e0a89SHoria Geantă 
1386a5e5c133SHoria Geantă 	/*
1387a5e5c133SHoria Geantă 	 * HW reads 4 S/G entries at a time; make sure the reads don't go beyond
1388a5e5c133SHoria Geantă 	 * the end of the table by allocating more S/G entries.
1389a5e5c133SHoria Geantă 	 */
1390838e0a89SHoria Geantă 	sec4_sg_len = mapped_src_nents > 1 ? mapped_src_nents : 0;
1391a5e5c133SHoria Geantă 	if (mapped_dst_nents > 1)
1392a5e5c133SHoria Geantă 		sec4_sg_len += pad_sg_nents(mapped_dst_nents);
1393a5e5c133SHoria Geantă 	else
1394a5e5c133SHoria Geantă 		sec4_sg_len = pad_sg_nents(sec4_sg_len);
1395a5e5c133SHoria Geantă 
1396f2147b88SHerbert Xu 	sec4_sg_bytes = sec4_sg_len * sizeof(struct sec4_sg_entry);
1397f2147b88SHerbert Xu 
1398f2147b88SHerbert Xu 	/* allocate space for base edesc and hw desc commands, link tables */
1399199354d7SHerbert Xu 	edesc = kzalloc(sizeof(*edesc) + desc_bytes + sec4_sg_bytes, flags);
1400f2147b88SHerbert Xu 	if (!edesc) {
1401838e0a89SHoria Geantă 		caam_unmap(jrdev, req->src, req->dst, src_nents, dst_nents, 0,
1402cf5448b5SHoria Geantă 			   0, 0, 0);
1403f2147b88SHerbert Xu 		return ERR_PTR(-ENOMEM);
1404f2147b88SHerbert Xu 	}
1405f2147b88SHerbert Xu 
1406f2147b88SHerbert Xu 	edesc->src_nents = src_nents;
1407f2147b88SHerbert Xu 	edesc->dst_nents = dst_nents;
1408ba4cf71bSIuliana Prodan 	edesc->mapped_src_nents = mapped_src_nents;
1409ba4cf71bSIuliana Prodan 	edesc->mapped_dst_nents = mapped_dst_nents;
1410f2147b88SHerbert Xu 	edesc->sec4_sg = (void *)edesc + sizeof(struct aead_edesc) +
1411f2147b88SHerbert Xu 			 desc_bytes;
14121c240226SIuliana Prodan 
14131c240226SIuliana Prodan 	rctx->edesc = edesc;
14141c240226SIuliana Prodan 
1415838e0a89SHoria Geantă 	*all_contig_ptr = !(mapped_src_nents > 1);
1416f2147b88SHerbert Xu 
1417f2147b88SHerbert Xu 	sec4_sg_index = 0;
1418838e0a89SHoria Geantă 	if (mapped_src_nents > 1) {
1419059d73eeSHoria Geantă 		sg_to_sec4_sg_last(req->src, src_len,
1420f2147b88SHerbert Xu 				   edesc->sec4_sg + sec4_sg_index, 0);
1421838e0a89SHoria Geantă 		sec4_sg_index += mapped_src_nents;
1422f2147b88SHerbert Xu 	}
1423838e0a89SHoria Geantă 	if (mapped_dst_nents > 1) {
1424059d73eeSHoria Geantă 		sg_to_sec4_sg_last(req->dst, dst_len,
1425f2147b88SHerbert Xu 				   edesc->sec4_sg + sec4_sg_index, 0);
1426f2147b88SHerbert Xu 	}
1427f2147b88SHerbert Xu 
1428f2147b88SHerbert Xu 	if (!sec4_sg_bytes)
1429f2147b88SHerbert Xu 		return edesc;
1430f2147b88SHerbert Xu 
1431f2147b88SHerbert Xu 	edesc->sec4_sg_dma = dma_map_single(jrdev, edesc->sec4_sg,
1432f2147b88SHerbert Xu 					    sec4_sg_bytes, DMA_TO_DEVICE);
1433f2147b88SHerbert Xu 	if (dma_mapping_error(jrdev, edesc->sec4_sg_dma)) {
1434f2147b88SHerbert Xu 		dev_err(jrdev, "unable to map S/G table\n");
1435f2147b88SHerbert Xu 		aead_unmap(jrdev, edesc, req);
1436f2147b88SHerbert Xu 		kfree(edesc);
1437f2147b88SHerbert Xu 		return ERR_PTR(-ENOMEM);
1438f2147b88SHerbert Xu 	}
1439f2147b88SHerbert Xu 
1440f2147b88SHerbert Xu 	edesc->sec4_sg_bytes = sec4_sg_bytes;
1441f2147b88SHerbert Xu 
1442f2147b88SHerbert Xu 	return edesc;
1443f2147b88SHerbert Xu }
1444f2147b88SHerbert Xu 
aead_enqueue_req(struct device * jrdev,struct aead_request * req)14451c240226SIuliana Prodan static int aead_enqueue_req(struct device *jrdev, struct aead_request *req)
14461c240226SIuliana Prodan {
14471c240226SIuliana Prodan 	struct caam_drv_private_jr *jrpriv = dev_get_drvdata(jrdev);
14481c240226SIuliana Prodan 	struct caam_aead_req_ctx *rctx = aead_request_ctx(req);
14491c240226SIuliana Prodan 	struct aead_edesc *edesc = rctx->edesc;
14501c240226SIuliana Prodan 	u32 *desc = edesc->hw_desc;
14511c240226SIuliana Prodan 	int ret;
14521c240226SIuliana Prodan 
14531c240226SIuliana Prodan 	/*
14541c240226SIuliana Prodan 	 * Only the backlog request are sent to crypto-engine since the others
14551c240226SIuliana Prodan 	 * can be handled by CAAM, if free, especially since JR has up to 1024
14561c240226SIuliana Prodan 	 * entries (more than the 10 entries from crypto-engine).
14571c240226SIuliana Prodan 	 */
14581c240226SIuliana Prodan 	if (req->base.flags & CRYPTO_TFM_REQ_MAY_BACKLOG)
14591c240226SIuliana Prodan 		ret = crypto_transfer_aead_request_to_engine(jrpriv->engine,
14601c240226SIuliana Prodan 							     req);
14611c240226SIuliana Prodan 	else
14621c240226SIuliana Prodan 		ret = caam_jr_enqueue(jrdev, desc, aead_crypt_done, req);
14631c240226SIuliana Prodan 
14641c240226SIuliana Prodan 	if ((ret != -EINPROGRESS) && (ret != -EBUSY)) {
14651c240226SIuliana Prodan 		aead_unmap(jrdev, edesc, req);
14661c240226SIuliana Prodan 		kfree(rctx->edesc);
14671c240226SIuliana Prodan 	}
14681c240226SIuliana Prodan 
14691c240226SIuliana Prodan 	return ret;
14701c240226SIuliana Prodan }
14711c240226SIuliana Prodan 
chachapoly_crypt(struct aead_request * req,bool encrypt)1472b7f17fe2SIuliana Prodan static inline int chachapoly_crypt(struct aead_request *req, bool encrypt)
14738e8ec596SKim Phillips {
14740e479300SYuan Kang 	struct aead_edesc *edesc;
14758e8ec596SKim Phillips 	struct crypto_aead *aead = crypto_aead_reqtfm(req);
14764cb4f7c1SHerbert Xu 	struct caam_ctx *ctx = crypto_aead_ctx_dma(aead);
14778e8ec596SKim Phillips 	struct device *jrdev = ctx->jrdev;
14781acebad3SYuan Kang 	bool all_contig;
14798e8ec596SKim Phillips 	u32 *desc;
14801acebad3SYuan Kang 
1481b7f17fe2SIuliana Prodan 	edesc = aead_edesc_alloc(req, CHACHAPOLY_DESC_JOB_IO_LEN, &all_contig,
1482b7f17fe2SIuliana Prodan 				 encrypt);
14838e8ec596SKim Phillips 	if (IS_ERR(edesc))
14848e8ec596SKim Phillips 		return PTR_ERR(edesc);
14858e8ec596SKim Phillips 
14868e8ec596SKim Phillips 	desc = edesc->hw_desc;
1487b7f17fe2SIuliana Prodan 
1488b7f17fe2SIuliana Prodan 	init_chachapoly_job(req, edesc, all_contig, encrypt);
1489b7f17fe2SIuliana Prodan 	print_hex_dump_debug("chachapoly jobdesc@" __stringify(__LINE__)": ",
1490b7f17fe2SIuliana Prodan 			     DUMP_PREFIX_ADDRESS, 16, 4, desc, desc_bytes(desc),
1491b7f17fe2SIuliana Prodan 			     1);
1492b7f17fe2SIuliana Prodan 
14931c240226SIuliana Prodan 	return aead_enqueue_req(jrdev, req);
14948e8ec596SKim Phillips }
14958e8ec596SKim Phillips 
chachapoly_encrypt(struct aead_request * req)1496d6bbd4eeSHoria Geantă static int chachapoly_encrypt(struct aead_request *req)
1497d6bbd4eeSHoria Geantă {
1498b7f17fe2SIuliana Prodan 	return chachapoly_crypt(req, true);
1499d6bbd4eeSHoria Geantă }
1500d6bbd4eeSHoria Geantă 
chachapoly_decrypt(struct aead_request * req)1501d6bbd4eeSHoria Geantă static int chachapoly_decrypt(struct aead_request *req)
1502d6bbd4eeSHoria Geantă {
1503b7f17fe2SIuliana Prodan 	return chachapoly_crypt(req, false);
1504b7f17fe2SIuliana Prodan }
1505b7f17fe2SIuliana Prodan 
aead_crypt(struct aead_request * req,bool encrypt)1506b7f17fe2SIuliana Prodan static inline int aead_crypt(struct aead_request *req, bool encrypt)
1507b7f17fe2SIuliana Prodan {
1508d6bbd4eeSHoria Geantă 	struct aead_edesc *edesc;
1509d6bbd4eeSHoria Geantă 	struct crypto_aead *aead = crypto_aead_reqtfm(req);
15104cb4f7c1SHerbert Xu 	struct caam_ctx *ctx = crypto_aead_ctx_dma(aead);
1511d6bbd4eeSHoria Geantă 	struct device *jrdev = ctx->jrdev;
1512d6bbd4eeSHoria Geantă 	bool all_contig;
1513d6bbd4eeSHoria Geantă 
1514b7f17fe2SIuliana Prodan 	/* allocate extended descriptor */
1515b7f17fe2SIuliana Prodan 	edesc = aead_edesc_alloc(req, AUTHENC_DESC_JOB_IO_LEN,
1516b7f17fe2SIuliana Prodan 				 &all_contig, encrypt);
1517d6bbd4eeSHoria Geantă 	if (IS_ERR(edesc))
1518d6bbd4eeSHoria Geantă 		return PTR_ERR(edesc);
1519d6bbd4eeSHoria Geantă 
1520b7f17fe2SIuliana Prodan 	/* Create and submit job descriptor */
1521b7f17fe2SIuliana Prodan 	init_authenc_job(req, edesc, all_contig, encrypt);
1522b7f17fe2SIuliana Prodan 
1523b7f17fe2SIuliana Prodan 	print_hex_dump_debug("aead jobdesc@"__stringify(__LINE__)": ",
1524b7f17fe2SIuliana Prodan 			     DUMP_PREFIX_ADDRESS, 16, 4, edesc->hw_desc,
1525b7f17fe2SIuliana Prodan 			     desc_bytes(edesc->hw_desc), 1);
1526b7f17fe2SIuliana Prodan 
15271c240226SIuliana Prodan 	return aead_enqueue_req(jrdev, req);
1528d6bbd4eeSHoria Geantă }
1529d6bbd4eeSHoria Geantă 
aead_encrypt(struct aead_request * req)1530b7f17fe2SIuliana Prodan static int aead_encrypt(struct aead_request *req)
1531b7f17fe2SIuliana Prodan {
1532b7f17fe2SIuliana Prodan 	return aead_crypt(req, true);
1533b7f17fe2SIuliana Prodan }
1534b7f17fe2SIuliana Prodan 
aead_decrypt(struct aead_request * req)1535b7f17fe2SIuliana Prodan static int aead_decrypt(struct aead_request *req)
1536b7f17fe2SIuliana Prodan {
1537b7f17fe2SIuliana Prodan 	return aead_crypt(req, false);
1538b7f17fe2SIuliana Prodan }
1539b7f17fe2SIuliana Prodan 
aead_do_one_req(struct crypto_engine * engine,void * areq)15401c240226SIuliana Prodan static int aead_do_one_req(struct crypto_engine *engine, void *areq)
15411c240226SIuliana Prodan {
15421c240226SIuliana Prodan 	struct aead_request *req = aead_request_cast(areq);
15434cb4f7c1SHerbert Xu 	struct caam_ctx *ctx = crypto_aead_ctx_dma(crypto_aead_reqtfm(req));
15441c240226SIuliana Prodan 	struct caam_aead_req_ctx *rctx = aead_request_ctx(req);
15451c240226SIuliana Prodan 	u32 *desc = rctx->edesc->hw_desc;
15461c240226SIuliana Prodan 	int ret;
15471c240226SIuliana Prodan 
15481c240226SIuliana Prodan 	rctx->edesc->bklog = true;
15491c240226SIuliana Prodan 
15501c240226SIuliana Prodan 	ret = caam_jr_enqueue(ctx->jrdev, desc, aead_crypt_done, req);
15511c240226SIuliana Prodan 
1552087e1d71SGaurav Jain 	if (ret == -ENOSPC && engine->retry_support)
1553087e1d71SGaurav Jain 		return ret;
1554087e1d71SGaurav Jain 
15551c240226SIuliana Prodan 	if (ret != -EINPROGRESS) {
15561c240226SIuliana Prodan 		aead_unmap(ctx->jrdev, rctx->edesc, req);
15571c240226SIuliana Prodan 		kfree(rctx->edesc);
15581c240226SIuliana Prodan 	} else {
15591c240226SIuliana Prodan 		ret = 0;
15601c240226SIuliana Prodan 	}
15611c240226SIuliana Prodan 
15621c240226SIuliana Prodan 	return ret;
15631c240226SIuliana Prodan }
15641c240226SIuliana Prodan 
gcm_crypt(struct aead_request * req,bool encrypt)1565b7f17fe2SIuliana Prodan static inline int gcm_crypt(struct aead_request *req, bool encrypt)
1566b7f17fe2SIuliana Prodan {
1567b7f17fe2SIuliana Prodan 	struct aead_edesc *edesc;
1568b7f17fe2SIuliana Prodan 	struct crypto_aead *aead = crypto_aead_reqtfm(req);
15694cb4f7c1SHerbert Xu 	struct caam_ctx *ctx = crypto_aead_ctx_dma(aead);
1570b7f17fe2SIuliana Prodan 	struct device *jrdev = ctx->jrdev;
1571b7f17fe2SIuliana Prodan 	bool all_contig;
1572b7f17fe2SIuliana Prodan 
1573b7f17fe2SIuliana Prodan 	/* allocate extended descriptor */
1574b7f17fe2SIuliana Prodan 	edesc = aead_edesc_alloc(req, GCM_DESC_JOB_IO_LEN, &all_contig,
1575b7f17fe2SIuliana Prodan 				 encrypt);
1576b7f17fe2SIuliana Prodan 	if (IS_ERR(edesc))
1577b7f17fe2SIuliana Prodan 		return PTR_ERR(edesc);
1578b7f17fe2SIuliana Prodan 
1579b7f17fe2SIuliana Prodan 	/* Create and submit job descriptor */
1580b7f17fe2SIuliana Prodan 	init_gcm_job(req, edesc, all_contig, encrypt);
1581b7f17fe2SIuliana Prodan 
1582b7f17fe2SIuliana Prodan 	print_hex_dump_debug("aead jobdesc@"__stringify(__LINE__)": ",
1583b7f17fe2SIuliana Prodan 			     DUMP_PREFIX_ADDRESS, 16, 4, edesc->hw_desc,
1584b7f17fe2SIuliana Prodan 			     desc_bytes(edesc->hw_desc), 1);
1585b7f17fe2SIuliana Prodan 
15861c240226SIuliana Prodan 	return aead_enqueue_req(jrdev, req);
1587b7f17fe2SIuliana Prodan }
1588b7f17fe2SIuliana Prodan 
gcm_encrypt(struct aead_request * req)1589b7f17fe2SIuliana Prodan static int gcm_encrypt(struct aead_request *req)
1590b7f17fe2SIuliana Prodan {
1591b7f17fe2SIuliana Prodan 	return gcm_crypt(req, true);
1592b7f17fe2SIuliana Prodan }
1593b7f17fe2SIuliana Prodan 
gcm_decrypt(struct aead_request * req)1594b7f17fe2SIuliana Prodan static int gcm_decrypt(struct aead_request *req)
1595b7f17fe2SIuliana Prodan {
1596b7f17fe2SIuliana Prodan 	return gcm_crypt(req, false);
1597b7f17fe2SIuliana Prodan }
1598b7f17fe2SIuliana Prodan 
ipsec_gcm_encrypt(struct aead_request * req)159946218750SHerbert Xu static int ipsec_gcm_encrypt(struct aead_request *req)
160046218750SHerbert Xu {
1601fcd23ed5SIuliana Prodan 	return crypto_ipsec_check_assoclen(req->assoclen) ? : gcm_encrypt(req);
160246218750SHerbert Xu }
160346218750SHerbert Xu 
ipsec_gcm_decrypt(struct aead_request * req)160446218750SHerbert Xu static int ipsec_gcm_decrypt(struct aead_request *req)
160546218750SHerbert Xu {
1606fcd23ed5SIuliana Prodan 	return crypto_ipsec_check_assoclen(req->assoclen) ? : gcm_decrypt(req);
160746218750SHerbert Xu }
160846218750SHerbert Xu 
1609acdca31dSYuan Kang /*
16105ca7badbSHoria Geantă  * allocate and map the skcipher extended descriptor for skcipher
1611acdca31dSYuan Kang  */
skcipher_edesc_alloc(struct skcipher_request * req,int desc_bytes)16125ca7badbSHoria Geantă static struct skcipher_edesc *skcipher_edesc_alloc(struct skcipher_request *req,
16135ca7badbSHoria Geantă 						   int desc_bytes)
1614acdca31dSYuan Kang {
16155ca7badbSHoria Geantă 	struct crypto_skcipher *skcipher = crypto_skcipher_reqtfm(req);
16164cb4f7c1SHerbert Xu 	struct caam_ctx *ctx = crypto_skcipher_ctx_dma(skcipher);
1617ee38767fSIuliana Prodan 	struct caam_skcipher_req_ctx *rctx = skcipher_request_ctx(req);
1618acdca31dSYuan Kang 	struct device *jrdev = ctx->jrdev;
161942cfcafbSHoria Geantă 	gfp_t flags = (req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP) ?
1620acdca31dSYuan Kang 		       GFP_KERNEL : GFP_ATOMIC;
1621838e0a89SHoria Geantă 	int src_nents, mapped_src_nents, dst_nents = 0, mapped_dst_nents = 0;
16225ca7badbSHoria Geantă 	struct skcipher_edesc *edesc;
1623eaed71a4SIuliana Prodan 	dma_addr_t iv_dma = 0;
1624115957bbSHoria Geantă 	u8 *iv;
16255ca7badbSHoria Geantă 	int ivsize = crypto_skcipher_ivsize(skcipher);
1626838e0a89SHoria Geantă 	int dst_sg_idx, sec4_sg_ents, sec4_sg_bytes;
1627199354d7SHerbert Xu 	unsigned int aligned_size;
1628acdca31dSYuan Kang 
16295ca7badbSHoria Geantă 	src_nents = sg_nents_for_len(req->src, req->cryptlen);
1630fd144d83SHoria Geantă 	if (unlikely(src_nents < 0)) {
1631fd144d83SHoria Geantă 		dev_err(jrdev, "Insufficient bytes (%d) in src S/G\n",
16325ca7badbSHoria Geantă 			req->cryptlen);
1633fd144d83SHoria Geantă 		return ERR_PTR(src_nents);
1634fd144d83SHoria Geantă 	}
1635acdca31dSYuan Kang 
1636fd144d83SHoria Geantă 	if (req->dst != req->src) {
16375ca7badbSHoria Geantă 		dst_nents = sg_nents_for_len(req->dst, req->cryptlen);
1638fd144d83SHoria Geantă 		if (unlikely(dst_nents < 0)) {
1639fd144d83SHoria Geantă 			dev_err(jrdev, "Insufficient bytes (%d) in dst S/G\n",
16405ca7badbSHoria Geantă 				req->cryptlen);
1641fd144d83SHoria Geantă 			return ERR_PTR(dst_nents);
1642fd144d83SHoria Geantă 		}
1643fd144d83SHoria Geantă 	}
1644acdca31dSYuan Kang 
1645acdca31dSYuan Kang 	if (likely(req->src == req->dst)) {
1646838e0a89SHoria Geantă 		mapped_src_nents = dma_map_sg(jrdev, req->src, src_nents,
1647838e0a89SHoria Geantă 					      DMA_BIDIRECTIONAL);
1648838e0a89SHoria Geantă 		if (unlikely(!mapped_src_nents)) {
1649c73e36e8SHoria Geantă 			dev_err(jrdev, "unable to map source\n");
1650c73e36e8SHoria Geantă 			return ERR_PTR(-ENOMEM);
1651c73e36e8SHoria Geantă 		}
1652acdca31dSYuan Kang 	} else {
1653838e0a89SHoria Geantă 		mapped_src_nents = dma_map_sg(jrdev, req->src, src_nents,
1654838e0a89SHoria Geantă 					      DMA_TO_DEVICE);
1655838e0a89SHoria Geantă 		if (unlikely(!mapped_src_nents)) {
1656c73e36e8SHoria Geantă 			dev_err(jrdev, "unable to map source\n");
1657c73e36e8SHoria Geantă 			return ERR_PTR(-ENOMEM);
1658c73e36e8SHoria Geantă 		}
1659838e0a89SHoria Geantă 		mapped_dst_nents = dma_map_sg(jrdev, req->dst, dst_nents,
1660838e0a89SHoria Geantă 					      DMA_FROM_DEVICE);
1661838e0a89SHoria Geantă 		if (unlikely(!mapped_dst_nents)) {
1662c73e36e8SHoria Geantă 			dev_err(jrdev, "unable to map destination\n");
1663fa0c92dbSHoria Geantă 			dma_unmap_sg(jrdev, req->src, src_nents, DMA_TO_DEVICE);
1664c73e36e8SHoria Geantă 			return ERR_PTR(-ENOMEM);
1665c73e36e8SHoria Geantă 		}
1666acdca31dSYuan Kang 	}
1667acdca31dSYuan Kang 
1668eaed71a4SIuliana Prodan 	if (!ivsize && mapped_src_nents == 1)
1669eaed71a4SIuliana Prodan 		sec4_sg_ents = 0; // no need for an input hw s/g table
1670eaed71a4SIuliana Prodan 	else
1671eaed71a4SIuliana Prodan 		sec4_sg_ents = mapped_src_nents + !!ivsize;
1672fa0c92dbSHoria Geantă 	dst_sg_idx = sec4_sg_ents;
1673a5e5c133SHoria Geantă 
1674a5e5c133SHoria Geantă 	/*
1675334d37c9SHoria Geantă 	 * Input, output HW S/G tables: [IV, src][dst, IV]
1676334d37c9SHoria Geantă 	 * IV entries point to the same buffer
1677334d37c9SHoria Geantă 	 * If src == dst, S/G entries are reused (S/G tables overlap)
1678334d37c9SHoria Geantă 	 *
1679a5e5c133SHoria Geantă 	 * HW reads 4 S/G entries at a time; make sure the reads don't go beyond
1680a5e5c133SHoria Geantă 	 * the end of the table by allocating more S/G entries. Logic:
1681334d37c9SHoria Geantă 	 * if (output S/G)
1682a5e5c133SHoria Geantă 	 *      pad output S/G, if needed
1683a5e5c133SHoria Geantă 	 * else if (input S/G) ...
1684a5e5c133SHoria Geantă 	 *      pad input S/G, if needed
1685a5e5c133SHoria Geantă 	 */
1686334d37c9SHoria Geantă 	if (ivsize || mapped_dst_nents > 1) {
1687334d37c9SHoria Geantă 		if (req->src == req->dst)
1688334d37c9SHoria Geantă 			sec4_sg_ents = !!ivsize + pad_sg_nents(sec4_sg_ents);
1689a5e5c133SHoria Geantă 		else
1690334d37c9SHoria Geantă 			sec4_sg_ents += pad_sg_nents(mapped_dst_nents +
1691334d37c9SHoria Geantă 						     !!ivsize);
1692334d37c9SHoria Geantă 	} else {
1693a5e5c133SHoria Geantă 		sec4_sg_ents = pad_sg_nents(sec4_sg_ents);
1694334d37c9SHoria Geantă 	}
1695a5e5c133SHoria Geantă 
1696fa0c92dbSHoria Geantă 	sec4_sg_bytes = sec4_sg_ents * sizeof(struct sec4_sg_entry);
1697acdca31dSYuan Kang 
1698115957bbSHoria Geantă 	/*
1699115957bbSHoria Geantă 	 * allocate space for base edesc and hw desc commands, link tables, IV
1700115957bbSHoria Geantă 	 */
1701660ca947SHerbert Xu 	aligned_size = sizeof(*edesc) + desc_bytes + sec4_sg_bytes;
1702199354d7SHerbert Xu 	aligned_size = ALIGN(aligned_size, dma_get_cache_alignment());
1703660ca947SHerbert Xu 	aligned_size += ~(ARCH_KMALLOC_MINALIGN - 1) &
1704660ca947SHerbert Xu 			(dma_get_cache_alignment() - 1);
1705660ca947SHerbert Xu 	aligned_size += ALIGN(ivsize, dma_get_cache_alignment());
1706660ca947SHerbert Xu 	edesc = kzalloc(aligned_size, flags);
1707660ca947SHerbert Xu 	if (!edesc) {
1708acdca31dSYuan Kang 		dev_err(jrdev, "could not allocate extended descriptor\n");
1709115957bbSHoria Geantă 		caam_unmap(jrdev, req->src, req->dst, src_nents, dst_nents, 0,
1710cf5448b5SHoria Geantă 			   0, 0, 0);
1711acdca31dSYuan Kang 		return ERR_PTR(-ENOMEM);
1712acdca31dSYuan Kang 	}
1713acdca31dSYuan Kang 
1714acdca31dSYuan Kang 	edesc->src_nents = src_nents;
1715acdca31dSYuan Kang 	edesc->dst_nents = dst_nents;
1716ba4cf71bSIuliana Prodan 	edesc->mapped_src_nents = mapped_src_nents;
1717ba4cf71bSIuliana Prodan 	edesc->mapped_dst_nents = mapped_dst_nents;
1718a299c837SYuan Kang 	edesc->sec4_sg_bytes = sec4_sg_bytes;
171913cc6f48SHoria Geantă 	edesc->sec4_sg = (struct sec4_sg_entry *)((u8 *)edesc->hw_desc +
172013cc6f48SHoria Geantă 						  desc_bytes);
1721ee38767fSIuliana Prodan 	rctx->edesc = edesc;
1722acdca31dSYuan Kang 
1723115957bbSHoria Geantă 	/* Make sure IV is located in a DMAable area */
1724eaed71a4SIuliana Prodan 	if (ivsize) {
1725660ca947SHerbert Xu 		iv = skcipher_edesc_iv(edesc);
17265ca7badbSHoria Geantă 		memcpy(iv, req->iv, ivsize);
1727115957bbSHoria Geantă 
1728334d37c9SHoria Geantă 		iv_dma = dma_map_single(jrdev, iv, ivsize, DMA_BIDIRECTIONAL);
1729115957bbSHoria Geantă 		if (dma_mapping_error(jrdev, iv_dma)) {
1730115957bbSHoria Geantă 			dev_err(jrdev, "unable to map IV\n");
1731eaed71a4SIuliana Prodan 			caam_unmap(jrdev, req->src, req->dst, src_nents,
1732eaed71a4SIuliana Prodan 				   dst_nents, 0, 0, 0, 0);
1733115957bbSHoria Geantă 			kfree(edesc);
1734115957bbSHoria Geantă 			return ERR_PTR(-ENOMEM);
1735acdca31dSYuan Kang 		}
1736acdca31dSYuan Kang 
1737115957bbSHoria Geantă 		dma_to_sec4_sg_one(edesc->sec4_sg, iv_dma, ivsize, 0);
1738eaed71a4SIuliana Prodan 	}
1739eaed71a4SIuliana Prodan 	if (dst_sg_idx)
1740334d37c9SHoria Geantă 		sg_to_sec4_sg(req->src, req->cryptlen, edesc->sec4_sg +
1741eaed71a4SIuliana Prodan 			      !!ivsize, 0);
1742115957bbSHoria Geantă 
1743334d37c9SHoria Geantă 	if (req->src != req->dst && (ivsize || mapped_dst_nents > 1))
1744334d37c9SHoria Geantă 		sg_to_sec4_sg(req->dst, req->cryptlen, edesc->sec4_sg +
1745334d37c9SHoria Geantă 			      dst_sg_idx, 0);
1746334d37c9SHoria Geantă 
1747334d37c9SHoria Geantă 	if (ivsize)
1748334d37c9SHoria Geantă 		dma_to_sec4_sg_one(edesc->sec4_sg + dst_sg_idx +
1749334d37c9SHoria Geantă 				   mapped_dst_nents, iv_dma, ivsize, 0);
1750334d37c9SHoria Geantă 
1751334d37c9SHoria Geantă 	if (ivsize || mapped_dst_nents > 1)
1752334d37c9SHoria Geantă 		sg_to_sec4_set_last(edesc->sec4_sg + dst_sg_idx +
175355b3209aSIuliana Prodan 				    mapped_dst_nents - 1 + !!ivsize);
1754acdca31dSYuan Kang 
1755eaed71a4SIuliana Prodan 	if (sec4_sg_bytes) {
1756a299c837SYuan Kang 		edesc->sec4_sg_dma = dma_map_single(jrdev, edesc->sec4_sg,
1757eaed71a4SIuliana Prodan 						    sec4_sg_bytes,
1758eaed71a4SIuliana Prodan 						    DMA_TO_DEVICE);
1759ce572085SHoria Geanta 		if (dma_mapping_error(jrdev, edesc->sec4_sg_dma)) {
1760ce572085SHoria Geanta 			dev_err(jrdev, "unable to map S/G table\n");
1761eaed71a4SIuliana Prodan 			caam_unmap(jrdev, req->src, req->dst, src_nents,
1762eaed71a4SIuliana Prodan 				   dst_nents, iv_dma, ivsize, 0, 0);
1763c73e36e8SHoria Geantă 			kfree(edesc);
1764ce572085SHoria Geanta 			return ERR_PTR(-ENOMEM);
1765ce572085SHoria Geanta 		}
1766eaed71a4SIuliana Prodan 	}
1767ce572085SHoria Geanta 
1768acdca31dSYuan Kang 	edesc->iv_dma = iv_dma;
1769acdca31dSYuan Kang 
17706e005503SSascha Hauer 	print_hex_dump_debug("skcipher sec4_sg@" __stringify(__LINE__)": ",
1771a299c837SYuan Kang 			     DUMP_PREFIX_ADDRESS, 16, 4, edesc->sec4_sg,
1772a299c837SYuan Kang 			     sec4_sg_bytes, 1);
1773acdca31dSYuan Kang 
1774acdca31dSYuan Kang 	return edesc;
1775acdca31dSYuan Kang }
1776acdca31dSYuan Kang 
skcipher_do_one_req(struct crypto_engine * engine,void * areq)1777ee38767fSIuliana Prodan static int skcipher_do_one_req(struct crypto_engine *engine, void *areq)
1778ee38767fSIuliana Prodan {
1779ee38767fSIuliana Prodan 	struct skcipher_request *req = skcipher_request_cast(areq);
17804cb4f7c1SHerbert Xu 	struct caam_ctx *ctx = crypto_skcipher_ctx_dma(crypto_skcipher_reqtfm(req));
1781ee38767fSIuliana Prodan 	struct caam_skcipher_req_ctx *rctx = skcipher_request_ctx(req);
1782ee38767fSIuliana Prodan 	u32 *desc = rctx->edesc->hw_desc;
1783ee38767fSIuliana Prodan 	int ret;
1784ee38767fSIuliana Prodan 
1785ee38767fSIuliana Prodan 	rctx->edesc->bklog = true;
1786ee38767fSIuliana Prodan 
1787ee38767fSIuliana Prodan 	ret = caam_jr_enqueue(ctx->jrdev, desc, skcipher_crypt_done, req);
1788ee38767fSIuliana Prodan 
1789087e1d71SGaurav Jain 	if (ret == -ENOSPC && engine->retry_support)
1790087e1d71SGaurav Jain 		return ret;
1791087e1d71SGaurav Jain 
1792ee38767fSIuliana Prodan 	if (ret != -EINPROGRESS) {
1793ee38767fSIuliana Prodan 		skcipher_unmap(ctx->jrdev, rctx->edesc, req);
1794ee38767fSIuliana Prodan 		kfree(rctx->edesc);
1795ee38767fSIuliana Prodan 	} else {
1796ee38767fSIuliana Prodan 		ret = 0;
1797ee38767fSIuliana Prodan 	}
1798ee38767fSIuliana Prodan 
1799ee38767fSIuliana Prodan 	return ret;
1800ee38767fSIuliana Prodan }
1801ee38767fSIuliana Prodan 
xts_skcipher_ivsize(struct skcipher_request * req)18029d9b14dbSAndrei Botila static inline bool xts_skcipher_ivsize(struct skcipher_request *req)
18039d9b14dbSAndrei Botila {
18049d9b14dbSAndrei Botila 	struct crypto_skcipher *skcipher = crypto_skcipher_reqtfm(req);
18059d9b14dbSAndrei Botila 	unsigned int ivsize = crypto_skcipher_ivsize(skcipher);
18069d9b14dbSAndrei Botila 
18079d9b14dbSAndrei Botila 	return !!get_unaligned((u64 *)(req->iv + (ivsize / 2)));
18089d9b14dbSAndrei Botila }
18099d9b14dbSAndrei Botila 
skcipher_crypt(struct skcipher_request * req,bool encrypt)1810b7f17fe2SIuliana Prodan static inline int skcipher_crypt(struct skcipher_request *req, bool encrypt)
1811acdca31dSYuan Kang {
18125ca7badbSHoria Geantă 	struct skcipher_edesc *edesc;
18135ca7badbSHoria Geantă 	struct crypto_skcipher *skcipher = crypto_skcipher_reqtfm(req);
18144cb4f7c1SHerbert Xu 	struct caam_ctx *ctx = crypto_skcipher_ctx_dma(skcipher);
1815acdca31dSYuan Kang 	struct device *jrdev = ctx->jrdev;
1816ee38767fSIuliana Prodan 	struct caam_drv_private_jr *jrpriv = dev_get_drvdata(jrdev);
181778eebbfaSAndrei Botila 	struct caam_drv_private *ctrlpriv = dev_get_drvdata(jrdev->parent);
1818acdca31dSYuan Kang 	u32 *desc;
1819acdca31dSYuan Kang 	int ret = 0;
1820acdca31dSYuan Kang 
1821297b931cSAndrei Botila 	/*
1822297b931cSAndrei Botila 	 * XTS is expected to return an error even for input length = 0
1823297b931cSAndrei Botila 	 * Note that the case input length < block size will be caught during
1824297b931cSAndrei Botila 	 * HW offloading and return an error.
1825297b931cSAndrei Botila 	 */
1826297b931cSAndrei Botila 	if (!req->cryptlen && !ctx->fallback)
182731bb2f0dSIuliana Prodan 		return 0;
182831bb2f0dSIuliana Prodan 
182978eebbfaSAndrei Botila 	if (ctx->fallback && ((ctrlpriv->era <= 8 && xts_skcipher_ivsize(req)) ||
1830c91f7348SAndrei Botila 			      ctx->xts_key_fallback)) {
18319d9b14dbSAndrei Botila 		struct caam_skcipher_req_ctx *rctx = skcipher_request_ctx(req);
18329d9b14dbSAndrei Botila 
18339d9b14dbSAndrei Botila 		skcipher_request_set_tfm(&rctx->fallback_req, ctx->fallback);
18349d9b14dbSAndrei Botila 		skcipher_request_set_callback(&rctx->fallback_req,
18359d9b14dbSAndrei Botila 					      req->base.flags,
18369d9b14dbSAndrei Botila 					      req->base.complete,
18379d9b14dbSAndrei Botila 					      req->base.data);
18389d9b14dbSAndrei Botila 		skcipher_request_set_crypt(&rctx->fallback_req, req->src,
18399d9b14dbSAndrei Botila 					   req->dst, req->cryptlen, req->iv);
18409d9b14dbSAndrei Botila 
18419d9b14dbSAndrei Botila 		return encrypt ? crypto_skcipher_encrypt(&rctx->fallback_req) :
18429d9b14dbSAndrei Botila 				 crypto_skcipher_decrypt(&rctx->fallback_req);
18439d9b14dbSAndrei Botila 	}
18449d9b14dbSAndrei Botila 
1845acdca31dSYuan Kang 	/* allocate extended descriptor */
18465ca7badbSHoria Geantă 	edesc = skcipher_edesc_alloc(req, DESC_JOB_IO_LEN * CAAM_CMD_SZ);
1847acdca31dSYuan Kang 	if (IS_ERR(edesc))
1848acdca31dSYuan Kang 		return PTR_ERR(edesc);
1849acdca31dSYuan Kang 
1850acdca31dSYuan Kang 	/* Create and submit job descriptor*/
1851b7f17fe2SIuliana Prodan 	init_skcipher_job(req, edesc, encrypt);
18526e005503SSascha Hauer 
18536e005503SSascha Hauer 	print_hex_dump_debug("skcipher jobdesc@" __stringify(__LINE__)": ",
1854acdca31dSYuan Kang 			     DUMP_PREFIX_ADDRESS, 16, 4, edesc->hw_desc,
1855acdca31dSYuan Kang 			     desc_bytes(edesc->hw_desc), 1);
18566e005503SSascha Hauer 
1857acdca31dSYuan Kang 	desc = edesc->hw_desc;
1858ee38767fSIuliana Prodan 	/*
1859ee38767fSIuliana Prodan 	 * Only the backlog request are sent to crypto-engine since the others
1860ee38767fSIuliana Prodan 	 * can be handled by CAAM, if free, especially since JR has up to 1024
1861ee38767fSIuliana Prodan 	 * entries (more than the 10 entries from crypto-engine).
1862ee38767fSIuliana Prodan 	 */
1863ee38767fSIuliana Prodan 	if (req->base.flags & CRYPTO_TFM_REQ_MAY_BACKLOG)
1864ee38767fSIuliana Prodan 		ret = crypto_transfer_skcipher_request_to_engine(jrpriv->engine,
1865ee38767fSIuliana Prodan 								 req);
1866ee38767fSIuliana Prodan 	else
1867b7f17fe2SIuliana Prodan 		ret = caam_jr_enqueue(jrdev, desc, skcipher_crypt_done, req);
1868acdca31dSYuan Kang 
1869ee38767fSIuliana Prodan 	if ((ret != -EINPROGRESS) && (ret != -EBUSY)) {
18705ca7badbSHoria Geantă 		skcipher_unmap(jrdev, edesc, req);
1871acdca31dSYuan Kang 		kfree(edesc);
1872acdca31dSYuan Kang 	}
1873acdca31dSYuan Kang 
1874acdca31dSYuan Kang 	return ret;
1875acdca31dSYuan Kang }
1876acdca31dSYuan Kang 
skcipher_encrypt(struct skcipher_request * req)1877b7f17fe2SIuliana Prodan static int skcipher_encrypt(struct skcipher_request *req)
1878b7f17fe2SIuliana Prodan {
1879b7f17fe2SIuliana Prodan 	return skcipher_crypt(req, true);
1880b7f17fe2SIuliana Prodan }
1881b7f17fe2SIuliana Prodan 
skcipher_decrypt(struct skcipher_request * req)18825ca7badbSHoria Geantă static int skcipher_decrypt(struct skcipher_request *req)
1883acdca31dSYuan Kang {
1884b7f17fe2SIuliana Prodan 	return skcipher_crypt(req, false);
1885acdca31dSYuan Kang }
1886acdca31dSYuan Kang 
18875ca7badbSHoria Geantă static struct caam_skcipher_alg driver_algs[] = {
1888acdca31dSYuan Kang 	{
1889623814c0SHerbert Xu 		.skcipher.base = {
18905ca7badbSHoria Geantă 			.base = {
18915ca7badbSHoria Geantă 				.cra_name = "cbc(aes)",
18925ca7badbSHoria Geantă 				.cra_driver_name = "cbc-aes-caam",
18935ca7badbSHoria Geantă 				.cra_blocksize = AES_BLOCK_SIZE,
18945ca7badbSHoria Geantă 			},
1895836d8f43SIuliana Prodan 			.setkey = aes_skcipher_setkey,
18965ca7badbSHoria Geantă 			.encrypt = skcipher_encrypt,
18975ca7badbSHoria Geantă 			.decrypt = skcipher_decrypt,
1898acdca31dSYuan Kang 			.min_keysize = AES_MIN_KEY_SIZE,
1899acdca31dSYuan Kang 			.max_keysize = AES_MAX_KEY_SIZE,
1900acdca31dSYuan Kang 			.ivsize = AES_BLOCK_SIZE,
1901acdca31dSYuan Kang 		},
1902623814c0SHerbert Xu 		.skcipher.op = {
1903623814c0SHerbert Xu 			.do_one_request = skcipher_do_one_req,
1904623814c0SHerbert Xu 		},
19055ca7badbSHoria Geantă 		.caam.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC,
1906acdca31dSYuan Kang 	},
1907acdca31dSYuan Kang 	{
1908623814c0SHerbert Xu 		.skcipher.base = {
19095ca7badbSHoria Geantă 			.base = {
19105ca7badbSHoria Geantă 				.cra_name = "cbc(des3_ede)",
19115ca7badbSHoria Geantă 				.cra_driver_name = "cbc-3des-caam",
19125ca7badbSHoria Geantă 				.cra_blocksize = DES3_EDE_BLOCK_SIZE,
19135ca7badbSHoria Geantă 			},
1914a628c5a1SArd Biesheuvel 			.setkey = des3_skcipher_setkey,
19155ca7badbSHoria Geantă 			.encrypt = skcipher_encrypt,
19165ca7badbSHoria Geantă 			.decrypt = skcipher_decrypt,
1917acdca31dSYuan Kang 			.min_keysize = DES3_EDE_KEY_SIZE,
1918acdca31dSYuan Kang 			.max_keysize = DES3_EDE_KEY_SIZE,
1919acdca31dSYuan Kang 			.ivsize = DES3_EDE_BLOCK_SIZE,
1920acdca31dSYuan Kang 		},
1921623814c0SHerbert Xu 		.skcipher.op = {
1922623814c0SHerbert Xu 			.do_one_request = skcipher_do_one_req,
1923623814c0SHerbert Xu 		},
19245ca7badbSHoria Geantă 		.caam.class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC,
1925acdca31dSYuan Kang 	},
1926acdca31dSYuan Kang 	{
1927623814c0SHerbert Xu 		.skcipher.base = {
19285ca7badbSHoria Geantă 			.base = {
19295ca7badbSHoria Geantă 				.cra_name = "cbc(des)",
19305ca7badbSHoria Geantă 				.cra_driver_name = "cbc-des-caam",
19315ca7badbSHoria Geantă 				.cra_blocksize = DES_BLOCK_SIZE,
19325ca7badbSHoria Geantă 			},
1933cf64e495SIuliana Prodan 			.setkey = des_skcipher_setkey,
19345ca7badbSHoria Geantă 			.encrypt = skcipher_encrypt,
19355ca7badbSHoria Geantă 			.decrypt = skcipher_decrypt,
1936acdca31dSYuan Kang 			.min_keysize = DES_KEY_SIZE,
1937acdca31dSYuan Kang 			.max_keysize = DES_KEY_SIZE,
1938acdca31dSYuan Kang 			.ivsize = DES_BLOCK_SIZE,
1939acdca31dSYuan Kang 		},
1940623814c0SHerbert Xu 		.skcipher.op = {
1941623814c0SHerbert Xu 			.do_one_request = skcipher_do_one_req,
1942623814c0SHerbert Xu 		},
19435ca7badbSHoria Geantă 		.caam.class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC,
19442b22f6c5SCatalin Vasile 	},
19452b22f6c5SCatalin Vasile 	{
1946623814c0SHerbert Xu 		.skcipher.base = {
19475ca7badbSHoria Geantă 			.base = {
19485ca7badbSHoria Geantă 				.cra_name = "ctr(aes)",
19495ca7badbSHoria Geantă 				.cra_driver_name = "ctr-aes-caam",
19505ca7badbSHoria Geantă 				.cra_blocksize = 1,
19515ca7badbSHoria Geantă 			},
1952836d8f43SIuliana Prodan 			.setkey = ctr_skcipher_setkey,
19535ca7badbSHoria Geantă 			.encrypt = skcipher_encrypt,
19545ca7badbSHoria Geantă 			.decrypt = skcipher_decrypt,
19552b22f6c5SCatalin Vasile 			.min_keysize = AES_MIN_KEY_SIZE,
19562b22f6c5SCatalin Vasile 			.max_keysize = AES_MAX_KEY_SIZE,
19572b22f6c5SCatalin Vasile 			.ivsize = AES_BLOCK_SIZE,
19585ca7badbSHoria Geantă 			.chunksize = AES_BLOCK_SIZE,
19592b22f6c5SCatalin Vasile 		},
1960623814c0SHerbert Xu 		.skcipher.op = {
1961623814c0SHerbert Xu 			.do_one_request = skcipher_do_one_req,
1962623814c0SHerbert Xu 		},
19635ca7badbSHoria Geantă 		.caam.class1_alg_type = OP_ALG_ALGSEL_AES |
19645ca7badbSHoria Geantă 					OP_ALG_AAI_CTR_MOD128,
1965a5f57cffSCatalin Vasile 	},
1966a5f57cffSCatalin Vasile 	{
1967623814c0SHerbert Xu 		.skcipher.base = {
19685ca7badbSHoria Geantă 			.base = {
19695ca7badbSHoria Geantă 				.cra_name = "rfc3686(ctr(aes))",
19705ca7badbSHoria Geantă 				.cra_driver_name = "rfc3686-ctr-aes-caam",
19715ca7badbSHoria Geantă 				.cra_blocksize = 1,
19725ca7badbSHoria Geantă 			},
1973836d8f43SIuliana Prodan 			.setkey = rfc3686_skcipher_setkey,
19745ca7badbSHoria Geantă 			.encrypt = skcipher_encrypt,
19755ca7badbSHoria Geantă 			.decrypt = skcipher_decrypt,
1976a5f57cffSCatalin Vasile 			.min_keysize = AES_MIN_KEY_SIZE +
1977a5f57cffSCatalin Vasile 				       CTR_RFC3686_NONCE_SIZE,
1978a5f57cffSCatalin Vasile 			.max_keysize = AES_MAX_KEY_SIZE +
1979a5f57cffSCatalin Vasile 				       CTR_RFC3686_NONCE_SIZE,
1980a5f57cffSCatalin Vasile 			.ivsize = CTR_RFC3686_IV_SIZE,
19815ca7badbSHoria Geantă 			.chunksize = AES_BLOCK_SIZE,
1982a5f57cffSCatalin Vasile 		},
1983623814c0SHerbert Xu 		.skcipher.op = {
1984623814c0SHerbert Xu 			.do_one_request = skcipher_do_one_req,
1985623814c0SHerbert Xu 		},
19865ca7badbSHoria Geantă 		.caam = {
19875ca7badbSHoria Geantă 			.class1_alg_type = OP_ALG_ALGSEL_AES |
19885ca7badbSHoria Geantă 					   OP_ALG_AAI_CTR_MOD128,
19895ca7badbSHoria Geantă 			.rfc3686 = true,
19905ca7badbSHoria Geantă 		},
1991c6415a60SCatalin Vasile 	},
1992c6415a60SCatalin Vasile 	{
1993623814c0SHerbert Xu 		.skcipher.base = {
19945ca7badbSHoria Geantă 			.base = {
19955ca7badbSHoria Geantă 				.cra_name = "xts(aes)",
19965ca7badbSHoria Geantă 				.cra_driver_name = "xts-aes-caam",
19979d9b14dbSAndrei Botila 				.cra_flags = CRYPTO_ALG_NEED_FALLBACK,
19985ca7badbSHoria Geantă 				.cra_blocksize = AES_BLOCK_SIZE,
19995ca7badbSHoria Geantă 			},
20005ca7badbSHoria Geantă 			.setkey = xts_skcipher_setkey,
20015ca7badbSHoria Geantă 			.encrypt = skcipher_encrypt,
20025ca7badbSHoria Geantă 			.decrypt = skcipher_decrypt,
2003c6415a60SCatalin Vasile 			.min_keysize = 2 * AES_MIN_KEY_SIZE,
2004c6415a60SCatalin Vasile 			.max_keysize = 2 * AES_MAX_KEY_SIZE,
2005c6415a60SCatalin Vasile 			.ivsize = AES_BLOCK_SIZE,
2006c6415a60SCatalin Vasile 		},
2007623814c0SHerbert Xu 		.skcipher.op = {
2008623814c0SHerbert Xu 			.do_one_request = skcipher_do_one_req,
2009623814c0SHerbert Xu 		},
20105ca7badbSHoria Geantă 		.caam.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_XTS,
2011c6415a60SCatalin Vasile 	},
2012eaed71a4SIuliana Prodan 	{
2013623814c0SHerbert Xu 		.skcipher.base = {
2014eaed71a4SIuliana Prodan 			.base = {
2015eaed71a4SIuliana Prodan 				.cra_name = "ecb(des)",
2016eaed71a4SIuliana Prodan 				.cra_driver_name = "ecb-des-caam",
2017eaed71a4SIuliana Prodan 				.cra_blocksize = DES_BLOCK_SIZE,
2018eaed71a4SIuliana Prodan 			},
2019eaed71a4SIuliana Prodan 			.setkey = des_skcipher_setkey,
2020eaed71a4SIuliana Prodan 			.encrypt = skcipher_encrypt,
2021eaed71a4SIuliana Prodan 			.decrypt = skcipher_decrypt,
2022eaed71a4SIuliana Prodan 			.min_keysize = DES_KEY_SIZE,
2023eaed71a4SIuliana Prodan 			.max_keysize = DES_KEY_SIZE,
2024eaed71a4SIuliana Prodan 		},
2025623814c0SHerbert Xu 		.skcipher.op = {
2026623814c0SHerbert Xu 			.do_one_request = skcipher_do_one_req,
2027623814c0SHerbert Xu 		},
2028eaed71a4SIuliana Prodan 		.caam.class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_ECB,
2029eaed71a4SIuliana Prodan 	},
2030eaed71a4SIuliana Prodan 	{
2031623814c0SHerbert Xu 		.skcipher.base = {
2032eaed71a4SIuliana Prodan 			.base = {
2033eaed71a4SIuliana Prodan 				.cra_name = "ecb(aes)",
2034eaed71a4SIuliana Prodan 				.cra_driver_name = "ecb-aes-caam",
2035eaed71a4SIuliana Prodan 				.cra_blocksize = AES_BLOCK_SIZE,
2036eaed71a4SIuliana Prodan 			},
2037836d8f43SIuliana Prodan 			.setkey = aes_skcipher_setkey,
2038eaed71a4SIuliana Prodan 			.encrypt = skcipher_encrypt,
2039eaed71a4SIuliana Prodan 			.decrypt = skcipher_decrypt,
2040eaed71a4SIuliana Prodan 			.min_keysize = AES_MIN_KEY_SIZE,
2041eaed71a4SIuliana Prodan 			.max_keysize = AES_MAX_KEY_SIZE,
2042eaed71a4SIuliana Prodan 		},
2043623814c0SHerbert Xu 		.skcipher.op = {
2044623814c0SHerbert Xu 			.do_one_request = skcipher_do_one_req,
2045623814c0SHerbert Xu 		},
2046eaed71a4SIuliana Prodan 		.caam.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_ECB,
2047eaed71a4SIuliana Prodan 	},
2048eaed71a4SIuliana Prodan 	{
2049623814c0SHerbert Xu 		.skcipher.base = {
2050eaed71a4SIuliana Prodan 			.base = {
2051eaed71a4SIuliana Prodan 				.cra_name = "ecb(des3_ede)",
2052eaed71a4SIuliana Prodan 				.cra_driver_name = "ecb-des3-caam",
2053eaed71a4SIuliana Prodan 				.cra_blocksize = DES3_EDE_BLOCK_SIZE,
2054eaed71a4SIuliana Prodan 			},
2055a628c5a1SArd Biesheuvel 			.setkey = des3_skcipher_setkey,
2056eaed71a4SIuliana Prodan 			.encrypt = skcipher_encrypt,
2057eaed71a4SIuliana Prodan 			.decrypt = skcipher_decrypt,
2058eaed71a4SIuliana Prodan 			.min_keysize = DES3_EDE_KEY_SIZE,
2059eaed71a4SIuliana Prodan 			.max_keysize = DES3_EDE_KEY_SIZE,
2060eaed71a4SIuliana Prodan 		},
2061623814c0SHerbert Xu 		.skcipher.op = {
2062623814c0SHerbert Xu 			.do_one_request = skcipher_do_one_req,
2063623814c0SHerbert Xu 		},
2064eaed71a4SIuliana Prodan 		.caam.class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_ECB,
2065eaed71a4SIuliana Prodan 	},
20668e8ec596SKim Phillips };
20678e8ec596SKim Phillips 
2068f2147b88SHerbert Xu static struct caam_aead_alg driver_aeads[] = {
2069f2147b88SHerbert Xu 	{
2070623814c0SHerbert Xu 		.aead.base = {
2071f2147b88SHerbert Xu 			.base = {
2072f2147b88SHerbert Xu 				.cra_name = "rfc4106(gcm(aes))",
2073f2147b88SHerbert Xu 				.cra_driver_name = "rfc4106-gcm-aes-caam",
2074f2147b88SHerbert Xu 				.cra_blocksize = 1,
2075f2147b88SHerbert Xu 			},
2076f2147b88SHerbert Xu 			.setkey = rfc4106_setkey,
2077f2147b88SHerbert Xu 			.setauthsize = rfc4106_setauthsize,
207846218750SHerbert Xu 			.encrypt = ipsec_gcm_encrypt,
207946218750SHerbert Xu 			.decrypt = ipsec_gcm_decrypt,
20807545e166SCorentin LABBE 			.ivsize = GCM_RFC4106_IV_SIZE,
2081f2147b88SHerbert Xu 			.maxauthsize = AES_BLOCK_SIZE,
2082f2147b88SHerbert Xu 		},
2083623814c0SHerbert Xu 		.aead.op = {
2084623814c0SHerbert Xu 			.do_one_request = aead_do_one_req,
2085623814c0SHerbert Xu 		},
2086f2147b88SHerbert Xu 		.caam = {
2087f2147b88SHerbert Xu 			.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_GCM,
208824586b5fSHerbert Xu 			.nodkp = true,
2089f2147b88SHerbert Xu 		},
2090f2147b88SHerbert Xu 	},
2091f2147b88SHerbert Xu 	{
2092623814c0SHerbert Xu 		.aead.base = {
2093f2147b88SHerbert Xu 			.base = {
2094f2147b88SHerbert Xu 				.cra_name = "rfc4543(gcm(aes))",
2095f2147b88SHerbert Xu 				.cra_driver_name = "rfc4543-gcm-aes-caam",
2096f2147b88SHerbert Xu 				.cra_blocksize = 1,
2097f2147b88SHerbert Xu 			},
2098f2147b88SHerbert Xu 			.setkey = rfc4543_setkey,
2099f2147b88SHerbert Xu 			.setauthsize = rfc4543_setauthsize,
210046218750SHerbert Xu 			.encrypt = ipsec_gcm_encrypt,
210146218750SHerbert Xu 			.decrypt = ipsec_gcm_decrypt,
21027545e166SCorentin LABBE 			.ivsize = GCM_RFC4543_IV_SIZE,
2103f2147b88SHerbert Xu 			.maxauthsize = AES_BLOCK_SIZE,
2104f2147b88SHerbert Xu 		},
2105623814c0SHerbert Xu 		.aead.op = {
2106623814c0SHerbert Xu 			.do_one_request = aead_do_one_req,
2107623814c0SHerbert Xu 		},
2108f2147b88SHerbert Xu 		.caam = {
2109f2147b88SHerbert Xu 			.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_GCM,
211024586b5fSHerbert Xu 			.nodkp = true,
2111f2147b88SHerbert Xu 		},
2112f2147b88SHerbert Xu 	},
2113f2147b88SHerbert Xu 	/* Galois Counter Mode */
2114f2147b88SHerbert Xu 	{
2115623814c0SHerbert Xu 		.aead.base = {
2116f2147b88SHerbert Xu 			.base = {
2117f2147b88SHerbert Xu 				.cra_name = "gcm(aes)",
2118f2147b88SHerbert Xu 				.cra_driver_name = "gcm-aes-caam",
2119f2147b88SHerbert Xu 				.cra_blocksize = 1,
2120f2147b88SHerbert Xu 			},
2121f2147b88SHerbert Xu 			.setkey = gcm_setkey,
2122f2147b88SHerbert Xu 			.setauthsize = gcm_setauthsize,
2123f2147b88SHerbert Xu 			.encrypt = gcm_encrypt,
2124f2147b88SHerbert Xu 			.decrypt = gcm_decrypt,
21257545e166SCorentin LABBE 			.ivsize = GCM_AES_IV_SIZE,
2126f2147b88SHerbert Xu 			.maxauthsize = AES_BLOCK_SIZE,
2127f2147b88SHerbert Xu 		},
2128623814c0SHerbert Xu 		.aead.op = {
2129623814c0SHerbert Xu 			.do_one_request = aead_do_one_req,
2130623814c0SHerbert Xu 		},
2131f2147b88SHerbert Xu 		.caam = {
2132f2147b88SHerbert Xu 			.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_GCM,
213324586b5fSHerbert Xu 			.nodkp = true,
2134f2147b88SHerbert Xu 		},
2135f2147b88SHerbert Xu 	},
2136479bcc7cSHerbert Xu 	/* single-pass ipsec_esp descriptor */
2137479bcc7cSHerbert Xu 	{
2138623814c0SHerbert Xu 		.aead.base = {
2139479bcc7cSHerbert Xu 			.base = {
2140479bcc7cSHerbert Xu 				.cra_name = "authenc(hmac(md5),"
2141479bcc7cSHerbert Xu 					    "ecb(cipher_null))",
2142479bcc7cSHerbert Xu 				.cra_driver_name = "authenc-hmac-md5-"
2143479bcc7cSHerbert Xu 						   "ecb-cipher_null-caam",
2144479bcc7cSHerbert Xu 				.cra_blocksize = NULL_BLOCK_SIZE,
2145479bcc7cSHerbert Xu 			},
2146479bcc7cSHerbert Xu 			.setkey = aead_setkey,
2147479bcc7cSHerbert Xu 			.setauthsize = aead_setauthsize,
2148479bcc7cSHerbert Xu 			.encrypt = aead_encrypt,
2149479bcc7cSHerbert Xu 			.decrypt = aead_decrypt,
2150479bcc7cSHerbert Xu 			.ivsize = NULL_IV_SIZE,
2151479bcc7cSHerbert Xu 			.maxauthsize = MD5_DIGEST_SIZE,
2152479bcc7cSHerbert Xu 		},
2153623814c0SHerbert Xu 		.aead.op = {
2154623814c0SHerbert Xu 			.do_one_request = aead_do_one_req,
2155623814c0SHerbert Xu 		},
2156479bcc7cSHerbert Xu 		.caam = {
2157479bcc7cSHerbert Xu 			.class2_alg_type = OP_ALG_ALGSEL_MD5 |
2158479bcc7cSHerbert Xu 					   OP_ALG_AAI_HMAC_PRECOMP,
2159479bcc7cSHerbert Xu 		},
2160479bcc7cSHerbert Xu 	},
2161479bcc7cSHerbert Xu 	{
2162623814c0SHerbert Xu 		.aead.base = {
2163479bcc7cSHerbert Xu 			.base = {
2164479bcc7cSHerbert Xu 				.cra_name = "authenc(hmac(sha1),"
2165479bcc7cSHerbert Xu 					    "ecb(cipher_null))",
2166479bcc7cSHerbert Xu 				.cra_driver_name = "authenc-hmac-sha1-"
2167479bcc7cSHerbert Xu 						   "ecb-cipher_null-caam",
2168479bcc7cSHerbert Xu 				.cra_blocksize = NULL_BLOCK_SIZE,
2169479bcc7cSHerbert Xu 			},
2170479bcc7cSHerbert Xu 			.setkey = aead_setkey,
2171479bcc7cSHerbert Xu 			.setauthsize = aead_setauthsize,
2172479bcc7cSHerbert Xu 			.encrypt = aead_encrypt,
2173479bcc7cSHerbert Xu 			.decrypt = aead_decrypt,
2174479bcc7cSHerbert Xu 			.ivsize = NULL_IV_SIZE,
2175479bcc7cSHerbert Xu 			.maxauthsize = SHA1_DIGEST_SIZE,
2176479bcc7cSHerbert Xu 		},
2177623814c0SHerbert Xu 		.aead.op = {
2178623814c0SHerbert Xu 			.do_one_request = aead_do_one_req,
2179623814c0SHerbert Xu 		},
2180479bcc7cSHerbert Xu 		.caam = {
2181479bcc7cSHerbert Xu 			.class2_alg_type = OP_ALG_ALGSEL_SHA1 |
2182479bcc7cSHerbert Xu 					   OP_ALG_AAI_HMAC_PRECOMP,
2183479bcc7cSHerbert Xu 		},
2184479bcc7cSHerbert Xu 	},
2185479bcc7cSHerbert Xu 	{
2186623814c0SHerbert Xu 		.aead.base = {
2187479bcc7cSHerbert Xu 			.base = {
2188479bcc7cSHerbert Xu 				.cra_name = "authenc(hmac(sha224),"
2189479bcc7cSHerbert Xu 					    "ecb(cipher_null))",
2190479bcc7cSHerbert Xu 				.cra_driver_name = "authenc-hmac-sha224-"
2191479bcc7cSHerbert Xu 						   "ecb-cipher_null-caam",
2192479bcc7cSHerbert Xu 				.cra_blocksize = NULL_BLOCK_SIZE,
2193479bcc7cSHerbert Xu 			},
2194479bcc7cSHerbert Xu 			.setkey = aead_setkey,
2195479bcc7cSHerbert Xu 			.setauthsize = aead_setauthsize,
2196479bcc7cSHerbert Xu 			.encrypt = aead_encrypt,
2197479bcc7cSHerbert Xu 			.decrypt = aead_decrypt,
2198479bcc7cSHerbert Xu 			.ivsize = NULL_IV_SIZE,
2199479bcc7cSHerbert Xu 			.maxauthsize = SHA224_DIGEST_SIZE,
2200479bcc7cSHerbert Xu 		},
2201623814c0SHerbert Xu 		.aead.op = {
2202623814c0SHerbert Xu 			.do_one_request = aead_do_one_req,
2203623814c0SHerbert Xu 		},
2204479bcc7cSHerbert Xu 		.caam = {
2205479bcc7cSHerbert Xu 			.class2_alg_type = OP_ALG_ALGSEL_SHA224 |
2206479bcc7cSHerbert Xu 					   OP_ALG_AAI_HMAC_PRECOMP,
2207479bcc7cSHerbert Xu 		},
2208479bcc7cSHerbert Xu 	},
2209479bcc7cSHerbert Xu 	{
2210623814c0SHerbert Xu 		.aead.base = {
2211479bcc7cSHerbert Xu 			.base = {
2212479bcc7cSHerbert Xu 				.cra_name = "authenc(hmac(sha256),"
2213479bcc7cSHerbert Xu 					    "ecb(cipher_null))",
2214479bcc7cSHerbert Xu 				.cra_driver_name = "authenc-hmac-sha256-"
2215479bcc7cSHerbert Xu 						   "ecb-cipher_null-caam",
2216479bcc7cSHerbert Xu 				.cra_blocksize = NULL_BLOCK_SIZE,
2217479bcc7cSHerbert Xu 			},
2218479bcc7cSHerbert Xu 			.setkey = aead_setkey,
2219479bcc7cSHerbert Xu 			.setauthsize = aead_setauthsize,
2220479bcc7cSHerbert Xu 			.encrypt = aead_encrypt,
2221479bcc7cSHerbert Xu 			.decrypt = aead_decrypt,
2222479bcc7cSHerbert Xu 			.ivsize = NULL_IV_SIZE,
2223479bcc7cSHerbert Xu 			.maxauthsize = SHA256_DIGEST_SIZE,
2224479bcc7cSHerbert Xu 		},
2225623814c0SHerbert Xu 		.aead.op = {
2226623814c0SHerbert Xu 			.do_one_request = aead_do_one_req,
2227623814c0SHerbert Xu 		},
2228479bcc7cSHerbert Xu 		.caam = {
2229479bcc7cSHerbert Xu 			.class2_alg_type = OP_ALG_ALGSEL_SHA256 |
2230479bcc7cSHerbert Xu 					   OP_ALG_AAI_HMAC_PRECOMP,
2231479bcc7cSHerbert Xu 		},
2232479bcc7cSHerbert Xu 	},
2233479bcc7cSHerbert Xu 	{
2234623814c0SHerbert Xu 		.aead.base = {
2235479bcc7cSHerbert Xu 			.base = {
2236479bcc7cSHerbert Xu 				.cra_name = "authenc(hmac(sha384),"
2237479bcc7cSHerbert Xu 					    "ecb(cipher_null))",
2238479bcc7cSHerbert Xu 				.cra_driver_name = "authenc-hmac-sha384-"
2239479bcc7cSHerbert Xu 						   "ecb-cipher_null-caam",
2240479bcc7cSHerbert Xu 				.cra_blocksize = NULL_BLOCK_SIZE,
2241479bcc7cSHerbert Xu 			},
2242479bcc7cSHerbert Xu 			.setkey = aead_setkey,
2243479bcc7cSHerbert Xu 			.setauthsize = aead_setauthsize,
2244479bcc7cSHerbert Xu 			.encrypt = aead_encrypt,
2245479bcc7cSHerbert Xu 			.decrypt = aead_decrypt,
2246479bcc7cSHerbert Xu 			.ivsize = NULL_IV_SIZE,
2247479bcc7cSHerbert Xu 			.maxauthsize = SHA384_DIGEST_SIZE,
2248479bcc7cSHerbert Xu 		},
2249623814c0SHerbert Xu 		.aead.op = {
2250623814c0SHerbert Xu 			.do_one_request = aead_do_one_req,
2251623814c0SHerbert Xu 		},
2252479bcc7cSHerbert Xu 		.caam = {
2253479bcc7cSHerbert Xu 			.class2_alg_type = OP_ALG_ALGSEL_SHA384 |
2254479bcc7cSHerbert Xu 					   OP_ALG_AAI_HMAC_PRECOMP,
2255479bcc7cSHerbert Xu 		},
2256479bcc7cSHerbert Xu 	},
2257479bcc7cSHerbert Xu 	{
2258623814c0SHerbert Xu 		.aead.base = {
2259479bcc7cSHerbert Xu 			.base = {
2260479bcc7cSHerbert Xu 				.cra_name = "authenc(hmac(sha512),"
2261479bcc7cSHerbert Xu 					    "ecb(cipher_null))",
2262479bcc7cSHerbert Xu 				.cra_driver_name = "authenc-hmac-sha512-"
2263479bcc7cSHerbert Xu 						   "ecb-cipher_null-caam",
2264479bcc7cSHerbert Xu 				.cra_blocksize = NULL_BLOCK_SIZE,
2265479bcc7cSHerbert Xu 			},
2266479bcc7cSHerbert Xu 			.setkey = aead_setkey,
2267479bcc7cSHerbert Xu 			.setauthsize = aead_setauthsize,
2268479bcc7cSHerbert Xu 			.encrypt = aead_encrypt,
2269479bcc7cSHerbert Xu 			.decrypt = aead_decrypt,
2270479bcc7cSHerbert Xu 			.ivsize = NULL_IV_SIZE,
2271479bcc7cSHerbert Xu 			.maxauthsize = SHA512_DIGEST_SIZE,
2272479bcc7cSHerbert Xu 		},
2273623814c0SHerbert Xu 		.aead.op = {
2274623814c0SHerbert Xu 			.do_one_request = aead_do_one_req,
2275623814c0SHerbert Xu 		},
2276479bcc7cSHerbert Xu 		.caam = {
2277479bcc7cSHerbert Xu 			.class2_alg_type = OP_ALG_ALGSEL_SHA512 |
2278479bcc7cSHerbert Xu 					   OP_ALG_AAI_HMAC_PRECOMP,
2279479bcc7cSHerbert Xu 		},
2280479bcc7cSHerbert Xu 	},
2281479bcc7cSHerbert Xu 	{
2282623814c0SHerbert Xu 		.aead.base = {
2283479bcc7cSHerbert Xu 			.base = {
2284479bcc7cSHerbert Xu 				.cra_name = "authenc(hmac(md5),cbc(aes))",
2285479bcc7cSHerbert Xu 				.cra_driver_name = "authenc-hmac-md5-"
2286479bcc7cSHerbert Xu 						   "cbc-aes-caam",
2287479bcc7cSHerbert Xu 				.cra_blocksize = AES_BLOCK_SIZE,
2288479bcc7cSHerbert Xu 			},
2289479bcc7cSHerbert Xu 			.setkey = aead_setkey,
2290479bcc7cSHerbert Xu 			.setauthsize = aead_setauthsize,
2291479bcc7cSHerbert Xu 			.encrypt = aead_encrypt,
2292479bcc7cSHerbert Xu 			.decrypt = aead_decrypt,
2293479bcc7cSHerbert Xu 			.ivsize = AES_BLOCK_SIZE,
2294479bcc7cSHerbert Xu 			.maxauthsize = MD5_DIGEST_SIZE,
2295479bcc7cSHerbert Xu 		},
2296623814c0SHerbert Xu 		.aead.op = {
2297623814c0SHerbert Xu 			.do_one_request = aead_do_one_req,
2298623814c0SHerbert Xu 		},
2299479bcc7cSHerbert Xu 		.caam = {
2300479bcc7cSHerbert Xu 			.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC,
2301479bcc7cSHerbert Xu 			.class2_alg_type = OP_ALG_ALGSEL_MD5 |
2302479bcc7cSHerbert Xu 					   OP_ALG_AAI_HMAC_PRECOMP,
2303479bcc7cSHerbert Xu 		},
2304479bcc7cSHerbert Xu 	},
2305479bcc7cSHerbert Xu 	{
2306623814c0SHerbert Xu 		.aead.base = {
2307479bcc7cSHerbert Xu 			.base = {
2308479bcc7cSHerbert Xu 				.cra_name = "echainiv(authenc(hmac(md5),"
2309479bcc7cSHerbert Xu 					    "cbc(aes)))",
2310479bcc7cSHerbert Xu 				.cra_driver_name = "echainiv-authenc-hmac-md5-"
2311479bcc7cSHerbert Xu 						   "cbc-aes-caam",
2312479bcc7cSHerbert Xu 				.cra_blocksize = AES_BLOCK_SIZE,
2313479bcc7cSHerbert Xu 			},
2314479bcc7cSHerbert Xu 			.setkey = aead_setkey,
2315479bcc7cSHerbert Xu 			.setauthsize = aead_setauthsize,
2316479bcc7cSHerbert Xu 			.encrypt = aead_encrypt,
23178b18e235SHoria Geantă 			.decrypt = aead_decrypt,
2318479bcc7cSHerbert Xu 			.ivsize = AES_BLOCK_SIZE,
2319479bcc7cSHerbert Xu 			.maxauthsize = MD5_DIGEST_SIZE,
2320479bcc7cSHerbert Xu 		},
2321623814c0SHerbert Xu 		.aead.op = {
2322623814c0SHerbert Xu 			.do_one_request = aead_do_one_req,
2323623814c0SHerbert Xu 		},
2324479bcc7cSHerbert Xu 		.caam = {
2325479bcc7cSHerbert Xu 			.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC,
2326479bcc7cSHerbert Xu 			.class2_alg_type = OP_ALG_ALGSEL_MD5 |
2327479bcc7cSHerbert Xu 					   OP_ALG_AAI_HMAC_PRECOMP,
2328479bcc7cSHerbert Xu 			.geniv = true,
2329479bcc7cSHerbert Xu 		},
2330479bcc7cSHerbert Xu 	},
2331479bcc7cSHerbert Xu 	{
2332623814c0SHerbert Xu 		.aead.base = {
2333479bcc7cSHerbert Xu 			.base = {
2334479bcc7cSHerbert Xu 				.cra_name = "authenc(hmac(sha1),cbc(aes))",
2335479bcc7cSHerbert Xu 				.cra_driver_name = "authenc-hmac-sha1-"
2336479bcc7cSHerbert Xu 						   "cbc-aes-caam",
2337479bcc7cSHerbert Xu 				.cra_blocksize = AES_BLOCK_SIZE,
2338479bcc7cSHerbert Xu 			},
2339479bcc7cSHerbert Xu 			.setkey = aead_setkey,
2340479bcc7cSHerbert Xu 			.setauthsize = aead_setauthsize,
2341479bcc7cSHerbert Xu 			.encrypt = aead_encrypt,
2342479bcc7cSHerbert Xu 			.decrypt = aead_decrypt,
2343479bcc7cSHerbert Xu 			.ivsize = AES_BLOCK_SIZE,
2344479bcc7cSHerbert Xu 			.maxauthsize = SHA1_DIGEST_SIZE,
2345479bcc7cSHerbert Xu 		},
2346623814c0SHerbert Xu 		.aead.op = {
2347623814c0SHerbert Xu 			.do_one_request = aead_do_one_req,
2348623814c0SHerbert Xu 		},
2349479bcc7cSHerbert Xu 		.caam = {
2350479bcc7cSHerbert Xu 			.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC,
2351479bcc7cSHerbert Xu 			.class2_alg_type = OP_ALG_ALGSEL_SHA1 |
2352479bcc7cSHerbert Xu 					   OP_ALG_AAI_HMAC_PRECOMP,
2353479bcc7cSHerbert Xu 		},
2354479bcc7cSHerbert Xu 	},
2355479bcc7cSHerbert Xu 	{
2356623814c0SHerbert Xu 		.aead.base = {
2357479bcc7cSHerbert Xu 			.base = {
2358479bcc7cSHerbert Xu 				.cra_name = "echainiv(authenc(hmac(sha1),"
2359479bcc7cSHerbert Xu 					    "cbc(aes)))",
2360479bcc7cSHerbert Xu 				.cra_driver_name = "echainiv-authenc-"
2361479bcc7cSHerbert Xu 						   "hmac-sha1-cbc-aes-caam",
2362479bcc7cSHerbert Xu 				.cra_blocksize = AES_BLOCK_SIZE,
2363479bcc7cSHerbert Xu 			},
2364479bcc7cSHerbert Xu 			.setkey = aead_setkey,
2365479bcc7cSHerbert Xu 			.setauthsize = aead_setauthsize,
2366479bcc7cSHerbert Xu 			.encrypt = aead_encrypt,
23678b18e235SHoria Geantă 			.decrypt = aead_decrypt,
2368479bcc7cSHerbert Xu 			.ivsize = AES_BLOCK_SIZE,
2369479bcc7cSHerbert Xu 			.maxauthsize = SHA1_DIGEST_SIZE,
2370479bcc7cSHerbert Xu 		},
2371623814c0SHerbert Xu 		.aead.op = {
2372623814c0SHerbert Xu 			.do_one_request = aead_do_one_req,
2373623814c0SHerbert Xu 		},
2374479bcc7cSHerbert Xu 		.caam = {
2375479bcc7cSHerbert Xu 			.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC,
2376479bcc7cSHerbert Xu 			.class2_alg_type = OP_ALG_ALGSEL_SHA1 |
2377479bcc7cSHerbert Xu 					   OP_ALG_AAI_HMAC_PRECOMP,
2378479bcc7cSHerbert Xu 			.geniv = true,
2379479bcc7cSHerbert Xu 		},
2380479bcc7cSHerbert Xu 	},
2381479bcc7cSHerbert Xu 	{
2382623814c0SHerbert Xu 		.aead.base = {
2383479bcc7cSHerbert Xu 			.base = {
2384479bcc7cSHerbert Xu 				.cra_name = "authenc(hmac(sha224),cbc(aes))",
2385479bcc7cSHerbert Xu 				.cra_driver_name = "authenc-hmac-sha224-"
2386479bcc7cSHerbert Xu 						   "cbc-aes-caam",
2387479bcc7cSHerbert Xu 				.cra_blocksize = AES_BLOCK_SIZE,
2388479bcc7cSHerbert Xu 			},
2389479bcc7cSHerbert Xu 			.setkey = aead_setkey,
2390479bcc7cSHerbert Xu 			.setauthsize = aead_setauthsize,
2391479bcc7cSHerbert Xu 			.encrypt = aead_encrypt,
2392479bcc7cSHerbert Xu 			.decrypt = aead_decrypt,
2393479bcc7cSHerbert Xu 			.ivsize = AES_BLOCK_SIZE,
2394479bcc7cSHerbert Xu 			.maxauthsize = SHA224_DIGEST_SIZE,
2395479bcc7cSHerbert Xu 		},
2396623814c0SHerbert Xu 		.aead.op = {
2397623814c0SHerbert Xu 			.do_one_request = aead_do_one_req,
2398623814c0SHerbert Xu 		},
2399479bcc7cSHerbert Xu 		.caam = {
2400479bcc7cSHerbert Xu 			.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC,
2401479bcc7cSHerbert Xu 			.class2_alg_type = OP_ALG_ALGSEL_SHA224 |
2402479bcc7cSHerbert Xu 					   OP_ALG_AAI_HMAC_PRECOMP,
2403479bcc7cSHerbert Xu 		},
2404479bcc7cSHerbert Xu 	},
2405479bcc7cSHerbert Xu 	{
2406623814c0SHerbert Xu 		.aead.base = {
2407479bcc7cSHerbert Xu 			.base = {
2408479bcc7cSHerbert Xu 				.cra_name = "echainiv(authenc(hmac(sha224),"
2409479bcc7cSHerbert Xu 					    "cbc(aes)))",
2410479bcc7cSHerbert Xu 				.cra_driver_name = "echainiv-authenc-"
2411479bcc7cSHerbert Xu 						   "hmac-sha224-cbc-aes-caam",
2412479bcc7cSHerbert Xu 				.cra_blocksize = AES_BLOCK_SIZE,
2413479bcc7cSHerbert Xu 			},
2414479bcc7cSHerbert Xu 			.setkey = aead_setkey,
2415479bcc7cSHerbert Xu 			.setauthsize = aead_setauthsize,
2416479bcc7cSHerbert Xu 			.encrypt = aead_encrypt,
24178b18e235SHoria Geantă 			.decrypt = aead_decrypt,
2418479bcc7cSHerbert Xu 			.ivsize = AES_BLOCK_SIZE,
2419479bcc7cSHerbert Xu 			.maxauthsize = SHA224_DIGEST_SIZE,
2420479bcc7cSHerbert Xu 		},
2421623814c0SHerbert Xu 		.aead.op = {
2422623814c0SHerbert Xu 			.do_one_request = aead_do_one_req,
2423623814c0SHerbert Xu 		},
2424479bcc7cSHerbert Xu 		.caam = {
2425479bcc7cSHerbert Xu 			.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC,
2426479bcc7cSHerbert Xu 			.class2_alg_type = OP_ALG_ALGSEL_SHA224 |
2427479bcc7cSHerbert Xu 					   OP_ALG_AAI_HMAC_PRECOMP,
2428479bcc7cSHerbert Xu 			.geniv = true,
2429479bcc7cSHerbert Xu 		},
2430479bcc7cSHerbert Xu 	},
2431479bcc7cSHerbert Xu 	{
2432623814c0SHerbert Xu 		.aead.base = {
2433479bcc7cSHerbert Xu 			.base = {
2434479bcc7cSHerbert Xu 				.cra_name = "authenc(hmac(sha256),cbc(aes))",
2435479bcc7cSHerbert Xu 				.cra_driver_name = "authenc-hmac-sha256-"
2436479bcc7cSHerbert Xu 						   "cbc-aes-caam",
2437479bcc7cSHerbert Xu 				.cra_blocksize = AES_BLOCK_SIZE,
2438479bcc7cSHerbert Xu 			},
2439479bcc7cSHerbert Xu 			.setkey = aead_setkey,
2440479bcc7cSHerbert Xu 			.setauthsize = aead_setauthsize,
2441479bcc7cSHerbert Xu 			.encrypt = aead_encrypt,
2442479bcc7cSHerbert Xu 			.decrypt = aead_decrypt,
2443479bcc7cSHerbert Xu 			.ivsize = AES_BLOCK_SIZE,
2444479bcc7cSHerbert Xu 			.maxauthsize = SHA256_DIGEST_SIZE,
2445479bcc7cSHerbert Xu 		},
2446623814c0SHerbert Xu 		.aead.op = {
2447623814c0SHerbert Xu 			.do_one_request = aead_do_one_req,
2448623814c0SHerbert Xu 		},
2449479bcc7cSHerbert Xu 		.caam = {
2450479bcc7cSHerbert Xu 			.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC,
2451479bcc7cSHerbert Xu 			.class2_alg_type = OP_ALG_ALGSEL_SHA256 |
2452479bcc7cSHerbert Xu 					   OP_ALG_AAI_HMAC_PRECOMP,
2453479bcc7cSHerbert Xu 		},
2454479bcc7cSHerbert Xu 	},
2455479bcc7cSHerbert Xu 	{
2456623814c0SHerbert Xu 		.aead.base = {
2457479bcc7cSHerbert Xu 			.base = {
2458479bcc7cSHerbert Xu 				.cra_name = "echainiv(authenc(hmac(sha256),"
2459479bcc7cSHerbert Xu 					    "cbc(aes)))",
2460479bcc7cSHerbert Xu 				.cra_driver_name = "echainiv-authenc-"
2461479bcc7cSHerbert Xu 						   "hmac-sha256-cbc-aes-caam",
2462479bcc7cSHerbert Xu 				.cra_blocksize = AES_BLOCK_SIZE,
2463479bcc7cSHerbert Xu 			},
2464479bcc7cSHerbert Xu 			.setkey = aead_setkey,
2465479bcc7cSHerbert Xu 			.setauthsize = aead_setauthsize,
2466479bcc7cSHerbert Xu 			.encrypt = aead_encrypt,
24678b18e235SHoria Geantă 			.decrypt = aead_decrypt,
2468479bcc7cSHerbert Xu 			.ivsize = AES_BLOCK_SIZE,
2469479bcc7cSHerbert Xu 			.maxauthsize = SHA256_DIGEST_SIZE,
2470479bcc7cSHerbert Xu 		},
2471623814c0SHerbert Xu 		.aead.op = {
2472623814c0SHerbert Xu 			.do_one_request = aead_do_one_req,
2473623814c0SHerbert Xu 		},
2474479bcc7cSHerbert Xu 		.caam = {
2475479bcc7cSHerbert Xu 			.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC,
2476479bcc7cSHerbert Xu 			.class2_alg_type = OP_ALG_ALGSEL_SHA256 |
2477479bcc7cSHerbert Xu 					   OP_ALG_AAI_HMAC_PRECOMP,
2478479bcc7cSHerbert Xu 			.geniv = true,
2479479bcc7cSHerbert Xu 		},
2480479bcc7cSHerbert Xu 	},
2481479bcc7cSHerbert Xu 	{
2482623814c0SHerbert Xu 		.aead.base = {
2483479bcc7cSHerbert Xu 			.base = {
2484479bcc7cSHerbert Xu 				.cra_name = "authenc(hmac(sha384),cbc(aes))",
2485479bcc7cSHerbert Xu 				.cra_driver_name = "authenc-hmac-sha384-"
2486479bcc7cSHerbert Xu 						   "cbc-aes-caam",
2487479bcc7cSHerbert Xu 				.cra_blocksize = AES_BLOCK_SIZE,
2488479bcc7cSHerbert Xu 			},
2489479bcc7cSHerbert Xu 			.setkey = aead_setkey,
2490479bcc7cSHerbert Xu 			.setauthsize = aead_setauthsize,
2491479bcc7cSHerbert Xu 			.encrypt = aead_encrypt,
2492479bcc7cSHerbert Xu 			.decrypt = aead_decrypt,
2493479bcc7cSHerbert Xu 			.ivsize = AES_BLOCK_SIZE,
2494479bcc7cSHerbert Xu 			.maxauthsize = SHA384_DIGEST_SIZE,
2495479bcc7cSHerbert Xu 		},
2496623814c0SHerbert Xu 		.aead.op = {
2497623814c0SHerbert Xu 			.do_one_request = aead_do_one_req,
2498623814c0SHerbert Xu 		},
2499479bcc7cSHerbert Xu 		.caam = {
2500479bcc7cSHerbert Xu 			.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC,
2501479bcc7cSHerbert Xu 			.class2_alg_type = OP_ALG_ALGSEL_SHA384 |
2502479bcc7cSHerbert Xu 					   OP_ALG_AAI_HMAC_PRECOMP,
2503479bcc7cSHerbert Xu 		},
2504479bcc7cSHerbert Xu 	},
2505479bcc7cSHerbert Xu 	{
2506623814c0SHerbert Xu 		.aead.base = {
2507479bcc7cSHerbert Xu 			.base = {
2508479bcc7cSHerbert Xu 				.cra_name = "echainiv(authenc(hmac(sha384),"
2509479bcc7cSHerbert Xu 					    "cbc(aes)))",
2510479bcc7cSHerbert Xu 				.cra_driver_name = "echainiv-authenc-"
2511479bcc7cSHerbert Xu 						   "hmac-sha384-cbc-aes-caam",
2512479bcc7cSHerbert Xu 				.cra_blocksize = AES_BLOCK_SIZE,
2513479bcc7cSHerbert Xu 			},
2514479bcc7cSHerbert Xu 			.setkey = aead_setkey,
2515479bcc7cSHerbert Xu 			.setauthsize = aead_setauthsize,
2516479bcc7cSHerbert Xu 			.encrypt = aead_encrypt,
25178b18e235SHoria Geantă 			.decrypt = aead_decrypt,
2518479bcc7cSHerbert Xu 			.ivsize = AES_BLOCK_SIZE,
2519479bcc7cSHerbert Xu 			.maxauthsize = SHA384_DIGEST_SIZE,
2520479bcc7cSHerbert Xu 		},
2521623814c0SHerbert Xu 		.aead.op = {
2522623814c0SHerbert Xu 			.do_one_request = aead_do_one_req,
2523623814c0SHerbert Xu 		},
2524479bcc7cSHerbert Xu 		.caam = {
2525479bcc7cSHerbert Xu 			.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC,
2526479bcc7cSHerbert Xu 			.class2_alg_type = OP_ALG_ALGSEL_SHA384 |
2527479bcc7cSHerbert Xu 					   OP_ALG_AAI_HMAC_PRECOMP,
2528479bcc7cSHerbert Xu 			.geniv = true,
2529479bcc7cSHerbert Xu 		},
2530479bcc7cSHerbert Xu 	},
2531479bcc7cSHerbert Xu 	{
2532623814c0SHerbert Xu 		.aead.base = {
2533479bcc7cSHerbert Xu 			.base = {
2534479bcc7cSHerbert Xu 				.cra_name = "authenc(hmac(sha512),cbc(aes))",
2535479bcc7cSHerbert Xu 				.cra_driver_name = "authenc-hmac-sha512-"
2536479bcc7cSHerbert Xu 						   "cbc-aes-caam",
2537479bcc7cSHerbert Xu 				.cra_blocksize = AES_BLOCK_SIZE,
2538479bcc7cSHerbert Xu 			},
2539479bcc7cSHerbert Xu 			.setkey = aead_setkey,
2540479bcc7cSHerbert Xu 			.setauthsize = aead_setauthsize,
2541479bcc7cSHerbert Xu 			.encrypt = aead_encrypt,
2542479bcc7cSHerbert Xu 			.decrypt = aead_decrypt,
2543479bcc7cSHerbert Xu 			.ivsize = AES_BLOCK_SIZE,
2544479bcc7cSHerbert Xu 			.maxauthsize = SHA512_DIGEST_SIZE,
2545479bcc7cSHerbert Xu 		},
2546623814c0SHerbert Xu 		.aead.op = {
2547623814c0SHerbert Xu 			.do_one_request = aead_do_one_req,
2548623814c0SHerbert Xu 		},
2549479bcc7cSHerbert Xu 		.caam = {
2550479bcc7cSHerbert Xu 			.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC,
2551479bcc7cSHerbert Xu 			.class2_alg_type = OP_ALG_ALGSEL_SHA512 |
2552479bcc7cSHerbert Xu 					   OP_ALG_AAI_HMAC_PRECOMP,
2553479bcc7cSHerbert Xu 		},
2554479bcc7cSHerbert Xu 	},
2555479bcc7cSHerbert Xu 	{
2556623814c0SHerbert Xu 		.aead.base = {
2557479bcc7cSHerbert Xu 			.base = {
2558479bcc7cSHerbert Xu 				.cra_name = "echainiv(authenc(hmac(sha512),"
2559479bcc7cSHerbert Xu 					    "cbc(aes)))",
2560479bcc7cSHerbert Xu 				.cra_driver_name = "echainiv-authenc-"
2561479bcc7cSHerbert Xu 						   "hmac-sha512-cbc-aes-caam",
2562479bcc7cSHerbert Xu 				.cra_blocksize = AES_BLOCK_SIZE,
2563479bcc7cSHerbert Xu 			},
2564479bcc7cSHerbert Xu 			.setkey = aead_setkey,
2565479bcc7cSHerbert Xu 			.setauthsize = aead_setauthsize,
2566479bcc7cSHerbert Xu 			.encrypt = aead_encrypt,
25678b18e235SHoria Geantă 			.decrypt = aead_decrypt,
2568479bcc7cSHerbert Xu 			.ivsize = AES_BLOCK_SIZE,
2569479bcc7cSHerbert Xu 			.maxauthsize = SHA512_DIGEST_SIZE,
2570479bcc7cSHerbert Xu 		},
2571623814c0SHerbert Xu 		.aead.op = {
2572623814c0SHerbert Xu 			.do_one_request = aead_do_one_req,
2573623814c0SHerbert Xu 		},
2574479bcc7cSHerbert Xu 		.caam = {
2575479bcc7cSHerbert Xu 			.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC,
2576479bcc7cSHerbert Xu 			.class2_alg_type = OP_ALG_ALGSEL_SHA512 |
2577479bcc7cSHerbert Xu 					   OP_ALG_AAI_HMAC_PRECOMP,
2578479bcc7cSHerbert Xu 			.geniv = true,
2579479bcc7cSHerbert Xu 		},
2580479bcc7cSHerbert Xu 	},
2581479bcc7cSHerbert Xu 	{
2582623814c0SHerbert Xu 		.aead.base = {
2583479bcc7cSHerbert Xu 			.base = {
2584479bcc7cSHerbert Xu 				.cra_name = "authenc(hmac(md5),cbc(des3_ede))",
2585479bcc7cSHerbert Xu 				.cra_driver_name = "authenc-hmac-md5-"
2586479bcc7cSHerbert Xu 						   "cbc-des3_ede-caam",
2587479bcc7cSHerbert Xu 				.cra_blocksize = DES3_EDE_BLOCK_SIZE,
2588479bcc7cSHerbert Xu 			},
25891b52c409SHerbert Xu 			.setkey = des3_aead_setkey,
2590479bcc7cSHerbert Xu 			.setauthsize = aead_setauthsize,
2591479bcc7cSHerbert Xu 			.encrypt = aead_encrypt,
2592479bcc7cSHerbert Xu 			.decrypt = aead_decrypt,
2593479bcc7cSHerbert Xu 			.ivsize = DES3_EDE_BLOCK_SIZE,
2594479bcc7cSHerbert Xu 			.maxauthsize = MD5_DIGEST_SIZE,
2595479bcc7cSHerbert Xu 		},
2596623814c0SHerbert Xu 		.aead.op = {
2597623814c0SHerbert Xu 			.do_one_request = aead_do_one_req,
2598623814c0SHerbert Xu 		},
2599479bcc7cSHerbert Xu 		.caam = {
2600479bcc7cSHerbert Xu 			.class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC,
2601479bcc7cSHerbert Xu 			.class2_alg_type = OP_ALG_ALGSEL_MD5 |
2602479bcc7cSHerbert Xu 					   OP_ALG_AAI_HMAC_PRECOMP,
2603479bcc7cSHerbert Xu 		}
2604479bcc7cSHerbert Xu 	},
2605479bcc7cSHerbert Xu 	{
2606623814c0SHerbert Xu 		.aead.base = {
2607479bcc7cSHerbert Xu 			.base = {
2608479bcc7cSHerbert Xu 				.cra_name = "echainiv(authenc(hmac(md5),"
2609479bcc7cSHerbert Xu 					    "cbc(des3_ede)))",
2610479bcc7cSHerbert Xu 				.cra_driver_name = "echainiv-authenc-hmac-md5-"
2611479bcc7cSHerbert Xu 						   "cbc-des3_ede-caam",
2612479bcc7cSHerbert Xu 				.cra_blocksize = DES3_EDE_BLOCK_SIZE,
2613479bcc7cSHerbert Xu 			},
26141b52c409SHerbert Xu 			.setkey = des3_aead_setkey,
2615479bcc7cSHerbert Xu 			.setauthsize = aead_setauthsize,
2616479bcc7cSHerbert Xu 			.encrypt = aead_encrypt,
26178b18e235SHoria Geantă 			.decrypt = aead_decrypt,
2618479bcc7cSHerbert Xu 			.ivsize = DES3_EDE_BLOCK_SIZE,
2619479bcc7cSHerbert Xu 			.maxauthsize = MD5_DIGEST_SIZE,
2620479bcc7cSHerbert Xu 		},
2621623814c0SHerbert Xu 		.aead.op = {
2622623814c0SHerbert Xu 			.do_one_request = aead_do_one_req,
2623623814c0SHerbert Xu 		},
2624479bcc7cSHerbert Xu 		.caam = {
2625479bcc7cSHerbert Xu 			.class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC,
2626479bcc7cSHerbert Xu 			.class2_alg_type = OP_ALG_ALGSEL_MD5 |
2627479bcc7cSHerbert Xu 					   OP_ALG_AAI_HMAC_PRECOMP,
2628479bcc7cSHerbert Xu 			.geniv = true,
2629479bcc7cSHerbert Xu 		}
2630479bcc7cSHerbert Xu 	},
2631479bcc7cSHerbert Xu 	{
2632623814c0SHerbert Xu 		.aead.base = {
2633479bcc7cSHerbert Xu 			.base = {
2634479bcc7cSHerbert Xu 				.cra_name = "authenc(hmac(sha1),"
2635479bcc7cSHerbert Xu 					    "cbc(des3_ede))",
2636479bcc7cSHerbert Xu 				.cra_driver_name = "authenc-hmac-sha1-"
2637479bcc7cSHerbert Xu 						   "cbc-des3_ede-caam",
2638479bcc7cSHerbert Xu 				.cra_blocksize = DES3_EDE_BLOCK_SIZE,
2639479bcc7cSHerbert Xu 			},
26401b52c409SHerbert Xu 			.setkey = des3_aead_setkey,
2641479bcc7cSHerbert Xu 			.setauthsize = aead_setauthsize,
2642479bcc7cSHerbert Xu 			.encrypt = aead_encrypt,
2643479bcc7cSHerbert Xu 			.decrypt = aead_decrypt,
2644479bcc7cSHerbert Xu 			.ivsize = DES3_EDE_BLOCK_SIZE,
2645479bcc7cSHerbert Xu 			.maxauthsize = SHA1_DIGEST_SIZE,
2646479bcc7cSHerbert Xu 		},
2647623814c0SHerbert Xu 		.aead.op = {
2648623814c0SHerbert Xu 			.do_one_request = aead_do_one_req,
2649623814c0SHerbert Xu 		},
2650479bcc7cSHerbert Xu 		.caam = {
2651479bcc7cSHerbert Xu 			.class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC,
2652479bcc7cSHerbert Xu 			.class2_alg_type = OP_ALG_ALGSEL_SHA1 |
2653479bcc7cSHerbert Xu 					   OP_ALG_AAI_HMAC_PRECOMP,
2654479bcc7cSHerbert Xu 		},
2655479bcc7cSHerbert Xu 	},
2656479bcc7cSHerbert Xu 	{
2657623814c0SHerbert Xu 		.aead.base = {
2658479bcc7cSHerbert Xu 			.base = {
2659479bcc7cSHerbert Xu 				.cra_name = "echainiv(authenc(hmac(sha1),"
2660479bcc7cSHerbert Xu 					    "cbc(des3_ede)))",
2661479bcc7cSHerbert Xu 				.cra_driver_name = "echainiv-authenc-"
2662479bcc7cSHerbert Xu 						   "hmac-sha1-"
2663479bcc7cSHerbert Xu 						   "cbc-des3_ede-caam",
2664479bcc7cSHerbert Xu 				.cra_blocksize = DES3_EDE_BLOCK_SIZE,
2665479bcc7cSHerbert Xu 			},
26661b52c409SHerbert Xu 			.setkey = des3_aead_setkey,
2667479bcc7cSHerbert Xu 			.setauthsize = aead_setauthsize,
2668479bcc7cSHerbert Xu 			.encrypt = aead_encrypt,
26698b18e235SHoria Geantă 			.decrypt = aead_decrypt,
2670479bcc7cSHerbert Xu 			.ivsize = DES3_EDE_BLOCK_SIZE,
2671479bcc7cSHerbert Xu 			.maxauthsize = SHA1_DIGEST_SIZE,
2672479bcc7cSHerbert Xu 		},
2673623814c0SHerbert Xu 		.aead.op = {
2674623814c0SHerbert Xu 			.do_one_request = aead_do_one_req,
2675623814c0SHerbert Xu 		},
2676479bcc7cSHerbert Xu 		.caam = {
2677479bcc7cSHerbert Xu 			.class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC,
2678479bcc7cSHerbert Xu 			.class2_alg_type = OP_ALG_ALGSEL_SHA1 |
2679479bcc7cSHerbert Xu 					   OP_ALG_AAI_HMAC_PRECOMP,
2680479bcc7cSHerbert Xu 			.geniv = true,
2681479bcc7cSHerbert Xu 		},
2682479bcc7cSHerbert Xu 	},
2683479bcc7cSHerbert Xu 	{
2684623814c0SHerbert Xu 		.aead.base = {
2685479bcc7cSHerbert Xu 			.base = {
2686479bcc7cSHerbert Xu 				.cra_name = "authenc(hmac(sha224),"
2687479bcc7cSHerbert Xu 					    "cbc(des3_ede))",
2688479bcc7cSHerbert Xu 				.cra_driver_name = "authenc-hmac-sha224-"
2689479bcc7cSHerbert Xu 						   "cbc-des3_ede-caam",
2690479bcc7cSHerbert Xu 				.cra_blocksize = DES3_EDE_BLOCK_SIZE,
2691479bcc7cSHerbert Xu 			},
26921b52c409SHerbert Xu 			.setkey = des3_aead_setkey,
2693479bcc7cSHerbert Xu 			.setauthsize = aead_setauthsize,
2694479bcc7cSHerbert Xu 			.encrypt = aead_encrypt,
2695479bcc7cSHerbert Xu 			.decrypt = aead_decrypt,
2696479bcc7cSHerbert Xu 			.ivsize = DES3_EDE_BLOCK_SIZE,
2697479bcc7cSHerbert Xu 			.maxauthsize = SHA224_DIGEST_SIZE,
2698479bcc7cSHerbert Xu 		},
2699623814c0SHerbert Xu 		.aead.op = {
2700623814c0SHerbert Xu 			.do_one_request = aead_do_one_req,
2701623814c0SHerbert Xu 		},
2702479bcc7cSHerbert Xu 		.caam = {
2703479bcc7cSHerbert Xu 			.class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC,
2704479bcc7cSHerbert Xu 			.class2_alg_type = OP_ALG_ALGSEL_SHA224 |
2705479bcc7cSHerbert Xu 					   OP_ALG_AAI_HMAC_PRECOMP,
2706479bcc7cSHerbert Xu 		},
2707479bcc7cSHerbert Xu 	},
2708479bcc7cSHerbert Xu 	{
2709623814c0SHerbert Xu 		.aead.base = {
2710479bcc7cSHerbert Xu 			.base = {
2711479bcc7cSHerbert Xu 				.cra_name = "echainiv(authenc(hmac(sha224),"
2712479bcc7cSHerbert Xu 					    "cbc(des3_ede)))",
2713479bcc7cSHerbert Xu 				.cra_driver_name = "echainiv-authenc-"
2714479bcc7cSHerbert Xu 						   "hmac-sha224-"
2715479bcc7cSHerbert Xu 						   "cbc-des3_ede-caam",
2716479bcc7cSHerbert Xu 				.cra_blocksize = DES3_EDE_BLOCK_SIZE,
2717479bcc7cSHerbert Xu 			},
27181b52c409SHerbert Xu 			.setkey = des3_aead_setkey,
2719479bcc7cSHerbert Xu 			.setauthsize = aead_setauthsize,
2720479bcc7cSHerbert Xu 			.encrypt = aead_encrypt,
27218b18e235SHoria Geantă 			.decrypt = aead_decrypt,
2722479bcc7cSHerbert Xu 			.ivsize = DES3_EDE_BLOCK_SIZE,
2723479bcc7cSHerbert Xu 			.maxauthsize = SHA224_DIGEST_SIZE,
2724479bcc7cSHerbert Xu 		},
2725623814c0SHerbert Xu 		.aead.op = {
2726623814c0SHerbert Xu 			.do_one_request = aead_do_one_req,
2727623814c0SHerbert Xu 		},
2728479bcc7cSHerbert Xu 		.caam = {
2729479bcc7cSHerbert Xu 			.class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC,
2730479bcc7cSHerbert Xu 			.class2_alg_type = OP_ALG_ALGSEL_SHA224 |
2731479bcc7cSHerbert Xu 					   OP_ALG_AAI_HMAC_PRECOMP,
2732479bcc7cSHerbert Xu 			.geniv = true,
2733479bcc7cSHerbert Xu 		},
2734479bcc7cSHerbert Xu 	},
2735479bcc7cSHerbert Xu 	{
2736623814c0SHerbert Xu 		.aead.base = {
2737479bcc7cSHerbert Xu 			.base = {
2738479bcc7cSHerbert Xu 				.cra_name = "authenc(hmac(sha256),"
2739479bcc7cSHerbert Xu 					    "cbc(des3_ede))",
2740479bcc7cSHerbert Xu 				.cra_driver_name = "authenc-hmac-sha256-"
2741479bcc7cSHerbert Xu 						   "cbc-des3_ede-caam",
2742479bcc7cSHerbert Xu 				.cra_blocksize = DES3_EDE_BLOCK_SIZE,
2743479bcc7cSHerbert Xu 			},
27441b52c409SHerbert Xu 			.setkey = des3_aead_setkey,
2745479bcc7cSHerbert Xu 			.setauthsize = aead_setauthsize,
2746479bcc7cSHerbert Xu 			.encrypt = aead_encrypt,
2747479bcc7cSHerbert Xu 			.decrypt = aead_decrypt,
2748479bcc7cSHerbert Xu 			.ivsize = DES3_EDE_BLOCK_SIZE,
2749479bcc7cSHerbert Xu 			.maxauthsize = SHA256_DIGEST_SIZE,
2750479bcc7cSHerbert Xu 		},
2751623814c0SHerbert Xu 		.aead.op = {
2752623814c0SHerbert Xu 			.do_one_request = aead_do_one_req,
2753623814c0SHerbert Xu 		},
2754479bcc7cSHerbert Xu 		.caam = {
2755479bcc7cSHerbert Xu 			.class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC,
2756479bcc7cSHerbert Xu 			.class2_alg_type = OP_ALG_ALGSEL_SHA256 |
2757479bcc7cSHerbert Xu 					   OP_ALG_AAI_HMAC_PRECOMP,
2758479bcc7cSHerbert Xu 		},
2759479bcc7cSHerbert Xu 	},
2760479bcc7cSHerbert Xu 	{
2761623814c0SHerbert Xu 		.aead.base = {
2762479bcc7cSHerbert Xu 			.base = {
2763479bcc7cSHerbert Xu 				.cra_name = "echainiv(authenc(hmac(sha256),"
2764479bcc7cSHerbert Xu 					    "cbc(des3_ede)))",
2765479bcc7cSHerbert Xu 				.cra_driver_name = "echainiv-authenc-"
2766479bcc7cSHerbert Xu 						   "hmac-sha256-"
2767479bcc7cSHerbert Xu 						   "cbc-des3_ede-caam",
2768479bcc7cSHerbert Xu 				.cra_blocksize = DES3_EDE_BLOCK_SIZE,
2769479bcc7cSHerbert Xu 			},
27701b52c409SHerbert Xu 			.setkey = des3_aead_setkey,
2771479bcc7cSHerbert Xu 			.setauthsize = aead_setauthsize,
2772479bcc7cSHerbert Xu 			.encrypt = aead_encrypt,
27738b18e235SHoria Geantă 			.decrypt = aead_decrypt,
2774479bcc7cSHerbert Xu 			.ivsize = DES3_EDE_BLOCK_SIZE,
2775479bcc7cSHerbert Xu 			.maxauthsize = SHA256_DIGEST_SIZE,
2776479bcc7cSHerbert Xu 		},
2777623814c0SHerbert Xu 		.aead.op = {
2778623814c0SHerbert Xu 			.do_one_request = aead_do_one_req,
2779623814c0SHerbert Xu 		},
2780479bcc7cSHerbert Xu 		.caam = {
2781479bcc7cSHerbert Xu 			.class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC,
2782479bcc7cSHerbert Xu 			.class2_alg_type = OP_ALG_ALGSEL_SHA256 |
2783479bcc7cSHerbert Xu 					   OP_ALG_AAI_HMAC_PRECOMP,
2784479bcc7cSHerbert Xu 			.geniv = true,
2785479bcc7cSHerbert Xu 		},
2786479bcc7cSHerbert Xu 	},
2787479bcc7cSHerbert Xu 	{
2788623814c0SHerbert Xu 		.aead.base = {
2789479bcc7cSHerbert Xu 			.base = {
2790479bcc7cSHerbert Xu 				.cra_name = "authenc(hmac(sha384),"
2791479bcc7cSHerbert Xu 					    "cbc(des3_ede))",
2792479bcc7cSHerbert Xu 				.cra_driver_name = "authenc-hmac-sha384-"
2793479bcc7cSHerbert Xu 						   "cbc-des3_ede-caam",
2794479bcc7cSHerbert Xu 				.cra_blocksize = DES3_EDE_BLOCK_SIZE,
2795479bcc7cSHerbert Xu 			},
27961b52c409SHerbert Xu 			.setkey = des3_aead_setkey,
2797479bcc7cSHerbert Xu 			.setauthsize = aead_setauthsize,
2798479bcc7cSHerbert Xu 			.encrypt = aead_encrypt,
2799479bcc7cSHerbert Xu 			.decrypt = aead_decrypt,
2800479bcc7cSHerbert Xu 			.ivsize = DES3_EDE_BLOCK_SIZE,
2801479bcc7cSHerbert Xu 			.maxauthsize = SHA384_DIGEST_SIZE,
2802479bcc7cSHerbert Xu 		},
2803623814c0SHerbert Xu 		.aead.op = {
2804623814c0SHerbert Xu 			.do_one_request = aead_do_one_req,
2805623814c0SHerbert Xu 		},
2806479bcc7cSHerbert Xu 		.caam = {
2807479bcc7cSHerbert Xu 			.class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC,
2808479bcc7cSHerbert Xu 			.class2_alg_type = OP_ALG_ALGSEL_SHA384 |
2809479bcc7cSHerbert Xu 					   OP_ALG_AAI_HMAC_PRECOMP,
2810479bcc7cSHerbert Xu 		},
2811479bcc7cSHerbert Xu 	},
2812479bcc7cSHerbert Xu 	{
2813623814c0SHerbert Xu 		.aead.base = {
2814479bcc7cSHerbert Xu 			.base = {
2815479bcc7cSHerbert Xu 				.cra_name = "echainiv(authenc(hmac(sha384),"
2816479bcc7cSHerbert Xu 					    "cbc(des3_ede)))",
2817479bcc7cSHerbert Xu 				.cra_driver_name = "echainiv-authenc-"
2818479bcc7cSHerbert Xu 						   "hmac-sha384-"
2819479bcc7cSHerbert Xu 						   "cbc-des3_ede-caam",
2820479bcc7cSHerbert Xu 				.cra_blocksize = DES3_EDE_BLOCK_SIZE,
2821479bcc7cSHerbert Xu 			},
28221b52c409SHerbert Xu 			.setkey = des3_aead_setkey,
2823479bcc7cSHerbert Xu 			.setauthsize = aead_setauthsize,
2824479bcc7cSHerbert Xu 			.encrypt = aead_encrypt,
28258b18e235SHoria Geantă 			.decrypt = aead_decrypt,
2826479bcc7cSHerbert Xu 			.ivsize = DES3_EDE_BLOCK_SIZE,
2827479bcc7cSHerbert Xu 			.maxauthsize = SHA384_DIGEST_SIZE,
2828479bcc7cSHerbert Xu 		},
2829623814c0SHerbert Xu 		.aead.op = {
2830623814c0SHerbert Xu 			.do_one_request = aead_do_one_req,
2831623814c0SHerbert Xu 		},
2832479bcc7cSHerbert Xu 		.caam = {
2833479bcc7cSHerbert Xu 			.class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC,
2834479bcc7cSHerbert Xu 			.class2_alg_type = OP_ALG_ALGSEL_SHA384 |
2835479bcc7cSHerbert Xu 					   OP_ALG_AAI_HMAC_PRECOMP,
2836479bcc7cSHerbert Xu 			.geniv = true,
2837479bcc7cSHerbert Xu 		},
2838479bcc7cSHerbert Xu 	},
2839479bcc7cSHerbert Xu 	{
2840623814c0SHerbert Xu 		.aead.base = {
2841479bcc7cSHerbert Xu 			.base = {
2842479bcc7cSHerbert Xu 				.cra_name = "authenc(hmac(sha512),"
2843479bcc7cSHerbert Xu 					    "cbc(des3_ede))",
2844479bcc7cSHerbert Xu 				.cra_driver_name = "authenc-hmac-sha512-"
2845479bcc7cSHerbert Xu 						   "cbc-des3_ede-caam",
2846479bcc7cSHerbert Xu 				.cra_blocksize = DES3_EDE_BLOCK_SIZE,
2847479bcc7cSHerbert Xu 			},
28481b52c409SHerbert Xu 			.setkey = des3_aead_setkey,
2849479bcc7cSHerbert Xu 			.setauthsize = aead_setauthsize,
2850479bcc7cSHerbert Xu 			.encrypt = aead_encrypt,
2851479bcc7cSHerbert Xu 			.decrypt = aead_decrypt,
2852479bcc7cSHerbert Xu 			.ivsize = DES3_EDE_BLOCK_SIZE,
2853479bcc7cSHerbert Xu 			.maxauthsize = SHA512_DIGEST_SIZE,
2854479bcc7cSHerbert Xu 		},
2855623814c0SHerbert Xu 		.aead.op = {
2856623814c0SHerbert Xu 			.do_one_request = aead_do_one_req,
2857623814c0SHerbert Xu 		},
2858479bcc7cSHerbert Xu 		.caam = {
2859479bcc7cSHerbert Xu 			.class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC,
2860479bcc7cSHerbert Xu 			.class2_alg_type = OP_ALG_ALGSEL_SHA512 |
2861479bcc7cSHerbert Xu 					   OP_ALG_AAI_HMAC_PRECOMP,
2862479bcc7cSHerbert Xu 		},
2863479bcc7cSHerbert Xu 	},
2864479bcc7cSHerbert Xu 	{
2865623814c0SHerbert Xu 		.aead.base = {
2866479bcc7cSHerbert Xu 			.base = {
2867479bcc7cSHerbert Xu 				.cra_name = "echainiv(authenc(hmac(sha512),"
2868479bcc7cSHerbert Xu 					    "cbc(des3_ede)))",
2869479bcc7cSHerbert Xu 				.cra_driver_name = "echainiv-authenc-"
2870479bcc7cSHerbert Xu 						   "hmac-sha512-"
2871479bcc7cSHerbert Xu 						   "cbc-des3_ede-caam",
2872479bcc7cSHerbert Xu 				.cra_blocksize = DES3_EDE_BLOCK_SIZE,
2873479bcc7cSHerbert Xu 			},
28741b52c409SHerbert Xu 			.setkey = des3_aead_setkey,
2875479bcc7cSHerbert Xu 			.setauthsize = aead_setauthsize,
2876479bcc7cSHerbert Xu 			.encrypt = aead_encrypt,
28778b18e235SHoria Geantă 			.decrypt = aead_decrypt,
2878479bcc7cSHerbert Xu 			.ivsize = DES3_EDE_BLOCK_SIZE,
2879479bcc7cSHerbert Xu 			.maxauthsize = SHA512_DIGEST_SIZE,
2880479bcc7cSHerbert Xu 		},
2881623814c0SHerbert Xu 		.aead.op = {
2882623814c0SHerbert Xu 			.do_one_request = aead_do_one_req,
2883623814c0SHerbert Xu 		},
2884479bcc7cSHerbert Xu 		.caam = {
2885479bcc7cSHerbert Xu 			.class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC,
2886479bcc7cSHerbert Xu 			.class2_alg_type = OP_ALG_ALGSEL_SHA512 |
2887479bcc7cSHerbert Xu 					   OP_ALG_AAI_HMAC_PRECOMP,
2888479bcc7cSHerbert Xu 			.geniv = true,
2889479bcc7cSHerbert Xu 		},
2890479bcc7cSHerbert Xu 	},
2891479bcc7cSHerbert Xu 	{
2892623814c0SHerbert Xu 		.aead.base = {
2893479bcc7cSHerbert Xu 			.base = {
2894479bcc7cSHerbert Xu 				.cra_name = "authenc(hmac(md5),cbc(des))",
2895479bcc7cSHerbert Xu 				.cra_driver_name = "authenc-hmac-md5-"
2896479bcc7cSHerbert Xu 						   "cbc-des-caam",
2897479bcc7cSHerbert Xu 				.cra_blocksize = DES_BLOCK_SIZE,
2898479bcc7cSHerbert Xu 			},
2899479bcc7cSHerbert Xu 			.setkey = aead_setkey,
2900479bcc7cSHerbert Xu 			.setauthsize = aead_setauthsize,
2901479bcc7cSHerbert Xu 			.encrypt = aead_encrypt,
2902479bcc7cSHerbert Xu 			.decrypt = aead_decrypt,
2903479bcc7cSHerbert Xu 			.ivsize = DES_BLOCK_SIZE,
2904479bcc7cSHerbert Xu 			.maxauthsize = MD5_DIGEST_SIZE,
2905479bcc7cSHerbert Xu 		},
2906623814c0SHerbert Xu 		.aead.op = {
2907623814c0SHerbert Xu 			.do_one_request = aead_do_one_req,
2908623814c0SHerbert Xu 		},
2909479bcc7cSHerbert Xu 		.caam = {
2910479bcc7cSHerbert Xu 			.class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC,
2911479bcc7cSHerbert Xu 			.class2_alg_type = OP_ALG_ALGSEL_MD5 |
2912479bcc7cSHerbert Xu 					   OP_ALG_AAI_HMAC_PRECOMP,
2913479bcc7cSHerbert Xu 		},
2914479bcc7cSHerbert Xu 	},
2915479bcc7cSHerbert Xu 	{
2916623814c0SHerbert Xu 		.aead.base = {
2917479bcc7cSHerbert Xu 			.base = {
2918479bcc7cSHerbert Xu 				.cra_name = "echainiv(authenc(hmac(md5),"
2919479bcc7cSHerbert Xu 					    "cbc(des)))",
2920479bcc7cSHerbert Xu 				.cra_driver_name = "echainiv-authenc-hmac-md5-"
2921479bcc7cSHerbert Xu 						   "cbc-des-caam",
2922479bcc7cSHerbert Xu 				.cra_blocksize = DES_BLOCK_SIZE,
2923479bcc7cSHerbert Xu 			},
2924479bcc7cSHerbert Xu 			.setkey = aead_setkey,
2925479bcc7cSHerbert Xu 			.setauthsize = aead_setauthsize,
2926479bcc7cSHerbert Xu 			.encrypt = aead_encrypt,
29278b18e235SHoria Geantă 			.decrypt = aead_decrypt,
2928479bcc7cSHerbert Xu 			.ivsize = DES_BLOCK_SIZE,
2929479bcc7cSHerbert Xu 			.maxauthsize = MD5_DIGEST_SIZE,
2930479bcc7cSHerbert Xu 		},
2931623814c0SHerbert Xu 		.aead.op = {
2932623814c0SHerbert Xu 			.do_one_request = aead_do_one_req,
2933623814c0SHerbert Xu 		},
2934479bcc7cSHerbert Xu 		.caam = {
2935479bcc7cSHerbert Xu 			.class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC,
2936479bcc7cSHerbert Xu 			.class2_alg_type = OP_ALG_ALGSEL_MD5 |
2937479bcc7cSHerbert Xu 					   OP_ALG_AAI_HMAC_PRECOMP,
2938479bcc7cSHerbert Xu 			.geniv = true,
2939479bcc7cSHerbert Xu 		},
2940479bcc7cSHerbert Xu 	},
2941479bcc7cSHerbert Xu 	{
2942623814c0SHerbert Xu 		.aead.base = {
2943479bcc7cSHerbert Xu 			.base = {
2944479bcc7cSHerbert Xu 				.cra_name = "authenc(hmac(sha1),cbc(des))",
2945479bcc7cSHerbert Xu 				.cra_driver_name = "authenc-hmac-sha1-"
2946479bcc7cSHerbert Xu 						   "cbc-des-caam",
2947479bcc7cSHerbert Xu 				.cra_blocksize = DES_BLOCK_SIZE,
2948479bcc7cSHerbert Xu 			},
2949479bcc7cSHerbert Xu 			.setkey = aead_setkey,
2950479bcc7cSHerbert Xu 			.setauthsize = aead_setauthsize,
2951479bcc7cSHerbert Xu 			.encrypt = aead_encrypt,
2952479bcc7cSHerbert Xu 			.decrypt = aead_decrypt,
2953479bcc7cSHerbert Xu 			.ivsize = DES_BLOCK_SIZE,
2954479bcc7cSHerbert Xu 			.maxauthsize = SHA1_DIGEST_SIZE,
2955479bcc7cSHerbert Xu 		},
2956623814c0SHerbert Xu 		.aead.op = {
2957623814c0SHerbert Xu 			.do_one_request = aead_do_one_req,
2958623814c0SHerbert Xu 		},
2959479bcc7cSHerbert Xu 		.caam = {
2960479bcc7cSHerbert Xu 			.class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC,
2961479bcc7cSHerbert Xu 			.class2_alg_type = OP_ALG_ALGSEL_SHA1 |
2962479bcc7cSHerbert Xu 					   OP_ALG_AAI_HMAC_PRECOMP,
2963479bcc7cSHerbert Xu 		},
2964479bcc7cSHerbert Xu 	},
2965479bcc7cSHerbert Xu 	{
2966623814c0SHerbert Xu 		.aead.base = {
2967479bcc7cSHerbert Xu 			.base = {
2968479bcc7cSHerbert Xu 				.cra_name = "echainiv(authenc(hmac(sha1),"
2969479bcc7cSHerbert Xu 					    "cbc(des)))",
2970479bcc7cSHerbert Xu 				.cra_driver_name = "echainiv-authenc-"
2971479bcc7cSHerbert Xu 						   "hmac-sha1-cbc-des-caam",
2972479bcc7cSHerbert Xu 				.cra_blocksize = DES_BLOCK_SIZE,
2973479bcc7cSHerbert Xu 			},
2974479bcc7cSHerbert Xu 			.setkey = aead_setkey,
2975479bcc7cSHerbert Xu 			.setauthsize = aead_setauthsize,
2976479bcc7cSHerbert Xu 			.encrypt = aead_encrypt,
29778b18e235SHoria Geantă 			.decrypt = aead_decrypt,
2978479bcc7cSHerbert Xu 			.ivsize = DES_BLOCK_SIZE,
2979479bcc7cSHerbert Xu 			.maxauthsize = SHA1_DIGEST_SIZE,
2980479bcc7cSHerbert Xu 		},
2981623814c0SHerbert Xu 		.aead.op = {
2982623814c0SHerbert Xu 			.do_one_request = aead_do_one_req,
2983623814c0SHerbert Xu 		},
2984479bcc7cSHerbert Xu 		.caam = {
2985479bcc7cSHerbert Xu 			.class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC,
2986479bcc7cSHerbert Xu 			.class2_alg_type = OP_ALG_ALGSEL_SHA1 |
2987479bcc7cSHerbert Xu 					   OP_ALG_AAI_HMAC_PRECOMP,
2988479bcc7cSHerbert Xu 			.geniv = true,
2989479bcc7cSHerbert Xu 		},
2990479bcc7cSHerbert Xu 	},
2991479bcc7cSHerbert Xu 	{
2992623814c0SHerbert Xu 		.aead.base = {
2993479bcc7cSHerbert Xu 			.base = {
2994479bcc7cSHerbert Xu 				.cra_name = "authenc(hmac(sha224),cbc(des))",
2995479bcc7cSHerbert Xu 				.cra_driver_name = "authenc-hmac-sha224-"
2996479bcc7cSHerbert Xu 						   "cbc-des-caam",
2997479bcc7cSHerbert Xu 				.cra_blocksize = DES_BLOCK_SIZE,
2998479bcc7cSHerbert Xu 			},
2999479bcc7cSHerbert Xu 			.setkey = aead_setkey,
3000479bcc7cSHerbert Xu 			.setauthsize = aead_setauthsize,
3001479bcc7cSHerbert Xu 			.encrypt = aead_encrypt,
3002479bcc7cSHerbert Xu 			.decrypt = aead_decrypt,
3003479bcc7cSHerbert Xu 			.ivsize = DES_BLOCK_SIZE,
3004479bcc7cSHerbert Xu 			.maxauthsize = SHA224_DIGEST_SIZE,
3005479bcc7cSHerbert Xu 		},
3006623814c0SHerbert Xu 		.aead.op = {
3007623814c0SHerbert Xu 			.do_one_request = aead_do_one_req,
3008623814c0SHerbert Xu 		},
3009479bcc7cSHerbert Xu 		.caam = {
3010479bcc7cSHerbert Xu 			.class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC,
3011479bcc7cSHerbert Xu 			.class2_alg_type = OP_ALG_ALGSEL_SHA224 |
3012479bcc7cSHerbert Xu 					   OP_ALG_AAI_HMAC_PRECOMP,
3013479bcc7cSHerbert Xu 		},
3014479bcc7cSHerbert Xu 	},
3015479bcc7cSHerbert Xu 	{
3016623814c0SHerbert Xu 		.aead.base = {
3017479bcc7cSHerbert Xu 			.base = {
3018479bcc7cSHerbert Xu 				.cra_name = "echainiv(authenc(hmac(sha224),"
3019479bcc7cSHerbert Xu 					    "cbc(des)))",
3020479bcc7cSHerbert Xu 				.cra_driver_name = "echainiv-authenc-"
3021479bcc7cSHerbert Xu 						   "hmac-sha224-cbc-des-caam",
3022479bcc7cSHerbert Xu 				.cra_blocksize = DES_BLOCK_SIZE,
3023479bcc7cSHerbert Xu 			},
3024479bcc7cSHerbert Xu 			.setkey = aead_setkey,
3025479bcc7cSHerbert Xu 			.setauthsize = aead_setauthsize,
3026479bcc7cSHerbert Xu 			.encrypt = aead_encrypt,
30278b18e235SHoria Geantă 			.decrypt = aead_decrypt,
3028479bcc7cSHerbert Xu 			.ivsize = DES_BLOCK_SIZE,
3029479bcc7cSHerbert Xu 			.maxauthsize = SHA224_DIGEST_SIZE,
3030479bcc7cSHerbert Xu 		},
3031623814c0SHerbert Xu 		.aead.op = {
3032623814c0SHerbert Xu 			.do_one_request = aead_do_one_req,
3033623814c0SHerbert Xu 		},
3034479bcc7cSHerbert Xu 		.caam = {
3035479bcc7cSHerbert Xu 			.class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC,
3036479bcc7cSHerbert Xu 			.class2_alg_type = OP_ALG_ALGSEL_SHA224 |
3037479bcc7cSHerbert Xu 					   OP_ALG_AAI_HMAC_PRECOMP,
3038479bcc7cSHerbert Xu 			.geniv = true,
3039479bcc7cSHerbert Xu 		},
3040479bcc7cSHerbert Xu 	},
3041479bcc7cSHerbert Xu 	{
3042623814c0SHerbert Xu 		.aead.base = {
3043479bcc7cSHerbert Xu 			.base = {
3044479bcc7cSHerbert Xu 				.cra_name = "authenc(hmac(sha256),cbc(des))",
3045479bcc7cSHerbert Xu 				.cra_driver_name = "authenc-hmac-sha256-"
3046479bcc7cSHerbert Xu 						   "cbc-des-caam",
3047479bcc7cSHerbert Xu 				.cra_blocksize = DES_BLOCK_SIZE,
3048479bcc7cSHerbert Xu 			},
3049479bcc7cSHerbert Xu 			.setkey = aead_setkey,
3050479bcc7cSHerbert Xu 			.setauthsize = aead_setauthsize,
3051479bcc7cSHerbert Xu 			.encrypt = aead_encrypt,
3052479bcc7cSHerbert Xu 			.decrypt = aead_decrypt,
3053479bcc7cSHerbert Xu 			.ivsize = DES_BLOCK_SIZE,
3054479bcc7cSHerbert Xu 			.maxauthsize = SHA256_DIGEST_SIZE,
3055479bcc7cSHerbert Xu 		},
3056623814c0SHerbert Xu 		.aead.op = {
3057623814c0SHerbert Xu 			.do_one_request = aead_do_one_req,
3058623814c0SHerbert Xu 		},
3059479bcc7cSHerbert Xu 		.caam = {
3060479bcc7cSHerbert Xu 			.class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC,
3061479bcc7cSHerbert Xu 			.class2_alg_type = OP_ALG_ALGSEL_SHA256 |
3062479bcc7cSHerbert Xu 					   OP_ALG_AAI_HMAC_PRECOMP,
3063479bcc7cSHerbert Xu 		},
3064479bcc7cSHerbert Xu 	},
3065479bcc7cSHerbert Xu 	{
3066623814c0SHerbert Xu 		.aead.base = {
3067479bcc7cSHerbert Xu 			.base = {
3068479bcc7cSHerbert Xu 				.cra_name = "echainiv(authenc(hmac(sha256),"
3069479bcc7cSHerbert Xu 					    "cbc(des)))",
3070479bcc7cSHerbert Xu 				.cra_driver_name = "echainiv-authenc-"
3071479bcc7cSHerbert Xu 						   "hmac-sha256-cbc-des-caam",
3072479bcc7cSHerbert Xu 				.cra_blocksize = DES_BLOCK_SIZE,
3073479bcc7cSHerbert Xu 			},
3074479bcc7cSHerbert Xu 			.setkey = aead_setkey,
3075479bcc7cSHerbert Xu 			.setauthsize = aead_setauthsize,
3076479bcc7cSHerbert Xu 			.encrypt = aead_encrypt,
30778b18e235SHoria Geantă 			.decrypt = aead_decrypt,
3078479bcc7cSHerbert Xu 			.ivsize = DES_BLOCK_SIZE,
3079479bcc7cSHerbert Xu 			.maxauthsize = SHA256_DIGEST_SIZE,
3080479bcc7cSHerbert Xu 		},
3081623814c0SHerbert Xu 		.aead.op = {
3082623814c0SHerbert Xu 			.do_one_request = aead_do_one_req,
3083623814c0SHerbert Xu 		},
3084479bcc7cSHerbert Xu 		.caam = {
3085479bcc7cSHerbert Xu 			.class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC,
3086479bcc7cSHerbert Xu 			.class2_alg_type = OP_ALG_ALGSEL_SHA256 |
3087479bcc7cSHerbert Xu 					   OP_ALG_AAI_HMAC_PRECOMP,
3088479bcc7cSHerbert Xu 			.geniv = true,
3089479bcc7cSHerbert Xu 		},
3090479bcc7cSHerbert Xu 	},
3091479bcc7cSHerbert Xu 	{
3092623814c0SHerbert Xu 		.aead.base = {
3093479bcc7cSHerbert Xu 			.base = {
3094479bcc7cSHerbert Xu 				.cra_name = "authenc(hmac(sha384),cbc(des))",
3095479bcc7cSHerbert Xu 				.cra_driver_name = "authenc-hmac-sha384-"
3096479bcc7cSHerbert Xu 						   "cbc-des-caam",
3097479bcc7cSHerbert Xu 				.cra_blocksize = DES_BLOCK_SIZE,
3098479bcc7cSHerbert Xu 			},
3099479bcc7cSHerbert Xu 			.setkey = aead_setkey,
3100479bcc7cSHerbert Xu 			.setauthsize = aead_setauthsize,
3101479bcc7cSHerbert Xu 			.encrypt = aead_encrypt,
3102479bcc7cSHerbert Xu 			.decrypt = aead_decrypt,
3103479bcc7cSHerbert Xu 			.ivsize = DES_BLOCK_SIZE,
3104479bcc7cSHerbert Xu 			.maxauthsize = SHA384_DIGEST_SIZE,
3105479bcc7cSHerbert Xu 		},
3106623814c0SHerbert Xu 		.aead.op = {
3107623814c0SHerbert Xu 			.do_one_request = aead_do_one_req,
3108623814c0SHerbert Xu 		},
3109479bcc7cSHerbert Xu 		.caam = {
3110479bcc7cSHerbert Xu 			.class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC,
3111479bcc7cSHerbert Xu 			.class2_alg_type = OP_ALG_ALGSEL_SHA384 |
3112479bcc7cSHerbert Xu 					   OP_ALG_AAI_HMAC_PRECOMP,
3113479bcc7cSHerbert Xu 		},
3114479bcc7cSHerbert Xu 	},
3115479bcc7cSHerbert Xu 	{
3116623814c0SHerbert Xu 		.aead.base = {
3117479bcc7cSHerbert Xu 			.base = {
3118479bcc7cSHerbert Xu 				.cra_name = "echainiv(authenc(hmac(sha384),"
3119479bcc7cSHerbert Xu 					    "cbc(des)))",
3120479bcc7cSHerbert Xu 				.cra_driver_name = "echainiv-authenc-"
3121479bcc7cSHerbert Xu 						   "hmac-sha384-cbc-des-caam",
3122479bcc7cSHerbert Xu 				.cra_blocksize = DES_BLOCK_SIZE,
3123479bcc7cSHerbert Xu 			},
3124479bcc7cSHerbert Xu 			.setkey = aead_setkey,
3125479bcc7cSHerbert Xu 			.setauthsize = aead_setauthsize,
3126479bcc7cSHerbert Xu 			.encrypt = aead_encrypt,
31278b18e235SHoria Geantă 			.decrypt = aead_decrypt,
3128479bcc7cSHerbert Xu 			.ivsize = DES_BLOCK_SIZE,
3129479bcc7cSHerbert Xu 			.maxauthsize = SHA384_DIGEST_SIZE,
3130479bcc7cSHerbert Xu 		},
3131623814c0SHerbert Xu 		.aead.op = {
3132623814c0SHerbert Xu 			.do_one_request = aead_do_one_req,
3133623814c0SHerbert Xu 		},
3134479bcc7cSHerbert Xu 		.caam = {
3135479bcc7cSHerbert Xu 			.class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC,
3136479bcc7cSHerbert Xu 			.class2_alg_type = OP_ALG_ALGSEL_SHA384 |
3137479bcc7cSHerbert Xu 					   OP_ALG_AAI_HMAC_PRECOMP,
3138479bcc7cSHerbert Xu 			.geniv = true,
3139479bcc7cSHerbert Xu 		},
3140479bcc7cSHerbert Xu 	},
3141479bcc7cSHerbert Xu 	{
3142623814c0SHerbert Xu 		.aead.base = {
3143479bcc7cSHerbert Xu 			.base = {
3144479bcc7cSHerbert Xu 				.cra_name = "authenc(hmac(sha512),cbc(des))",
3145479bcc7cSHerbert Xu 				.cra_driver_name = "authenc-hmac-sha512-"
3146479bcc7cSHerbert Xu 						   "cbc-des-caam",
3147479bcc7cSHerbert Xu 				.cra_blocksize = DES_BLOCK_SIZE,
3148479bcc7cSHerbert Xu 			},
3149479bcc7cSHerbert Xu 			.setkey = aead_setkey,
3150479bcc7cSHerbert Xu 			.setauthsize = aead_setauthsize,
3151479bcc7cSHerbert Xu 			.encrypt = aead_encrypt,
3152479bcc7cSHerbert Xu 			.decrypt = aead_decrypt,
3153479bcc7cSHerbert Xu 			.ivsize = DES_BLOCK_SIZE,
3154479bcc7cSHerbert Xu 			.maxauthsize = SHA512_DIGEST_SIZE,
3155479bcc7cSHerbert Xu 		},
3156623814c0SHerbert Xu 		.aead.op = {
3157623814c0SHerbert Xu 			.do_one_request = aead_do_one_req,
3158623814c0SHerbert Xu 		},
3159479bcc7cSHerbert Xu 		.caam = {
3160479bcc7cSHerbert Xu 			.class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC,
3161479bcc7cSHerbert Xu 			.class2_alg_type = OP_ALG_ALGSEL_SHA512 |
3162479bcc7cSHerbert Xu 					   OP_ALG_AAI_HMAC_PRECOMP,
3163479bcc7cSHerbert Xu 		},
3164479bcc7cSHerbert Xu 	},
3165479bcc7cSHerbert Xu 	{
3166623814c0SHerbert Xu 		.aead.base = {
3167479bcc7cSHerbert Xu 			.base = {
3168479bcc7cSHerbert Xu 				.cra_name = "echainiv(authenc(hmac(sha512),"
3169479bcc7cSHerbert Xu 					    "cbc(des)))",
3170479bcc7cSHerbert Xu 				.cra_driver_name = "echainiv-authenc-"
3171479bcc7cSHerbert Xu 						   "hmac-sha512-cbc-des-caam",
3172479bcc7cSHerbert Xu 				.cra_blocksize = DES_BLOCK_SIZE,
3173479bcc7cSHerbert Xu 			},
3174479bcc7cSHerbert Xu 			.setkey = aead_setkey,
3175479bcc7cSHerbert Xu 			.setauthsize = aead_setauthsize,
3176479bcc7cSHerbert Xu 			.encrypt = aead_encrypt,
31778b18e235SHoria Geantă 			.decrypt = aead_decrypt,
3178479bcc7cSHerbert Xu 			.ivsize = DES_BLOCK_SIZE,
3179479bcc7cSHerbert Xu 			.maxauthsize = SHA512_DIGEST_SIZE,
3180479bcc7cSHerbert Xu 		},
3181623814c0SHerbert Xu 		.aead.op = {
3182623814c0SHerbert Xu 			.do_one_request = aead_do_one_req,
3183623814c0SHerbert Xu 		},
3184479bcc7cSHerbert Xu 		.caam = {
3185479bcc7cSHerbert Xu 			.class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC,
3186479bcc7cSHerbert Xu 			.class2_alg_type = OP_ALG_ALGSEL_SHA512 |
3187479bcc7cSHerbert Xu 					   OP_ALG_AAI_HMAC_PRECOMP,
3188479bcc7cSHerbert Xu 			.geniv = true,
3189479bcc7cSHerbert Xu 		},
3190479bcc7cSHerbert Xu 	},
3191479bcc7cSHerbert Xu 	{
3192623814c0SHerbert Xu 		.aead.base = {
3193479bcc7cSHerbert Xu 			.base = {
3194479bcc7cSHerbert Xu 				.cra_name = "authenc(hmac(md5),"
3195479bcc7cSHerbert Xu 					    "rfc3686(ctr(aes)))",
3196479bcc7cSHerbert Xu 				.cra_driver_name = "authenc-hmac-md5-"
3197479bcc7cSHerbert Xu 						   "rfc3686-ctr-aes-caam",
3198479bcc7cSHerbert Xu 				.cra_blocksize = 1,
3199479bcc7cSHerbert Xu 			},
3200479bcc7cSHerbert Xu 			.setkey = aead_setkey,
3201479bcc7cSHerbert Xu 			.setauthsize = aead_setauthsize,
3202479bcc7cSHerbert Xu 			.encrypt = aead_encrypt,
3203479bcc7cSHerbert Xu 			.decrypt = aead_decrypt,
3204479bcc7cSHerbert Xu 			.ivsize = CTR_RFC3686_IV_SIZE,
3205479bcc7cSHerbert Xu 			.maxauthsize = MD5_DIGEST_SIZE,
3206479bcc7cSHerbert Xu 		},
3207623814c0SHerbert Xu 		.aead.op = {
3208623814c0SHerbert Xu 			.do_one_request = aead_do_one_req,
3209623814c0SHerbert Xu 		},
3210479bcc7cSHerbert Xu 		.caam = {
3211479bcc7cSHerbert Xu 			.class1_alg_type = OP_ALG_ALGSEL_AES |
3212479bcc7cSHerbert Xu 					   OP_ALG_AAI_CTR_MOD128,
3213479bcc7cSHerbert Xu 			.class2_alg_type = OP_ALG_ALGSEL_MD5 |
3214479bcc7cSHerbert Xu 					   OP_ALG_AAI_HMAC_PRECOMP,
3215479bcc7cSHerbert Xu 			.rfc3686 = true,
3216479bcc7cSHerbert Xu 		},
3217479bcc7cSHerbert Xu 	},
3218479bcc7cSHerbert Xu 	{
3219623814c0SHerbert Xu 		.aead.base = {
3220479bcc7cSHerbert Xu 			.base = {
3221479bcc7cSHerbert Xu 				.cra_name = "seqiv(authenc("
3222479bcc7cSHerbert Xu 					    "hmac(md5),rfc3686(ctr(aes))))",
3223479bcc7cSHerbert Xu 				.cra_driver_name = "seqiv-authenc-hmac-md5-"
3224479bcc7cSHerbert Xu 						   "rfc3686-ctr-aes-caam",
3225479bcc7cSHerbert Xu 				.cra_blocksize = 1,
3226479bcc7cSHerbert Xu 			},
3227479bcc7cSHerbert Xu 			.setkey = aead_setkey,
3228479bcc7cSHerbert Xu 			.setauthsize = aead_setauthsize,
3229479bcc7cSHerbert Xu 			.encrypt = aead_encrypt,
32308b18e235SHoria Geantă 			.decrypt = aead_decrypt,
3231479bcc7cSHerbert Xu 			.ivsize = CTR_RFC3686_IV_SIZE,
3232479bcc7cSHerbert Xu 			.maxauthsize = MD5_DIGEST_SIZE,
3233479bcc7cSHerbert Xu 		},
3234623814c0SHerbert Xu 		.aead.op = {
3235623814c0SHerbert Xu 			.do_one_request = aead_do_one_req,
3236623814c0SHerbert Xu 		},
3237479bcc7cSHerbert Xu 		.caam = {
3238479bcc7cSHerbert Xu 			.class1_alg_type = OP_ALG_ALGSEL_AES |
3239479bcc7cSHerbert Xu 					   OP_ALG_AAI_CTR_MOD128,
3240479bcc7cSHerbert Xu 			.class2_alg_type = OP_ALG_ALGSEL_MD5 |
3241479bcc7cSHerbert Xu 					   OP_ALG_AAI_HMAC_PRECOMP,
3242479bcc7cSHerbert Xu 			.rfc3686 = true,
3243479bcc7cSHerbert Xu 			.geniv = true,
3244479bcc7cSHerbert Xu 		},
3245479bcc7cSHerbert Xu 	},
3246479bcc7cSHerbert Xu 	{
3247623814c0SHerbert Xu 		.aead.base = {
3248479bcc7cSHerbert Xu 			.base = {
3249479bcc7cSHerbert Xu 				.cra_name = "authenc(hmac(sha1),"
3250479bcc7cSHerbert Xu 					    "rfc3686(ctr(aes)))",
3251479bcc7cSHerbert Xu 				.cra_driver_name = "authenc-hmac-sha1-"
3252479bcc7cSHerbert Xu 						   "rfc3686-ctr-aes-caam",
3253479bcc7cSHerbert Xu 				.cra_blocksize = 1,
3254479bcc7cSHerbert Xu 			},
3255479bcc7cSHerbert Xu 			.setkey = aead_setkey,
3256479bcc7cSHerbert Xu 			.setauthsize = aead_setauthsize,
3257479bcc7cSHerbert Xu 			.encrypt = aead_encrypt,
3258479bcc7cSHerbert Xu 			.decrypt = aead_decrypt,
3259479bcc7cSHerbert Xu 			.ivsize = CTR_RFC3686_IV_SIZE,
3260479bcc7cSHerbert Xu 			.maxauthsize = SHA1_DIGEST_SIZE,
3261479bcc7cSHerbert Xu 		},
3262623814c0SHerbert Xu 		.aead.op = {
3263623814c0SHerbert Xu 			.do_one_request = aead_do_one_req,
3264623814c0SHerbert Xu 		},
3265479bcc7cSHerbert Xu 		.caam = {
3266479bcc7cSHerbert Xu 			.class1_alg_type = OP_ALG_ALGSEL_AES |
3267479bcc7cSHerbert Xu 					   OP_ALG_AAI_CTR_MOD128,
3268479bcc7cSHerbert Xu 			.class2_alg_type = OP_ALG_ALGSEL_SHA1 |
3269479bcc7cSHerbert Xu 					   OP_ALG_AAI_HMAC_PRECOMP,
3270479bcc7cSHerbert Xu 			.rfc3686 = true,
3271479bcc7cSHerbert Xu 		},
3272479bcc7cSHerbert Xu 	},
3273479bcc7cSHerbert Xu 	{
3274623814c0SHerbert Xu 		.aead.base = {
3275479bcc7cSHerbert Xu 			.base = {
3276479bcc7cSHerbert Xu 				.cra_name = "seqiv(authenc("
3277479bcc7cSHerbert Xu 					    "hmac(sha1),rfc3686(ctr(aes))))",
3278479bcc7cSHerbert Xu 				.cra_driver_name = "seqiv-authenc-hmac-sha1-"
3279479bcc7cSHerbert Xu 						   "rfc3686-ctr-aes-caam",
3280479bcc7cSHerbert Xu 				.cra_blocksize = 1,
3281479bcc7cSHerbert Xu 			},
3282479bcc7cSHerbert Xu 			.setkey = aead_setkey,
3283479bcc7cSHerbert Xu 			.setauthsize = aead_setauthsize,
3284479bcc7cSHerbert Xu 			.encrypt = aead_encrypt,
32858b18e235SHoria Geantă 			.decrypt = aead_decrypt,
3286479bcc7cSHerbert Xu 			.ivsize = CTR_RFC3686_IV_SIZE,
3287479bcc7cSHerbert Xu 			.maxauthsize = SHA1_DIGEST_SIZE,
3288479bcc7cSHerbert Xu 		},
3289623814c0SHerbert Xu 		.aead.op = {
3290623814c0SHerbert Xu 			.do_one_request = aead_do_one_req,
3291623814c0SHerbert Xu 		},
3292479bcc7cSHerbert Xu 		.caam = {
3293479bcc7cSHerbert Xu 			.class1_alg_type = OP_ALG_ALGSEL_AES |
3294479bcc7cSHerbert Xu 					   OP_ALG_AAI_CTR_MOD128,
3295479bcc7cSHerbert Xu 			.class2_alg_type = OP_ALG_ALGSEL_SHA1 |
3296479bcc7cSHerbert Xu 					   OP_ALG_AAI_HMAC_PRECOMP,
3297479bcc7cSHerbert Xu 			.rfc3686 = true,
3298479bcc7cSHerbert Xu 			.geniv = true,
3299479bcc7cSHerbert Xu 		},
3300479bcc7cSHerbert Xu 	},
3301479bcc7cSHerbert Xu 	{
3302623814c0SHerbert Xu 		.aead.base = {
3303479bcc7cSHerbert Xu 			.base = {
3304479bcc7cSHerbert Xu 				.cra_name = "authenc(hmac(sha224),"
3305479bcc7cSHerbert Xu 					    "rfc3686(ctr(aes)))",
3306479bcc7cSHerbert Xu 				.cra_driver_name = "authenc-hmac-sha224-"
3307479bcc7cSHerbert Xu 						   "rfc3686-ctr-aes-caam",
3308479bcc7cSHerbert Xu 				.cra_blocksize = 1,
3309479bcc7cSHerbert Xu 			},
3310479bcc7cSHerbert Xu 			.setkey = aead_setkey,
3311479bcc7cSHerbert Xu 			.setauthsize = aead_setauthsize,
3312479bcc7cSHerbert Xu 			.encrypt = aead_encrypt,
3313479bcc7cSHerbert Xu 			.decrypt = aead_decrypt,
3314479bcc7cSHerbert Xu 			.ivsize = CTR_RFC3686_IV_SIZE,
3315479bcc7cSHerbert Xu 			.maxauthsize = SHA224_DIGEST_SIZE,
3316479bcc7cSHerbert Xu 		},
3317623814c0SHerbert Xu 		.aead.op = {
3318623814c0SHerbert Xu 			.do_one_request = aead_do_one_req,
3319623814c0SHerbert Xu 		},
3320479bcc7cSHerbert Xu 		.caam = {
3321479bcc7cSHerbert Xu 			.class1_alg_type = OP_ALG_ALGSEL_AES |
3322479bcc7cSHerbert Xu 					   OP_ALG_AAI_CTR_MOD128,
3323479bcc7cSHerbert Xu 			.class2_alg_type = OP_ALG_ALGSEL_SHA224 |
3324479bcc7cSHerbert Xu 					   OP_ALG_AAI_HMAC_PRECOMP,
3325479bcc7cSHerbert Xu 			.rfc3686 = true,
3326479bcc7cSHerbert Xu 		},
3327479bcc7cSHerbert Xu 	},
3328479bcc7cSHerbert Xu 	{
3329623814c0SHerbert Xu 		.aead.base = {
3330479bcc7cSHerbert Xu 			.base = {
3331479bcc7cSHerbert Xu 				.cra_name = "seqiv(authenc("
3332479bcc7cSHerbert Xu 					    "hmac(sha224),rfc3686(ctr(aes))))",
3333479bcc7cSHerbert Xu 				.cra_driver_name = "seqiv-authenc-hmac-sha224-"
3334479bcc7cSHerbert Xu 						   "rfc3686-ctr-aes-caam",
3335479bcc7cSHerbert Xu 				.cra_blocksize = 1,
3336479bcc7cSHerbert Xu 			},
3337479bcc7cSHerbert Xu 			.setkey = aead_setkey,
3338479bcc7cSHerbert Xu 			.setauthsize = aead_setauthsize,
3339479bcc7cSHerbert Xu 			.encrypt = aead_encrypt,
33408b18e235SHoria Geantă 			.decrypt = aead_decrypt,
3341479bcc7cSHerbert Xu 			.ivsize = CTR_RFC3686_IV_SIZE,
3342479bcc7cSHerbert Xu 			.maxauthsize = SHA224_DIGEST_SIZE,
3343479bcc7cSHerbert Xu 		},
3344623814c0SHerbert Xu 		.aead.op = {
3345623814c0SHerbert Xu 			.do_one_request = aead_do_one_req,
3346623814c0SHerbert Xu 		},
3347479bcc7cSHerbert Xu 		.caam = {
3348479bcc7cSHerbert Xu 			.class1_alg_type = OP_ALG_ALGSEL_AES |
3349479bcc7cSHerbert Xu 					   OP_ALG_AAI_CTR_MOD128,
3350479bcc7cSHerbert Xu 			.class2_alg_type = OP_ALG_ALGSEL_SHA224 |
3351479bcc7cSHerbert Xu 					   OP_ALG_AAI_HMAC_PRECOMP,
3352479bcc7cSHerbert Xu 			.rfc3686 = true,
3353479bcc7cSHerbert Xu 			.geniv = true,
3354479bcc7cSHerbert Xu 		},
3355479bcc7cSHerbert Xu 	},
3356479bcc7cSHerbert Xu 	{
3357623814c0SHerbert Xu 		.aead.base = {
3358479bcc7cSHerbert Xu 			.base = {
3359479bcc7cSHerbert Xu 				.cra_name = "authenc(hmac(sha256),"
3360479bcc7cSHerbert Xu 					    "rfc3686(ctr(aes)))",
3361479bcc7cSHerbert Xu 				.cra_driver_name = "authenc-hmac-sha256-"
3362479bcc7cSHerbert Xu 						   "rfc3686-ctr-aes-caam",
3363479bcc7cSHerbert Xu 				.cra_blocksize = 1,
3364479bcc7cSHerbert Xu 			},
3365479bcc7cSHerbert Xu 			.setkey = aead_setkey,
3366479bcc7cSHerbert Xu 			.setauthsize = aead_setauthsize,
3367479bcc7cSHerbert Xu 			.encrypt = aead_encrypt,
3368479bcc7cSHerbert Xu 			.decrypt = aead_decrypt,
3369479bcc7cSHerbert Xu 			.ivsize = CTR_RFC3686_IV_SIZE,
3370479bcc7cSHerbert Xu 			.maxauthsize = SHA256_DIGEST_SIZE,
3371479bcc7cSHerbert Xu 		},
3372623814c0SHerbert Xu 		.aead.op = {
3373623814c0SHerbert Xu 			.do_one_request = aead_do_one_req,
3374623814c0SHerbert Xu 		},
3375479bcc7cSHerbert Xu 		.caam = {
3376479bcc7cSHerbert Xu 			.class1_alg_type = OP_ALG_ALGSEL_AES |
3377479bcc7cSHerbert Xu 					   OP_ALG_AAI_CTR_MOD128,
3378479bcc7cSHerbert Xu 			.class2_alg_type = OP_ALG_ALGSEL_SHA256 |
3379479bcc7cSHerbert Xu 					   OP_ALG_AAI_HMAC_PRECOMP,
3380479bcc7cSHerbert Xu 			.rfc3686 = true,
3381479bcc7cSHerbert Xu 		},
3382479bcc7cSHerbert Xu 	},
3383479bcc7cSHerbert Xu 	{
3384623814c0SHerbert Xu 		.aead.base = {
3385479bcc7cSHerbert Xu 			.base = {
3386479bcc7cSHerbert Xu 				.cra_name = "seqiv(authenc(hmac(sha256),"
3387479bcc7cSHerbert Xu 					    "rfc3686(ctr(aes))))",
3388479bcc7cSHerbert Xu 				.cra_driver_name = "seqiv-authenc-hmac-sha256-"
3389479bcc7cSHerbert Xu 						   "rfc3686-ctr-aes-caam",
3390479bcc7cSHerbert Xu 				.cra_blocksize = 1,
3391479bcc7cSHerbert Xu 			},
3392479bcc7cSHerbert Xu 			.setkey = aead_setkey,
3393479bcc7cSHerbert Xu 			.setauthsize = aead_setauthsize,
3394479bcc7cSHerbert Xu 			.encrypt = aead_encrypt,
33958b18e235SHoria Geantă 			.decrypt = aead_decrypt,
3396479bcc7cSHerbert Xu 			.ivsize = CTR_RFC3686_IV_SIZE,
3397479bcc7cSHerbert Xu 			.maxauthsize = SHA256_DIGEST_SIZE,
3398479bcc7cSHerbert Xu 		},
3399623814c0SHerbert Xu 		.aead.op = {
3400623814c0SHerbert Xu 			.do_one_request = aead_do_one_req,
3401623814c0SHerbert Xu 		},
3402479bcc7cSHerbert Xu 		.caam = {
3403479bcc7cSHerbert Xu 			.class1_alg_type = OP_ALG_ALGSEL_AES |
3404479bcc7cSHerbert Xu 					   OP_ALG_AAI_CTR_MOD128,
3405479bcc7cSHerbert Xu 			.class2_alg_type = OP_ALG_ALGSEL_SHA256 |
3406479bcc7cSHerbert Xu 					   OP_ALG_AAI_HMAC_PRECOMP,
3407479bcc7cSHerbert Xu 			.rfc3686 = true,
3408479bcc7cSHerbert Xu 			.geniv = true,
3409479bcc7cSHerbert Xu 		},
3410479bcc7cSHerbert Xu 	},
3411479bcc7cSHerbert Xu 	{
3412623814c0SHerbert Xu 		.aead.base = {
3413479bcc7cSHerbert Xu 			.base = {
3414479bcc7cSHerbert Xu 				.cra_name = "authenc(hmac(sha384),"
3415479bcc7cSHerbert Xu 					    "rfc3686(ctr(aes)))",
3416479bcc7cSHerbert Xu 				.cra_driver_name = "authenc-hmac-sha384-"
3417479bcc7cSHerbert Xu 						   "rfc3686-ctr-aes-caam",
3418479bcc7cSHerbert Xu 				.cra_blocksize = 1,
3419479bcc7cSHerbert Xu 			},
3420479bcc7cSHerbert Xu 			.setkey = aead_setkey,
3421479bcc7cSHerbert Xu 			.setauthsize = aead_setauthsize,
3422479bcc7cSHerbert Xu 			.encrypt = aead_encrypt,
3423479bcc7cSHerbert Xu 			.decrypt = aead_decrypt,
3424479bcc7cSHerbert Xu 			.ivsize = CTR_RFC3686_IV_SIZE,
3425479bcc7cSHerbert Xu 			.maxauthsize = SHA384_DIGEST_SIZE,
3426479bcc7cSHerbert Xu 		},
3427623814c0SHerbert Xu 		.aead.op = {
3428623814c0SHerbert Xu 			.do_one_request = aead_do_one_req,
3429623814c0SHerbert Xu 		},
3430479bcc7cSHerbert Xu 		.caam = {
3431479bcc7cSHerbert Xu 			.class1_alg_type = OP_ALG_ALGSEL_AES |
3432479bcc7cSHerbert Xu 					   OP_ALG_AAI_CTR_MOD128,
3433479bcc7cSHerbert Xu 			.class2_alg_type = OP_ALG_ALGSEL_SHA384 |
3434479bcc7cSHerbert Xu 					   OP_ALG_AAI_HMAC_PRECOMP,
3435479bcc7cSHerbert Xu 			.rfc3686 = true,
3436479bcc7cSHerbert Xu 		},
3437479bcc7cSHerbert Xu 	},
3438479bcc7cSHerbert Xu 	{
3439623814c0SHerbert Xu 		.aead.base = {
3440479bcc7cSHerbert Xu 			.base = {
3441479bcc7cSHerbert Xu 				.cra_name = "seqiv(authenc(hmac(sha384),"
3442479bcc7cSHerbert Xu 					    "rfc3686(ctr(aes))))",
3443479bcc7cSHerbert Xu 				.cra_driver_name = "seqiv-authenc-hmac-sha384-"
3444479bcc7cSHerbert Xu 						   "rfc3686-ctr-aes-caam",
3445479bcc7cSHerbert Xu 				.cra_blocksize = 1,
3446479bcc7cSHerbert Xu 			},
3447479bcc7cSHerbert Xu 			.setkey = aead_setkey,
3448479bcc7cSHerbert Xu 			.setauthsize = aead_setauthsize,
3449479bcc7cSHerbert Xu 			.encrypt = aead_encrypt,
34508b18e235SHoria Geantă 			.decrypt = aead_decrypt,
3451479bcc7cSHerbert Xu 			.ivsize = CTR_RFC3686_IV_SIZE,
3452479bcc7cSHerbert Xu 			.maxauthsize = SHA384_DIGEST_SIZE,
3453479bcc7cSHerbert Xu 		},
3454623814c0SHerbert Xu 		.aead.op = {
3455623814c0SHerbert Xu 			.do_one_request = aead_do_one_req,
3456623814c0SHerbert Xu 		},
3457479bcc7cSHerbert Xu 		.caam = {
3458479bcc7cSHerbert Xu 			.class1_alg_type = OP_ALG_ALGSEL_AES |
3459479bcc7cSHerbert Xu 					   OP_ALG_AAI_CTR_MOD128,
3460479bcc7cSHerbert Xu 			.class2_alg_type = OP_ALG_ALGSEL_SHA384 |
3461479bcc7cSHerbert Xu 					   OP_ALG_AAI_HMAC_PRECOMP,
3462479bcc7cSHerbert Xu 			.rfc3686 = true,
3463479bcc7cSHerbert Xu 			.geniv = true,
3464479bcc7cSHerbert Xu 		},
3465479bcc7cSHerbert Xu 	},
3466479bcc7cSHerbert Xu 	{
3467623814c0SHerbert Xu 		.aead.base = {
3468479bcc7cSHerbert Xu 			.base = {
3469479bcc7cSHerbert Xu 				.cra_name = "authenc(hmac(sha512),"
3470479bcc7cSHerbert Xu 					    "rfc3686(ctr(aes)))",
3471479bcc7cSHerbert Xu 				.cra_driver_name = "authenc-hmac-sha512-"
3472479bcc7cSHerbert Xu 						   "rfc3686-ctr-aes-caam",
3473479bcc7cSHerbert Xu 				.cra_blocksize = 1,
3474479bcc7cSHerbert Xu 			},
3475479bcc7cSHerbert Xu 			.setkey = aead_setkey,
3476479bcc7cSHerbert Xu 			.setauthsize = aead_setauthsize,
3477479bcc7cSHerbert Xu 			.encrypt = aead_encrypt,
3478479bcc7cSHerbert Xu 			.decrypt = aead_decrypt,
3479479bcc7cSHerbert Xu 			.ivsize = CTR_RFC3686_IV_SIZE,
3480479bcc7cSHerbert Xu 			.maxauthsize = SHA512_DIGEST_SIZE,
3481479bcc7cSHerbert Xu 		},
3482623814c0SHerbert Xu 		.aead.op = {
3483623814c0SHerbert Xu 			.do_one_request = aead_do_one_req,
3484623814c0SHerbert Xu 		},
3485479bcc7cSHerbert Xu 		.caam = {
3486479bcc7cSHerbert Xu 			.class1_alg_type = OP_ALG_ALGSEL_AES |
3487479bcc7cSHerbert Xu 					   OP_ALG_AAI_CTR_MOD128,
3488479bcc7cSHerbert Xu 			.class2_alg_type = OP_ALG_ALGSEL_SHA512 |
3489479bcc7cSHerbert Xu 					   OP_ALG_AAI_HMAC_PRECOMP,
3490479bcc7cSHerbert Xu 			.rfc3686 = true,
3491479bcc7cSHerbert Xu 		},
3492479bcc7cSHerbert Xu 	},
3493479bcc7cSHerbert Xu 	{
3494623814c0SHerbert Xu 		.aead.base = {
3495479bcc7cSHerbert Xu 			.base = {
3496479bcc7cSHerbert Xu 				.cra_name = "seqiv(authenc(hmac(sha512),"
3497479bcc7cSHerbert Xu 					    "rfc3686(ctr(aes))))",
3498479bcc7cSHerbert Xu 				.cra_driver_name = "seqiv-authenc-hmac-sha512-"
3499479bcc7cSHerbert Xu 						   "rfc3686-ctr-aes-caam",
3500479bcc7cSHerbert Xu 				.cra_blocksize = 1,
3501479bcc7cSHerbert Xu 			},
3502479bcc7cSHerbert Xu 			.setkey = aead_setkey,
3503479bcc7cSHerbert Xu 			.setauthsize = aead_setauthsize,
3504479bcc7cSHerbert Xu 			.encrypt = aead_encrypt,
35058b18e235SHoria Geantă 			.decrypt = aead_decrypt,
3506479bcc7cSHerbert Xu 			.ivsize = CTR_RFC3686_IV_SIZE,
3507479bcc7cSHerbert Xu 			.maxauthsize = SHA512_DIGEST_SIZE,
3508479bcc7cSHerbert Xu 		},
3509623814c0SHerbert Xu 		.aead.op = {
3510623814c0SHerbert Xu 			.do_one_request = aead_do_one_req,
3511623814c0SHerbert Xu 		},
3512479bcc7cSHerbert Xu 		.caam = {
3513479bcc7cSHerbert Xu 			.class1_alg_type = OP_ALG_ALGSEL_AES |
3514479bcc7cSHerbert Xu 					   OP_ALG_AAI_CTR_MOD128,
3515479bcc7cSHerbert Xu 			.class2_alg_type = OP_ALG_ALGSEL_SHA512 |
3516479bcc7cSHerbert Xu 					   OP_ALG_AAI_HMAC_PRECOMP,
3517479bcc7cSHerbert Xu 			.rfc3686 = true,
3518479bcc7cSHerbert Xu 			.geniv = true,
3519479bcc7cSHerbert Xu 		},
3520479bcc7cSHerbert Xu 	},
3521d6bbd4eeSHoria Geantă 	{
3522623814c0SHerbert Xu 		.aead.base = {
3523d6bbd4eeSHoria Geantă 			.base = {
3524d6bbd4eeSHoria Geantă 				.cra_name = "rfc7539(chacha20,poly1305)",
3525d6bbd4eeSHoria Geantă 				.cra_driver_name = "rfc7539-chacha20-poly1305-"
3526d6bbd4eeSHoria Geantă 						   "caam",
3527d6bbd4eeSHoria Geantă 				.cra_blocksize = 1,
3528d6bbd4eeSHoria Geantă 			},
3529d6bbd4eeSHoria Geantă 			.setkey = chachapoly_setkey,
3530d6bbd4eeSHoria Geantă 			.setauthsize = chachapoly_setauthsize,
3531d6bbd4eeSHoria Geantă 			.encrypt = chachapoly_encrypt,
3532d6bbd4eeSHoria Geantă 			.decrypt = chachapoly_decrypt,
3533d6bbd4eeSHoria Geantă 			.ivsize = CHACHAPOLY_IV_SIZE,
3534d6bbd4eeSHoria Geantă 			.maxauthsize = POLY1305_DIGEST_SIZE,
3535d6bbd4eeSHoria Geantă 		},
3536623814c0SHerbert Xu 		.aead.op = {
3537623814c0SHerbert Xu 			.do_one_request = aead_do_one_req,
3538623814c0SHerbert Xu 		},
3539d6bbd4eeSHoria Geantă 		.caam = {
3540d6bbd4eeSHoria Geantă 			.class1_alg_type = OP_ALG_ALGSEL_CHACHA20 |
3541d6bbd4eeSHoria Geantă 					   OP_ALG_AAI_AEAD,
3542d6bbd4eeSHoria Geantă 			.class2_alg_type = OP_ALG_ALGSEL_POLY1305 |
3543d6bbd4eeSHoria Geantă 					   OP_ALG_AAI_AEAD,
354424586b5fSHerbert Xu 			.nodkp = true,
3545d6bbd4eeSHoria Geantă 		},
3546d6bbd4eeSHoria Geantă 	},
3547d6bbd4eeSHoria Geantă 	{
3548623814c0SHerbert Xu 		.aead.base = {
3549d6bbd4eeSHoria Geantă 			.base = {
3550d6bbd4eeSHoria Geantă 				.cra_name = "rfc7539esp(chacha20,poly1305)",
3551d6bbd4eeSHoria Geantă 				.cra_driver_name = "rfc7539esp-chacha20-"
3552d6bbd4eeSHoria Geantă 						   "poly1305-caam",
3553d6bbd4eeSHoria Geantă 				.cra_blocksize = 1,
3554d6bbd4eeSHoria Geantă 			},
3555d6bbd4eeSHoria Geantă 			.setkey = chachapoly_setkey,
3556d6bbd4eeSHoria Geantă 			.setauthsize = chachapoly_setauthsize,
3557d6bbd4eeSHoria Geantă 			.encrypt = chachapoly_encrypt,
3558d6bbd4eeSHoria Geantă 			.decrypt = chachapoly_decrypt,
3559d6bbd4eeSHoria Geantă 			.ivsize = 8,
3560d6bbd4eeSHoria Geantă 			.maxauthsize = POLY1305_DIGEST_SIZE,
3561d6bbd4eeSHoria Geantă 		},
3562623814c0SHerbert Xu 		.aead.op = {
3563623814c0SHerbert Xu 			.do_one_request = aead_do_one_req,
3564623814c0SHerbert Xu 		},
3565d6bbd4eeSHoria Geantă 		.caam = {
3566d6bbd4eeSHoria Geantă 			.class1_alg_type = OP_ALG_ALGSEL_CHACHA20 |
3567d6bbd4eeSHoria Geantă 					   OP_ALG_AAI_AEAD,
3568d6bbd4eeSHoria Geantă 			.class2_alg_type = OP_ALG_ALGSEL_POLY1305 |
3569d6bbd4eeSHoria Geantă 					   OP_ALG_AAI_AEAD,
357024586b5fSHerbert Xu 			.nodkp = true,
3571d6bbd4eeSHoria Geantă 		},
3572d6bbd4eeSHoria Geantă 	},
3573f2147b88SHerbert Xu };
3574f2147b88SHerbert Xu 
caam_init_common(struct caam_ctx * ctx,struct caam_alg_entry * caam,bool uses_dkp)35757e0880b9SHoria Geantă static int caam_init_common(struct caam_ctx *ctx, struct caam_alg_entry *caam,
35767e0880b9SHoria Geantă 			    bool uses_dkp)
3577f2147b88SHerbert Xu {
3578bbf22344SHoria Geantă 	dma_addr_t dma_addr;
35797e0880b9SHoria Geantă 	struct caam_drv_private *priv;
3580ee38767fSIuliana Prodan 	const size_t sh_desc_enc_offset = offsetof(struct caam_ctx,
3581ee38767fSIuliana Prodan 						   sh_desc_enc);
3582bbf22344SHoria Geantă 
3583f2147b88SHerbert Xu 	ctx->jrdev = caam_jr_alloc();
3584f2147b88SHerbert Xu 	if (IS_ERR(ctx->jrdev)) {
3585f2147b88SHerbert Xu 		pr_err("Job Ring Device allocation for transform failed\n");
3586f2147b88SHerbert Xu 		return PTR_ERR(ctx->jrdev);
3587f2147b88SHerbert Xu 	}
3588f2147b88SHerbert Xu 
35897e0880b9SHoria Geantă 	priv = dev_get_drvdata(ctx->jrdev->parent);
35907e0880b9SHoria Geantă 	if (priv->era >= 6 && uses_dkp)
35917e0880b9SHoria Geantă 		ctx->dir = DMA_BIDIRECTIONAL;
35927e0880b9SHoria Geantă 	else
35937e0880b9SHoria Geantă 		ctx->dir = DMA_TO_DEVICE;
35947e0880b9SHoria Geantă 
3595bbf22344SHoria Geantă 	dma_addr = dma_map_single_attrs(ctx->jrdev, ctx->sh_desc_enc,
3596bbf22344SHoria Geantă 					offsetof(struct caam_ctx,
3597ee38767fSIuliana Prodan 						 sh_desc_enc_dma) -
3598ee38767fSIuliana Prodan 					sh_desc_enc_offset,
35997e0880b9SHoria Geantă 					ctx->dir, DMA_ATTR_SKIP_CPU_SYNC);
3600bbf22344SHoria Geantă 	if (dma_mapping_error(ctx->jrdev, dma_addr)) {
3601bbf22344SHoria Geantă 		dev_err(ctx->jrdev, "unable to map key, shared descriptors\n");
3602bbf22344SHoria Geantă 		caam_jr_free(ctx->jrdev);
3603bbf22344SHoria Geantă 		return -ENOMEM;
3604bbf22344SHoria Geantă 	}
3605bbf22344SHoria Geantă 
3606bbf22344SHoria Geantă 	ctx->sh_desc_enc_dma = dma_addr;
3607bbf22344SHoria Geantă 	ctx->sh_desc_dec_dma = dma_addr + offsetof(struct caam_ctx,
3608ee38767fSIuliana Prodan 						   sh_desc_dec) -
3609ee38767fSIuliana Prodan 					sh_desc_enc_offset;
3610ee38767fSIuliana Prodan 	ctx->key_dma = dma_addr + offsetof(struct caam_ctx, key) -
3611ee38767fSIuliana Prodan 					sh_desc_enc_offset;
3612bbf22344SHoria Geantă 
3613f2147b88SHerbert Xu 	/* copy descriptor header template value */
3614db57656bSHoria Geantă 	ctx->cdata.algtype = OP_TYPE_CLASS1_ALG | caam->class1_alg_type;
3615db57656bSHoria Geantă 	ctx->adata.algtype = OP_TYPE_CLASS2_ALG | caam->class2_alg_type;
3616f2147b88SHerbert Xu 
3617f2147b88SHerbert Xu 	return 0;
3618f2147b88SHerbert Xu }
3619f2147b88SHerbert Xu 
caam_cra_init(struct crypto_skcipher * tfm)36205ca7badbSHoria Geantă static int caam_cra_init(struct crypto_skcipher *tfm)
36218e8ec596SKim Phillips {
36225ca7badbSHoria Geantă 	struct skcipher_alg *alg = crypto_skcipher_alg(tfm);
36235ca7badbSHoria Geantă 	struct caam_skcipher_alg *caam_alg =
3624623814c0SHerbert Xu 		container_of(alg, typeof(*caam_alg), skcipher.base);
36254cb4f7c1SHerbert Xu 	struct caam_ctx *ctx = crypto_skcipher_ctx_dma(tfm);
36269d9b14dbSAndrei Botila 	u32 alg_aai = caam_alg->caam.class1_alg_type & OP_ALG_AAI_MASK;
36279d9b14dbSAndrei Botila 	int ret = 0;
3628ee38767fSIuliana Prodan 
36299d9b14dbSAndrei Botila 	if (alg_aai == OP_ALG_AAI_XTS) {
36309d9b14dbSAndrei Botila 		const char *tfm_name = crypto_tfm_alg_name(&tfm->base);
36319d9b14dbSAndrei Botila 		struct crypto_skcipher *fallback;
36329d9b14dbSAndrei Botila 
36339d9b14dbSAndrei Botila 		fallback = crypto_alloc_skcipher(tfm_name, 0,
36349d9b14dbSAndrei Botila 						 CRYPTO_ALG_NEED_FALLBACK);
36359d9b14dbSAndrei Botila 		if (IS_ERR(fallback)) {
3636ab95bd2aSHoria Geantă 			pr_err("Failed to allocate %s fallback: %ld\n",
36379d9b14dbSAndrei Botila 			       tfm_name, PTR_ERR(fallback));
36389d9b14dbSAndrei Botila 			return PTR_ERR(fallback);
36399d9b14dbSAndrei Botila 		}
36409d9b14dbSAndrei Botila 
36419d9b14dbSAndrei Botila 		ctx->fallback = fallback;
36429d9b14dbSAndrei Botila 		crypto_skcipher_set_reqsize(tfm, sizeof(struct caam_skcipher_req_ctx) +
36439d9b14dbSAndrei Botila 					    crypto_skcipher_reqsize(fallback));
36449d9b14dbSAndrei Botila 	} else {
36459d9b14dbSAndrei Botila 		crypto_skcipher_set_reqsize(tfm, sizeof(struct caam_skcipher_req_ctx));
36469d9b14dbSAndrei Botila 	}
36479d9b14dbSAndrei Botila 
36489d9b14dbSAndrei Botila 	ret = caam_init_common(ctx, &caam_alg->caam, false);
36499d9b14dbSAndrei Botila 	if (ret && ctx->fallback)
36509d9b14dbSAndrei Botila 		crypto_free_skcipher(ctx->fallback);
36519d9b14dbSAndrei Botila 
36529d9b14dbSAndrei Botila 	return ret;
3653cfc6f11bSRuchika Gupta }
36548e8ec596SKim Phillips 
caam_aead_init(struct crypto_aead * tfm)3655f2147b88SHerbert Xu static int caam_aead_init(struct crypto_aead *tfm)
36568e8ec596SKim Phillips {
3657f2147b88SHerbert Xu 	struct aead_alg *alg = crypto_aead_alg(tfm);
3658f2147b88SHerbert Xu 	struct caam_aead_alg *caam_alg =
3659623814c0SHerbert Xu 		 container_of(alg, struct caam_aead_alg, aead.base);
36604cb4f7c1SHerbert Xu 	struct caam_ctx *ctx = crypto_aead_ctx_dma(tfm);
36618e8ec596SKim Phillips 
36621c240226SIuliana Prodan 	crypto_aead_set_reqsize(tfm, sizeof(struct caam_aead_req_ctx));
36631c240226SIuliana Prodan 
366424586b5fSHerbert Xu 	return caam_init_common(ctx, &caam_alg->caam, !caam_alg->caam.nodkp);
3665f2147b88SHerbert Xu }
3666f2147b88SHerbert Xu 
caam_exit_common(struct caam_ctx * ctx)3667f2147b88SHerbert Xu static void caam_exit_common(struct caam_ctx *ctx)
3668f2147b88SHerbert Xu {
3669bbf22344SHoria Geantă 	dma_unmap_single_attrs(ctx->jrdev, ctx->sh_desc_enc_dma,
3670ee38767fSIuliana Prodan 			       offsetof(struct caam_ctx, sh_desc_enc_dma) -
3671ee38767fSIuliana Prodan 			       offsetof(struct caam_ctx, sh_desc_enc),
36727e0880b9SHoria Geantă 			       ctx->dir, DMA_ATTR_SKIP_CPU_SYNC);
3673cfc6f11bSRuchika Gupta 	caam_jr_free(ctx->jrdev);
36748e8ec596SKim Phillips }
36758e8ec596SKim Phillips 
caam_cra_exit(struct crypto_skcipher * tfm)36765ca7badbSHoria Geantă static void caam_cra_exit(struct crypto_skcipher *tfm)
3677f2147b88SHerbert Xu {
36784cb4f7c1SHerbert Xu 	struct caam_ctx *ctx = crypto_skcipher_ctx_dma(tfm);
36799d9b14dbSAndrei Botila 
36809d9b14dbSAndrei Botila 	if (ctx->fallback)
36819d9b14dbSAndrei Botila 		crypto_free_skcipher(ctx->fallback);
36829d9b14dbSAndrei Botila 	caam_exit_common(ctx);
3683f2147b88SHerbert Xu }
3684f2147b88SHerbert Xu 
caam_aead_exit(struct crypto_aead * tfm)3685f2147b88SHerbert Xu static void caam_aead_exit(struct crypto_aead *tfm)
3686f2147b88SHerbert Xu {
36874cb4f7c1SHerbert Xu 	caam_exit_common(crypto_aead_ctx_dma(tfm));
3688f2147b88SHerbert Xu }
3689f2147b88SHerbert Xu 
caam_algapi_exit(void)36901b46c90cSHoria Geantă void caam_algapi_exit(void)
36918e8ec596SKim Phillips {
3692f2147b88SHerbert Xu 	int i;
3693f2147b88SHerbert Xu 
3694f2147b88SHerbert Xu 	for (i = 0; i < ARRAY_SIZE(driver_aeads); i++) {
3695f2147b88SHerbert Xu 		struct caam_aead_alg *t_alg = driver_aeads + i;
3696f2147b88SHerbert Xu 
3697f2147b88SHerbert Xu 		if (t_alg->registered)
3698623814c0SHerbert Xu 			crypto_engine_unregister_aead(&t_alg->aead);
3699f2147b88SHerbert Xu 	}
37008e8ec596SKim Phillips 
37015ca7badbSHoria Geantă 	for (i = 0; i < ARRAY_SIZE(driver_algs); i++) {
37025ca7badbSHoria Geantă 		struct caam_skcipher_alg *t_alg = driver_algs + i;
37038e8ec596SKim Phillips 
37045ca7badbSHoria Geantă 		if (t_alg->registered)
3705623814c0SHerbert Xu 			crypto_engine_unregister_skcipher(&t_alg->skcipher);
37068e8ec596SKim Phillips 	}
37078e8ec596SKim Phillips }
37088e8ec596SKim Phillips 
caam_skcipher_alg_init(struct caam_skcipher_alg * t_alg)37095ca7badbSHoria Geantă static void caam_skcipher_alg_init(struct caam_skcipher_alg *t_alg)
37108e8ec596SKim Phillips {
3711623814c0SHerbert Xu 	struct skcipher_alg *alg = &t_alg->skcipher.base;
37128e8ec596SKim Phillips 
37135ca7badbSHoria Geantă 	alg->base.cra_module = THIS_MODULE;
37145ca7badbSHoria Geantă 	alg->base.cra_priority = CAAM_CRA_PRIORITY;
37154cb4f7c1SHerbert Xu 	alg->base.cra_ctxsize = sizeof(struct caam_ctx) + crypto_dma_padding();
37169d9b14dbSAndrei Botila 	alg->base.cra_flags |= (CRYPTO_ALG_ASYNC | CRYPTO_ALG_ALLOCATES_MEMORY |
37179d9b14dbSAndrei Botila 			      CRYPTO_ALG_KERN_DRIVER_ONLY);
37188e8ec596SKim Phillips 
37195ca7badbSHoria Geantă 	alg->init = caam_cra_init;
37205ca7badbSHoria Geantă 	alg->exit = caam_cra_exit;
37218e8ec596SKim Phillips }
37228e8ec596SKim Phillips 
caam_aead_alg_init(struct caam_aead_alg * t_alg)3723f2147b88SHerbert Xu static void caam_aead_alg_init(struct caam_aead_alg *t_alg)
3724f2147b88SHerbert Xu {
3725623814c0SHerbert Xu 	struct aead_alg *alg = &t_alg->aead.base;
3726f2147b88SHerbert Xu 
3727f2147b88SHerbert Xu 	alg->base.cra_module = THIS_MODULE;
3728f2147b88SHerbert Xu 	alg->base.cra_priority = CAAM_CRA_PRIORITY;
37294cb4f7c1SHerbert Xu 	alg->base.cra_ctxsize = sizeof(struct caam_ctx) + crypto_dma_padding();
3730b8aa7dc5SMikulas Patocka 	alg->base.cra_flags = CRYPTO_ALG_ASYNC | CRYPTO_ALG_ALLOCATES_MEMORY |
3731b8aa7dc5SMikulas Patocka 			      CRYPTO_ALG_KERN_DRIVER_ONLY;
3732f2147b88SHerbert Xu 
3733f2147b88SHerbert Xu 	alg->init = caam_aead_init;
3734f2147b88SHerbert Xu 	alg->exit = caam_aead_exit;
3735f2147b88SHerbert Xu }
3736f2147b88SHerbert Xu 
caam_algapi_init(struct device * ctrldev)37371b46c90cSHoria Geantă int caam_algapi_init(struct device *ctrldev)
37388e8ec596SKim Phillips {
37391b46c90cSHoria Geantă 	struct caam_drv_private *priv = dev_get_drvdata(ctrldev);
37408e8ec596SKim Phillips 	int i = 0, err = 0;
3741d6bbd4eeSHoria Geantă 	u32 aes_vid, aes_inst, des_inst, md_vid, md_inst, ccha_inst, ptha_inst;
3742bf83490eSVictoria Milhoan 	unsigned int md_limit = SHA512_DIGEST_SIZE;
3743df80bfd3SHoria Geantă 	bool registered = false, gcm_support;
37448e8ec596SKim Phillips 
3745bf83490eSVictoria Milhoan 	/*
3746bf83490eSVictoria Milhoan 	 * Register crypto algorithms the device supports.
3747bf83490eSVictoria Milhoan 	 * First, detect presence and attributes of DES, AES, and MD blocks.
3748bf83490eSVictoria Milhoan 	 */
3749d239b10dSHoria Geantă 	if (priv->era < 10) {
3750ae1dd17dSHoria GeantA 		struct caam_perfmon __iomem *perfmon = &priv->jr[0]->perfmon;
3751df80bfd3SHoria Geantă 		u32 cha_vid, cha_inst, aes_rn;
3752d239b10dSHoria Geantă 
3753ae1dd17dSHoria GeantA 		cha_vid = rd_reg32(&perfmon->cha_id_ls);
3754d239b10dSHoria Geantă 		aes_vid = cha_vid & CHA_ID_LS_AES_MASK;
3755d239b10dSHoria Geantă 		md_vid = (cha_vid & CHA_ID_LS_MD_MASK) >> CHA_ID_LS_MD_SHIFT;
3756d239b10dSHoria Geantă 
3757ae1dd17dSHoria GeantA 		cha_inst = rd_reg32(&perfmon->cha_num_ls);
3758d239b10dSHoria Geantă 		des_inst = (cha_inst & CHA_ID_LS_DES_MASK) >>
3759d239b10dSHoria Geantă 			   CHA_ID_LS_DES_SHIFT;
3760d239b10dSHoria Geantă 		aes_inst = cha_inst & CHA_ID_LS_AES_MASK;
3761bf83490eSVictoria Milhoan 		md_inst = (cha_inst & CHA_ID_LS_MD_MASK) >> CHA_ID_LS_MD_SHIFT;
3762d6bbd4eeSHoria Geantă 		ccha_inst = 0;
3763d6bbd4eeSHoria Geantă 		ptha_inst = 0;
3764df80bfd3SHoria Geantă 
3765ae1dd17dSHoria GeantA 		aes_rn = rd_reg32(&perfmon->cha_rev_ls) & CHA_ID_LS_AES_MASK;
3766df80bfd3SHoria Geantă 		gcm_support = !(aes_vid == CHA_VER_VID_AES_LP && aes_rn < 8);
3767d239b10dSHoria Geantă 	} else {
3768ae1dd17dSHoria GeantA 		struct version_regs __iomem *vreg = &priv->jr[0]->vreg;
3769d239b10dSHoria Geantă 		u32 aesa, mdha;
3770d239b10dSHoria Geantă 
3771ae1dd17dSHoria GeantA 		aesa = rd_reg32(&vreg->aesa);
3772ae1dd17dSHoria GeantA 		mdha = rd_reg32(&vreg->mdha);
3773d239b10dSHoria Geantă 
3774d239b10dSHoria Geantă 		aes_vid = (aesa & CHA_VER_VID_MASK) >> CHA_VER_VID_SHIFT;
3775d239b10dSHoria Geantă 		md_vid = (mdha & CHA_VER_VID_MASK) >> CHA_VER_VID_SHIFT;
3776d239b10dSHoria Geantă 
3777ae1dd17dSHoria GeantA 		des_inst = rd_reg32(&vreg->desa) & CHA_VER_NUM_MASK;
3778d239b10dSHoria Geantă 		aes_inst = aesa & CHA_VER_NUM_MASK;
3779d239b10dSHoria Geantă 		md_inst = mdha & CHA_VER_NUM_MASK;
3780ae1dd17dSHoria GeantA 		ccha_inst = rd_reg32(&vreg->ccha) & CHA_VER_NUM_MASK;
3781ae1dd17dSHoria GeantA 		ptha_inst = rd_reg32(&vreg->ptha) & CHA_VER_NUM_MASK;
3782df80bfd3SHoria Geantă 
3783df80bfd3SHoria Geantă 		gcm_support = aesa & CHA_VER_MISC_AES_GCM;
3784d239b10dSHoria Geantă 	}
37858e8ec596SKim Phillips 
3786bf83490eSVictoria Milhoan 	/* If MD is present, limit digest size based on LP256 */
3787d239b10dSHoria Geantă 	if (md_inst && md_vid  == CHA_VER_VID_MD_LP256)
3788bf83490eSVictoria Milhoan 		md_limit = SHA256_DIGEST_SIZE;
3789bf83490eSVictoria Milhoan 
3790bf83490eSVictoria Milhoan 	for (i = 0; i < ARRAY_SIZE(driver_algs); i++) {
37915ca7badbSHoria Geantă 		struct caam_skcipher_alg *t_alg = driver_algs + i;
37925ca7badbSHoria Geantă 		u32 alg_sel = t_alg->caam.class1_alg_type & OP_ALG_ALGSEL_MASK;
3793bf83490eSVictoria Milhoan 
3794bf83490eSVictoria Milhoan 		/* Skip DES algorithms if not supported by device */
3795bf83490eSVictoria Milhoan 		if (!des_inst &&
3796bf83490eSVictoria Milhoan 		    ((alg_sel == OP_ALG_ALGSEL_3DES) ||
3797bf83490eSVictoria Milhoan 		     (alg_sel == OP_ALG_ALGSEL_DES)))
3798bf83490eSVictoria Milhoan 				continue;
3799bf83490eSVictoria Milhoan 
3800bf83490eSVictoria Milhoan 		/* Skip AES algorithms if not supported by device */
3801bf83490eSVictoria Milhoan 		if (!aes_inst && (alg_sel == OP_ALG_ALGSEL_AES))
3802bf83490eSVictoria Milhoan 				continue;
3803bf83490eSVictoria Milhoan 
380483d2c9a9SSven Ebenfeld 		/*
380583d2c9a9SSven Ebenfeld 		 * Check support for AES modes not available
380683d2c9a9SSven Ebenfeld 		 * on LP devices.
380783d2c9a9SSven Ebenfeld 		 */
3808d239b10dSHoria Geantă 		if (aes_vid == CHA_VER_VID_AES_LP &&
3809d239b10dSHoria Geantă 		    (t_alg->caam.class1_alg_type & OP_ALG_AAI_MASK) ==
381083d2c9a9SSven Ebenfeld 		    OP_ALG_AAI_XTS)
381183d2c9a9SSven Ebenfeld 			continue;
381283d2c9a9SSven Ebenfeld 
38135ca7badbSHoria Geantă 		caam_skcipher_alg_init(t_alg);
38148e8ec596SKim Phillips 
3815623814c0SHerbert Xu 		err = crypto_engine_register_skcipher(&t_alg->skcipher);
38168e8ec596SKim Phillips 		if (err) {
3817cfc6f11bSRuchika Gupta 			pr_warn("%s alg registration failed\n",
3818623814c0SHerbert Xu 				t_alg->skcipher.base.base.cra_driver_name);
3819f2147b88SHerbert Xu 			continue;
38208e8ec596SKim Phillips 		}
3821f2147b88SHerbert Xu 
38225ca7badbSHoria Geantă 		t_alg->registered = true;
3823f2147b88SHerbert Xu 		registered = true;
3824f2147b88SHerbert Xu 	}
3825f2147b88SHerbert Xu 
3826f2147b88SHerbert Xu 	for (i = 0; i < ARRAY_SIZE(driver_aeads); i++) {
3827f2147b88SHerbert Xu 		struct caam_aead_alg *t_alg = driver_aeads + i;
3828bf83490eSVictoria Milhoan 		u32 c1_alg_sel = t_alg->caam.class1_alg_type &
3829bf83490eSVictoria Milhoan 				 OP_ALG_ALGSEL_MASK;
3830bf83490eSVictoria Milhoan 		u32 c2_alg_sel = t_alg->caam.class2_alg_type &
3831bf83490eSVictoria Milhoan 				 OP_ALG_ALGSEL_MASK;
3832bf83490eSVictoria Milhoan 		u32 alg_aai = t_alg->caam.class1_alg_type & OP_ALG_AAI_MASK;
3833bf83490eSVictoria Milhoan 
3834bf83490eSVictoria Milhoan 		/* Skip DES algorithms if not supported by device */
3835bf83490eSVictoria Milhoan 		if (!des_inst &&
3836bf83490eSVictoria Milhoan 		    ((c1_alg_sel == OP_ALG_ALGSEL_3DES) ||
3837bf83490eSVictoria Milhoan 		     (c1_alg_sel == OP_ALG_ALGSEL_DES)))
3838bf83490eSVictoria Milhoan 				continue;
3839bf83490eSVictoria Milhoan 
3840bf83490eSVictoria Milhoan 		/* Skip AES algorithms if not supported by device */
3841bf83490eSVictoria Milhoan 		if (!aes_inst && (c1_alg_sel == OP_ALG_ALGSEL_AES))
3842bf83490eSVictoria Milhoan 				continue;
3843bf83490eSVictoria Milhoan 
3844d6bbd4eeSHoria Geantă 		/* Skip CHACHA20 algorithms if not supported by device */
3845d6bbd4eeSHoria Geantă 		if (c1_alg_sel == OP_ALG_ALGSEL_CHACHA20 && !ccha_inst)
3846d6bbd4eeSHoria Geantă 			continue;
3847d6bbd4eeSHoria Geantă 
3848d6bbd4eeSHoria Geantă 		/* Skip POLY1305 algorithms if not supported by device */
3849d6bbd4eeSHoria Geantă 		if (c2_alg_sel == OP_ALG_ALGSEL_POLY1305 && !ptha_inst)
3850d6bbd4eeSHoria Geantă 			continue;
3851d6bbd4eeSHoria Geantă 
3852df80bfd3SHoria Geantă 		/* Skip GCM algorithms if not supported by device */
3853df80bfd3SHoria Geantă 		if (c1_alg_sel == OP_ALG_ALGSEL_AES &&
3854df80bfd3SHoria Geantă 		    alg_aai == OP_ALG_AAI_GCM && !gcm_support)
3855bf83490eSVictoria Milhoan 			continue;
3856bf83490eSVictoria Milhoan 
3857bf83490eSVictoria Milhoan 		/*
3858bf83490eSVictoria Milhoan 		 * Skip algorithms requiring message digests
3859bf83490eSVictoria Milhoan 		 * if MD or MD size is not supported by device.
3860bf83490eSVictoria Milhoan 		 */
38612dd3fde4SHoria Geantă 		if (is_mdha(c2_alg_sel) &&
3862623814c0SHerbert Xu 		    (!md_inst || t_alg->aead.base.maxauthsize > md_limit))
3863bf83490eSVictoria Milhoan 			continue;
3864f2147b88SHerbert Xu 
3865f2147b88SHerbert Xu 		caam_aead_alg_init(t_alg);
3866f2147b88SHerbert Xu 
3867623814c0SHerbert Xu 		err = crypto_engine_register_aead(&t_alg->aead);
3868f2147b88SHerbert Xu 		if (err) {
3869f2147b88SHerbert Xu 			pr_warn("%s alg registration failed\n",
3870623814c0SHerbert Xu 				t_alg->aead.base.base.cra_driver_name);
3871f2147b88SHerbert Xu 			continue;
3872f2147b88SHerbert Xu 		}
3873f2147b88SHerbert Xu 
3874f2147b88SHerbert Xu 		t_alg->registered = true;
3875f2147b88SHerbert Xu 		registered = true;
3876f2147b88SHerbert Xu 	}
3877f2147b88SHerbert Xu 
3878f2147b88SHerbert Xu 	if (registered)
3879cfc6f11bSRuchika Gupta 		pr_info("caam algorithms registered in /proc/crypto\n");
38808e8ec596SKim Phillips 
38818e8ec596SKim Phillips 	return err;
38828e8ec596SKim Phillips }
3883