xref: /openbmc/linux/drivers/crypto/caam/caamalg.c (revision 2fdea258)
18e8ec596SKim Phillips /*
28e8ec596SKim Phillips  * caam - Freescale FSL CAAM support for crypto API
38e8ec596SKim Phillips  *
48e8ec596SKim Phillips  * Copyright 2008-2011 Freescale Semiconductor, Inc.
58e8ec596SKim Phillips  *
68e8ec596SKim Phillips  * Based on talitos crypto API driver.
78e8ec596SKim Phillips  *
88e8ec596SKim Phillips  * relationship of job descriptors to shared descriptors (SteveC Dec 10 2008):
98e8ec596SKim Phillips  *
108e8ec596SKim Phillips  * ---------------                     ---------------
118e8ec596SKim Phillips  * | JobDesc #1  |-------------------->|  ShareDesc  |
128e8ec596SKim Phillips  * | *(packet 1) |                     |   (PDB)     |
138e8ec596SKim Phillips  * ---------------      |------------->|  (hashKey)  |
148e8ec596SKim Phillips  *       .              |              | (cipherKey) |
158e8ec596SKim Phillips  *       .              |    |-------->| (operation) |
168e8ec596SKim Phillips  * ---------------      |    |         ---------------
178e8ec596SKim Phillips  * | JobDesc #2  |------|    |
188e8ec596SKim Phillips  * | *(packet 2) |           |
198e8ec596SKim Phillips  * ---------------           |
208e8ec596SKim Phillips  *       .                   |
218e8ec596SKim Phillips  *       .                   |
228e8ec596SKim Phillips  * ---------------           |
238e8ec596SKim Phillips  * | JobDesc #3  |------------
248e8ec596SKim Phillips  * | *(packet 3) |
258e8ec596SKim Phillips  * ---------------
268e8ec596SKim Phillips  *
278e8ec596SKim Phillips  * The SharedDesc never changes for a connection unless rekeyed, but
288e8ec596SKim Phillips  * each packet will likely be in a different place. So all we need
298e8ec596SKim Phillips  * to know to process the packet is where the input is, where the
308e8ec596SKim Phillips  * output goes, and what context we want to process with. Context is
318e8ec596SKim Phillips  * in the SharedDesc, packet references in the JobDesc.
328e8ec596SKim Phillips  *
338e8ec596SKim Phillips  * So, a job desc looks like:
348e8ec596SKim Phillips  *
358e8ec596SKim Phillips  * ---------------------
368e8ec596SKim Phillips  * | Header            |
378e8ec596SKim Phillips  * | ShareDesc Pointer |
388e8ec596SKim Phillips  * | SEQ_OUT_PTR       |
398e8ec596SKim Phillips  * | (output buffer)   |
406ec47334SYuan Kang  * | (output length)   |
418e8ec596SKim Phillips  * | SEQ_IN_PTR        |
428e8ec596SKim Phillips  * | (input buffer)    |
436ec47334SYuan Kang  * | (input length)    |
448e8ec596SKim Phillips  * ---------------------
458e8ec596SKim Phillips  */
468e8ec596SKim Phillips 
478e8ec596SKim Phillips #include "compat.h"
488e8ec596SKim Phillips 
498e8ec596SKim Phillips #include "regs.h"
508e8ec596SKim Phillips #include "intern.h"
518e8ec596SKim Phillips #include "desc_constr.h"
528e8ec596SKim Phillips #include "jr.h"
538e8ec596SKim Phillips #include "error.h"
54a299c837SYuan Kang #include "sg_sw_sec4.h"
554c1ec1f9SYuan Kang #include "key_gen.h"
568e8ec596SKim Phillips 
578e8ec596SKim Phillips /*
588e8ec596SKim Phillips  * crypto alg
598e8ec596SKim Phillips  */
608e8ec596SKim Phillips #define CAAM_CRA_PRIORITY		3000
618e8ec596SKim Phillips /* max key is sum of AES_MAX_KEY_SIZE, max split key size */
628e8ec596SKim Phillips #define CAAM_MAX_KEY_SIZE		(AES_MAX_KEY_SIZE + \
63daebc465SCatalin Vasile 					 CTR_RFC3686_NONCE_SIZE + \
648e8ec596SKim Phillips 					 SHA512_DIGEST_SIZE * 2)
658e8ec596SKim Phillips /* max IV is max of AES_BLOCK_SIZE, DES3_EDE_BLOCK_SIZE */
668e8ec596SKim Phillips #define CAAM_MAX_IV_LENGTH		16
678e8ec596SKim Phillips 
68f2147b88SHerbert Xu #define AEAD_DESC_JOB_IO_LEN		(DESC_JOB_IO_LEN + CAAM_CMD_SZ * 2)
69f2147b88SHerbert Xu #define GCM_DESC_JOB_IO_LEN		(AEAD_DESC_JOB_IO_LEN + \
70f2147b88SHerbert Xu 					 CAAM_CMD_SZ * 4)
71479bcc7cSHerbert Xu #define AUTHENC_DESC_JOB_IO_LEN		(AEAD_DESC_JOB_IO_LEN + \
72479bcc7cSHerbert Xu 					 CAAM_CMD_SZ * 5)
73f2147b88SHerbert Xu 
744427b1b4SKim Phillips /* length of descriptors text */
751acebad3SYuan Kang #define DESC_AEAD_BASE			(4 * CAAM_CMD_SZ)
76479bcc7cSHerbert Xu #define DESC_AEAD_ENC_LEN		(DESC_AEAD_BASE + 11 * CAAM_CMD_SZ)
77479bcc7cSHerbert Xu #define DESC_AEAD_DEC_LEN		(DESC_AEAD_BASE + 15 * CAAM_CMD_SZ)
78479bcc7cSHerbert Xu #define DESC_AEAD_GIVENC_LEN		(DESC_AEAD_ENC_LEN + 9 * CAAM_CMD_SZ)
791acebad3SYuan Kang 
80daebc465SCatalin Vasile /* Note: Nonce is counted in enckeylen */
81479bcc7cSHerbert Xu #define DESC_AEAD_CTR_RFC3686_LEN	(4 * CAAM_CMD_SZ)
82daebc465SCatalin Vasile 
83ae4a825fSHoria Geanta #define DESC_AEAD_NULL_BASE		(3 * CAAM_CMD_SZ)
84479bcc7cSHerbert Xu #define DESC_AEAD_NULL_ENC_LEN		(DESC_AEAD_NULL_BASE + 11 * CAAM_CMD_SZ)
85479bcc7cSHerbert Xu #define DESC_AEAD_NULL_DEC_LEN		(DESC_AEAD_NULL_BASE + 13 * CAAM_CMD_SZ)
86ae4a825fSHoria Geanta 
873ef8d945STudor Ambarus #define DESC_GCM_BASE			(3 * CAAM_CMD_SZ)
88f2147b88SHerbert Xu #define DESC_GCM_ENC_LEN		(DESC_GCM_BASE + 16 * CAAM_CMD_SZ)
89f2147b88SHerbert Xu #define DESC_GCM_DEC_LEN		(DESC_GCM_BASE + 12 * CAAM_CMD_SZ)
903ef8d945STudor Ambarus 
91bac68f2cSTudor Ambarus #define DESC_RFC4106_BASE		(3 * CAAM_CMD_SZ)
924aad0cc5SHoria Geant? #define DESC_RFC4106_ENC_LEN		(DESC_RFC4106_BASE + 13 * CAAM_CMD_SZ)
934aad0cc5SHoria Geant? #define DESC_RFC4106_DEC_LEN		(DESC_RFC4106_BASE + 13 * CAAM_CMD_SZ)
94bac68f2cSTudor Ambarus 
955d0429a3STudor Ambarus #define DESC_RFC4543_BASE		(3 * CAAM_CMD_SZ)
96f2147b88SHerbert Xu #define DESC_RFC4543_ENC_LEN		(DESC_RFC4543_BASE + 11 * CAAM_CMD_SZ)
97f2147b88SHerbert Xu #define DESC_RFC4543_DEC_LEN		(DESC_RFC4543_BASE + 12 * CAAM_CMD_SZ)
985d0429a3STudor Ambarus 
99acdca31dSYuan Kang #define DESC_ABLKCIPHER_BASE		(3 * CAAM_CMD_SZ)
100acdca31dSYuan Kang #define DESC_ABLKCIPHER_ENC_LEN		(DESC_ABLKCIPHER_BASE + \
101acdca31dSYuan Kang 					 20 * CAAM_CMD_SZ)
102acdca31dSYuan Kang #define DESC_ABLKCIPHER_DEC_LEN		(DESC_ABLKCIPHER_BASE + \
103acdca31dSYuan Kang 					 15 * CAAM_CMD_SZ)
104acdca31dSYuan Kang 
10587e51b07SHerbert Xu #define DESC_MAX_USED_BYTES		(CAAM_DESC_BYTES_MAX - DESC_JOB_IO_LEN)
10687e51b07SHerbert Xu #define DESC_MAX_USED_LEN		(DESC_MAX_USED_BYTES / CAAM_CMD_SZ)
1074427b1b4SKim Phillips 
1088e8ec596SKim Phillips #ifdef DEBUG
1098e8ec596SKim Phillips /* for print_hex_dumps with line references */
1108e8ec596SKim Phillips #define debug(format, arg...) printk(format, arg)
1118e8ec596SKim Phillips #else
1128e8ec596SKim Phillips #define debug(format, arg...)
1138e8ec596SKim Phillips #endif
114cfc6f11bSRuchika Gupta static struct list_head alg_list;
1158e8ec596SKim Phillips 
116479bcc7cSHerbert Xu struct caam_alg_entry {
117479bcc7cSHerbert Xu 	int class1_alg_type;
118479bcc7cSHerbert Xu 	int class2_alg_type;
119479bcc7cSHerbert Xu 	int alg_op;
120479bcc7cSHerbert Xu 	bool rfc3686;
121479bcc7cSHerbert Xu 	bool geniv;
122479bcc7cSHerbert Xu };
123479bcc7cSHerbert Xu 
124479bcc7cSHerbert Xu struct caam_aead_alg {
125479bcc7cSHerbert Xu 	struct aead_alg aead;
126479bcc7cSHerbert Xu 	struct caam_alg_entry caam;
127479bcc7cSHerbert Xu 	bool registered;
128479bcc7cSHerbert Xu };
129479bcc7cSHerbert Xu 
1301acebad3SYuan Kang /* Set DK bit in class 1 operation if shared */
1311acebad3SYuan Kang static inline void append_dec_op1(u32 *desc, u32 type)
1321acebad3SYuan Kang {
1331acebad3SYuan Kang 	u32 *jump_cmd, *uncond_jump_cmd;
1341acebad3SYuan Kang 
135a60384dfSHoria Geanta 	/* DK bit is valid only for AES */
136a60384dfSHoria Geanta 	if ((type & OP_ALG_ALGSEL_MASK) != OP_ALG_ALGSEL_AES) {
137a60384dfSHoria Geanta 		append_operation(desc, type | OP_ALG_AS_INITFINAL |
138a60384dfSHoria Geanta 				 OP_ALG_DECRYPT);
139a60384dfSHoria Geanta 		return;
140a60384dfSHoria Geanta 	}
141a60384dfSHoria Geanta 
1421acebad3SYuan Kang 	jump_cmd = append_jump(desc, JUMP_TEST_ALL | JUMP_COND_SHRD);
1431acebad3SYuan Kang 	append_operation(desc, type | OP_ALG_AS_INITFINAL |
1441acebad3SYuan Kang 			 OP_ALG_DECRYPT);
1451acebad3SYuan Kang 	uncond_jump_cmd = append_jump(desc, JUMP_TEST_ALL);
1461acebad3SYuan Kang 	set_jump_tgt_here(desc, jump_cmd);
1471acebad3SYuan Kang 	append_operation(desc, type | OP_ALG_AS_INITFINAL |
1481acebad3SYuan Kang 			 OP_ALG_DECRYPT | OP_ALG_AAI_DK);
1491acebad3SYuan Kang 	set_jump_tgt_here(desc, uncond_jump_cmd);
1501acebad3SYuan Kang }
1511acebad3SYuan Kang 
1521acebad3SYuan Kang /*
1531acebad3SYuan Kang  * For aead functions, read payload and write payload,
1541acebad3SYuan Kang  * both of which are specified in req->src and req->dst
1551acebad3SYuan Kang  */
1561acebad3SYuan Kang static inline void aead_append_src_dst(u32 *desc, u32 msg_type)
1571acebad3SYuan Kang {
158ae4a825fSHoria Geanta 	append_seq_fifo_store(desc, 0, FIFOST_TYPE_MESSAGE_DATA | KEY_VLF);
1591acebad3SYuan Kang 	append_seq_fifo_load(desc, 0, FIFOLD_CLASS_BOTH |
1601acebad3SYuan Kang 			     KEY_VLF | msg_type | FIFOLD_TYPE_LASTBOTH);
1611acebad3SYuan Kang }
1621acebad3SYuan Kang 
1631acebad3SYuan Kang /*
164acdca31dSYuan Kang  * For ablkcipher encrypt and decrypt, read from req->src and
165acdca31dSYuan Kang  * write to req->dst
166acdca31dSYuan Kang  */
167acdca31dSYuan Kang static inline void ablkcipher_append_src_dst(u32 *desc)
168acdca31dSYuan Kang {
16970d793ccSKim Phillips 	append_math_add(desc, VARSEQOUTLEN, SEQINLEN, REG0, CAAM_CMD_SZ);
17070d793ccSKim Phillips 	append_math_add(desc, VARSEQINLEN, SEQINLEN, REG0, CAAM_CMD_SZ);
17170d793ccSKim Phillips 	append_seq_fifo_load(desc, 0, FIFOLD_CLASS_CLASS1 |
17270d793ccSKim Phillips 			     KEY_VLF | FIFOLD_TYPE_MSG | FIFOLD_TYPE_LAST1);
17370d793ccSKim Phillips 	append_seq_fifo_store(desc, 0, FIFOST_TYPE_MESSAGE_DATA | KEY_VLF);
174acdca31dSYuan Kang }
175acdca31dSYuan Kang 
176acdca31dSYuan Kang /*
1778e8ec596SKim Phillips  * per-session context
1788e8ec596SKim Phillips  */
1798e8ec596SKim Phillips struct caam_ctx {
1808e8ec596SKim Phillips 	struct device *jrdev;
1811acebad3SYuan Kang 	u32 sh_desc_enc[DESC_MAX_USED_LEN];
1821acebad3SYuan Kang 	u32 sh_desc_dec[DESC_MAX_USED_LEN];
1831acebad3SYuan Kang 	u32 sh_desc_givenc[DESC_MAX_USED_LEN];
1841acebad3SYuan Kang 	dma_addr_t sh_desc_enc_dma;
1851acebad3SYuan Kang 	dma_addr_t sh_desc_dec_dma;
1861acebad3SYuan Kang 	dma_addr_t sh_desc_givenc_dma;
1878e8ec596SKim Phillips 	u32 class1_alg_type;
1888e8ec596SKim Phillips 	u32 class2_alg_type;
1898e8ec596SKim Phillips 	u32 alg_op;
1901acebad3SYuan Kang 	u8 key[CAAM_MAX_KEY_SIZE];
191885e9e2fSYuan Kang 	dma_addr_t key_dma;
1928e8ec596SKim Phillips 	unsigned int enckeylen;
1938e8ec596SKim Phillips 	unsigned int split_key_len;
1948e8ec596SKim Phillips 	unsigned int split_key_pad_len;
1958e8ec596SKim Phillips 	unsigned int authsize;
1968e8ec596SKim Phillips };
1978e8ec596SKim Phillips 
1981acebad3SYuan Kang static void append_key_aead(u32 *desc, struct caam_ctx *ctx,
199daebc465SCatalin Vasile 			    int keys_fit_inline, bool is_rfc3686)
2001acebad3SYuan Kang {
201daebc465SCatalin Vasile 	u32 *nonce;
202daebc465SCatalin Vasile 	unsigned int enckeylen = ctx->enckeylen;
203daebc465SCatalin Vasile 
204daebc465SCatalin Vasile 	/*
205daebc465SCatalin Vasile 	 * RFC3686 specific:
206daebc465SCatalin Vasile 	 *	| ctx->key = {AUTH_KEY, ENC_KEY, NONCE}
207daebc465SCatalin Vasile 	 *	| enckeylen = encryption key size + nonce size
208daebc465SCatalin Vasile 	 */
209daebc465SCatalin Vasile 	if (is_rfc3686)
210daebc465SCatalin Vasile 		enckeylen -= CTR_RFC3686_NONCE_SIZE;
211daebc465SCatalin Vasile 
2121acebad3SYuan Kang 	if (keys_fit_inline) {
2131acebad3SYuan Kang 		append_key_as_imm(desc, ctx->key, ctx->split_key_pad_len,
2141acebad3SYuan Kang 				  ctx->split_key_len, CLASS_2 |
2151acebad3SYuan Kang 				  KEY_DEST_MDHA_SPLIT | KEY_ENC);
2161acebad3SYuan Kang 		append_key_as_imm(desc, (void *)ctx->key +
217daebc465SCatalin Vasile 				  ctx->split_key_pad_len, enckeylen,
218daebc465SCatalin Vasile 				  enckeylen, CLASS_1 | KEY_DEST_CLASS_REG);
2191acebad3SYuan Kang 	} else {
2201acebad3SYuan Kang 		append_key(desc, ctx->key_dma, ctx->split_key_len, CLASS_2 |
2211acebad3SYuan Kang 			   KEY_DEST_MDHA_SPLIT | KEY_ENC);
2221acebad3SYuan Kang 		append_key(desc, ctx->key_dma + ctx->split_key_pad_len,
223daebc465SCatalin Vasile 			   enckeylen, CLASS_1 | KEY_DEST_CLASS_REG);
224daebc465SCatalin Vasile 	}
225daebc465SCatalin Vasile 
226daebc465SCatalin Vasile 	/* Load Counter into CONTEXT1 reg */
227daebc465SCatalin Vasile 	if (is_rfc3686) {
228daebc465SCatalin Vasile 		nonce = (u32 *)((void *)ctx->key + ctx->split_key_pad_len +
229daebc465SCatalin Vasile 			       enckeylen);
230daebc465SCatalin Vasile 		append_load_imm_u32(desc, *nonce, LDST_CLASS_IND_CCB |
231daebc465SCatalin Vasile 				    LDST_SRCDST_BYTE_OUTFIFO | LDST_IMM);
232daebc465SCatalin Vasile 		append_move(desc,
233daebc465SCatalin Vasile 			    MOVE_SRC_OUTFIFO |
234daebc465SCatalin Vasile 			    MOVE_DEST_CLASS1CTX |
235daebc465SCatalin Vasile 			    (16 << MOVE_OFFSET_SHIFT) |
236daebc465SCatalin Vasile 			    (CTR_RFC3686_NONCE_SIZE << MOVE_LEN_SHIFT));
2371acebad3SYuan Kang 	}
2381acebad3SYuan Kang }
2391acebad3SYuan Kang 
2401acebad3SYuan Kang static void init_sh_desc_key_aead(u32 *desc, struct caam_ctx *ctx,
241daebc465SCatalin Vasile 				  int keys_fit_inline, bool is_rfc3686)
2421acebad3SYuan Kang {
2431acebad3SYuan Kang 	u32 *key_jump_cmd;
2441acebad3SYuan Kang 
245daebc465SCatalin Vasile 	/* Note: Context registers are saved. */
246daebc465SCatalin Vasile 	init_sh_desc(desc, HDR_SHARE_SERIAL | HDR_SAVECTX);
2471acebad3SYuan Kang 
2481acebad3SYuan Kang 	/* Skip if already shared */
2491acebad3SYuan Kang 	key_jump_cmd = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL |
2501acebad3SYuan Kang 				   JUMP_COND_SHRD);
2511acebad3SYuan Kang 
252daebc465SCatalin Vasile 	append_key_aead(desc, ctx, keys_fit_inline, is_rfc3686);
2531acebad3SYuan Kang 
2541acebad3SYuan Kang 	set_jump_tgt_here(desc, key_jump_cmd);
2551acebad3SYuan Kang }
2561acebad3SYuan Kang 
257ae4a825fSHoria Geanta static int aead_null_set_sh_desc(struct crypto_aead *aead)
258ae4a825fSHoria Geanta {
259ae4a825fSHoria Geanta 	struct caam_ctx *ctx = crypto_aead_ctx(aead);
260ae4a825fSHoria Geanta 	struct device *jrdev = ctx->jrdev;
261ae4a825fSHoria Geanta 	bool keys_fit_inline = false;
262ae4a825fSHoria Geanta 	u32 *key_jump_cmd, *jump_cmd, *read_move_cmd, *write_move_cmd;
263ae4a825fSHoria Geanta 	u32 *desc;
264ae4a825fSHoria Geanta 
265ae4a825fSHoria Geanta 	/*
266ae4a825fSHoria Geanta 	 * Job Descriptor and Shared Descriptors
267ae4a825fSHoria Geanta 	 * must all fit into the 64-word Descriptor h/w Buffer
268ae4a825fSHoria Geanta 	 */
269479bcc7cSHerbert Xu 	if (DESC_AEAD_NULL_ENC_LEN + AEAD_DESC_JOB_IO_LEN +
270ae4a825fSHoria Geanta 	    ctx->split_key_pad_len <= CAAM_DESC_BYTES_MAX)
271ae4a825fSHoria Geanta 		keys_fit_inline = true;
272ae4a825fSHoria Geanta 
273479bcc7cSHerbert Xu 	/* aead_encrypt shared descriptor */
274ae4a825fSHoria Geanta 	desc = ctx->sh_desc_enc;
275ae4a825fSHoria Geanta 
276ae4a825fSHoria Geanta 	init_sh_desc(desc, HDR_SHARE_SERIAL);
277ae4a825fSHoria Geanta 
278ae4a825fSHoria Geanta 	/* Skip if already shared */
279ae4a825fSHoria Geanta 	key_jump_cmd = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL |
280ae4a825fSHoria Geanta 				   JUMP_COND_SHRD);
281ae4a825fSHoria Geanta 	if (keys_fit_inline)
282ae4a825fSHoria Geanta 		append_key_as_imm(desc, ctx->key, ctx->split_key_pad_len,
283ae4a825fSHoria Geanta 				  ctx->split_key_len, CLASS_2 |
284ae4a825fSHoria Geanta 				  KEY_DEST_MDHA_SPLIT | KEY_ENC);
285ae4a825fSHoria Geanta 	else
286ae4a825fSHoria Geanta 		append_key(desc, ctx->key_dma, ctx->split_key_len, CLASS_2 |
287ae4a825fSHoria Geanta 			   KEY_DEST_MDHA_SPLIT | KEY_ENC);
288ae4a825fSHoria Geanta 	set_jump_tgt_here(desc, key_jump_cmd);
289ae4a825fSHoria Geanta 
290479bcc7cSHerbert Xu 	/* assoclen + cryptlen = seqinlen */
291479bcc7cSHerbert Xu 	append_math_sub(desc, REG3, SEQINLEN, REG0, CAAM_CMD_SZ);
292ae4a825fSHoria Geanta 
293479bcc7cSHerbert Xu 	/* Prepare to read and write cryptlen + assoclen bytes */
294ae4a825fSHoria Geanta 	append_math_add(desc, VARSEQINLEN, ZERO, REG3, CAAM_CMD_SZ);
295ae4a825fSHoria Geanta 	append_math_add(desc, VARSEQOUTLEN, ZERO, REG3, CAAM_CMD_SZ);
296ae4a825fSHoria Geanta 
297ae4a825fSHoria Geanta 	/*
298ae4a825fSHoria Geanta 	 * MOVE_LEN opcode is not available in all SEC HW revisions,
299ae4a825fSHoria Geanta 	 * thus need to do some magic, i.e. self-patch the descriptor
300ae4a825fSHoria Geanta 	 * buffer.
301ae4a825fSHoria Geanta 	 */
302ae4a825fSHoria Geanta 	read_move_cmd = append_move(desc, MOVE_SRC_DESCBUF |
303ae4a825fSHoria Geanta 				    MOVE_DEST_MATH3 |
304ae4a825fSHoria Geanta 				    (0x6 << MOVE_LEN_SHIFT));
305ae4a825fSHoria Geanta 	write_move_cmd = append_move(desc, MOVE_SRC_MATH3 |
306ae4a825fSHoria Geanta 				     MOVE_DEST_DESCBUF |
307ae4a825fSHoria Geanta 				     MOVE_WAITCOMP |
308ae4a825fSHoria Geanta 				     (0x8 << MOVE_LEN_SHIFT));
309ae4a825fSHoria Geanta 
310ae4a825fSHoria Geanta 	/* Class 2 operation */
311ae4a825fSHoria Geanta 	append_operation(desc, ctx->class2_alg_type |
312ae4a825fSHoria Geanta 			 OP_ALG_AS_INITFINAL | OP_ALG_ENCRYPT);
313ae4a825fSHoria Geanta 
314ae4a825fSHoria Geanta 	/* Read and write cryptlen bytes */
315ae4a825fSHoria Geanta 	aead_append_src_dst(desc, FIFOLD_TYPE_MSG | FIFOLD_TYPE_FLUSH1);
316ae4a825fSHoria Geanta 
317ae4a825fSHoria Geanta 	set_move_tgt_here(desc, read_move_cmd);
318ae4a825fSHoria Geanta 	set_move_tgt_here(desc, write_move_cmd);
319ae4a825fSHoria Geanta 	append_cmd(desc, CMD_LOAD | DISABLE_AUTO_INFO_FIFO);
320ae4a825fSHoria Geanta 	append_move(desc, MOVE_SRC_INFIFO_CL | MOVE_DEST_OUTFIFO |
321ae4a825fSHoria Geanta 		    MOVE_AUX_LS);
322ae4a825fSHoria Geanta 
323ae4a825fSHoria Geanta 	/* Write ICV */
324ae4a825fSHoria Geanta 	append_seq_store(desc, ctx->authsize, LDST_CLASS_2_CCB |
325ae4a825fSHoria Geanta 			 LDST_SRCDST_BYTE_CONTEXT);
326ae4a825fSHoria Geanta 
327ae4a825fSHoria Geanta 	ctx->sh_desc_enc_dma = dma_map_single(jrdev, desc,
328ae4a825fSHoria Geanta 					      desc_bytes(desc),
329ae4a825fSHoria Geanta 					      DMA_TO_DEVICE);
330ae4a825fSHoria Geanta 	if (dma_mapping_error(jrdev, ctx->sh_desc_enc_dma)) {
331ae4a825fSHoria Geanta 		dev_err(jrdev, "unable to map shared descriptor\n");
332ae4a825fSHoria Geanta 		return -ENOMEM;
333ae4a825fSHoria Geanta 	}
334ae4a825fSHoria Geanta #ifdef DEBUG
335ae4a825fSHoria Geanta 	print_hex_dump(KERN_ERR,
336ae4a825fSHoria Geanta 		       "aead null enc shdesc@"__stringify(__LINE__)": ",
337ae4a825fSHoria Geanta 		       DUMP_PREFIX_ADDRESS, 16, 4, desc,
338ae4a825fSHoria Geanta 		       desc_bytes(desc), 1);
339ae4a825fSHoria Geanta #endif
340ae4a825fSHoria Geanta 
341ae4a825fSHoria Geanta 	/*
342ae4a825fSHoria Geanta 	 * Job Descriptor and Shared Descriptors
343ae4a825fSHoria Geanta 	 * must all fit into the 64-word Descriptor h/w Buffer
344ae4a825fSHoria Geanta 	 */
34580cd88f2SVakul Garg 	keys_fit_inline = false;
346ae4a825fSHoria Geanta 	if (DESC_AEAD_NULL_DEC_LEN + DESC_JOB_IO_LEN +
347ae4a825fSHoria Geanta 	    ctx->split_key_pad_len <= CAAM_DESC_BYTES_MAX)
348ae4a825fSHoria Geanta 		keys_fit_inline = true;
349ae4a825fSHoria Geanta 
350ae4a825fSHoria Geanta 	desc = ctx->sh_desc_dec;
351ae4a825fSHoria Geanta 
352479bcc7cSHerbert Xu 	/* aead_decrypt shared descriptor */
353ae4a825fSHoria Geanta 	init_sh_desc(desc, HDR_SHARE_SERIAL);
354ae4a825fSHoria Geanta 
355ae4a825fSHoria Geanta 	/* Skip if already shared */
356ae4a825fSHoria Geanta 	key_jump_cmd = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL |
357ae4a825fSHoria Geanta 				   JUMP_COND_SHRD);
358ae4a825fSHoria Geanta 	if (keys_fit_inline)
359ae4a825fSHoria Geanta 		append_key_as_imm(desc, ctx->key, ctx->split_key_pad_len,
360ae4a825fSHoria Geanta 				  ctx->split_key_len, CLASS_2 |
361ae4a825fSHoria Geanta 				  KEY_DEST_MDHA_SPLIT | KEY_ENC);
362ae4a825fSHoria Geanta 	else
363ae4a825fSHoria Geanta 		append_key(desc, ctx->key_dma, ctx->split_key_len, CLASS_2 |
364ae4a825fSHoria Geanta 			   KEY_DEST_MDHA_SPLIT | KEY_ENC);
365ae4a825fSHoria Geanta 	set_jump_tgt_here(desc, key_jump_cmd);
366ae4a825fSHoria Geanta 
367ae4a825fSHoria Geanta 	/* Class 2 operation */
368ae4a825fSHoria Geanta 	append_operation(desc, ctx->class2_alg_type |
369ae4a825fSHoria Geanta 			 OP_ALG_AS_INITFINAL | OP_ALG_DECRYPT | OP_ALG_ICV_ON);
370ae4a825fSHoria Geanta 
371479bcc7cSHerbert Xu 	/* assoclen + cryptlen = seqoutlen */
372ae4a825fSHoria Geanta 	append_math_sub(desc, REG2, SEQOUTLEN, REG0, CAAM_CMD_SZ);
373ae4a825fSHoria Geanta 
374479bcc7cSHerbert Xu 	/* Prepare to read and write cryptlen + assoclen bytes */
375ae4a825fSHoria Geanta 	append_math_add(desc, VARSEQINLEN, ZERO, REG2, CAAM_CMD_SZ);
376ae4a825fSHoria Geanta 	append_math_add(desc, VARSEQOUTLEN, ZERO, REG2, CAAM_CMD_SZ);
377ae4a825fSHoria Geanta 
378ae4a825fSHoria Geanta 	/*
379ae4a825fSHoria Geanta 	 * MOVE_LEN opcode is not available in all SEC HW revisions,
380ae4a825fSHoria Geanta 	 * thus need to do some magic, i.e. self-patch the descriptor
381ae4a825fSHoria Geanta 	 * buffer.
382ae4a825fSHoria Geanta 	 */
383ae4a825fSHoria Geanta 	read_move_cmd = append_move(desc, MOVE_SRC_DESCBUF |
384ae4a825fSHoria Geanta 				    MOVE_DEST_MATH2 |
385ae4a825fSHoria Geanta 				    (0x6 << MOVE_LEN_SHIFT));
386ae4a825fSHoria Geanta 	write_move_cmd = append_move(desc, MOVE_SRC_MATH2 |
387ae4a825fSHoria Geanta 				     MOVE_DEST_DESCBUF |
388ae4a825fSHoria Geanta 				     MOVE_WAITCOMP |
389ae4a825fSHoria Geanta 				     (0x8 << MOVE_LEN_SHIFT));
390ae4a825fSHoria Geanta 
391ae4a825fSHoria Geanta 	/* Read and write cryptlen bytes */
392ae4a825fSHoria Geanta 	aead_append_src_dst(desc, FIFOLD_TYPE_MSG | FIFOLD_TYPE_FLUSH1);
393ae4a825fSHoria Geanta 
394ae4a825fSHoria Geanta 	/*
395ae4a825fSHoria Geanta 	 * Insert a NOP here, since we need at least 4 instructions between
396ae4a825fSHoria Geanta 	 * code patching the descriptor buffer and the location being patched.
397ae4a825fSHoria Geanta 	 */
398ae4a825fSHoria Geanta 	jump_cmd = append_jump(desc, JUMP_TEST_ALL);
399ae4a825fSHoria Geanta 	set_jump_tgt_here(desc, jump_cmd);
400ae4a825fSHoria Geanta 
401ae4a825fSHoria Geanta 	set_move_tgt_here(desc, read_move_cmd);
402ae4a825fSHoria Geanta 	set_move_tgt_here(desc, write_move_cmd);
403ae4a825fSHoria Geanta 	append_cmd(desc, CMD_LOAD | DISABLE_AUTO_INFO_FIFO);
404ae4a825fSHoria Geanta 	append_move(desc, MOVE_SRC_INFIFO_CL | MOVE_DEST_OUTFIFO |
405ae4a825fSHoria Geanta 		    MOVE_AUX_LS);
406ae4a825fSHoria Geanta 	append_cmd(desc, CMD_LOAD | ENABLE_AUTO_INFO_FIFO);
407ae4a825fSHoria Geanta 
408ae4a825fSHoria Geanta 	/* Load ICV */
409ae4a825fSHoria Geanta 	append_seq_fifo_load(desc, ctx->authsize, FIFOLD_CLASS_CLASS2 |
410ae4a825fSHoria Geanta 			     FIFOLD_TYPE_LAST2 | FIFOLD_TYPE_ICV);
411ae4a825fSHoria Geanta 
412ae4a825fSHoria Geanta 	ctx->sh_desc_dec_dma = dma_map_single(jrdev, desc,
413ae4a825fSHoria Geanta 					      desc_bytes(desc),
414ae4a825fSHoria Geanta 					      DMA_TO_DEVICE);
415ae4a825fSHoria Geanta 	if (dma_mapping_error(jrdev, ctx->sh_desc_dec_dma)) {
416ae4a825fSHoria Geanta 		dev_err(jrdev, "unable to map shared descriptor\n");
417ae4a825fSHoria Geanta 		return -ENOMEM;
418ae4a825fSHoria Geanta 	}
419ae4a825fSHoria Geanta #ifdef DEBUG
420ae4a825fSHoria Geanta 	print_hex_dump(KERN_ERR,
421ae4a825fSHoria Geanta 		       "aead null dec shdesc@"__stringify(__LINE__)": ",
422ae4a825fSHoria Geanta 		       DUMP_PREFIX_ADDRESS, 16, 4, desc,
423ae4a825fSHoria Geanta 		       desc_bytes(desc), 1);
424ae4a825fSHoria Geanta #endif
425ae4a825fSHoria Geanta 
426ae4a825fSHoria Geanta 	return 0;
427ae4a825fSHoria Geanta }
428ae4a825fSHoria Geanta 
4291acebad3SYuan Kang static int aead_set_sh_desc(struct crypto_aead *aead)
4301acebad3SYuan Kang {
431479bcc7cSHerbert Xu 	struct caam_aead_alg *alg = container_of(crypto_aead_alg(aead),
432479bcc7cSHerbert Xu 						 struct caam_aead_alg, aead);
433add86d55SHerbert Xu 	unsigned int ivsize = crypto_aead_ivsize(aead);
4341acebad3SYuan Kang 	struct caam_ctx *ctx = crypto_aead_ctx(aead);
4351acebad3SYuan Kang 	struct device *jrdev = ctx->jrdev;
436daebc465SCatalin Vasile 	bool keys_fit_inline;
4371acebad3SYuan Kang 	u32 geniv, moveiv;
438daebc465SCatalin Vasile 	u32 ctx1_iv_off = 0;
4391acebad3SYuan Kang 	u32 *desc;
440daebc465SCatalin Vasile 	const bool ctr_mode = ((ctx->class1_alg_type & OP_ALG_AAI_MASK) ==
441daebc465SCatalin Vasile 			       OP_ALG_AAI_CTR_MOD128);
442479bcc7cSHerbert Xu 	const bool is_rfc3686 = alg->caam.rfc3686;
4431acebad3SYuan Kang 
4442fdea258SHoria Geantă 	if (!ctx->authsize)
4452fdea258SHoria Geantă 		return 0;
4462fdea258SHoria Geantă 
447ae4a825fSHoria Geanta 	/* NULL encryption / decryption */
448ae4a825fSHoria Geanta 	if (!ctx->enckeylen)
449ae4a825fSHoria Geanta 		return aead_null_set_sh_desc(aead);
450ae4a825fSHoria Geanta 
4511acebad3SYuan Kang 	/*
452daebc465SCatalin Vasile 	 * AES-CTR needs to load IV in CONTEXT1 reg
453daebc465SCatalin Vasile 	 * at an offset of 128bits (16bytes)
454daebc465SCatalin Vasile 	 * CONTEXT1[255:128] = IV
455daebc465SCatalin Vasile 	 */
456daebc465SCatalin Vasile 	if (ctr_mode)
457daebc465SCatalin Vasile 		ctx1_iv_off = 16;
458daebc465SCatalin Vasile 
459daebc465SCatalin Vasile 	/*
460daebc465SCatalin Vasile 	 * RFC3686 specific:
461daebc465SCatalin Vasile 	 *	CONTEXT1[255:128] = {NONCE, IV, COUNTER}
462daebc465SCatalin Vasile 	 */
463daebc465SCatalin Vasile 	if (is_rfc3686)
464daebc465SCatalin Vasile 		ctx1_iv_off = 16 + CTR_RFC3686_NONCE_SIZE;
465daebc465SCatalin Vasile 
466479bcc7cSHerbert Xu 	if (alg->caam.geniv)
467479bcc7cSHerbert Xu 		goto skip_enc;
468479bcc7cSHerbert Xu 
469daebc465SCatalin Vasile 	/*
4701acebad3SYuan Kang 	 * Job Descriptor and Shared Descriptors
4711acebad3SYuan Kang 	 * must all fit into the 64-word Descriptor h/w Buffer
4721acebad3SYuan Kang 	 */
473daebc465SCatalin Vasile 	keys_fit_inline = false;
474479bcc7cSHerbert Xu 	if (DESC_AEAD_ENC_LEN + AUTHENC_DESC_JOB_IO_LEN +
475daebc465SCatalin Vasile 	    ctx->split_key_pad_len + ctx->enckeylen +
476daebc465SCatalin Vasile 	    (is_rfc3686 ? DESC_AEAD_CTR_RFC3686_LEN : 0) <=
4771acebad3SYuan Kang 	    CAAM_DESC_BYTES_MAX)
4782af8f4a2SKim Phillips 		keys_fit_inline = true;
4791acebad3SYuan Kang 
480479bcc7cSHerbert Xu 	/* aead_encrypt shared descriptor */
4811acebad3SYuan Kang 	desc = ctx->sh_desc_enc;
4821acebad3SYuan Kang 
483daebc465SCatalin Vasile 	/* Note: Context registers are saved. */
484daebc465SCatalin Vasile 	init_sh_desc_key_aead(desc, ctx, keys_fit_inline, is_rfc3686);
4851acebad3SYuan Kang 
4861acebad3SYuan Kang 	/* Class 2 operation */
4871acebad3SYuan Kang 	append_operation(desc, ctx->class2_alg_type |
4881acebad3SYuan Kang 			 OP_ALG_AS_INITFINAL | OP_ALG_ENCRYPT);
4891acebad3SYuan Kang 
490479bcc7cSHerbert Xu 	/* Read and write assoclen bytes */
491479bcc7cSHerbert Xu 	append_math_add(desc, VARSEQINLEN, ZERO, REG3, CAAM_CMD_SZ);
492479bcc7cSHerbert Xu 	append_math_add(desc, VARSEQOUTLEN, ZERO, REG3, CAAM_CMD_SZ);
4931acebad3SYuan Kang 
494479bcc7cSHerbert Xu 	/* Skip assoc data */
495479bcc7cSHerbert Xu 	append_seq_fifo_store(desc, 0, FIFOST_TYPE_SKIP | FIFOLDST_VLF);
4961acebad3SYuan Kang 
4971acebad3SYuan Kang 	/* read assoc before reading payload */
4981acebad3SYuan Kang 	append_seq_fifo_load(desc, 0, FIFOLD_CLASS_CLASS2 | FIFOLD_TYPE_MSG |
499479bcc7cSHerbert Xu 				      FIFOLDST_VLF);
500daebc465SCatalin Vasile 
501daebc465SCatalin Vasile 	/* Load Counter into CONTEXT1 reg */
502daebc465SCatalin Vasile 	if (is_rfc3686)
503daebc465SCatalin Vasile 		append_load_imm_u32(desc, be32_to_cpu(1), LDST_IMM |
504daebc465SCatalin Vasile 				    LDST_CLASS_1_CCB |
505daebc465SCatalin Vasile 				    LDST_SRCDST_BYTE_CONTEXT |
506daebc465SCatalin Vasile 				    ((ctx1_iv_off + CTR_RFC3686_IV_SIZE) <<
507daebc465SCatalin Vasile 				     LDST_OFFSET_SHIFT));
5081acebad3SYuan Kang 
5091acebad3SYuan Kang 	/* Class 1 operation */
5101acebad3SYuan Kang 	append_operation(desc, ctx->class1_alg_type |
5111acebad3SYuan Kang 			 OP_ALG_AS_INITFINAL | OP_ALG_ENCRYPT);
5121acebad3SYuan Kang 
5131acebad3SYuan Kang 	/* Read and write cryptlen bytes */
514479bcc7cSHerbert Xu 	append_math_add(desc, VARSEQINLEN, SEQINLEN, REG0, CAAM_CMD_SZ);
515479bcc7cSHerbert Xu 	append_math_add(desc, VARSEQOUTLEN, SEQINLEN, REG0, CAAM_CMD_SZ);
5161acebad3SYuan Kang 	aead_append_src_dst(desc, FIFOLD_TYPE_MSG1OUT2);
5171acebad3SYuan Kang 
5181acebad3SYuan Kang 	/* Write ICV */
5191acebad3SYuan Kang 	append_seq_store(desc, ctx->authsize, LDST_CLASS_2_CCB |
5201acebad3SYuan Kang 			 LDST_SRCDST_BYTE_CONTEXT);
5211acebad3SYuan Kang 
5221acebad3SYuan Kang 	ctx->sh_desc_enc_dma = dma_map_single(jrdev, desc,
5231acebad3SYuan Kang 					      desc_bytes(desc),
5241acebad3SYuan Kang 					      DMA_TO_DEVICE);
5251acebad3SYuan Kang 	if (dma_mapping_error(jrdev, ctx->sh_desc_enc_dma)) {
5261acebad3SYuan Kang 		dev_err(jrdev, "unable to map shared descriptor\n");
5271acebad3SYuan Kang 		return -ENOMEM;
5281acebad3SYuan Kang 	}
5291acebad3SYuan Kang #ifdef DEBUG
530514df281SAlex Porosanu 	print_hex_dump(KERN_ERR, "aead enc shdesc@"__stringify(__LINE__)": ",
5311acebad3SYuan Kang 		       DUMP_PREFIX_ADDRESS, 16, 4, desc,
5321acebad3SYuan Kang 		       desc_bytes(desc), 1);
5331acebad3SYuan Kang #endif
5341acebad3SYuan Kang 
535479bcc7cSHerbert Xu skip_enc:
5361acebad3SYuan Kang 	/*
5371acebad3SYuan Kang 	 * Job Descriptor and Shared Descriptors
5381acebad3SYuan Kang 	 * must all fit into the 64-word Descriptor h/w Buffer
5391acebad3SYuan Kang 	 */
54080cd88f2SVakul Garg 	keys_fit_inline = false;
541479bcc7cSHerbert Xu 	if (DESC_AEAD_DEC_LEN + AUTHENC_DESC_JOB_IO_LEN +
542daebc465SCatalin Vasile 	    ctx->split_key_pad_len + ctx->enckeylen +
543daebc465SCatalin Vasile 	    (is_rfc3686 ? DESC_AEAD_CTR_RFC3686_LEN : 0) <=
5441acebad3SYuan Kang 	    CAAM_DESC_BYTES_MAX)
5452af8f4a2SKim Phillips 		keys_fit_inline = true;
5461acebad3SYuan Kang 
547479bcc7cSHerbert Xu 	/* aead_decrypt shared descriptor */
5481acebad3SYuan Kang 	desc = ctx->sh_desc_dec;
5491acebad3SYuan Kang 
550daebc465SCatalin Vasile 	/* Note: Context registers are saved. */
551daebc465SCatalin Vasile 	init_sh_desc_key_aead(desc, ctx, keys_fit_inline, is_rfc3686);
5521acebad3SYuan Kang 
5531acebad3SYuan Kang 	/* Class 2 operation */
5541acebad3SYuan Kang 	append_operation(desc, ctx->class2_alg_type |
5551acebad3SYuan Kang 			 OP_ALG_AS_INITFINAL | OP_ALG_DECRYPT | OP_ALG_ICV_ON);
5561acebad3SYuan Kang 
557479bcc7cSHerbert Xu 	/* Read and write assoclen bytes */
558479bcc7cSHerbert Xu 	append_math_add(desc, VARSEQINLEN, ZERO, REG3, CAAM_CMD_SZ);
559479bcc7cSHerbert Xu 	append_math_add(desc, VARSEQOUTLEN, ZERO, REG3, CAAM_CMD_SZ);
560479bcc7cSHerbert Xu 
561479bcc7cSHerbert Xu 	/* Skip assoc data */
562479bcc7cSHerbert Xu 	append_seq_fifo_store(desc, 0, FIFOST_TYPE_SKIP | FIFOLDST_VLF);
5631acebad3SYuan Kang 
5641acebad3SYuan Kang 	/* read assoc before reading payload */
5651acebad3SYuan Kang 	append_seq_fifo_load(desc, 0, FIFOLD_CLASS_CLASS2 | FIFOLD_TYPE_MSG |
5661acebad3SYuan Kang 			     KEY_VLF);
5671acebad3SYuan Kang 
568daebc465SCatalin Vasile 	/* Load Counter into CONTEXT1 reg */
569daebc465SCatalin Vasile 	if (is_rfc3686)
570daebc465SCatalin Vasile 		append_load_imm_u32(desc, be32_to_cpu(1), LDST_IMM |
571daebc465SCatalin Vasile 				    LDST_CLASS_1_CCB |
572daebc465SCatalin Vasile 				    LDST_SRCDST_BYTE_CONTEXT |
573daebc465SCatalin Vasile 				    ((ctx1_iv_off + CTR_RFC3686_IV_SIZE) <<
574daebc465SCatalin Vasile 				     LDST_OFFSET_SHIFT));
575daebc465SCatalin Vasile 
576daebc465SCatalin Vasile 	/* Choose operation */
577daebc465SCatalin Vasile 	if (ctr_mode)
578daebc465SCatalin Vasile 		append_operation(desc, ctx->class1_alg_type |
579daebc465SCatalin Vasile 				 OP_ALG_AS_INITFINAL | OP_ALG_DECRYPT);
580daebc465SCatalin Vasile 	else
5811acebad3SYuan Kang 		append_dec_op1(desc, ctx->class1_alg_type);
5821acebad3SYuan Kang 
5831acebad3SYuan Kang 	/* Read and write cryptlen bytes */
584479bcc7cSHerbert Xu 	append_math_add(desc, VARSEQINLEN, SEQOUTLEN, REG0, CAAM_CMD_SZ);
585479bcc7cSHerbert Xu 	append_math_add(desc, VARSEQOUTLEN, SEQOUTLEN, REG0, CAAM_CMD_SZ);
5861acebad3SYuan Kang 	aead_append_src_dst(desc, FIFOLD_TYPE_MSG);
5871acebad3SYuan Kang 
5881acebad3SYuan Kang 	/* Load ICV */
5891acebad3SYuan Kang 	append_seq_fifo_load(desc, ctx->authsize, FIFOLD_CLASS_CLASS2 |
5901acebad3SYuan Kang 			     FIFOLD_TYPE_LAST2 | FIFOLD_TYPE_ICV);
5911acebad3SYuan Kang 
5921acebad3SYuan Kang 	ctx->sh_desc_dec_dma = dma_map_single(jrdev, desc,
5931acebad3SYuan Kang 					      desc_bytes(desc),
5941acebad3SYuan Kang 					      DMA_TO_DEVICE);
5951acebad3SYuan Kang 	if (dma_mapping_error(jrdev, ctx->sh_desc_dec_dma)) {
5961acebad3SYuan Kang 		dev_err(jrdev, "unable to map shared descriptor\n");
5971acebad3SYuan Kang 		return -ENOMEM;
5981acebad3SYuan Kang 	}
5991acebad3SYuan Kang #ifdef DEBUG
600514df281SAlex Porosanu 	print_hex_dump(KERN_ERR, "aead dec shdesc@"__stringify(__LINE__)": ",
6011acebad3SYuan Kang 		       DUMP_PREFIX_ADDRESS, 16, 4, desc,
6021acebad3SYuan Kang 		       desc_bytes(desc), 1);
6031acebad3SYuan Kang #endif
6041acebad3SYuan Kang 
605479bcc7cSHerbert Xu 	if (!alg->caam.geniv)
606479bcc7cSHerbert Xu 		goto skip_givenc;
607479bcc7cSHerbert Xu 
6081acebad3SYuan Kang 	/*
6091acebad3SYuan Kang 	 * Job Descriptor and Shared Descriptors
6101acebad3SYuan Kang 	 * must all fit into the 64-word Descriptor h/w Buffer
6111acebad3SYuan Kang 	 */
61280cd88f2SVakul Garg 	keys_fit_inline = false;
613479bcc7cSHerbert Xu 	if (DESC_AEAD_GIVENC_LEN + AUTHENC_DESC_JOB_IO_LEN +
614daebc465SCatalin Vasile 	    ctx->split_key_pad_len + ctx->enckeylen +
615daebc465SCatalin Vasile 	    (is_rfc3686 ? DESC_AEAD_CTR_RFC3686_LEN : 0) <=
6161acebad3SYuan Kang 	    CAAM_DESC_BYTES_MAX)
6172af8f4a2SKim Phillips 		keys_fit_inline = true;
6181acebad3SYuan Kang 
6191acebad3SYuan Kang 	/* aead_givencrypt shared descriptor */
6201d2d87e8SHoria Geantă 	desc = ctx->sh_desc_enc;
6211acebad3SYuan Kang 
622daebc465SCatalin Vasile 	/* Note: Context registers are saved. */
623daebc465SCatalin Vasile 	init_sh_desc_key_aead(desc, ctx, keys_fit_inline, is_rfc3686);
6241acebad3SYuan Kang 
625479bcc7cSHerbert Xu 	if (is_rfc3686)
626479bcc7cSHerbert Xu 		goto copy_iv;
627479bcc7cSHerbert Xu 
6281acebad3SYuan Kang 	/* Generate IV */
6291acebad3SYuan Kang 	geniv = NFIFOENTRY_STYPE_PAD | NFIFOENTRY_DEST_DECO |
6301acebad3SYuan Kang 		NFIFOENTRY_DTYPE_MSG | NFIFOENTRY_LC1 |
631add86d55SHerbert Xu 		NFIFOENTRY_PTYPE_RND | (ivsize << NFIFOENTRY_DLEN_SHIFT);
6321acebad3SYuan Kang 	append_load_imm_u32(desc, geniv, LDST_CLASS_IND_CCB |
6331acebad3SYuan Kang 			    LDST_SRCDST_WORD_INFO_FIFO | LDST_IMM);
6341acebad3SYuan Kang 	append_cmd(desc, CMD_LOAD | DISABLE_AUTO_INFO_FIFO);
635daebc465SCatalin Vasile 	append_move(desc, MOVE_WAITCOMP |
636daebc465SCatalin Vasile 		    MOVE_SRC_INFIFO | MOVE_DEST_CLASS1CTX |
637daebc465SCatalin Vasile 		    (ctx1_iv_off << MOVE_OFFSET_SHIFT) |
638add86d55SHerbert Xu 		    (ivsize << MOVE_LEN_SHIFT));
6391acebad3SYuan Kang 	append_cmd(desc, CMD_LOAD | ENABLE_AUTO_INFO_FIFO);
6401acebad3SYuan Kang 
641479bcc7cSHerbert Xu copy_iv:
6421acebad3SYuan Kang 	/* Copy IV to class 1 context */
643daebc465SCatalin Vasile 	append_move(desc, MOVE_SRC_CLASS1CTX | MOVE_DEST_OUTFIFO |
644daebc465SCatalin Vasile 		    (ctx1_iv_off << MOVE_OFFSET_SHIFT) |
645add86d55SHerbert Xu 		    (ivsize << MOVE_LEN_SHIFT));
6461acebad3SYuan Kang 
6471acebad3SYuan Kang 	/* Return to encryption */
6481acebad3SYuan Kang 	append_operation(desc, ctx->class2_alg_type |
6491acebad3SYuan Kang 			 OP_ALG_AS_INITFINAL | OP_ALG_ENCRYPT);
6501acebad3SYuan Kang 
651479bcc7cSHerbert Xu 	/* Read and write assoclen bytes */
652479bcc7cSHerbert Xu 	append_math_add(desc, VARSEQINLEN, ZERO, REG3, CAAM_CMD_SZ);
653479bcc7cSHerbert Xu 	append_math_add(desc, VARSEQOUTLEN, ZERO, REG3, CAAM_CMD_SZ);
654479bcc7cSHerbert Xu 
6551d2d87e8SHoria Geantă 	/* ivsize + cryptlen = seqoutlen - authsize */
6561d2d87e8SHoria Geantă 	append_math_sub_imm_u32(desc, REG3, SEQOUTLEN, IMM, ctx->authsize);
6571d2d87e8SHoria Geantă 
658479bcc7cSHerbert Xu 	/* Skip assoc data */
659479bcc7cSHerbert Xu 	append_seq_fifo_store(desc, 0, FIFOST_TYPE_SKIP | FIFOLDST_VLF);
6601acebad3SYuan Kang 
6611acebad3SYuan Kang 	/* read assoc before reading payload */
6621acebad3SYuan Kang 	append_seq_fifo_load(desc, 0, FIFOLD_CLASS_CLASS2 | FIFOLD_TYPE_MSG |
6631acebad3SYuan Kang 			     KEY_VLF);
6641acebad3SYuan Kang 
665daebc465SCatalin Vasile 	/* Copy iv from outfifo to class 2 fifo */
6661acebad3SYuan Kang 	moveiv = NFIFOENTRY_STYPE_OFIFO | NFIFOENTRY_DEST_CLASS2 |
667add86d55SHerbert Xu 		 NFIFOENTRY_DTYPE_MSG | (ivsize << NFIFOENTRY_DLEN_SHIFT);
6681acebad3SYuan Kang 	append_load_imm_u32(desc, moveiv, LDST_CLASS_IND_CCB |
6691acebad3SYuan Kang 			    LDST_SRCDST_WORD_INFO_FIFO | LDST_IMM);
670add86d55SHerbert Xu 	append_load_imm_u32(desc, ivsize, LDST_CLASS_2_CCB |
6711acebad3SYuan Kang 			    LDST_SRCDST_WORD_DATASZ_REG | LDST_IMM);
6721acebad3SYuan Kang 
673daebc465SCatalin Vasile 	/* Load Counter into CONTEXT1 reg */
674daebc465SCatalin Vasile 	if (is_rfc3686)
675daebc465SCatalin Vasile 		append_load_imm_u32(desc, be32_to_cpu(1), LDST_IMM |
676daebc465SCatalin Vasile 				    LDST_CLASS_1_CCB |
677daebc465SCatalin Vasile 				    LDST_SRCDST_BYTE_CONTEXT |
678daebc465SCatalin Vasile 				    ((ctx1_iv_off + CTR_RFC3686_IV_SIZE) <<
679daebc465SCatalin Vasile 				     LDST_OFFSET_SHIFT));
680daebc465SCatalin Vasile 
6811acebad3SYuan Kang 	/* Class 1 operation */
6821acebad3SYuan Kang 	append_operation(desc, ctx->class1_alg_type |
6831acebad3SYuan Kang 			 OP_ALG_AS_INITFINAL | OP_ALG_ENCRYPT);
6841acebad3SYuan Kang 
6851acebad3SYuan Kang 	/* Will write ivsize + cryptlen */
6861acebad3SYuan Kang 	append_math_add(desc, VARSEQOUTLEN, SEQINLEN, REG0, CAAM_CMD_SZ);
6871acebad3SYuan Kang 
6881acebad3SYuan Kang 	/* Not need to reload iv */
689add86d55SHerbert Xu 	append_seq_fifo_load(desc, ivsize,
6901acebad3SYuan Kang 			     FIFOLD_CLASS_SKIP);
6911acebad3SYuan Kang 
6921acebad3SYuan Kang 	/* Will read cryptlen */
6931acebad3SYuan Kang 	append_math_add(desc, VARSEQINLEN, SEQINLEN, REG0, CAAM_CMD_SZ);
6941acebad3SYuan Kang 	aead_append_src_dst(desc, FIFOLD_TYPE_MSG1OUT2);
6951acebad3SYuan Kang 
6961acebad3SYuan Kang 	/* Write ICV */
6971acebad3SYuan Kang 	append_seq_store(desc, ctx->authsize, LDST_CLASS_2_CCB |
6981acebad3SYuan Kang 			 LDST_SRCDST_BYTE_CONTEXT);
6991acebad3SYuan Kang 
700479bcc7cSHerbert Xu 	ctx->sh_desc_enc_dma = dma_map_single(jrdev, desc,
7011acebad3SYuan Kang 					      desc_bytes(desc),
7021acebad3SYuan Kang 					      DMA_TO_DEVICE);
7031d2d87e8SHoria Geantă 	if (dma_mapping_error(jrdev, ctx->sh_desc_enc_dma)) {
7041acebad3SYuan Kang 		dev_err(jrdev, "unable to map shared descriptor\n");
7051acebad3SYuan Kang 		return -ENOMEM;
7061acebad3SYuan Kang 	}
7071acebad3SYuan Kang #ifdef DEBUG
708514df281SAlex Porosanu 	print_hex_dump(KERN_ERR, "aead givenc shdesc@"__stringify(__LINE__)": ",
7091acebad3SYuan Kang 		       DUMP_PREFIX_ADDRESS, 16, 4, desc,
7101acebad3SYuan Kang 		       desc_bytes(desc), 1);
7111acebad3SYuan Kang #endif
7121acebad3SYuan Kang 
713479bcc7cSHerbert Xu skip_givenc:
7141acebad3SYuan Kang 	return 0;
7151acebad3SYuan Kang }
7161acebad3SYuan Kang 
7170e479300SYuan Kang static int aead_setauthsize(struct crypto_aead *authenc,
7188e8ec596SKim Phillips 				    unsigned int authsize)
7198e8ec596SKim Phillips {
7208e8ec596SKim Phillips 	struct caam_ctx *ctx = crypto_aead_ctx(authenc);
7218e8ec596SKim Phillips 
7228e8ec596SKim Phillips 	ctx->authsize = authsize;
7231acebad3SYuan Kang 	aead_set_sh_desc(authenc);
7248e8ec596SKim Phillips 
7258e8ec596SKim Phillips 	return 0;
7268e8ec596SKim Phillips }
7278e8ec596SKim Phillips 
7283ef8d945STudor Ambarus static int gcm_set_sh_desc(struct crypto_aead *aead)
7293ef8d945STudor Ambarus {
7303ef8d945STudor Ambarus 	struct caam_ctx *ctx = crypto_aead_ctx(aead);
7313ef8d945STudor Ambarus 	struct device *jrdev = ctx->jrdev;
7323ef8d945STudor Ambarus 	bool keys_fit_inline = false;
7333ef8d945STudor Ambarus 	u32 *key_jump_cmd, *zero_payload_jump_cmd,
7343ef8d945STudor Ambarus 	    *zero_assoc_jump_cmd1, *zero_assoc_jump_cmd2;
7353ef8d945STudor Ambarus 	u32 *desc;
7363ef8d945STudor Ambarus 
7373ef8d945STudor Ambarus 	if (!ctx->enckeylen || !ctx->authsize)
7383ef8d945STudor Ambarus 		return 0;
7393ef8d945STudor Ambarus 
7403ef8d945STudor Ambarus 	/*
7413ef8d945STudor Ambarus 	 * AES GCM encrypt shared descriptor
7423ef8d945STudor Ambarus 	 * Job Descriptor and Shared Descriptor
7433ef8d945STudor Ambarus 	 * must fit into the 64-word Descriptor h/w Buffer
7443ef8d945STudor Ambarus 	 */
745f2147b88SHerbert Xu 	if (DESC_GCM_ENC_LEN + GCM_DESC_JOB_IO_LEN +
7463ef8d945STudor Ambarus 	    ctx->enckeylen <= CAAM_DESC_BYTES_MAX)
7473ef8d945STudor Ambarus 		keys_fit_inline = true;
7483ef8d945STudor Ambarus 
7493ef8d945STudor Ambarus 	desc = ctx->sh_desc_enc;
7503ef8d945STudor Ambarus 
7513ef8d945STudor Ambarus 	init_sh_desc(desc, HDR_SHARE_SERIAL);
7523ef8d945STudor Ambarus 
7533ef8d945STudor Ambarus 	/* skip key loading if they are loaded due to sharing */
7543ef8d945STudor Ambarus 	key_jump_cmd = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL |
7553ef8d945STudor Ambarus 				   JUMP_COND_SHRD | JUMP_COND_SELF);
7563ef8d945STudor Ambarus 	if (keys_fit_inline)
7573ef8d945STudor Ambarus 		append_key_as_imm(desc, (void *)ctx->key, ctx->enckeylen,
7583ef8d945STudor Ambarus 				  ctx->enckeylen, CLASS_1 | KEY_DEST_CLASS_REG);
7593ef8d945STudor Ambarus 	else
7603ef8d945STudor Ambarus 		append_key(desc, ctx->key_dma, ctx->enckeylen,
7613ef8d945STudor Ambarus 			   CLASS_1 | KEY_DEST_CLASS_REG);
7623ef8d945STudor Ambarus 	set_jump_tgt_here(desc, key_jump_cmd);
7633ef8d945STudor Ambarus 
7643ef8d945STudor Ambarus 	/* class 1 operation */
7653ef8d945STudor Ambarus 	append_operation(desc, ctx->class1_alg_type |
7663ef8d945STudor Ambarus 			 OP_ALG_AS_INITFINAL | OP_ALG_ENCRYPT);
7673ef8d945STudor Ambarus 
768f2147b88SHerbert Xu 	/* if assoclen + cryptlen is ZERO, skip to ICV write */
769f2147b88SHerbert Xu 	append_math_sub(desc, VARSEQOUTLEN, SEQINLEN, REG0, CAAM_CMD_SZ);
770f2147b88SHerbert Xu 	zero_assoc_jump_cmd2 = append_jump(desc, JUMP_TEST_ALL |
7713ef8d945STudor Ambarus 						 JUMP_COND_MATH_Z);
7723ef8d945STudor Ambarus 
7733ef8d945STudor Ambarus 	/* if assoclen is ZERO, skip reading the assoc data */
774f2147b88SHerbert Xu 	append_math_add(desc, VARSEQINLEN, ZERO, REG3, CAAM_CMD_SZ);
7753ef8d945STudor Ambarus 	zero_assoc_jump_cmd1 = append_jump(desc, JUMP_TEST_ALL |
7763ef8d945STudor Ambarus 						 JUMP_COND_MATH_Z);
7773ef8d945STudor Ambarus 
778f2147b88SHerbert Xu 	append_math_add(desc, VARSEQOUTLEN, ZERO, REG3, CAAM_CMD_SZ);
779f2147b88SHerbert Xu 
780f2147b88SHerbert Xu 	/* skip assoc data */
781f2147b88SHerbert Xu 	append_seq_fifo_store(desc, 0, FIFOST_TYPE_SKIP | FIFOLDST_VLF);
782f2147b88SHerbert Xu 
783f2147b88SHerbert Xu 	/* cryptlen = seqinlen - assoclen */
784f2147b88SHerbert Xu 	append_math_sub(desc, VARSEQOUTLEN, SEQINLEN, REG3, CAAM_CMD_SZ);
785f2147b88SHerbert Xu 
786f2147b88SHerbert Xu 	/* if cryptlen is ZERO jump to zero-payload commands */
787f2147b88SHerbert Xu 	zero_payload_jump_cmd = append_jump(desc, JUMP_TEST_ALL |
788f2147b88SHerbert Xu 					    JUMP_COND_MATH_Z);
789f2147b88SHerbert Xu 
7903ef8d945STudor Ambarus 	/* read assoc data */
7913ef8d945STudor Ambarus 	append_seq_fifo_load(desc, 0, FIFOLD_CLASS_CLASS1 | FIFOLDST_VLF |
7923ef8d945STudor Ambarus 			     FIFOLD_TYPE_AAD | FIFOLD_TYPE_FLUSH1);
7933ef8d945STudor Ambarus 	set_jump_tgt_here(desc, zero_assoc_jump_cmd1);
7943ef8d945STudor Ambarus 
795f2147b88SHerbert Xu 	append_math_sub(desc, VARSEQINLEN, SEQINLEN, REG0, CAAM_CMD_SZ);
7963ef8d945STudor Ambarus 
7973ef8d945STudor Ambarus 	/* write encrypted data */
7983ef8d945STudor Ambarus 	append_seq_fifo_store(desc, 0, FIFOST_TYPE_MESSAGE_DATA | FIFOLDST_VLF);
7993ef8d945STudor Ambarus 
8003ef8d945STudor Ambarus 	/* read payload data */
8013ef8d945STudor Ambarus 	append_seq_fifo_load(desc, 0, FIFOLD_CLASS_CLASS1 | FIFOLDST_VLF |
8023ef8d945STudor Ambarus 			     FIFOLD_TYPE_MSG | FIFOLD_TYPE_LAST1);
8033ef8d945STudor Ambarus 
8043ef8d945STudor Ambarus 	/* jump the zero-payload commands */
805f2147b88SHerbert Xu 	append_jump(desc, JUMP_TEST_ALL | 2);
8063ef8d945STudor Ambarus 
8073ef8d945STudor Ambarus 	/* zero-payload commands */
8083ef8d945STudor Ambarus 	set_jump_tgt_here(desc, zero_payload_jump_cmd);
8093ef8d945STudor Ambarus 
8103ef8d945STudor Ambarus 	/* read assoc data */
8113ef8d945STudor Ambarus 	append_seq_fifo_load(desc, 0, FIFOLD_CLASS_CLASS1 | FIFOLDST_VLF |
8123ef8d945STudor Ambarus 			     FIFOLD_TYPE_AAD | FIFOLD_TYPE_LAST1);
8133ef8d945STudor Ambarus 
814f2147b88SHerbert Xu 	/* There is no input data */
8153ef8d945STudor Ambarus 	set_jump_tgt_here(desc, zero_assoc_jump_cmd2);
8163ef8d945STudor Ambarus 
8173ef8d945STudor Ambarus 	/* write ICV */
8183ef8d945STudor Ambarus 	append_seq_store(desc, ctx->authsize, LDST_CLASS_1_CCB |
8193ef8d945STudor Ambarus 			 LDST_SRCDST_BYTE_CONTEXT);
8203ef8d945STudor Ambarus 
8213ef8d945STudor Ambarus 	ctx->sh_desc_enc_dma = dma_map_single(jrdev, desc,
8223ef8d945STudor Ambarus 					      desc_bytes(desc),
8233ef8d945STudor Ambarus 					      DMA_TO_DEVICE);
8243ef8d945STudor Ambarus 	if (dma_mapping_error(jrdev, ctx->sh_desc_enc_dma)) {
8253ef8d945STudor Ambarus 		dev_err(jrdev, "unable to map shared descriptor\n");
8263ef8d945STudor Ambarus 		return -ENOMEM;
8273ef8d945STudor Ambarus 	}
8283ef8d945STudor Ambarus #ifdef DEBUG
8293ef8d945STudor Ambarus 	print_hex_dump(KERN_ERR, "gcm enc shdesc@"__stringify(__LINE__)": ",
8303ef8d945STudor Ambarus 		       DUMP_PREFIX_ADDRESS, 16, 4, desc,
8313ef8d945STudor Ambarus 		       desc_bytes(desc), 1);
8323ef8d945STudor Ambarus #endif
8333ef8d945STudor Ambarus 
8343ef8d945STudor Ambarus 	/*
8353ef8d945STudor Ambarus 	 * Job Descriptor and Shared Descriptors
8363ef8d945STudor Ambarus 	 * must all fit into the 64-word Descriptor h/w Buffer
8373ef8d945STudor Ambarus 	 */
8383ef8d945STudor Ambarus 	keys_fit_inline = false;
839f2147b88SHerbert Xu 	if (DESC_GCM_DEC_LEN + GCM_DESC_JOB_IO_LEN +
8403ef8d945STudor Ambarus 	    ctx->enckeylen <= CAAM_DESC_BYTES_MAX)
8413ef8d945STudor Ambarus 		keys_fit_inline = true;
8423ef8d945STudor Ambarus 
8433ef8d945STudor Ambarus 	desc = ctx->sh_desc_dec;
8443ef8d945STudor Ambarus 
8453ef8d945STudor Ambarus 	init_sh_desc(desc, HDR_SHARE_SERIAL);
8463ef8d945STudor Ambarus 
8473ef8d945STudor Ambarus 	/* skip key loading if they are loaded due to sharing */
8483ef8d945STudor Ambarus 	key_jump_cmd = append_jump(desc, JUMP_JSL |
8493ef8d945STudor Ambarus 				   JUMP_TEST_ALL | JUMP_COND_SHRD |
8503ef8d945STudor Ambarus 				   JUMP_COND_SELF);
8513ef8d945STudor Ambarus 	if (keys_fit_inline)
8523ef8d945STudor Ambarus 		append_key_as_imm(desc, (void *)ctx->key, ctx->enckeylen,
8533ef8d945STudor Ambarus 				  ctx->enckeylen, CLASS_1 | KEY_DEST_CLASS_REG);
8543ef8d945STudor Ambarus 	else
8553ef8d945STudor Ambarus 		append_key(desc, ctx->key_dma, ctx->enckeylen,
8563ef8d945STudor Ambarus 			   CLASS_1 | KEY_DEST_CLASS_REG);
8573ef8d945STudor Ambarus 	set_jump_tgt_here(desc, key_jump_cmd);
8583ef8d945STudor Ambarus 
8593ef8d945STudor Ambarus 	/* class 1 operation */
8603ef8d945STudor Ambarus 	append_operation(desc, ctx->class1_alg_type |
8613ef8d945STudor Ambarus 			 OP_ALG_AS_INITFINAL | OP_ALG_DECRYPT | OP_ALG_ICV_ON);
8623ef8d945STudor Ambarus 
863f2147b88SHerbert Xu 	/* if assoclen is ZERO, skip reading the assoc data */
864f2147b88SHerbert Xu 	append_math_add(desc, VARSEQINLEN, ZERO, REG3, CAAM_CMD_SZ);
8653ef8d945STudor Ambarus 	zero_assoc_jump_cmd1 = append_jump(desc, JUMP_TEST_ALL |
8663ef8d945STudor Ambarus 						 JUMP_COND_MATH_Z);
867f2147b88SHerbert Xu 
868f2147b88SHerbert Xu 	append_math_add(desc, VARSEQOUTLEN, ZERO, REG3, CAAM_CMD_SZ);
869f2147b88SHerbert Xu 
870f2147b88SHerbert Xu 	/* skip assoc data */
871f2147b88SHerbert Xu 	append_seq_fifo_store(desc, 0, FIFOST_TYPE_SKIP | FIFOLDST_VLF);
872f2147b88SHerbert Xu 
8733ef8d945STudor Ambarus 	/* read assoc data */
8743ef8d945STudor Ambarus 	append_seq_fifo_load(desc, 0, FIFOLD_CLASS_CLASS1 | FIFOLDST_VLF |
8753ef8d945STudor Ambarus 			     FIFOLD_TYPE_AAD | FIFOLD_TYPE_FLUSH1);
876f2147b88SHerbert Xu 
8773ef8d945STudor Ambarus 	set_jump_tgt_here(desc, zero_assoc_jump_cmd1);
8783ef8d945STudor Ambarus 
879f2147b88SHerbert Xu 	/* cryptlen = seqoutlen - assoclen */
880f2147b88SHerbert Xu 	append_math_sub(desc, VARSEQINLEN, SEQOUTLEN, REG0, CAAM_CMD_SZ);
881f2147b88SHerbert Xu 
882f2147b88SHerbert Xu 	/* jump to zero-payload command if cryptlen is zero */
883f2147b88SHerbert Xu 	zero_payload_jump_cmd = append_jump(desc, JUMP_TEST_ALL |
884f2147b88SHerbert Xu 					    JUMP_COND_MATH_Z);
885f2147b88SHerbert Xu 
886f2147b88SHerbert Xu 	append_math_sub(desc, VARSEQOUTLEN, SEQOUTLEN, REG0, CAAM_CMD_SZ);
8873ef8d945STudor Ambarus 
8883ef8d945STudor Ambarus 	/* store encrypted data */
8893ef8d945STudor Ambarus 	append_seq_fifo_store(desc, 0, FIFOST_TYPE_MESSAGE_DATA | FIFOLDST_VLF);
8903ef8d945STudor Ambarus 
8913ef8d945STudor Ambarus 	/* read payload data */
8923ef8d945STudor Ambarus 	append_seq_fifo_load(desc, 0, FIFOLD_CLASS_CLASS1 | FIFOLDST_VLF |
8933ef8d945STudor Ambarus 			     FIFOLD_TYPE_MSG | FIFOLD_TYPE_FLUSH1);
8943ef8d945STudor Ambarus 
8953ef8d945STudor Ambarus 	/* zero-payload command */
8963ef8d945STudor Ambarus 	set_jump_tgt_here(desc, zero_payload_jump_cmd);
8973ef8d945STudor Ambarus 
8983ef8d945STudor Ambarus 	/* read ICV */
8993ef8d945STudor Ambarus 	append_seq_fifo_load(desc, ctx->authsize, FIFOLD_CLASS_CLASS1 |
9003ef8d945STudor Ambarus 			     FIFOLD_TYPE_ICV | FIFOLD_TYPE_LAST1);
9013ef8d945STudor Ambarus 
9023ef8d945STudor Ambarus 	ctx->sh_desc_dec_dma = dma_map_single(jrdev, desc,
9033ef8d945STudor Ambarus 					      desc_bytes(desc),
9043ef8d945STudor Ambarus 					      DMA_TO_DEVICE);
9053ef8d945STudor Ambarus 	if (dma_mapping_error(jrdev, ctx->sh_desc_dec_dma)) {
9063ef8d945STudor Ambarus 		dev_err(jrdev, "unable to map shared descriptor\n");
9073ef8d945STudor Ambarus 		return -ENOMEM;
9083ef8d945STudor Ambarus 	}
9093ef8d945STudor Ambarus #ifdef DEBUG
9103ef8d945STudor Ambarus 	print_hex_dump(KERN_ERR, "gcm dec shdesc@"__stringify(__LINE__)": ",
9113ef8d945STudor Ambarus 		       DUMP_PREFIX_ADDRESS, 16, 4, desc,
9123ef8d945STudor Ambarus 		       desc_bytes(desc), 1);
9133ef8d945STudor Ambarus #endif
9143ef8d945STudor Ambarus 
9153ef8d945STudor Ambarus 	return 0;
9163ef8d945STudor Ambarus }
9173ef8d945STudor Ambarus 
9183ef8d945STudor Ambarus static int gcm_setauthsize(struct crypto_aead *authenc, unsigned int authsize)
9193ef8d945STudor Ambarus {
9203ef8d945STudor Ambarus 	struct caam_ctx *ctx = crypto_aead_ctx(authenc);
9213ef8d945STudor Ambarus 
9223ef8d945STudor Ambarus 	ctx->authsize = authsize;
9233ef8d945STudor Ambarus 	gcm_set_sh_desc(authenc);
9243ef8d945STudor Ambarus 
9253ef8d945STudor Ambarus 	return 0;
9263ef8d945STudor Ambarus }
9273ef8d945STudor Ambarus 
928bac68f2cSTudor Ambarus static int rfc4106_set_sh_desc(struct crypto_aead *aead)
929bac68f2cSTudor Ambarus {
930bac68f2cSTudor Ambarus 	struct caam_ctx *ctx = crypto_aead_ctx(aead);
931bac68f2cSTudor Ambarus 	struct device *jrdev = ctx->jrdev;
932bac68f2cSTudor Ambarus 	bool keys_fit_inline = false;
933f2147b88SHerbert Xu 	u32 *key_jump_cmd;
934bac68f2cSTudor Ambarus 	u32 *desc;
935bac68f2cSTudor Ambarus 
936bac68f2cSTudor Ambarus 	if (!ctx->enckeylen || !ctx->authsize)
937bac68f2cSTudor Ambarus 		return 0;
938bac68f2cSTudor Ambarus 
939bac68f2cSTudor Ambarus 	/*
940bac68f2cSTudor Ambarus 	 * RFC4106 encrypt shared descriptor
941bac68f2cSTudor Ambarus 	 * Job Descriptor and Shared Descriptor
942bac68f2cSTudor Ambarus 	 * must fit into the 64-word Descriptor h/w Buffer
943bac68f2cSTudor Ambarus 	 */
944f2147b88SHerbert Xu 	if (DESC_RFC4106_ENC_LEN + GCM_DESC_JOB_IO_LEN +
945bac68f2cSTudor Ambarus 	    ctx->enckeylen <= CAAM_DESC_BYTES_MAX)
946bac68f2cSTudor Ambarus 		keys_fit_inline = true;
947bac68f2cSTudor Ambarus 
948bac68f2cSTudor Ambarus 	desc = ctx->sh_desc_enc;
949bac68f2cSTudor Ambarus 
950bac68f2cSTudor Ambarus 	init_sh_desc(desc, HDR_SHARE_SERIAL);
951bac68f2cSTudor Ambarus 
952bac68f2cSTudor Ambarus 	/* Skip key loading if it is loaded due to sharing */
953bac68f2cSTudor Ambarus 	key_jump_cmd = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL |
954bac68f2cSTudor Ambarus 				   JUMP_COND_SHRD);
955bac68f2cSTudor Ambarus 	if (keys_fit_inline)
956bac68f2cSTudor Ambarus 		append_key_as_imm(desc, (void *)ctx->key, ctx->enckeylen,
957bac68f2cSTudor Ambarus 				  ctx->enckeylen, CLASS_1 | KEY_DEST_CLASS_REG);
958bac68f2cSTudor Ambarus 	else
959bac68f2cSTudor Ambarus 		append_key(desc, ctx->key_dma, ctx->enckeylen,
960bac68f2cSTudor Ambarus 			   CLASS_1 | KEY_DEST_CLASS_REG);
961bac68f2cSTudor Ambarus 	set_jump_tgt_here(desc, key_jump_cmd);
962bac68f2cSTudor Ambarus 
963bac68f2cSTudor Ambarus 	/* Class 1 operation */
964bac68f2cSTudor Ambarus 	append_operation(desc, ctx->class1_alg_type |
965bac68f2cSTudor Ambarus 			 OP_ALG_AS_INITFINAL | OP_ALG_ENCRYPT);
966bac68f2cSTudor Ambarus 
96746218750SHerbert Xu 	append_math_sub_imm_u32(desc, VARSEQINLEN, REG3, IMM, 8);
968bac68f2cSTudor Ambarus 	append_math_add(desc, VARSEQOUTLEN, ZERO, REG3, CAAM_CMD_SZ);
969bac68f2cSTudor Ambarus 
970bac68f2cSTudor Ambarus 	/* Read assoc data */
971bac68f2cSTudor Ambarus 	append_seq_fifo_load(desc, 0, FIFOLD_CLASS_CLASS1 | FIFOLDST_VLF |
972bac68f2cSTudor Ambarus 			     FIFOLD_TYPE_AAD | FIFOLD_TYPE_FLUSH1);
973bac68f2cSTudor Ambarus 
97446218750SHerbert Xu 	/* Skip IV */
97546218750SHerbert Xu 	append_seq_fifo_load(desc, 8, FIFOLD_CLASS_SKIP);
976f2147b88SHerbert Xu 
977bac68f2cSTudor Ambarus 	/* Will read cryptlen bytes */
978f2147b88SHerbert Xu 	append_math_sub(desc, VARSEQINLEN, SEQINLEN, REG0, CAAM_CMD_SZ);
979bac68f2cSTudor Ambarus 
9804aad0cc5SHoria Geant? 	/* Workaround for erratum A-005473 (simultaneous SEQ FIFO skips) */
9814aad0cc5SHoria Geant? 	append_seq_fifo_load(desc, 0, FIFOLD_CLASS_CLASS1 | FIFOLD_TYPE_MSG);
982bac68f2cSTudor Ambarus 
98346218750SHerbert Xu 	/* Skip assoc data */
98446218750SHerbert Xu 	append_seq_fifo_store(desc, 0, FIFOST_TYPE_SKIP | FIFOLDST_VLF);
98546218750SHerbert Xu 
98646218750SHerbert Xu 	/* cryptlen = seqoutlen - assoclen */
9874aad0cc5SHoria Geant? 	append_math_sub(desc, VARSEQOUTLEN, VARSEQINLEN, REG0, CAAM_CMD_SZ);
98846218750SHerbert Xu 
98946218750SHerbert Xu 	/* Write encrypted data */
99046218750SHerbert Xu 	append_seq_fifo_store(desc, 0, FIFOST_TYPE_MESSAGE_DATA | FIFOLDST_VLF);
99146218750SHerbert Xu 
9924aad0cc5SHoria Geant? 	/* Read payload data */
9934aad0cc5SHoria Geant? 	append_seq_fifo_load(desc, 0, FIFOLD_CLASS_CLASS1 | FIFOLDST_VLF |
9944aad0cc5SHoria Geant? 			     FIFOLD_TYPE_MSG | FIFOLD_TYPE_LAST1);
9954aad0cc5SHoria Geant? 
996bac68f2cSTudor Ambarus 	/* Write ICV */
997bac68f2cSTudor Ambarus 	append_seq_store(desc, ctx->authsize, LDST_CLASS_1_CCB |
998bac68f2cSTudor Ambarus 			 LDST_SRCDST_BYTE_CONTEXT);
999bac68f2cSTudor Ambarus 
1000bac68f2cSTudor Ambarus 	ctx->sh_desc_enc_dma = dma_map_single(jrdev, desc,
1001bac68f2cSTudor Ambarus 					      desc_bytes(desc),
1002bac68f2cSTudor Ambarus 					      DMA_TO_DEVICE);
1003bac68f2cSTudor Ambarus 	if (dma_mapping_error(jrdev, ctx->sh_desc_enc_dma)) {
1004bac68f2cSTudor Ambarus 		dev_err(jrdev, "unable to map shared descriptor\n");
1005bac68f2cSTudor Ambarus 		return -ENOMEM;
1006bac68f2cSTudor Ambarus 	}
1007bac68f2cSTudor Ambarus #ifdef DEBUG
1008bac68f2cSTudor Ambarus 	print_hex_dump(KERN_ERR, "rfc4106 enc shdesc@"__stringify(__LINE__)": ",
1009bac68f2cSTudor Ambarus 		       DUMP_PREFIX_ADDRESS, 16, 4, desc,
1010bac68f2cSTudor Ambarus 		       desc_bytes(desc), 1);
1011bac68f2cSTudor Ambarus #endif
1012bac68f2cSTudor Ambarus 
1013bac68f2cSTudor Ambarus 	/*
1014bac68f2cSTudor Ambarus 	 * Job Descriptor and Shared Descriptors
1015bac68f2cSTudor Ambarus 	 * must all fit into the 64-word Descriptor h/w Buffer
1016bac68f2cSTudor Ambarus 	 */
1017bac68f2cSTudor Ambarus 	keys_fit_inline = false;
1018bac68f2cSTudor Ambarus 	if (DESC_RFC4106_DEC_LEN + DESC_JOB_IO_LEN +
1019bac68f2cSTudor Ambarus 	    ctx->enckeylen <= CAAM_DESC_BYTES_MAX)
1020bac68f2cSTudor Ambarus 		keys_fit_inline = true;
1021bac68f2cSTudor Ambarus 
1022bac68f2cSTudor Ambarus 	desc = ctx->sh_desc_dec;
1023bac68f2cSTudor Ambarus 
1024bac68f2cSTudor Ambarus 	init_sh_desc(desc, HDR_SHARE_SERIAL);
1025bac68f2cSTudor Ambarus 
1026bac68f2cSTudor Ambarus 	/* Skip key loading if it is loaded due to sharing */
1027bac68f2cSTudor Ambarus 	key_jump_cmd = append_jump(desc, JUMP_JSL |
1028bac68f2cSTudor Ambarus 				   JUMP_TEST_ALL | JUMP_COND_SHRD);
1029bac68f2cSTudor Ambarus 	if (keys_fit_inline)
1030bac68f2cSTudor Ambarus 		append_key_as_imm(desc, (void *)ctx->key, ctx->enckeylen,
1031bac68f2cSTudor Ambarus 				  ctx->enckeylen, CLASS_1 | KEY_DEST_CLASS_REG);
1032bac68f2cSTudor Ambarus 	else
1033bac68f2cSTudor Ambarus 		append_key(desc, ctx->key_dma, ctx->enckeylen,
1034bac68f2cSTudor Ambarus 			   CLASS_1 | KEY_DEST_CLASS_REG);
1035bac68f2cSTudor Ambarus 	set_jump_tgt_here(desc, key_jump_cmd);
1036bac68f2cSTudor Ambarus 
1037bac68f2cSTudor Ambarus 	/* Class 1 operation */
1038bac68f2cSTudor Ambarus 	append_operation(desc, ctx->class1_alg_type |
1039bac68f2cSTudor Ambarus 			 OP_ALG_AS_INITFINAL | OP_ALG_DECRYPT | OP_ALG_ICV_ON);
1040bac68f2cSTudor Ambarus 
104146218750SHerbert Xu 	append_math_sub_imm_u32(desc, VARSEQINLEN, REG3, IMM, 8);
1042f2147b88SHerbert Xu 	append_math_add(desc, VARSEQOUTLEN, ZERO, REG3, CAAM_CMD_SZ);
1043bac68f2cSTudor Ambarus 
1044bac68f2cSTudor Ambarus 	/* Read assoc data */
1045bac68f2cSTudor Ambarus 	append_seq_fifo_load(desc, 0, FIFOLD_CLASS_CLASS1 | FIFOLDST_VLF |
1046bac68f2cSTudor Ambarus 			     FIFOLD_TYPE_AAD | FIFOLD_TYPE_FLUSH1);
1047bac68f2cSTudor Ambarus 
104846218750SHerbert Xu 	/* Skip IV */
104946218750SHerbert Xu 	append_seq_fifo_load(desc, 8, FIFOLD_CLASS_SKIP);
1050f2147b88SHerbert Xu 
1051bac68f2cSTudor Ambarus 	/* Will read cryptlen bytes */
105246218750SHerbert Xu 	append_math_sub(desc, VARSEQINLEN, SEQOUTLEN, REG3, CAAM_CMD_SZ);
1053bac68f2cSTudor Ambarus 
10544aad0cc5SHoria Geant? 	/* Workaround for erratum A-005473 (simultaneous SEQ FIFO skips) */
10554aad0cc5SHoria Geant? 	append_seq_fifo_load(desc, 0, FIFOLD_CLASS_CLASS1 | FIFOLD_TYPE_MSG);
1056bac68f2cSTudor Ambarus 
105746218750SHerbert Xu 	/* Skip assoc data */
105846218750SHerbert Xu 	append_seq_fifo_store(desc, 0, FIFOST_TYPE_SKIP | FIFOLDST_VLF);
105946218750SHerbert Xu 
106046218750SHerbert Xu 	/* Will write cryptlen bytes */
106146218750SHerbert Xu 	append_math_sub(desc, VARSEQOUTLEN, SEQOUTLEN, REG0, CAAM_CMD_SZ);
106246218750SHerbert Xu 
106346218750SHerbert Xu 	/* Store payload data */
106446218750SHerbert Xu 	append_seq_fifo_store(desc, 0, FIFOST_TYPE_MESSAGE_DATA | FIFOLDST_VLF);
106546218750SHerbert Xu 
10664aad0cc5SHoria Geant? 	/* Read encrypted data */
10674aad0cc5SHoria Geant? 	append_seq_fifo_load(desc, 0, FIFOLD_CLASS_CLASS1 | FIFOLDST_VLF |
10684aad0cc5SHoria Geant? 			     FIFOLD_TYPE_MSG | FIFOLD_TYPE_FLUSH1);
10694aad0cc5SHoria Geant? 
1070bac68f2cSTudor Ambarus 	/* Read ICV */
1071bac68f2cSTudor Ambarus 	append_seq_fifo_load(desc, ctx->authsize, FIFOLD_CLASS_CLASS1 |
1072bac68f2cSTudor Ambarus 			     FIFOLD_TYPE_ICV | FIFOLD_TYPE_LAST1);
1073bac68f2cSTudor Ambarus 
1074bac68f2cSTudor Ambarus 	ctx->sh_desc_dec_dma = dma_map_single(jrdev, desc,
1075bac68f2cSTudor Ambarus 					      desc_bytes(desc),
1076bac68f2cSTudor Ambarus 					      DMA_TO_DEVICE);
1077bac68f2cSTudor Ambarus 	if (dma_mapping_error(jrdev, ctx->sh_desc_dec_dma)) {
1078bac68f2cSTudor Ambarus 		dev_err(jrdev, "unable to map shared descriptor\n");
1079bac68f2cSTudor Ambarus 		return -ENOMEM;
1080bac68f2cSTudor Ambarus 	}
1081bac68f2cSTudor Ambarus #ifdef DEBUG
1082bac68f2cSTudor Ambarus 	print_hex_dump(KERN_ERR, "rfc4106 dec shdesc@"__stringify(__LINE__)": ",
1083bac68f2cSTudor Ambarus 		       DUMP_PREFIX_ADDRESS, 16, 4, desc,
1084bac68f2cSTudor Ambarus 		       desc_bytes(desc), 1);
1085bac68f2cSTudor Ambarus #endif
1086bac68f2cSTudor Ambarus 
1087bac68f2cSTudor Ambarus 	return 0;
1088bac68f2cSTudor Ambarus }
1089bac68f2cSTudor Ambarus 
1090bac68f2cSTudor Ambarus static int rfc4106_setauthsize(struct crypto_aead *authenc,
1091bac68f2cSTudor Ambarus 			       unsigned int authsize)
1092bac68f2cSTudor Ambarus {
1093bac68f2cSTudor Ambarus 	struct caam_ctx *ctx = crypto_aead_ctx(authenc);
1094bac68f2cSTudor Ambarus 
1095bac68f2cSTudor Ambarus 	ctx->authsize = authsize;
1096bac68f2cSTudor Ambarus 	rfc4106_set_sh_desc(authenc);
1097bac68f2cSTudor Ambarus 
1098bac68f2cSTudor Ambarus 	return 0;
1099bac68f2cSTudor Ambarus }
1100bac68f2cSTudor Ambarus 
11015d0429a3STudor Ambarus static int rfc4543_set_sh_desc(struct crypto_aead *aead)
11025d0429a3STudor Ambarus {
11035d0429a3STudor Ambarus 	struct caam_ctx *ctx = crypto_aead_ctx(aead);
11045d0429a3STudor Ambarus 	struct device *jrdev = ctx->jrdev;
11055d0429a3STudor Ambarus 	bool keys_fit_inline = false;
1106f2147b88SHerbert Xu 	u32 *key_jump_cmd;
11075d0429a3STudor Ambarus 	u32 *read_move_cmd, *write_move_cmd;
11085d0429a3STudor Ambarus 	u32 *desc;
11095d0429a3STudor Ambarus 
11105d0429a3STudor Ambarus 	if (!ctx->enckeylen || !ctx->authsize)
11115d0429a3STudor Ambarus 		return 0;
11125d0429a3STudor Ambarus 
11135d0429a3STudor Ambarus 	/*
11145d0429a3STudor Ambarus 	 * RFC4543 encrypt shared descriptor
11155d0429a3STudor Ambarus 	 * Job Descriptor and Shared Descriptor
11165d0429a3STudor Ambarus 	 * must fit into the 64-word Descriptor h/w Buffer
11175d0429a3STudor Ambarus 	 */
1118f2147b88SHerbert Xu 	if (DESC_RFC4543_ENC_LEN + GCM_DESC_JOB_IO_LEN +
11195d0429a3STudor Ambarus 	    ctx->enckeylen <= CAAM_DESC_BYTES_MAX)
11205d0429a3STudor Ambarus 		keys_fit_inline = true;
11215d0429a3STudor Ambarus 
11225d0429a3STudor Ambarus 	desc = ctx->sh_desc_enc;
11235d0429a3STudor Ambarus 
11245d0429a3STudor Ambarus 	init_sh_desc(desc, HDR_SHARE_SERIAL);
11255d0429a3STudor Ambarus 
11265d0429a3STudor Ambarus 	/* Skip key loading if it is loaded due to sharing */
11275d0429a3STudor Ambarus 	key_jump_cmd = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL |
11285d0429a3STudor Ambarus 				   JUMP_COND_SHRD);
11295d0429a3STudor Ambarus 	if (keys_fit_inline)
11305d0429a3STudor Ambarus 		append_key_as_imm(desc, (void *)ctx->key, ctx->enckeylen,
11315d0429a3STudor Ambarus 				  ctx->enckeylen, CLASS_1 | KEY_DEST_CLASS_REG);
11325d0429a3STudor Ambarus 	else
11335d0429a3STudor Ambarus 		append_key(desc, ctx->key_dma, ctx->enckeylen,
11345d0429a3STudor Ambarus 			   CLASS_1 | KEY_DEST_CLASS_REG);
11355d0429a3STudor Ambarus 	set_jump_tgt_here(desc, key_jump_cmd);
11365d0429a3STudor Ambarus 
11375d0429a3STudor Ambarus 	/* Class 1 operation */
11385d0429a3STudor Ambarus 	append_operation(desc, ctx->class1_alg_type |
11395d0429a3STudor Ambarus 			 OP_ALG_AS_INITFINAL | OP_ALG_ENCRYPT);
11405d0429a3STudor Ambarus 
1141f2147b88SHerbert Xu 	/* assoclen + cryptlen = seqinlen */
1142f2147b88SHerbert Xu 	append_math_sub(desc, REG3, SEQINLEN, REG0, CAAM_CMD_SZ);
11435d0429a3STudor Ambarus 
11445d0429a3STudor Ambarus 	/*
11455d0429a3STudor Ambarus 	 * MOVE_LEN opcode is not available in all SEC HW revisions,
11465d0429a3STudor Ambarus 	 * thus need to do some magic, i.e. self-patch the descriptor
11475d0429a3STudor Ambarus 	 * buffer.
11485d0429a3STudor Ambarus 	 */
11495d0429a3STudor Ambarus 	read_move_cmd = append_move(desc, MOVE_SRC_DESCBUF | MOVE_DEST_MATH3 |
11505d0429a3STudor Ambarus 				    (0x6 << MOVE_LEN_SHIFT));
11515d0429a3STudor Ambarus 	write_move_cmd = append_move(desc, MOVE_SRC_MATH3 | MOVE_DEST_DESCBUF |
11525d0429a3STudor Ambarus 				     (0x8 << MOVE_LEN_SHIFT));
11535d0429a3STudor Ambarus 
1154f2147b88SHerbert Xu 	/* Will read assoclen + cryptlen bytes */
1155f2147b88SHerbert Xu 	append_math_sub(desc, VARSEQINLEN, SEQINLEN, REG0, CAAM_CMD_SZ);
11565d0429a3STudor Ambarus 
1157f2147b88SHerbert Xu 	/* Will write assoclen + cryptlen bytes */
1158f2147b88SHerbert Xu 	append_math_sub(desc, VARSEQOUTLEN, SEQINLEN, REG0, CAAM_CMD_SZ);
1159f2147b88SHerbert Xu 
1160f2147b88SHerbert Xu 	/* Read and write assoclen + cryptlen bytes */
11615d0429a3STudor Ambarus 	aead_append_src_dst(desc, FIFOLD_TYPE_AAD);
11625d0429a3STudor Ambarus 
11635d0429a3STudor Ambarus 	set_move_tgt_here(desc, read_move_cmd);
11645d0429a3STudor Ambarus 	set_move_tgt_here(desc, write_move_cmd);
11655d0429a3STudor Ambarus 	append_cmd(desc, CMD_LOAD | DISABLE_AUTO_INFO_FIFO);
11665d0429a3STudor Ambarus 	/* Move payload data to OFIFO */
11675d0429a3STudor Ambarus 	append_move(desc, MOVE_SRC_INFIFO_CL | MOVE_DEST_OUTFIFO);
11685d0429a3STudor Ambarus 
11695d0429a3STudor Ambarus 	/* Write ICV */
11705d0429a3STudor Ambarus 	append_seq_store(desc, ctx->authsize, LDST_CLASS_1_CCB |
11715d0429a3STudor Ambarus 			 LDST_SRCDST_BYTE_CONTEXT);
11725d0429a3STudor Ambarus 
11735d0429a3STudor Ambarus 	ctx->sh_desc_enc_dma = dma_map_single(jrdev, desc,
11745d0429a3STudor Ambarus 					      desc_bytes(desc),
11755d0429a3STudor Ambarus 					      DMA_TO_DEVICE);
11765d0429a3STudor Ambarus 	if (dma_mapping_error(jrdev, ctx->sh_desc_enc_dma)) {
11775d0429a3STudor Ambarus 		dev_err(jrdev, "unable to map shared descriptor\n");
11785d0429a3STudor Ambarus 		return -ENOMEM;
11795d0429a3STudor Ambarus 	}
11805d0429a3STudor Ambarus #ifdef DEBUG
11815d0429a3STudor Ambarus 	print_hex_dump(KERN_ERR, "rfc4543 enc shdesc@"__stringify(__LINE__)": ",
11825d0429a3STudor Ambarus 		       DUMP_PREFIX_ADDRESS, 16, 4, desc,
11835d0429a3STudor Ambarus 		       desc_bytes(desc), 1);
11845d0429a3STudor Ambarus #endif
11855d0429a3STudor Ambarus 
11865d0429a3STudor Ambarus 	/*
11875d0429a3STudor Ambarus 	 * Job Descriptor and Shared Descriptors
11885d0429a3STudor Ambarus 	 * must all fit into the 64-word Descriptor h/w Buffer
11895d0429a3STudor Ambarus 	 */
11905d0429a3STudor Ambarus 	keys_fit_inline = false;
1191f2147b88SHerbert Xu 	if (DESC_RFC4543_DEC_LEN + GCM_DESC_JOB_IO_LEN +
11925d0429a3STudor Ambarus 	    ctx->enckeylen <= CAAM_DESC_BYTES_MAX)
11935d0429a3STudor Ambarus 		keys_fit_inline = true;
11945d0429a3STudor Ambarus 
11955d0429a3STudor Ambarus 	desc = ctx->sh_desc_dec;
11965d0429a3STudor Ambarus 
11975d0429a3STudor Ambarus 	init_sh_desc(desc, HDR_SHARE_SERIAL);
11985d0429a3STudor Ambarus 
11995d0429a3STudor Ambarus 	/* Skip key loading if it is loaded due to sharing */
12005d0429a3STudor Ambarus 	key_jump_cmd = append_jump(desc, JUMP_JSL |
12015d0429a3STudor Ambarus 				   JUMP_TEST_ALL | JUMP_COND_SHRD);
12025d0429a3STudor Ambarus 	if (keys_fit_inline)
12035d0429a3STudor Ambarus 		append_key_as_imm(desc, (void *)ctx->key, ctx->enckeylen,
12045d0429a3STudor Ambarus 				  ctx->enckeylen, CLASS_1 | KEY_DEST_CLASS_REG);
12055d0429a3STudor Ambarus 	else
12065d0429a3STudor Ambarus 		append_key(desc, ctx->key_dma, ctx->enckeylen,
12075d0429a3STudor Ambarus 			   CLASS_1 | KEY_DEST_CLASS_REG);
12085d0429a3STudor Ambarus 	set_jump_tgt_here(desc, key_jump_cmd);
12095d0429a3STudor Ambarus 
12105d0429a3STudor Ambarus 	/* Class 1 operation */
12115d0429a3STudor Ambarus 	append_operation(desc, ctx->class1_alg_type |
12125d0429a3STudor Ambarus 			 OP_ALG_AS_INITFINAL | OP_ALG_DECRYPT | OP_ALG_ICV_ON);
12135d0429a3STudor Ambarus 
1214f2147b88SHerbert Xu 	/* assoclen + cryptlen = seqoutlen */
1215f2147b88SHerbert Xu 	append_math_sub(desc, REG3, SEQOUTLEN, REG0, CAAM_CMD_SZ);
12165d0429a3STudor Ambarus 
12175d0429a3STudor Ambarus 	/*
12185d0429a3STudor Ambarus 	 * MOVE_LEN opcode is not available in all SEC HW revisions,
12195d0429a3STudor Ambarus 	 * thus need to do some magic, i.e. self-patch the descriptor
12205d0429a3STudor Ambarus 	 * buffer.
12215d0429a3STudor Ambarus 	 */
12225d0429a3STudor Ambarus 	read_move_cmd = append_move(desc, MOVE_SRC_DESCBUF | MOVE_DEST_MATH3 |
12235d0429a3STudor Ambarus 				    (0x6 << MOVE_LEN_SHIFT));
12245d0429a3STudor Ambarus 	write_move_cmd = append_move(desc, MOVE_SRC_MATH3 | MOVE_DEST_DESCBUF |
12255d0429a3STudor Ambarus 				     (0x8 << MOVE_LEN_SHIFT));
12265d0429a3STudor Ambarus 
1227f2147b88SHerbert Xu 	/* Will read assoclen + cryptlen bytes */
1228f2147b88SHerbert Xu 	append_math_sub(desc, VARSEQINLEN, SEQOUTLEN, REG0, CAAM_CMD_SZ);
12295d0429a3STudor Ambarus 
1230f2147b88SHerbert Xu 	/* Will write assoclen + cryptlen bytes */
1231f2147b88SHerbert Xu 	append_math_sub(desc, VARSEQOUTLEN, SEQOUTLEN, REG0, CAAM_CMD_SZ);
12325d0429a3STudor Ambarus 
12335d0429a3STudor Ambarus 	/* Store payload data */
12345d0429a3STudor Ambarus 	append_seq_fifo_store(desc, 0, FIFOST_TYPE_MESSAGE_DATA | FIFOLDST_VLF);
12355d0429a3STudor Ambarus 
1236f2147b88SHerbert Xu 	/* In-snoop assoclen + cryptlen data */
12375d0429a3STudor Ambarus 	append_seq_fifo_load(desc, 0, FIFOLD_CLASS_BOTH | FIFOLDST_VLF |
12385d0429a3STudor Ambarus 			     FIFOLD_TYPE_AAD | FIFOLD_TYPE_LAST2FLUSH1);
12395d0429a3STudor Ambarus 
12405d0429a3STudor Ambarus 	set_move_tgt_here(desc, read_move_cmd);
12415d0429a3STudor Ambarus 	set_move_tgt_here(desc, write_move_cmd);
12425d0429a3STudor Ambarus 	append_cmd(desc, CMD_LOAD | DISABLE_AUTO_INFO_FIFO);
12435d0429a3STudor Ambarus 	/* Move payload data to OFIFO */
12445d0429a3STudor Ambarus 	append_move(desc, MOVE_SRC_INFIFO_CL | MOVE_DEST_OUTFIFO);
12455d0429a3STudor Ambarus 	append_cmd(desc, CMD_LOAD | ENABLE_AUTO_INFO_FIFO);
12465d0429a3STudor Ambarus 
12475d0429a3STudor Ambarus 	/* Read ICV */
12485d0429a3STudor Ambarus 	append_seq_fifo_load(desc, ctx->authsize, FIFOLD_CLASS_CLASS1 |
12495d0429a3STudor Ambarus 			     FIFOLD_TYPE_ICV | FIFOLD_TYPE_LAST1);
12505d0429a3STudor Ambarus 
12515d0429a3STudor Ambarus 	ctx->sh_desc_dec_dma = dma_map_single(jrdev, desc,
12525d0429a3STudor Ambarus 					      desc_bytes(desc),
12535d0429a3STudor Ambarus 					      DMA_TO_DEVICE);
12545d0429a3STudor Ambarus 	if (dma_mapping_error(jrdev, ctx->sh_desc_dec_dma)) {
12555d0429a3STudor Ambarus 		dev_err(jrdev, "unable to map shared descriptor\n");
12565d0429a3STudor Ambarus 		return -ENOMEM;
12575d0429a3STudor Ambarus 	}
12585d0429a3STudor Ambarus #ifdef DEBUG
12595d0429a3STudor Ambarus 	print_hex_dump(KERN_ERR, "rfc4543 dec shdesc@"__stringify(__LINE__)": ",
12605d0429a3STudor Ambarus 		       DUMP_PREFIX_ADDRESS, 16, 4, desc,
12615d0429a3STudor Ambarus 		       desc_bytes(desc), 1);
12625d0429a3STudor Ambarus #endif
12635d0429a3STudor Ambarus 
12645d0429a3STudor Ambarus 	return 0;
12655d0429a3STudor Ambarus }
12665d0429a3STudor Ambarus 
12675d0429a3STudor Ambarus static int rfc4543_setauthsize(struct crypto_aead *authenc,
12685d0429a3STudor Ambarus 			       unsigned int authsize)
12695d0429a3STudor Ambarus {
12705d0429a3STudor Ambarus 	struct caam_ctx *ctx = crypto_aead_ctx(authenc);
12715d0429a3STudor Ambarus 
12725d0429a3STudor Ambarus 	ctx->authsize = authsize;
12735d0429a3STudor Ambarus 	rfc4543_set_sh_desc(authenc);
12745d0429a3STudor Ambarus 
12755d0429a3STudor Ambarus 	return 0;
12765d0429a3STudor Ambarus }
12775d0429a3STudor Ambarus 
12784c1ec1f9SYuan Kang static u32 gen_split_aead_key(struct caam_ctx *ctx, const u8 *key_in,
12794c1ec1f9SYuan Kang 			      u32 authkeylen)
12808e8ec596SKim Phillips {
12814c1ec1f9SYuan Kang 	return gen_split_key(ctx->jrdev, ctx->key, ctx->split_key_len,
12824c1ec1f9SYuan Kang 			       ctx->split_key_pad_len, key_in, authkeylen,
12834c1ec1f9SYuan Kang 			       ctx->alg_op);
12848e8ec596SKim Phillips }
12858e8ec596SKim Phillips 
12860e479300SYuan Kang static int aead_setkey(struct crypto_aead *aead,
12878e8ec596SKim Phillips 			       const u8 *key, unsigned int keylen)
12888e8ec596SKim Phillips {
12898e8ec596SKim Phillips 	/* Sizes for MDHA pads (*not* keys): MD5, SHA1, 224, 256, 384, 512 */
12908e8ec596SKim Phillips 	static const u8 mdpadlen[] = { 16, 20, 32, 32, 64, 64 };
12918e8ec596SKim Phillips 	struct caam_ctx *ctx = crypto_aead_ctx(aead);
12928e8ec596SKim Phillips 	struct device *jrdev = ctx->jrdev;
12934e6e0b27SHoria Geanta 	struct crypto_authenc_keys keys;
12948e8ec596SKim Phillips 	int ret = 0;
12958e8ec596SKim Phillips 
12964e6e0b27SHoria Geanta 	if (crypto_authenc_extractkeys(&keys, key, keylen) != 0)
12978e8ec596SKim Phillips 		goto badkey;
12988e8ec596SKim Phillips 
12998e8ec596SKim Phillips 	/* Pick class 2 key length from algorithm submask */
13008e8ec596SKim Phillips 	ctx->split_key_len = mdpadlen[(ctx->alg_op & OP_ALG_ALGSEL_SUBMASK) >>
13018e8ec596SKim Phillips 				      OP_ALG_ALGSEL_SHIFT] * 2;
13028e8ec596SKim Phillips 	ctx->split_key_pad_len = ALIGN(ctx->split_key_len, 16);
13038e8ec596SKim Phillips 
13044e6e0b27SHoria Geanta 	if (ctx->split_key_pad_len + keys.enckeylen > CAAM_MAX_KEY_SIZE)
13054e6e0b27SHoria Geanta 		goto badkey;
13064e6e0b27SHoria Geanta 
13078e8ec596SKim Phillips #ifdef DEBUG
13088e8ec596SKim Phillips 	printk(KERN_ERR "keylen %d enckeylen %d authkeylen %d\n",
13094e6e0b27SHoria Geanta 	       keys.authkeylen + keys.enckeylen, keys.enckeylen,
13104e6e0b27SHoria Geanta 	       keys.authkeylen);
13118e8ec596SKim Phillips 	printk(KERN_ERR "split_key_len %d split_key_pad_len %d\n",
13128e8ec596SKim Phillips 	       ctx->split_key_len, ctx->split_key_pad_len);
1313514df281SAlex Porosanu 	print_hex_dump(KERN_ERR, "key in @"__stringify(__LINE__)": ",
13148e8ec596SKim Phillips 		       DUMP_PREFIX_ADDRESS, 16, 4, key, keylen, 1);
13158e8ec596SKim Phillips #endif
13168e8ec596SKim Phillips 
13174e6e0b27SHoria Geanta 	ret = gen_split_aead_key(ctx, keys.authkey, keys.authkeylen);
13188e8ec596SKim Phillips 	if (ret) {
13198e8ec596SKim Phillips 		goto badkey;
13208e8ec596SKim Phillips 	}
13218e8ec596SKim Phillips 
13228e8ec596SKim Phillips 	/* postpend encryption key to auth split key */
13234e6e0b27SHoria Geanta 	memcpy(ctx->key + ctx->split_key_pad_len, keys.enckey, keys.enckeylen);
13248e8ec596SKim Phillips 
1325885e9e2fSYuan Kang 	ctx->key_dma = dma_map_single(jrdev, ctx->key, ctx->split_key_pad_len +
13264e6e0b27SHoria Geanta 				      keys.enckeylen, DMA_TO_DEVICE);
1327885e9e2fSYuan Kang 	if (dma_mapping_error(jrdev, ctx->key_dma)) {
13288e8ec596SKim Phillips 		dev_err(jrdev, "unable to map key i/o memory\n");
13298e8ec596SKim Phillips 		return -ENOMEM;
13308e8ec596SKim Phillips 	}
13318e8ec596SKim Phillips #ifdef DEBUG
1332514df281SAlex Porosanu 	print_hex_dump(KERN_ERR, "ctx.key@"__stringify(__LINE__)": ",
13338e8ec596SKim Phillips 		       DUMP_PREFIX_ADDRESS, 16, 4, ctx->key,
13344e6e0b27SHoria Geanta 		       ctx->split_key_pad_len + keys.enckeylen, 1);
13358e8ec596SKim Phillips #endif
13368e8ec596SKim Phillips 
13374e6e0b27SHoria Geanta 	ctx->enckeylen = keys.enckeylen;
13388e8ec596SKim Phillips 
13391acebad3SYuan Kang 	ret = aead_set_sh_desc(aead);
13408e8ec596SKim Phillips 	if (ret) {
1341885e9e2fSYuan Kang 		dma_unmap_single(jrdev, ctx->key_dma, ctx->split_key_pad_len +
13424e6e0b27SHoria Geanta 				 keys.enckeylen, DMA_TO_DEVICE);
13438e8ec596SKim Phillips 	}
13448e8ec596SKim Phillips 
13458e8ec596SKim Phillips 	return ret;
13468e8ec596SKim Phillips badkey:
13478e8ec596SKim Phillips 	crypto_aead_set_flags(aead, CRYPTO_TFM_RES_BAD_KEY_LEN);
13488e8ec596SKim Phillips 	return -EINVAL;
13498e8ec596SKim Phillips }
13508e8ec596SKim Phillips 
13513ef8d945STudor Ambarus static int gcm_setkey(struct crypto_aead *aead,
13523ef8d945STudor Ambarus 		      const u8 *key, unsigned int keylen)
13533ef8d945STudor Ambarus {
13543ef8d945STudor Ambarus 	struct caam_ctx *ctx = crypto_aead_ctx(aead);
13553ef8d945STudor Ambarus 	struct device *jrdev = ctx->jrdev;
13563ef8d945STudor Ambarus 	int ret = 0;
13573ef8d945STudor Ambarus 
13583ef8d945STudor Ambarus #ifdef DEBUG
13593ef8d945STudor Ambarus 	print_hex_dump(KERN_ERR, "key in @"__stringify(__LINE__)": ",
13603ef8d945STudor Ambarus 		       DUMP_PREFIX_ADDRESS, 16, 4, key, keylen, 1);
13613ef8d945STudor Ambarus #endif
13623ef8d945STudor Ambarus 
13633ef8d945STudor Ambarus 	memcpy(ctx->key, key, keylen);
13643ef8d945STudor Ambarus 	ctx->key_dma = dma_map_single(jrdev, ctx->key, keylen,
13653ef8d945STudor Ambarus 				      DMA_TO_DEVICE);
13663ef8d945STudor Ambarus 	if (dma_mapping_error(jrdev, ctx->key_dma)) {
13673ef8d945STudor Ambarus 		dev_err(jrdev, "unable to map key i/o memory\n");
13683ef8d945STudor Ambarus 		return -ENOMEM;
13693ef8d945STudor Ambarus 	}
13703ef8d945STudor Ambarus 	ctx->enckeylen = keylen;
13713ef8d945STudor Ambarus 
13723ef8d945STudor Ambarus 	ret = gcm_set_sh_desc(aead);
13733ef8d945STudor Ambarus 	if (ret) {
13743ef8d945STudor Ambarus 		dma_unmap_single(jrdev, ctx->key_dma, ctx->enckeylen,
13753ef8d945STudor Ambarus 				 DMA_TO_DEVICE);
13763ef8d945STudor Ambarus 	}
13773ef8d945STudor Ambarus 
13783ef8d945STudor Ambarus 	return ret;
13793ef8d945STudor Ambarus }
13803ef8d945STudor Ambarus 
1381bac68f2cSTudor Ambarus static int rfc4106_setkey(struct crypto_aead *aead,
1382bac68f2cSTudor Ambarus 			  const u8 *key, unsigned int keylen)
1383bac68f2cSTudor Ambarus {
1384bac68f2cSTudor Ambarus 	struct caam_ctx *ctx = crypto_aead_ctx(aead);
1385bac68f2cSTudor Ambarus 	struct device *jrdev = ctx->jrdev;
1386bac68f2cSTudor Ambarus 	int ret = 0;
1387bac68f2cSTudor Ambarus 
1388bac68f2cSTudor Ambarus 	if (keylen < 4)
1389bac68f2cSTudor Ambarus 		return -EINVAL;
1390bac68f2cSTudor Ambarus 
1391bac68f2cSTudor Ambarus #ifdef DEBUG
1392bac68f2cSTudor Ambarus 	print_hex_dump(KERN_ERR, "key in @"__stringify(__LINE__)": ",
1393bac68f2cSTudor Ambarus 		       DUMP_PREFIX_ADDRESS, 16, 4, key, keylen, 1);
1394bac68f2cSTudor Ambarus #endif
1395bac68f2cSTudor Ambarus 
1396bac68f2cSTudor Ambarus 	memcpy(ctx->key, key, keylen);
1397bac68f2cSTudor Ambarus 
1398bac68f2cSTudor Ambarus 	/*
1399bac68f2cSTudor Ambarus 	 * The last four bytes of the key material are used as the salt value
1400bac68f2cSTudor Ambarus 	 * in the nonce. Update the AES key length.
1401bac68f2cSTudor Ambarus 	 */
1402bac68f2cSTudor Ambarus 	ctx->enckeylen = keylen - 4;
1403bac68f2cSTudor Ambarus 
1404bac68f2cSTudor Ambarus 	ctx->key_dma = dma_map_single(jrdev, ctx->key, ctx->enckeylen,
1405bac68f2cSTudor Ambarus 				      DMA_TO_DEVICE);
1406bac68f2cSTudor Ambarus 	if (dma_mapping_error(jrdev, ctx->key_dma)) {
1407bac68f2cSTudor Ambarus 		dev_err(jrdev, "unable to map key i/o memory\n");
1408bac68f2cSTudor Ambarus 		return -ENOMEM;
1409bac68f2cSTudor Ambarus 	}
1410bac68f2cSTudor Ambarus 
1411bac68f2cSTudor Ambarus 	ret = rfc4106_set_sh_desc(aead);
1412bac68f2cSTudor Ambarus 	if (ret) {
1413bac68f2cSTudor Ambarus 		dma_unmap_single(jrdev, ctx->key_dma, ctx->enckeylen,
1414bac68f2cSTudor Ambarus 				 DMA_TO_DEVICE);
1415bac68f2cSTudor Ambarus 	}
1416bac68f2cSTudor Ambarus 
1417bac68f2cSTudor Ambarus 	return ret;
1418bac68f2cSTudor Ambarus }
1419bac68f2cSTudor Ambarus 
14205d0429a3STudor Ambarus static int rfc4543_setkey(struct crypto_aead *aead,
14215d0429a3STudor Ambarus 			  const u8 *key, unsigned int keylen)
14225d0429a3STudor Ambarus {
14235d0429a3STudor Ambarus 	struct caam_ctx *ctx = crypto_aead_ctx(aead);
14245d0429a3STudor Ambarus 	struct device *jrdev = ctx->jrdev;
14255d0429a3STudor Ambarus 	int ret = 0;
14265d0429a3STudor Ambarus 
14275d0429a3STudor Ambarus 	if (keylen < 4)
14285d0429a3STudor Ambarus 		return -EINVAL;
14295d0429a3STudor Ambarus 
14305d0429a3STudor Ambarus #ifdef DEBUG
14315d0429a3STudor Ambarus 	print_hex_dump(KERN_ERR, "key in @"__stringify(__LINE__)": ",
14325d0429a3STudor Ambarus 		       DUMP_PREFIX_ADDRESS, 16, 4, key, keylen, 1);
14335d0429a3STudor Ambarus #endif
14345d0429a3STudor Ambarus 
14355d0429a3STudor Ambarus 	memcpy(ctx->key, key, keylen);
14365d0429a3STudor Ambarus 
14375d0429a3STudor Ambarus 	/*
14385d0429a3STudor Ambarus 	 * The last four bytes of the key material are used as the salt value
14395d0429a3STudor Ambarus 	 * in the nonce. Update the AES key length.
14405d0429a3STudor Ambarus 	 */
14415d0429a3STudor Ambarus 	ctx->enckeylen = keylen - 4;
14425d0429a3STudor Ambarus 
14435d0429a3STudor Ambarus 	ctx->key_dma = dma_map_single(jrdev, ctx->key, ctx->enckeylen,
14445d0429a3STudor Ambarus 				      DMA_TO_DEVICE);
14455d0429a3STudor Ambarus 	if (dma_mapping_error(jrdev, ctx->key_dma)) {
14465d0429a3STudor Ambarus 		dev_err(jrdev, "unable to map key i/o memory\n");
14475d0429a3STudor Ambarus 		return -ENOMEM;
14485d0429a3STudor Ambarus 	}
14495d0429a3STudor Ambarus 
14505d0429a3STudor Ambarus 	ret = rfc4543_set_sh_desc(aead);
14515d0429a3STudor Ambarus 	if (ret) {
14525d0429a3STudor Ambarus 		dma_unmap_single(jrdev, ctx->key_dma, ctx->enckeylen,
14535d0429a3STudor Ambarus 				 DMA_TO_DEVICE);
14545d0429a3STudor Ambarus 	}
14555d0429a3STudor Ambarus 
14565d0429a3STudor Ambarus 	return ret;
14575d0429a3STudor Ambarus }
14585d0429a3STudor Ambarus 
1459acdca31dSYuan Kang static int ablkcipher_setkey(struct crypto_ablkcipher *ablkcipher,
1460acdca31dSYuan Kang 			     const u8 *key, unsigned int keylen)
1461acdca31dSYuan Kang {
1462acdca31dSYuan Kang 	struct caam_ctx *ctx = crypto_ablkcipher_ctx(ablkcipher);
1463a5f57cffSCatalin Vasile 	struct ablkcipher_tfm *crt = &ablkcipher->base.crt_ablkcipher;
1464a5f57cffSCatalin Vasile 	struct crypto_tfm *tfm = crypto_ablkcipher_tfm(ablkcipher);
1465a5f57cffSCatalin Vasile 	const char *alg_name = crypto_tfm_alg_name(tfm);
1466acdca31dSYuan Kang 	struct device *jrdev = ctx->jrdev;
1467acdca31dSYuan Kang 	int ret = 0;
14684464a7d4SHoria Geanta 	u32 *key_jump_cmd;
1469acdca31dSYuan Kang 	u32 *desc;
1470a5f57cffSCatalin Vasile 	u32 *nonce;
14717222d1a3SCatalin Vasile 	u32 geniv;
14722b22f6c5SCatalin Vasile 	u32 ctx1_iv_off = 0;
14732b22f6c5SCatalin Vasile 	const bool ctr_mode = ((ctx->class1_alg_type & OP_ALG_AAI_MASK) ==
14742b22f6c5SCatalin Vasile 			       OP_ALG_AAI_CTR_MOD128);
1475a5f57cffSCatalin Vasile 	const bool is_rfc3686 = (ctr_mode &&
1476a5f57cffSCatalin Vasile 				 (strstr(alg_name, "rfc3686") != NULL));
1477acdca31dSYuan Kang 
1478acdca31dSYuan Kang #ifdef DEBUG
1479514df281SAlex Porosanu 	print_hex_dump(KERN_ERR, "key in @"__stringify(__LINE__)": ",
1480acdca31dSYuan Kang 		       DUMP_PREFIX_ADDRESS, 16, 4, key, keylen, 1);
1481acdca31dSYuan Kang #endif
14822b22f6c5SCatalin Vasile 	/*
14832b22f6c5SCatalin Vasile 	 * AES-CTR needs to load IV in CONTEXT1 reg
14842b22f6c5SCatalin Vasile 	 * at an offset of 128bits (16bytes)
14852b22f6c5SCatalin Vasile 	 * CONTEXT1[255:128] = IV
14862b22f6c5SCatalin Vasile 	 */
14872b22f6c5SCatalin Vasile 	if (ctr_mode)
14882b22f6c5SCatalin Vasile 		ctx1_iv_off = 16;
1489acdca31dSYuan Kang 
1490a5f57cffSCatalin Vasile 	/*
1491a5f57cffSCatalin Vasile 	 * RFC3686 specific:
1492a5f57cffSCatalin Vasile 	 *	| CONTEXT1[255:128] = {NONCE, IV, COUNTER}
1493a5f57cffSCatalin Vasile 	 *	| *key = {KEY, NONCE}
1494a5f57cffSCatalin Vasile 	 */
1495a5f57cffSCatalin Vasile 	if (is_rfc3686) {
1496a5f57cffSCatalin Vasile 		ctx1_iv_off = 16 + CTR_RFC3686_NONCE_SIZE;
1497a5f57cffSCatalin Vasile 		keylen -= CTR_RFC3686_NONCE_SIZE;
1498a5f57cffSCatalin Vasile 	}
1499a5f57cffSCatalin Vasile 
1500acdca31dSYuan Kang 	memcpy(ctx->key, key, keylen);
1501acdca31dSYuan Kang 	ctx->key_dma = dma_map_single(jrdev, ctx->key, keylen,
1502acdca31dSYuan Kang 				      DMA_TO_DEVICE);
1503acdca31dSYuan Kang 	if (dma_mapping_error(jrdev, ctx->key_dma)) {
1504acdca31dSYuan Kang 		dev_err(jrdev, "unable to map key i/o memory\n");
1505acdca31dSYuan Kang 		return -ENOMEM;
1506acdca31dSYuan Kang 	}
1507acdca31dSYuan Kang 	ctx->enckeylen = keylen;
1508acdca31dSYuan Kang 
1509acdca31dSYuan Kang 	/* ablkcipher_encrypt shared descriptor */
1510acdca31dSYuan Kang 	desc = ctx->sh_desc_enc;
1511a5f57cffSCatalin Vasile 	init_sh_desc(desc, HDR_SHARE_SERIAL | HDR_SAVECTX);
1512acdca31dSYuan Kang 	/* Skip if already shared */
1513acdca31dSYuan Kang 	key_jump_cmd = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL |
1514acdca31dSYuan Kang 				   JUMP_COND_SHRD);
1515acdca31dSYuan Kang 
1516acdca31dSYuan Kang 	/* Load class1 key only */
1517acdca31dSYuan Kang 	append_key_as_imm(desc, (void *)ctx->key, ctx->enckeylen,
1518acdca31dSYuan Kang 			  ctx->enckeylen, CLASS_1 |
1519acdca31dSYuan Kang 			  KEY_DEST_CLASS_REG);
1520acdca31dSYuan Kang 
1521a5f57cffSCatalin Vasile 	/* Load nonce into CONTEXT1 reg */
1522a5f57cffSCatalin Vasile 	if (is_rfc3686) {
1523a5f57cffSCatalin Vasile 		nonce = (u32 *)(key + keylen);
1524a5f57cffSCatalin Vasile 		append_load_imm_u32(desc, *nonce, LDST_CLASS_IND_CCB |
1525a5f57cffSCatalin Vasile 				    LDST_SRCDST_BYTE_OUTFIFO | LDST_IMM);
1526a5f57cffSCatalin Vasile 		append_move(desc, MOVE_WAITCOMP |
1527a5f57cffSCatalin Vasile 			    MOVE_SRC_OUTFIFO |
1528a5f57cffSCatalin Vasile 			    MOVE_DEST_CLASS1CTX |
1529a5f57cffSCatalin Vasile 			    (16 << MOVE_OFFSET_SHIFT) |
1530a5f57cffSCatalin Vasile 			    (CTR_RFC3686_NONCE_SIZE << MOVE_LEN_SHIFT));
1531a5f57cffSCatalin Vasile 	}
1532a5f57cffSCatalin Vasile 
1533acdca31dSYuan Kang 	set_jump_tgt_here(desc, key_jump_cmd);
1534acdca31dSYuan Kang 
1535acdca31dSYuan Kang 	/* Load iv */
1536a5f57cffSCatalin Vasile 	append_seq_load(desc, crt->ivsize, LDST_SRCDST_BYTE_CONTEXT |
15372b22f6c5SCatalin Vasile 			LDST_CLASS_1_CCB | (ctx1_iv_off << LDST_OFFSET_SHIFT));
1538acdca31dSYuan Kang 
1539a5f57cffSCatalin Vasile 	/* Load counter into CONTEXT1 reg */
1540a5f57cffSCatalin Vasile 	if (is_rfc3686)
1541a5f57cffSCatalin Vasile 		append_load_imm_u32(desc, be32_to_cpu(1), LDST_IMM |
1542a5f57cffSCatalin Vasile 				    LDST_CLASS_1_CCB |
1543a5f57cffSCatalin Vasile 				    LDST_SRCDST_BYTE_CONTEXT |
1544a5f57cffSCatalin Vasile 				    ((ctx1_iv_off + CTR_RFC3686_IV_SIZE) <<
1545a5f57cffSCatalin Vasile 				     LDST_OFFSET_SHIFT));
1546a5f57cffSCatalin Vasile 
1547acdca31dSYuan Kang 	/* Load operation */
1548acdca31dSYuan Kang 	append_operation(desc, ctx->class1_alg_type |
1549acdca31dSYuan Kang 			 OP_ALG_AS_INITFINAL | OP_ALG_ENCRYPT);
1550acdca31dSYuan Kang 
1551acdca31dSYuan Kang 	/* Perform operation */
1552acdca31dSYuan Kang 	ablkcipher_append_src_dst(desc);
1553acdca31dSYuan Kang 
1554acdca31dSYuan Kang 	ctx->sh_desc_enc_dma = dma_map_single(jrdev, desc,
1555acdca31dSYuan Kang 					      desc_bytes(desc),
1556acdca31dSYuan Kang 					      DMA_TO_DEVICE);
1557acdca31dSYuan Kang 	if (dma_mapping_error(jrdev, ctx->sh_desc_enc_dma)) {
1558acdca31dSYuan Kang 		dev_err(jrdev, "unable to map shared descriptor\n");
1559acdca31dSYuan Kang 		return -ENOMEM;
1560acdca31dSYuan Kang 	}
1561acdca31dSYuan Kang #ifdef DEBUG
1562514df281SAlex Porosanu 	print_hex_dump(KERN_ERR,
1563514df281SAlex Porosanu 		       "ablkcipher enc shdesc@"__stringify(__LINE__)": ",
1564acdca31dSYuan Kang 		       DUMP_PREFIX_ADDRESS, 16, 4, desc,
1565acdca31dSYuan Kang 		       desc_bytes(desc), 1);
1566acdca31dSYuan Kang #endif
1567acdca31dSYuan Kang 	/* ablkcipher_decrypt shared descriptor */
1568acdca31dSYuan Kang 	desc = ctx->sh_desc_dec;
1569acdca31dSYuan Kang 
1570a5f57cffSCatalin Vasile 	init_sh_desc(desc, HDR_SHARE_SERIAL | HDR_SAVECTX);
1571acdca31dSYuan Kang 	/* Skip if already shared */
1572acdca31dSYuan Kang 	key_jump_cmd = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL |
1573acdca31dSYuan Kang 				   JUMP_COND_SHRD);
1574acdca31dSYuan Kang 
1575acdca31dSYuan Kang 	/* Load class1 key only */
1576acdca31dSYuan Kang 	append_key_as_imm(desc, (void *)ctx->key, ctx->enckeylen,
1577acdca31dSYuan Kang 			  ctx->enckeylen, CLASS_1 |
1578acdca31dSYuan Kang 			  KEY_DEST_CLASS_REG);
1579acdca31dSYuan Kang 
1580a5f57cffSCatalin Vasile 	/* Load nonce into CONTEXT1 reg */
1581a5f57cffSCatalin Vasile 	if (is_rfc3686) {
1582a5f57cffSCatalin Vasile 		nonce = (u32 *)(key + keylen);
1583a5f57cffSCatalin Vasile 		append_load_imm_u32(desc, *nonce, LDST_CLASS_IND_CCB |
1584a5f57cffSCatalin Vasile 				    LDST_SRCDST_BYTE_OUTFIFO | LDST_IMM);
1585a5f57cffSCatalin Vasile 		append_move(desc, MOVE_WAITCOMP |
1586a5f57cffSCatalin Vasile 			    MOVE_SRC_OUTFIFO |
1587a5f57cffSCatalin Vasile 			    MOVE_DEST_CLASS1CTX |
1588a5f57cffSCatalin Vasile 			    (16 << MOVE_OFFSET_SHIFT) |
1589a5f57cffSCatalin Vasile 			    (CTR_RFC3686_NONCE_SIZE << MOVE_LEN_SHIFT));
1590a5f57cffSCatalin Vasile 	}
1591a5f57cffSCatalin Vasile 
1592acdca31dSYuan Kang 	set_jump_tgt_here(desc, key_jump_cmd);
1593acdca31dSYuan Kang 
1594acdca31dSYuan Kang 	/* load IV */
1595a5f57cffSCatalin Vasile 	append_seq_load(desc, crt->ivsize, LDST_SRCDST_BYTE_CONTEXT |
15962b22f6c5SCatalin Vasile 			LDST_CLASS_1_CCB | (ctx1_iv_off << LDST_OFFSET_SHIFT));
1597acdca31dSYuan Kang 
1598a5f57cffSCatalin Vasile 	/* Load counter into CONTEXT1 reg */
1599a5f57cffSCatalin Vasile 	if (is_rfc3686)
1600a5f57cffSCatalin Vasile 		append_load_imm_u32(desc, be32_to_cpu(1), LDST_IMM |
1601a5f57cffSCatalin Vasile 				    LDST_CLASS_1_CCB |
1602a5f57cffSCatalin Vasile 				    LDST_SRCDST_BYTE_CONTEXT |
1603a5f57cffSCatalin Vasile 				    ((ctx1_iv_off + CTR_RFC3686_IV_SIZE) <<
1604a5f57cffSCatalin Vasile 				     LDST_OFFSET_SHIFT));
1605a5f57cffSCatalin Vasile 
1606acdca31dSYuan Kang 	/* Choose operation */
16072b22f6c5SCatalin Vasile 	if (ctr_mode)
16082b22f6c5SCatalin Vasile 		append_operation(desc, ctx->class1_alg_type |
16092b22f6c5SCatalin Vasile 				 OP_ALG_AS_INITFINAL | OP_ALG_DECRYPT);
16102b22f6c5SCatalin Vasile 	else
1611acdca31dSYuan Kang 		append_dec_op1(desc, ctx->class1_alg_type);
1612acdca31dSYuan Kang 
1613acdca31dSYuan Kang 	/* Perform operation */
1614acdca31dSYuan Kang 	ablkcipher_append_src_dst(desc);
1615acdca31dSYuan Kang 
1616acdca31dSYuan Kang 	ctx->sh_desc_dec_dma = dma_map_single(jrdev, desc,
1617acdca31dSYuan Kang 					      desc_bytes(desc),
1618acdca31dSYuan Kang 					      DMA_TO_DEVICE);
161971c65f7cSHoria Geanta 	if (dma_mapping_error(jrdev, ctx->sh_desc_dec_dma)) {
1620acdca31dSYuan Kang 		dev_err(jrdev, "unable to map shared descriptor\n");
1621acdca31dSYuan Kang 		return -ENOMEM;
1622acdca31dSYuan Kang 	}
1623acdca31dSYuan Kang 
1624acdca31dSYuan Kang #ifdef DEBUG
1625514df281SAlex Porosanu 	print_hex_dump(KERN_ERR,
1626514df281SAlex Porosanu 		       "ablkcipher dec shdesc@"__stringify(__LINE__)": ",
1627acdca31dSYuan Kang 		       DUMP_PREFIX_ADDRESS, 16, 4, desc,
1628acdca31dSYuan Kang 		       desc_bytes(desc), 1);
1629acdca31dSYuan Kang #endif
16307222d1a3SCatalin Vasile 	/* ablkcipher_givencrypt shared descriptor */
16317222d1a3SCatalin Vasile 	desc = ctx->sh_desc_givenc;
16327222d1a3SCatalin Vasile 
16337222d1a3SCatalin Vasile 	init_sh_desc(desc, HDR_SHARE_SERIAL | HDR_SAVECTX);
16347222d1a3SCatalin Vasile 	/* Skip if already shared */
16357222d1a3SCatalin Vasile 	key_jump_cmd = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL |
16367222d1a3SCatalin Vasile 				   JUMP_COND_SHRD);
16377222d1a3SCatalin Vasile 
16387222d1a3SCatalin Vasile 	/* Load class1 key only */
16397222d1a3SCatalin Vasile 	append_key_as_imm(desc, (void *)ctx->key, ctx->enckeylen,
16407222d1a3SCatalin Vasile 			  ctx->enckeylen, CLASS_1 |
16417222d1a3SCatalin Vasile 			  KEY_DEST_CLASS_REG);
16427222d1a3SCatalin Vasile 
16437222d1a3SCatalin Vasile 	/* Load Nonce into CONTEXT1 reg */
16447222d1a3SCatalin Vasile 	if (is_rfc3686) {
16457222d1a3SCatalin Vasile 		nonce = (u32 *)(key + keylen);
16467222d1a3SCatalin Vasile 		append_load_imm_u32(desc, *nonce, LDST_CLASS_IND_CCB |
16477222d1a3SCatalin Vasile 				    LDST_SRCDST_BYTE_OUTFIFO | LDST_IMM);
16487222d1a3SCatalin Vasile 		append_move(desc, MOVE_WAITCOMP |
16497222d1a3SCatalin Vasile 			    MOVE_SRC_OUTFIFO |
16507222d1a3SCatalin Vasile 			    MOVE_DEST_CLASS1CTX |
16517222d1a3SCatalin Vasile 			    (16 << MOVE_OFFSET_SHIFT) |
16527222d1a3SCatalin Vasile 			    (CTR_RFC3686_NONCE_SIZE << MOVE_LEN_SHIFT));
16537222d1a3SCatalin Vasile 	}
16547222d1a3SCatalin Vasile 	set_jump_tgt_here(desc, key_jump_cmd);
16557222d1a3SCatalin Vasile 
16567222d1a3SCatalin Vasile 	/* Generate IV */
16577222d1a3SCatalin Vasile 	geniv = NFIFOENTRY_STYPE_PAD | NFIFOENTRY_DEST_DECO |
16587222d1a3SCatalin Vasile 		NFIFOENTRY_DTYPE_MSG | NFIFOENTRY_LC1 |
16597222d1a3SCatalin Vasile 		NFIFOENTRY_PTYPE_RND | (crt->ivsize << NFIFOENTRY_DLEN_SHIFT);
16607222d1a3SCatalin Vasile 	append_load_imm_u32(desc, geniv, LDST_CLASS_IND_CCB |
16617222d1a3SCatalin Vasile 			    LDST_SRCDST_WORD_INFO_FIFO | LDST_IMM);
16627222d1a3SCatalin Vasile 	append_cmd(desc, CMD_LOAD | DISABLE_AUTO_INFO_FIFO);
16637222d1a3SCatalin Vasile 	append_move(desc, MOVE_WAITCOMP |
16647222d1a3SCatalin Vasile 		    MOVE_SRC_INFIFO |
16657222d1a3SCatalin Vasile 		    MOVE_DEST_CLASS1CTX |
16667222d1a3SCatalin Vasile 		    (crt->ivsize << MOVE_LEN_SHIFT) |
16677222d1a3SCatalin Vasile 		    (ctx1_iv_off << MOVE_OFFSET_SHIFT));
16687222d1a3SCatalin Vasile 	append_cmd(desc, CMD_LOAD | ENABLE_AUTO_INFO_FIFO);
16697222d1a3SCatalin Vasile 
16707222d1a3SCatalin Vasile 	/* Copy generated IV to memory */
16717222d1a3SCatalin Vasile 	append_seq_store(desc, crt->ivsize,
16727222d1a3SCatalin Vasile 			 LDST_SRCDST_BYTE_CONTEXT | LDST_CLASS_1_CCB |
16737222d1a3SCatalin Vasile 			 (ctx1_iv_off << LDST_OFFSET_SHIFT));
16747222d1a3SCatalin Vasile 
16757222d1a3SCatalin Vasile 	/* Load Counter into CONTEXT1 reg */
16767222d1a3SCatalin Vasile 	if (is_rfc3686)
16777222d1a3SCatalin Vasile 		append_load_imm_u32(desc, (u32)1, LDST_IMM |
16787222d1a3SCatalin Vasile 				    LDST_CLASS_1_CCB |
16797222d1a3SCatalin Vasile 				    LDST_SRCDST_BYTE_CONTEXT |
16807222d1a3SCatalin Vasile 				    ((ctx1_iv_off + CTR_RFC3686_IV_SIZE) <<
16817222d1a3SCatalin Vasile 				     LDST_OFFSET_SHIFT));
16827222d1a3SCatalin Vasile 
16837222d1a3SCatalin Vasile 	if (ctx1_iv_off)
16847222d1a3SCatalin Vasile 		append_jump(desc, JUMP_JSL | JUMP_TEST_ALL | JUMP_COND_NCP |
16857222d1a3SCatalin Vasile 			    (1 << JUMP_OFFSET_SHIFT));
16867222d1a3SCatalin Vasile 
16877222d1a3SCatalin Vasile 	/* Load operation */
16887222d1a3SCatalin Vasile 	append_operation(desc, ctx->class1_alg_type |
16897222d1a3SCatalin Vasile 			 OP_ALG_AS_INITFINAL | OP_ALG_ENCRYPT);
16907222d1a3SCatalin Vasile 
16917222d1a3SCatalin Vasile 	/* Perform operation */
16927222d1a3SCatalin Vasile 	ablkcipher_append_src_dst(desc);
16937222d1a3SCatalin Vasile 
16947222d1a3SCatalin Vasile 	ctx->sh_desc_givenc_dma = dma_map_single(jrdev, desc,
16957222d1a3SCatalin Vasile 						 desc_bytes(desc),
16967222d1a3SCatalin Vasile 						 DMA_TO_DEVICE);
16977222d1a3SCatalin Vasile 	if (dma_mapping_error(jrdev, ctx->sh_desc_givenc_dma)) {
16987222d1a3SCatalin Vasile 		dev_err(jrdev, "unable to map shared descriptor\n");
16997222d1a3SCatalin Vasile 		return -ENOMEM;
17007222d1a3SCatalin Vasile 	}
17017222d1a3SCatalin Vasile #ifdef DEBUG
17027222d1a3SCatalin Vasile 	print_hex_dump(KERN_ERR,
17037222d1a3SCatalin Vasile 		       "ablkcipher givenc shdesc@" __stringify(__LINE__) ": ",
17047222d1a3SCatalin Vasile 		       DUMP_PREFIX_ADDRESS, 16, 4, desc,
17057222d1a3SCatalin Vasile 		       desc_bytes(desc), 1);
17067222d1a3SCatalin Vasile #endif
1707acdca31dSYuan Kang 
1708acdca31dSYuan Kang 	return ret;
1709acdca31dSYuan Kang }
1710acdca31dSYuan Kang 
1711c6415a60SCatalin Vasile static int xts_ablkcipher_setkey(struct crypto_ablkcipher *ablkcipher,
1712c6415a60SCatalin Vasile 				 const u8 *key, unsigned int keylen)
1713c6415a60SCatalin Vasile {
1714c6415a60SCatalin Vasile 	struct caam_ctx *ctx = crypto_ablkcipher_ctx(ablkcipher);
1715c6415a60SCatalin Vasile 	struct device *jrdev = ctx->jrdev;
1716c6415a60SCatalin Vasile 	u32 *key_jump_cmd, *desc;
1717c6415a60SCatalin Vasile 	__be64 sector_size = cpu_to_be64(512);
1718c6415a60SCatalin Vasile 
1719c6415a60SCatalin Vasile 	if (keylen != 2 * AES_MIN_KEY_SIZE  && keylen != 2 * AES_MAX_KEY_SIZE) {
1720c6415a60SCatalin Vasile 		crypto_ablkcipher_set_flags(ablkcipher,
1721c6415a60SCatalin Vasile 					    CRYPTO_TFM_RES_BAD_KEY_LEN);
1722c6415a60SCatalin Vasile 		dev_err(jrdev, "key size mismatch\n");
1723c6415a60SCatalin Vasile 		return -EINVAL;
1724c6415a60SCatalin Vasile 	}
1725c6415a60SCatalin Vasile 
1726c6415a60SCatalin Vasile 	memcpy(ctx->key, key, keylen);
1727c6415a60SCatalin Vasile 	ctx->key_dma = dma_map_single(jrdev, ctx->key, keylen, DMA_TO_DEVICE);
1728c6415a60SCatalin Vasile 	if (dma_mapping_error(jrdev, ctx->key_dma)) {
1729c6415a60SCatalin Vasile 		dev_err(jrdev, "unable to map key i/o memory\n");
1730c6415a60SCatalin Vasile 		return -ENOMEM;
1731c6415a60SCatalin Vasile 	}
1732c6415a60SCatalin Vasile 	ctx->enckeylen = keylen;
1733c6415a60SCatalin Vasile 
1734c6415a60SCatalin Vasile 	/* xts_ablkcipher_encrypt shared descriptor */
1735c6415a60SCatalin Vasile 	desc = ctx->sh_desc_enc;
1736c6415a60SCatalin Vasile 	init_sh_desc(desc, HDR_SHARE_SERIAL | HDR_SAVECTX);
1737c6415a60SCatalin Vasile 	/* Skip if already shared */
1738c6415a60SCatalin Vasile 	key_jump_cmd = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL |
1739c6415a60SCatalin Vasile 				   JUMP_COND_SHRD);
1740c6415a60SCatalin Vasile 
1741c6415a60SCatalin Vasile 	/* Load class1 keys only */
1742c6415a60SCatalin Vasile 	append_key_as_imm(desc, (void *)ctx->key, ctx->enckeylen,
1743c6415a60SCatalin Vasile 			  ctx->enckeylen, CLASS_1 | KEY_DEST_CLASS_REG);
1744c6415a60SCatalin Vasile 
1745c6415a60SCatalin Vasile 	/* Load sector size with index 40 bytes (0x28) */
1746c6415a60SCatalin Vasile 	append_cmd(desc, CMD_LOAD | IMMEDIATE | LDST_SRCDST_BYTE_CONTEXT |
1747c6415a60SCatalin Vasile 		   LDST_CLASS_1_CCB | (0x28 << LDST_OFFSET_SHIFT) | 8);
1748c6415a60SCatalin Vasile 	append_data(desc, (void *)&sector_size, 8);
1749c6415a60SCatalin Vasile 
1750c6415a60SCatalin Vasile 	set_jump_tgt_here(desc, key_jump_cmd);
1751c6415a60SCatalin Vasile 
1752c6415a60SCatalin Vasile 	/*
1753c6415a60SCatalin Vasile 	 * create sequence for loading the sector index
1754c6415a60SCatalin Vasile 	 * Upper 8B of IV - will be used as sector index
1755c6415a60SCatalin Vasile 	 * Lower 8B of IV - will be discarded
1756c6415a60SCatalin Vasile 	 */
1757c6415a60SCatalin Vasile 	append_cmd(desc, CMD_SEQ_LOAD | LDST_SRCDST_BYTE_CONTEXT |
1758c6415a60SCatalin Vasile 		   LDST_CLASS_1_CCB | (0x20 << LDST_OFFSET_SHIFT) | 8);
1759c6415a60SCatalin Vasile 	append_seq_fifo_load(desc, 8, FIFOLD_CLASS_SKIP);
1760c6415a60SCatalin Vasile 
1761c6415a60SCatalin Vasile 	/* Load operation */
1762c6415a60SCatalin Vasile 	append_operation(desc, ctx->class1_alg_type | OP_ALG_AS_INITFINAL |
1763c6415a60SCatalin Vasile 			 OP_ALG_ENCRYPT);
1764c6415a60SCatalin Vasile 
1765c6415a60SCatalin Vasile 	/* Perform operation */
1766c6415a60SCatalin Vasile 	ablkcipher_append_src_dst(desc);
1767c6415a60SCatalin Vasile 
1768c6415a60SCatalin Vasile 	ctx->sh_desc_enc_dma = dma_map_single(jrdev, desc, desc_bytes(desc),
1769c6415a60SCatalin Vasile 					      DMA_TO_DEVICE);
1770c6415a60SCatalin Vasile 	if (dma_mapping_error(jrdev, ctx->sh_desc_enc_dma)) {
1771c6415a60SCatalin Vasile 		dev_err(jrdev, "unable to map shared descriptor\n");
1772c6415a60SCatalin Vasile 		return -ENOMEM;
1773c6415a60SCatalin Vasile 	}
1774c6415a60SCatalin Vasile #ifdef DEBUG
1775c6415a60SCatalin Vasile 	print_hex_dump(KERN_ERR,
1776c6415a60SCatalin Vasile 		       "xts ablkcipher enc shdesc@" __stringify(__LINE__) ": ",
1777c6415a60SCatalin Vasile 		       DUMP_PREFIX_ADDRESS, 16, 4, desc, desc_bytes(desc), 1);
1778c6415a60SCatalin Vasile #endif
1779c6415a60SCatalin Vasile 
1780c6415a60SCatalin Vasile 	/* xts_ablkcipher_decrypt shared descriptor */
1781c6415a60SCatalin Vasile 	desc = ctx->sh_desc_dec;
1782c6415a60SCatalin Vasile 
1783c6415a60SCatalin Vasile 	init_sh_desc(desc, HDR_SHARE_SERIAL | HDR_SAVECTX);
1784c6415a60SCatalin Vasile 	/* Skip if already shared */
1785c6415a60SCatalin Vasile 	key_jump_cmd = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL |
1786c6415a60SCatalin Vasile 				   JUMP_COND_SHRD);
1787c6415a60SCatalin Vasile 
1788c6415a60SCatalin Vasile 	/* Load class1 key only */
1789c6415a60SCatalin Vasile 	append_key_as_imm(desc, (void *)ctx->key, ctx->enckeylen,
1790c6415a60SCatalin Vasile 			  ctx->enckeylen, CLASS_1 | KEY_DEST_CLASS_REG);
1791c6415a60SCatalin Vasile 
1792c6415a60SCatalin Vasile 	/* Load sector size with index 40 bytes (0x28) */
1793c6415a60SCatalin Vasile 	append_cmd(desc, CMD_LOAD | IMMEDIATE | LDST_SRCDST_BYTE_CONTEXT |
1794c6415a60SCatalin Vasile 		   LDST_CLASS_1_CCB | (0x28 << LDST_OFFSET_SHIFT) | 8);
1795c6415a60SCatalin Vasile 	append_data(desc, (void *)&sector_size, 8);
1796c6415a60SCatalin Vasile 
1797c6415a60SCatalin Vasile 	set_jump_tgt_here(desc, key_jump_cmd);
1798c6415a60SCatalin Vasile 
1799c6415a60SCatalin Vasile 	/*
1800c6415a60SCatalin Vasile 	 * create sequence for loading the sector index
1801c6415a60SCatalin Vasile 	 * Upper 8B of IV - will be used as sector index
1802c6415a60SCatalin Vasile 	 * Lower 8B of IV - will be discarded
1803c6415a60SCatalin Vasile 	 */
1804c6415a60SCatalin Vasile 	append_cmd(desc, CMD_SEQ_LOAD | LDST_SRCDST_BYTE_CONTEXT |
1805c6415a60SCatalin Vasile 		   LDST_CLASS_1_CCB | (0x20 << LDST_OFFSET_SHIFT) | 8);
1806c6415a60SCatalin Vasile 	append_seq_fifo_load(desc, 8, FIFOLD_CLASS_SKIP);
1807c6415a60SCatalin Vasile 
1808c6415a60SCatalin Vasile 	/* Load operation */
1809c6415a60SCatalin Vasile 	append_dec_op1(desc, ctx->class1_alg_type);
1810c6415a60SCatalin Vasile 
1811c6415a60SCatalin Vasile 	/* Perform operation */
1812c6415a60SCatalin Vasile 	ablkcipher_append_src_dst(desc);
1813c6415a60SCatalin Vasile 
1814c6415a60SCatalin Vasile 	ctx->sh_desc_dec_dma = dma_map_single(jrdev, desc, desc_bytes(desc),
1815c6415a60SCatalin Vasile 					      DMA_TO_DEVICE);
1816c6415a60SCatalin Vasile 	if (dma_mapping_error(jrdev, ctx->sh_desc_dec_dma)) {
1817c6415a60SCatalin Vasile 		dma_unmap_single(jrdev, ctx->sh_desc_enc_dma,
1818c6415a60SCatalin Vasile 				 desc_bytes(ctx->sh_desc_enc), DMA_TO_DEVICE);
1819c6415a60SCatalin Vasile 		dev_err(jrdev, "unable to map shared descriptor\n");
1820c6415a60SCatalin Vasile 		return -ENOMEM;
1821c6415a60SCatalin Vasile 	}
1822c6415a60SCatalin Vasile #ifdef DEBUG
1823c6415a60SCatalin Vasile 	print_hex_dump(KERN_ERR,
1824c6415a60SCatalin Vasile 		       "xts ablkcipher dec shdesc@" __stringify(__LINE__) ": ",
1825c6415a60SCatalin Vasile 		       DUMP_PREFIX_ADDRESS, 16, 4, desc, desc_bytes(desc), 1);
1826c6415a60SCatalin Vasile #endif
1827c6415a60SCatalin Vasile 
1828c6415a60SCatalin Vasile 	return 0;
1829c6415a60SCatalin Vasile }
1830c6415a60SCatalin Vasile 
18318e8ec596SKim Phillips /*
18321acebad3SYuan Kang  * aead_edesc - s/w-extended aead descriptor
18331acebad3SYuan Kang  * @assoc_nents: number of segments in associated data (SPI+Seq) scatterlist
18348e8ec596SKim Phillips  * @src_nents: number of segments in input scatterlist
18358e8ec596SKim Phillips  * @dst_nents: number of segments in output scatterlist
18361acebad3SYuan Kang  * @iv_dma: dma address of iv for checking continuity and link table
18378e8ec596SKim Phillips  * @desc: h/w descriptor (variable length; must not exceed MAX_CAAM_DESCSIZE)
1838a299c837SYuan Kang  * @sec4_sg_bytes: length of dma mapped sec4_sg space
1839a299c837SYuan Kang  * @sec4_sg_dma: bus physical mapped address of h/w link table
18408e8ec596SKim Phillips  * @hw_desc: the h/w job descriptor followed by any referenced link tables
18418e8ec596SKim Phillips  */
18420e479300SYuan Kang struct aead_edesc {
18438e8ec596SKim Phillips 	int assoc_nents;
18448e8ec596SKim Phillips 	int src_nents;
18458e8ec596SKim Phillips 	int dst_nents;
18461acebad3SYuan Kang 	dma_addr_t iv_dma;
1847a299c837SYuan Kang 	int sec4_sg_bytes;
1848a299c837SYuan Kang 	dma_addr_t sec4_sg_dma;
1849a299c837SYuan Kang 	struct sec4_sg_entry *sec4_sg;
1850f2147b88SHerbert Xu 	u32 hw_desc[];
18518e8ec596SKim Phillips };
18528e8ec596SKim Phillips 
1853acdca31dSYuan Kang /*
1854acdca31dSYuan Kang  * ablkcipher_edesc - s/w-extended ablkcipher descriptor
1855acdca31dSYuan Kang  * @src_nents: number of segments in input scatterlist
1856acdca31dSYuan Kang  * @dst_nents: number of segments in output scatterlist
1857acdca31dSYuan Kang  * @iv_dma: dma address of iv for checking continuity and link table
1858acdca31dSYuan Kang  * @desc: h/w descriptor (variable length; must not exceed MAX_CAAM_DESCSIZE)
1859a299c837SYuan Kang  * @sec4_sg_bytes: length of dma mapped sec4_sg space
1860a299c837SYuan Kang  * @sec4_sg_dma: bus physical mapped address of h/w link table
1861acdca31dSYuan Kang  * @hw_desc: the h/w job descriptor followed by any referenced link tables
1862acdca31dSYuan Kang  */
1863acdca31dSYuan Kang struct ablkcipher_edesc {
1864acdca31dSYuan Kang 	int src_nents;
1865acdca31dSYuan Kang 	int dst_nents;
1866acdca31dSYuan Kang 	dma_addr_t iv_dma;
1867a299c837SYuan Kang 	int sec4_sg_bytes;
1868a299c837SYuan Kang 	dma_addr_t sec4_sg_dma;
1869a299c837SYuan Kang 	struct sec4_sg_entry *sec4_sg;
1870acdca31dSYuan Kang 	u32 hw_desc[0];
1871acdca31dSYuan Kang };
1872acdca31dSYuan Kang 
18731acebad3SYuan Kang static void caam_unmap(struct device *dev, struct scatterlist *src,
1874643b39b0SYuan Kang 		       struct scatterlist *dst, int src_nents,
187513fb8fd7SLABBE Corentin 		       int dst_nents,
1876a299c837SYuan Kang 		       dma_addr_t iv_dma, int ivsize, dma_addr_t sec4_sg_dma,
1877a299c837SYuan Kang 		       int sec4_sg_bytes)
18781acebad3SYuan Kang {
1879643b39b0SYuan Kang 	if (dst != src) {
188013fb8fd7SLABBE Corentin 		dma_unmap_sg(dev, src, src_nents ? : 1, DMA_TO_DEVICE);
188113fb8fd7SLABBE Corentin 		dma_unmap_sg(dev, dst, dst_nents ? : 1, DMA_FROM_DEVICE);
18821acebad3SYuan Kang 	} else {
188313fb8fd7SLABBE Corentin 		dma_unmap_sg(dev, src, src_nents ? : 1, DMA_BIDIRECTIONAL);
18841acebad3SYuan Kang 	}
18851acebad3SYuan Kang 
18861acebad3SYuan Kang 	if (iv_dma)
18871acebad3SYuan Kang 		dma_unmap_single(dev, iv_dma, ivsize, DMA_TO_DEVICE);
1888a299c837SYuan Kang 	if (sec4_sg_bytes)
1889a299c837SYuan Kang 		dma_unmap_single(dev, sec4_sg_dma, sec4_sg_bytes,
18901acebad3SYuan Kang 				 DMA_TO_DEVICE);
18911acebad3SYuan Kang }
18921acebad3SYuan Kang 
18930e479300SYuan Kang static void aead_unmap(struct device *dev,
18940e479300SYuan Kang 		       struct aead_edesc *edesc,
18950e479300SYuan Kang 		       struct aead_request *req)
18968e8ec596SKim Phillips {
1897f2147b88SHerbert Xu 	caam_unmap(dev, req->src, req->dst,
189813fb8fd7SLABBE Corentin 		   edesc->src_nents, edesc->dst_nents, 0, 0,
1899f2147b88SHerbert Xu 		   edesc->sec4_sg_dma, edesc->sec4_sg_bytes);
1900f2147b88SHerbert Xu }
1901f2147b88SHerbert Xu 
1902acdca31dSYuan Kang static void ablkcipher_unmap(struct device *dev,
1903acdca31dSYuan Kang 			     struct ablkcipher_edesc *edesc,
1904acdca31dSYuan Kang 			     struct ablkcipher_request *req)
1905acdca31dSYuan Kang {
1906acdca31dSYuan Kang 	struct crypto_ablkcipher *ablkcipher = crypto_ablkcipher_reqtfm(req);
1907acdca31dSYuan Kang 	int ivsize = crypto_ablkcipher_ivsize(ablkcipher);
1908acdca31dSYuan Kang 
1909acdca31dSYuan Kang 	caam_unmap(dev, req->src, req->dst,
191013fb8fd7SLABBE Corentin 		   edesc->src_nents, edesc->dst_nents,
191113fb8fd7SLABBE Corentin 		   edesc->iv_dma, ivsize,
1912643b39b0SYuan Kang 		   edesc->sec4_sg_dma, edesc->sec4_sg_bytes);
1913acdca31dSYuan Kang }
1914acdca31dSYuan Kang 
19150e479300SYuan Kang static void aead_encrypt_done(struct device *jrdev, u32 *desc, u32 err,
19168e8ec596SKim Phillips 				   void *context)
19178e8ec596SKim Phillips {
19180e479300SYuan Kang 	struct aead_request *req = context;
19190e479300SYuan Kang 	struct aead_edesc *edesc;
1920f2147b88SHerbert Xu 
1921f2147b88SHerbert Xu #ifdef DEBUG
1922f2147b88SHerbert Xu 	dev_err(jrdev, "%s %d: err 0x%x\n", __func__, __LINE__, err);
1923f2147b88SHerbert Xu #endif
1924f2147b88SHerbert Xu 
1925f2147b88SHerbert Xu 	edesc = container_of(desc, struct aead_edesc, hw_desc[0]);
1926f2147b88SHerbert Xu 
1927f2147b88SHerbert Xu 	if (err)
1928f2147b88SHerbert Xu 		caam_jr_strstatus(jrdev, err);
1929f2147b88SHerbert Xu 
1930f2147b88SHerbert Xu 	aead_unmap(jrdev, edesc, req);
1931f2147b88SHerbert Xu 
1932f2147b88SHerbert Xu 	kfree(edesc);
1933f2147b88SHerbert Xu 
1934f2147b88SHerbert Xu 	aead_request_complete(req, err);
1935f2147b88SHerbert Xu }
1936f2147b88SHerbert Xu 
19370e479300SYuan Kang static void aead_decrypt_done(struct device *jrdev, u32 *desc, u32 err,
19388e8ec596SKim Phillips 				   void *context)
19398e8ec596SKim Phillips {
19400e479300SYuan Kang 	struct aead_request *req = context;
19410e479300SYuan Kang 	struct aead_edesc *edesc;
1942f2147b88SHerbert Xu 
1943f2147b88SHerbert Xu #ifdef DEBUG
1944f2147b88SHerbert Xu 	dev_err(jrdev, "%s %d: err 0x%x\n", __func__, __LINE__, err);
1945f2147b88SHerbert Xu #endif
1946f2147b88SHerbert Xu 
1947f2147b88SHerbert Xu 	edesc = container_of(desc, struct aead_edesc, hw_desc[0]);
1948f2147b88SHerbert Xu 
1949f2147b88SHerbert Xu 	if (err)
1950f2147b88SHerbert Xu 		caam_jr_strstatus(jrdev, err);
1951f2147b88SHerbert Xu 
1952f2147b88SHerbert Xu 	aead_unmap(jrdev, edesc, req);
1953f2147b88SHerbert Xu 
1954f2147b88SHerbert Xu 	/*
1955f2147b88SHerbert Xu 	 * verify hw auth check passed else return -EBADMSG
1956f2147b88SHerbert Xu 	 */
1957f2147b88SHerbert Xu 	if ((err & JRSTA_CCBERR_ERRID_MASK) == JRSTA_CCBERR_ERRID_ICVCHK)
1958f2147b88SHerbert Xu 		err = -EBADMSG;
1959f2147b88SHerbert Xu 
1960f2147b88SHerbert Xu 	kfree(edesc);
1961f2147b88SHerbert Xu 
1962f2147b88SHerbert Xu 	aead_request_complete(req, err);
1963f2147b88SHerbert Xu }
1964f2147b88SHerbert Xu 
1965acdca31dSYuan Kang static void ablkcipher_encrypt_done(struct device *jrdev, u32 *desc, u32 err,
1966acdca31dSYuan Kang 				   void *context)
1967acdca31dSYuan Kang {
1968acdca31dSYuan Kang 	struct ablkcipher_request *req = context;
1969acdca31dSYuan Kang 	struct ablkcipher_edesc *edesc;
1970acdca31dSYuan Kang #ifdef DEBUG
1971acdca31dSYuan Kang 	struct crypto_ablkcipher *ablkcipher = crypto_ablkcipher_reqtfm(req);
1972acdca31dSYuan Kang 	int ivsize = crypto_ablkcipher_ivsize(ablkcipher);
1973acdca31dSYuan Kang 
1974acdca31dSYuan Kang 	dev_err(jrdev, "%s %d: err 0x%x\n", __func__, __LINE__, err);
1975acdca31dSYuan Kang #endif
1976acdca31dSYuan Kang 
1977acdca31dSYuan Kang 	edesc = (struct ablkcipher_edesc *)((char *)desc -
1978acdca31dSYuan Kang 		 offsetof(struct ablkcipher_edesc, hw_desc));
1979acdca31dSYuan Kang 
1980fa9659cdSMarek Vasut 	if (err)
1981fa9659cdSMarek Vasut 		caam_jr_strstatus(jrdev, err);
1982acdca31dSYuan Kang 
1983acdca31dSYuan Kang #ifdef DEBUG
1984514df281SAlex Porosanu 	print_hex_dump(KERN_ERR, "dstiv  @"__stringify(__LINE__)": ",
1985acdca31dSYuan Kang 		       DUMP_PREFIX_ADDRESS, 16, 4, req->info,
1986acdca31dSYuan Kang 		       edesc->src_nents > 1 ? 100 : ivsize, 1);
1987514df281SAlex Porosanu 	print_hex_dump(KERN_ERR, "dst    @"__stringify(__LINE__)": ",
1988acdca31dSYuan Kang 		       DUMP_PREFIX_ADDRESS, 16, 4, sg_virt(req->src),
1989acdca31dSYuan Kang 		       edesc->dst_nents > 1 ? 100 : req->nbytes, 1);
1990acdca31dSYuan Kang #endif
1991acdca31dSYuan Kang 
1992acdca31dSYuan Kang 	ablkcipher_unmap(jrdev, edesc, req);
1993acdca31dSYuan Kang 	kfree(edesc);
1994acdca31dSYuan Kang 
1995acdca31dSYuan Kang 	ablkcipher_request_complete(req, err);
1996acdca31dSYuan Kang }
1997acdca31dSYuan Kang 
1998acdca31dSYuan Kang static void ablkcipher_decrypt_done(struct device *jrdev, u32 *desc, u32 err,
1999acdca31dSYuan Kang 				    void *context)
2000acdca31dSYuan Kang {
2001acdca31dSYuan Kang 	struct ablkcipher_request *req = context;
2002acdca31dSYuan Kang 	struct ablkcipher_edesc *edesc;
2003acdca31dSYuan Kang #ifdef DEBUG
2004acdca31dSYuan Kang 	struct crypto_ablkcipher *ablkcipher = crypto_ablkcipher_reqtfm(req);
2005acdca31dSYuan Kang 	int ivsize = crypto_ablkcipher_ivsize(ablkcipher);
2006acdca31dSYuan Kang 
2007acdca31dSYuan Kang 	dev_err(jrdev, "%s %d: err 0x%x\n", __func__, __LINE__, err);
2008acdca31dSYuan Kang #endif
2009acdca31dSYuan Kang 
2010acdca31dSYuan Kang 	edesc = (struct ablkcipher_edesc *)((char *)desc -
2011acdca31dSYuan Kang 		 offsetof(struct ablkcipher_edesc, hw_desc));
2012fa9659cdSMarek Vasut 	if (err)
2013fa9659cdSMarek Vasut 		caam_jr_strstatus(jrdev, err);
2014acdca31dSYuan Kang 
2015acdca31dSYuan Kang #ifdef DEBUG
2016514df281SAlex Porosanu 	print_hex_dump(KERN_ERR, "dstiv  @"__stringify(__LINE__)": ",
2017acdca31dSYuan Kang 		       DUMP_PREFIX_ADDRESS, 16, 4, req->info,
2018acdca31dSYuan Kang 		       ivsize, 1);
2019514df281SAlex Porosanu 	print_hex_dump(KERN_ERR, "dst    @"__stringify(__LINE__)": ",
2020acdca31dSYuan Kang 		       DUMP_PREFIX_ADDRESS, 16, 4, sg_virt(req->src),
2021acdca31dSYuan Kang 		       edesc->dst_nents > 1 ? 100 : req->nbytes, 1);
2022acdca31dSYuan Kang #endif
2023acdca31dSYuan Kang 
2024acdca31dSYuan Kang 	ablkcipher_unmap(jrdev, edesc, req);
2025acdca31dSYuan Kang 	kfree(edesc);
2026acdca31dSYuan Kang 
2027acdca31dSYuan Kang 	ablkcipher_request_complete(req, err);
2028acdca31dSYuan Kang }
2029acdca31dSYuan Kang 
20308e8ec596SKim Phillips /*
20311acebad3SYuan Kang  * Fill in aead job descriptor
20328e8ec596SKim Phillips  */
2033f2147b88SHerbert Xu static void init_aead_job(struct aead_request *req,
2034f2147b88SHerbert Xu 			  struct aead_edesc *edesc,
2035f2147b88SHerbert Xu 			  bool all_contig, bool encrypt)
2036f2147b88SHerbert Xu {
2037f2147b88SHerbert Xu 	struct crypto_aead *aead = crypto_aead_reqtfm(req);
2038f2147b88SHerbert Xu 	struct caam_ctx *ctx = crypto_aead_ctx(aead);
2039f2147b88SHerbert Xu 	int authsize = ctx->authsize;
2040f2147b88SHerbert Xu 	u32 *desc = edesc->hw_desc;
2041f2147b88SHerbert Xu 	u32 out_options, in_options;
2042f2147b88SHerbert Xu 	dma_addr_t dst_dma, src_dma;
2043f2147b88SHerbert Xu 	int len, sec4_sg_index = 0;
2044f2147b88SHerbert Xu 	dma_addr_t ptr;
2045f2147b88SHerbert Xu 	u32 *sh_desc;
2046f2147b88SHerbert Xu 
2047f2147b88SHerbert Xu 	sh_desc = encrypt ? ctx->sh_desc_enc : ctx->sh_desc_dec;
2048f2147b88SHerbert Xu 	ptr = encrypt ? ctx->sh_desc_enc_dma : ctx->sh_desc_dec_dma;
2049f2147b88SHerbert Xu 
2050f2147b88SHerbert Xu 	len = desc_len(sh_desc);
2051f2147b88SHerbert Xu 	init_job_desc_shared(desc, ptr, len, HDR_SHARE_DEFER | HDR_REVERSE);
2052f2147b88SHerbert Xu 
2053f2147b88SHerbert Xu 	if (all_contig) {
2054f2147b88SHerbert Xu 		src_dma = sg_dma_address(req->src);
2055f2147b88SHerbert Xu 		in_options = 0;
2056f2147b88SHerbert Xu 	} else {
2057f2147b88SHerbert Xu 		src_dma = edesc->sec4_sg_dma;
2058f2147b88SHerbert Xu 		sec4_sg_index += edesc->src_nents;
2059f2147b88SHerbert Xu 		in_options = LDST_SGF;
2060f2147b88SHerbert Xu 	}
2061f2147b88SHerbert Xu 
2062f2147b88SHerbert Xu 	append_seq_in_ptr(desc, src_dma, req->assoclen + req->cryptlen,
2063f2147b88SHerbert Xu 			  in_options);
2064f2147b88SHerbert Xu 
2065f2147b88SHerbert Xu 	dst_dma = src_dma;
2066f2147b88SHerbert Xu 	out_options = in_options;
2067f2147b88SHerbert Xu 
2068f2147b88SHerbert Xu 	if (unlikely(req->src != req->dst)) {
2069f2147b88SHerbert Xu 		if (!edesc->dst_nents) {
2070f2147b88SHerbert Xu 			dst_dma = sg_dma_address(req->dst);
2071f2147b88SHerbert Xu 		} else {
2072f2147b88SHerbert Xu 			dst_dma = edesc->sec4_sg_dma +
2073f2147b88SHerbert Xu 				  sec4_sg_index *
2074f2147b88SHerbert Xu 				  sizeof(struct sec4_sg_entry);
2075f2147b88SHerbert Xu 			out_options = LDST_SGF;
2076f2147b88SHerbert Xu 		}
2077f2147b88SHerbert Xu 	}
2078f2147b88SHerbert Xu 
2079f2147b88SHerbert Xu 	if (encrypt)
2080f2147b88SHerbert Xu 		append_seq_out_ptr(desc, dst_dma,
2081f2147b88SHerbert Xu 				   req->assoclen + req->cryptlen + authsize,
2082f2147b88SHerbert Xu 				   out_options);
2083f2147b88SHerbert Xu 	else
2084f2147b88SHerbert Xu 		append_seq_out_ptr(desc, dst_dma,
2085f2147b88SHerbert Xu 				   req->assoclen + req->cryptlen - authsize,
2086f2147b88SHerbert Xu 				   out_options);
2087f2147b88SHerbert Xu 
2088f2147b88SHerbert Xu 	/* REG3 = assoclen */
2089f2147b88SHerbert Xu 	append_math_add_imm_u32(desc, REG3, ZERO, IMM, req->assoclen);
2090f2147b88SHerbert Xu }
2091f2147b88SHerbert Xu 
2092f2147b88SHerbert Xu static void init_gcm_job(struct aead_request *req,
2093f2147b88SHerbert Xu 			 struct aead_edesc *edesc,
2094f2147b88SHerbert Xu 			 bool all_contig, bool encrypt)
2095f2147b88SHerbert Xu {
2096f2147b88SHerbert Xu 	struct crypto_aead *aead = crypto_aead_reqtfm(req);
2097f2147b88SHerbert Xu 	struct caam_ctx *ctx = crypto_aead_ctx(aead);
2098f2147b88SHerbert Xu 	unsigned int ivsize = crypto_aead_ivsize(aead);
2099f2147b88SHerbert Xu 	u32 *desc = edesc->hw_desc;
2100f2147b88SHerbert Xu 	bool generic_gcm = (ivsize == 12);
2101f2147b88SHerbert Xu 	unsigned int last;
2102f2147b88SHerbert Xu 
2103f2147b88SHerbert Xu 	init_aead_job(req, edesc, all_contig, encrypt);
2104f2147b88SHerbert Xu 
2105f2147b88SHerbert Xu 	/* BUG This should not be specific to generic GCM. */
2106f2147b88SHerbert Xu 	last = 0;
2107f2147b88SHerbert Xu 	if (encrypt && generic_gcm && !(req->assoclen + req->cryptlen))
2108f2147b88SHerbert Xu 		last = FIFOLD_TYPE_LAST1;
2109f2147b88SHerbert Xu 
2110f2147b88SHerbert Xu 	/* Read GCM IV */
2111f2147b88SHerbert Xu 	append_cmd(desc, CMD_FIFO_LOAD | FIFOLD_CLASS_CLASS1 | IMMEDIATE |
2112f2147b88SHerbert Xu 			 FIFOLD_TYPE_IV | FIFOLD_TYPE_FLUSH1 | 12 | last);
2113f2147b88SHerbert Xu 	/* Append Salt */
2114f2147b88SHerbert Xu 	if (!generic_gcm)
2115f2147b88SHerbert Xu 		append_data(desc, ctx->key + ctx->enckeylen, 4);
2116f2147b88SHerbert Xu 	/* Append IV */
2117f2147b88SHerbert Xu 	append_data(desc, req->iv, ivsize);
2118f2147b88SHerbert Xu 	/* End of blank commands */
2119f2147b88SHerbert Xu }
2120f2147b88SHerbert Xu 
2121479bcc7cSHerbert Xu static void init_authenc_job(struct aead_request *req,
21221acebad3SYuan Kang 			     struct aead_edesc *edesc,
2123479bcc7cSHerbert Xu 			     bool all_contig, bool encrypt)
21241acebad3SYuan Kang {
21251acebad3SYuan Kang 	struct crypto_aead *aead = crypto_aead_reqtfm(req);
2126479bcc7cSHerbert Xu 	struct caam_aead_alg *alg = container_of(crypto_aead_alg(aead),
2127479bcc7cSHerbert Xu 						 struct caam_aead_alg, aead);
2128479bcc7cSHerbert Xu 	unsigned int ivsize = crypto_aead_ivsize(aead);
21291acebad3SYuan Kang 	struct caam_ctx *ctx = crypto_aead_ctx(aead);
2130479bcc7cSHerbert Xu 	const bool ctr_mode = ((ctx->class1_alg_type & OP_ALG_AAI_MASK) ==
2131479bcc7cSHerbert Xu 			       OP_ALG_AAI_CTR_MOD128);
2132479bcc7cSHerbert Xu 	const bool is_rfc3686 = alg->caam.rfc3686;
21331acebad3SYuan Kang 	u32 *desc = edesc->hw_desc;
2134479bcc7cSHerbert Xu 	u32 ivoffset = 0;
21358e8ec596SKim Phillips 
2136479bcc7cSHerbert Xu 	/*
2137479bcc7cSHerbert Xu 	 * AES-CTR needs to load IV in CONTEXT1 reg
2138479bcc7cSHerbert Xu 	 * at an offset of 128bits (16bytes)
2139479bcc7cSHerbert Xu 	 * CONTEXT1[255:128] = IV
2140479bcc7cSHerbert Xu 	 */
2141479bcc7cSHerbert Xu 	if (ctr_mode)
2142479bcc7cSHerbert Xu 		ivoffset = 16;
21438e8ec596SKim Phillips 
2144479bcc7cSHerbert Xu 	/*
2145479bcc7cSHerbert Xu 	 * RFC3686 specific:
2146479bcc7cSHerbert Xu 	 *	CONTEXT1[255:128] = {NONCE, IV, COUNTER}
2147479bcc7cSHerbert Xu 	 */
2148479bcc7cSHerbert Xu 	if (is_rfc3686)
2149479bcc7cSHerbert Xu 		ivoffset = 16 + CTR_RFC3686_NONCE_SIZE;
2150bac68f2cSTudor Ambarus 
2151479bcc7cSHerbert Xu 	init_aead_job(req, edesc, all_contig, encrypt);
21521acebad3SYuan Kang 
2153479bcc7cSHerbert Xu 	if (ivsize && (is_rfc3686 || !(alg->caam.geniv && encrypt)))
2154479bcc7cSHerbert Xu 		append_load_as_imm(desc, req->iv, ivsize,
2155479bcc7cSHerbert Xu 				   LDST_CLASS_1_CCB |
2156479bcc7cSHerbert Xu 				   LDST_SRCDST_BYTE_CONTEXT |
2157479bcc7cSHerbert Xu 				   (ivoffset << LDST_OFFSET_SHIFT));
21588e8ec596SKim Phillips }
21598e8ec596SKim Phillips 
21608e8ec596SKim Phillips /*
2161acdca31dSYuan Kang  * Fill in ablkcipher job descriptor
2162acdca31dSYuan Kang  */
2163acdca31dSYuan Kang static void init_ablkcipher_job(u32 *sh_desc, dma_addr_t ptr,
2164acdca31dSYuan Kang 				struct ablkcipher_edesc *edesc,
2165acdca31dSYuan Kang 				struct ablkcipher_request *req,
2166acdca31dSYuan Kang 				bool iv_contig)
2167acdca31dSYuan Kang {
2168acdca31dSYuan Kang 	struct crypto_ablkcipher *ablkcipher = crypto_ablkcipher_reqtfm(req);
2169acdca31dSYuan Kang 	int ivsize = crypto_ablkcipher_ivsize(ablkcipher);
2170acdca31dSYuan Kang 	u32 *desc = edesc->hw_desc;
2171acdca31dSYuan Kang 	u32 out_options = 0, in_options;
2172acdca31dSYuan Kang 	dma_addr_t dst_dma, src_dma;
2173a299c837SYuan Kang 	int len, sec4_sg_index = 0;
2174acdca31dSYuan Kang 
2175acdca31dSYuan Kang #ifdef DEBUG
2176514df281SAlex Porosanu 	print_hex_dump(KERN_ERR, "presciv@"__stringify(__LINE__)": ",
2177acdca31dSYuan Kang 		       DUMP_PREFIX_ADDRESS, 16, 4, req->info,
2178acdca31dSYuan Kang 		       ivsize, 1);
2179514df281SAlex Porosanu 	print_hex_dump(KERN_ERR, "src    @"__stringify(__LINE__)": ",
2180acdca31dSYuan Kang 		       DUMP_PREFIX_ADDRESS, 16, 4, sg_virt(req->src),
2181acdca31dSYuan Kang 		       edesc->src_nents ? 100 : req->nbytes, 1);
2182acdca31dSYuan Kang #endif
2183acdca31dSYuan Kang 
2184acdca31dSYuan Kang 	len = desc_len(sh_desc);
2185acdca31dSYuan Kang 	init_job_desc_shared(desc, ptr, len, HDR_SHARE_DEFER | HDR_REVERSE);
2186acdca31dSYuan Kang 
2187acdca31dSYuan Kang 	if (iv_contig) {
2188acdca31dSYuan Kang 		src_dma = edesc->iv_dma;
2189acdca31dSYuan Kang 		in_options = 0;
2190acdca31dSYuan Kang 	} else {
2191a299c837SYuan Kang 		src_dma = edesc->sec4_sg_dma;
219235b82e55SCristian Stoica 		sec4_sg_index += edesc->src_nents + 1;
2193acdca31dSYuan Kang 		in_options = LDST_SGF;
2194acdca31dSYuan Kang 	}
2195acdca31dSYuan Kang 	append_seq_in_ptr(desc, src_dma, req->nbytes + ivsize, in_options);
2196acdca31dSYuan Kang 
2197acdca31dSYuan Kang 	if (likely(req->src == req->dst)) {
2198acdca31dSYuan Kang 		if (!edesc->src_nents && iv_contig) {
2199acdca31dSYuan Kang 			dst_dma = sg_dma_address(req->src);
2200acdca31dSYuan Kang 		} else {
2201a299c837SYuan Kang 			dst_dma = edesc->sec4_sg_dma +
2202a299c837SYuan Kang 				sizeof(struct sec4_sg_entry);
2203acdca31dSYuan Kang 			out_options = LDST_SGF;
2204acdca31dSYuan Kang 		}
2205acdca31dSYuan Kang 	} else {
2206acdca31dSYuan Kang 		if (!edesc->dst_nents) {
2207acdca31dSYuan Kang 			dst_dma = sg_dma_address(req->dst);
2208acdca31dSYuan Kang 		} else {
2209a299c837SYuan Kang 			dst_dma = edesc->sec4_sg_dma +
2210a299c837SYuan Kang 				sec4_sg_index * sizeof(struct sec4_sg_entry);
2211acdca31dSYuan Kang 			out_options = LDST_SGF;
2212acdca31dSYuan Kang 		}
2213acdca31dSYuan Kang 	}
2214acdca31dSYuan Kang 	append_seq_out_ptr(desc, dst_dma, req->nbytes, out_options);
2215acdca31dSYuan Kang }
2216acdca31dSYuan Kang 
2217acdca31dSYuan Kang /*
22187222d1a3SCatalin Vasile  * Fill in ablkcipher givencrypt job descriptor
22197222d1a3SCatalin Vasile  */
22207222d1a3SCatalin Vasile static void init_ablkcipher_giv_job(u32 *sh_desc, dma_addr_t ptr,
22217222d1a3SCatalin Vasile 				    struct ablkcipher_edesc *edesc,
22227222d1a3SCatalin Vasile 				    struct ablkcipher_request *req,
22237222d1a3SCatalin Vasile 				    bool iv_contig)
22247222d1a3SCatalin Vasile {
22257222d1a3SCatalin Vasile 	struct crypto_ablkcipher *ablkcipher = crypto_ablkcipher_reqtfm(req);
22267222d1a3SCatalin Vasile 	int ivsize = crypto_ablkcipher_ivsize(ablkcipher);
22277222d1a3SCatalin Vasile 	u32 *desc = edesc->hw_desc;
22287222d1a3SCatalin Vasile 	u32 out_options, in_options;
22297222d1a3SCatalin Vasile 	dma_addr_t dst_dma, src_dma;
22307222d1a3SCatalin Vasile 	int len, sec4_sg_index = 0;
22317222d1a3SCatalin Vasile 
22327222d1a3SCatalin Vasile #ifdef DEBUG
22337222d1a3SCatalin Vasile 	print_hex_dump(KERN_ERR, "presciv@" __stringify(__LINE__) ": ",
22347222d1a3SCatalin Vasile 		       DUMP_PREFIX_ADDRESS, 16, 4, req->info,
22357222d1a3SCatalin Vasile 		       ivsize, 1);
22367222d1a3SCatalin Vasile 	print_hex_dump(KERN_ERR, "src    @" __stringify(__LINE__) ": ",
22377222d1a3SCatalin Vasile 		       DUMP_PREFIX_ADDRESS, 16, 4, sg_virt(req->src),
22387222d1a3SCatalin Vasile 		       edesc->src_nents ? 100 : req->nbytes, 1);
22397222d1a3SCatalin Vasile #endif
22407222d1a3SCatalin Vasile 
22417222d1a3SCatalin Vasile 	len = desc_len(sh_desc);
22427222d1a3SCatalin Vasile 	init_job_desc_shared(desc, ptr, len, HDR_SHARE_DEFER | HDR_REVERSE);
22437222d1a3SCatalin Vasile 
22447222d1a3SCatalin Vasile 	if (!edesc->src_nents) {
22457222d1a3SCatalin Vasile 		src_dma = sg_dma_address(req->src);
22467222d1a3SCatalin Vasile 		in_options = 0;
22477222d1a3SCatalin Vasile 	} else {
22487222d1a3SCatalin Vasile 		src_dma = edesc->sec4_sg_dma;
22497222d1a3SCatalin Vasile 		sec4_sg_index += edesc->src_nents;
22507222d1a3SCatalin Vasile 		in_options = LDST_SGF;
22517222d1a3SCatalin Vasile 	}
22527222d1a3SCatalin Vasile 	append_seq_in_ptr(desc, src_dma, req->nbytes, in_options);
22537222d1a3SCatalin Vasile 
22547222d1a3SCatalin Vasile 	if (iv_contig) {
22557222d1a3SCatalin Vasile 		dst_dma = edesc->iv_dma;
22567222d1a3SCatalin Vasile 		out_options = 0;
22577222d1a3SCatalin Vasile 	} else {
22587222d1a3SCatalin Vasile 		dst_dma = edesc->sec4_sg_dma +
22597222d1a3SCatalin Vasile 			  sec4_sg_index * sizeof(struct sec4_sg_entry);
22607222d1a3SCatalin Vasile 		out_options = LDST_SGF;
22617222d1a3SCatalin Vasile 	}
22627222d1a3SCatalin Vasile 	append_seq_out_ptr(desc, dst_dma, req->nbytes + ivsize, out_options);
22637222d1a3SCatalin Vasile }
22647222d1a3SCatalin Vasile 
22657222d1a3SCatalin Vasile /*
22661acebad3SYuan Kang  * allocate and map the aead extended descriptor
22678e8ec596SKim Phillips  */
2268f2147b88SHerbert Xu static struct aead_edesc *aead_edesc_alloc(struct aead_request *req,
2269f2147b88SHerbert Xu 					   int desc_bytes, bool *all_contig_ptr,
2270f2147b88SHerbert Xu 					   bool encrypt)
2271f2147b88SHerbert Xu {
2272f2147b88SHerbert Xu 	struct crypto_aead *aead = crypto_aead_reqtfm(req);
2273f2147b88SHerbert Xu 	struct caam_ctx *ctx = crypto_aead_ctx(aead);
2274f2147b88SHerbert Xu 	struct device *jrdev = ctx->jrdev;
2275f2147b88SHerbert Xu 	gfp_t flags = (req->base.flags & (CRYPTO_TFM_REQ_MAY_BACKLOG |
2276f2147b88SHerbert Xu 		       CRYPTO_TFM_REQ_MAY_SLEEP)) ? GFP_KERNEL : GFP_ATOMIC;
2277f2147b88SHerbert Xu 	int src_nents, dst_nents = 0;
2278f2147b88SHerbert Xu 	struct aead_edesc *edesc;
2279f2147b88SHerbert Xu 	int sgc;
2280f2147b88SHerbert Xu 	bool all_contig = true;
2281f2147b88SHerbert Xu 	int sec4_sg_index, sec4_sg_len = 0, sec4_sg_bytes;
2282f2147b88SHerbert Xu 	unsigned int authsize = ctx->authsize;
2283f2147b88SHerbert Xu 
2284f2147b88SHerbert Xu 	if (unlikely(req->dst != req->src)) {
228513fb8fd7SLABBE Corentin 		src_nents = sg_count(req->src, req->assoclen + req->cryptlen);
2286f2147b88SHerbert Xu 		dst_nents = sg_count(req->dst,
2287f2147b88SHerbert Xu 				     req->assoclen + req->cryptlen +
228813fb8fd7SLABBE Corentin 					(encrypt ? authsize : (-authsize)));
2289f2147b88SHerbert Xu 	} else {
2290f2147b88SHerbert Xu 		src_nents = sg_count(req->src,
2291f2147b88SHerbert Xu 				     req->assoclen + req->cryptlen +
229213fb8fd7SLABBE Corentin 					(encrypt ? authsize : 0));
2293f2147b88SHerbert Xu 	}
2294f2147b88SHerbert Xu 
2295f2147b88SHerbert Xu 	/* Check if data are contiguous. */
2296f2147b88SHerbert Xu 	all_contig = !src_nents;
2297f2147b88SHerbert Xu 	if (!all_contig) {
2298f2147b88SHerbert Xu 		src_nents = src_nents ? : 1;
2299f2147b88SHerbert Xu 		sec4_sg_len = src_nents;
2300f2147b88SHerbert Xu 	}
2301f2147b88SHerbert Xu 
2302f2147b88SHerbert Xu 	sec4_sg_len += dst_nents;
2303f2147b88SHerbert Xu 
2304f2147b88SHerbert Xu 	sec4_sg_bytes = sec4_sg_len * sizeof(struct sec4_sg_entry);
2305f2147b88SHerbert Xu 
2306f2147b88SHerbert Xu 	/* allocate space for base edesc and hw desc commands, link tables */
2307dde20ae9SVictoria Milhoan 	edesc = kzalloc(sizeof(*edesc) + desc_bytes + sec4_sg_bytes,
2308dde20ae9SVictoria Milhoan 			GFP_DMA | flags);
2309f2147b88SHerbert Xu 	if (!edesc) {
2310f2147b88SHerbert Xu 		dev_err(jrdev, "could not allocate extended descriptor\n");
2311f2147b88SHerbert Xu 		return ERR_PTR(-ENOMEM);
2312f2147b88SHerbert Xu 	}
2313f2147b88SHerbert Xu 
2314f2147b88SHerbert Xu 	if (likely(req->src == req->dst)) {
231513fb8fd7SLABBE Corentin 		sgc = dma_map_sg(jrdev, req->src, src_nents ? : 1,
231613fb8fd7SLABBE Corentin 				 DMA_BIDIRECTIONAL);
2317f2147b88SHerbert Xu 		if (unlikely(!sgc)) {
2318f2147b88SHerbert Xu 			dev_err(jrdev, "unable to map source\n");
2319f2147b88SHerbert Xu 			kfree(edesc);
2320f2147b88SHerbert Xu 			return ERR_PTR(-ENOMEM);
2321f2147b88SHerbert Xu 		}
2322f2147b88SHerbert Xu 	} else {
232313fb8fd7SLABBE Corentin 		sgc = dma_map_sg(jrdev, req->src, src_nents ? : 1,
232413fb8fd7SLABBE Corentin 				 DMA_TO_DEVICE);
2325f2147b88SHerbert Xu 		if (unlikely(!sgc)) {
2326f2147b88SHerbert Xu 			dev_err(jrdev, "unable to map source\n");
2327f2147b88SHerbert Xu 			kfree(edesc);
2328f2147b88SHerbert Xu 			return ERR_PTR(-ENOMEM);
2329f2147b88SHerbert Xu 		}
2330f2147b88SHerbert Xu 
233113fb8fd7SLABBE Corentin 		sgc = dma_map_sg(jrdev, req->dst, dst_nents ? : 1,
233213fb8fd7SLABBE Corentin 				 DMA_FROM_DEVICE);
2333f2147b88SHerbert Xu 		if (unlikely(!sgc)) {
2334f2147b88SHerbert Xu 			dev_err(jrdev, "unable to map destination\n");
233513fb8fd7SLABBE Corentin 			dma_unmap_sg(jrdev, req->src, src_nents ? : 1,
233613fb8fd7SLABBE Corentin 				     DMA_TO_DEVICE);
2337f2147b88SHerbert Xu 			kfree(edesc);
2338f2147b88SHerbert Xu 			return ERR_PTR(-ENOMEM);
2339f2147b88SHerbert Xu 		}
2340f2147b88SHerbert Xu 	}
2341f2147b88SHerbert Xu 
2342f2147b88SHerbert Xu 	edesc->src_nents = src_nents;
2343f2147b88SHerbert Xu 	edesc->dst_nents = dst_nents;
2344f2147b88SHerbert Xu 	edesc->sec4_sg = (void *)edesc + sizeof(struct aead_edesc) +
2345f2147b88SHerbert Xu 			 desc_bytes;
2346f2147b88SHerbert Xu 	*all_contig_ptr = all_contig;
2347f2147b88SHerbert Xu 
2348f2147b88SHerbert Xu 	sec4_sg_index = 0;
2349f2147b88SHerbert Xu 	if (!all_contig) {
23507793bda8SHerbert Xu 		sg_to_sec4_sg_last(req->src, src_nents,
2351f2147b88SHerbert Xu 			      edesc->sec4_sg + sec4_sg_index, 0);
2352f2147b88SHerbert Xu 		sec4_sg_index += src_nents;
2353f2147b88SHerbert Xu 	}
2354f2147b88SHerbert Xu 	if (dst_nents) {
2355f2147b88SHerbert Xu 		sg_to_sec4_sg_last(req->dst, dst_nents,
2356f2147b88SHerbert Xu 				   edesc->sec4_sg + sec4_sg_index, 0);
2357f2147b88SHerbert Xu 	}
2358f2147b88SHerbert Xu 
2359f2147b88SHerbert Xu 	if (!sec4_sg_bytes)
2360f2147b88SHerbert Xu 		return edesc;
2361f2147b88SHerbert Xu 
2362f2147b88SHerbert Xu 	edesc->sec4_sg_dma = dma_map_single(jrdev, edesc->sec4_sg,
2363f2147b88SHerbert Xu 					    sec4_sg_bytes, DMA_TO_DEVICE);
2364f2147b88SHerbert Xu 	if (dma_mapping_error(jrdev, edesc->sec4_sg_dma)) {
2365f2147b88SHerbert Xu 		dev_err(jrdev, "unable to map S/G table\n");
2366f2147b88SHerbert Xu 		aead_unmap(jrdev, edesc, req);
2367f2147b88SHerbert Xu 		kfree(edesc);
2368f2147b88SHerbert Xu 		return ERR_PTR(-ENOMEM);
2369f2147b88SHerbert Xu 	}
2370f2147b88SHerbert Xu 
2371f2147b88SHerbert Xu 	edesc->sec4_sg_bytes = sec4_sg_bytes;
2372f2147b88SHerbert Xu 
2373f2147b88SHerbert Xu 	return edesc;
2374f2147b88SHerbert Xu }
2375f2147b88SHerbert Xu 
2376f2147b88SHerbert Xu static int gcm_encrypt(struct aead_request *req)
23778e8ec596SKim Phillips {
23780e479300SYuan Kang 	struct aead_edesc *edesc;
23798e8ec596SKim Phillips 	struct crypto_aead *aead = crypto_aead_reqtfm(req);
23808e8ec596SKim Phillips 	struct caam_ctx *ctx = crypto_aead_ctx(aead);
23818e8ec596SKim Phillips 	struct device *jrdev = ctx->jrdev;
23821acebad3SYuan Kang 	bool all_contig;
23838e8ec596SKim Phillips 	u32 *desc;
23841acebad3SYuan Kang 	int ret = 0;
23851acebad3SYuan Kang 
23868e8ec596SKim Phillips 	/* allocate extended descriptor */
2387f2147b88SHerbert Xu 	edesc = aead_edesc_alloc(req, GCM_DESC_JOB_IO_LEN, &all_contig, true);
23888e8ec596SKim Phillips 	if (IS_ERR(edesc))
23898e8ec596SKim Phillips 		return PTR_ERR(edesc);
23908e8ec596SKim Phillips 
23911acebad3SYuan Kang 	/* Create and submit job descriptor */
2392f2147b88SHerbert Xu 	init_gcm_job(req, edesc, all_contig, true);
23931acebad3SYuan Kang #ifdef DEBUG
2394514df281SAlex Porosanu 	print_hex_dump(KERN_ERR, "aead jobdesc@"__stringify(__LINE__)": ",
23951acebad3SYuan Kang 		       DUMP_PREFIX_ADDRESS, 16, 4, edesc->hw_desc,
23961acebad3SYuan Kang 		       desc_bytes(edesc->hw_desc), 1);
23971acebad3SYuan Kang #endif
23981acebad3SYuan Kang 
23998e8ec596SKim Phillips 	desc = edesc->hw_desc;
24001acebad3SYuan Kang 	ret = caam_jr_enqueue(jrdev, desc, aead_encrypt_done, req);
24011acebad3SYuan Kang 	if (!ret) {
24021acebad3SYuan Kang 		ret = -EINPROGRESS;
24031acebad3SYuan Kang 	} else {
24041acebad3SYuan Kang 		aead_unmap(jrdev, edesc, req);
24051acebad3SYuan Kang 		kfree(edesc);
24061acebad3SYuan Kang 	}
24078e8ec596SKim Phillips 
24081acebad3SYuan Kang 	return ret;
24098e8ec596SKim Phillips }
24108e8ec596SKim Phillips 
241146218750SHerbert Xu static int ipsec_gcm_encrypt(struct aead_request *req)
241246218750SHerbert Xu {
241346218750SHerbert Xu 	if (req->assoclen < 8)
241446218750SHerbert Xu 		return -EINVAL;
241546218750SHerbert Xu 
241646218750SHerbert Xu 	return gcm_encrypt(req);
241746218750SHerbert Xu }
241846218750SHerbert Xu 
2419479bcc7cSHerbert Xu static int aead_encrypt(struct aead_request *req)
24208e8ec596SKim Phillips {
24211acebad3SYuan Kang 	struct aead_edesc *edesc;
24220e479300SYuan Kang 	struct crypto_aead *aead = crypto_aead_reqtfm(req);
24230e479300SYuan Kang 	struct caam_ctx *ctx = crypto_aead_ctx(aead);
24240e479300SYuan Kang 	struct device *jrdev = ctx->jrdev;
24251acebad3SYuan Kang 	bool all_contig;
24260e479300SYuan Kang 	u32 *desc;
24271acebad3SYuan Kang 	int ret = 0;
24280e479300SYuan Kang 
24290e479300SYuan Kang 	/* allocate extended descriptor */
2430479bcc7cSHerbert Xu 	edesc = aead_edesc_alloc(req, AUTHENC_DESC_JOB_IO_LEN,
2431479bcc7cSHerbert Xu 				 &all_contig, true);
24320e479300SYuan Kang 	if (IS_ERR(edesc))
24330e479300SYuan Kang 		return PTR_ERR(edesc);
24340e479300SYuan Kang 
2435f2147b88SHerbert Xu 	/* Create and submit job descriptor */
2436479bcc7cSHerbert Xu 	init_authenc_job(req, edesc, all_contig, true);
24371acebad3SYuan Kang #ifdef DEBUG
2438f2147b88SHerbert Xu 	print_hex_dump(KERN_ERR, "aead jobdesc@"__stringify(__LINE__)": ",
2439f2147b88SHerbert Xu 		       DUMP_PREFIX_ADDRESS, 16, 4, edesc->hw_desc,
2440f2147b88SHerbert Xu 		       desc_bytes(edesc->hw_desc), 1);
24411acebad3SYuan Kang #endif
24421acebad3SYuan Kang 
2443f2147b88SHerbert Xu 	desc = edesc->hw_desc;
2444479bcc7cSHerbert Xu 	ret = caam_jr_enqueue(jrdev, desc, aead_encrypt_done, req);
2445f2147b88SHerbert Xu 	if (!ret) {
2446f2147b88SHerbert Xu 		ret = -EINPROGRESS;
2447f2147b88SHerbert Xu 	} else {
2448479bcc7cSHerbert Xu 		aead_unmap(jrdev, edesc, req);
2449f2147b88SHerbert Xu 		kfree(edesc);
2450f2147b88SHerbert Xu 	}
2451f2147b88SHerbert Xu 
2452f2147b88SHerbert Xu 	return ret;
2453f2147b88SHerbert Xu }
2454f2147b88SHerbert Xu 
2455f2147b88SHerbert Xu static int gcm_decrypt(struct aead_request *req)
2456f2147b88SHerbert Xu {
2457f2147b88SHerbert Xu 	struct aead_edesc *edesc;
2458f2147b88SHerbert Xu 	struct crypto_aead *aead = crypto_aead_reqtfm(req);
2459f2147b88SHerbert Xu 	struct caam_ctx *ctx = crypto_aead_ctx(aead);
2460f2147b88SHerbert Xu 	struct device *jrdev = ctx->jrdev;
2461f2147b88SHerbert Xu 	bool all_contig;
2462f2147b88SHerbert Xu 	u32 *desc;
2463f2147b88SHerbert Xu 	int ret = 0;
2464f2147b88SHerbert Xu 
2465f2147b88SHerbert Xu 	/* allocate extended descriptor */
2466f2147b88SHerbert Xu 	edesc = aead_edesc_alloc(req, GCM_DESC_JOB_IO_LEN, &all_contig, false);
2467f2147b88SHerbert Xu 	if (IS_ERR(edesc))
2468f2147b88SHerbert Xu 		return PTR_ERR(edesc);
2469f2147b88SHerbert Xu 
24701acebad3SYuan Kang 	/* Create and submit job descriptor*/
2471f2147b88SHerbert Xu 	init_gcm_job(req, edesc, all_contig, false);
24721acebad3SYuan Kang #ifdef DEBUG
2473514df281SAlex Porosanu 	print_hex_dump(KERN_ERR, "aead jobdesc@"__stringify(__LINE__)": ",
24741acebad3SYuan Kang 		       DUMP_PREFIX_ADDRESS, 16, 4, edesc->hw_desc,
24751acebad3SYuan Kang 		       desc_bytes(edesc->hw_desc), 1);
24761acebad3SYuan Kang #endif
24771acebad3SYuan Kang 
24780e479300SYuan Kang 	desc = edesc->hw_desc;
24791acebad3SYuan Kang 	ret = caam_jr_enqueue(jrdev, desc, aead_decrypt_done, req);
24801acebad3SYuan Kang 	if (!ret) {
24811acebad3SYuan Kang 		ret = -EINPROGRESS;
24821acebad3SYuan Kang 	} else {
24831acebad3SYuan Kang 		aead_unmap(jrdev, edesc, req);
24841acebad3SYuan Kang 		kfree(edesc);
24851acebad3SYuan Kang 	}
24860e479300SYuan Kang 
24871acebad3SYuan Kang 	return ret;
24881acebad3SYuan Kang }
24890e479300SYuan Kang 
249046218750SHerbert Xu static int ipsec_gcm_decrypt(struct aead_request *req)
249146218750SHerbert Xu {
249246218750SHerbert Xu 	if (req->assoclen < 8)
249346218750SHerbert Xu 		return -EINVAL;
249446218750SHerbert Xu 
249546218750SHerbert Xu 	return gcm_decrypt(req);
249646218750SHerbert Xu }
249746218750SHerbert Xu 
2498479bcc7cSHerbert Xu static int aead_decrypt(struct aead_request *req)
2499f2147b88SHerbert Xu {
2500f2147b88SHerbert Xu 	struct aead_edesc *edesc;
2501f2147b88SHerbert Xu 	struct crypto_aead *aead = crypto_aead_reqtfm(req);
2502f2147b88SHerbert Xu 	struct caam_ctx *ctx = crypto_aead_ctx(aead);
2503f2147b88SHerbert Xu 	struct device *jrdev = ctx->jrdev;
2504f2147b88SHerbert Xu 	bool all_contig;
2505f2147b88SHerbert Xu 	u32 *desc;
2506f2147b88SHerbert Xu 	int ret = 0;
2507f2147b88SHerbert Xu 
2508f2147b88SHerbert Xu 	/* allocate extended descriptor */
2509479bcc7cSHerbert Xu 	edesc = aead_edesc_alloc(req, AUTHENC_DESC_JOB_IO_LEN,
2510479bcc7cSHerbert Xu 				 &all_contig, false);
2511f2147b88SHerbert Xu 	if (IS_ERR(edesc))
2512f2147b88SHerbert Xu 		return PTR_ERR(edesc);
2513f2147b88SHerbert Xu 
2514f2147b88SHerbert Xu #ifdef DEBUG
2515f2147b88SHerbert Xu 	print_hex_dump(KERN_ERR, "dec src@"__stringify(__LINE__)": ",
2516f2147b88SHerbert Xu 		       DUMP_PREFIX_ADDRESS, 16, 4, sg_virt(req->src),
2517479bcc7cSHerbert Xu 		       req->assoclen + req->cryptlen, 1);
2518f2147b88SHerbert Xu #endif
2519f2147b88SHerbert Xu 
2520f2147b88SHerbert Xu 	/* Create and submit job descriptor*/
2521479bcc7cSHerbert Xu 	init_authenc_job(req, edesc, all_contig, false);
2522f2147b88SHerbert Xu #ifdef DEBUG
2523f2147b88SHerbert Xu 	print_hex_dump(KERN_ERR, "aead jobdesc@"__stringify(__LINE__)": ",
2524f2147b88SHerbert Xu 		       DUMP_PREFIX_ADDRESS, 16, 4, edesc->hw_desc,
2525f2147b88SHerbert Xu 		       desc_bytes(edesc->hw_desc), 1);
2526f2147b88SHerbert Xu #endif
2527f2147b88SHerbert Xu 
2528f2147b88SHerbert Xu 	desc = edesc->hw_desc;
2529479bcc7cSHerbert Xu 	ret = caam_jr_enqueue(jrdev, desc, aead_decrypt_done, req);
2530f2147b88SHerbert Xu 	if (!ret) {
2531f2147b88SHerbert Xu 		ret = -EINPROGRESS;
2532f2147b88SHerbert Xu 	} else {
2533479bcc7cSHerbert Xu 		aead_unmap(jrdev, edesc, req);
2534f2147b88SHerbert Xu 		kfree(edesc);
2535f2147b88SHerbert Xu 	}
2536f2147b88SHerbert Xu 
2537f2147b88SHerbert Xu 	return ret;
2538f2147b88SHerbert Xu }
2539f2147b88SHerbert Xu 
2540479bcc7cSHerbert Xu static int aead_givdecrypt(struct aead_request *req)
25411acebad3SYuan Kang {
25421acebad3SYuan Kang 	struct crypto_aead *aead = crypto_aead_reqtfm(req);
2543479bcc7cSHerbert Xu 	unsigned int ivsize = crypto_aead_ivsize(aead);
25440e479300SYuan Kang 
2545479bcc7cSHerbert Xu 	if (req->cryptlen < ivsize)
2546479bcc7cSHerbert Xu 		return -EINVAL;
25470e479300SYuan Kang 
2548479bcc7cSHerbert Xu 	req->cryptlen -= ivsize;
2549479bcc7cSHerbert Xu 	req->assoclen += ivsize;
25501acebad3SYuan Kang 
2551479bcc7cSHerbert Xu 	return aead_decrypt(req);
2552ae4a825fSHoria Geanta }
2553ae4a825fSHoria Geanta 
2554acdca31dSYuan Kang /*
2555acdca31dSYuan Kang  * allocate and map the ablkcipher extended descriptor for ablkcipher
2556acdca31dSYuan Kang  */
2557acdca31dSYuan Kang static struct ablkcipher_edesc *ablkcipher_edesc_alloc(struct ablkcipher_request
2558acdca31dSYuan Kang 						       *req, int desc_bytes,
2559acdca31dSYuan Kang 						       bool *iv_contig_out)
2560acdca31dSYuan Kang {
2561acdca31dSYuan Kang 	struct crypto_ablkcipher *ablkcipher = crypto_ablkcipher_reqtfm(req);
2562acdca31dSYuan Kang 	struct caam_ctx *ctx = crypto_ablkcipher_ctx(ablkcipher);
2563acdca31dSYuan Kang 	struct device *jrdev = ctx->jrdev;
2564acdca31dSYuan Kang 	gfp_t flags = (req->base.flags & (CRYPTO_TFM_REQ_MAY_BACKLOG |
2565acdca31dSYuan Kang 					  CRYPTO_TFM_REQ_MAY_SLEEP)) ?
2566acdca31dSYuan Kang 		       GFP_KERNEL : GFP_ATOMIC;
2567a299c837SYuan Kang 	int src_nents, dst_nents = 0, sec4_sg_bytes;
2568acdca31dSYuan Kang 	struct ablkcipher_edesc *edesc;
2569acdca31dSYuan Kang 	dma_addr_t iv_dma = 0;
2570acdca31dSYuan Kang 	bool iv_contig = false;
2571acdca31dSYuan Kang 	int sgc;
2572acdca31dSYuan Kang 	int ivsize = crypto_ablkcipher_ivsize(ablkcipher);
2573a299c837SYuan Kang 	int sec4_sg_index;
2574acdca31dSYuan Kang 
257513fb8fd7SLABBE Corentin 	src_nents = sg_count(req->src, req->nbytes);
2576acdca31dSYuan Kang 
2577643b39b0SYuan Kang 	if (req->dst != req->src)
257813fb8fd7SLABBE Corentin 		dst_nents = sg_count(req->dst, req->nbytes);
2579acdca31dSYuan Kang 
2580acdca31dSYuan Kang 	if (likely(req->src == req->dst)) {
258113fb8fd7SLABBE Corentin 		sgc = dma_map_sg(jrdev, req->src, src_nents ? : 1,
258213fb8fd7SLABBE Corentin 				 DMA_BIDIRECTIONAL);
2583acdca31dSYuan Kang 	} else {
258413fb8fd7SLABBE Corentin 		sgc = dma_map_sg(jrdev, req->src, src_nents ? : 1,
258513fb8fd7SLABBE Corentin 				 DMA_TO_DEVICE);
258613fb8fd7SLABBE Corentin 		sgc = dma_map_sg(jrdev, req->dst, dst_nents ? : 1,
258713fb8fd7SLABBE Corentin 				 DMA_FROM_DEVICE);
2588acdca31dSYuan Kang 	}
2589acdca31dSYuan Kang 
2590ce572085SHoria Geanta 	iv_dma = dma_map_single(jrdev, req->info, ivsize, DMA_TO_DEVICE);
2591ce572085SHoria Geanta 	if (dma_mapping_error(jrdev, iv_dma)) {
2592ce572085SHoria Geanta 		dev_err(jrdev, "unable to map IV\n");
2593ce572085SHoria Geanta 		return ERR_PTR(-ENOMEM);
2594ce572085SHoria Geanta 	}
2595ce572085SHoria Geanta 
2596acdca31dSYuan Kang 	/*
2597acdca31dSYuan Kang 	 * Check if iv can be contiguous with source and destination.
2598acdca31dSYuan Kang 	 * If so, include it. If not, create scatterlist.
2599acdca31dSYuan Kang 	 */
2600acdca31dSYuan Kang 	if (!src_nents && iv_dma + ivsize == sg_dma_address(req->src))
2601acdca31dSYuan Kang 		iv_contig = true;
2602acdca31dSYuan Kang 	else
2603acdca31dSYuan Kang 		src_nents = src_nents ? : 1;
2604a299c837SYuan Kang 	sec4_sg_bytes = ((iv_contig ? 0 : 1) + src_nents + dst_nents) *
2605a299c837SYuan Kang 			sizeof(struct sec4_sg_entry);
2606acdca31dSYuan Kang 
2607acdca31dSYuan Kang 	/* allocate space for base edesc and hw desc commands, link tables */
2608dde20ae9SVictoria Milhoan 	edesc = kzalloc(sizeof(*edesc) + desc_bytes + sec4_sg_bytes,
2609dde20ae9SVictoria Milhoan 			GFP_DMA | flags);
2610acdca31dSYuan Kang 	if (!edesc) {
2611acdca31dSYuan Kang 		dev_err(jrdev, "could not allocate extended descriptor\n");
2612acdca31dSYuan Kang 		return ERR_PTR(-ENOMEM);
2613acdca31dSYuan Kang 	}
2614acdca31dSYuan Kang 
2615acdca31dSYuan Kang 	edesc->src_nents = src_nents;
2616acdca31dSYuan Kang 	edesc->dst_nents = dst_nents;
2617a299c837SYuan Kang 	edesc->sec4_sg_bytes = sec4_sg_bytes;
2618a299c837SYuan Kang 	edesc->sec4_sg = (void *)edesc + sizeof(struct ablkcipher_edesc) +
2619acdca31dSYuan Kang 			 desc_bytes;
2620acdca31dSYuan Kang 
2621a299c837SYuan Kang 	sec4_sg_index = 0;
2622acdca31dSYuan Kang 	if (!iv_contig) {
2623a299c837SYuan Kang 		dma_to_sec4_sg_one(edesc->sec4_sg, iv_dma, ivsize, 0);
2624a299c837SYuan Kang 		sg_to_sec4_sg_last(req->src, src_nents,
2625a299c837SYuan Kang 				   edesc->sec4_sg + 1, 0);
2626a299c837SYuan Kang 		sec4_sg_index += 1 + src_nents;
2627acdca31dSYuan Kang 	}
2628acdca31dSYuan Kang 
2629643b39b0SYuan Kang 	if (dst_nents) {
2630a299c837SYuan Kang 		sg_to_sec4_sg_last(req->dst, dst_nents,
2631a299c837SYuan Kang 			edesc->sec4_sg + sec4_sg_index, 0);
2632acdca31dSYuan Kang 	}
2633acdca31dSYuan Kang 
2634a299c837SYuan Kang 	edesc->sec4_sg_dma = dma_map_single(jrdev, edesc->sec4_sg,
2635a299c837SYuan Kang 					    sec4_sg_bytes, DMA_TO_DEVICE);
2636ce572085SHoria Geanta 	if (dma_mapping_error(jrdev, edesc->sec4_sg_dma)) {
2637ce572085SHoria Geanta 		dev_err(jrdev, "unable to map S/G table\n");
2638ce572085SHoria Geanta 		return ERR_PTR(-ENOMEM);
2639ce572085SHoria Geanta 	}
2640ce572085SHoria Geanta 
2641acdca31dSYuan Kang 	edesc->iv_dma = iv_dma;
2642acdca31dSYuan Kang 
2643acdca31dSYuan Kang #ifdef DEBUG
2644514df281SAlex Porosanu 	print_hex_dump(KERN_ERR, "ablkcipher sec4_sg@"__stringify(__LINE__)": ",
2645a299c837SYuan Kang 		       DUMP_PREFIX_ADDRESS, 16, 4, edesc->sec4_sg,
2646a299c837SYuan Kang 		       sec4_sg_bytes, 1);
2647acdca31dSYuan Kang #endif
2648acdca31dSYuan Kang 
2649acdca31dSYuan Kang 	*iv_contig_out = iv_contig;
2650acdca31dSYuan Kang 	return edesc;
2651acdca31dSYuan Kang }
2652acdca31dSYuan Kang 
2653acdca31dSYuan Kang static int ablkcipher_encrypt(struct ablkcipher_request *req)
2654acdca31dSYuan Kang {
2655acdca31dSYuan Kang 	struct ablkcipher_edesc *edesc;
2656acdca31dSYuan Kang 	struct crypto_ablkcipher *ablkcipher = crypto_ablkcipher_reqtfm(req);
2657acdca31dSYuan Kang 	struct caam_ctx *ctx = crypto_ablkcipher_ctx(ablkcipher);
2658acdca31dSYuan Kang 	struct device *jrdev = ctx->jrdev;
2659acdca31dSYuan Kang 	bool iv_contig;
2660acdca31dSYuan Kang 	u32 *desc;
2661acdca31dSYuan Kang 	int ret = 0;
2662acdca31dSYuan Kang 
2663acdca31dSYuan Kang 	/* allocate extended descriptor */
2664acdca31dSYuan Kang 	edesc = ablkcipher_edesc_alloc(req, DESC_JOB_IO_LEN *
2665acdca31dSYuan Kang 				       CAAM_CMD_SZ, &iv_contig);
2666acdca31dSYuan Kang 	if (IS_ERR(edesc))
2667acdca31dSYuan Kang 		return PTR_ERR(edesc);
2668acdca31dSYuan Kang 
2669acdca31dSYuan Kang 	/* Create and submit job descriptor*/
2670acdca31dSYuan Kang 	init_ablkcipher_job(ctx->sh_desc_enc,
2671acdca31dSYuan Kang 		ctx->sh_desc_enc_dma, edesc, req, iv_contig);
2672acdca31dSYuan Kang #ifdef DEBUG
2673514df281SAlex Porosanu 	print_hex_dump(KERN_ERR, "ablkcipher jobdesc@"__stringify(__LINE__)": ",
2674acdca31dSYuan Kang 		       DUMP_PREFIX_ADDRESS, 16, 4, edesc->hw_desc,
2675acdca31dSYuan Kang 		       desc_bytes(edesc->hw_desc), 1);
2676acdca31dSYuan Kang #endif
2677acdca31dSYuan Kang 	desc = edesc->hw_desc;
2678acdca31dSYuan Kang 	ret = caam_jr_enqueue(jrdev, desc, ablkcipher_encrypt_done, req);
2679acdca31dSYuan Kang 
2680acdca31dSYuan Kang 	if (!ret) {
2681acdca31dSYuan Kang 		ret = -EINPROGRESS;
2682acdca31dSYuan Kang 	} else {
2683acdca31dSYuan Kang 		ablkcipher_unmap(jrdev, edesc, req);
2684acdca31dSYuan Kang 		kfree(edesc);
2685acdca31dSYuan Kang 	}
2686acdca31dSYuan Kang 
2687acdca31dSYuan Kang 	return ret;
2688acdca31dSYuan Kang }
2689acdca31dSYuan Kang 
2690acdca31dSYuan Kang static int ablkcipher_decrypt(struct ablkcipher_request *req)
2691acdca31dSYuan Kang {
2692acdca31dSYuan Kang 	struct ablkcipher_edesc *edesc;
2693acdca31dSYuan Kang 	struct crypto_ablkcipher *ablkcipher = crypto_ablkcipher_reqtfm(req);
2694acdca31dSYuan Kang 	struct caam_ctx *ctx = crypto_ablkcipher_ctx(ablkcipher);
2695acdca31dSYuan Kang 	struct device *jrdev = ctx->jrdev;
2696acdca31dSYuan Kang 	bool iv_contig;
2697acdca31dSYuan Kang 	u32 *desc;
2698acdca31dSYuan Kang 	int ret = 0;
2699acdca31dSYuan Kang 
2700acdca31dSYuan Kang 	/* allocate extended descriptor */
2701acdca31dSYuan Kang 	edesc = ablkcipher_edesc_alloc(req, DESC_JOB_IO_LEN *
2702acdca31dSYuan Kang 				       CAAM_CMD_SZ, &iv_contig);
2703acdca31dSYuan Kang 	if (IS_ERR(edesc))
2704acdca31dSYuan Kang 		return PTR_ERR(edesc);
2705acdca31dSYuan Kang 
2706acdca31dSYuan Kang 	/* Create and submit job descriptor*/
2707acdca31dSYuan Kang 	init_ablkcipher_job(ctx->sh_desc_dec,
2708acdca31dSYuan Kang 		ctx->sh_desc_dec_dma, edesc, req, iv_contig);
2709acdca31dSYuan Kang 	desc = edesc->hw_desc;
2710acdca31dSYuan Kang #ifdef DEBUG
2711514df281SAlex Porosanu 	print_hex_dump(KERN_ERR, "ablkcipher jobdesc@"__stringify(__LINE__)": ",
2712acdca31dSYuan Kang 		       DUMP_PREFIX_ADDRESS, 16, 4, edesc->hw_desc,
2713acdca31dSYuan Kang 		       desc_bytes(edesc->hw_desc), 1);
2714acdca31dSYuan Kang #endif
2715acdca31dSYuan Kang 
2716acdca31dSYuan Kang 	ret = caam_jr_enqueue(jrdev, desc, ablkcipher_decrypt_done, req);
2717acdca31dSYuan Kang 	if (!ret) {
2718acdca31dSYuan Kang 		ret = -EINPROGRESS;
2719acdca31dSYuan Kang 	} else {
2720acdca31dSYuan Kang 		ablkcipher_unmap(jrdev, edesc, req);
2721acdca31dSYuan Kang 		kfree(edesc);
2722acdca31dSYuan Kang 	}
2723acdca31dSYuan Kang 
2724acdca31dSYuan Kang 	return ret;
2725acdca31dSYuan Kang }
2726acdca31dSYuan Kang 
27277222d1a3SCatalin Vasile /*
27287222d1a3SCatalin Vasile  * allocate and map the ablkcipher extended descriptor
27297222d1a3SCatalin Vasile  * for ablkcipher givencrypt
27307222d1a3SCatalin Vasile  */
27317222d1a3SCatalin Vasile static struct ablkcipher_edesc *ablkcipher_giv_edesc_alloc(
27327222d1a3SCatalin Vasile 				struct skcipher_givcrypt_request *greq,
27337222d1a3SCatalin Vasile 				int desc_bytes,
27347222d1a3SCatalin Vasile 				bool *iv_contig_out)
27357222d1a3SCatalin Vasile {
27367222d1a3SCatalin Vasile 	struct ablkcipher_request *req = &greq->creq;
27377222d1a3SCatalin Vasile 	struct crypto_ablkcipher *ablkcipher = crypto_ablkcipher_reqtfm(req);
27387222d1a3SCatalin Vasile 	struct caam_ctx *ctx = crypto_ablkcipher_ctx(ablkcipher);
27397222d1a3SCatalin Vasile 	struct device *jrdev = ctx->jrdev;
27407222d1a3SCatalin Vasile 	gfp_t flags = (req->base.flags & (CRYPTO_TFM_REQ_MAY_BACKLOG |
27417222d1a3SCatalin Vasile 					  CRYPTO_TFM_REQ_MAY_SLEEP)) ?
27427222d1a3SCatalin Vasile 		       GFP_KERNEL : GFP_ATOMIC;
27437222d1a3SCatalin Vasile 	int src_nents, dst_nents = 0, sec4_sg_bytes;
27447222d1a3SCatalin Vasile 	struct ablkcipher_edesc *edesc;
27457222d1a3SCatalin Vasile 	dma_addr_t iv_dma = 0;
27467222d1a3SCatalin Vasile 	bool iv_contig = false;
27477222d1a3SCatalin Vasile 	int sgc;
27487222d1a3SCatalin Vasile 	int ivsize = crypto_ablkcipher_ivsize(ablkcipher);
27497222d1a3SCatalin Vasile 	int sec4_sg_index;
27507222d1a3SCatalin Vasile 
275113fb8fd7SLABBE Corentin 	src_nents = sg_count(req->src, req->nbytes);
27527222d1a3SCatalin Vasile 
27537222d1a3SCatalin Vasile 	if (unlikely(req->dst != req->src))
275413fb8fd7SLABBE Corentin 		dst_nents = sg_count(req->dst, req->nbytes);
27557222d1a3SCatalin Vasile 
27567222d1a3SCatalin Vasile 	if (likely(req->src == req->dst)) {
275713fb8fd7SLABBE Corentin 		sgc = dma_map_sg(jrdev, req->src, src_nents ? : 1,
275813fb8fd7SLABBE Corentin 				 DMA_BIDIRECTIONAL);
27597222d1a3SCatalin Vasile 	} else {
276013fb8fd7SLABBE Corentin 		sgc = dma_map_sg(jrdev, req->src, src_nents ? : 1,
276113fb8fd7SLABBE Corentin 				 DMA_TO_DEVICE);
276213fb8fd7SLABBE Corentin 		sgc = dma_map_sg(jrdev, req->dst, dst_nents ? : 1,
276313fb8fd7SLABBE Corentin 				 DMA_FROM_DEVICE);
27647222d1a3SCatalin Vasile 	}
27657222d1a3SCatalin Vasile 
27667222d1a3SCatalin Vasile 	/*
27677222d1a3SCatalin Vasile 	 * Check if iv can be contiguous with source and destination.
27687222d1a3SCatalin Vasile 	 * If so, include it. If not, create scatterlist.
27697222d1a3SCatalin Vasile 	 */
27707222d1a3SCatalin Vasile 	iv_dma = dma_map_single(jrdev, greq->giv, ivsize, DMA_TO_DEVICE);
27717222d1a3SCatalin Vasile 	if (dma_mapping_error(jrdev, iv_dma)) {
27727222d1a3SCatalin Vasile 		dev_err(jrdev, "unable to map IV\n");
27737222d1a3SCatalin Vasile 		return ERR_PTR(-ENOMEM);
27747222d1a3SCatalin Vasile 	}
27757222d1a3SCatalin Vasile 
27767222d1a3SCatalin Vasile 	if (!dst_nents && iv_dma + ivsize == sg_dma_address(req->dst))
27777222d1a3SCatalin Vasile 		iv_contig = true;
27787222d1a3SCatalin Vasile 	else
27797222d1a3SCatalin Vasile 		dst_nents = dst_nents ? : 1;
27807222d1a3SCatalin Vasile 	sec4_sg_bytes = ((iv_contig ? 0 : 1) + src_nents + dst_nents) *
27817222d1a3SCatalin Vasile 			sizeof(struct sec4_sg_entry);
27827222d1a3SCatalin Vasile 
27837222d1a3SCatalin Vasile 	/* allocate space for base edesc and hw desc commands, link tables */
2784dde20ae9SVictoria Milhoan 	edesc = kzalloc(sizeof(*edesc) + desc_bytes + sec4_sg_bytes,
2785dde20ae9SVictoria Milhoan 			GFP_DMA | flags);
27867222d1a3SCatalin Vasile 	if (!edesc) {
27877222d1a3SCatalin Vasile 		dev_err(jrdev, "could not allocate extended descriptor\n");
27887222d1a3SCatalin Vasile 		return ERR_PTR(-ENOMEM);
27897222d1a3SCatalin Vasile 	}
27907222d1a3SCatalin Vasile 
27917222d1a3SCatalin Vasile 	edesc->src_nents = src_nents;
27927222d1a3SCatalin Vasile 	edesc->dst_nents = dst_nents;
27937222d1a3SCatalin Vasile 	edesc->sec4_sg_bytes = sec4_sg_bytes;
27947222d1a3SCatalin Vasile 	edesc->sec4_sg = (void *)edesc + sizeof(struct ablkcipher_edesc) +
27957222d1a3SCatalin Vasile 			 desc_bytes;
27967222d1a3SCatalin Vasile 
27977222d1a3SCatalin Vasile 	sec4_sg_index = 0;
27987222d1a3SCatalin Vasile 	if (src_nents) {
27997222d1a3SCatalin Vasile 		sg_to_sec4_sg_last(req->src, src_nents, edesc->sec4_sg, 0);
28007222d1a3SCatalin Vasile 		sec4_sg_index += src_nents;
28017222d1a3SCatalin Vasile 	}
28027222d1a3SCatalin Vasile 
28037222d1a3SCatalin Vasile 	if (!iv_contig) {
28047222d1a3SCatalin Vasile 		dma_to_sec4_sg_one(edesc->sec4_sg + sec4_sg_index,
28057222d1a3SCatalin Vasile 				   iv_dma, ivsize, 0);
28067222d1a3SCatalin Vasile 		sec4_sg_index += 1;
28077222d1a3SCatalin Vasile 		sg_to_sec4_sg_last(req->dst, dst_nents,
28087222d1a3SCatalin Vasile 				   edesc->sec4_sg + sec4_sg_index, 0);
28097222d1a3SCatalin Vasile 	}
28107222d1a3SCatalin Vasile 
28117222d1a3SCatalin Vasile 	edesc->sec4_sg_dma = dma_map_single(jrdev, edesc->sec4_sg,
28127222d1a3SCatalin Vasile 					    sec4_sg_bytes, DMA_TO_DEVICE);
28137222d1a3SCatalin Vasile 	if (dma_mapping_error(jrdev, edesc->sec4_sg_dma)) {
28147222d1a3SCatalin Vasile 		dev_err(jrdev, "unable to map S/G table\n");
28157222d1a3SCatalin Vasile 		return ERR_PTR(-ENOMEM);
28167222d1a3SCatalin Vasile 	}
28177222d1a3SCatalin Vasile 	edesc->iv_dma = iv_dma;
28187222d1a3SCatalin Vasile 
28197222d1a3SCatalin Vasile #ifdef DEBUG
28207222d1a3SCatalin Vasile 	print_hex_dump(KERN_ERR,
28217222d1a3SCatalin Vasile 		       "ablkcipher sec4_sg@" __stringify(__LINE__) ": ",
28227222d1a3SCatalin Vasile 		       DUMP_PREFIX_ADDRESS, 16, 4, edesc->sec4_sg,
28237222d1a3SCatalin Vasile 		       sec4_sg_bytes, 1);
28247222d1a3SCatalin Vasile #endif
28257222d1a3SCatalin Vasile 
28267222d1a3SCatalin Vasile 	*iv_contig_out = iv_contig;
28277222d1a3SCatalin Vasile 	return edesc;
28287222d1a3SCatalin Vasile }
28297222d1a3SCatalin Vasile 
28307222d1a3SCatalin Vasile static int ablkcipher_givencrypt(struct skcipher_givcrypt_request *creq)
28317222d1a3SCatalin Vasile {
28327222d1a3SCatalin Vasile 	struct ablkcipher_request *req = &creq->creq;
28337222d1a3SCatalin Vasile 	struct ablkcipher_edesc *edesc;
28347222d1a3SCatalin Vasile 	struct crypto_ablkcipher *ablkcipher = crypto_ablkcipher_reqtfm(req);
28357222d1a3SCatalin Vasile 	struct caam_ctx *ctx = crypto_ablkcipher_ctx(ablkcipher);
28367222d1a3SCatalin Vasile 	struct device *jrdev = ctx->jrdev;
28377222d1a3SCatalin Vasile 	bool iv_contig;
28387222d1a3SCatalin Vasile 	u32 *desc;
28397222d1a3SCatalin Vasile 	int ret = 0;
28407222d1a3SCatalin Vasile 
28417222d1a3SCatalin Vasile 	/* allocate extended descriptor */
28427222d1a3SCatalin Vasile 	edesc = ablkcipher_giv_edesc_alloc(creq, DESC_JOB_IO_LEN *
28437222d1a3SCatalin Vasile 				       CAAM_CMD_SZ, &iv_contig);
28447222d1a3SCatalin Vasile 	if (IS_ERR(edesc))
28457222d1a3SCatalin Vasile 		return PTR_ERR(edesc);
28467222d1a3SCatalin Vasile 
28477222d1a3SCatalin Vasile 	/* Create and submit job descriptor*/
28487222d1a3SCatalin Vasile 	init_ablkcipher_giv_job(ctx->sh_desc_givenc, ctx->sh_desc_givenc_dma,
28497222d1a3SCatalin Vasile 				edesc, req, iv_contig);
28507222d1a3SCatalin Vasile #ifdef DEBUG
28517222d1a3SCatalin Vasile 	print_hex_dump(KERN_ERR,
28527222d1a3SCatalin Vasile 		       "ablkcipher jobdesc@" __stringify(__LINE__) ": ",
28537222d1a3SCatalin Vasile 		       DUMP_PREFIX_ADDRESS, 16, 4, edesc->hw_desc,
28547222d1a3SCatalin Vasile 		       desc_bytes(edesc->hw_desc), 1);
28557222d1a3SCatalin Vasile #endif
28567222d1a3SCatalin Vasile 	desc = edesc->hw_desc;
28577222d1a3SCatalin Vasile 	ret = caam_jr_enqueue(jrdev, desc, ablkcipher_encrypt_done, req);
28587222d1a3SCatalin Vasile 
28597222d1a3SCatalin Vasile 	if (!ret) {
28607222d1a3SCatalin Vasile 		ret = -EINPROGRESS;
28617222d1a3SCatalin Vasile 	} else {
28627222d1a3SCatalin Vasile 		ablkcipher_unmap(jrdev, edesc, req);
28637222d1a3SCatalin Vasile 		kfree(edesc);
28647222d1a3SCatalin Vasile 	}
28657222d1a3SCatalin Vasile 
28667222d1a3SCatalin Vasile 	return ret;
28677222d1a3SCatalin Vasile }
28687222d1a3SCatalin Vasile 
2869885e9e2fSYuan Kang #define template_aead		template_u.aead
2870acdca31dSYuan Kang #define template_ablkcipher	template_u.ablkcipher
28718e8ec596SKim Phillips struct caam_alg_template {
28728e8ec596SKim Phillips 	char name[CRYPTO_MAX_ALG_NAME];
28738e8ec596SKim Phillips 	char driver_name[CRYPTO_MAX_ALG_NAME];
28748e8ec596SKim Phillips 	unsigned int blocksize;
2875885e9e2fSYuan Kang 	u32 type;
2876885e9e2fSYuan Kang 	union {
2877885e9e2fSYuan Kang 		struct ablkcipher_alg ablkcipher;
2878885e9e2fSYuan Kang 	} template_u;
28798e8ec596SKim Phillips 	u32 class1_alg_type;
28808e8ec596SKim Phillips 	u32 class2_alg_type;
28818e8ec596SKim Phillips 	u32 alg_op;
28828e8ec596SKim Phillips };
28838e8ec596SKim Phillips 
28848e8ec596SKim Phillips static struct caam_alg_template driver_algs[] = {
2885acdca31dSYuan Kang 	/* ablkcipher descriptor */
2886acdca31dSYuan Kang 	{
2887acdca31dSYuan Kang 		.name = "cbc(aes)",
2888acdca31dSYuan Kang 		.driver_name = "cbc-aes-caam",
2889acdca31dSYuan Kang 		.blocksize = AES_BLOCK_SIZE,
28907222d1a3SCatalin Vasile 		.type = CRYPTO_ALG_TYPE_GIVCIPHER,
2891acdca31dSYuan Kang 		.template_ablkcipher = {
2892acdca31dSYuan Kang 			.setkey = ablkcipher_setkey,
2893acdca31dSYuan Kang 			.encrypt = ablkcipher_encrypt,
2894acdca31dSYuan Kang 			.decrypt = ablkcipher_decrypt,
28957222d1a3SCatalin Vasile 			.givencrypt = ablkcipher_givencrypt,
28967222d1a3SCatalin Vasile 			.geniv = "<built-in>",
2897acdca31dSYuan Kang 			.min_keysize = AES_MIN_KEY_SIZE,
2898acdca31dSYuan Kang 			.max_keysize = AES_MAX_KEY_SIZE,
2899acdca31dSYuan Kang 			.ivsize = AES_BLOCK_SIZE,
2900acdca31dSYuan Kang 			},
2901acdca31dSYuan Kang 		.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC,
2902acdca31dSYuan Kang 	},
2903acdca31dSYuan Kang 	{
2904acdca31dSYuan Kang 		.name = "cbc(des3_ede)",
2905acdca31dSYuan Kang 		.driver_name = "cbc-3des-caam",
2906acdca31dSYuan Kang 		.blocksize = DES3_EDE_BLOCK_SIZE,
2907ff2c3a3bSCatalin Vasile 		.type = CRYPTO_ALG_TYPE_GIVCIPHER,
2908acdca31dSYuan Kang 		.template_ablkcipher = {
2909acdca31dSYuan Kang 			.setkey = ablkcipher_setkey,
2910acdca31dSYuan Kang 			.encrypt = ablkcipher_encrypt,
2911acdca31dSYuan Kang 			.decrypt = ablkcipher_decrypt,
2912ff2c3a3bSCatalin Vasile 			.givencrypt = ablkcipher_givencrypt,
2913ff2c3a3bSCatalin Vasile 			.geniv = "<built-in>",
2914acdca31dSYuan Kang 			.min_keysize = DES3_EDE_KEY_SIZE,
2915acdca31dSYuan Kang 			.max_keysize = DES3_EDE_KEY_SIZE,
2916acdca31dSYuan Kang 			.ivsize = DES3_EDE_BLOCK_SIZE,
2917acdca31dSYuan Kang 			},
2918acdca31dSYuan Kang 		.class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC,
2919acdca31dSYuan Kang 	},
2920acdca31dSYuan Kang 	{
2921acdca31dSYuan Kang 		.name = "cbc(des)",
2922acdca31dSYuan Kang 		.driver_name = "cbc-des-caam",
2923acdca31dSYuan Kang 		.blocksize = DES_BLOCK_SIZE,
2924ff2c3a3bSCatalin Vasile 		.type = CRYPTO_ALG_TYPE_GIVCIPHER,
2925acdca31dSYuan Kang 		.template_ablkcipher = {
2926acdca31dSYuan Kang 			.setkey = ablkcipher_setkey,
2927acdca31dSYuan Kang 			.encrypt = ablkcipher_encrypt,
2928acdca31dSYuan Kang 			.decrypt = ablkcipher_decrypt,
2929ff2c3a3bSCatalin Vasile 			.givencrypt = ablkcipher_givencrypt,
2930ff2c3a3bSCatalin Vasile 			.geniv = "<built-in>",
2931acdca31dSYuan Kang 			.min_keysize = DES_KEY_SIZE,
2932acdca31dSYuan Kang 			.max_keysize = DES_KEY_SIZE,
2933acdca31dSYuan Kang 			.ivsize = DES_BLOCK_SIZE,
2934acdca31dSYuan Kang 			},
2935acdca31dSYuan Kang 		.class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC,
29362b22f6c5SCatalin Vasile 	},
29372b22f6c5SCatalin Vasile 	{
29382b22f6c5SCatalin Vasile 		.name = "ctr(aes)",
29392b22f6c5SCatalin Vasile 		.driver_name = "ctr-aes-caam",
29402b22f6c5SCatalin Vasile 		.blocksize = 1,
29412b22f6c5SCatalin Vasile 		.type = CRYPTO_ALG_TYPE_ABLKCIPHER,
29422b22f6c5SCatalin Vasile 		.template_ablkcipher = {
29432b22f6c5SCatalin Vasile 			.setkey = ablkcipher_setkey,
29442b22f6c5SCatalin Vasile 			.encrypt = ablkcipher_encrypt,
29452b22f6c5SCatalin Vasile 			.decrypt = ablkcipher_decrypt,
29462b22f6c5SCatalin Vasile 			.geniv = "chainiv",
29472b22f6c5SCatalin Vasile 			.min_keysize = AES_MIN_KEY_SIZE,
29482b22f6c5SCatalin Vasile 			.max_keysize = AES_MAX_KEY_SIZE,
29492b22f6c5SCatalin Vasile 			.ivsize = AES_BLOCK_SIZE,
29502b22f6c5SCatalin Vasile 			},
29512b22f6c5SCatalin Vasile 		.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CTR_MOD128,
2952a5f57cffSCatalin Vasile 	},
2953a5f57cffSCatalin Vasile 	{
2954a5f57cffSCatalin Vasile 		.name = "rfc3686(ctr(aes))",
2955a5f57cffSCatalin Vasile 		.driver_name = "rfc3686-ctr-aes-caam",
2956a5f57cffSCatalin Vasile 		.blocksize = 1,
29577222d1a3SCatalin Vasile 		.type = CRYPTO_ALG_TYPE_GIVCIPHER,
2958a5f57cffSCatalin Vasile 		.template_ablkcipher = {
2959a5f57cffSCatalin Vasile 			.setkey = ablkcipher_setkey,
2960a5f57cffSCatalin Vasile 			.encrypt = ablkcipher_encrypt,
2961a5f57cffSCatalin Vasile 			.decrypt = ablkcipher_decrypt,
29627222d1a3SCatalin Vasile 			.givencrypt = ablkcipher_givencrypt,
29637222d1a3SCatalin Vasile 			.geniv = "<built-in>",
2964a5f57cffSCatalin Vasile 			.min_keysize = AES_MIN_KEY_SIZE +
2965a5f57cffSCatalin Vasile 				       CTR_RFC3686_NONCE_SIZE,
2966a5f57cffSCatalin Vasile 			.max_keysize = AES_MAX_KEY_SIZE +
2967a5f57cffSCatalin Vasile 				       CTR_RFC3686_NONCE_SIZE,
2968a5f57cffSCatalin Vasile 			.ivsize = CTR_RFC3686_IV_SIZE,
2969a5f57cffSCatalin Vasile 			},
2970a5f57cffSCatalin Vasile 		.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CTR_MOD128,
2971c6415a60SCatalin Vasile 	},
2972c6415a60SCatalin Vasile 	{
2973c6415a60SCatalin Vasile 		.name = "xts(aes)",
2974c6415a60SCatalin Vasile 		.driver_name = "xts-aes-caam",
2975c6415a60SCatalin Vasile 		.blocksize = AES_BLOCK_SIZE,
2976c6415a60SCatalin Vasile 		.type = CRYPTO_ALG_TYPE_ABLKCIPHER,
2977c6415a60SCatalin Vasile 		.template_ablkcipher = {
2978c6415a60SCatalin Vasile 			.setkey = xts_ablkcipher_setkey,
2979c6415a60SCatalin Vasile 			.encrypt = ablkcipher_encrypt,
2980c6415a60SCatalin Vasile 			.decrypt = ablkcipher_decrypt,
2981c6415a60SCatalin Vasile 			.geniv = "eseqiv",
2982c6415a60SCatalin Vasile 			.min_keysize = 2 * AES_MIN_KEY_SIZE,
2983c6415a60SCatalin Vasile 			.max_keysize = 2 * AES_MAX_KEY_SIZE,
2984c6415a60SCatalin Vasile 			.ivsize = AES_BLOCK_SIZE,
2985c6415a60SCatalin Vasile 			},
2986c6415a60SCatalin Vasile 		.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_XTS,
2987c6415a60SCatalin Vasile 	},
29888e8ec596SKim Phillips };
29898e8ec596SKim Phillips 
2990f2147b88SHerbert Xu static struct caam_aead_alg driver_aeads[] = {
2991f2147b88SHerbert Xu 	{
2992f2147b88SHerbert Xu 		.aead = {
2993f2147b88SHerbert Xu 			.base = {
2994f2147b88SHerbert Xu 				.cra_name = "rfc4106(gcm(aes))",
2995f2147b88SHerbert Xu 				.cra_driver_name = "rfc4106-gcm-aes-caam",
2996f2147b88SHerbert Xu 				.cra_blocksize = 1,
2997f2147b88SHerbert Xu 			},
2998f2147b88SHerbert Xu 			.setkey = rfc4106_setkey,
2999f2147b88SHerbert Xu 			.setauthsize = rfc4106_setauthsize,
300046218750SHerbert Xu 			.encrypt = ipsec_gcm_encrypt,
300146218750SHerbert Xu 			.decrypt = ipsec_gcm_decrypt,
3002f2147b88SHerbert Xu 			.ivsize = 8,
3003f2147b88SHerbert Xu 			.maxauthsize = AES_BLOCK_SIZE,
3004f2147b88SHerbert Xu 		},
3005f2147b88SHerbert Xu 		.caam = {
3006f2147b88SHerbert Xu 			.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_GCM,
3007f2147b88SHerbert Xu 		},
3008f2147b88SHerbert Xu 	},
3009f2147b88SHerbert Xu 	{
3010f2147b88SHerbert Xu 		.aead = {
3011f2147b88SHerbert Xu 			.base = {
3012f2147b88SHerbert Xu 				.cra_name = "rfc4543(gcm(aes))",
3013f2147b88SHerbert Xu 				.cra_driver_name = "rfc4543-gcm-aes-caam",
3014f2147b88SHerbert Xu 				.cra_blocksize = 1,
3015f2147b88SHerbert Xu 			},
3016f2147b88SHerbert Xu 			.setkey = rfc4543_setkey,
3017f2147b88SHerbert Xu 			.setauthsize = rfc4543_setauthsize,
301846218750SHerbert Xu 			.encrypt = ipsec_gcm_encrypt,
301946218750SHerbert Xu 			.decrypt = ipsec_gcm_decrypt,
3020f2147b88SHerbert Xu 			.ivsize = 8,
3021f2147b88SHerbert Xu 			.maxauthsize = AES_BLOCK_SIZE,
3022f2147b88SHerbert Xu 		},
3023f2147b88SHerbert Xu 		.caam = {
3024f2147b88SHerbert Xu 			.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_GCM,
3025f2147b88SHerbert Xu 		},
3026f2147b88SHerbert Xu 	},
3027f2147b88SHerbert Xu 	/* Galois Counter Mode */
3028f2147b88SHerbert Xu 	{
3029f2147b88SHerbert Xu 		.aead = {
3030f2147b88SHerbert Xu 			.base = {
3031f2147b88SHerbert Xu 				.cra_name = "gcm(aes)",
3032f2147b88SHerbert Xu 				.cra_driver_name = "gcm-aes-caam",
3033f2147b88SHerbert Xu 				.cra_blocksize = 1,
3034f2147b88SHerbert Xu 			},
3035f2147b88SHerbert Xu 			.setkey = gcm_setkey,
3036f2147b88SHerbert Xu 			.setauthsize = gcm_setauthsize,
3037f2147b88SHerbert Xu 			.encrypt = gcm_encrypt,
3038f2147b88SHerbert Xu 			.decrypt = gcm_decrypt,
3039f2147b88SHerbert Xu 			.ivsize = 12,
3040f2147b88SHerbert Xu 			.maxauthsize = AES_BLOCK_SIZE,
3041f2147b88SHerbert Xu 		},
3042f2147b88SHerbert Xu 		.caam = {
3043f2147b88SHerbert Xu 			.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_GCM,
3044f2147b88SHerbert Xu 		},
3045f2147b88SHerbert Xu 	},
3046479bcc7cSHerbert Xu 	/* single-pass ipsec_esp descriptor */
3047479bcc7cSHerbert Xu 	{
3048479bcc7cSHerbert Xu 		.aead = {
3049479bcc7cSHerbert Xu 			.base = {
3050479bcc7cSHerbert Xu 				.cra_name = "authenc(hmac(md5),"
3051479bcc7cSHerbert Xu 					    "ecb(cipher_null))",
3052479bcc7cSHerbert Xu 				.cra_driver_name = "authenc-hmac-md5-"
3053479bcc7cSHerbert Xu 						   "ecb-cipher_null-caam",
3054479bcc7cSHerbert Xu 				.cra_blocksize = NULL_BLOCK_SIZE,
3055479bcc7cSHerbert Xu 			},
3056479bcc7cSHerbert Xu 			.setkey = aead_setkey,
3057479bcc7cSHerbert Xu 			.setauthsize = aead_setauthsize,
3058479bcc7cSHerbert Xu 			.encrypt = aead_encrypt,
3059479bcc7cSHerbert Xu 			.decrypt = aead_decrypt,
3060479bcc7cSHerbert Xu 			.ivsize = NULL_IV_SIZE,
3061479bcc7cSHerbert Xu 			.maxauthsize = MD5_DIGEST_SIZE,
3062479bcc7cSHerbert Xu 		},
3063479bcc7cSHerbert Xu 		.caam = {
3064479bcc7cSHerbert Xu 			.class2_alg_type = OP_ALG_ALGSEL_MD5 |
3065479bcc7cSHerbert Xu 					   OP_ALG_AAI_HMAC_PRECOMP,
3066479bcc7cSHerbert Xu 			.alg_op = OP_ALG_ALGSEL_MD5 | OP_ALG_AAI_HMAC,
3067479bcc7cSHerbert Xu 		},
3068479bcc7cSHerbert Xu 	},
3069479bcc7cSHerbert Xu 	{
3070479bcc7cSHerbert Xu 		.aead = {
3071479bcc7cSHerbert Xu 			.base = {
3072479bcc7cSHerbert Xu 				.cra_name = "authenc(hmac(sha1),"
3073479bcc7cSHerbert Xu 					    "ecb(cipher_null))",
3074479bcc7cSHerbert Xu 				.cra_driver_name = "authenc-hmac-sha1-"
3075479bcc7cSHerbert Xu 						   "ecb-cipher_null-caam",
3076479bcc7cSHerbert Xu 				.cra_blocksize = NULL_BLOCK_SIZE,
3077479bcc7cSHerbert Xu 			},
3078479bcc7cSHerbert Xu 			.setkey = aead_setkey,
3079479bcc7cSHerbert Xu 			.setauthsize = aead_setauthsize,
3080479bcc7cSHerbert Xu 			.encrypt = aead_encrypt,
3081479bcc7cSHerbert Xu 			.decrypt = aead_decrypt,
3082479bcc7cSHerbert Xu 			.ivsize = NULL_IV_SIZE,
3083479bcc7cSHerbert Xu 			.maxauthsize = SHA1_DIGEST_SIZE,
3084479bcc7cSHerbert Xu 		},
3085479bcc7cSHerbert Xu 		.caam = {
3086479bcc7cSHerbert Xu 			.class2_alg_type = OP_ALG_ALGSEL_SHA1 |
3087479bcc7cSHerbert Xu 					   OP_ALG_AAI_HMAC_PRECOMP,
3088479bcc7cSHerbert Xu 			.alg_op = OP_ALG_ALGSEL_SHA1 | OP_ALG_AAI_HMAC,
3089479bcc7cSHerbert Xu 		},
3090479bcc7cSHerbert Xu 	},
3091479bcc7cSHerbert Xu 	{
3092479bcc7cSHerbert Xu 		.aead = {
3093479bcc7cSHerbert Xu 			.base = {
3094479bcc7cSHerbert Xu 				.cra_name = "authenc(hmac(sha224),"
3095479bcc7cSHerbert Xu 					    "ecb(cipher_null))",
3096479bcc7cSHerbert Xu 				.cra_driver_name = "authenc-hmac-sha224-"
3097479bcc7cSHerbert Xu 						   "ecb-cipher_null-caam",
3098479bcc7cSHerbert Xu 				.cra_blocksize = NULL_BLOCK_SIZE,
3099479bcc7cSHerbert Xu 			},
3100479bcc7cSHerbert Xu 			.setkey = aead_setkey,
3101479bcc7cSHerbert Xu 			.setauthsize = aead_setauthsize,
3102479bcc7cSHerbert Xu 			.encrypt = aead_encrypt,
3103479bcc7cSHerbert Xu 			.decrypt = aead_decrypt,
3104479bcc7cSHerbert Xu 			.ivsize = NULL_IV_SIZE,
3105479bcc7cSHerbert Xu 			.maxauthsize = SHA224_DIGEST_SIZE,
3106479bcc7cSHerbert Xu 		},
3107479bcc7cSHerbert Xu 		.caam = {
3108479bcc7cSHerbert Xu 			.class2_alg_type = OP_ALG_ALGSEL_SHA224 |
3109479bcc7cSHerbert Xu 					   OP_ALG_AAI_HMAC_PRECOMP,
3110479bcc7cSHerbert Xu 			.alg_op = OP_ALG_ALGSEL_SHA224 | OP_ALG_AAI_HMAC,
3111479bcc7cSHerbert Xu 		},
3112479bcc7cSHerbert Xu 	},
3113479bcc7cSHerbert Xu 	{
3114479bcc7cSHerbert Xu 		.aead = {
3115479bcc7cSHerbert Xu 			.base = {
3116479bcc7cSHerbert Xu 				.cra_name = "authenc(hmac(sha256),"
3117479bcc7cSHerbert Xu 					    "ecb(cipher_null))",
3118479bcc7cSHerbert Xu 				.cra_driver_name = "authenc-hmac-sha256-"
3119479bcc7cSHerbert Xu 						   "ecb-cipher_null-caam",
3120479bcc7cSHerbert Xu 				.cra_blocksize = NULL_BLOCK_SIZE,
3121479bcc7cSHerbert Xu 			},
3122479bcc7cSHerbert Xu 			.setkey = aead_setkey,
3123479bcc7cSHerbert Xu 			.setauthsize = aead_setauthsize,
3124479bcc7cSHerbert Xu 			.encrypt = aead_encrypt,
3125479bcc7cSHerbert Xu 			.decrypt = aead_decrypt,
3126479bcc7cSHerbert Xu 			.ivsize = NULL_IV_SIZE,
3127479bcc7cSHerbert Xu 			.maxauthsize = SHA256_DIGEST_SIZE,
3128479bcc7cSHerbert Xu 		},
3129479bcc7cSHerbert Xu 		.caam = {
3130479bcc7cSHerbert Xu 			.class2_alg_type = OP_ALG_ALGSEL_SHA256 |
3131479bcc7cSHerbert Xu 					   OP_ALG_AAI_HMAC_PRECOMP,
3132479bcc7cSHerbert Xu 			.alg_op = OP_ALG_ALGSEL_SHA256 | OP_ALG_AAI_HMAC,
3133479bcc7cSHerbert Xu 		},
3134479bcc7cSHerbert Xu 	},
3135479bcc7cSHerbert Xu 	{
3136479bcc7cSHerbert Xu 		.aead = {
3137479bcc7cSHerbert Xu 			.base = {
3138479bcc7cSHerbert Xu 				.cra_name = "authenc(hmac(sha384),"
3139479bcc7cSHerbert Xu 					    "ecb(cipher_null))",
3140479bcc7cSHerbert Xu 				.cra_driver_name = "authenc-hmac-sha384-"
3141479bcc7cSHerbert Xu 						   "ecb-cipher_null-caam",
3142479bcc7cSHerbert Xu 				.cra_blocksize = NULL_BLOCK_SIZE,
3143479bcc7cSHerbert Xu 			},
3144479bcc7cSHerbert Xu 			.setkey = aead_setkey,
3145479bcc7cSHerbert Xu 			.setauthsize = aead_setauthsize,
3146479bcc7cSHerbert Xu 			.encrypt = aead_encrypt,
3147479bcc7cSHerbert Xu 			.decrypt = aead_decrypt,
3148479bcc7cSHerbert Xu 			.ivsize = NULL_IV_SIZE,
3149479bcc7cSHerbert Xu 			.maxauthsize = SHA384_DIGEST_SIZE,
3150479bcc7cSHerbert Xu 		},
3151479bcc7cSHerbert Xu 		.caam = {
3152479bcc7cSHerbert Xu 			.class2_alg_type = OP_ALG_ALGSEL_SHA384 |
3153479bcc7cSHerbert Xu 					   OP_ALG_AAI_HMAC_PRECOMP,
3154479bcc7cSHerbert Xu 			.alg_op = OP_ALG_ALGSEL_SHA384 | OP_ALG_AAI_HMAC,
3155479bcc7cSHerbert Xu 		},
3156479bcc7cSHerbert Xu 	},
3157479bcc7cSHerbert Xu 	{
3158479bcc7cSHerbert Xu 		.aead = {
3159479bcc7cSHerbert Xu 			.base = {
3160479bcc7cSHerbert Xu 				.cra_name = "authenc(hmac(sha512),"
3161479bcc7cSHerbert Xu 					    "ecb(cipher_null))",
3162479bcc7cSHerbert Xu 				.cra_driver_name = "authenc-hmac-sha512-"
3163479bcc7cSHerbert Xu 						   "ecb-cipher_null-caam",
3164479bcc7cSHerbert Xu 				.cra_blocksize = NULL_BLOCK_SIZE,
3165479bcc7cSHerbert Xu 			},
3166479bcc7cSHerbert Xu 			.setkey = aead_setkey,
3167479bcc7cSHerbert Xu 			.setauthsize = aead_setauthsize,
3168479bcc7cSHerbert Xu 			.encrypt = aead_encrypt,
3169479bcc7cSHerbert Xu 			.decrypt = aead_decrypt,
3170479bcc7cSHerbert Xu 			.ivsize = NULL_IV_SIZE,
3171479bcc7cSHerbert Xu 			.maxauthsize = SHA512_DIGEST_SIZE,
3172479bcc7cSHerbert Xu 		},
3173479bcc7cSHerbert Xu 		.caam = {
3174479bcc7cSHerbert Xu 			.class2_alg_type = OP_ALG_ALGSEL_SHA512 |
3175479bcc7cSHerbert Xu 					   OP_ALG_AAI_HMAC_PRECOMP,
3176479bcc7cSHerbert Xu 			.alg_op = OP_ALG_ALGSEL_SHA512 | OP_ALG_AAI_HMAC,
3177479bcc7cSHerbert Xu 		},
3178479bcc7cSHerbert Xu 	},
3179479bcc7cSHerbert Xu 	{
3180479bcc7cSHerbert Xu 		.aead = {
3181479bcc7cSHerbert Xu 			.base = {
3182479bcc7cSHerbert Xu 				.cra_name = "authenc(hmac(md5),cbc(aes))",
3183479bcc7cSHerbert Xu 				.cra_driver_name = "authenc-hmac-md5-"
3184479bcc7cSHerbert Xu 						   "cbc-aes-caam",
3185479bcc7cSHerbert Xu 				.cra_blocksize = AES_BLOCK_SIZE,
3186479bcc7cSHerbert Xu 			},
3187479bcc7cSHerbert Xu 			.setkey = aead_setkey,
3188479bcc7cSHerbert Xu 			.setauthsize = aead_setauthsize,
3189479bcc7cSHerbert Xu 			.encrypt = aead_encrypt,
3190479bcc7cSHerbert Xu 			.decrypt = aead_decrypt,
3191479bcc7cSHerbert Xu 			.ivsize = AES_BLOCK_SIZE,
3192479bcc7cSHerbert Xu 			.maxauthsize = MD5_DIGEST_SIZE,
3193479bcc7cSHerbert Xu 		},
3194479bcc7cSHerbert Xu 		.caam = {
3195479bcc7cSHerbert Xu 			.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC,
3196479bcc7cSHerbert Xu 			.class2_alg_type = OP_ALG_ALGSEL_MD5 |
3197479bcc7cSHerbert Xu 					   OP_ALG_AAI_HMAC_PRECOMP,
3198479bcc7cSHerbert Xu 			.alg_op = OP_ALG_ALGSEL_MD5 | OP_ALG_AAI_HMAC,
3199479bcc7cSHerbert Xu 		},
3200479bcc7cSHerbert Xu 	},
3201479bcc7cSHerbert Xu 	{
3202479bcc7cSHerbert Xu 		.aead = {
3203479bcc7cSHerbert Xu 			.base = {
3204479bcc7cSHerbert Xu 				.cra_name = "echainiv(authenc(hmac(md5),"
3205479bcc7cSHerbert Xu 					    "cbc(aes)))",
3206479bcc7cSHerbert Xu 				.cra_driver_name = "echainiv-authenc-hmac-md5-"
3207479bcc7cSHerbert Xu 						   "cbc-aes-caam",
3208479bcc7cSHerbert Xu 				.cra_blocksize = AES_BLOCK_SIZE,
3209479bcc7cSHerbert Xu 			},
3210479bcc7cSHerbert Xu 			.setkey = aead_setkey,
3211479bcc7cSHerbert Xu 			.setauthsize = aead_setauthsize,
3212479bcc7cSHerbert Xu 			.encrypt = aead_encrypt,
3213479bcc7cSHerbert Xu 			.decrypt = aead_givdecrypt,
3214479bcc7cSHerbert Xu 			.ivsize = AES_BLOCK_SIZE,
3215479bcc7cSHerbert Xu 			.maxauthsize = MD5_DIGEST_SIZE,
3216479bcc7cSHerbert Xu 		},
3217479bcc7cSHerbert Xu 		.caam = {
3218479bcc7cSHerbert Xu 			.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC,
3219479bcc7cSHerbert Xu 			.class2_alg_type = OP_ALG_ALGSEL_MD5 |
3220479bcc7cSHerbert Xu 					   OP_ALG_AAI_HMAC_PRECOMP,
3221479bcc7cSHerbert Xu 			.alg_op = OP_ALG_ALGSEL_MD5 | OP_ALG_AAI_HMAC,
3222479bcc7cSHerbert Xu 			.geniv = true,
3223479bcc7cSHerbert Xu 		},
3224479bcc7cSHerbert Xu 	},
3225479bcc7cSHerbert Xu 	{
3226479bcc7cSHerbert Xu 		.aead = {
3227479bcc7cSHerbert Xu 			.base = {
3228479bcc7cSHerbert Xu 				.cra_name = "authenc(hmac(sha1),cbc(aes))",
3229479bcc7cSHerbert Xu 				.cra_driver_name = "authenc-hmac-sha1-"
3230479bcc7cSHerbert Xu 						   "cbc-aes-caam",
3231479bcc7cSHerbert Xu 				.cra_blocksize = AES_BLOCK_SIZE,
3232479bcc7cSHerbert Xu 			},
3233479bcc7cSHerbert Xu 			.setkey = aead_setkey,
3234479bcc7cSHerbert Xu 			.setauthsize = aead_setauthsize,
3235479bcc7cSHerbert Xu 			.encrypt = aead_encrypt,
3236479bcc7cSHerbert Xu 			.decrypt = aead_decrypt,
3237479bcc7cSHerbert Xu 			.ivsize = AES_BLOCK_SIZE,
3238479bcc7cSHerbert Xu 			.maxauthsize = SHA1_DIGEST_SIZE,
3239479bcc7cSHerbert Xu 		},
3240479bcc7cSHerbert Xu 		.caam = {
3241479bcc7cSHerbert Xu 			.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC,
3242479bcc7cSHerbert Xu 			.class2_alg_type = OP_ALG_ALGSEL_SHA1 |
3243479bcc7cSHerbert Xu 					   OP_ALG_AAI_HMAC_PRECOMP,
3244479bcc7cSHerbert Xu 			.alg_op = OP_ALG_ALGSEL_SHA1 | OP_ALG_AAI_HMAC,
3245479bcc7cSHerbert Xu 		},
3246479bcc7cSHerbert Xu 	},
3247479bcc7cSHerbert Xu 	{
3248479bcc7cSHerbert Xu 		.aead = {
3249479bcc7cSHerbert Xu 			.base = {
3250479bcc7cSHerbert Xu 				.cra_name = "echainiv(authenc(hmac(sha1),"
3251479bcc7cSHerbert Xu 					    "cbc(aes)))",
3252479bcc7cSHerbert Xu 				.cra_driver_name = "echainiv-authenc-"
3253479bcc7cSHerbert Xu 						   "hmac-sha1-cbc-aes-caam",
3254479bcc7cSHerbert Xu 				.cra_blocksize = AES_BLOCK_SIZE,
3255479bcc7cSHerbert Xu 			},
3256479bcc7cSHerbert Xu 			.setkey = aead_setkey,
3257479bcc7cSHerbert Xu 			.setauthsize = aead_setauthsize,
3258479bcc7cSHerbert Xu 			.encrypt = aead_encrypt,
3259479bcc7cSHerbert Xu 			.decrypt = aead_givdecrypt,
3260479bcc7cSHerbert Xu 			.ivsize = AES_BLOCK_SIZE,
3261479bcc7cSHerbert Xu 			.maxauthsize = SHA1_DIGEST_SIZE,
3262479bcc7cSHerbert Xu 		},
3263479bcc7cSHerbert Xu 		.caam = {
3264479bcc7cSHerbert Xu 			.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC,
3265479bcc7cSHerbert Xu 			.class2_alg_type = OP_ALG_ALGSEL_SHA1 |
3266479bcc7cSHerbert Xu 					   OP_ALG_AAI_HMAC_PRECOMP,
3267479bcc7cSHerbert Xu 			.alg_op = OP_ALG_ALGSEL_SHA1 | OP_ALG_AAI_HMAC,
3268479bcc7cSHerbert Xu 			.geniv = true,
3269479bcc7cSHerbert Xu 		},
3270479bcc7cSHerbert Xu 	},
3271479bcc7cSHerbert Xu 	{
3272479bcc7cSHerbert Xu 		.aead = {
3273479bcc7cSHerbert Xu 			.base = {
3274479bcc7cSHerbert Xu 				.cra_name = "authenc(hmac(sha224),cbc(aes))",
3275479bcc7cSHerbert Xu 				.cra_driver_name = "authenc-hmac-sha224-"
3276479bcc7cSHerbert Xu 						   "cbc-aes-caam",
3277479bcc7cSHerbert Xu 				.cra_blocksize = AES_BLOCK_SIZE,
3278479bcc7cSHerbert Xu 			},
3279479bcc7cSHerbert Xu 			.setkey = aead_setkey,
3280479bcc7cSHerbert Xu 			.setauthsize = aead_setauthsize,
3281479bcc7cSHerbert Xu 			.encrypt = aead_encrypt,
3282479bcc7cSHerbert Xu 			.decrypt = aead_decrypt,
3283479bcc7cSHerbert Xu 			.ivsize = AES_BLOCK_SIZE,
3284479bcc7cSHerbert Xu 			.maxauthsize = SHA224_DIGEST_SIZE,
3285479bcc7cSHerbert Xu 		},
3286479bcc7cSHerbert Xu 		.caam = {
3287479bcc7cSHerbert Xu 			.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC,
3288479bcc7cSHerbert Xu 			.class2_alg_type = OP_ALG_ALGSEL_SHA224 |
3289479bcc7cSHerbert Xu 					   OP_ALG_AAI_HMAC_PRECOMP,
3290479bcc7cSHerbert Xu 			.alg_op = OP_ALG_ALGSEL_SHA224 | OP_ALG_AAI_HMAC,
3291479bcc7cSHerbert Xu 		},
3292479bcc7cSHerbert Xu 	},
3293479bcc7cSHerbert Xu 	{
3294479bcc7cSHerbert Xu 		.aead = {
3295479bcc7cSHerbert Xu 			.base = {
3296479bcc7cSHerbert Xu 				.cra_name = "echainiv(authenc(hmac(sha224),"
3297479bcc7cSHerbert Xu 					    "cbc(aes)))",
3298479bcc7cSHerbert Xu 				.cra_driver_name = "echainiv-authenc-"
3299479bcc7cSHerbert Xu 						   "hmac-sha224-cbc-aes-caam",
3300479bcc7cSHerbert Xu 				.cra_blocksize = AES_BLOCK_SIZE,
3301479bcc7cSHerbert Xu 			},
3302479bcc7cSHerbert Xu 			.setkey = aead_setkey,
3303479bcc7cSHerbert Xu 			.setauthsize = aead_setauthsize,
3304479bcc7cSHerbert Xu 			.encrypt = aead_encrypt,
3305479bcc7cSHerbert Xu 			.decrypt = aead_givdecrypt,
3306479bcc7cSHerbert Xu 			.ivsize = AES_BLOCK_SIZE,
3307479bcc7cSHerbert Xu 			.maxauthsize = SHA224_DIGEST_SIZE,
3308479bcc7cSHerbert Xu 		},
3309479bcc7cSHerbert Xu 		.caam = {
3310479bcc7cSHerbert Xu 			.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC,
3311479bcc7cSHerbert Xu 			.class2_alg_type = OP_ALG_ALGSEL_SHA224 |
3312479bcc7cSHerbert Xu 					   OP_ALG_AAI_HMAC_PRECOMP,
3313479bcc7cSHerbert Xu 			.alg_op = OP_ALG_ALGSEL_SHA224 | OP_ALG_AAI_HMAC,
3314479bcc7cSHerbert Xu 			.geniv = true,
3315479bcc7cSHerbert Xu 		},
3316479bcc7cSHerbert Xu 	},
3317479bcc7cSHerbert Xu 	{
3318479bcc7cSHerbert Xu 		.aead = {
3319479bcc7cSHerbert Xu 			.base = {
3320479bcc7cSHerbert Xu 				.cra_name = "authenc(hmac(sha256),cbc(aes))",
3321479bcc7cSHerbert Xu 				.cra_driver_name = "authenc-hmac-sha256-"
3322479bcc7cSHerbert Xu 						   "cbc-aes-caam",
3323479bcc7cSHerbert Xu 				.cra_blocksize = AES_BLOCK_SIZE,
3324479bcc7cSHerbert Xu 			},
3325479bcc7cSHerbert Xu 			.setkey = aead_setkey,
3326479bcc7cSHerbert Xu 			.setauthsize = aead_setauthsize,
3327479bcc7cSHerbert Xu 			.encrypt = aead_encrypt,
3328479bcc7cSHerbert Xu 			.decrypt = aead_decrypt,
3329479bcc7cSHerbert Xu 			.ivsize = AES_BLOCK_SIZE,
3330479bcc7cSHerbert Xu 			.maxauthsize = SHA256_DIGEST_SIZE,
3331479bcc7cSHerbert Xu 		},
3332479bcc7cSHerbert Xu 		.caam = {
3333479bcc7cSHerbert Xu 			.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC,
3334479bcc7cSHerbert Xu 			.class2_alg_type = OP_ALG_ALGSEL_SHA256 |
3335479bcc7cSHerbert Xu 					   OP_ALG_AAI_HMAC_PRECOMP,
3336479bcc7cSHerbert Xu 			.alg_op = OP_ALG_ALGSEL_SHA256 | OP_ALG_AAI_HMAC,
3337479bcc7cSHerbert Xu 		},
3338479bcc7cSHerbert Xu 	},
3339479bcc7cSHerbert Xu 	{
3340479bcc7cSHerbert Xu 		.aead = {
3341479bcc7cSHerbert Xu 			.base = {
3342479bcc7cSHerbert Xu 				.cra_name = "echainiv(authenc(hmac(sha256),"
3343479bcc7cSHerbert Xu 					    "cbc(aes)))",
3344479bcc7cSHerbert Xu 				.cra_driver_name = "echainiv-authenc-"
3345479bcc7cSHerbert Xu 						   "hmac-sha256-cbc-aes-caam",
3346479bcc7cSHerbert Xu 				.cra_blocksize = AES_BLOCK_SIZE,
3347479bcc7cSHerbert Xu 			},
3348479bcc7cSHerbert Xu 			.setkey = aead_setkey,
3349479bcc7cSHerbert Xu 			.setauthsize = aead_setauthsize,
3350479bcc7cSHerbert Xu 			.encrypt = aead_encrypt,
3351479bcc7cSHerbert Xu 			.decrypt = aead_givdecrypt,
3352479bcc7cSHerbert Xu 			.ivsize = AES_BLOCK_SIZE,
3353479bcc7cSHerbert Xu 			.maxauthsize = SHA256_DIGEST_SIZE,
3354479bcc7cSHerbert Xu 		},
3355479bcc7cSHerbert Xu 		.caam = {
3356479bcc7cSHerbert Xu 			.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC,
3357479bcc7cSHerbert Xu 			.class2_alg_type = OP_ALG_ALGSEL_SHA256 |
3358479bcc7cSHerbert Xu 					   OP_ALG_AAI_HMAC_PRECOMP,
3359479bcc7cSHerbert Xu 			.alg_op = OP_ALG_ALGSEL_SHA256 | OP_ALG_AAI_HMAC,
3360479bcc7cSHerbert Xu 			.geniv = true,
3361479bcc7cSHerbert Xu 		},
3362479bcc7cSHerbert Xu 	},
3363479bcc7cSHerbert Xu 	{
3364479bcc7cSHerbert Xu 		.aead = {
3365479bcc7cSHerbert Xu 			.base = {
3366479bcc7cSHerbert Xu 				.cra_name = "authenc(hmac(sha384),cbc(aes))",
3367479bcc7cSHerbert Xu 				.cra_driver_name = "authenc-hmac-sha384-"
3368479bcc7cSHerbert Xu 						   "cbc-aes-caam",
3369479bcc7cSHerbert Xu 				.cra_blocksize = AES_BLOCK_SIZE,
3370479bcc7cSHerbert Xu 			},
3371479bcc7cSHerbert Xu 			.setkey = aead_setkey,
3372479bcc7cSHerbert Xu 			.setauthsize = aead_setauthsize,
3373479bcc7cSHerbert Xu 			.encrypt = aead_encrypt,
3374479bcc7cSHerbert Xu 			.decrypt = aead_decrypt,
3375479bcc7cSHerbert Xu 			.ivsize = AES_BLOCK_SIZE,
3376479bcc7cSHerbert Xu 			.maxauthsize = SHA384_DIGEST_SIZE,
3377479bcc7cSHerbert Xu 		},
3378479bcc7cSHerbert Xu 		.caam = {
3379479bcc7cSHerbert Xu 			.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC,
3380479bcc7cSHerbert Xu 			.class2_alg_type = OP_ALG_ALGSEL_SHA384 |
3381479bcc7cSHerbert Xu 					   OP_ALG_AAI_HMAC_PRECOMP,
3382479bcc7cSHerbert Xu 			.alg_op = OP_ALG_ALGSEL_SHA384 | OP_ALG_AAI_HMAC,
3383479bcc7cSHerbert Xu 		},
3384479bcc7cSHerbert Xu 	},
3385479bcc7cSHerbert Xu 	{
3386479bcc7cSHerbert Xu 		.aead = {
3387479bcc7cSHerbert Xu 			.base = {
3388479bcc7cSHerbert Xu 				.cra_name = "echainiv(authenc(hmac(sha384),"
3389479bcc7cSHerbert Xu 					    "cbc(aes)))",
3390479bcc7cSHerbert Xu 				.cra_driver_name = "echainiv-authenc-"
3391479bcc7cSHerbert Xu 						   "hmac-sha384-cbc-aes-caam",
3392479bcc7cSHerbert Xu 				.cra_blocksize = AES_BLOCK_SIZE,
3393479bcc7cSHerbert Xu 			},
3394479bcc7cSHerbert Xu 			.setkey = aead_setkey,
3395479bcc7cSHerbert Xu 			.setauthsize = aead_setauthsize,
3396479bcc7cSHerbert Xu 			.encrypt = aead_encrypt,
3397479bcc7cSHerbert Xu 			.decrypt = aead_givdecrypt,
3398479bcc7cSHerbert Xu 			.ivsize = AES_BLOCK_SIZE,
3399479bcc7cSHerbert Xu 			.maxauthsize = SHA384_DIGEST_SIZE,
3400479bcc7cSHerbert Xu 		},
3401479bcc7cSHerbert Xu 		.caam = {
3402479bcc7cSHerbert Xu 			.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC,
3403479bcc7cSHerbert Xu 			.class2_alg_type = OP_ALG_ALGSEL_SHA384 |
3404479bcc7cSHerbert Xu 					   OP_ALG_AAI_HMAC_PRECOMP,
3405479bcc7cSHerbert Xu 			.alg_op = OP_ALG_ALGSEL_SHA384 | OP_ALG_AAI_HMAC,
3406479bcc7cSHerbert Xu 			.geniv = true,
3407479bcc7cSHerbert Xu 		},
3408479bcc7cSHerbert Xu 	},
3409479bcc7cSHerbert Xu 	{
3410479bcc7cSHerbert Xu 		.aead = {
3411479bcc7cSHerbert Xu 			.base = {
3412479bcc7cSHerbert Xu 				.cra_name = "authenc(hmac(sha512),cbc(aes))",
3413479bcc7cSHerbert Xu 				.cra_driver_name = "authenc-hmac-sha512-"
3414479bcc7cSHerbert Xu 						   "cbc-aes-caam",
3415479bcc7cSHerbert Xu 				.cra_blocksize = AES_BLOCK_SIZE,
3416479bcc7cSHerbert Xu 			},
3417479bcc7cSHerbert Xu 			.setkey = aead_setkey,
3418479bcc7cSHerbert Xu 			.setauthsize = aead_setauthsize,
3419479bcc7cSHerbert Xu 			.encrypt = aead_encrypt,
3420479bcc7cSHerbert Xu 			.decrypt = aead_decrypt,
3421479bcc7cSHerbert Xu 			.ivsize = AES_BLOCK_SIZE,
3422479bcc7cSHerbert Xu 			.maxauthsize = SHA512_DIGEST_SIZE,
3423479bcc7cSHerbert Xu 		},
3424479bcc7cSHerbert Xu 		.caam = {
3425479bcc7cSHerbert Xu 			.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC,
3426479bcc7cSHerbert Xu 			.class2_alg_type = OP_ALG_ALGSEL_SHA512 |
3427479bcc7cSHerbert Xu 					   OP_ALG_AAI_HMAC_PRECOMP,
3428479bcc7cSHerbert Xu 			.alg_op = OP_ALG_ALGSEL_SHA512 | OP_ALG_AAI_HMAC,
3429479bcc7cSHerbert Xu 		},
3430479bcc7cSHerbert Xu 	},
3431479bcc7cSHerbert Xu 	{
3432479bcc7cSHerbert Xu 		.aead = {
3433479bcc7cSHerbert Xu 			.base = {
3434479bcc7cSHerbert Xu 				.cra_name = "echainiv(authenc(hmac(sha512),"
3435479bcc7cSHerbert Xu 					    "cbc(aes)))",
3436479bcc7cSHerbert Xu 				.cra_driver_name = "echainiv-authenc-"
3437479bcc7cSHerbert Xu 						   "hmac-sha512-cbc-aes-caam",
3438479bcc7cSHerbert Xu 				.cra_blocksize = AES_BLOCK_SIZE,
3439479bcc7cSHerbert Xu 			},
3440479bcc7cSHerbert Xu 			.setkey = aead_setkey,
3441479bcc7cSHerbert Xu 			.setauthsize = aead_setauthsize,
3442479bcc7cSHerbert Xu 			.encrypt = aead_encrypt,
3443479bcc7cSHerbert Xu 			.decrypt = aead_givdecrypt,
3444479bcc7cSHerbert Xu 			.ivsize = AES_BLOCK_SIZE,
3445479bcc7cSHerbert Xu 			.maxauthsize = SHA512_DIGEST_SIZE,
3446479bcc7cSHerbert Xu 		},
3447479bcc7cSHerbert Xu 		.caam = {
3448479bcc7cSHerbert Xu 			.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC,
3449479bcc7cSHerbert Xu 			.class2_alg_type = OP_ALG_ALGSEL_SHA512 |
3450479bcc7cSHerbert Xu 					   OP_ALG_AAI_HMAC_PRECOMP,
3451479bcc7cSHerbert Xu 			.alg_op = OP_ALG_ALGSEL_SHA512 | OP_ALG_AAI_HMAC,
3452479bcc7cSHerbert Xu 			.geniv = true,
3453479bcc7cSHerbert Xu 		},
3454479bcc7cSHerbert Xu 	},
3455479bcc7cSHerbert Xu 	{
3456479bcc7cSHerbert Xu 		.aead = {
3457479bcc7cSHerbert Xu 			.base = {
3458479bcc7cSHerbert Xu 				.cra_name = "authenc(hmac(md5),cbc(des3_ede))",
3459479bcc7cSHerbert Xu 				.cra_driver_name = "authenc-hmac-md5-"
3460479bcc7cSHerbert Xu 						   "cbc-des3_ede-caam",
3461479bcc7cSHerbert Xu 				.cra_blocksize = DES3_EDE_BLOCK_SIZE,
3462479bcc7cSHerbert Xu 			},
3463479bcc7cSHerbert Xu 			.setkey = aead_setkey,
3464479bcc7cSHerbert Xu 			.setauthsize = aead_setauthsize,
3465479bcc7cSHerbert Xu 			.encrypt = aead_encrypt,
3466479bcc7cSHerbert Xu 			.decrypt = aead_decrypt,
3467479bcc7cSHerbert Xu 			.ivsize = DES3_EDE_BLOCK_SIZE,
3468479bcc7cSHerbert Xu 			.maxauthsize = MD5_DIGEST_SIZE,
3469479bcc7cSHerbert Xu 		},
3470479bcc7cSHerbert Xu 		.caam = {
3471479bcc7cSHerbert Xu 			.class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC,
3472479bcc7cSHerbert Xu 			.class2_alg_type = OP_ALG_ALGSEL_MD5 |
3473479bcc7cSHerbert Xu 					   OP_ALG_AAI_HMAC_PRECOMP,
3474479bcc7cSHerbert Xu 			.alg_op = OP_ALG_ALGSEL_MD5 | OP_ALG_AAI_HMAC,
3475479bcc7cSHerbert Xu 		}
3476479bcc7cSHerbert Xu 	},
3477479bcc7cSHerbert Xu 	{
3478479bcc7cSHerbert Xu 		.aead = {
3479479bcc7cSHerbert Xu 			.base = {
3480479bcc7cSHerbert Xu 				.cra_name = "echainiv(authenc(hmac(md5),"
3481479bcc7cSHerbert Xu 					    "cbc(des3_ede)))",
3482479bcc7cSHerbert Xu 				.cra_driver_name = "echainiv-authenc-hmac-md5-"
3483479bcc7cSHerbert Xu 						   "cbc-des3_ede-caam",
3484479bcc7cSHerbert Xu 				.cra_blocksize = DES3_EDE_BLOCK_SIZE,
3485479bcc7cSHerbert Xu 			},
3486479bcc7cSHerbert Xu 			.setkey = aead_setkey,
3487479bcc7cSHerbert Xu 			.setauthsize = aead_setauthsize,
3488479bcc7cSHerbert Xu 			.encrypt = aead_encrypt,
3489479bcc7cSHerbert Xu 			.decrypt = aead_givdecrypt,
3490479bcc7cSHerbert Xu 			.ivsize = DES3_EDE_BLOCK_SIZE,
3491479bcc7cSHerbert Xu 			.maxauthsize = MD5_DIGEST_SIZE,
3492479bcc7cSHerbert Xu 		},
3493479bcc7cSHerbert Xu 		.caam = {
3494479bcc7cSHerbert Xu 			.class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC,
3495479bcc7cSHerbert Xu 			.class2_alg_type = OP_ALG_ALGSEL_MD5 |
3496479bcc7cSHerbert Xu 					   OP_ALG_AAI_HMAC_PRECOMP,
3497479bcc7cSHerbert Xu 			.alg_op = OP_ALG_ALGSEL_MD5 | OP_ALG_AAI_HMAC,
3498479bcc7cSHerbert Xu 			.geniv = true,
3499479bcc7cSHerbert Xu 		}
3500479bcc7cSHerbert Xu 	},
3501479bcc7cSHerbert Xu 	{
3502479bcc7cSHerbert Xu 		.aead = {
3503479bcc7cSHerbert Xu 			.base = {
3504479bcc7cSHerbert Xu 				.cra_name = "authenc(hmac(sha1),"
3505479bcc7cSHerbert Xu 					    "cbc(des3_ede))",
3506479bcc7cSHerbert Xu 				.cra_driver_name = "authenc-hmac-sha1-"
3507479bcc7cSHerbert Xu 						   "cbc-des3_ede-caam",
3508479bcc7cSHerbert Xu 				.cra_blocksize = DES3_EDE_BLOCK_SIZE,
3509479bcc7cSHerbert Xu 			},
3510479bcc7cSHerbert Xu 			.setkey = aead_setkey,
3511479bcc7cSHerbert Xu 			.setauthsize = aead_setauthsize,
3512479bcc7cSHerbert Xu 			.encrypt = aead_encrypt,
3513479bcc7cSHerbert Xu 			.decrypt = aead_decrypt,
3514479bcc7cSHerbert Xu 			.ivsize = DES3_EDE_BLOCK_SIZE,
3515479bcc7cSHerbert Xu 			.maxauthsize = SHA1_DIGEST_SIZE,
3516479bcc7cSHerbert Xu 		},
3517479bcc7cSHerbert Xu 		.caam = {
3518479bcc7cSHerbert Xu 			.class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC,
3519479bcc7cSHerbert Xu 			.class2_alg_type = OP_ALG_ALGSEL_SHA1 |
3520479bcc7cSHerbert Xu 					   OP_ALG_AAI_HMAC_PRECOMP,
3521479bcc7cSHerbert Xu 			.alg_op = OP_ALG_ALGSEL_SHA1 | OP_ALG_AAI_HMAC,
3522479bcc7cSHerbert Xu 		},
3523479bcc7cSHerbert Xu 	},
3524479bcc7cSHerbert Xu 	{
3525479bcc7cSHerbert Xu 		.aead = {
3526479bcc7cSHerbert Xu 			.base = {
3527479bcc7cSHerbert Xu 				.cra_name = "echainiv(authenc(hmac(sha1),"
3528479bcc7cSHerbert Xu 					    "cbc(des3_ede)))",
3529479bcc7cSHerbert Xu 				.cra_driver_name = "echainiv-authenc-"
3530479bcc7cSHerbert Xu 						   "hmac-sha1-"
3531479bcc7cSHerbert Xu 						   "cbc-des3_ede-caam",
3532479bcc7cSHerbert Xu 				.cra_blocksize = DES3_EDE_BLOCK_SIZE,
3533479bcc7cSHerbert Xu 			},
3534479bcc7cSHerbert Xu 			.setkey = aead_setkey,
3535479bcc7cSHerbert Xu 			.setauthsize = aead_setauthsize,
3536479bcc7cSHerbert Xu 			.encrypt = aead_encrypt,
3537479bcc7cSHerbert Xu 			.decrypt = aead_givdecrypt,
3538479bcc7cSHerbert Xu 			.ivsize = DES3_EDE_BLOCK_SIZE,
3539479bcc7cSHerbert Xu 			.maxauthsize = SHA1_DIGEST_SIZE,
3540479bcc7cSHerbert Xu 		},
3541479bcc7cSHerbert Xu 		.caam = {
3542479bcc7cSHerbert Xu 			.class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC,
3543479bcc7cSHerbert Xu 			.class2_alg_type = OP_ALG_ALGSEL_SHA1 |
3544479bcc7cSHerbert Xu 					   OP_ALG_AAI_HMAC_PRECOMP,
3545479bcc7cSHerbert Xu 			.alg_op = OP_ALG_ALGSEL_SHA1 | OP_ALG_AAI_HMAC,
3546479bcc7cSHerbert Xu 			.geniv = true,
3547479bcc7cSHerbert Xu 		},
3548479bcc7cSHerbert Xu 	},
3549479bcc7cSHerbert Xu 	{
3550479bcc7cSHerbert Xu 		.aead = {
3551479bcc7cSHerbert Xu 			.base = {
3552479bcc7cSHerbert Xu 				.cra_name = "authenc(hmac(sha224),"
3553479bcc7cSHerbert Xu 					    "cbc(des3_ede))",
3554479bcc7cSHerbert Xu 				.cra_driver_name = "authenc-hmac-sha224-"
3555479bcc7cSHerbert Xu 						   "cbc-des3_ede-caam",
3556479bcc7cSHerbert Xu 				.cra_blocksize = DES3_EDE_BLOCK_SIZE,
3557479bcc7cSHerbert Xu 			},
3558479bcc7cSHerbert Xu 			.setkey = aead_setkey,
3559479bcc7cSHerbert Xu 			.setauthsize = aead_setauthsize,
3560479bcc7cSHerbert Xu 			.encrypt = aead_encrypt,
3561479bcc7cSHerbert Xu 			.decrypt = aead_decrypt,
3562479bcc7cSHerbert Xu 			.ivsize = DES3_EDE_BLOCK_SIZE,
3563479bcc7cSHerbert Xu 			.maxauthsize = SHA224_DIGEST_SIZE,
3564479bcc7cSHerbert Xu 		},
3565479bcc7cSHerbert Xu 		.caam = {
3566479bcc7cSHerbert Xu 			.class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC,
3567479bcc7cSHerbert Xu 			.class2_alg_type = OP_ALG_ALGSEL_SHA224 |
3568479bcc7cSHerbert Xu 					   OP_ALG_AAI_HMAC_PRECOMP,
3569479bcc7cSHerbert Xu 			.alg_op = OP_ALG_ALGSEL_SHA224 | OP_ALG_AAI_HMAC,
3570479bcc7cSHerbert Xu 		},
3571479bcc7cSHerbert Xu 	},
3572479bcc7cSHerbert Xu 	{
3573479bcc7cSHerbert Xu 		.aead = {
3574479bcc7cSHerbert Xu 			.base = {
3575479bcc7cSHerbert Xu 				.cra_name = "echainiv(authenc(hmac(sha224),"
3576479bcc7cSHerbert Xu 					    "cbc(des3_ede)))",
3577479bcc7cSHerbert Xu 				.cra_driver_name = "echainiv-authenc-"
3578479bcc7cSHerbert Xu 						   "hmac-sha224-"
3579479bcc7cSHerbert Xu 						   "cbc-des3_ede-caam",
3580479bcc7cSHerbert Xu 				.cra_blocksize = DES3_EDE_BLOCK_SIZE,
3581479bcc7cSHerbert Xu 			},
3582479bcc7cSHerbert Xu 			.setkey = aead_setkey,
3583479bcc7cSHerbert Xu 			.setauthsize = aead_setauthsize,
3584479bcc7cSHerbert Xu 			.encrypt = aead_encrypt,
3585479bcc7cSHerbert Xu 			.decrypt = aead_givdecrypt,
3586479bcc7cSHerbert Xu 			.ivsize = DES3_EDE_BLOCK_SIZE,
3587479bcc7cSHerbert Xu 			.maxauthsize = SHA224_DIGEST_SIZE,
3588479bcc7cSHerbert Xu 		},
3589479bcc7cSHerbert Xu 		.caam = {
3590479bcc7cSHerbert Xu 			.class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC,
3591479bcc7cSHerbert Xu 			.class2_alg_type = OP_ALG_ALGSEL_SHA224 |
3592479bcc7cSHerbert Xu 					   OP_ALG_AAI_HMAC_PRECOMP,
3593479bcc7cSHerbert Xu 			.alg_op = OP_ALG_ALGSEL_SHA224 | OP_ALG_AAI_HMAC,
3594479bcc7cSHerbert Xu 			.geniv = true,
3595479bcc7cSHerbert Xu 		},
3596479bcc7cSHerbert Xu 	},
3597479bcc7cSHerbert Xu 	{
3598479bcc7cSHerbert Xu 		.aead = {
3599479bcc7cSHerbert Xu 			.base = {
3600479bcc7cSHerbert Xu 				.cra_name = "authenc(hmac(sha256),"
3601479bcc7cSHerbert Xu 					    "cbc(des3_ede))",
3602479bcc7cSHerbert Xu 				.cra_driver_name = "authenc-hmac-sha256-"
3603479bcc7cSHerbert Xu 						   "cbc-des3_ede-caam",
3604479bcc7cSHerbert Xu 				.cra_blocksize = DES3_EDE_BLOCK_SIZE,
3605479bcc7cSHerbert Xu 			},
3606479bcc7cSHerbert Xu 			.setkey = aead_setkey,
3607479bcc7cSHerbert Xu 			.setauthsize = aead_setauthsize,
3608479bcc7cSHerbert Xu 			.encrypt = aead_encrypt,
3609479bcc7cSHerbert Xu 			.decrypt = aead_decrypt,
3610479bcc7cSHerbert Xu 			.ivsize = DES3_EDE_BLOCK_SIZE,
3611479bcc7cSHerbert Xu 			.maxauthsize = SHA256_DIGEST_SIZE,
3612479bcc7cSHerbert Xu 		},
3613479bcc7cSHerbert Xu 		.caam = {
3614479bcc7cSHerbert Xu 			.class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC,
3615479bcc7cSHerbert Xu 			.class2_alg_type = OP_ALG_ALGSEL_SHA256 |
3616479bcc7cSHerbert Xu 					   OP_ALG_AAI_HMAC_PRECOMP,
3617479bcc7cSHerbert Xu 			.alg_op = OP_ALG_ALGSEL_SHA256 | OP_ALG_AAI_HMAC,
3618479bcc7cSHerbert Xu 		},
3619479bcc7cSHerbert Xu 	},
3620479bcc7cSHerbert Xu 	{
3621479bcc7cSHerbert Xu 		.aead = {
3622479bcc7cSHerbert Xu 			.base = {
3623479bcc7cSHerbert Xu 				.cra_name = "echainiv(authenc(hmac(sha256),"
3624479bcc7cSHerbert Xu 					    "cbc(des3_ede)))",
3625479bcc7cSHerbert Xu 				.cra_driver_name = "echainiv-authenc-"
3626479bcc7cSHerbert Xu 						   "hmac-sha256-"
3627479bcc7cSHerbert Xu 						   "cbc-des3_ede-caam",
3628479bcc7cSHerbert Xu 				.cra_blocksize = DES3_EDE_BLOCK_SIZE,
3629479bcc7cSHerbert Xu 			},
3630479bcc7cSHerbert Xu 			.setkey = aead_setkey,
3631479bcc7cSHerbert Xu 			.setauthsize = aead_setauthsize,
3632479bcc7cSHerbert Xu 			.encrypt = aead_encrypt,
3633479bcc7cSHerbert Xu 			.decrypt = aead_givdecrypt,
3634479bcc7cSHerbert Xu 			.ivsize = DES3_EDE_BLOCK_SIZE,
3635479bcc7cSHerbert Xu 			.maxauthsize = SHA256_DIGEST_SIZE,
3636479bcc7cSHerbert Xu 		},
3637479bcc7cSHerbert Xu 		.caam = {
3638479bcc7cSHerbert Xu 			.class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC,
3639479bcc7cSHerbert Xu 			.class2_alg_type = OP_ALG_ALGSEL_SHA256 |
3640479bcc7cSHerbert Xu 					   OP_ALG_AAI_HMAC_PRECOMP,
3641479bcc7cSHerbert Xu 			.alg_op = OP_ALG_ALGSEL_SHA256 | OP_ALG_AAI_HMAC,
3642479bcc7cSHerbert Xu 			.geniv = true,
3643479bcc7cSHerbert Xu 		},
3644479bcc7cSHerbert Xu 	},
3645479bcc7cSHerbert Xu 	{
3646479bcc7cSHerbert Xu 		.aead = {
3647479bcc7cSHerbert Xu 			.base = {
3648479bcc7cSHerbert Xu 				.cra_name = "authenc(hmac(sha384),"
3649479bcc7cSHerbert Xu 					    "cbc(des3_ede))",
3650479bcc7cSHerbert Xu 				.cra_driver_name = "authenc-hmac-sha384-"
3651479bcc7cSHerbert Xu 						   "cbc-des3_ede-caam",
3652479bcc7cSHerbert Xu 				.cra_blocksize = DES3_EDE_BLOCK_SIZE,
3653479bcc7cSHerbert Xu 			},
3654479bcc7cSHerbert Xu 			.setkey = aead_setkey,
3655479bcc7cSHerbert Xu 			.setauthsize = aead_setauthsize,
3656479bcc7cSHerbert Xu 			.encrypt = aead_encrypt,
3657479bcc7cSHerbert Xu 			.decrypt = aead_decrypt,
3658479bcc7cSHerbert Xu 			.ivsize = DES3_EDE_BLOCK_SIZE,
3659479bcc7cSHerbert Xu 			.maxauthsize = SHA384_DIGEST_SIZE,
3660479bcc7cSHerbert Xu 		},
3661479bcc7cSHerbert Xu 		.caam = {
3662479bcc7cSHerbert Xu 			.class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC,
3663479bcc7cSHerbert Xu 			.class2_alg_type = OP_ALG_ALGSEL_SHA384 |
3664479bcc7cSHerbert Xu 					   OP_ALG_AAI_HMAC_PRECOMP,
3665479bcc7cSHerbert Xu 			.alg_op = OP_ALG_ALGSEL_SHA384 | OP_ALG_AAI_HMAC,
3666479bcc7cSHerbert Xu 		},
3667479bcc7cSHerbert Xu 	},
3668479bcc7cSHerbert Xu 	{
3669479bcc7cSHerbert Xu 		.aead = {
3670479bcc7cSHerbert Xu 			.base = {
3671479bcc7cSHerbert Xu 				.cra_name = "echainiv(authenc(hmac(sha384),"
3672479bcc7cSHerbert Xu 					    "cbc(des3_ede)))",
3673479bcc7cSHerbert Xu 				.cra_driver_name = "echainiv-authenc-"
3674479bcc7cSHerbert Xu 						   "hmac-sha384-"
3675479bcc7cSHerbert Xu 						   "cbc-des3_ede-caam",
3676479bcc7cSHerbert Xu 				.cra_blocksize = DES3_EDE_BLOCK_SIZE,
3677479bcc7cSHerbert Xu 			},
3678479bcc7cSHerbert Xu 			.setkey = aead_setkey,
3679479bcc7cSHerbert Xu 			.setauthsize = aead_setauthsize,
3680479bcc7cSHerbert Xu 			.encrypt = aead_encrypt,
3681479bcc7cSHerbert Xu 			.decrypt = aead_givdecrypt,
3682479bcc7cSHerbert Xu 			.ivsize = DES3_EDE_BLOCK_SIZE,
3683479bcc7cSHerbert Xu 			.maxauthsize = SHA384_DIGEST_SIZE,
3684479bcc7cSHerbert Xu 		},
3685479bcc7cSHerbert Xu 		.caam = {
3686479bcc7cSHerbert Xu 			.class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC,
3687479bcc7cSHerbert Xu 			.class2_alg_type = OP_ALG_ALGSEL_SHA384 |
3688479bcc7cSHerbert Xu 					   OP_ALG_AAI_HMAC_PRECOMP,
3689479bcc7cSHerbert Xu 			.alg_op = OP_ALG_ALGSEL_SHA384 | OP_ALG_AAI_HMAC,
3690479bcc7cSHerbert Xu 			.geniv = true,
3691479bcc7cSHerbert Xu 		},
3692479bcc7cSHerbert Xu 	},
3693479bcc7cSHerbert Xu 	{
3694479bcc7cSHerbert Xu 		.aead = {
3695479bcc7cSHerbert Xu 			.base = {
3696479bcc7cSHerbert Xu 				.cra_name = "authenc(hmac(sha512),"
3697479bcc7cSHerbert Xu 					    "cbc(des3_ede))",
3698479bcc7cSHerbert Xu 				.cra_driver_name = "authenc-hmac-sha512-"
3699479bcc7cSHerbert Xu 						   "cbc-des3_ede-caam",
3700479bcc7cSHerbert Xu 				.cra_blocksize = DES3_EDE_BLOCK_SIZE,
3701479bcc7cSHerbert Xu 			},
3702479bcc7cSHerbert Xu 			.setkey = aead_setkey,
3703479bcc7cSHerbert Xu 			.setauthsize = aead_setauthsize,
3704479bcc7cSHerbert Xu 			.encrypt = aead_encrypt,
3705479bcc7cSHerbert Xu 			.decrypt = aead_decrypt,
3706479bcc7cSHerbert Xu 			.ivsize = DES3_EDE_BLOCK_SIZE,
3707479bcc7cSHerbert Xu 			.maxauthsize = SHA512_DIGEST_SIZE,
3708479bcc7cSHerbert Xu 		},
3709479bcc7cSHerbert Xu 		.caam = {
3710479bcc7cSHerbert Xu 			.class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC,
3711479bcc7cSHerbert Xu 			.class2_alg_type = OP_ALG_ALGSEL_SHA512 |
3712479bcc7cSHerbert Xu 					   OP_ALG_AAI_HMAC_PRECOMP,
3713479bcc7cSHerbert Xu 			.alg_op = OP_ALG_ALGSEL_SHA512 | OP_ALG_AAI_HMAC,
3714479bcc7cSHerbert Xu 		},
3715479bcc7cSHerbert Xu 	},
3716479bcc7cSHerbert Xu 	{
3717479bcc7cSHerbert Xu 		.aead = {
3718479bcc7cSHerbert Xu 			.base = {
3719479bcc7cSHerbert Xu 				.cra_name = "echainiv(authenc(hmac(sha512),"
3720479bcc7cSHerbert Xu 					    "cbc(des3_ede)))",
3721479bcc7cSHerbert Xu 				.cra_driver_name = "echainiv-authenc-"
3722479bcc7cSHerbert Xu 						   "hmac-sha512-"
3723479bcc7cSHerbert Xu 						   "cbc-des3_ede-caam",
3724479bcc7cSHerbert Xu 				.cra_blocksize = DES3_EDE_BLOCK_SIZE,
3725479bcc7cSHerbert Xu 			},
3726479bcc7cSHerbert Xu 			.setkey = aead_setkey,
3727479bcc7cSHerbert Xu 			.setauthsize = aead_setauthsize,
3728479bcc7cSHerbert Xu 			.encrypt = aead_encrypt,
3729479bcc7cSHerbert Xu 			.decrypt = aead_givdecrypt,
3730479bcc7cSHerbert Xu 			.ivsize = DES3_EDE_BLOCK_SIZE,
3731479bcc7cSHerbert Xu 			.maxauthsize = SHA512_DIGEST_SIZE,
3732479bcc7cSHerbert Xu 		},
3733479bcc7cSHerbert Xu 		.caam = {
3734479bcc7cSHerbert Xu 			.class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC,
3735479bcc7cSHerbert Xu 			.class2_alg_type = OP_ALG_ALGSEL_SHA512 |
3736479bcc7cSHerbert Xu 					   OP_ALG_AAI_HMAC_PRECOMP,
3737479bcc7cSHerbert Xu 			.alg_op = OP_ALG_ALGSEL_SHA512 | OP_ALG_AAI_HMAC,
3738479bcc7cSHerbert Xu 			.geniv = true,
3739479bcc7cSHerbert Xu 		},
3740479bcc7cSHerbert Xu 	},
3741479bcc7cSHerbert Xu 	{
3742479bcc7cSHerbert Xu 		.aead = {
3743479bcc7cSHerbert Xu 			.base = {
3744479bcc7cSHerbert Xu 				.cra_name = "authenc(hmac(md5),cbc(des))",
3745479bcc7cSHerbert Xu 				.cra_driver_name = "authenc-hmac-md5-"
3746479bcc7cSHerbert Xu 						   "cbc-des-caam",
3747479bcc7cSHerbert Xu 				.cra_blocksize = DES_BLOCK_SIZE,
3748479bcc7cSHerbert Xu 			},
3749479bcc7cSHerbert Xu 			.setkey = aead_setkey,
3750479bcc7cSHerbert Xu 			.setauthsize = aead_setauthsize,
3751479bcc7cSHerbert Xu 			.encrypt = aead_encrypt,
3752479bcc7cSHerbert Xu 			.decrypt = aead_decrypt,
3753479bcc7cSHerbert Xu 			.ivsize = DES_BLOCK_SIZE,
3754479bcc7cSHerbert Xu 			.maxauthsize = MD5_DIGEST_SIZE,
3755479bcc7cSHerbert Xu 		},
3756479bcc7cSHerbert Xu 		.caam = {
3757479bcc7cSHerbert Xu 			.class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC,
3758479bcc7cSHerbert Xu 			.class2_alg_type = OP_ALG_ALGSEL_MD5 |
3759479bcc7cSHerbert Xu 					   OP_ALG_AAI_HMAC_PRECOMP,
3760479bcc7cSHerbert Xu 			.alg_op = OP_ALG_ALGSEL_MD5 | OP_ALG_AAI_HMAC,
3761479bcc7cSHerbert Xu 		},
3762479bcc7cSHerbert Xu 	},
3763479bcc7cSHerbert Xu 	{
3764479bcc7cSHerbert Xu 		.aead = {
3765479bcc7cSHerbert Xu 			.base = {
3766479bcc7cSHerbert Xu 				.cra_name = "echainiv(authenc(hmac(md5),"
3767479bcc7cSHerbert Xu 					    "cbc(des)))",
3768479bcc7cSHerbert Xu 				.cra_driver_name = "echainiv-authenc-hmac-md5-"
3769479bcc7cSHerbert Xu 						   "cbc-des-caam",
3770479bcc7cSHerbert Xu 				.cra_blocksize = DES_BLOCK_SIZE,
3771479bcc7cSHerbert Xu 			},
3772479bcc7cSHerbert Xu 			.setkey = aead_setkey,
3773479bcc7cSHerbert Xu 			.setauthsize = aead_setauthsize,
3774479bcc7cSHerbert Xu 			.encrypt = aead_encrypt,
3775479bcc7cSHerbert Xu 			.decrypt = aead_givdecrypt,
3776479bcc7cSHerbert Xu 			.ivsize = DES_BLOCK_SIZE,
3777479bcc7cSHerbert Xu 			.maxauthsize = MD5_DIGEST_SIZE,
3778479bcc7cSHerbert Xu 		},
3779479bcc7cSHerbert Xu 		.caam = {
3780479bcc7cSHerbert Xu 			.class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC,
3781479bcc7cSHerbert Xu 			.class2_alg_type = OP_ALG_ALGSEL_MD5 |
3782479bcc7cSHerbert Xu 					   OP_ALG_AAI_HMAC_PRECOMP,
3783479bcc7cSHerbert Xu 			.alg_op = OP_ALG_ALGSEL_MD5 | OP_ALG_AAI_HMAC,
3784479bcc7cSHerbert Xu 			.geniv = true,
3785479bcc7cSHerbert Xu 		},
3786479bcc7cSHerbert Xu 	},
3787479bcc7cSHerbert Xu 	{
3788479bcc7cSHerbert Xu 		.aead = {
3789479bcc7cSHerbert Xu 			.base = {
3790479bcc7cSHerbert Xu 				.cra_name = "authenc(hmac(sha1),cbc(des))",
3791479bcc7cSHerbert Xu 				.cra_driver_name = "authenc-hmac-sha1-"
3792479bcc7cSHerbert Xu 						   "cbc-des-caam",
3793479bcc7cSHerbert Xu 				.cra_blocksize = DES_BLOCK_SIZE,
3794479bcc7cSHerbert Xu 			},
3795479bcc7cSHerbert Xu 			.setkey = aead_setkey,
3796479bcc7cSHerbert Xu 			.setauthsize = aead_setauthsize,
3797479bcc7cSHerbert Xu 			.encrypt = aead_encrypt,
3798479bcc7cSHerbert Xu 			.decrypt = aead_decrypt,
3799479bcc7cSHerbert Xu 			.ivsize = DES_BLOCK_SIZE,
3800479bcc7cSHerbert Xu 			.maxauthsize = SHA1_DIGEST_SIZE,
3801479bcc7cSHerbert Xu 		},
3802479bcc7cSHerbert Xu 		.caam = {
3803479bcc7cSHerbert Xu 			.class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC,
3804479bcc7cSHerbert Xu 			.class2_alg_type = OP_ALG_ALGSEL_SHA1 |
3805479bcc7cSHerbert Xu 					   OP_ALG_AAI_HMAC_PRECOMP,
3806479bcc7cSHerbert Xu 			.alg_op = OP_ALG_ALGSEL_SHA1 | OP_ALG_AAI_HMAC,
3807479bcc7cSHerbert Xu 		},
3808479bcc7cSHerbert Xu 	},
3809479bcc7cSHerbert Xu 	{
3810479bcc7cSHerbert Xu 		.aead = {
3811479bcc7cSHerbert Xu 			.base = {
3812479bcc7cSHerbert Xu 				.cra_name = "echainiv(authenc(hmac(sha1),"
3813479bcc7cSHerbert Xu 					    "cbc(des)))",
3814479bcc7cSHerbert Xu 				.cra_driver_name = "echainiv-authenc-"
3815479bcc7cSHerbert Xu 						   "hmac-sha1-cbc-des-caam",
3816479bcc7cSHerbert Xu 				.cra_blocksize = DES_BLOCK_SIZE,
3817479bcc7cSHerbert Xu 			},
3818479bcc7cSHerbert Xu 			.setkey = aead_setkey,
3819479bcc7cSHerbert Xu 			.setauthsize = aead_setauthsize,
3820479bcc7cSHerbert Xu 			.encrypt = aead_encrypt,
3821479bcc7cSHerbert Xu 			.decrypt = aead_givdecrypt,
3822479bcc7cSHerbert Xu 			.ivsize = DES_BLOCK_SIZE,
3823479bcc7cSHerbert Xu 			.maxauthsize = SHA1_DIGEST_SIZE,
3824479bcc7cSHerbert Xu 		},
3825479bcc7cSHerbert Xu 		.caam = {
3826479bcc7cSHerbert Xu 			.class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC,
3827479bcc7cSHerbert Xu 			.class2_alg_type = OP_ALG_ALGSEL_SHA1 |
3828479bcc7cSHerbert Xu 					   OP_ALG_AAI_HMAC_PRECOMP,
3829479bcc7cSHerbert Xu 			.alg_op = OP_ALG_ALGSEL_SHA1 | OP_ALG_AAI_HMAC,
3830479bcc7cSHerbert Xu 			.geniv = true,
3831479bcc7cSHerbert Xu 		},
3832479bcc7cSHerbert Xu 	},
3833479bcc7cSHerbert Xu 	{
3834479bcc7cSHerbert Xu 		.aead = {
3835479bcc7cSHerbert Xu 			.base = {
3836479bcc7cSHerbert Xu 				.cra_name = "authenc(hmac(sha224),cbc(des))",
3837479bcc7cSHerbert Xu 				.cra_driver_name = "authenc-hmac-sha224-"
3838479bcc7cSHerbert Xu 						   "cbc-des-caam",
3839479bcc7cSHerbert Xu 				.cra_blocksize = DES_BLOCK_SIZE,
3840479bcc7cSHerbert Xu 			},
3841479bcc7cSHerbert Xu 			.setkey = aead_setkey,
3842479bcc7cSHerbert Xu 			.setauthsize = aead_setauthsize,
3843479bcc7cSHerbert Xu 			.encrypt = aead_encrypt,
3844479bcc7cSHerbert Xu 			.decrypt = aead_decrypt,
3845479bcc7cSHerbert Xu 			.ivsize = DES_BLOCK_SIZE,
3846479bcc7cSHerbert Xu 			.maxauthsize = SHA224_DIGEST_SIZE,
3847479bcc7cSHerbert Xu 		},
3848479bcc7cSHerbert Xu 		.caam = {
3849479bcc7cSHerbert Xu 			.class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC,
3850479bcc7cSHerbert Xu 			.class2_alg_type = OP_ALG_ALGSEL_SHA224 |
3851479bcc7cSHerbert Xu 					   OP_ALG_AAI_HMAC_PRECOMP,
3852479bcc7cSHerbert Xu 			.alg_op = OP_ALG_ALGSEL_SHA224 | OP_ALG_AAI_HMAC,
3853479bcc7cSHerbert Xu 		},
3854479bcc7cSHerbert Xu 	},
3855479bcc7cSHerbert Xu 	{
3856479bcc7cSHerbert Xu 		.aead = {
3857479bcc7cSHerbert Xu 			.base = {
3858479bcc7cSHerbert Xu 				.cra_name = "echainiv(authenc(hmac(sha224),"
3859479bcc7cSHerbert Xu 					    "cbc(des)))",
3860479bcc7cSHerbert Xu 				.cra_driver_name = "echainiv-authenc-"
3861479bcc7cSHerbert Xu 						   "hmac-sha224-cbc-des-caam",
3862479bcc7cSHerbert Xu 				.cra_blocksize = DES_BLOCK_SIZE,
3863479bcc7cSHerbert Xu 			},
3864479bcc7cSHerbert Xu 			.setkey = aead_setkey,
3865479bcc7cSHerbert Xu 			.setauthsize = aead_setauthsize,
3866479bcc7cSHerbert Xu 			.encrypt = aead_encrypt,
3867479bcc7cSHerbert Xu 			.decrypt = aead_givdecrypt,
3868479bcc7cSHerbert Xu 			.ivsize = DES_BLOCK_SIZE,
3869479bcc7cSHerbert Xu 			.maxauthsize = SHA224_DIGEST_SIZE,
3870479bcc7cSHerbert Xu 		},
3871479bcc7cSHerbert Xu 		.caam = {
3872479bcc7cSHerbert Xu 			.class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC,
3873479bcc7cSHerbert Xu 			.class2_alg_type = OP_ALG_ALGSEL_SHA224 |
3874479bcc7cSHerbert Xu 					   OP_ALG_AAI_HMAC_PRECOMP,
3875479bcc7cSHerbert Xu 			.alg_op = OP_ALG_ALGSEL_SHA224 | OP_ALG_AAI_HMAC,
3876479bcc7cSHerbert Xu 			.geniv = true,
3877479bcc7cSHerbert Xu 		},
3878479bcc7cSHerbert Xu 	},
3879479bcc7cSHerbert Xu 	{
3880479bcc7cSHerbert Xu 		.aead = {
3881479bcc7cSHerbert Xu 			.base = {
3882479bcc7cSHerbert Xu 				.cra_name = "authenc(hmac(sha256),cbc(des))",
3883479bcc7cSHerbert Xu 				.cra_driver_name = "authenc-hmac-sha256-"
3884479bcc7cSHerbert Xu 						   "cbc-des-caam",
3885479bcc7cSHerbert Xu 				.cra_blocksize = DES_BLOCK_SIZE,
3886479bcc7cSHerbert Xu 			},
3887479bcc7cSHerbert Xu 			.setkey = aead_setkey,
3888479bcc7cSHerbert Xu 			.setauthsize = aead_setauthsize,
3889479bcc7cSHerbert Xu 			.encrypt = aead_encrypt,
3890479bcc7cSHerbert Xu 			.decrypt = aead_decrypt,
3891479bcc7cSHerbert Xu 			.ivsize = DES_BLOCK_SIZE,
3892479bcc7cSHerbert Xu 			.maxauthsize = SHA256_DIGEST_SIZE,
3893479bcc7cSHerbert Xu 		},
3894479bcc7cSHerbert Xu 		.caam = {
3895479bcc7cSHerbert Xu 			.class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC,
3896479bcc7cSHerbert Xu 			.class2_alg_type = OP_ALG_ALGSEL_SHA256 |
3897479bcc7cSHerbert Xu 					   OP_ALG_AAI_HMAC_PRECOMP,
3898479bcc7cSHerbert Xu 			.alg_op = OP_ALG_ALGSEL_SHA256 | OP_ALG_AAI_HMAC,
3899479bcc7cSHerbert Xu 		},
3900479bcc7cSHerbert Xu 	},
3901479bcc7cSHerbert Xu 	{
3902479bcc7cSHerbert Xu 		.aead = {
3903479bcc7cSHerbert Xu 			.base = {
3904479bcc7cSHerbert Xu 				.cra_name = "echainiv(authenc(hmac(sha256),"
3905479bcc7cSHerbert Xu 					    "cbc(des)))",
3906479bcc7cSHerbert Xu 				.cra_driver_name = "echainiv-authenc-"
3907479bcc7cSHerbert Xu 						   "hmac-sha256-cbc-des-caam",
3908479bcc7cSHerbert Xu 				.cra_blocksize = DES_BLOCK_SIZE,
3909479bcc7cSHerbert Xu 			},
3910479bcc7cSHerbert Xu 			.setkey = aead_setkey,
3911479bcc7cSHerbert Xu 			.setauthsize = aead_setauthsize,
3912479bcc7cSHerbert Xu 			.encrypt = aead_encrypt,
3913479bcc7cSHerbert Xu 			.decrypt = aead_givdecrypt,
3914479bcc7cSHerbert Xu 			.ivsize = DES_BLOCK_SIZE,
3915479bcc7cSHerbert Xu 			.maxauthsize = SHA256_DIGEST_SIZE,
3916479bcc7cSHerbert Xu 		},
3917479bcc7cSHerbert Xu 		.caam = {
3918479bcc7cSHerbert Xu 			.class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC,
3919479bcc7cSHerbert Xu 			.class2_alg_type = OP_ALG_ALGSEL_SHA256 |
3920479bcc7cSHerbert Xu 					   OP_ALG_AAI_HMAC_PRECOMP,
3921479bcc7cSHerbert Xu 			.alg_op = OP_ALG_ALGSEL_SHA256 | OP_ALG_AAI_HMAC,
3922479bcc7cSHerbert Xu 			.geniv = true,
3923479bcc7cSHerbert Xu 		},
3924479bcc7cSHerbert Xu 	},
3925479bcc7cSHerbert Xu 	{
3926479bcc7cSHerbert Xu 		.aead = {
3927479bcc7cSHerbert Xu 			.base = {
3928479bcc7cSHerbert Xu 				.cra_name = "authenc(hmac(sha384),cbc(des))",
3929479bcc7cSHerbert Xu 				.cra_driver_name = "authenc-hmac-sha384-"
3930479bcc7cSHerbert Xu 						   "cbc-des-caam",
3931479bcc7cSHerbert Xu 				.cra_blocksize = DES_BLOCK_SIZE,
3932479bcc7cSHerbert Xu 			},
3933479bcc7cSHerbert Xu 			.setkey = aead_setkey,
3934479bcc7cSHerbert Xu 			.setauthsize = aead_setauthsize,
3935479bcc7cSHerbert Xu 			.encrypt = aead_encrypt,
3936479bcc7cSHerbert Xu 			.decrypt = aead_decrypt,
3937479bcc7cSHerbert Xu 			.ivsize = DES_BLOCK_SIZE,
3938479bcc7cSHerbert Xu 			.maxauthsize = SHA384_DIGEST_SIZE,
3939479bcc7cSHerbert Xu 		},
3940479bcc7cSHerbert Xu 		.caam = {
3941479bcc7cSHerbert Xu 			.class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC,
3942479bcc7cSHerbert Xu 			.class2_alg_type = OP_ALG_ALGSEL_SHA384 |
3943479bcc7cSHerbert Xu 					   OP_ALG_AAI_HMAC_PRECOMP,
3944479bcc7cSHerbert Xu 			.alg_op = OP_ALG_ALGSEL_SHA384 | OP_ALG_AAI_HMAC,
3945479bcc7cSHerbert Xu 		},
3946479bcc7cSHerbert Xu 	},
3947479bcc7cSHerbert Xu 	{
3948479bcc7cSHerbert Xu 		.aead = {
3949479bcc7cSHerbert Xu 			.base = {
3950479bcc7cSHerbert Xu 				.cra_name = "echainiv(authenc(hmac(sha384),"
3951479bcc7cSHerbert Xu 					    "cbc(des)))",
3952479bcc7cSHerbert Xu 				.cra_driver_name = "echainiv-authenc-"
3953479bcc7cSHerbert Xu 						   "hmac-sha384-cbc-des-caam",
3954479bcc7cSHerbert Xu 				.cra_blocksize = DES_BLOCK_SIZE,
3955479bcc7cSHerbert Xu 			},
3956479bcc7cSHerbert Xu 			.setkey = aead_setkey,
3957479bcc7cSHerbert Xu 			.setauthsize = aead_setauthsize,
3958479bcc7cSHerbert Xu 			.encrypt = aead_encrypt,
3959479bcc7cSHerbert Xu 			.decrypt = aead_givdecrypt,
3960479bcc7cSHerbert Xu 			.ivsize = DES_BLOCK_SIZE,
3961479bcc7cSHerbert Xu 			.maxauthsize = SHA384_DIGEST_SIZE,
3962479bcc7cSHerbert Xu 		},
3963479bcc7cSHerbert Xu 		.caam = {
3964479bcc7cSHerbert Xu 			.class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC,
3965479bcc7cSHerbert Xu 			.class2_alg_type = OP_ALG_ALGSEL_SHA384 |
3966479bcc7cSHerbert Xu 					   OP_ALG_AAI_HMAC_PRECOMP,
3967479bcc7cSHerbert Xu 			.alg_op = OP_ALG_ALGSEL_SHA384 | OP_ALG_AAI_HMAC,
3968479bcc7cSHerbert Xu 			.geniv = true,
3969479bcc7cSHerbert Xu 		},
3970479bcc7cSHerbert Xu 	},
3971479bcc7cSHerbert Xu 	{
3972479bcc7cSHerbert Xu 		.aead = {
3973479bcc7cSHerbert Xu 			.base = {
3974479bcc7cSHerbert Xu 				.cra_name = "authenc(hmac(sha512),cbc(des))",
3975479bcc7cSHerbert Xu 				.cra_driver_name = "authenc-hmac-sha512-"
3976479bcc7cSHerbert Xu 						   "cbc-des-caam",
3977479bcc7cSHerbert Xu 				.cra_blocksize = DES_BLOCK_SIZE,
3978479bcc7cSHerbert Xu 			},
3979479bcc7cSHerbert Xu 			.setkey = aead_setkey,
3980479bcc7cSHerbert Xu 			.setauthsize = aead_setauthsize,
3981479bcc7cSHerbert Xu 			.encrypt = aead_encrypt,
3982479bcc7cSHerbert Xu 			.decrypt = aead_decrypt,
3983479bcc7cSHerbert Xu 			.ivsize = DES_BLOCK_SIZE,
3984479bcc7cSHerbert Xu 			.maxauthsize = SHA512_DIGEST_SIZE,
3985479bcc7cSHerbert Xu 		},
3986479bcc7cSHerbert Xu 		.caam = {
3987479bcc7cSHerbert Xu 			.class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC,
3988479bcc7cSHerbert Xu 			.class2_alg_type = OP_ALG_ALGSEL_SHA512 |
3989479bcc7cSHerbert Xu 					   OP_ALG_AAI_HMAC_PRECOMP,
3990479bcc7cSHerbert Xu 			.alg_op = OP_ALG_ALGSEL_SHA512 | OP_ALG_AAI_HMAC,
3991479bcc7cSHerbert Xu 		},
3992479bcc7cSHerbert Xu 	},
3993479bcc7cSHerbert Xu 	{
3994479bcc7cSHerbert Xu 		.aead = {
3995479bcc7cSHerbert Xu 			.base = {
3996479bcc7cSHerbert Xu 				.cra_name = "echainiv(authenc(hmac(sha512),"
3997479bcc7cSHerbert Xu 					    "cbc(des)))",
3998479bcc7cSHerbert Xu 				.cra_driver_name = "echainiv-authenc-"
3999479bcc7cSHerbert Xu 						   "hmac-sha512-cbc-des-caam",
4000479bcc7cSHerbert Xu 				.cra_blocksize = DES_BLOCK_SIZE,
4001479bcc7cSHerbert Xu 			},
4002479bcc7cSHerbert Xu 			.setkey = aead_setkey,
4003479bcc7cSHerbert Xu 			.setauthsize = aead_setauthsize,
4004479bcc7cSHerbert Xu 			.encrypt = aead_encrypt,
4005479bcc7cSHerbert Xu 			.decrypt = aead_givdecrypt,
4006479bcc7cSHerbert Xu 			.ivsize = DES_BLOCK_SIZE,
4007479bcc7cSHerbert Xu 			.maxauthsize = SHA512_DIGEST_SIZE,
4008479bcc7cSHerbert Xu 		},
4009479bcc7cSHerbert Xu 		.caam = {
4010479bcc7cSHerbert Xu 			.class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC,
4011479bcc7cSHerbert Xu 			.class2_alg_type = OP_ALG_ALGSEL_SHA512 |
4012479bcc7cSHerbert Xu 					   OP_ALG_AAI_HMAC_PRECOMP,
4013479bcc7cSHerbert Xu 			.alg_op = OP_ALG_ALGSEL_SHA512 | OP_ALG_AAI_HMAC,
4014479bcc7cSHerbert Xu 			.geniv = true,
4015479bcc7cSHerbert Xu 		},
4016479bcc7cSHerbert Xu 	},
4017479bcc7cSHerbert Xu 	{
4018479bcc7cSHerbert Xu 		.aead = {
4019479bcc7cSHerbert Xu 			.base = {
4020479bcc7cSHerbert Xu 				.cra_name = "authenc(hmac(md5),"
4021479bcc7cSHerbert Xu 					    "rfc3686(ctr(aes)))",
4022479bcc7cSHerbert Xu 				.cra_driver_name = "authenc-hmac-md5-"
4023479bcc7cSHerbert Xu 						   "rfc3686-ctr-aes-caam",
4024479bcc7cSHerbert Xu 				.cra_blocksize = 1,
4025479bcc7cSHerbert Xu 			},
4026479bcc7cSHerbert Xu 			.setkey = aead_setkey,
4027479bcc7cSHerbert Xu 			.setauthsize = aead_setauthsize,
4028479bcc7cSHerbert Xu 			.encrypt = aead_encrypt,
4029479bcc7cSHerbert Xu 			.decrypt = aead_decrypt,
4030479bcc7cSHerbert Xu 			.ivsize = CTR_RFC3686_IV_SIZE,
4031479bcc7cSHerbert Xu 			.maxauthsize = MD5_DIGEST_SIZE,
4032479bcc7cSHerbert Xu 		},
4033479bcc7cSHerbert Xu 		.caam = {
4034479bcc7cSHerbert Xu 			.class1_alg_type = OP_ALG_ALGSEL_AES |
4035479bcc7cSHerbert Xu 					   OP_ALG_AAI_CTR_MOD128,
4036479bcc7cSHerbert Xu 			.class2_alg_type = OP_ALG_ALGSEL_MD5 |
4037479bcc7cSHerbert Xu 					   OP_ALG_AAI_HMAC_PRECOMP,
4038479bcc7cSHerbert Xu 			.alg_op = OP_ALG_ALGSEL_MD5 | OP_ALG_AAI_HMAC,
4039479bcc7cSHerbert Xu 			.rfc3686 = true,
4040479bcc7cSHerbert Xu 		},
4041479bcc7cSHerbert Xu 	},
4042479bcc7cSHerbert Xu 	{
4043479bcc7cSHerbert Xu 		.aead = {
4044479bcc7cSHerbert Xu 			.base = {
4045479bcc7cSHerbert Xu 				.cra_name = "seqiv(authenc("
4046479bcc7cSHerbert Xu 					    "hmac(md5),rfc3686(ctr(aes))))",
4047479bcc7cSHerbert Xu 				.cra_driver_name = "seqiv-authenc-hmac-md5-"
4048479bcc7cSHerbert Xu 						   "rfc3686-ctr-aes-caam",
4049479bcc7cSHerbert Xu 				.cra_blocksize = 1,
4050479bcc7cSHerbert Xu 			},
4051479bcc7cSHerbert Xu 			.setkey = aead_setkey,
4052479bcc7cSHerbert Xu 			.setauthsize = aead_setauthsize,
4053479bcc7cSHerbert Xu 			.encrypt = aead_encrypt,
4054479bcc7cSHerbert Xu 			.decrypt = aead_givdecrypt,
4055479bcc7cSHerbert Xu 			.ivsize = CTR_RFC3686_IV_SIZE,
4056479bcc7cSHerbert Xu 			.maxauthsize = MD5_DIGEST_SIZE,
4057479bcc7cSHerbert Xu 		},
4058479bcc7cSHerbert Xu 		.caam = {
4059479bcc7cSHerbert Xu 			.class1_alg_type = OP_ALG_ALGSEL_AES |
4060479bcc7cSHerbert Xu 					   OP_ALG_AAI_CTR_MOD128,
4061479bcc7cSHerbert Xu 			.class2_alg_type = OP_ALG_ALGSEL_MD5 |
4062479bcc7cSHerbert Xu 					   OP_ALG_AAI_HMAC_PRECOMP,
4063479bcc7cSHerbert Xu 			.alg_op = OP_ALG_ALGSEL_MD5 | OP_ALG_AAI_HMAC,
4064479bcc7cSHerbert Xu 			.rfc3686 = true,
4065479bcc7cSHerbert Xu 			.geniv = true,
4066479bcc7cSHerbert Xu 		},
4067479bcc7cSHerbert Xu 	},
4068479bcc7cSHerbert Xu 	{
4069479bcc7cSHerbert Xu 		.aead = {
4070479bcc7cSHerbert Xu 			.base = {
4071479bcc7cSHerbert Xu 				.cra_name = "authenc(hmac(sha1),"
4072479bcc7cSHerbert Xu 					    "rfc3686(ctr(aes)))",
4073479bcc7cSHerbert Xu 				.cra_driver_name = "authenc-hmac-sha1-"
4074479bcc7cSHerbert Xu 						   "rfc3686-ctr-aes-caam",
4075479bcc7cSHerbert Xu 				.cra_blocksize = 1,
4076479bcc7cSHerbert Xu 			},
4077479bcc7cSHerbert Xu 			.setkey = aead_setkey,
4078479bcc7cSHerbert Xu 			.setauthsize = aead_setauthsize,
4079479bcc7cSHerbert Xu 			.encrypt = aead_encrypt,
4080479bcc7cSHerbert Xu 			.decrypt = aead_decrypt,
4081479bcc7cSHerbert Xu 			.ivsize = CTR_RFC3686_IV_SIZE,
4082479bcc7cSHerbert Xu 			.maxauthsize = SHA1_DIGEST_SIZE,
4083479bcc7cSHerbert Xu 		},
4084479bcc7cSHerbert Xu 		.caam = {
4085479bcc7cSHerbert Xu 			.class1_alg_type = OP_ALG_ALGSEL_AES |
4086479bcc7cSHerbert Xu 					   OP_ALG_AAI_CTR_MOD128,
4087479bcc7cSHerbert Xu 			.class2_alg_type = OP_ALG_ALGSEL_SHA1 |
4088479bcc7cSHerbert Xu 					   OP_ALG_AAI_HMAC_PRECOMP,
4089479bcc7cSHerbert Xu 			.alg_op = OP_ALG_ALGSEL_SHA1 | OP_ALG_AAI_HMAC,
4090479bcc7cSHerbert Xu 			.rfc3686 = true,
4091479bcc7cSHerbert Xu 		},
4092479bcc7cSHerbert Xu 	},
4093479bcc7cSHerbert Xu 	{
4094479bcc7cSHerbert Xu 		.aead = {
4095479bcc7cSHerbert Xu 			.base = {
4096479bcc7cSHerbert Xu 				.cra_name = "seqiv(authenc("
4097479bcc7cSHerbert Xu 					    "hmac(sha1),rfc3686(ctr(aes))))",
4098479bcc7cSHerbert Xu 				.cra_driver_name = "seqiv-authenc-hmac-sha1-"
4099479bcc7cSHerbert Xu 						   "rfc3686-ctr-aes-caam",
4100479bcc7cSHerbert Xu 				.cra_blocksize = 1,
4101479bcc7cSHerbert Xu 			},
4102479bcc7cSHerbert Xu 			.setkey = aead_setkey,
4103479bcc7cSHerbert Xu 			.setauthsize = aead_setauthsize,
4104479bcc7cSHerbert Xu 			.encrypt = aead_encrypt,
4105479bcc7cSHerbert Xu 			.decrypt = aead_givdecrypt,
4106479bcc7cSHerbert Xu 			.ivsize = CTR_RFC3686_IV_SIZE,
4107479bcc7cSHerbert Xu 			.maxauthsize = SHA1_DIGEST_SIZE,
4108479bcc7cSHerbert Xu 		},
4109479bcc7cSHerbert Xu 		.caam = {
4110479bcc7cSHerbert Xu 			.class1_alg_type = OP_ALG_ALGSEL_AES |
4111479bcc7cSHerbert Xu 					   OP_ALG_AAI_CTR_MOD128,
4112479bcc7cSHerbert Xu 			.class2_alg_type = OP_ALG_ALGSEL_SHA1 |
4113479bcc7cSHerbert Xu 					   OP_ALG_AAI_HMAC_PRECOMP,
4114479bcc7cSHerbert Xu 			.alg_op = OP_ALG_ALGSEL_SHA1 | OP_ALG_AAI_HMAC,
4115479bcc7cSHerbert Xu 			.rfc3686 = true,
4116479bcc7cSHerbert Xu 			.geniv = true,
4117479bcc7cSHerbert Xu 		},
4118479bcc7cSHerbert Xu 	},
4119479bcc7cSHerbert Xu 	{
4120479bcc7cSHerbert Xu 		.aead = {
4121479bcc7cSHerbert Xu 			.base = {
4122479bcc7cSHerbert Xu 				.cra_name = "authenc(hmac(sha224),"
4123479bcc7cSHerbert Xu 					    "rfc3686(ctr(aes)))",
4124479bcc7cSHerbert Xu 				.cra_driver_name = "authenc-hmac-sha224-"
4125479bcc7cSHerbert Xu 						   "rfc3686-ctr-aes-caam",
4126479bcc7cSHerbert Xu 				.cra_blocksize = 1,
4127479bcc7cSHerbert Xu 			},
4128479bcc7cSHerbert Xu 			.setkey = aead_setkey,
4129479bcc7cSHerbert Xu 			.setauthsize = aead_setauthsize,
4130479bcc7cSHerbert Xu 			.encrypt = aead_encrypt,
4131479bcc7cSHerbert Xu 			.decrypt = aead_decrypt,
4132479bcc7cSHerbert Xu 			.ivsize = CTR_RFC3686_IV_SIZE,
4133479bcc7cSHerbert Xu 			.maxauthsize = SHA224_DIGEST_SIZE,
4134479bcc7cSHerbert Xu 		},
4135479bcc7cSHerbert Xu 		.caam = {
4136479bcc7cSHerbert Xu 			.class1_alg_type = OP_ALG_ALGSEL_AES |
4137479bcc7cSHerbert Xu 					   OP_ALG_AAI_CTR_MOD128,
4138479bcc7cSHerbert Xu 			.class2_alg_type = OP_ALG_ALGSEL_SHA224 |
4139479bcc7cSHerbert Xu 					   OP_ALG_AAI_HMAC_PRECOMP,
4140479bcc7cSHerbert Xu 			.alg_op = OP_ALG_ALGSEL_SHA224 | OP_ALG_AAI_HMAC,
4141479bcc7cSHerbert Xu 			.rfc3686 = true,
4142479bcc7cSHerbert Xu 		},
4143479bcc7cSHerbert Xu 	},
4144479bcc7cSHerbert Xu 	{
4145479bcc7cSHerbert Xu 		.aead = {
4146479bcc7cSHerbert Xu 			.base = {
4147479bcc7cSHerbert Xu 				.cra_name = "seqiv(authenc("
4148479bcc7cSHerbert Xu 					    "hmac(sha224),rfc3686(ctr(aes))))",
4149479bcc7cSHerbert Xu 				.cra_driver_name = "seqiv-authenc-hmac-sha224-"
4150479bcc7cSHerbert Xu 						   "rfc3686-ctr-aes-caam",
4151479bcc7cSHerbert Xu 				.cra_blocksize = 1,
4152479bcc7cSHerbert Xu 			},
4153479bcc7cSHerbert Xu 			.setkey = aead_setkey,
4154479bcc7cSHerbert Xu 			.setauthsize = aead_setauthsize,
4155479bcc7cSHerbert Xu 			.encrypt = aead_encrypt,
4156479bcc7cSHerbert Xu 			.decrypt = aead_givdecrypt,
4157479bcc7cSHerbert Xu 			.ivsize = CTR_RFC3686_IV_SIZE,
4158479bcc7cSHerbert Xu 			.maxauthsize = SHA224_DIGEST_SIZE,
4159479bcc7cSHerbert Xu 		},
4160479bcc7cSHerbert Xu 		.caam = {
4161479bcc7cSHerbert Xu 			.class1_alg_type = OP_ALG_ALGSEL_AES |
4162479bcc7cSHerbert Xu 					   OP_ALG_AAI_CTR_MOD128,
4163479bcc7cSHerbert Xu 			.class2_alg_type = OP_ALG_ALGSEL_SHA224 |
4164479bcc7cSHerbert Xu 					   OP_ALG_AAI_HMAC_PRECOMP,
4165479bcc7cSHerbert Xu 			.alg_op = OP_ALG_ALGSEL_SHA224 | OP_ALG_AAI_HMAC,
4166479bcc7cSHerbert Xu 			.rfc3686 = true,
4167479bcc7cSHerbert Xu 			.geniv = true,
4168479bcc7cSHerbert Xu 		},
4169479bcc7cSHerbert Xu 	},
4170479bcc7cSHerbert Xu 	{
4171479bcc7cSHerbert Xu 		.aead = {
4172479bcc7cSHerbert Xu 			.base = {
4173479bcc7cSHerbert Xu 				.cra_name = "authenc(hmac(sha256),"
4174479bcc7cSHerbert Xu 					    "rfc3686(ctr(aes)))",
4175479bcc7cSHerbert Xu 				.cra_driver_name = "authenc-hmac-sha256-"
4176479bcc7cSHerbert Xu 						   "rfc3686-ctr-aes-caam",
4177479bcc7cSHerbert Xu 				.cra_blocksize = 1,
4178479bcc7cSHerbert Xu 			},
4179479bcc7cSHerbert Xu 			.setkey = aead_setkey,
4180479bcc7cSHerbert Xu 			.setauthsize = aead_setauthsize,
4181479bcc7cSHerbert Xu 			.encrypt = aead_encrypt,
4182479bcc7cSHerbert Xu 			.decrypt = aead_decrypt,
4183479bcc7cSHerbert Xu 			.ivsize = CTR_RFC3686_IV_SIZE,
4184479bcc7cSHerbert Xu 			.maxauthsize = SHA256_DIGEST_SIZE,
4185479bcc7cSHerbert Xu 		},
4186479bcc7cSHerbert Xu 		.caam = {
4187479bcc7cSHerbert Xu 			.class1_alg_type = OP_ALG_ALGSEL_AES |
4188479bcc7cSHerbert Xu 					   OP_ALG_AAI_CTR_MOD128,
4189479bcc7cSHerbert Xu 			.class2_alg_type = OP_ALG_ALGSEL_SHA256 |
4190479bcc7cSHerbert Xu 					   OP_ALG_AAI_HMAC_PRECOMP,
4191479bcc7cSHerbert Xu 			.alg_op = OP_ALG_ALGSEL_SHA256 | OP_ALG_AAI_HMAC,
4192479bcc7cSHerbert Xu 			.rfc3686 = true,
4193479bcc7cSHerbert Xu 		},
4194479bcc7cSHerbert Xu 	},
4195479bcc7cSHerbert Xu 	{
4196479bcc7cSHerbert Xu 		.aead = {
4197479bcc7cSHerbert Xu 			.base = {
4198479bcc7cSHerbert Xu 				.cra_name = "seqiv(authenc(hmac(sha256),"
4199479bcc7cSHerbert Xu 					    "rfc3686(ctr(aes))))",
4200479bcc7cSHerbert Xu 				.cra_driver_name = "seqiv-authenc-hmac-sha256-"
4201479bcc7cSHerbert Xu 						   "rfc3686-ctr-aes-caam",
4202479bcc7cSHerbert Xu 				.cra_blocksize = 1,
4203479bcc7cSHerbert Xu 			},
4204479bcc7cSHerbert Xu 			.setkey = aead_setkey,
4205479bcc7cSHerbert Xu 			.setauthsize = aead_setauthsize,
4206479bcc7cSHerbert Xu 			.encrypt = aead_encrypt,
4207479bcc7cSHerbert Xu 			.decrypt = aead_givdecrypt,
4208479bcc7cSHerbert Xu 			.ivsize = CTR_RFC3686_IV_SIZE,
4209479bcc7cSHerbert Xu 			.maxauthsize = SHA256_DIGEST_SIZE,
4210479bcc7cSHerbert Xu 		},
4211479bcc7cSHerbert Xu 		.caam = {
4212479bcc7cSHerbert Xu 			.class1_alg_type = OP_ALG_ALGSEL_AES |
4213479bcc7cSHerbert Xu 					   OP_ALG_AAI_CTR_MOD128,
4214479bcc7cSHerbert Xu 			.class2_alg_type = OP_ALG_ALGSEL_SHA256 |
4215479bcc7cSHerbert Xu 					   OP_ALG_AAI_HMAC_PRECOMP,
4216479bcc7cSHerbert Xu 			.alg_op = OP_ALG_ALGSEL_SHA256 | OP_ALG_AAI_HMAC,
4217479bcc7cSHerbert Xu 			.rfc3686 = true,
4218479bcc7cSHerbert Xu 			.geniv = true,
4219479bcc7cSHerbert Xu 		},
4220479bcc7cSHerbert Xu 	},
4221479bcc7cSHerbert Xu 	{
4222479bcc7cSHerbert Xu 		.aead = {
4223479bcc7cSHerbert Xu 			.base = {
4224479bcc7cSHerbert Xu 				.cra_name = "authenc(hmac(sha384),"
4225479bcc7cSHerbert Xu 					    "rfc3686(ctr(aes)))",
4226479bcc7cSHerbert Xu 				.cra_driver_name = "authenc-hmac-sha384-"
4227479bcc7cSHerbert Xu 						   "rfc3686-ctr-aes-caam",
4228479bcc7cSHerbert Xu 				.cra_blocksize = 1,
4229479bcc7cSHerbert Xu 			},
4230479bcc7cSHerbert Xu 			.setkey = aead_setkey,
4231479bcc7cSHerbert Xu 			.setauthsize = aead_setauthsize,
4232479bcc7cSHerbert Xu 			.encrypt = aead_encrypt,
4233479bcc7cSHerbert Xu 			.decrypt = aead_decrypt,
4234479bcc7cSHerbert Xu 			.ivsize = CTR_RFC3686_IV_SIZE,
4235479bcc7cSHerbert Xu 			.maxauthsize = SHA384_DIGEST_SIZE,
4236479bcc7cSHerbert Xu 		},
4237479bcc7cSHerbert Xu 		.caam = {
4238479bcc7cSHerbert Xu 			.class1_alg_type = OP_ALG_ALGSEL_AES |
4239479bcc7cSHerbert Xu 					   OP_ALG_AAI_CTR_MOD128,
4240479bcc7cSHerbert Xu 			.class2_alg_type = OP_ALG_ALGSEL_SHA384 |
4241479bcc7cSHerbert Xu 					   OP_ALG_AAI_HMAC_PRECOMP,
4242479bcc7cSHerbert Xu 			.alg_op = OP_ALG_ALGSEL_SHA384 | OP_ALG_AAI_HMAC,
4243479bcc7cSHerbert Xu 			.rfc3686 = true,
4244479bcc7cSHerbert Xu 		},
4245479bcc7cSHerbert Xu 	},
4246479bcc7cSHerbert Xu 	{
4247479bcc7cSHerbert Xu 		.aead = {
4248479bcc7cSHerbert Xu 			.base = {
4249479bcc7cSHerbert Xu 				.cra_name = "seqiv(authenc(hmac(sha384),"
4250479bcc7cSHerbert Xu 					    "rfc3686(ctr(aes))))",
4251479bcc7cSHerbert Xu 				.cra_driver_name = "seqiv-authenc-hmac-sha384-"
4252479bcc7cSHerbert Xu 						   "rfc3686-ctr-aes-caam",
4253479bcc7cSHerbert Xu 				.cra_blocksize = 1,
4254479bcc7cSHerbert Xu 			},
4255479bcc7cSHerbert Xu 			.setkey = aead_setkey,
4256479bcc7cSHerbert Xu 			.setauthsize = aead_setauthsize,
4257479bcc7cSHerbert Xu 			.encrypt = aead_encrypt,
4258479bcc7cSHerbert Xu 			.decrypt = aead_givdecrypt,
4259479bcc7cSHerbert Xu 			.ivsize = CTR_RFC3686_IV_SIZE,
4260479bcc7cSHerbert Xu 			.maxauthsize = SHA384_DIGEST_SIZE,
4261479bcc7cSHerbert Xu 		},
4262479bcc7cSHerbert Xu 		.caam = {
4263479bcc7cSHerbert Xu 			.class1_alg_type = OP_ALG_ALGSEL_AES |
4264479bcc7cSHerbert Xu 					   OP_ALG_AAI_CTR_MOD128,
4265479bcc7cSHerbert Xu 			.class2_alg_type = OP_ALG_ALGSEL_SHA384 |
4266479bcc7cSHerbert Xu 					   OP_ALG_AAI_HMAC_PRECOMP,
4267479bcc7cSHerbert Xu 			.alg_op = OP_ALG_ALGSEL_SHA384 | OP_ALG_AAI_HMAC,
4268479bcc7cSHerbert Xu 			.rfc3686 = true,
4269479bcc7cSHerbert Xu 			.geniv = true,
4270479bcc7cSHerbert Xu 		},
4271479bcc7cSHerbert Xu 	},
4272479bcc7cSHerbert Xu 	{
4273479bcc7cSHerbert Xu 		.aead = {
4274479bcc7cSHerbert Xu 			.base = {
4275479bcc7cSHerbert Xu 				.cra_name = "authenc(hmac(sha512),"
4276479bcc7cSHerbert Xu 					    "rfc3686(ctr(aes)))",
4277479bcc7cSHerbert Xu 				.cra_driver_name = "authenc-hmac-sha512-"
4278479bcc7cSHerbert Xu 						   "rfc3686-ctr-aes-caam",
4279479bcc7cSHerbert Xu 				.cra_blocksize = 1,
4280479bcc7cSHerbert Xu 			},
4281479bcc7cSHerbert Xu 			.setkey = aead_setkey,
4282479bcc7cSHerbert Xu 			.setauthsize = aead_setauthsize,
4283479bcc7cSHerbert Xu 			.encrypt = aead_encrypt,
4284479bcc7cSHerbert Xu 			.decrypt = aead_decrypt,
4285479bcc7cSHerbert Xu 			.ivsize = CTR_RFC3686_IV_SIZE,
4286479bcc7cSHerbert Xu 			.maxauthsize = SHA512_DIGEST_SIZE,
4287479bcc7cSHerbert Xu 		},
4288479bcc7cSHerbert Xu 		.caam = {
4289479bcc7cSHerbert Xu 			.class1_alg_type = OP_ALG_ALGSEL_AES |
4290479bcc7cSHerbert Xu 					   OP_ALG_AAI_CTR_MOD128,
4291479bcc7cSHerbert Xu 			.class2_alg_type = OP_ALG_ALGSEL_SHA512 |
4292479bcc7cSHerbert Xu 					   OP_ALG_AAI_HMAC_PRECOMP,
4293479bcc7cSHerbert Xu 			.alg_op = OP_ALG_ALGSEL_SHA512 | OP_ALG_AAI_HMAC,
4294479bcc7cSHerbert Xu 			.rfc3686 = true,
4295479bcc7cSHerbert Xu 		},
4296479bcc7cSHerbert Xu 	},
4297479bcc7cSHerbert Xu 	{
4298479bcc7cSHerbert Xu 		.aead = {
4299479bcc7cSHerbert Xu 			.base = {
4300479bcc7cSHerbert Xu 				.cra_name = "seqiv(authenc(hmac(sha512),"
4301479bcc7cSHerbert Xu 					    "rfc3686(ctr(aes))))",
4302479bcc7cSHerbert Xu 				.cra_driver_name = "seqiv-authenc-hmac-sha512-"
4303479bcc7cSHerbert Xu 						   "rfc3686-ctr-aes-caam",
4304479bcc7cSHerbert Xu 				.cra_blocksize = 1,
4305479bcc7cSHerbert Xu 			},
4306479bcc7cSHerbert Xu 			.setkey = aead_setkey,
4307479bcc7cSHerbert Xu 			.setauthsize = aead_setauthsize,
4308479bcc7cSHerbert Xu 			.encrypt = aead_encrypt,
4309479bcc7cSHerbert Xu 			.decrypt = aead_givdecrypt,
4310479bcc7cSHerbert Xu 			.ivsize = CTR_RFC3686_IV_SIZE,
4311479bcc7cSHerbert Xu 			.maxauthsize = SHA512_DIGEST_SIZE,
4312479bcc7cSHerbert Xu 		},
4313479bcc7cSHerbert Xu 		.caam = {
4314479bcc7cSHerbert Xu 			.class1_alg_type = OP_ALG_ALGSEL_AES |
4315479bcc7cSHerbert Xu 					   OP_ALG_AAI_CTR_MOD128,
4316479bcc7cSHerbert Xu 			.class2_alg_type = OP_ALG_ALGSEL_SHA512 |
4317479bcc7cSHerbert Xu 					   OP_ALG_AAI_HMAC_PRECOMP,
4318479bcc7cSHerbert Xu 			.alg_op = OP_ALG_ALGSEL_SHA512 | OP_ALG_AAI_HMAC,
4319479bcc7cSHerbert Xu 			.rfc3686 = true,
4320479bcc7cSHerbert Xu 			.geniv = true,
4321479bcc7cSHerbert Xu 		},
4322479bcc7cSHerbert Xu 	},
4323f2147b88SHerbert Xu };
4324f2147b88SHerbert Xu 
4325f2147b88SHerbert Xu struct caam_crypto_alg {
4326f2147b88SHerbert Xu 	struct crypto_alg crypto_alg;
4327f2147b88SHerbert Xu 	struct list_head entry;
4328f2147b88SHerbert Xu 	struct caam_alg_entry caam;
4329f2147b88SHerbert Xu };
4330f2147b88SHerbert Xu 
4331f2147b88SHerbert Xu static int caam_init_common(struct caam_ctx *ctx, struct caam_alg_entry *caam)
4332f2147b88SHerbert Xu {
4333f2147b88SHerbert Xu 	ctx->jrdev = caam_jr_alloc();
4334f2147b88SHerbert Xu 	if (IS_ERR(ctx->jrdev)) {
4335f2147b88SHerbert Xu 		pr_err("Job Ring Device allocation for transform failed\n");
4336f2147b88SHerbert Xu 		return PTR_ERR(ctx->jrdev);
4337f2147b88SHerbert Xu 	}
4338f2147b88SHerbert Xu 
4339f2147b88SHerbert Xu 	/* copy descriptor header template value */
4340f2147b88SHerbert Xu 	ctx->class1_alg_type = OP_TYPE_CLASS1_ALG | caam->class1_alg_type;
4341f2147b88SHerbert Xu 	ctx->class2_alg_type = OP_TYPE_CLASS2_ALG | caam->class2_alg_type;
4342f2147b88SHerbert Xu 	ctx->alg_op = OP_TYPE_CLASS2_ALG | caam->alg_op;
4343f2147b88SHerbert Xu 
4344f2147b88SHerbert Xu 	return 0;
4345f2147b88SHerbert Xu }
4346f2147b88SHerbert Xu 
43478e8ec596SKim Phillips static int caam_cra_init(struct crypto_tfm *tfm)
43488e8ec596SKim Phillips {
43498e8ec596SKim Phillips 	struct crypto_alg *alg = tfm->__crt_alg;
43508e8ec596SKim Phillips 	struct caam_crypto_alg *caam_alg =
43518e8ec596SKim Phillips 		 container_of(alg, struct caam_crypto_alg, crypto_alg);
43528e8ec596SKim Phillips 	struct caam_ctx *ctx = crypto_tfm_ctx(tfm);
43538e8ec596SKim Phillips 
4354f2147b88SHerbert Xu 	return caam_init_common(ctx, &caam_alg->caam);
4355cfc6f11bSRuchika Gupta }
43568e8ec596SKim Phillips 
4357f2147b88SHerbert Xu static int caam_aead_init(struct crypto_aead *tfm)
43588e8ec596SKim Phillips {
4359f2147b88SHerbert Xu 	struct aead_alg *alg = crypto_aead_alg(tfm);
4360f2147b88SHerbert Xu 	struct caam_aead_alg *caam_alg =
4361f2147b88SHerbert Xu 		 container_of(alg, struct caam_aead_alg, aead);
4362f2147b88SHerbert Xu 	struct caam_ctx *ctx = crypto_aead_ctx(tfm);
43638e8ec596SKim Phillips 
4364f2147b88SHerbert Xu 	return caam_init_common(ctx, &caam_alg->caam);
4365f2147b88SHerbert Xu }
4366f2147b88SHerbert Xu 
4367f2147b88SHerbert Xu static void caam_exit_common(struct caam_ctx *ctx)
4368f2147b88SHerbert Xu {
43691acebad3SYuan Kang 	if (ctx->sh_desc_enc_dma &&
43701acebad3SYuan Kang 	    !dma_mapping_error(ctx->jrdev, ctx->sh_desc_enc_dma))
43711acebad3SYuan Kang 		dma_unmap_single(ctx->jrdev, ctx->sh_desc_enc_dma,
43721acebad3SYuan Kang 				 desc_bytes(ctx->sh_desc_enc), DMA_TO_DEVICE);
43731acebad3SYuan Kang 	if (ctx->sh_desc_dec_dma &&
43741acebad3SYuan Kang 	    !dma_mapping_error(ctx->jrdev, ctx->sh_desc_dec_dma))
43751acebad3SYuan Kang 		dma_unmap_single(ctx->jrdev, ctx->sh_desc_dec_dma,
43761acebad3SYuan Kang 				 desc_bytes(ctx->sh_desc_dec), DMA_TO_DEVICE);
43771acebad3SYuan Kang 	if (ctx->sh_desc_givenc_dma &&
43781acebad3SYuan Kang 	    !dma_mapping_error(ctx->jrdev, ctx->sh_desc_givenc_dma))
43791acebad3SYuan Kang 		dma_unmap_single(ctx->jrdev, ctx->sh_desc_givenc_dma,
43801acebad3SYuan Kang 				 desc_bytes(ctx->sh_desc_givenc),
43814427b1b4SKim Phillips 				 DMA_TO_DEVICE);
4382ec31eed7SHoria Geanta 	if (ctx->key_dma &&
4383ec31eed7SHoria Geanta 	    !dma_mapping_error(ctx->jrdev, ctx->key_dma))
4384ec31eed7SHoria Geanta 		dma_unmap_single(ctx->jrdev, ctx->key_dma,
4385ec31eed7SHoria Geanta 				 ctx->enckeylen + ctx->split_key_pad_len,
4386ec31eed7SHoria Geanta 				 DMA_TO_DEVICE);
4387cfc6f11bSRuchika Gupta 
4388cfc6f11bSRuchika Gupta 	caam_jr_free(ctx->jrdev);
43898e8ec596SKim Phillips }
43908e8ec596SKim Phillips 
4391f2147b88SHerbert Xu static void caam_cra_exit(struct crypto_tfm *tfm)
4392f2147b88SHerbert Xu {
4393f2147b88SHerbert Xu 	caam_exit_common(crypto_tfm_ctx(tfm));
4394f2147b88SHerbert Xu }
4395f2147b88SHerbert Xu 
4396f2147b88SHerbert Xu static void caam_aead_exit(struct crypto_aead *tfm)
4397f2147b88SHerbert Xu {
4398f2147b88SHerbert Xu 	caam_exit_common(crypto_aead_ctx(tfm));
4399f2147b88SHerbert Xu }
4400f2147b88SHerbert Xu 
44018e8ec596SKim Phillips static void __exit caam_algapi_exit(void)
44028e8ec596SKim Phillips {
44038e8ec596SKim Phillips 
44048e8ec596SKim Phillips 	struct caam_crypto_alg *t_alg, *n;
4405f2147b88SHerbert Xu 	int i;
4406f2147b88SHerbert Xu 
4407f2147b88SHerbert Xu 	for (i = 0; i < ARRAY_SIZE(driver_aeads); i++) {
4408f2147b88SHerbert Xu 		struct caam_aead_alg *t_alg = driver_aeads + i;
4409f2147b88SHerbert Xu 
4410f2147b88SHerbert Xu 		if (t_alg->registered)
4411f2147b88SHerbert Xu 			crypto_unregister_aead(&t_alg->aead);
4412f2147b88SHerbert Xu 	}
44138e8ec596SKim Phillips 
4414cfc6f11bSRuchika Gupta 	if (!alg_list.next)
44158e8ec596SKim Phillips 		return;
44168e8ec596SKim Phillips 
4417cfc6f11bSRuchika Gupta 	list_for_each_entry_safe(t_alg, n, &alg_list, entry) {
44188e8ec596SKim Phillips 		crypto_unregister_alg(&t_alg->crypto_alg);
44198e8ec596SKim Phillips 		list_del(&t_alg->entry);
44208e8ec596SKim Phillips 		kfree(t_alg);
44218e8ec596SKim Phillips 	}
44228e8ec596SKim Phillips }
44238e8ec596SKim Phillips 
4424cfc6f11bSRuchika Gupta static struct caam_crypto_alg *caam_alg_alloc(struct caam_alg_template
44258e8ec596SKim Phillips 					      *template)
44268e8ec596SKim Phillips {
44278e8ec596SKim Phillips 	struct caam_crypto_alg *t_alg;
44288e8ec596SKim Phillips 	struct crypto_alg *alg;
44298e8ec596SKim Phillips 
44309c4f9733SFabio Estevam 	t_alg = kzalloc(sizeof(*t_alg), GFP_KERNEL);
44318e8ec596SKim Phillips 	if (!t_alg) {
4432cfc6f11bSRuchika Gupta 		pr_err("failed to allocate t_alg\n");
44338e8ec596SKim Phillips 		return ERR_PTR(-ENOMEM);
44348e8ec596SKim Phillips 	}
44358e8ec596SKim Phillips 
44368e8ec596SKim Phillips 	alg = &t_alg->crypto_alg;
44378e8ec596SKim Phillips 
44388e8ec596SKim Phillips 	snprintf(alg->cra_name, CRYPTO_MAX_ALG_NAME, "%s", template->name);
44398e8ec596SKim Phillips 	snprintf(alg->cra_driver_name, CRYPTO_MAX_ALG_NAME, "%s",
44408e8ec596SKim Phillips 		 template->driver_name);
44418e8ec596SKim Phillips 	alg->cra_module = THIS_MODULE;
44428e8ec596SKim Phillips 	alg->cra_init = caam_cra_init;
44438e8ec596SKim Phillips 	alg->cra_exit = caam_cra_exit;
44448e8ec596SKim Phillips 	alg->cra_priority = CAAM_CRA_PRIORITY;
44458e8ec596SKim Phillips 	alg->cra_blocksize = template->blocksize;
44468e8ec596SKim Phillips 	alg->cra_alignmask = 0;
44478e8ec596SKim Phillips 	alg->cra_ctxsize = sizeof(struct caam_ctx);
4448d912bb76SNikos Mavrogiannopoulos 	alg->cra_flags = CRYPTO_ALG_ASYNC | CRYPTO_ALG_KERN_DRIVER_ONLY |
4449d912bb76SNikos Mavrogiannopoulos 			 template->type;
4450885e9e2fSYuan Kang 	switch (template->type) {
44517222d1a3SCatalin Vasile 	case CRYPTO_ALG_TYPE_GIVCIPHER:
44527222d1a3SCatalin Vasile 		alg->cra_type = &crypto_givcipher_type;
44537222d1a3SCatalin Vasile 		alg->cra_ablkcipher = template->template_ablkcipher;
44547222d1a3SCatalin Vasile 		break;
4455acdca31dSYuan Kang 	case CRYPTO_ALG_TYPE_ABLKCIPHER:
4456acdca31dSYuan Kang 		alg->cra_type = &crypto_ablkcipher_type;
4457acdca31dSYuan Kang 		alg->cra_ablkcipher = template->template_ablkcipher;
4458acdca31dSYuan Kang 		break;
4459885e9e2fSYuan Kang 	}
44608e8ec596SKim Phillips 
4461f2147b88SHerbert Xu 	t_alg->caam.class1_alg_type = template->class1_alg_type;
4462f2147b88SHerbert Xu 	t_alg->caam.class2_alg_type = template->class2_alg_type;
4463f2147b88SHerbert Xu 	t_alg->caam.alg_op = template->alg_op;
44648e8ec596SKim Phillips 
44658e8ec596SKim Phillips 	return t_alg;
44668e8ec596SKim Phillips }
44678e8ec596SKim Phillips 
4468f2147b88SHerbert Xu static void caam_aead_alg_init(struct caam_aead_alg *t_alg)
4469f2147b88SHerbert Xu {
4470f2147b88SHerbert Xu 	struct aead_alg *alg = &t_alg->aead;
4471f2147b88SHerbert Xu 
4472f2147b88SHerbert Xu 	alg->base.cra_module = THIS_MODULE;
4473f2147b88SHerbert Xu 	alg->base.cra_priority = CAAM_CRA_PRIORITY;
4474f2147b88SHerbert Xu 	alg->base.cra_ctxsize = sizeof(struct caam_ctx);
44755e4b8c1fSHerbert Xu 	alg->base.cra_flags = CRYPTO_ALG_ASYNC | CRYPTO_ALG_KERN_DRIVER_ONLY;
4476f2147b88SHerbert Xu 
4477f2147b88SHerbert Xu 	alg->init = caam_aead_init;
4478f2147b88SHerbert Xu 	alg->exit = caam_aead_exit;
4479f2147b88SHerbert Xu }
4480f2147b88SHerbert Xu 
44818e8ec596SKim Phillips static int __init caam_algapi_init(void)
44828e8ec596SKim Phillips {
448335af6403SRuchika Gupta 	struct device_node *dev_node;
448435af6403SRuchika Gupta 	struct platform_device *pdev;
448535af6403SRuchika Gupta 	struct device *ctrldev;
4486bf83490eSVictoria Milhoan 	struct caam_drv_private *priv;
44878e8ec596SKim Phillips 	int i = 0, err = 0;
4488bf83490eSVictoria Milhoan 	u32 cha_vid, cha_inst, des_inst, aes_inst, md_inst;
4489bf83490eSVictoria Milhoan 	unsigned int md_limit = SHA512_DIGEST_SIZE;
4490f2147b88SHerbert Xu 	bool registered = false;
44918e8ec596SKim Phillips 
449235af6403SRuchika Gupta 	dev_node = of_find_compatible_node(NULL, NULL, "fsl,sec-v4.0");
449335af6403SRuchika Gupta 	if (!dev_node) {
449435af6403SRuchika Gupta 		dev_node = of_find_compatible_node(NULL, NULL, "fsl,sec4.0");
449535af6403SRuchika Gupta 		if (!dev_node)
449635af6403SRuchika Gupta 			return -ENODEV;
449735af6403SRuchika Gupta 	}
449835af6403SRuchika Gupta 
449935af6403SRuchika Gupta 	pdev = of_find_device_by_node(dev_node);
450035af6403SRuchika Gupta 	if (!pdev) {
450135af6403SRuchika Gupta 		of_node_put(dev_node);
450235af6403SRuchika Gupta 		return -ENODEV;
450335af6403SRuchika Gupta 	}
450435af6403SRuchika Gupta 
450535af6403SRuchika Gupta 	ctrldev = &pdev->dev;
450635af6403SRuchika Gupta 	priv = dev_get_drvdata(ctrldev);
450735af6403SRuchika Gupta 	of_node_put(dev_node);
450835af6403SRuchika Gupta 
450935af6403SRuchika Gupta 	/*
451035af6403SRuchika Gupta 	 * If priv is NULL, it's probably because the caam driver wasn't
451135af6403SRuchika Gupta 	 * properly initialized (e.g. RNG4 init failed). Thus, bail out here.
451235af6403SRuchika Gupta 	 */
451335af6403SRuchika Gupta 	if (!priv)
451435af6403SRuchika Gupta 		return -ENODEV;
451535af6403SRuchika Gupta 
451635af6403SRuchika Gupta 
4517cfc6f11bSRuchika Gupta 	INIT_LIST_HEAD(&alg_list);
45188e8ec596SKim Phillips 
4519bf83490eSVictoria Milhoan 	/*
4520bf83490eSVictoria Milhoan 	 * Register crypto algorithms the device supports.
4521bf83490eSVictoria Milhoan 	 * First, detect presence and attributes of DES, AES, and MD blocks.
4522bf83490eSVictoria Milhoan 	 */
4523bf83490eSVictoria Milhoan 	cha_vid = rd_reg32(&priv->ctrl->perfmon.cha_id_ls);
4524bf83490eSVictoria Milhoan 	cha_inst = rd_reg32(&priv->ctrl->perfmon.cha_num_ls);
4525bf83490eSVictoria Milhoan 	des_inst = (cha_inst & CHA_ID_LS_DES_MASK) >> CHA_ID_LS_DES_SHIFT;
4526bf83490eSVictoria Milhoan 	aes_inst = (cha_inst & CHA_ID_LS_AES_MASK) >> CHA_ID_LS_AES_SHIFT;
4527bf83490eSVictoria Milhoan 	md_inst = (cha_inst & CHA_ID_LS_MD_MASK) >> CHA_ID_LS_MD_SHIFT;
45288e8ec596SKim Phillips 
4529bf83490eSVictoria Milhoan 	/* If MD is present, limit digest size based on LP256 */
4530bf83490eSVictoria Milhoan 	if (md_inst && ((cha_vid & CHA_ID_LS_MD_MASK) == CHA_ID_LS_MD_LP256))
4531bf83490eSVictoria Milhoan 		md_limit = SHA256_DIGEST_SIZE;
4532bf83490eSVictoria Milhoan 
4533bf83490eSVictoria Milhoan 	for (i = 0; i < ARRAY_SIZE(driver_algs); i++) {
4534bf83490eSVictoria Milhoan 		struct caam_crypto_alg *t_alg;
4535bf83490eSVictoria Milhoan 		struct caam_alg_template *alg = driver_algs + i;
4536bf83490eSVictoria Milhoan 		u32 alg_sel = alg->class1_alg_type & OP_ALG_ALGSEL_MASK;
4537bf83490eSVictoria Milhoan 
4538bf83490eSVictoria Milhoan 		/* Skip DES algorithms if not supported by device */
4539bf83490eSVictoria Milhoan 		if (!des_inst &&
4540bf83490eSVictoria Milhoan 		    ((alg_sel == OP_ALG_ALGSEL_3DES) ||
4541bf83490eSVictoria Milhoan 		     (alg_sel == OP_ALG_ALGSEL_DES)))
4542bf83490eSVictoria Milhoan 				continue;
4543bf83490eSVictoria Milhoan 
4544bf83490eSVictoria Milhoan 		/* Skip AES algorithms if not supported by device */
4545bf83490eSVictoria Milhoan 		if (!aes_inst && (alg_sel == OP_ALG_ALGSEL_AES))
4546bf83490eSVictoria Milhoan 				continue;
4547bf83490eSVictoria Milhoan 
4548bf83490eSVictoria Milhoan 		t_alg = caam_alg_alloc(alg);
45498e8ec596SKim Phillips 		if (IS_ERR(t_alg)) {
45508e8ec596SKim Phillips 			err = PTR_ERR(t_alg);
4551bf83490eSVictoria Milhoan 			pr_warn("%s alg allocation failed\n", alg->driver_name);
45528e8ec596SKim Phillips 			continue;
45538e8ec596SKim Phillips 		}
45548e8ec596SKim Phillips 
45558e8ec596SKim Phillips 		err = crypto_register_alg(&t_alg->crypto_alg);
45568e8ec596SKim Phillips 		if (err) {
4557cfc6f11bSRuchika Gupta 			pr_warn("%s alg registration failed\n",
45588e8ec596SKim Phillips 				t_alg->crypto_alg.cra_driver_name);
45598e8ec596SKim Phillips 			kfree(t_alg);
4560f2147b88SHerbert Xu 			continue;
45618e8ec596SKim Phillips 		}
4562f2147b88SHerbert Xu 
4563f2147b88SHerbert Xu 		list_add_tail(&t_alg->entry, &alg_list);
4564f2147b88SHerbert Xu 		registered = true;
4565f2147b88SHerbert Xu 	}
4566f2147b88SHerbert Xu 
4567f2147b88SHerbert Xu 	for (i = 0; i < ARRAY_SIZE(driver_aeads); i++) {
4568f2147b88SHerbert Xu 		struct caam_aead_alg *t_alg = driver_aeads + i;
4569bf83490eSVictoria Milhoan 		u32 c1_alg_sel = t_alg->caam.class1_alg_type &
4570bf83490eSVictoria Milhoan 				 OP_ALG_ALGSEL_MASK;
4571bf83490eSVictoria Milhoan 		u32 c2_alg_sel = t_alg->caam.class2_alg_type &
4572bf83490eSVictoria Milhoan 				 OP_ALG_ALGSEL_MASK;
4573bf83490eSVictoria Milhoan 		u32 alg_aai = t_alg->caam.class1_alg_type & OP_ALG_AAI_MASK;
4574bf83490eSVictoria Milhoan 
4575bf83490eSVictoria Milhoan 		/* Skip DES algorithms if not supported by device */
4576bf83490eSVictoria Milhoan 		if (!des_inst &&
4577bf83490eSVictoria Milhoan 		    ((c1_alg_sel == OP_ALG_ALGSEL_3DES) ||
4578bf83490eSVictoria Milhoan 		     (c1_alg_sel == OP_ALG_ALGSEL_DES)))
4579bf83490eSVictoria Milhoan 				continue;
4580bf83490eSVictoria Milhoan 
4581bf83490eSVictoria Milhoan 		/* Skip AES algorithms if not supported by device */
4582bf83490eSVictoria Milhoan 		if (!aes_inst && (c1_alg_sel == OP_ALG_ALGSEL_AES))
4583bf83490eSVictoria Milhoan 				continue;
4584bf83490eSVictoria Milhoan 
4585bf83490eSVictoria Milhoan 		/*
4586bf83490eSVictoria Milhoan 		 * Check support for AES algorithms not available
4587bf83490eSVictoria Milhoan 		 * on LP devices.
4588bf83490eSVictoria Milhoan 		 */
4589bf83490eSVictoria Milhoan 		if ((cha_vid & CHA_ID_LS_AES_MASK) == CHA_ID_LS_AES_LP)
4590bf83490eSVictoria Milhoan 			if (alg_aai == OP_ALG_AAI_GCM)
4591bf83490eSVictoria Milhoan 				continue;
4592bf83490eSVictoria Milhoan 
4593bf83490eSVictoria Milhoan 		/*
4594bf83490eSVictoria Milhoan 		 * Skip algorithms requiring message digests
4595bf83490eSVictoria Milhoan 		 * if MD or MD size is not supported by device.
4596bf83490eSVictoria Milhoan 		 */
4597bf83490eSVictoria Milhoan 		if (c2_alg_sel &&
4598bf83490eSVictoria Milhoan 		    (!md_inst || (t_alg->aead.maxauthsize > md_limit)))
4599bf83490eSVictoria Milhoan 				continue;
4600f2147b88SHerbert Xu 
4601f2147b88SHerbert Xu 		caam_aead_alg_init(t_alg);
4602f2147b88SHerbert Xu 
4603f2147b88SHerbert Xu 		err = crypto_register_aead(&t_alg->aead);
4604f2147b88SHerbert Xu 		if (err) {
4605f2147b88SHerbert Xu 			pr_warn("%s alg registration failed\n",
4606f2147b88SHerbert Xu 				t_alg->aead.base.cra_driver_name);
4607f2147b88SHerbert Xu 			continue;
4608f2147b88SHerbert Xu 		}
4609f2147b88SHerbert Xu 
4610f2147b88SHerbert Xu 		t_alg->registered = true;
4611f2147b88SHerbert Xu 		registered = true;
4612f2147b88SHerbert Xu 	}
4613f2147b88SHerbert Xu 
4614f2147b88SHerbert Xu 	if (registered)
4615cfc6f11bSRuchika Gupta 		pr_info("caam algorithms registered in /proc/crypto\n");
46168e8ec596SKim Phillips 
46178e8ec596SKim Phillips 	return err;
46188e8ec596SKim Phillips }
46198e8ec596SKim Phillips 
46208e8ec596SKim Phillips module_init(caam_algapi_init);
46218e8ec596SKim Phillips module_exit(caam_algapi_exit);
46228e8ec596SKim Phillips 
46238e8ec596SKim Phillips MODULE_LICENSE("GPL");
46248e8ec596SKim Phillips MODULE_DESCRIPTION("FSL CAAM support for crypto API");
46258e8ec596SKim Phillips MODULE_AUTHOR("Freescale Semiconductor - NMG/STC");
4626