Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    1) // SPDX-License-Identifier: GPL-2.0+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    3)  * Shared descriptors for aead, skcipher algorithms
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    4)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    5)  * Copyright 2016-2019 NXP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    6)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    7) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    8) #include "compat.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    9) #include "desc_constr.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   10) #include "caamalg_desc.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   11) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   12) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   13)  * For aead functions, read payload and write payload,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   14)  * both of which are specified in req->src and req->dst
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   15)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   16) static inline void aead_append_src_dst(u32 *desc, u32 msg_type)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   17) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   18) 	append_seq_fifo_store(desc, 0, FIFOST_TYPE_MESSAGE_DATA | KEY_VLF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   19) 	append_seq_fifo_load(desc, 0, FIFOLD_CLASS_BOTH |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   20) 			     KEY_VLF | msg_type | FIFOLD_TYPE_LASTBOTH);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   21) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   22) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   23) /* Set DK bit in class 1 operation if shared */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   24) static inline void append_dec_op1(u32 *desc, u32 type)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   25) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   26) 	u32 *jump_cmd, *uncond_jump_cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   27) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   28) 	/* DK bit is valid only for AES */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   29) 	if ((type & OP_ALG_ALGSEL_MASK) != OP_ALG_ALGSEL_AES) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   30) 		append_operation(desc, type | OP_ALG_AS_INITFINAL |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   31) 				 OP_ALG_DECRYPT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   32) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   33) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   34) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   35) 	jump_cmd = append_jump(desc, JUMP_TEST_ALL | JUMP_COND_SHRD);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   36) 	append_operation(desc, type | OP_ALG_AS_INIT | OP_ALG_DECRYPT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   37) 	uncond_jump_cmd = append_jump(desc, JUMP_TEST_ALL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   38) 	set_jump_tgt_here(desc, jump_cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   39) 	append_operation(desc, type | OP_ALG_AS_INIT | OP_ALG_DECRYPT |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   40) 			 OP_ALG_AAI_DK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   41) 	set_jump_tgt_here(desc, uncond_jump_cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   42) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   43) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   44) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   45)  * cnstr_shdsc_aead_null_encap - IPSec ESP encapsulation shared descriptor
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   46)  *                               (non-protocol) with no (null) encryption.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   47)  * @desc: pointer to buffer used for descriptor construction
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   48)  * @adata: pointer to authentication transform definitions.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   49)  *         A split key is required for SEC Era < 6; the size of the split key
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   50)  *         is specified in this case. Valid algorithm values - one of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   51)  *         OP_ALG_ALGSEL_{MD5, SHA1, SHA224, SHA256, SHA384, SHA512} ANDed
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   52)  *         with OP_ALG_AAI_HMAC_PRECOMP.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   53)  * @icvsize: integrity check value (ICV) size (truncated or full)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   54)  * @era: SEC Era
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   55)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   56) void cnstr_shdsc_aead_null_encap(u32 * const desc, struct alginfo *adata,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   57) 				 unsigned int icvsize, int era)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   58) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   59) 	u32 *key_jump_cmd, *read_move_cmd, *write_move_cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   60) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   61) 	init_sh_desc(desc, HDR_SHARE_SERIAL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   62) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   63) 	/* Skip if already shared */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   64) 	key_jump_cmd = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   65) 				   JUMP_COND_SHRD);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   66) 	if (era < 6) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   67) 		if (adata->key_inline)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   68) 			append_key_as_imm(desc, adata->key_virt,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   69) 					  adata->keylen_pad, adata->keylen,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   70) 					  CLASS_2 | KEY_DEST_MDHA_SPLIT |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   71) 					  KEY_ENC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   72) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   73) 			append_key(desc, adata->key_dma, adata->keylen,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   74) 				   CLASS_2 | KEY_DEST_MDHA_SPLIT | KEY_ENC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   75) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   76) 		append_proto_dkp(desc, adata);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   77) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   78) 	set_jump_tgt_here(desc, key_jump_cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   79) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   80) 	/* assoclen + cryptlen = seqinlen */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   81) 	append_math_sub(desc, REG3, SEQINLEN, REG0, CAAM_CMD_SZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   82) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   83) 	/* Prepare to read and write cryptlen + assoclen bytes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   84) 	append_math_add(desc, VARSEQINLEN, ZERO, REG3, CAAM_CMD_SZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   85) 	append_math_add(desc, VARSEQOUTLEN, ZERO, REG3, CAAM_CMD_SZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   86) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   87) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   88) 	 * MOVE_LEN opcode is not available in all SEC HW revisions,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   89) 	 * thus need to do some magic, i.e. self-patch the descriptor
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   90) 	 * buffer.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   91) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   92) 	read_move_cmd = append_move(desc, MOVE_SRC_DESCBUF |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   93) 				    MOVE_DEST_MATH3 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   94) 				    (0x6 << MOVE_LEN_SHIFT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   95) 	write_move_cmd = append_move(desc, MOVE_SRC_MATH3 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   96) 				     MOVE_DEST_DESCBUF |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   97) 				     MOVE_WAITCOMP |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   98) 				     (0x8 << MOVE_LEN_SHIFT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   99) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  100) 	/* Class 2 operation */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  101) 	append_operation(desc, adata->algtype | OP_ALG_AS_INITFINAL |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  102) 			 OP_ALG_ENCRYPT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  103) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  104) 	/* Read and write cryptlen bytes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  105) 	aead_append_src_dst(desc, FIFOLD_TYPE_MSG | FIFOLD_TYPE_FLUSH1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  106) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  107) 	set_move_tgt_here(desc, read_move_cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  108) 	set_move_tgt_here(desc, write_move_cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  109) 	append_cmd(desc, CMD_LOAD | DISABLE_AUTO_INFO_FIFO);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  110) 	append_move(desc, MOVE_SRC_INFIFO_CL | MOVE_DEST_OUTFIFO |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  111) 		    MOVE_AUX_LS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  112) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  113) 	/* Write ICV */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  114) 	append_seq_store(desc, icvsize, LDST_CLASS_2_CCB |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  115) 			 LDST_SRCDST_BYTE_CONTEXT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  116) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  117) 	print_hex_dump_debug("aead null enc shdesc@" __stringify(__LINE__)": ",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  118) 			     DUMP_PREFIX_ADDRESS, 16, 4, desc, desc_bytes(desc),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  119) 			     1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  120) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  121) EXPORT_SYMBOL(cnstr_shdsc_aead_null_encap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  122) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  123) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  124)  * cnstr_shdsc_aead_null_decap - IPSec ESP decapsulation shared descriptor
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  125)  *                               (non-protocol) with no (null) decryption.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  126)  * @desc: pointer to buffer used for descriptor construction
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  127)  * @adata: pointer to authentication transform definitions.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  128)  *         A split key is required for SEC Era < 6; the size of the split key
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  129)  *         is specified in this case. Valid algorithm values - one of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  130)  *         OP_ALG_ALGSEL_{MD5, SHA1, SHA224, SHA256, SHA384, SHA512} ANDed
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  131)  *         with OP_ALG_AAI_HMAC_PRECOMP.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  132)  * @icvsize: integrity check value (ICV) size (truncated or full)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  133)  * @era: SEC Era
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  134)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  135) void cnstr_shdsc_aead_null_decap(u32 * const desc, struct alginfo *adata,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  136) 				 unsigned int icvsize, int era)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  137) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  138) 	u32 *key_jump_cmd, *read_move_cmd, *write_move_cmd, *jump_cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  139) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  140) 	init_sh_desc(desc, HDR_SHARE_SERIAL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  141) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  142) 	/* Skip if already shared */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  143) 	key_jump_cmd = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  144) 				   JUMP_COND_SHRD);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  145) 	if (era < 6) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  146) 		if (adata->key_inline)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  147) 			append_key_as_imm(desc, adata->key_virt,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  148) 					  adata->keylen_pad, adata->keylen,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  149) 					  CLASS_2 | KEY_DEST_MDHA_SPLIT |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  150) 					  KEY_ENC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  151) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  152) 			append_key(desc, adata->key_dma, adata->keylen,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  153) 				   CLASS_2 | KEY_DEST_MDHA_SPLIT | KEY_ENC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  154) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  155) 		append_proto_dkp(desc, adata);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  156) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  157) 	set_jump_tgt_here(desc, key_jump_cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  158) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  159) 	/* Class 2 operation */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  160) 	append_operation(desc, adata->algtype | OP_ALG_AS_INITFINAL |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  161) 			 OP_ALG_DECRYPT | OP_ALG_ICV_ON);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  162) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  163) 	/* assoclen + cryptlen = seqoutlen */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  164) 	append_math_sub(desc, REG2, SEQOUTLEN, REG0, CAAM_CMD_SZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  165) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  166) 	/* Prepare to read and write cryptlen + assoclen bytes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  167) 	append_math_add(desc, VARSEQINLEN, ZERO, REG2, CAAM_CMD_SZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  168) 	append_math_add(desc, VARSEQOUTLEN, ZERO, REG2, CAAM_CMD_SZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  169) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  170) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  171) 	 * MOVE_LEN opcode is not available in all SEC HW revisions,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  172) 	 * thus need to do some magic, i.e. self-patch the descriptor
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  173) 	 * buffer.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  174) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  175) 	read_move_cmd = append_move(desc, MOVE_SRC_DESCBUF |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  176) 				    MOVE_DEST_MATH2 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  177) 				    (0x6 << MOVE_LEN_SHIFT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  178) 	write_move_cmd = append_move(desc, MOVE_SRC_MATH2 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  179) 				     MOVE_DEST_DESCBUF |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  180) 				     MOVE_WAITCOMP |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  181) 				     (0x8 << MOVE_LEN_SHIFT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  182) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  183) 	/* Read and write cryptlen bytes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  184) 	aead_append_src_dst(desc, FIFOLD_TYPE_MSG | FIFOLD_TYPE_FLUSH1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  185) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  186) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  187) 	 * Insert a NOP here, since we need at least 4 instructions between
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  188) 	 * code patching the descriptor buffer and the location being patched.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  189) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  190) 	jump_cmd = append_jump(desc, JUMP_TEST_ALL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  191) 	set_jump_tgt_here(desc, jump_cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  192) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  193) 	set_move_tgt_here(desc, read_move_cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  194) 	set_move_tgt_here(desc, write_move_cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  195) 	append_cmd(desc, CMD_LOAD | DISABLE_AUTO_INFO_FIFO);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  196) 	append_move(desc, MOVE_SRC_INFIFO_CL | MOVE_DEST_OUTFIFO |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  197) 		    MOVE_AUX_LS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  198) 	append_cmd(desc, CMD_LOAD | ENABLE_AUTO_INFO_FIFO);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  199) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  200) 	/* Load ICV */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  201) 	append_seq_fifo_load(desc, icvsize, FIFOLD_CLASS_CLASS2 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  202) 			     FIFOLD_TYPE_LAST2 | FIFOLD_TYPE_ICV);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  203) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  204) 	print_hex_dump_debug("aead null dec shdesc@" __stringify(__LINE__)": ",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  205) 			     DUMP_PREFIX_ADDRESS, 16, 4, desc, desc_bytes(desc),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  206) 			     1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  207) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  208) EXPORT_SYMBOL(cnstr_shdsc_aead_null_decap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  209) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  210) static void init_sh_desc_key_aead(u32 * const desc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  211) 				  struct alginfo * const cdata,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  212) 				  struct alginfo * const adata,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  213) 				  const bool is_rfc3686, u32 *nonce, int era)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  214) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  215) 	u32 *key_jump_cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  216) 	unsigned int enckeylen = cdata->keylen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  217) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  218) 	/* Note: Context registers are saved. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  219) 	init_sh_desc(desc, HDR_SHARE_SERIAL | HDR_SAVECTX);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  220) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  221) 	/* Skip if already shared */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  222) 	key_jump_cmd = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  223) 				   JUMP_COND_SHRD);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  224) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  225) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  226) 	 * RFC3686 specific:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  227) 	 *	| key = {AUTH_KEY, ENC_KEY, NONCE}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  228) 	 *	| enckeylen = encryption key size + nonce size
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  229) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  230) 	if (is_rfc3686)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  231) 		enckeylen -= CTR_RFC3686_NONCE_SIZE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  232) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  233) 	if (era < 6) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  234) 		if (adata->key_inline)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  235) 			append_key_as_imm(desc, adata->key_virt,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  236) 					  adata->keylen_pad, adata->keylen,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  237) 					  CLASS_2 | KEY_DEST_MDHA_SPLIT |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  238) 					  KEY_ENC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  239) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  240) 			append_key(desc, adata->key_dma, adata->keylen,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  241) 				   CLASS_2 | KEY_DEST_MDHA_SPLIT | KEY_ENC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  242) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  243) 		append_proto_dkp(desc, adata);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  244) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  245) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  246) 	if (cdata->key_inline)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  247) 		append_key_as_imm(desc, cdata->key_virt, enckeylen,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  248) 				  enckeylen, CLASS_1 | KEY_DEST_CLASS_REG);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  249) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  250) 		append_key(desc, cdata->key_dma, enckeylen, CLASS_1 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  251) 			   KEY_DEST_CLASS_REG);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  252) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  253) 	/* Load Counter into CONTEXT1 reg */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  254) 	if (is_rfc3686) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  255) 		append_load_as_imm(desc, nonce, CTR_RFC3686_NONCE_SIZE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  256) 				   LDST_CLASS_IND_CCB |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  257) 				   LDST_SRCDST_BYTE_OUTFIFO | LDST_IMM);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  258) 		append_move(desc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  259) 			    MOVE_SRC_OUTFIFO |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  260) 			    MOVE_DEST_CLASS1CTX |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  261) 			    (16 << MOVE_OFFSET_SHIFT) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  262) 			    (CTR_RFC3686_NONCE_SIZE << MOVE_LEN_SHIFT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  263) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  264) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  265) 	set_jump_tgt_here(desc, key_jump_cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  266) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  267) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  268) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  269)  * cnstr_shdsc_aead_encap - IPSec ESP encapsulation shared descriptor
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  270)  *                          (non-protocol).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  271)  * @desc: pointer to buffer used for descriptor construction
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  272)  * @cdata: pointer to block cipher transform definitions
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  273)  *         Valid algorithm values - one of OP_ALG_ALGSEL_{AES, DES, 3DES} ANDed
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  274)  *         with OP_ALG_AAI_CBC or OP_ALG_AAI_CTR_MOD128.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  275)  * @adata: pointer to authentication transform definitions.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  276)  *         A split key is required for SEC Era < 6; the size of the split key
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  277)  *         is specified in this case. Valid algorithm values - one of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  278)  *         OP_ALG_ALGSEL_{MD5, SHA1, SHA224, SHA256, SHA384, SHA512} ANDed
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  279)  *         with OP_ALG_AAI_HMAC_PRECOMP.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  280)  * @ivsize: initialization vector size
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  281)  * @icvsize: integrity check value (ICV) size (truncated or full)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  282)  * @is_rfc3686: true when ctr(aes) is wrapped by rfc3686 template
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  283)  * @nonce: pointer to rfc3686 nonce
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  284)  * @ctx1_iv_off: IV offset in CONTEXT1 register
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  285)  * @is_qi: true when called from caam/qi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  286)  * @era: SEC Era
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  287)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  288) void cnstr_shdsc_aead_encap(u32 * const desc, struct alginfo *cdata,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  289) 			    struct alginfo *adata, unsigned int ivsize,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  290) 			    unsigned int icvsize, const bool is_rfc3686,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  291) 			    u32 *nonce, const u32 ctx1_iv_off, const bool is_qi,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  292) 			    int era)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  293) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  294) 	/* Note: Context registers are saved. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  295) 	init_sh_desc_key_aead(desc, cdata, adata, is_rfc3686, nonce, era);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  296) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  297) 	/* Class 2 operation */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  298) 	append_operation(desc, adata->algtype | OP_ALG_AS_INITFINAL |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  299) 			 OP_ALG_ENCRYPT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  300) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  301) 	if (is_qi) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  302) 		u32 *wait_load_cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  303) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  304) 		/* REG3 = assoclen */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  305) 		append_seq_load(desc, 4, LDST_CLASS_DECO |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  306) 				LDST_SRCDST_WORD_DECO_MATH3 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  307) 				(4 << LDST_OFFSET_SHIFT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  308) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  309) 		wait_load_cmd = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  310) 					    JUMP_COND_CALM | JUMP_COND_NCP |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  311) 					    JUMP_COND_NOP | JUMP_COND_NIP |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  312) 					    JUMP_COND_NIFP);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  313) 		set_jump_tgt_here(desc, wait_load_cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  314) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  315) 		append_seq_load(desc, ivsize, LDST_CLASS_1_CCB |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  316) 				LDST_SRCDST_BYTE_CONTEXT |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  317) 				(ctx1_iv_off << LDST_OFFSET_SHIFT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  318) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  319) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  320) 	/* Read and write assoclen bytes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  321) 	if (is_qi || era < 3) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  322) 		append_math_add(desc, VARSEQINLEN, ZERO, REG3, CAAM_CMD_SZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  323) 		append_math_add(desc, VARSEQOUTLEN, ZERO, REG3, CAAM_CMD_SZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  324) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  325) 		append_math_add(desc, VARSEQINLEN, ZERO, DPOVRD, CAAM_CMD_SZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  326) 		append_math_add(desc, VARSEQOUTLEN, ZERO, DPOVRD, CAAM_CMD_SZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  327) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  328) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  329) 	/* Skip assoc data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  330) 	append_seq_fifo_store(desc, 0, FIFOST_TYPE_SKIP | FIFOLDST_VLF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  331) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  332) 	/* read assoc before reading payload */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  333) 	append_seq_fifo_load(desc, 0, FIFOLD_CLASS_CLASS2 | FIFOLD_TYPE_MSG |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  334) 				      FIFOLDST_VLF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  335) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  336) 	/* Load Counter into CONTEXT1 reg */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  337) 	if (is_rfc3686)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  338) 		append_load_imm_be32(desc, 1, LDST_IMM | LDST_CLASS_1_CCB |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  339) 				     LDST_SRCDST_BYTE_CONTEXT |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  340) 				     ((ctx1_iv_off + CTR_RFC3686_IV_SIZE) <<
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  341) 				      LDST_OFFSET_SHIFT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  342) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  343) 	/* Class 1 operation */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  344) 	append_operation(desc, cdata->algtype | OP_ALG_AS_INITFINAL |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  345) 			 OP_ALG_ENCRYPT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  346) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  347) 	/* Read and write cryptlen bytes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  348) 	append_math_add(desc, VARSEQINLEN, SEQINLEN, REG0, CAAM_CMD_SZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  349) 	append_math_add(desc, VARSEQOUTLEN, SEQINLEN, REG0, CAAM_CMD_SZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  350) 	aead_append_src_dst(desc, FIFOLD_TYPE_MSG1OUT2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  351) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  352) 	/* Write ICV */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  353) 	append_seq_store(desc, icvsize, LDST_CLASS_2_CCB |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  354) 			 LDST_SRCDST_BYTE_CONTEXT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  355) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  356) 	print_hex_dump_debug("aead enc shdesc@" __stringify(__LINE__)": ",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  357) 			     DUMP_PREFIX_ADDRESS, 16, 4, desc, desc_bytes(desc),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  358) 			     1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  359) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  360) EXPORT_SYMBOL(cnstr_shdsc_aead_encap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  361) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  362) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  363)  * cnstr_shdsc_aead_decap - IPSec ESP decapsulation shared descriptor
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  364)  *                          (non-protocol).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  365)  * @desc: pointer to buffer used for descriptor construction
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  366)  * @cdata: pointer to block cipher transform definitions
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  367)  *         Valid algorithm values - one of OP_ALG_ALGSEL_{AES, DES, 3DES} ANDed
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  368)  *         with OP_ALG_AAI_CBC or OP_ALG_AAI_CTR_MOD128.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  369)  * @adata: pointer to authentication transform definitions.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  370)  *         A split key is required for SEC Era < 6; the size of the split key
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  371)  *         is specified in this case. Valid algorithm values - one of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  372)  *         OP_ALG_ALGSEL_{MD5, SHA1, SHA224, SHA256, SHA384, SHA512} ANDed
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  373)  *         with OP_ALG_AAI_HMAC_PRECOMP.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  374)  * @ivsize: initialization vector size
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  375)  * @icvsize: integrity check value (ICV) size (truncated or full)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  376)  * @geniv: whether to generate Encrypted Chain IV
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  377)  * @is_rfc3686: true when ctr(aes) is wrapped by rfc3686 template
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  378)  * @nonce: pointer to rfc3686 nonce
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  379)  * @ctx1_iv_off: IV offset in CONTEXT1 register
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  380)  * @is_qi: true when called from caam/qi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  381)  * @era: SEC Era
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  382)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  383) void cnstr_shdsc_aead_decap(u32 * const desc, struct alginfo *cdata,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  384) 			    struct alginfo *adata, unsigned int ivsize,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  385) 			    unsigned int icvsize, const bool geniv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  386) 			    const bool is_rfc3686, u32 *nonce,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  387) 			    const u32 ctx1_iv_off, const bool is_qi, int era)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  388) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  389) 	/* Note: Context registers are saved. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  390) 	init_sh_desc_key_aead(desc, cdata, adata, is_rfc3686, nonce, era);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  391) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  392) 	/* Class 2 operation */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  393) 	append_operation(desc, adata->algtype | OP_ALG_AS_INITFINAL |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  394) 			 OP_ALG_DECRYPT | OP_ALG_ICV_ON);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  395) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  396) 	if (is_qi) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  397) 		u32 *wait_load_cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  398) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  399) 		/* REG3 = assoclen */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  400) 		append_seq_load(desc, 4, LDST_CLASS_DECO |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  401) 				LDST_SRCDST_WORD_DECO_MATH3 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  402) 				(4 << LDST_OFFSET_SHIFT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  403) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  404) 		wait_load_cmd = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  405) 					    JUMP_COND_CALM | JUMP_COND_NCP |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  406) 					    JUMP_COND_NOP | JUMP_COND_NIP |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  407) 					    JUMP_COND_NIFP);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  408) 		set_jump_tgt_here(desc, wait_load_cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  409) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  410) 		if (!geniv)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  411) 			append_seq_load(desc, ivsize, LDST_CLASS_1_CCB |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  412) 					LDST_SRCDST_BYTE_CONTEXT |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  413) 					(ctx1_iv_off << LDST_OFFSET_SHIFT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  414) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  415) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  416) 	/* Read and write assoclen bytes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  417) 	if (is_qi || era < 3) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  418) 		append_math_add(desc, VARSEQINLEN, ZERO, REG3, CAAM_CMD_SZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  419) 		if (geniv)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  420) 			append_math_add_imm_u32(desc, VARSEQOUTLEN, REG3, IMM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  421) 						ivsize);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  422) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  423) 			append_math_add(desc, VARSEQOUTLEN, ZERO, REG3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  424) 					CAAM_CMD_SZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  425) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  426) 		append_math_add(desc, VARSEQINLEN, ZERO, DPOVRD, CAAM_CMD_SZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  427) 		if (geniv)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  428) 			append_math_add_imm_u32(desc, VARSEQOUTLEN, DPOVRD, IMM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  429) 						ivsize);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  430) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  431) 			append_math_add(desc, VARSEQOUTLEN, ZERO, DPOVRD,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  432) 					CAAM_CMD_SZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  433) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  434) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  435) 	/* Skip assoc data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  436) 	append_seq_fifo_store(desc, 0, FIFOST_TYPE_SKIP | FIFOLDST_VLF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  437) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  438) 	/* read assoc before reading payload */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  439) 	append_seq_fifo_load(desc, 0, FIFOLD_CLASS_CLASS2 | FIFOLD_TYPE_MSG |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  440) 			     KEY_VLF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  441) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  442) 	if (geniv) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  443) 		append_seq_load(desc, ivsize, LDST_CLASS_1_CCB |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  444) 				LDST_SRCDST_BYTE_CONTEXT |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  445) 				(ctx1_iv_off << LDST_OFFSET_SHIFT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  446) 		append_move(desc, MOVE_SRC_CLASS1CTX | MOVE_DEST_CLASS2INFIFO |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  447) 			    (ctx1_iv_off << MOVE_OFFSET_SHIFT) | ivsize);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  448) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  449) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  450) 	/* Load Counter into CONTEXT1 reg */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  451) 	if (is_rfc3686)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  452) 		append_load_imm_be32(desc, 1, LDST_IMM | LDST_CLASS_1_CCB |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  453) 				     LDST_SRCDST_BYTE_CONTEXT |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  454) 				     ((ctx1_iv_off + CTR_RFC3686_IV_SIZE) <<
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  455) 				      LDST_OFFSET_SHIFT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  456) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  457) 	/* Choose operation */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  458) 	if (ctx1_iv_off)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  459) 		append_operation(desc, cdata->algtype | OP_ALG_AS_INITFINAL |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  460) 				 OP_ALG_DECRYPT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  461) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  462) 		append_dec_op1(desc, cdata->algtype);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  463) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  464) 	/* Read and write cryptlen bytes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  465) 	append_math_add(desc, VARSEQINLEN, SEQOUTLEN, REG0, CAAM_CMD_SZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  466) 	append_math_add(desc, VARSEQOUTLEN, SEQOUTLEN, REG0, CAAM_CMD_SZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  467) 	aead_append_src_dst(desc, FIFOLD_TYPE_MSG);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  468) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  469) 	/* Load ICV */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  470) 	append_seq_fifo_load(desc, icvsize, FIFOLD_CLASS_CLASS2 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  471) 			     FIFOLD_TYPE_LAST2 | FIFOLD_TYPE_ICV);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  472) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  473) 	print_hex_dump_debug("aead dec shdesc@" __stringify(__LINE__)": ",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  474) 			     DUMP_PREFIX_ADDRESS, 16, 4, desc, desc_bytes(desc),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  475) 			     1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  476) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  477) EXPORT_SYMBOL(cnstr_shdsc_aead_decap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  478) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  479) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  480)  * cnstr_shdsc_aead_givencap - IPSec ESP encapsulation shared descriptor
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  481)  *                             (non-protocol) with HW-generated initialization
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  482)  *                             vector.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  483)  * @desc: pointer to buffer used for descriptor construction
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  484)  * @cdata: pointer to block cipher transform definitions
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  485)  *         Valid algorithm values - one of OP_ALG_ALGSEL_{AES, DES, 3DES} ANDed
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  486)  *         with OP_ALG_AAI_CBC or OP_ALG_AAI_CTR_MOD128.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  487)  * @adata: pointer to authentication transform definitions.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  488)  *         A split key is required for SEC Era < 6; the size of the split key
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  489)  *         is specified in this case. Valid algorithm values - one of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  490)  *         OP_ALG_ALGSEL_{MD5, SHA1, SHA224, SHA256, SHA384, SHA512} ANDed
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  491)  *         with OP_ALG_AAI_HMAC_PRECOMP.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  492)  * @ivsize: initialization vector size
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  493)  * @icvsize: integrity check value (ICV) size (truncated or full)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  494)  * @is_rfc3686: true when ctr(aes) is wrapped by rfc3686 template
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  495)  * @nonce: pointer to rfc3686 nonce
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  496)  * @ctx1_iv_off: IV offset in CONTEXT1 register
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  497)  * @is_qi: true when called from caam/qi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  498)  * @era: SEC Era
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  499)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  500) void cnstr_shdsc_aead_givencap(u32 * const desc, struct alginfo *cdata,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  501) 			       struct alginfo *adata, unsigned int ivsize,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  502) 			       unsigned int icvsize, const bool is_rfc3686,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  503) 			       u32 *nonce, const u32 ctx1_iv_off,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  504) 			       const bool is_qi, int era)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  505) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  506) 	u32 geniv, moveiv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  507) 	u32 *wait_cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  508) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  509) 	/* Note: Context registers are saved. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  510) 	init_sh_desc_key_aead(desc, cdata, adata, is_rfc3686, nonce, era);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  511) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  512) 	if (is_qi) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  513) 		u32 *wait_load_cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  514) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  515) 		/* REG3 = assoclen */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  516) 		append_seq_load(desc, 4, LDST_CLASS_DECO |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  517) 				LDST_SRCDST_WORD_DECO_MATH3 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  518) 				(4 << LDST_OFFSET_SHIFT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  519) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  520) 		wait_load_cmd = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  521) 					    JUMP_COND_CALM | JUMP_COND_NCP |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  522) 					    JUMP_COND_NOP | JUMP_COND_NIP |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  523) 					    JUMP_COND_NIFP);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  524) 		set_jump_tgt_here(desc, wait_load_cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  525) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  526) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  527) 	if (is_rfc3686) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  528) 		if (is_qi)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  529) 			append_seq_load(desc, ivsize, LDST_CLASS_1_CCB |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  530) 					LDST_SRCDST_BYTE_CONTEXT |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  531) 					(ctx1_iv_off << LDST_OFFSET_SHIFT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  532) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  533) 		goto copy_iv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  534) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  535) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  536) 	/* Generate IV */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  537) 	geniv = NFIFOENTRY_STYPE_PAD | NFIFOENTRY_DEST_DECO |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  538) 		NFIFOENTRY_DTYPE_MSG | NFIFOENTRY_LC1 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  539) 		NFIFOENTRY_PTYPE_RND | (ivsize << NFIFOENTRY_DLEN_SHIFT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  540) 	append_load_imm_u32(desc, geniv, LDST_CLASS_IND_CCB |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  541) 			    LDST_SRCDST_WORD_INFO_FIFO | LDST_IMM);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  542) 	append_cmd(desc, CMD_LOAD | DISABLE_AUTO_INFO_FIFO);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  543) 	append_move(desc, MOVE_WAITCOMP |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  544) 		    MOVE_SRC_INFIFO | MOVE_DEST_CLASS1CTX |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  545) 		    (ctx1_iv_off << MOVE_OFFSET_SHIFT) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  546) 		    (ivsize << MOVE_LEN_SHIFT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  547) 	append_cmd(desc, CMD_LOAD | ENABLE_AUTO_INFO_FIFO);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  548) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  549) copy_iv:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  550) 	/* Copy IV to class 1 context */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  551) 	append_move(desc, MOVE_SRC_CLASS1CTX | MOVE_DEST_OUTFIFO |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  552) 		    (ctx1_iv_off << MOVE_OFFSET_SHIFT) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  553) 		    (ivsize << MOVE_LEN_SHIFT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  554) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  555) 	/* Return to encryption */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  556) 	append_operation(desc, adata->algtype | OP_ALG_AS_INITFINAL |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  557) 			 OP_ALG_ENCRYPT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  558) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  559) 	/* Read and write assoclen bytes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  560) 	if (is_qi || era < 3) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  561) 		append_math_add(desc, VARSEQINLEN, ZERO, REG3, CAAM_CMD_SZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  562) 		append_math_add(desc, VARSEQOUTLEN, ZERO, REG3, CAAM_CMD_SZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  563) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  564) 		append_math_add(desc, VARSEQINLEN, ZERO, DPOVRD, CAAM_CMD_SZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  565) 		append_math_add(desc, VARSEQOUTLEN, ZERO, DPOVRD, CAAM_CMD_SZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  566) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  567) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  568) 	/* Skip assoc data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  569) 	append_seq_fifo_store(desc, 0, FIFOST_TYPE_SKIP | FIFOLDST_VLF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  570) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  571) 	/* read assoc before reading payload */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  572) 	append_seq_fifo_load(desc, 0, FIFOLD_CLASS_CLASS2 | FIFOLD_TYPE_MSG |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  573) 			     KEY_VLF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  574) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  575) 	/* Copy iv from outfifo to class 2 fifo */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  576) 	moveiv = NFIFOENTRY_STYPE_OFIFO | NFIFOENTRY_DEST_CLASS2 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  577) 		 NFIFOENTRY_DTYPE_MSG | (ivsize << NFIFOENTRY_DLEN_SHIFT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  578) 	append_load_imm_u32(desc, moveiv, LDST_CLASS_IND_CCB |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  579) 			    LDST_SRCDST_WORD_INFO_FIFO | LDST_IMM);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  580) 	append_load_imm_u32(desc, ivsize, LDST_CLASS_2_CCB |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  581) 			    LDST_SRCDST_WORD_DATASZ_REG | LDST_IMM);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  582) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  583) 	/* Load Counter into CONTEXT1 reg */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  584) 	if (is_rfc3686)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  585) 		append_load_imm_be32(desc, 1, LDST_IMM | LDST_CLASS_1_CCB |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  586) 				     LDST_SRCDST_BYTE_CONTEXT |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  587) 				     ((ctx1_iv_off + CTR_RFC3686_IV_SIZE) <<
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  588) 				      LDST_OFFSET_SHIFT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  589) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  590) 	/* Class 1 operation */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  591) 	append_operation(desc, cdata->algtype | OP_ALG_AS_INITFINAL |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  592) 			 OP_ALG_ENCRYPT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  593) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  594) 	/* Will write ivsize + cryptlen */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  595) 	append_math_add(desc, VARSEQOUTLEN, SEQINLEN, REG0, CAAM_CMD_SZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  596) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  597) 	/* Not need to reload iv */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  598) 	append_seq_fifo_load(desc, ivsize,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  599) 			     FIFOLD_CLASS_SKIP);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  600) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  601) 	/* Will read cryptlen */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  602) 	append_math_add(desc, VARSEQINLEN, SEQINLEN, REG0, CAAM_CMD_SZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  603) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  604) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  605) 	 * Wait for IV transfer (ofifo -> class2) to finish before starting
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  606) 	 * ciphertext transfer (ofifo -> external memory).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  607) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  608) 	wait_cmd = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL | JUMP_COND_NIFP);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  609) 	set_jump_tgt_here(desc, wait_cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  610) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  611) 	append_seq_fifo_load(desc, 0, FIFOLD_CLASS_BOTH | KEY_VLF |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  612) 			     FIFOLD_TYPE_MSG1OUT2 | FIFOLD_TYPE_LASTBOTH);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  613) 	append_seq_fifo_store(desc, 0, FIFOST_TYPE_MESSAGE_DATA | KEY_VLF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  614) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  615) 	/* Write ICV */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  616) 	append_seq_store(desc, icvsize, LDST_CLASS_2_CCB |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  617) 			 LDST_SRCDST_BYTE_CONTEXT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  618) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  619) 	print_hex_dump_debug("aead givenc shdesc@" __stringify(__LINE__)": ",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  620) 			     DUMP_PREFIX_ADDRESS, 16, 4, desc, desc_bytes(desc),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  621) 			     1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  622) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  623) EXPORT_SYMBOL(cnstr_shdsc_aead_givencap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  624) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  625) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  626)  * cnstr_shdsc_gcm_encap - gcm encapsulation shared descriptor
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  627)  * @desc: pointer to buffer used for descriptor construction
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  628)  * @cdata: pointer to block cipher transform definitions
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  629)  *         Valid algorithm values - OP_ALG_ALGSEL_AES ANDed with OP_ALG_AAI_GCM.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  630)  * @ivsize: initialization vector size
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  631)  * @icvsize: integrity check value (ICV) size (truncated or full)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  632)  * @is_qi: true when called from caam/qi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  633)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  634) void cnstr_shdsc_gcm_encap(u32 * const desc, struct alginfo *cdata,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  635) 			   unsigned int ivsize, unsigned int icvsize,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  636) 			   const bool is_qi)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  637) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  638) 	u32 *key_jump_cmd, *zero_payload_jump_cmd, *zero_assoc_jump_cmd1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  639) 	    *zero_assoc_jump_cmd2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  640) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  641) 	init_sh_desc(desc, HDR_SHARE_SERIAL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  642) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  643) 	/* skip key loading if they are loaded due to sharing */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  644) 	key_jump_cmd = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  645) 				   JUMP_COND_SHRD);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  646) 	if (cdata->key_inline)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  647) 		append_key_as_imm(desc, cdata->key_virt, cdata->keylen,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  648) 				  cdata->keylen, CLASS_1 | KEY_DEST_CLASS_REG);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  649) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  650) 		append_key(desc, cdata->key_dma, cdata->keylen, CLASS_1 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  651) 			   KEY_DEST_CLASS_REG);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  652) 	set_jump_tgt_here(desc, key_jump_cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  653) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  654) 	/* class 1 operation */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  655) 	append_operation(desc, cdata->algtype | OP_ALG_AS_INITFINAL |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  656) 			 OP_ALG_ENCRYPT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  657) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  658) 	if (is_qi) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  659) 		u32 *wait_load_cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  660) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  661) 		/* REG3 = assoclen */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  662) 		append_seq_load(desc, 4, LDST_CLASS_DECO |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  663) 				LDST_SRCDST_WORD_DECO_MATH3 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  664) 				(4 << LDST_OFFSET_SHIFT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  665) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  666) 		wait_load_cmd = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  667) 					    JUMP_COND_CALM | JUMP_COND_NCP |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  668) 					    JUMP_COND_NOP | JUMP_COND_NIP |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  669) 					    JUMP_COND_NIFP);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  670) 		set_jump_tgt_here(desc, wait_load_cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  671) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  672) 		append_math_sub_imm_u32(desc, VARSEQOUTLEN, SEQINLEN, IMM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  673) 					ivsize);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  674) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  675) 		append_math_sub(desc, VARSEQOUTLEN, SEQINLEN, REG0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  676) 				CAAM_CMD_SZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  677) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  678) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  679) 	/* if assoclen + cryptlen is ZERO, skip to ICV write */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  680) 	zero_assoc_jump_cmd2 = append_jump(desc, JUMP_TEST_ALL |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  681) 						 JUMP_COND_MATH_Z);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  682) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  683) 	if (is_qi)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  684) 		append_seq_fifo_load(desc, ivsize, FIFOLD_CLASS_CLASS1 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  685) 				     FIFOLD_TYPE_IV | FIFOLD_TYPE_FLUSH1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  686) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  687) 	/* if assoclen is ZERO, skip reading the assoc data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  688) 	append_math_add(desc, VARSEQINLEN, ZERO, REG3, CAAM_CMD_SZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  689) 	zero_assoc_jump_cmd1 = append_jump(desc, JUMP_TEST_ALL |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  690) 					   JUMP_COND_MATH_Z);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  691) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  692) 	append_math_add(desc, VARSEQOUTLEN, ZERO, REG3, CAAM_CMD_SZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  693) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  694) 	/* skip assoc data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  695) 	append_seq_fifo_store(desc, 0, FIFOST_TYPE_SKIP | FIFOLDST_VLF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  696) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  697) 	/* cryptlen = seqinlen - assoclen */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  698) 	append_math_sub(desc, VARSEQOUTLEN, SEQINLEN, REG3, CAAM_CMD_SZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  699) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  700) 	/* if cryptlen is ZERO jump to zero-payload commands */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  701) 	zero_payload_jump_cmd = append_jump(desc, JUMP_TEST_ALL |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  702) 					    JUMP_COND_MATH_Z);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  703) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  704) 	/* read assoc data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  705) 	append_seq_fifo_load(desc, 0, FIFOLD_CLASS_CLASS1 | FIFOLDST_VLF |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  706) 			     FIFOLD_TYPE_AAD | FIFOLD_TYPE_FLUSH1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  707) 	set_jump_tgt_here(desc, zero_assoc_jump_cmd1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  708) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  709) 	append_math_sub(desc, VARSEQINLEN, SEQINLEN, REG0, CAAM_CMD_SZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  710) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  711) 	/* write encrypted data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  712) 	append_seq_fifo_store(desc, 0, FIFOST_TYPE_MESSAGE_DATA | FIFOLDST_VLF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  713) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  714) 	/* read payload data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  715) 	append_seq_fifo_load(desc, 0, FIFOLD_CLASS_CLASS1 | FIFOLDST_VLF |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  716) 			     FIFOLD_TYPE_MSG | FIFOLD_TYPE_LAST1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  717) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  718) 	/* jump to ICV writing */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  719) 	if (is_qi)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  720) 		append_jump(desc, JUMP_TEST_ALL | 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  721) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  722) 		append_jump(desc, JUMP_TEST_ALL | 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  723) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  724) 	/* zero-payload commands */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  725) 	set_jump_tgt_here(desc, zero_payload_jump_cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  726) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  727) 	/* read assoc data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  728) 	append_seq_fifo_load(desc, 0, FIFOLD_CLASS_CLASS1 | FIFOLDST_VLF |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  729) 			     FIFOLD_TYPE_AAD | FIFOLD_TYPE_LAST1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  730) 	if (is_qi)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  731) 		/* jump to ICV writing */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  732) 		append_jump(desc, JUMP_TEST_ALL | 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  733) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  734) 	/* There is no input data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  735) 	set_jump_tgt_here(desc, zero_assoc_jump_cmd2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  736) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  737) 	if (is_qi)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  738) 		append_seq_fifo_load(desc, ivsize, FIFOLD_CLASS_CLASS1 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  739) 				     FIFOLD_TYPE_IV | FIFOLD_TYPE_FLUSH1 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  740) 				     FIFOLD_TYPE_LAST1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  741) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  742) 	/* write ICV */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  743) 	append_seq_store(desc, icvsize, LDST_CLASS_1_CCB |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  744) 			 LDST_SRCDST_BYTE_CONTEXT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  745) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  746) 	print_hex_dump_debug("gcm enc shdesc@" __stringify(__LINE__)": ",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  747) 			     DUMP_PREFIX_ADDRESS, 16, 4, desc, desc_bytes(desc),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  748) 			     1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  749) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  750) EXPORT_SYMBOL(cnstr_shdsc_gcm_encap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  751) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  752) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  753)  * cnstr_shdsc_gcm_decap - gcm decapsulation shared descriptor
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  754)  * @desc: pointer to buffer used for descriptor construction
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  755)  * @cdata: pointer to block cipher transform definitions
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  756)  *         Valid algorithm values - OP_ALG_ALGSEL_AES ANDed with OP_ALG_AAI_GCM.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  757)  * @ivsize: initialization vector size
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  758)  * @icvsize: integrity check value (ICV) size (truncated or full)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  759)  * @is_qi: true when called from caam/qi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  760)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  761) void cnstr_shdsc_gcm_decap(u32 * const desc, struct alginfo *cdata,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  762) 			   unsigned int ivsize, unsigned int icvsize,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  763) 			   const bool is_qi)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  764) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  765) 	u32 *key_jump_cmd, *zero_payload_jump_cmd, *zero_assoc_jump_cmd1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  766) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  767) 	init_sh_desc(desc, HDR_SHARE_SERIAL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  768) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  769) 	/* skip key loading if they are loaded due to sharing */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  770) 	key_jump_cmd = append_jump(desc, JUMP_JSL |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  771) 				   JUMP_TEST_ALL | JUMP_COND_SHRD);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  772) 	if (cdata->key_inline)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  773) 		append_key_as_imm(desc, cdata->key_virt, cdata->keylen,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  774) 				  cdata->keylen, CLASS_1 | KEY_DEST_CLASS_REG);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  775) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  776) 		append_key(desc, cdata->key_dma, cdata->keylen, CLASS_1 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  777) 			   KEY_DEST_CLASS_REG);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  778) 	set_jump_tgt_here(desc, key_jump_cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  779) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  780) 	/* class 1 operation */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  781) 	append_operation(desc, cdata->algtype | OP_ALG_AS_INITFINAL |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  782) 			 OP_ALG_DECRYPT | OP_ALG_ICV_ON);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  783) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  784) 	if (is_qi) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  785) 		u32 *wait_load_cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  786) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  787) 		/* REG3 = assoclen */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  788) 		append_seq_load(desc, 4, LDST_CLASS_DECO |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  789) 				LDST_SRCDST_WORD_DECO_MATH3 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  790) 				(4 << LDST_OFFSET_SHIFT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  791) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  792) 		wait_load_cmd = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  793) 					    JUMP_COND_CALM | JUMP_COND_NCP |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  794) 					    JUMP_COND_NOP | JUMP_COND_NIP |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  795) 					    JUMP_COND_NIFP);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  796) 		set_jump_tgt_here(desc, wait_load_cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  797) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  798) 		append_seq_fifo_load(desc, ivsize, FIFOLD_CLASS_CLASS1 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  799) 				     FIFOLD_TYPE_IV | FIFOLD_TYPE_FLUSH1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  800) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  801) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  802) 	/* if assoclen is ZERO, skip reading the assoc data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  803) 	append_math_add(desc, VARSEQINLEN, ZERO, REG3, CAAM_CMD_SZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  804) 	zero_assoc_jump_cmd1 = append_jump(desc, JUMP_TEST_ALL |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  805) 						 JUMP_COND_MATH_Z);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  806) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  807) 	append_math_add(desc, VARSEQOUTLEN, ZERO, REG3, CAAM_CMD_SZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  808) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  809) 	/* skip assoc data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  810) 	append_seq_fifo_store(desc, 0, FIFOST_TYPE_SKIP | FIFOLDST_VLF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  811) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  812) 	/* read assoc data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  813) 	append_seq_fifo_load(desc, 0, FIFOLD_CLASS_CLASS1 | FIFOLDST_VLF |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  814) 			     FIFOLD_TYPE_AAD | FIFOLD_TYPE_FLUSH1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  815) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  816) 	set_jump_tgt_here(desc, zero_assoc_jump_cmd1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  817) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  818) 	/* cryptlen = seqoutlen - assoclen */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  819) 	append_math_sub(desc, VARSEQINLEN, SEQOUTLEN, REG0, CAAM_CMD_SZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  820) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  821) 	/* jump to zero-payload command if cryptlen is zero */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  822) 	zero_payload_jump_cmd = append_jump(desc, JUMP_TEST_ALL |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  823) 					    JUMP_COND_MATH_Z);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  824) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  825) 	append_math_sub(desc, VARSEQOUTLEN, SEQOUTLEN, REG0, CAAM_CMD_SZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  826) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  827) 	/* store encrypted data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  828) 	append_seq_fifo_store(desc, 0, FIFOST_TYPE_MESSAGE_DATA | FIFOLDST_VLF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  829) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  830) 	/* read payload data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  831) 	append_seq_fifo_load(desc, 0, FIFOLD_CLASS_CLASS1 | FIFOLDST_VLF |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  832) 			     FIFOLD_TYPE_MSG | FIFOLD_TYPE_FLUSH1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  833) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  834) 	/* zero-payload command */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  835) 	set_jump_tgt_here(desc, zero_payload_jump_cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  836) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  837) 	/* read ICV */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  838) 	append_seq_fifo_load(desc, icvsize, FIFOLD_CLASS_CLASS1 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  839) 			     FIFOLD_TYPE_ICV | FIFOLD_TYPE_LAST1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  840) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  841) 	print_hex_dump_debug("gcm dec shdesc@" __stringify(__LINE__)": ",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  842) 			     DUMP_PREFIX_ADDRESS, 16, 4, desc, desc_bytes(desc),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  843) 			     1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  844) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  845) EXPORT_SYMBOL(cnstr_shdsc_gcm_decap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  846) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  847) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  848)  * cnstr_shdsc_rfc4106_encap - IPSec ESP gcm encapsulation shared descriptor
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  849)  *                             (non-protocol).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  850)  * @desc: pointer to buffer used for descriptor construction
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  851)  * @cdata: pointer to block cipher transform definitions
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  852)  *         Valid algorithm values - OP_ALG_ALGSEL_AES ANDed with OP_ALG_AAI_GCM.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  853)  * @ivsize: initialization vector size
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  854)  * @icvsize: integrity check value (ICV) size (truncated or full)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  855)  * @is_qi: true when called from caam/qi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  856)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  857)  * Input sequence: AAD | PTXT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  858)  * Output sequence: AAD | CTXT | ICV
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  859)  * AAD length (assoclen), which includes the IV length, is available in Math3.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  860)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  861) void cnstr_shdsc_rfc4106_encap(u32 * const desc, struct alginfo *cdata,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  862) 			       unsigned int ivsize, unsigned int icvsize,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  863) 			       const bool is_qi)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  864) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  865) 	u32 *key_jump_cmd, *zero_cryptlen_jump_cmd, *skip_instructions;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  866) 	init_sh_desc(desc, HDR_SHARE_SERIAL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  867) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  868) 	/* Skip key loading if it is loaded due to sharing */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  869) 	key_jump_cmd = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  870) 				   JUMP_COND_SHRD);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  871) 	if (cdata->key_inline)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  872) 		append_key_as_imm(desc, cdata->key_virt, cdata->keylen,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  873) 				  cdata->keylen, CLASS_1 | KEY_DEST_CLASS_REG);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  874) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  875) 		append_key(desc, cdata->key_dma, cdata->keylen, CLASS_1 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  876) 			   KEY_DEST_CLASS_REG);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  877) 	set_jump_tgt_here(desc, key_jump_cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  878) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  879) 	/* Class 1 operation */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  880) 	append_operation(desc, cdata->algtype | OP_ALG_AS_INITFINAL |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  881) 			 OP_ALG_ENCRYPT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  882) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  883) 	if (is_qi) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  884) 		u32 *wait_load_cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  885) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  886) 		/* REG3 = assoclen */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  887) 		append_seq_load(desc, 4, LDST_CLASS_DECO |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  888) 				LDST_SRCDST_WORD_DECO_MATH3 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  889) 				(4 << LDST_OFFSET_SHIFT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  890) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  891) 		wait_load_cmd = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  892) 					    JUMP_COND_CALM | JUMP_COND_NCP |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  893) 					    JUMP_COND_NOP | JUMP_COND_NIP |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  894) 					    JUMP_COND_NIFP);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  895) 		set_jump_tgt_here(desc, wait_load_cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  896) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  897) 		/* Read salt and IV */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  898) 		append_fifo_load_as_imm(desc, (void *)(cdata->key_virt +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  899) 					cdata->keylen), 4, FIFOLD_CLASS_CLASS1 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  900) 					FIFOLD_TYPE_IV);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  901) 		append_seq_fifo_load(desc, ivsize, FIFOLD_CLASS_CLASS1 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  902) 				     FIFOLD_TYPE_IV | FIFOLD_TYPE_FLUSH1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  903) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  904) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  905) 	append_math_sub_imm_u32(desc, VARSEQINLEN, REG3, IMM, ivsize);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  906) 	append_math_add(desc, VARSEQOUTLEN, ZERO, REG3, CAAM_CMD_SZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  907) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  908) 	/* Skip AAD */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  909) 	append_seq_fifo_store(desc, 0, FIFOST_TYPE_SKIP | FIFOLDST_VLF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  910) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  911) 	/* Read cryptlen and set this value into VARSEQOUTLEN */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  912) 	append_math_sub(desc, VARSEQOUTLEN, SEQINLEN, REG3, CAAM_CMD_SZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  913) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  914) 	/* If cryptlen is ZERO jump to AAD command */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  915) 	zero_cryptlen_jump_cmd = append_jump(desc, JUMP_TEST_ALL |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  916) 					    JUMP_COND_MATH_Z);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  917) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  918) 	/* Read AAD data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  919) 	append_seq_fifo_load(desc, 0, FIFOLD_CLASS_CLASS1 | FIFOLDST_VLF |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  920) 			     FIFOLD_TYPE_AAD | FIFOLD_TYPE_FLUSH1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  921) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  922) 	/* Workaround for erratum A-005473 (simultaneous SEQ FIFO skips) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  923) 	append_seq_fifo_store(desc, 0, FIFOST_TYPE_MESSAGE_DATA);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  924) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  925) 	/* Skip IV */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  926) 	append_seq_fifo_load(desc, ivsize, FIFOLD_CLASS_SKIP);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  927) 	append_math_add(desc, VARSEQINLEN, VARSEQOUTLEN, REG0, CAAM_CMD_SZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  928) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  929) 	/* Write encrypted data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  930) 	append_seq_fifo_store(desc, 0, FIFOST_TYPE_MESSAGE_DATA | FIFOLDST_VLF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  931) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  932) 	/* Read payload data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  933) 	append_seq_fifo_load(desc, 0, FIFOLD_CLASS_CLASS1 | FIFOLDST_VLF |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  934) 			     FIFOLD_TYPE_MSG | FIFOLD_TYPE_LAST1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  935) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  936) 	/* Jump instructions to avoid double reading of AAD */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  937) 	skip_instructions = append_jump(desc, JUMP_TEST_ALL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  938) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  939) 	/* There is no input data, cryptlen = 0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  940) 	set_jump_tgt_here(desc, zero_cryptlen_jump_cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  941) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  942) 	/* Read AAD */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  943) 	append_seq_fifo_load(desc, 0, FIFOLD_CLASS_CLASS1 | FIFOLDST_VLF |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  944) 			     FIFOLD_TYPE_AAD | FIFOLD_TYPE_LAST1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  945) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  946) 	set_jump_tgt_here(desc, skip_instructions);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  947) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  948) 	/* Write ICV */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  949) 	append_seq_store(desc, icvsize, LDST_CLASS_1_CCB |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  950) 			 LDST_SRCDST_BYTE_CONTEXT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  951) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  952) 	print_hex_dump_debug("rfc4106 enc shdesc@" __stringify(__LINE__)": ",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  953) 			     DUMP_PREFIX_ADDRESS, 16, 4, desc, desc_bytes(desc),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  954) 			     1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  955) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  956) EXPORT_SYMBOL(cnstr_shdsc_rfc4106_encap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  957) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  958) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  959)  * cnstr_shdsc_rfc4106_decap - IPSec ESP gcm decapsulation shared descriptor
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  960)  *                             (non-protocol).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  961)  * @desc: pointer to buffer used for descriptor construction
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  962)  * @cdata: pointer to block cipher transform definitions
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  963)  *         Valid algorithm values - OP_ALG_ALGSEL_AES ANDed with OP_ALG_AAI_GCM.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  964)  * @ivsize: initialization vector size
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  965)  * @icvsize: integrity check value (ICV) size (truncated or full)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  966)  * @is_qi: true when called from caam/qi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  967)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  968) void cnstr_shdsc_rfc4106_decap(u32 * const desc, struct alginfo *cdata,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  969) 			       unsigned int ivsize, unsigned int icvsize,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  970) 			       const bool is_qi)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  971) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  972) 	u32 *key_jump_cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  973) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  974) 	init_sh_desc(desc, HDR_SHARE_SERIAL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  975) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  976) 	/* Skip key loading if it is loaded due to sharing */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  977) 	key_jump_cmd = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  978) 				   JUMP_COND_SHRD);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  979) 	if (cdata->key_inline)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  980) 		append_key_as_imm(desc, cdata->key_virt, cdata->keylen,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  981) 				  cdata->keylen, CLASS_1 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  982) 				  KEY_DEST_CLASS_REG);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  983) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  984) 		append_key(desc, cdata->key_dma, cdata->keylen, CLASS_1 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  985) 			   KEY_DEST_CLASS_REG);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  986) 	set_jump_tgt_here(desc, key_jump_cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  987) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  988) 	/* Class 1 operation */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  989) 	append_operation(desc, cdata->algtype | OP_ALG_AS_INITFINAL |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  990) 			 OP_ALG_DECRYPT | OP_ALG_ICV_ON);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  991) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  992) 	if (is_qi) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  993) 		u32 *wait_load_cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  994) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  995) 		/* REG3 = assoclen */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  996) 		append_seq_load(desc, 4, LDST_CLASS_DECO |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  997) 				LDST_SRCDST_WORD_DECO_MATH3 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  998) 				(4 << LDST_OFFSET_SHIFT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  999) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1000) 		wait_load_cmd = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1001) 					    JUMP_COND_CALM | JUMP_COND_NCP |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1002) 					    JUMP_COND_NOP | JUMP_COND_NIP |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1003) 					    JUMP_COND_NIFP);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1004) 		set_jump_tgt_here(desc, wait_load_cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1005) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1006) 		/* Read salt and IV */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1007) 		append_fifo_load_as_imm(desc, (void *)(cdata->key_virt +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1008) 					cdata->keylen), 4, FIFOLD_CLASS_CLASS1 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1009) 					FIFOLD_TYPE_IV);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1010) 		append_seq_fifo_load(desc, ivsize, FIFOLD_CLASS_CLASS1 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1011) 				     FIFOLD_TYPE_IV | FIFOLD_TYPE_FLUSH1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1012) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1013) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1014) 	append_math_sub_imm_u32(desc, VARSEQINLEN, REG3, IMM, ivsize);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1015) 	append_math_add(desc, VARSEQOUTLEN, ZERO, REG3, CAAM_CMD_SZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1016) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1017) 	/* Read assoc data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1018) 	append_seq_fifo_load(desc, 0, FIFOLD_CLASS_CLASS1 | FIFOLDST_VLF |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1019) 			     FIFOLD_TYPE_AAD | FIFOLD_TYPE_FLUSH1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1020) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1021) 	/* Skip IV */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1022) 	append_seq_fifo_load(desc, ivsize, FIFOLD_CLASS_SKIP);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1023) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1024) 	/* Will read cryptlen bytes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1025) 	append_math_sub(desc, VARSEQINLEN, SEQOUTLEN, REG3, CAAM_CMD_SZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1026) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1027) 	/* Workaround for erratum A-005473 (simultaneous SEQ FIFO skips) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1028) 	append_seq_fifo_load(desc, 0, FIFOLD_CLASS_CLASS1 | FIFOLD_TYPE_MSG);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1029) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1030) 	/* Skip assoc data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1031) 	append_seq_fifo_store(desc, 0, FIFOST_TYPE_SKIP | FIFOLDST_VLF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1032) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1033) 	/* Will write cryptlen bytes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1034) 	append_math_sub(desc, VARSEQOUTLEN, SEQOUTLEN, REG0, CAAM_CMD_SZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1035) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1036) 	/* Store payload data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1037) 	append_seq_fifo_store(desc, 0, FIFOST_TYPE_MESSAGE_DATA | FIFOLDST_VLF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1038) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1039) 	/* Read encrypted data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1040) 	append_seq_fifo_load(desc, 0, FIFOLD_CLASS_CLASS1 | FIFOLDST_VLF |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1041) 			     FIFOLD_TYPE_MSG | FIFOLD_TYPE_FLUSH1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1042) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1043) 	/* Read ICV */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1044) 	append_seq_fifo_load(desc, icvsize, FIFOLD_CLASS_CLASS1 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1045) 			     FIFOLD_TYPE_ICV | FIFOLD_TYPE_LAST1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1046) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1047) 	print_hex_dump_debug("rfc4106 dec shdesc@" __stringify(__LINE__)": ",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1048) 			     DUMP_PREFIX_ADDRESS, 16, 4, desc, desc_bytes(desc),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1049) 			     1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1050) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1051) EXPORT_SYMBOL(cnstr_shdsc_rfc4106_decap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1052) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1053) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1054)  * cnstr_shdsc_rfc4543_encap - IPSec ESP gmac encapsulation shared descriptor
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1055)  *                             (non-protocol).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1056)  * @desc: pointer to buffer used for descriptor construction
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1057)  * @cdata: pointer to block cipher transform definitions
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1058)  *         Valid algorithm values - OP_ALG_ALGSEL_AES ANDed with OP_ALG_AAI_GCM.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1059)  * @ivsize: initialization vector size
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1060)  * @icvsize: integrity check value (ICV) size (truncated or full)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1061)  * @is_qi: true when called from caam/qi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1062)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1063) void cnstr_shdsc_rfc4543_encap(u32 * const desc, struct alginfo *cdata,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1064) 			       unsigned int ivsize, unsigned int icvsize,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1065) 			       const bool is_qi)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1066) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1067) 	u32 *key_jump_cmd, *read_move_cmd, *write_move_cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1068) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1069) 	init_sh_desc(desc, HDR_SHARE_SERIAL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1070) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1071) 	/* Skip key loading if it is loaded due to sharing */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1072) 	key_jump_cmd = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1073) 				   JUMP_COND_SHRD);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1074) 	if (cdata->key_inline)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1075) 		append_key_as_imm(desc, cdata->key_virt, cdata->keylen,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1076) 				  cdata->keylen, CLASS_1 | KEY_DEST_CLASS_REG);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1077) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1078) 		append_key(desc, cdata->key_dma, cdata->keylen, CLASS_1 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1079) 			   KEY_DEST_CLASS_REG);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1080) 	set_jump_tgt_here(desc, key_jump_cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1081) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1082) 	/* Class 1 operation */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1083) 	append_operation(desc, cdata->algtype | OP_ALG_AS_INITFINAL |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1084) 			 OP_ALG_ENCRYPT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1085) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1086) 	if (is_qi) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1087) 		/* assoclen is not needed, skip it */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1088) 		append_seq_fifo_load(desc, 4, FIFOLD_CLASS_SKIP);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1089) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1090) 		/* Read salt and IV */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1091) 		append_fifo_load_as_imm(desc, (void *)(cdata->key_virt +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1092) 					cdata->keylen), 4, FIFOLD_CLASS_CLASS1 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1093) 					FIFOLD_TYPE_IV);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1094) 		append_seq_fifo_load(desc, ivsize, FIFOLD_CLASS_CLASS1 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1095) 				     FIFOLD_TYPE_IV | FIFOLD_TYPE_FLUSH1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1096) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1097) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1098) 	/* assoclen + cryptlen = seqinlen */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1099) 	append_math_sub(desc, REG3, SEQINLEN, REG0, CAAM_CMD_SZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1100) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1101) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1102) 	 * MOVE_LEN opcode is not available in all SEC HW revisions,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1103) 	 * thus need to do some magic, i.e. self-patch the descriptor
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1104) 	 * buffer.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1105) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1106) 	read_move_cmd = append_move(desc, MOVE_SRC_DESCBUF | MOVE_DEST_MATH3 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1107) 				    (0x6 << MOVE_LEN_SHIFT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1108) 	write_move_cmd = append_move(desc, MOVE_SRC_MATH3 | MOVE_DEST_DESCBUF |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1109) 				     (0x8 << MOVE_LEN_SHIFT) | MOVE_WAITCOMP);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1110) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1111) 	/* Will read assoclen + cryptlen bytes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1112) 	append_math_sub(desc, VARSEQINLEN, SEQINLEN, REG0, CAAM_CMD_SZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1113) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1114) 	/* Will write assoclen + cryptlen bytes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1115) 	append_math_sub(desc, VARSEQOUTLEN, SEQINLEN, REG0, CAAM_CMD_SZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1116) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1117) 	/* Read and write assoclen + cryptlen bytes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1118) 	aead_append_src_dst(desc, FIFOLD_TYPE_AAD);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1119) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1120) 	set_move_tgt_here(desc, read_move_cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1121) 	set_move_tgt_here(desc, write_move_cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1122) 	append_cmd(desc, CMD_LOAD | DISABLE_AUTO_INFO_FIFO);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1123) 	/* Move payload data to OFIFO */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1124) 	append_move(desc, MOVE_SRC_INFIFO_CL | MOVE_DEST_OUTFIFO);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1125) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1126) 	/* Write ICV */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1127) 	append_seq_store(desc, icvsize, LDST_CLASS_1_CCB |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1128) 			 LDST_SRCDST_BYTE_CONTEXT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1129) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1130) 	print_hex_dump_debug("rfc4543 enc shdesc@" __stringify(__LINE__)": ",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1131) 			     DUMP_PREFIX_ADDRESS, 16, 4, desc, desc_bytes(desc),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1132) 			     1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1133) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1134) EXPORT_SYMBOL(cnstr_shdsc_rfc4543_encap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1135) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1136) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1137)  * cnstr_shdsc_rfc4543_decap - IPSec ESP gmac decapsulation shared descriptor
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1138)  *                             (non-protocol).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1139)  * @desc: pointer to buffer used for descriptor construction
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1140)  * @cdata: pointer to block cipher transform definitions
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1141)  *         Valid algorithm values - OP_ALG_ALGSEL_AES ANDed with OP_ALG_AAI_GCM.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1142)  * @ivsize: initialization vector size
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1143)  * @icvsize: integrity check value (ICV) size (truncated or full)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1144)  * @is_qi: true when called from caam/qi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1145)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1146) void cnstr_shdsc_rfc4543_decap(u32 * const desc, struct alginfo *cdata,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1147) 			       unsigned int ivsize, unsigned int icvsize,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1148) 			       const bool is_qi)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1149) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1150) 	u32 *key_jump_cmd, *read_move_cmd, *write_move_cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1151) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1152) 	init_sh_desc(desc, HDR_SHARE_SERIAL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1153) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1154) 	/* Skip key loading if it is loaded due to sharing */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1155) 	key_jump_cmd = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1156) 				   JUMP_COND_SHRD);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1157) 	if (cdata->key_inline)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1158) 		append_key_as_imm(desc, cdata->key_virt, cdata->keylen,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1159) 				  cdata->keylen, CLASS_1 | KEY_DEST_CLASS_REG);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1160) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1161) 		append_key(desc, cdata->key_dma, cdata->keylen, CLASS_1 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1162) 			   KEY_DEST_CLASS_REG);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1163) 	set_jump_tgt_here(desc, key_jump_cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1164) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1165) 	/* Class 1 operation */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1166) 	append_operation(desc, cdata->algtype | OP_ALG_AS_INITFINAL |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1167) 			 OP_ALG_DECRYPT | OP_ALG_ICV_ON);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1168) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1169) 	if (is_qi) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1170) 		/* assoclen is not needed, skip it */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1171) 		append_seq_fifo_load(desc, 4, FIFOLD_CLASS_SKIP);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1172) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1173) 		/* Read salt and IV */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1174) 		append_fifo_load_as_imm(desc, (void *)(cdata->key_virt +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1175) 					cdata->keylen), 4, FIFOLD_CLASS_CLASS1 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1176) 					FIFOLD_TYPE_IV);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1177) 		append_seq_fifo_load(desc, ivsize, FIFOLD_CLASS_CLASS1 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1178) 				     FIFOLD_TYPE_IV | FIFOLD_TYPE_FLUSH1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1179) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1180) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1181) 	/* assoclen + cryptlen = seqoutlen */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1182) 	append_math_sub(desc, REG3, SEQOUTLEN, REG0, CAAM_CMD_SZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1183) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1184) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1185) 	 * MOVE_LEN opcode is not available in all SEC HW revisions,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1186) 	 * thus need to do some magic, i.e. self-patch the descriptor
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1187) 	 * buffer.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1188) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1189) 	read_move_cmd = append_move(desc, MOVE_SRC_DESCBUF | MOVE_DEST_MATH3 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1190) 				    (0x6 << MOVE_LEN_SHIFT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1191) 	write_move_cmd = append_move(desc, MOVE_SRC_MATH3 | MOVE_DEST_DESCBUF |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1192) 				     (0x8 << MOVE_LEN_SHIFT) | MOVE_WAITCOMP);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1193) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1194) 	/* Will read assoclen + cryptlen bytes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1195) 	append_math_sub(desc, VARSEQINLEN, SEQOUTLEN, REG0, CAAM_CMD_SZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1196) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1197) 	/* Will write assoclen + cryptlen bytes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1198) 	append_math_sub(desc, VARSEQOUTLEN, SEQOUTLEN, REG0, CAAM_CMD_SZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1199) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1200) 	/* Store payload data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1201) 	append_seq_fifo_store(desc, 0, FIFOST_TYPE_MESSAGE_DATA | FIFOLDST_VLF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1202) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1203) 	/* In-snoop assoclen + cryptlen data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1204) 	append_seq_fifo_load(desc, 0, FIFOLD_CLASS_BOTH | FIFOLDST_VLF |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1205) 			     FIFOLD_TYPE_AAD | FIFOLD_TYPE_LAST2FLUSH1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1206) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1207) 	set_move_tgt_here(desc, read_move_cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1208) 	set_move_tgt_here(desc, write_move_cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1209) 	append_cmd(desc, CMD_LOAD | DISABLE_AUTO_INFO_FIFO);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1210) 	/* Move payload data to OFIFO */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1211) 	append_move(desc, MOVE_SRC_INFIFO_CL | MOVE_DEST_OUTFIFO);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1212) 	append_cmd(desc, CMD_LOAD | ENABLE_AUTO_INFO_FIFO);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1213) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1214) 	/* Read ICV */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1215) 	append_seq_fifo_load(desc, icvsize, FIFOLD_CLASS_CLASS1 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1216) 			     FIFOLD_TYPE_ICV | FIFOLD_TYPE_LAST1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1217) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1218) 	print_hex_dump_debug("rfc4543 dec shdesc@" __stringify(__LINE__)": ",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1219) 			     DUMP_PREFIX_ADDRESS, 16, 4, desc, desc_bytes(desc),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1220) 			     1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1221) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1222) EXPORT_SYMBOL(cnstr_shdsc_rfc4543_decap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1223) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1224) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1225)  * cnstr_shdsc_chachapoly - Chacha20 + Poly1305 generic AEAD (rfc7539) and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1226)  *                          IPsec ESP (rfc7634, a.k.a. rfc7539esp) shared
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1227)  *                          descriptor (non-protocol).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1228)  * @desc: pointer to buffer used for descriptor construction
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1229)  * @cdata: pointer to block cipher transform definitions
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1230)  *         Valid algorithm values - OP_ALG_ALGSEL_CHACHA20 ANDed with
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1231)  *         OP_ALG_AAI_AEAD.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1232)  * @adata: pointer to authentication transform definitions
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1233)  *         Valid algorithm values - OP_ALG_ALGSEL_POLY1305 ANDed with
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1234)  *         OP_ALG_AAI_AEAD.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1235)  * @ivsize: initialization vector size
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1236)  * @icvsize: integrity check value (ICV) size (truncated or full)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1237)  * @encap: true if encapsulation, false if decapsulation
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1238)  * @is_qi: true when called from caam/qi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1239)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1240) void cnstr_shdsc_chachapoly(u32 * const desc, struct alginfo *cdata,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1241) 			    struct alginfo *adata, unsigned int ivsize,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1242) 			    unsigned int icvsize, const bool encap,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1243) 			    const bool is_qi)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1244) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1245) 	u32 *key_jump_cmd, *wait_cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1246) 	u32 nfifo;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1247) 	const bool is_ipsec = (ivsize != CHACHAPOLY_IV_SIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1248) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1249) 	/* Note: Context registers are saved. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1250) 	init_sh_desc(desc, HDR_SHARE_SERIAL | HDR_SAVECTX);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1251) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1252) 	/* skip key loading if they are loaded due to sharing */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1253) 	key_jump_cmd = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1254) 				   JUMP_COND_SHRD);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1255) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1256) 	append_key_as_imm(desc, cdata->key_virt, cdata->keylen, cdata->keylen,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1257) 			  CLASS_1 | KEY_DEST_CLASS_REG);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1258) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1259) 	/* For IPsec load the salt from keymat in the context register */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1260) 	if (is_ipsec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1261) 		append_load_as_imm(desc, cdata->key_virt + cdata->keylen, 4,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1262) 				   LDST_CLASS_1_CCB | LDST_SRCDST_BYTE_CONTEXT |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1263) 				   4 << LDST_OFFSET_SHIFT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1264) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1265) 	set_jump_tgt_here(desc, key_jump_cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1266) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1267) 	/* Class 2 and 1 operations: Poly & ChaCha */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1268) 	if (encap) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1269) 		append_operation(desc, adata->algtype | OP_ALG_AS_INITFINAL |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1270) 				 OP_ALG_ENCRYPT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1271) 		append_operation(desc, cdata->algtype | OP_ALG_AS_INITFINAL |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1272) 				 OP_ALG_ENCRYPT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1273) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1274) 		append_operation(desc, adata->algtype | OP_ALG_AS_INITFINAL |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1275) 				 OP_ALG_DECRYPT | OP_ALG_ICV_ON);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1276) 		append_operation(desc, cdata->algtype | OP_ALG_AS_INITFINAL |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1277) 				 OP_ALG_DECRYPT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1278) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1279) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1280) 	if (is_qi) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1281) 		u32 *wait_load_cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1282) 		u32 ctx1_iv_off = is_ipsec ? 8 : 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1283) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1284) 		/* REG3 = assoclen */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1285) 		append_seq_load(desc, 4, LDST_CLASS_DECO |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1286) 				LDST_SRCDST_WORD_DECO_MATH3 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1287) 				4 << LDST_OFFSET_SHIFT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1288) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1289) 		wait_load_cmd = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1290) 					    JUMP_COND_CALM | JUMP_COND_NCP |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1291) 					    JUMP_COND_NOP | JUMP_COND_NIP |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1292) 					    JUMP_COND_NIFP);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1293) 		set_jump_tgt_here(desc, wait_load_cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1294) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1295) 		append_seq_load(desc, ivsize, LDST_CLASS_1_CCB |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1296) 				LDST_SRCDST_BYTE_CONTEXT |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1297) 				ctx1_iv_off << LDST_OFFSET_SHIFT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1298) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1299) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1300) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1301) 	 * MAGIC with NFIFO
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1302) 	 * Read associated data from the input and send them to class1 and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1303) 	 * class2 alignment blocks. From class1 send data to output fifo and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1304) 	 * then write it to memory since we don't need to encrypt AD.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1305) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1306) 	nfifo = NFIFOENTRY_DEST_BOTH | NFIFOENTRY_FC1 | NFIFOENTRY_FC2 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1307) 		NFIFOENTRY_DTYPE_POLY | NFIFOENTRY_BND;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1308) 	append_load_imm_u32(desc, nfifo, LDST_CLASS_IND_CCB |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1309) 			    LDST_SRCDST_WORD_INFO_FIFO_SM | LDLEN_MATH3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1310) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1311) 	append_math_add(desc, VARSEQINLEN, ZERO, REG3, CAAM_CMD_SZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1312) 	append_math_add(desc, VARSEQOUTLEN, ZERO, REG3, CAAM_CMD_SZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1313) 	append_seq_fifo_load(desc, 0, FIFOLD_TYPE_NOINFOFIFO |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1314) 			     FIFOLD_CLASS_CLASS1 | LDST_VLF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1315) 	append_move_len(desc, MOVE_AUX_LS | MOVE_SRC_AUX_ABLK |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1316) 			MOVE_DEST_OUTFIFO | MOVELEN_MRSEL_MATH3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1317) 	append_seq_fifo_store(desc, 0, FIFOST_TYPE_MESSAGE_DATA | LDST_VLF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1318) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1319) 	/* IPsec - copy IV at the output */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1320) 	if (is_ipsec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1321) 		append_seq_fifo_store(desc, ivsize, FIFOST_TYPE_METADATA |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1322) 				      0x2 << 25);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1323) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1324) 	wait_cmd = append_jump(desc, JUMP_JSL | JUMP_TYPE_LOCAL |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1325) 			       JUMP_COND_NOP | JUMP_TEST_ALL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1326) 	set_jump_tgt_here(desc, wait_cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1327) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1328) 	if (encap) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1329) 		/* Read and write cryptlen bytes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1330) 		append_math_add(desc, VARSEQINLEN, SEQINLEN, REG0, CAAM_CMD_SZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1331) 		append_math_add(desc, VARSEQOUTLEN, SEQINLEN, REG0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1332) 				CAAM_CMD_SZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1333) 		aead_append_src_dst(desc, FIFOLD_TYPE_MSG1OUT2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1334) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1335) 		/* Write ICV */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1336) 		append_seq_store(desc, icvsize, LDST_CLASS_2_CCB |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1337) 				 LDST_SRCDST_BYTE_CONTEXT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1338) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1339) 		/* Read and write cryptlen bytes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1340) 		append_math_add(desc, VARSEQINLEN, SEQOUTLEN, REG0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1341) 				CAAM_CMD_SZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1342) 		append_math_add(desc, VARSEQOUTLEN, SEQOUTLEN, REG0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1343) 				CAAM_CMD_SZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1344) 		aead_append_src_dst(desc, FIFOLD_TYPE_MSG);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1345) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1346) 		/* Load ICV for verification */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1347) 		append_seq_fifo_load(desc, icvsize, FIFOLD_CLASS_CLASS2 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1348) 				     FIFOLD_TYPE_LAST2 | FIFOLD_TYPE_ICV);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1349) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1350) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1351) 	print_hex_dump_debug("chachapoly shdesc@" __stringify(__LINE__)": ",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1352) 			     DUMP_PREFIX_ADDRESS, 16, 4, desc, desc_bytes(desc),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1353) 			     1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1354) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1355) EXPORT_SYMBOL(cnstr_shdsc_chachapoly);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1356) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1357) /* For skcipher encrypt and decrypt, read from req->src and write to req->dst */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1358) static inline void skcipher_append_src_dst(u32 *desc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1359) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1360) 	append_math_add(desc, VARSEQOUTLEN, SEQINLEN, REG0, CAAM_CMD_SZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1361) 	append_math_add(desc, VARSEQINLEN, SEQINLEN, REG0, CAAM_CMD_SZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1362) 	append_seq_fifo_load(desc, 0, FIFOLD_CLASS_CLASS1 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1363) 			     KEY_VLF | FIFOLD_TYPE_MSG | FIFOLD_TYPE_LAST1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1364) 	append_seq_fifo_store(desc, 0, FIFOST_TYPE_MESSAGE_DATA | KEY_VLF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1365) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1366) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1367) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1368)  * cnstr_shdsc_skcipher_encap - skcipher encapsulation shared descriptor
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1369)  * @desc: pointer to buffer used for descriptor construction
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1370)  * @cdata: pointer to block cipher transform definitions
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1371)  *         Valid algorithm values - one of OP_ALG_ALGSEL_{AES, DES, 3DES} ANDed
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1372)  *         with OP_ALG_AAI_CBC or OP_ALG_AAI_CTR_MOD128
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1373)  *                                - OP_ALG_ALGSEL_CHACHA20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1374)  * @ivsize: initialization vector size
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1375)  * @is_rfc3686: true when ctr(aes) is wrapped by rfc3686 template
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1376)  * @ctx1_iv_off: IV offset in CONTEXT1 register
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1377)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1378) void cnstr_shdsc_skcipher_encap(u32 * const desc, struct alginfo *cdata,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1379) 				unsigned int ivsize, const bool is_rfc3686,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1380) 				const u32 ctx1_iv_off)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1381) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1382) 	u32 *key_jump_cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1383) 	u32 options = cdata->algtype | OP_ALG_AS_INIT | OP_ALG_ENCRYPT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1384) 	bool is_chacha20 = ((cdata->algtype & OP_ALG_ALGSEL_MASK) ==
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1385) 			    OP_ALG_ALGSEL_CHACHA20);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1386) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1387) 	init_sh_desc(desc, HDR_SHARE_SERIAL | HDR_SAVECTX);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1388) 	/* Skip if already shared */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1389) 	key_jump_cmd = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1390) 				   JUMP_COND_SHRD);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1391) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1392) 	/* Load class1 key only */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1393) 	append_key_as_imm(desc, cdata->key_virt, cdata->keylen,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1394) 			  cdata->keylen, CLASS_1 | KEY_DEST_CLASS_REG);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1395) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1396) 	/* Load nonce into CONTEXT1 reg */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1397) 	if (is_rfc3686) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1398) 		const u8 *nonce = cdata->key_virt + cdata->keylen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1399) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1400) 		append_load_as_imm(desc, nonce, CTR_RFC3686_NONCE_SIZE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1401) 				   LDST_CLASS_IND_CCB |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1402) 				   LDST_SRCDST_BYTE_OUTFIFO | LDST_IMM);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1403) 		append_move(desc, MOVE_WAITCOMP | MOVE_SRC_OUTFIFO |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1404) 			    MOVE_DEST_CLASS1CTX | (16 << MOVE_OFFSET_SHIFT) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1405) 			    (CTR_RFC3686_NONCE_SIZE << MOVE_LEN_SHIFT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1406) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1407) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1408) 	set_jump_tgt_here(desc, key_jump_cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1409) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1410) 	/* Load IV, if there is one */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1411) 	if (ivsize)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1412) 		append_seq_load(desc, ivsize, LDST_SRCDST_BYTE_CONTEXT |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1413) 				LDST_CLASS_1_CCB | (ctx1_iv_off <<
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1414) 				LDST_OFFSET_SHIFT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1415) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1416) 	/* Load counter into CONTEXT1 reg */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1417) 	if (is_rfc3686)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1418) 		append_load_imm_be32(desc, 1, LDST_IMM | LDST_CLASS_1_CCB |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1419) 				     LDST_SRCDST_BYTE_CONTEXT |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1420) 				     ((ctx1_iv_off + CTR_RFC3686_IV_SIZE) <<
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1421) 				      LDST_OFFSET_SHIFT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1422) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1423) 	/* Load operation */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1424) 	if (is_chacha20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1425) 		options |= OP_ALG_AS_FINALIZE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1426) 	append_operation(desc, options);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1427) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1428) 	/* Perform operation */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1429) 	skcipher_append_src_dst(desc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1430) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1431) 	/* Store IV */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1432) 	if (!is_chacha20 && ivsize)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1433) 		append_seq_store(desc, ivsize, LDST_SRCDST_BYTE_CONTEXT |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1434) 				 LDST_CLASS_1_CCB | (ctx1_iv_off <<
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1435) 				 LDST_OFFSET_SHIFT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1436) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1437) 	print_hex_dump_debug("skcipher enc shdesc@" __stringify(__LINE__)": ",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1438) 			     DUMP_PREFIX_ADDRESS, 16, 4, desc, desc_bytes(desc),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1439) 			     1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1440) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1441) EXPORT_SYMBOL(cnstr_shdsc_skcipher_encap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1442) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1443) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1444)  * cnstr_shdsc_skcipher_decap - skcipher decapsulation shared descriptor
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1445)  * @desc: pointer to buffer used for descriptor construction
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1446)  * @cdata: pointer to block cipher transform definitions
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1447)  *         Valid algorithm values - one of OP_ALG_ALGSEL_{AES, DES, 3DES} ANDed
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1448)  *         with OP_ALG_AAI_CBC or OP_ALG_AAI_CTR_MOD128
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1449)  *                                - OP_ALG_ALGSEL_CHACHA20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1450)  * @ivsize: initialization vector size
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1451)  * @is_rfc3686: true when ctr(aes) is wrapped by rfc3686 template
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1452)  * @ctx1_iv_off: IV offset in CONTEXT1 register
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1453)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1454) void cnstr_shdsc_skcipher_decap(u32 * const desc, struct alginfo *cdata,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1455) 				unsigned int ivsize, const bool is_rfc3686,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1456) 				const u32 ctx1_iv_off)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1457) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1458) 	u32 *key_jump_cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1459) 	bool is_chacha20 = ((cdata->algtype & OP_ALG_ALGSEL_MASK) ==
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1460) 			    OP_ALG_ALGSEL_CHACHA20);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1461) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1462) 	init_sh_desc(desc, HDR_SHARE_SERIAL | HDR_SAVECTX);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1463) 	/* Skip if already shared */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1464) 	key_jump_cmd = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1465) 				   JUMP_COND_SHRD);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1466) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1467) 	/* Load class1 key only */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1468) 	append_key_as_imm(desc, cdata->key_virt, cdata->keylen,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1469) 			  cdata->keylen, CLASS_1 | KEY_DEST_CLASS_REG);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1470) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1471) 	/* Load nonce into CONTEXT1 reg */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1472) 	if (is_rfc3686) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1473) 		const u8 *nonce = cdata->key_virt + cdata->keylen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1474) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1475) 		append_load_as_imm(desc, nonce, CTR_RFC3686_NONCE_SIZE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1476) 				   LDST_CLASS_IND_CCB |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1477) 				   LDST_SRCDST_BYTE_OUTFIFO | LDST_IMM);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1478) 		append_move(desc, MOVE_WAITCOMP | MOVE_SRC_OUTFIFO |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1479) 			    MOVE_DEST_CLASS1CTX | (16 << MOVE_OFFSET_SHIFT) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1480) 			    (CTR_RFC3686_NONCE_SIZE << MOVE_LEN_SHIFT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1481) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1482) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1483) 	set_jump_tgt_here(desc, key_jump_cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1484) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1485) 	/* Load IV, if there is one */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1486) 	if (ivsize)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1487) 		append_seq_load(desc, ivsize, LDST_SRCDST_BYTE_CONTEXT |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1488) 				LDST_CLASS_1_CCB | (ctx1_iv_off <<
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1489) 				LDST_OFFSET_SHIFT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1490) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1491) 	/* Load counter into CONTEXT1 reg */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1492) 	if (is_rfc3686)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1493) 		append_load_imm_be32(desc, 1, LDST_IMM | LDST_CLASS_1_CCB |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1494) 				     LDST_SRCDST_BYTE_CONTEXT |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1495) 				     ((ctx1_iv_off + CTR_RFC3686_IV_SIZE) <<
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1496) 				      LDST_OFFSET_SHIFT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1497) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1498) 	/* Choose operation */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1499) 	if (ctx1_iv_off)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1500) 		append_operation(desc, cdata->algtype | OP_ALG_AS_INIT |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1501) 				 OP_ALG_DECRYPT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1502) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1503) 		append_dec_op1(desc, cdata->algtype);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1504) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1505) 	/* Perform operation */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1506) 	skcipher_append_src_dst(desc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1507) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1508) 	/* Store IV */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1509) 	if (!is_chacha20 && ivsize)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1510) 		append_seq_store(desc, ivsize, LDST_SRCDST_BYTE_CONTEXT |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1511) 				 LDST_CLASS_1_CCB | (ctx1_iv_off <<
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1512) 				 LDST_OFFSET_SHIFT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1513) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1514) 	print_hex_dump_debug("skcipher dec shdesc@" __stringify(__LINE__)": ",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1515) 			     DUMP_PREFIX_ADDRESS, 16, 4, desc, desc_bytes(desc),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1516) 			     1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1517) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1518) EXPORT_SYMBOL(cnstr_shdsc_skcipher_decap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1519) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1520) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1521)  * cnstr_shdsc_xts_skcipher_encap - xts skcipher encapsulation shared descriptor
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1522)  * @desc: pointer to buffer used for descriptor construction
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1523)  * @cdata: pointer to block cipher transform definitions
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1524)  *         Valid algorithm values - OP_ALG_ALGSEL_AES ANDed with OP_ALG_AAI_XTS.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1525)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1526) void cnstr_shdsc_xts_skcipher_encap(u32 * const desc, struct alginfo *cdata)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1527) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1528) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1529) 	 * Set sector size to a big value, practically disabling
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1530) 	 * sector size segmentation in xts implementation. We cannot
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1531) 	 * take full advantage of this HW feature with existing
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1532) 	 * crypto API / dm-crypt SW architecture.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1533) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1534) 	__be64 sector_size = cpu_to_be64(BIT(15));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1535) 	u32 *key_jump_cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1536) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1537) 	init_sh_desc(desc, HDR_SHARE_SERIAL | HDR_SAVECTX);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1538) 	/* Skip if already shared */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1539) 	key_jump_cmd = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1540) 				   JUMP_COND_SHRD);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1541) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1542) 	/* Load class1 keys only */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1543) 	append_key_as_imm(desc, cdata->key_virt, cdata->keylen,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1544) 			  cdata->keylen, CLASS_1 | KEY_DEST_CLASS_REG);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1545) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1546) 	/* Load sector size with index 40 bytes (0x28) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1547) 	append_load_as_imm(desc, (void *)&sector_size, 8, LDST_CLASS_1_CCB |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1548) 			   LDST_SRCDST_BYTE_CONTEXT |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1549) 			   (0x28 << LDST_OFFSET_SHIFT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1550) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1551) 	set_jump_tgt_here(desc, key_jump_cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1552) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1553) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1554) 	 * create sequence for loading the sector index / 16B tweak value
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1555) 	 * Lower 8B of IV - sector index / tweak lower half
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1556) 	 * Upper 8B of IV - upper half of 16B tweak
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1557) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1558) 	append_seq_load(desc, 8, LDST_SRCDST_BYTE_CONTEXT | LDST_CLASS_1_CCB |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1559) 			(0x20 << LDST_OFFSET_SHIFT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1560) 	append_seq_load(desc, 8, LDST_SRCDST_BYTE_CONTEXT | LDST_CLASS_1_CCB |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1561) 			(0x30 << LDST_OFFSET_SHIFT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1562) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1563) 	/* Load operation */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1564) 	append_operation(desc, cdata->algtype | OP_ALG_AS_INITFINAL |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1565) 			 OP_ALG_ENCRYPT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1566) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1567) 	/* Perform operation */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1568) 	skcipher_append_src_dst(desc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1569) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1570) 	/* Store lower 8B and upper 8B of IV */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1571) 	append_seq_store(desc, 8, LDST_SRCDST_BYTE_CONTEXT | LDST_CLASS_1_CCB |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1572) 			 (0x20 << LDST_OFFSET_SHIFT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1573) 	append_seq_store(desc, 8, LDST_SRCDST_BYTE_CONTEXT | LDST_CLASS_1_CCB |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1574) 			 (0x30 << LDST_OFFSET_SHIFT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1575) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1576) 	print_hex_dump_debug("xts skcipher enc shdesc@" __stringify(__LINE__)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1577) 			     ": ", DUMP_PREFIX_ADDRESS, 16, 4,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1578) 			     desc, desc_bytes(desc), 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1579) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1580) EXPORT_SYMBOL(cnstr_shdsc_xts_skcipher_encap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1581) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1582) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1583)  * cnstr_shdsc_xts_skcipher_decap - xts skcipher decapsulation shared descriptor
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1584)  * @desc: pointer to buffer used for descriptor construction
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1585)  * @cdata: pointer to block cipher transform definitions
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1586)  *         Valid algorithm values - OP_ALG_ALGSEL_AES ANDed with OP_ALG_AAI_XTS.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1587)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1588) void cnstr_shdsc_xts_skcipher_decap(u32 * const desc, struct alginfo *cdata)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1589) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1590) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1591) 	 * Set sector size to a big value, practically disabling
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1592) 	 * sector size segmentation in xts implementation. We cannot
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1593) 	 * take full advantage of this HW feature with existing
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1594) 	 * crypto API / dm-crypt SW architecture.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1595) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1596) 	__be64 sector_size = cpu_to_be64(BIT(15));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1597) 	u32 *key_jump_cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1598) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1599) 	init_sh_desc(desc, HDR_SHARE_SERIAL | HDR_SAVECTX);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1600) 	/* Skip if already shared */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1601) 	key_jump_cmd = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1602) 				   JUMP_COND_SHRD);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1603) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1604) 	/* Load class1 key only */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1605) 	append_key_as_imm(desc, cdata->key_virt, cdata->keylen,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1606) 			  cdata->keylen, CLASS_1 | KEY_DEST_CLASS_REG);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1607) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1608) 	/* Load sector size with index 40 bytes (0x28) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1609) 	append_load_as_imm(desc, (void *)&sector_size, 8, LDST_CLASS_1_CCB |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1610) 			   LDST_SRCDST_BYTE_CONTEXT |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1611) 			   (0x28 << LDST_OFFSET_SHIFT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1612) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1613) 	set_jump_tgt_here(desc, key_jump_cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1614) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1615) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1616) 	 * create sequence for loading the sector index / 16B tweak value
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1617) 	 * Lower 8B of IV - sector index / tweak lower half
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1618) 	 * Upper 8B of IV - upper half of 16B tweak
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1619) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1620) 	append_seq_load(desc, 8, LDST_SRCDST_BYTE_CONTEXT | LDST_CLASS_1_CCB |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1621) 			(0x20 << LDST_OFFSET_SHIFT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1622) 	append_seq_load(desc, 8, LDST_SRCDST_BYTE_CONTEXT | LDST_CLASS_1_CCB |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1623) 			(0x30 << LDST_OFFSET_SHIFT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1624) 	/* Load operation */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1625) 	append_dec_op1(desc, cdata->algtype);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1626) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1627) 	/* Perform operation */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1628) 	skcipher_append_src_dst(desc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1629) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1630) 	/* Store lower 8B and upper 8B of IV */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1631) 	append_seq_store(desc, 8, LDST_SRCDST_BYTE_CONTEXT | LDST_CLASS_1_CCB |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1632) 			 (0x20 << LDST_OFFSET_SHIFT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1633) 	append_seq_store(desc, 8, LDST_SRCDST_BYTE_CONTEXT | LDST_CLASS_1_CCB |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1634) 			 (0x30 << LDST_OFFSET_SHIFT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1635) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1636) 	print_hex_dump_debug("xts skcipher dec shdesc@" __stringify(__LINE__)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1637) 			     ": ", DUMP_PREFIX_ADDRESS, 16, 4, desc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1638) 			     desc_bytes(desc), 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1639) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1640) EXPORT_SYMBOL(cnstr_shdsc_xts_skcipher_decap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1641) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1642) MODULE_LICENSE("GPL");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1643) MODULE_DESCRIPTION("FSL CAAM descriptor support");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1644) MODULE_AUTHOR("Freescale Semiconductor - NMG/STC");