18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0+
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * Shared descriptors for aead, skcipher algorithms
48c2ecf20Sopenharmony_ci *
58c2ecf20Sopenharmony_ci * Copyright 2016-2019 NXP
68c2ecf20Sopenharmony_ci */
78c2ecf20Sopenharmony_ci
88c2ecf20Sopenharmony_ci#include "compat.h"
98c2ecf20Sopenharmony_ci#include "desc_constr.h"
108c2ecf20Sopenharmony_ci#include "caamalg_desc.h"
118c2ecf20Sopenharmony_ci
128c2ecf20Sopenharmony_ci/*
138c2ecf20Sopenharmony_ci * For aead functions, read payload and write payload,
148c2ecf20Sopenharmony_ci * both of which are specified in req->src and req->dst
158c2ecf20Sopenharmony_ci */
168c2ecf20Sopenharmony_cistatic inline void aead_append_src_dst(u32 *desc, u32 msg_type)
178c2ecf20Sopenharmony_ci{
188c2ecf20Sopenharmony_ci	append_seq_fifo_store(desc, 0, FIFOST_TYPE_MESSAGE_DATA | KEY_VLF);
198c2ecf20Sopenharmony_ci	append_seq_fifo_load(desc, 0, FIFOLD_CLASS_BOTH |
208c2ecf20Sopenharmony_ci			     KEY_VLF | msg_type | FIFOLD_TYPE_LASTBOTH);
218c2ecf20Sopenharmony_ci}
228c2ecf20Sopenharmony_ci
238c2ecf20Sopenharmony_ci/* Set DK bit in class 1 operation if shared */
248c2ecf20Sopenharmony_cistatic inline void append_dec_op1(u32 *desc, u32 type)
258c2ecf20Sopenharmony_ci{
268c2ecf20Sopenharmony_ci	u32 *jump_cmd, *uncond_jump_cmd;
278c2ecf20Sopenharmony_ci
288c2ecf20Sopenharmony_ci	/* DK bit is valid only for AES */
298c2ecf20Sopenharmony_ci	if ((type & OP_ALG_ALGSEL_MASK) != OP_ALG_ALGSEL_AES) {
308c2ecf20Sopenharmony_ci		append_operation(desc, type | OP_ALG_AS_INITFINAL |
318c2ecf20Sopenharmony_ci				 OP_ALG_DECRYPT);
328c2ecf20Sopenharmony_ci		return;
338c2ecf20Sopenharmony_ci	}
348c2ecf20Sopenharmony_ci
358c2ecf20Sopenharmony_ci	jump_cmd = append_jump(desc, JUMP_TEST_ALL | JUMP_COND_SHRD);
368c2ecf20Sopenharmony_ci	append_operation(desc, type | OP_ALG_AS_INIT | OP_ALG_DECRYPT);
378c2ecf20Sopenharmony_ci	uncond_jump_cmd = append_jump(desc, JUMP_TEST_ALL);
388c2ecf20Sopenharmony_ci	set_jump_tgt_here(desc, jump_cmd);
398c2ecf20Sopenharmony_ci	append_operation(desc, type | OP_ALG_AS_INIT | OP_ALG_DECRYPT |
408c2ecf20Sopenharmony_ci			 OP_ALG_AAI_DK);
418c2ecf20Sopenharmony_ci	set_jump_tgt_here(desc, uncond_jump_cmd);
428c2ecf20Sopenharmony_ci}
438c2ecf20Sopenharmony_ci
448c2ecf20Sopenharmony_ci/**
458c2ecf20Sopenharmony_ci * cnstr_shdsc_aead_null_encap - IPSec ESP encapsulation shared descriptor
468c2ecf20Sopenharmony_ci *                               (non-protocol) with no (null) encryption.
478c2ecf20Sopenharmony_ci * @desc: pointer to buffer used for descriptor construction
488c2ecf20Sopenharmony_ci * @adata: pointer to authentication transform definitions.
498c2ecf20Sopenharmony_ci *         A split key is required for SEC Era < 6; the size of the split key
508c2ecf20Sopenharmony_ci *         is specified in this case. Valid algorithm values - one of
518c2ecf20Sopenharmony_ci *         OP_ALG_ALGSEL_{MD5, SHA1, SHA224, SHA256, SHA384, SHA512} ANDed
528c2ecf20Sopenharmony_ci *         with OP_ALG_AAI_HMAC_PRECOMP.
538c2ecf20Sopenharmony_ci * @icvsize: integrity check value (ICV) size (truncated or full)
548c2ecf20Sopenharmony_ci * @era: SEC Era
558c2ecf20Sopenharmony_ci */
568c2ecf20Sopenharmony_civoid cnstr_shdsc_aead_null_encap(u32 * const desc, struct alginfo *adata,
578c2ecf20Sopenharmony_ci				 unsigned int icvsize, int era)
588c2ecf20Sopenharmony_ci{
598c2ecf20Sopenharmony_ci	u32 *key_jump_cmd, *read_move_cmd, *write_move_cmd;
608c2ecf20Sopenharmony_ci
618c2ecf20Sopenharmony_ci	init_sh_desc(desc, HDR_SHARE_SERIAL);
628c2ecf20Sopenharmony_ci
638c2ecf20Sopenharmony_ci	/* Skip if already shared */
648c2ecf20Sopenharmony_ci	key_jump_cmd = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL |
658c2ecf20Sopenharmony_ci				   JUMP_COND_SHRD);
668c2ecf20Sopenharmony_ci	if (era < 6) {
678c2ecf20Sopenharmony_ci		if (adata->key_inline)
688c2ecf20Sopenharmony_ci			append_key_as_imm(desc, adata->key_virt,
698c2ecf20Sopenharmony_ci					  adata->keylen_pad, adata->keylen,
708c2ecf20Sopenharmony_ci					  CLASS_2 | KEY_DEST_MDHA_SPLIT |
718c2ecf20Sopenharmony_ci					  KEY_ENC);
728c2ecf20Sopenharmony_ci		else
738c2ecf20Sopenharmony_ci			append_key(desc, adata->key_dma, adata->keylen,
748c2ecf20Sopenharmony_ci				   CLASS_2 | KEY_DEST_MDHA_SPLIT | KEY_ENC);
758c2ecf20Sopenharmony_ci	} else {
768c2ecf20Sopenharmony_ci		append_proto_dkp(desc, adata);
778c2ecf20Sopenharmony_ci	}
788c2ecf20Sopenharmony_ci	set_jump_tgt_here(desc, key_jump_cmd);
798c2ecf20Sopenharmony_ci
808c2ecf20Sopenharmony_ci	/* assoclen + cryptlen = seqinlen */
818c2ecf20Sopenharmony_ci	append_math_sub(desc, REG3, SEQINLEN, REG0, CAAM_CMD_SZ);
828c2ecf20Sopenharmony_ci
838c2ecf20Sopenharmony_ci	/* Prepare to read and write cryptlen + assoclen bytes */
848c2ecf20Sopenharmony_ci	append_math_add(desc, VARSEQINLEN, ZERO, REG3, CAAM_CMD_SZ);
858c2ecf20Sopenharmony_ci	append_math_add(desc, VARSEQOUTLEN, ZERO, REG3, CAAM_CMD_SZ);
868c2ecf20Sopenharmony_ci
878c2ecf20Sopenharmony_ci	/*
888c2ecf20Sopenharmony_ci	 * MOVE_LEN opcode is not available in all SEC HW revisions,
898c2ecf20Sopenharmony_ci	 * thus need to do some magic, i.e. self-patch the descriptor
908c2ecf20Sopenharmony_ci	 * buffer.
918c2ecf20Sopenharmony_ci	 */
928c2ecf20Sopenharmony_ci	read_move_cmd = append_move(desc, MOVE_SRC_DESCBUF |
938c2ecf20Sopenharmony_ci				    MOVE_DEST_MATH3 |
948c2ecf20Sopenharmony_ci				    (0x6 << MOVE_LEN_SHIFT));
958c2ecf20Sopenharmony_ci	write_move_cmd = append_move(desc, MOVE_SRC_MATH3 |
968c2ecf20Sopenharmony_ci				     MOVE_DEST_DESCBUF |
978c2ecf20Sopenharmony_ci				     MOVE_WAITCOMP |
988c2ecf20Sopenharmony_ci				     (0x8 << MOVE_LEN_SHIFT));
998c2ecf20Sopenharmony_ci
1008c2ecf20Sopenharmony_ci	/* Class 2 operation */
1018c2ecf20Sopenharmony_ci	append_operation(desc, adata->algtype | OP_ALG_AS_INITFINAL |
1028c2ecf20Sopenharmony_ci			 OP_ALG_ENCRYPT);
1038c2ecf20Sopenharmony_ci
1048c2ecf20Sopenharmony_ci	/* Read and write cryptlen bytes */
1058c2ecf20Sopenharmony_ci	aead_append_src_dst(desc, FIFOLD_TYPE_MSG | FIFOLD_TYPE_FLUSH1);
1068c2ecf20Sopenharmony_ci
1078c2ecf20Sopenharmony_ci	set_move_tgt_here(desc, read_move_cmd);
1088c2ecf20Sopenharmony_ci	set_move_tgt_here(desc, write_move_cmd);
1098c2ecf20Sopenharmony_ci	append_cmd(desc, CMD_LOAD | DISABLE_AUTO_INFO_FIFO);
1108c2ecf20Sopenharmony_ci	append_move(desc, MOVE_SRC_INFIFO_CL | MOVE_DEST_OUTFIFO |
1118c2ecf20Sopenharmony_ci		    MOVE_AUX_LS);
1128c2ecf20Sopenharmony_ci
1138c2ecf20Sopenharmony_ci	/* Write ICV */
1148c2ecf20Sopenharmony_ci	append_seq_store(desc, icvsize, LDST_CLASS_2_CCB |
1158c2ecf20Sopenharmony_ci			 LDST_SRCDST_BYTE_CONTEXT);
1168c2ecf20Sopenharmony_ci
1178c2ecf20Sopenharmony_ci	print_hex_dump_debug("aead null enc shdesc@" __stringify(__LINE__)": ",
1188c2ecf20Sopenharmony_ci			     DUMP_PREFIX_ADDRESS, 16, 4, desc, desc_bytes(desc),
1198c2ecf20Sopenharmony_ci			     1);
1208c2ecf20Sopenharmony_ci}
1218c2ecf20Sopenharmony_ciEXPORT_SYMBOL(cnstr_shdsc_aead_null_encap);
1228c2ecf20Sopenharmony_ci
1238c2ecf20Sopenharmony_ci/**
1248c2ecf20Sopenharmony_ci * cnstr_shdsc_aead_null_decap - IPSec ESP decapsulation shared descriptor
1258c2ecf20Sopenharmony_ci *                               (non-protocol) with no (null) decryption.
1268c2ecf20Sopenharmony_ci * @desc: pointer to buffer used for descriptor construction
1278c2ecf20Sopenharmony_ci * @adata: pointer to authentication transform definitions.
1288c2ecf20Sopenharmony_ci *         A split key is required for SEC Era < 6; the size of the split key
1298c2ecf20Sopenharmony_ci *         is specified in this case. Valid algorithm values - one of
1308c2ecf20Sopenharmony_ci *         OP_ALG_ALGSEL_{MD5, SHA1, SHA224, SHA256, SHA384, SHA512} ANDed
1318c2ecf20Sopenharmony_ci *         with OP_ALG_AAI_HMAC_PRECOMP.
1328c2ecf20Sopenharmony_ci * @icvsize: integrity check value (ICV) size (truncated or full)
1338c2ecf20Sopenharmony_ci * @era: SEC Era
1348c2ecf20Sopenharmony_ci */
1358c2ecf20Sopenharmony_civoid cnstr_shdsc_aead_null_decap(u32 * const desc, struct alginfo *adata,
1368c2ecf20Sopenharmony_ci				 unsigned int icvsize, int era)
1378c2ecf20Sopenharmony_ci{
1388c2ecf20Sopenharmony_ci	u32 *key_jump_cmd, *read_move_cmd, *write_move_cmd, *jump_cmd;
1398c2ecf20Sopenharmony_ci
1408c2ecf20Sopenharmony_ci	init_sh_desc(desc, HDR_SHARE_SERIAL);
1418c2ecf20Sopenharmony_ci
1428c2ecf20Sopenharmony_ci	/* Skip if already shared */
1438c2ecf20Sopenharmony_ci	key_jump_cmd = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL |
1448c2ecf20Sopenharmony_ci				   JUMP_COND_SHRD);
1458c2ecf20Sopenharmony_ci	if (era < 6) {
1468c2ecf20Sopenharmony_ci		if (adata->key_inline)
1478c2ecf20Sopenharmony_ci			append_key_as_imm(desc, adata->key_virt,
1488c2ecf20Sopenharmony_ci					  adata->keylen_pad, adata->keylen,
1498c2ecf20Sopenharmony_ci					  CLASS_2 | KEY_DEST_MDHA_SPLIT |
1508c2ecf20Sopenharmony_ci					  KEY_ENC);
1518c2ecf20Sopenharmony_ci		else
1528c2ecf20Sopenharmony_ci			append_key(desc, adata->key_dma, adata->keylen,
1538c2ecf20Sopenharmony_ci				   CLASS_2 | KEY_DEST_MDHA_SPLIT | KEY_ENC);
1548c2ecf20Sopenharmony_ci	} else {
1558c2ecf20Sopenharmony_ci		append_proto_dkp(desc, adata);
1568c2ecf20Sopenharmony_ci	}
1578c2ecf20Sopenharmony_ci	set_jump_tgt_here(desc, key_jump_cmd);
1588c2ecf20Sopenharmony_ci
1598c2ecf20Sopenharmony_ci	/* Class 2 operation */
1608c2ecf20Sopenharmony_ci	append_operation(desc, adata->algtype | OP_ALG_AS_INITFINAL |
1618c2ecf20Sopenharmony_ci			 OP_ALG_DECRYPT | OP_ALG_ICV_ON);
1628c2ecf20Sopenharmony_ci
1638c2ecf20Sopenharmony_ci	/* assoclen + cryptlen = seqoutlen */
1648c2ecf20Sopenharmony_ci	append_math_sub(desc, REG2, SEQOUTLEN, REG0, CAAM_CMD_SZ);
1658c2ecf20Sopenharmony_ci
1668c2ecf20Sopenharmony_ci	/* Prepare to read and write cryptlen + assoclen bytes */
1678c2ecf20Sopenharmony_ci	append_math_add(desc, VARSEQINLEN, ZERO, REG2, CAAM_CMD_SZ);
1688c2ecf20Sopenharmony_ci	append_math_add(desc, VARSEQOUTLEN, ZERO, REG2, CAAM_CMD_SZ);
1698c2ecf20Sopenharmony_ci
1708c2ecf20Sopenharmony_ci	/*
1718c2ecf20Sopenharmony_ci	 * MOVE_LEN opcode is not available in all SEC HW revisions,
1728c2ecf20Sopenharmony_ci	 * thus need to do some magic, i.e. self-patch the descriptor
1738c2ecf20Sopenharmony_ci	 * buffer.
1748c2ecf20Sopenharmony_ci	 */
1758c2ecf20Sopenharmony_ci	read_move_cmd = append_move(desc, MOVE_SRC_DESCBUF |
1768c2ecf20Sopenharmony_ci				    MOVE_DEST_MATH2 |
1778c2ecf20Sopenharmony_ci				    (0x6 << MOVE_LEN_SHIFT));
1788c2ecf20Sopenharmony_ci	write_move_cmd = append_move(desc, MOVE_SRC_MATH2 |
1798c2ecf20Sopenharmony_ci				     MOVE_DEST_DESCBUF |
1808c2ecf20Sopenharmony_ci				     MOVE_WAITCOMP |
1818c2ecf20Sopenharmony_ci				     (0x8 << MOVE_LEN_SHIFT));
1828c2ecf20Sopenharmony_ci
1838c2ecf20Sopenharmony_ci	/* Read and write cryptlen bytes */
1848c2ecf20Sopenharmony_ci	aead_append_src_dst(desc, FIFOLD_TYPE_MSG | FIFOLD_TYPE_FLUSH1);
1858c2ecf20Sopenharmony_ci
1868c2ecf20Sopenharmony_ci	/*
1878c2ecf20Sopenharmony_ci	 * Insert a NOP here, since we need at least 4 instructions between
1888c2ecf20Sopenharmony_ci	 * code patching the descriptor buffer and the location being patched.
1898c2ecf20Sopenharmony_ci	 */
1908c2ecf20Sopenharmony_ci	jump_cmd = append_jump(desc, JUMP_TEST_ALL);
1918c2ecf20Sopenharmony_ci	set_jump_tgt_here(desc, jump_cmd);
1928c2ecf20Sopenharmony_ci
1938c2ecf20Sopenharmony_ci	set_move_tgt_here(desc, read_move_cmd);
1948c2ecf20Sopenharmony_ci	set_move_tgt_here(desc, write_move_cmd);
1958c2ecf20Sopenharmony_ci	append_cmd(desc, CMD_LOAD | DISABLE_AUTO_INFO_FIFO);
1968c2ecf20Sopenharmony_ci	append_move(desc, MOVE_SRC_INFIFO_CL | MOVE_DEST_OUTFIFO |
1978c2ecf20Sopenharmony_ci		    MOVE_AUX_LS);
1988c2ecf20Sopenharmony_ci	append_cmd(desc, CMD_LOAD | ENABLE_AUTO_INFO_FIFO);
1998c2ecf20Sopenharmony_ci
2008c2ecf20Sopenharmony_ci	/* Load ICV */
2018c2ecf20Sopenharmony_ci	append_seq_fifo_load(desc, icvsize, FIFOLD_CLASS_CLASS2 |
2028c2ecf20Sopenharmony_ci			     FIFOLD_TYPE_LAST2 | FIFOLD_TYPE_ICV);
2038c2ecf20Sopenharmony_ci
2048c2ecf20Sopenharmony_ci	print_hex_dump_debug("aead null dec shdesc@" __stringify(__LINE__)": ",
2058c2ecf20Sopenharmony_ci			     DUMP_PREFIX_ADDRESS, 16, 4, desc, desc_bytes(desc),
2068c2ecf20Sopenharmony_ci			     1);
2078c2ecf20Sopenharmony_ci}
2088c2ecf20Sopenharmony_ciEXPORT_SYMBOL(cnstr_shdsc_aead_null_decap);
2098c2ecf20Sopenharmony_ci
2108c2ecf20Sopenharmony_cistatic void init_sh_desc_key_aead(u32 * const desc,
2118c2ecf20Sopenharmony_ci				  struct alginfo * const cdata,
2128c2ecf20Sopenharmony_ci				  struct alginfo * const adata,
2138c2ecf20Sopenharmony_ci				  const bool is_rfc3686, u32 *nonce, int era)
2148c2ecf20Sopenharmony_ci{
2158c2ecf20Sopenharmony_ci	u32 *key_jump_cmd;
2168c2ecf20Sopenharmony_ci	unsigned int enckeylen = cdata->keylen;
2178c2ecf20Sopenharmony_ci
2188c2ecf20Sopenharmony_ci	/* Note: Context registers are saved. */
2198c2ecf20Sopenharmony_ci	init_sh_desc(desc, HDR_SHARE_SERIAL | HDR_SAVECTX);
2208c2ecf20Sopenharmony_ci
2218c2ecf20Sopenharmony_ci	/* Skip if already shared */
2228c2ecf20Sopenharmony_ci	key_jump_cmd = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL |
2238c2ecf20Sopenharmony_ci				   JUMP_COND_SHRD);
2248c2ecf20Sopenharmony_ci
2258c2ecf20Sopenharmony_ci	/*
2268c2ecf20Sopenharmony_ci	 * RFC3686 specific:
2278c2ecf20Sopenharmony_ci	 *	| key = {AUTH_KEY, ENC_KEY, NONCE}
2288c2ecf20Sopenharmony_ci	 *	| enckeylen = encryption key size + nonce size
2298c2ecf20Sopenharmony_ci	 */
2308c2ecf20Sopenharmony_ci	if (is_rfc3686)
2318c2ecf20Sopenharmony_ci		enckeylen -= CTR_RFC3686_NONCE_SIZE;
2328c2ecf20Sopenharmony_ci
2338c2ecf20Sopenharmony_ci	if (era < 6) {
2348c2ecf20Sopenharmony_ci		if (adata->key_inline)
2358c2ecf20Sopenharmony_ci			append_key_as_imm(desc, adata->key_virt,
2368c2ecf20Sopenharmony_ci					  adata->keylen_pad, adata->keylen,
2378c2ecf20Sopenharmony_ci					  CLASS_2 | KEY_DEST_MDHA_SPLIT |
2388c2ecf20Sopenharmony_ci					  KEY_ENC);
2398c2ecf20Sopenharmony_ci		else
2408c2ecf20Sopenharmony_ci			append_key(desc, adata->key_dma, adata->keylen,
2418c2ecf20Sopenharmony_ci				   CLASS_2 | KEY_DEST_MDHA_SPLIT | KEY_ENC);
2428c2ecf20Sopenharmony_ci	} else {
2438c2ecf20Sopenharmony_ci		append_proto_dkp(desc, adata);
2448c2ecf20Sopenharmony_ci	}
2458c2ecf20Sopenharmony_ci
2468c2ecf20Sopenharmony_ci	if (cdata->key_inline)
2478c2ecf20Sopenharmony_ci		append_key_as_imm(desc, cdata->key_virt, enckeylen,
2488c2ecf20Sopenharmony_ci				  enckeylen, CLASS_1 | KEY_DEST_CLASS_REG);
2498c2ecf20Sopenharmony_ci	else
2508c2ecf20Sopenharmony_ci		append_key(desc, cdata->key_dma, enckeylen, CLASS_1 |
2518c2ecf20Sopenharmony_ci			   KEY_DEST_CLASS_REG);
2528c2ecf20Sopenharmony_ci
2538c2ecf20Sopenharmony_ci	/* Load Counter into CONTEXT1 reg */
2548c2ecf20Sopenharmony_ci	if (is_rfc3686) {
2558c2ecf20Sopenharmony_ci		append_load_as_imm(desc, nonce, CTR_RFC3686_NONCE_SIZE,
2568c2ecf20Sopenharmony_ci				   LDST_CLASS_IND_CCB |
2578c2ecf20Sopenharmony_ci				   LDST_SRCDST_BYTE_OUTFIFO | LDST_IMM);
2588c2ecf20Sopenharmony_ci		append_move(desc,
2598c2ecf20Sopenharmony_ci			    MOVE_SRC_OUTFIFO |
2608c2ecf20Sopenharmony_ci			    MOVE_DEST_CLASS1CTX |
2618c2ecf20Sopenharmony_ci			    (16 << MOVE_OFFSET_SHIFT) |
2628c2ecf20Sopenharmony_ci			    (CTR_RFC3686_NONCE_SIZE << MOVE_LEN_SHIFT));
2638c2ecf20Sopenharmony_ci	}
2648c2ecf20Sopenharmony_ci
2658c2ecf20Sopenharmony_ci	set_jump_tgt_here(desc, key_jump_cmd);
2668c2ecf20Sopenharmony_ci}
2678c2ecf20Sopenharmony_ci
2688c2ecf20Sopenharmony_ci/**
2698c2ecf20Sopenharmony_ci * cnstr_shdsc_aead_encap - IPSec ESP encapsulation shared descriptor
2708c2ecf20Sopenharmony_ci *                          (non-protocol).
2718c2ecf20Sopenharmony_ci * @desc: pointer to buffer used for descriptor construction
2728c2ecf20Sopenharmony_ci * @cdata: pointer to block cipher transform definitions
2738c2ecf20Sopenharmony_ci *         Valid algorithm values - one of OP_ALG_ALGSEL_{AES, DES, 3DES} ANDed
2748c2ecf20Sopenharmony_ci *         with OP_ALG_AAI_CBC or OP_ALG_AAI_CTR_MOD128.
2758c2ecf20Sopenharmony_ci * @adata: pointer to authentication transform definitions.
2768c2ecf20Sopenharmony_ci *         A split key is required for SEC Era < 6; the size of the split key
2778c2ecf20Sopenharmony_ci *         is specified in this case. Valid algorithm values - one of
2788c2ecf20Sopenharmony_ci *         OP_ALG_ALGSEL_{MD5, SHA1, SHA224, SHA256, SHA384, SHA512} ANDed
2798c2ecf20Sopenharmony_ci *         with OP_ALG_AAI_HMAC_PRECOMP.
2808c2ecf20Sopenharmony_ci * @ivsize: initialization vector size
2818c2ecf20Sopenharmony_ci * @icvsize: integrity check value (ICV) size (truncated or full)
2828c2ecf20Sopenharmony_ci * @is_rfc3686: true when ctr(aes) is wrapped by rfc3686 template
2838c2ecf20Sopenharmony_ci * @nonce: pointer to rfc3686 nonce
2848c2ecf20Sopenharmony_ci * @ctx1_iv_off: IV offset in CONTEXT1 register
2858c2ecf20Sopenharmony_ci * @is_qi: true when called from caam/qi
2868c2ecf20Sopenharmony_ci * @era: SEC Era
2878c2ecf20Sopenharmony_ci */
2888c2ecf20Sopenharmony_civoid cnstr_shdsc_aead_encap(u32 * const desc, struct alginfo *cdata,
2898c2ecf20Sopenharmony_ci			    struct alginfo *adata, unsigned int ivsize,
2908c2ecf20Sopenharmony_ci			    unsigned int icvsize, const bool is_rfc3686,
2918c2ecf20Sopenharmony_ci			    u32 *nonce, const u32 ctx1_iv_off, const bool is_qi,
2928c2ecf20Sopenharmony_ci			    int era)
2938c2ecf20Sopenharmony_ci{
2948c2ecf20Sopenharmony_ci	/* Note: Context registers are saved. */
2958c2ecf20Sopenharmony_ci	init_sh_desc_key_aead(desc, cdata, adata, is_rfc3686, nonce, era);
2968c2ecf20Sopenharmony_ci
2978c2ecf20Sopenharmony_ci	/* Class 2 operation */
2988c2ecf20Sopenharmony_ci	append_operation(desc, adata->algtype | OP_ALG_AS_INITFINAL |
2998c2ecf20Sopenharmony_ci			 OP_ALG_ENCRYPT);
3008c2ecf20Sopenharmony_ci
3018c2ecf20Sopenharmony_ci	if (is_qi) {
3028c2ecf20Sopenharmony_ci		u32 *wait_load_cmd;
3038c2ecf20Sopenharmony_ci
3048c2ecf20Sopenharmony_ci		/* REG3 = assoclen */
3058c2ecf20Sopenharmony_ci		append_seq_load(desc, 4, LDST_CLASS_DECO |
3068c2ecf20Sopenharmony_ci				LDST_SRCDST_WORD_DECO_MATH3 |
3078c2ecf20Sopenharmony_ci				(4 << LDST_OFFSET_SHIFT));
3088c2ecf20Sopenharmony_ci
3098c2ecf20Sopenharmony_ci		wait_load_cmd = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL |
3108c2ecf20Sopenharmony_ci					    JUMP_COND_CALM | JUMP_COND_NCP |
3118c2ecf20Sopenharmony_ci					    JUMP_COND_NOP | JUMP_COND_NIP |
3128c2ecf20Sopenharmony_ci					    JUMP_COND_NIFP);
3138c2ecf20Sopenharmony_ci		set_jump_tgt_here(desc, wait_load_cmd);
3148c2ecf20Sopenharmony_ci
3158c2ecf20Sopenharmony_ci		append_seq_load(desc, ivsize, LDST_CLASS_1_CCB |
3168c2ecf20Sopenharmony_ci				LDST_SRCDST_BYTE_CONTEXT |
3178c2ecf20Sopenharmony_ci				(ctx1_iv_off << LDST_OFFSET_SHIFT));
3188c2ecf20Sopenharmony_ci	}
3198c2ecf20Sopenharmony_ci
3208c2ecf20Sopenharmony_ci	/* Read and write assoclen bytes */
3218c2ecf20Sopenharmony_ci	if (is_qi || era < 3) {
3228c2ecf20Sopenharmony_ci		append_math_add(desc, VARSEQINLEN, ZERO, REG3, CAAM_CMD_SZ);
3238c2ecf20Sopenharmony_ci		append_math_add(desc, VARSEQOUTLEN, ZERO, REG3, CAAM_CMD_SZ);
3248c2ecf20Sopenharmony_ci	} else {
3258c2ecf20Sopenharmony_ci		append_math_add(desc, VARSEQINLEN, ZERO, DPOVRD, CAAM_CMD_SZ);
3268c2ecf20Sopenharmony_ci		append_math_add(desc, VARSEQOUTLEN, ZERO, DPOVRD, CAAM_CMD_SZ);
3278c2ecf20Sopenharmony_ci	}
3288c2ecf20Sopenharmony_ci
3298c2ecf20Sopenharmony_ci	/* Skip assoc data */
3308c2ecf20Sopenharmony_ci	append_seq_fifo_store(desc, 0, FIFOST_TYPE_SKIP | FIFOLDST_VLF);
3318c2ecf20Sopenharmony_ci
3328c2ecf20Sopenharmony_ci	/* read assoc before reading payload */
3338c2ecf20Sopenharmony_ci	append_seq_fifo_load(desc, 0, FIFOLD_CLASS_CLASS2 | FIFOLD_TYPE_MSG |
3348c2ecf20Sopenharmony_ci				      FIFOLDST_VLF);
3358c2ecf20Sopenharmony_ci
3368c2ecf20Sopenharmony_ci	/* Load Counter into CONTEXT1 reg */
3378c2ecf20Sopenharmony_ci	if (is_rfc3686)
3388c2ecf20Sopenharmony_ci		append_load_imm_be32(desc, 1, LDST_IMM | LDST_CLASS_1_CCB |
3398c2ecf20Sopenharmony_ci				     LDST_SRCDST_BYTE_CONTEXT |
3408c2ecf20Sopenharmony_ci				     ((ctx1_iv_off + CTR_RFC3686_IV_SIZE) <<
3418c2ecf20Sopenharmony_ci				      LDST_OFFSET_SHIFT));
3428c2ecf20Sopenharmony_ci
3438c2ecf20Sopenharmony_ci	/* Class 1 operation */
3448c2ecf20Sopenharmony_ci	append_operation(desc, cdata->algtype | OP_ALG_AS_INITFINAL |
3458c2ecf20Sopenharmony_ci			 OP_ALG_ENCRYPT);
3468c2ecf20Sopenharmony_ci
3478c2ecf20Sopenharmony_ci	/* Read and write cryptlen bytes */
3488c2ecf20Sopenharmony_ci	append_math_add(desc, VARSEQINLEN, SEQINLEN, REG0, CAAM_CMD_SZ);
3498c2ecf20Sopenharmony_ci	append_math_add(desc, VARSEQOUTLEN, SEQINLEN, REG0, CAAM_CMD_SZ);
3508c2ecf20Sopenharmony_ci	aead_append_src_dst(desc, FIFOLD_TYPE_MSG1OUT2);
3518c2ecf20Sopenharmony_ci
3528c2ecf20Sopenharmony_ci	/* Write ICV */
3538c2ecf20Sopenharmony_ci	append_seq_store(desc, icvsize, LDST_CLASS_2_CCB |
3548c2ecf20Sopenharmony_ci			 LDST_SRCDST_BYTE_CONTEXT);
3558c2ecf20Sopenharmony_ci
3568c2ecf20Sopenharmony_ci	print_hex_dump_debug("aead enc shdesc@" __stringify(__LINE__)": ",
3578c2ecf20Sopenharmony_ci			     DUMP_PREFIX_ADDRESS, 16, 4, desc, desc_bytes(desc),
3588c2ecf20Sopenharmony_ci			     1);
3598c2ecf20Sopenharmony_ci}
3608c2ecf20Sopenharmony_ciEXPORT_SYMBOL(cnstr_shdsc_aead_encap);
3618c2ecf20Sopenharmony_ci
3628c2ecf20Sopenharmony_ci/**
3638c2ecf20Sopenharmony_ci * cnstr_shdsc_aead_decap - IPSec ESP decapsulation shared descriptor
3648c2ecf20Sopenharmony_ci *                          (non-protocol).
3658c2ecf20Sopenharmony_ci * @desc: pointer to buffer used for descriptor construction
3668c2ecf20Sopenharmony_ci * @cdata: pointer to block cipher transform definitions
3678c2ecf20Sopenharmony_ci *         Valid algorithm values - one of OP_ALG_ALGSEL_{AES, DES, 3DES} ANDed
3688c2ecf20Sopenharmony_ci *         with OP_ALG_AAI_CBC or OP_ALG_AAI_CTR_MOD128.
3698c2ecf20Sopenharmony_ci * @adata: pointer to authentication transform definitions.
3708c2ecf20Sopenharmony_ci *         A split key is required for SEC Era < 6; the size of the split key
3718c2ecf20Sopenharmony_ci *         is specified in this case. Valid algorithm values - one of
3728c2ecf20Sopenharmony_ci *         OP_ALG_ALGSEL_{MD5, SHA1, SHA224, SHA256, SHA384, SHA512} ANDed
3738c2ecf20Sopenharmony_ci *         with OP_ALG_AAI_HMAC_PRECOMP.
3748c2ecf20Sopenharmony_ci * @ivsize: initialization vector size
3758c2ecf20Sopenharmony_ci * @icvsize: integrity check value (ICV) size (truncated or full)
3768c2ecf20Sopenharmony_ci * @geniv: whether to generate Encrypted Chain IV
3778c2ecf20Sopenharmony_ci * @is_rfc3686: true when ctr(aes) is wrapped by rfc3686 template
3788c2ecf20Sopenharmony_ci * @nonce: pointer to rfc3686 nonce
3798c2ecf20Sopenharmony_ci * @ctx1_iv_off: IV offset in CONTEXT1 register
3808c2ecf20Sopenharmony_ci * @is_qi: true when called from caam/qi
3818c2ecf20Sopenharmony_ci * @era: SEC Era
3828c2ecf20Sopenharmony_ci */
3838c2ecf20Sopenharmony_civoid cnstr_shdsc_aead_decap(u32 * const desc, struct alginfo *cdata,
3848c2ecf20Sopenharmony_ci			    struct alginfo *adata, unsigned int ivsize,
3858c2ecf20Sopenharmony_ci			    unsigned int icvsize, const bool geniv,
3868c2ecf20Sopenharmony_ci			    const bool is_rfc3686, u32 *nonce,
3878c2ecf20Sopenharmony_ci			    const u32 ctx1_iv_off, const bool is_qi, int era)
3888c2ecf20Sopenharmony_ci{
3898c2ecf20Sopenharmony_ci	/* Note: Context registers are saved. */
3908c2ecf20Sopenharmony_ci	init_sh_desc_key_aead(desc, cdata, adata, is_rfc3686, nonce, era);
3918c2ecf20Sopenharmony_ci
3928c2ecf20Sopenharmony_ci	/* Class 2 operation */
3938c2ecf20Sopenharmony_ci	append_operation(desc, adata->algtype | OP_ALG_AS_INITFINAL |
3948c2ecf20Sopenharmony_ci			 OP_ALG_DECRYPT | OP_ALG_ICV_ON);
3958c2ecf20Sopenharmony_ci
3968c2ecf20Sopenharmony_ci	if (is_qi) {
3978c2ecf20Sopenharmony_ci		u32 *wait_load_cmd;
3988c2ecf20Sopenharmony_ci
3998c2ecf20Sopenharmony_ci		/* REG3 = assoclen */
4008c2ecf20Sopenharmony_ci		append_seq_load(desc, 4, LDST_CLASS_DECO |
4018c2ecf20Sopenharmony_ci				LDST_SRCDST_WORD_DECO_MATH3 |
4028c2ecf20Sopenharmony_ci				(4 << LDST_OFFSET_SHIFT));
4038c2ecf20Sopenharmony_ci
4048c2ecf20Sopenharmony_ci		wait_load_cmd = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL |
4058c2ecf20Sopenharmony_ci					    JUMP_COND_CALM | JUMP_COND_NCP |
4068c2ecf20Sopenharmony_ci					    JUMP_COND_NOP | JUMP_COND_NIP |
4078c2ecf20Sopenharmony_ci					    JUMP_COND_NIFP);
4088c2ecf20Sopenharmony_ci		set_jump_tgt_here(desc, wait_load_cmd);
4098c2ecf20Sopenharmony_ci
4108c2ecf20Sopenharmony_ci		if (!geniv)
4118c2ecf20Sopenharmony_ci			append_seq_load(desc, ivsize, LDST_CLASS_1_CCB |
4128c2ecf20Sopenharmony_ci					LDST_SRCDST_BYTE_CONTEXT |
4138c2ecf20Sopenharmony_ci					(ctx1_iv_off << LDST_OFFSET_SHIFT));
4148c2ecf20Sopenharmony_ci	}
4158c2ecf20Sopenharmony_ci
4168c2ecf20Sopenharmony_ci	/* Read and write assoclen bytes */
4178c2ecf20Sopenharmony_ci	if (is_qi || era < 3) {
4188c2ecf20Sopenharmony_ci		append_math_add(desc, VARSEQINLEN, ZERO, REG3, CAAM_CMD_SZ);
4198c2ecf20Sopenharmony_ci		if (geniv)
4208c2ecf20Sopenharmony_ci			append_math_add_imm_u32(desc, VARSEQOUTLEN, REG3, IMM,
4218c2ecf20Sopenharmony_ci						ivsize);
4228c2ecf20Sopenharmony_ci		else
4238c2ecf20Sopenharmony_ci			append_math_add(desc, VARSEQOUTLEN, ZERO, REG3,
4248c2ecf20Sopenharmony_ci					CAAM_CMD_SZ);
4258c2ecf20Sopenharmony_ci	} else {
4268c2ecf20Sopenharmony_ci		append_math_add(desc, VARSEQINLEN, ZERO, DPOVRD, CAAM_CMD_SZ);
4278c2ecf20Sopenharmony_ci		if (geniv)
4288c2ecf20Sopenharmony_ci			append_math_add_imm_u32(desc, VARSEQOUTLEN, DPOVRD, IMM,
4298c2ecf20Sopenharmony_ci						ivsize);
4308c2ecf20Sopenharmony_ci		else
4318c2ecf20Sopenharmony_ci			append_math_add(desc, VARSEQOUTLEN, ZERO, DPOVRD,
4328c2ecf20Sopenharmony_ci					CAAM_CMD_SZ);
4338c2ecf20Sopenharmony_ci	}
4348c2ecf20Sopenharmony_ci
4358c2ecf20Sopenharmony_ci	/* Skip assoc data */
4368c2ecf20Sopenharmony_ci	append_seq_fifo_store(desc, 0, FIFOST_TYPE_SKIP | FIFOLDST_VLF);
4378c2ecf20Sopenharmony_ci
4388c2ecf20Sopenharmony_ci	/* read assoc before reading payload */
4398c2ecf20Sopenharmony_ci	append_seq_fifo_load(desc, 0, FIFOLD_CLASS_CLASS2 | FIFOLD_TYPE_MSG |
4408c2ecf20Sopenharmony_ci			     KEY_VLF);
4418c2ecf20Sopenharmony_ci
4428c2ecf20Sopenharmony_ci	if (geniv) {
4438c2ecf20Sopenharmony_ci		append_seq_load(desc, ivsize, LDST_CLASS_1_CCB |
4448c2ecf20Sopenharmony_ci				LDST_SRCDST_BYTE_CONTEXT |
4458c2ecf20Sopenharmony_ci				(ctx1_iv_off << LDST_OFFSET_SHIFT));
4468c2ecf20Sopenharmony_ci		append_move(desc, MOVE_SRC_CLASS1CTX | MOVE_DEST_CLASS2INFIFO |
4478c2ecf20Sopenharmony_ci			    (ctx1_iv_off << MOVE_OFFSET_SHIFT) | ivsize);
4488c2ecf20Sopenharmony_ci	}
4498c2ecf20Sopenharmony_ci
4508c2ecf20Sopenharmony_ci	/* Load Counter into CONTEXT1 reg */
4518c2ecf20Sopenharmony_ci	if (is_rfc3686)
4528c2ecf20Sopenharmony_ci		append_load_imm_be32(desc, 1, LDST_IMM | LDST_CLASS_1_CCB |
4538c2ecf20Sopenharmony_ci				     LDST_SRCDST_BYTE_CONTEXT |
4548c2ecf20Sopenharmony_ci				     ((ctx1_iv_off + CTR_RFC3686_IV_SIZE) <<
4558c2ecf20Sopenharmony_ci				      LDST_OFFSET_SHIFT));
4568c2ecf20Sopenharmony_ci
4578c2ecf20Sopenharmony_ci	/* Choose operation */
4588c2ecf20Sopenharmony_ci	if (ctx1_iv_off)
4598c2ecf20Sopenharmony_ci		append_operation(desc, cdata->algtype | OP_ALG_AS_INITFINAL |
4608c2ecf20Sopenharmony_ci				 OP_ALG_DECRYPT);
4618c2ecf20Sopenharmony_ci	else
4628c2ecf20Sopenharmony_ci		append_dec_op1(desc, cdata->algtype);
4638c2ecf20Sopenharmony_ci
4648c2ecf20Sopenharmony_ci	/* Read and write cryptlen bytes */
4658c2ecf20Sopenharmony_ci	append_math_add(desc, VARSEQINLEN, SEQOUTLEN, REG0, CAAM_CMD_SZ);
4668c2ecf20Sopenharmony_ci	append_math_add(desc, VARSEQOUTLEN, SEQOUTLEN, REG0, CAAM_CMD_SZ);
4678c2ecf20Sopenharmony_ci	aead_append_src_dst(desc, FIFOLD_TYPE_MSG);
4688c2ecf20Sopenharmony_ci
4698c2ecf20Sopenharmony_ci	/* Load ICV */
4708c2ecf20Sopenharmony_ci	append_seq_fifo_load(desc, icvsize, FIFOLD_CLASS_CLASS2 |
4718c2ecf20Sopenharmony_ci			     FIFOLD_TYPE_LAST2 | FIFOLD_TYPE_ICV);
4728c2ecf20Sopenharmony_ci
4738c2ecf20Sopenharmony_ci	print_hex_dump_debug("aead dec shdesc@" __stringify(__LINE__)": ",
4748c2ecf20Sopenharmony_ci			     DUMP_PREFIX_ADDRESS, 16, 4, desc, desc_bytes(desc),
4758c2ecf20Sopenharmony_ci			     1);
4768c2ecf20Sopenharmony_ci}
4778c2ecf20Sopenharmony_ciEXPORT_SYMBOL(cnstr_shdsc_aead_decap);
4788c2ecf20Sopenharmony_ci
4798c2ecf20Sopenharmony_ci/**
4808c2ecf20Sopenharmony_ci * cnstr_shdsc_aead_givencap - IPSec ESP encapsulation shared descriptor
4818c2ecf20Sopenharmony_ci *                             (non-protocol) with HW-generated initialization
4828c2ecf20Sopenharmony_ci *                             vector.
4838c2ecf20Sopenharmony_ci * @desc: pointer to buffer used for descriptor construction
4848c2ecf20Sopenharmony_ci * @cdata: pointer to block cipher transform definitions
4858c2ecf20Sopenharmony_ci *         Valid algorithm values - one of OP_ALG_ALGSEL_{AES, DES, 3DES} ANDed
4868c2ecf20Sopenharmony_ci *         with OP_ALG_AAI_CBC or OP_ALG_AAI_CTR_MOD128.
4878c2ecf20Sopenharmony_ci * @adata: pointer to authentication transform definitions.
4888c2ecf20Sopenharmony_ci *         A split key is required for SEC Era < 6; the size of the split key
4898c2ecf20Sopenharmony_ci *         is specified in this case. Valid algorithm values - one of
4908c2ecf20Sopenharmony_ci *         OP_ALG_ALGSEL_{MD5, SHA1, SHA224, SHA256, SHA384, SHA512} ANDed
4918c2ecf20Sopenharmony_ci *         with OP_ALG_AAI_HMAC_PRECOMP.
4928c2ecf20Sopenharmony_ci * @ivsize: initialization vector size
4938c2ecf20Sopenharmony_ci * @icvsize: integrity check value (ICV) size (truncated or full)
4948c2ecf20Sopenharmony_ci * @is_rfc3686: true when ctr(aes) is wrapped by rfc3686 template
4958c2ecf20Sopenharmony_ci * @nonce: pointer to rfc3686 nonce
4968c2ecf20Sopenharmony_ci * @ctx1_iv_off: IV offset in CONTEXT1 register
4978c2ecf20Sopenharmony_ci * @is_qi: true when called from caam/qi
4988c2ecf20Sopenharmony_ci * @era: SEC Era
4998c2ecf20Sopenharmony_ci */
5008c2ecf20Sopenharmony_civoid cnstr_shdsc_aead_givencap(u32 * const desc, struct alginfo *cdata,
5018c2ecf20Sopenharmony_ci			       struct alginfo *adata, unsigned int ivsize,
5028c2ecf20Sopenharmony_ci			       unsigned int icvsize, const bool is_rfc3686,
5038c2ecf20Sopenharmony_ci			       u32 *nonce, const u32 ctx1_iv_off,
5048c2ecf20Sopenharmony_ci			       const bool is_qi, int era)
5058c2ecf20Sopenharmony_ci{
5068c2ecf20Sopenharmony_ci	u32 geniv, moveiv;
5078c2ecf20Sopenharmony_ci	u32 *wait_cmd;
5088c2ecf20Sopenharmony_ci
5098c2ecf20Sopenharmony_ci	/* Note: Context registers are saved. */
5108c2ecf20Sopenharmony_ci	init_sh_desc_key_aead(desc, cdata, adata, is_rfc3686, nonce, era);
5118c2ecf20Sopenharmony_ci
5128c2ecf20Sopenharmony_ci	if (is_qi) {
5138c2ecf20Sopenharmony_ci		u32 *wait_load_cmd;
5148c2ecf20Sopenharmony_ci
5158c2ecf20Sopenharmony_ci		/* REG3 = assoclen */
5168c2ecf20Sopenharmony_ci		append_seq_load(desc, 4, LDST_CLASS_DECO |
5178c2ecf20Sopenharmony_ci				LDST_SRCDST_WORD_DECO_MATH3 |
5188c2ecf20Sopenharmony_ci				(4 << LDST_OFFSET_SHIFT));
5198c2ecf20Sopenharmony_ci
5208c2ecf20Sopenharmony_ci		wait_load_cmd = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL |
5218c2ecf20Sopenharmony_ci					    JUMP_COND_CALM | JUMP_COND_NCP |
5228c2ecf20Sopenharmony_ci					    JUMP_COND_NOP | JUMP_COND_NIP |
5238c2ecf20Sopenharmony_ci					    JUMP_COND_NIFP);
5248c2ecf20Sopenharmony_ci		set_jump_tgt_here(desc, wait_load_cmd);
5258c2ecf20Sopenharmony_ci	}
5268c2ecf20Sopenharmony_ci
5278c2ecf20Sopenharmony_ci	if (is_rfc3686) {
5288c2ecf20Sopenharmony_ci		if (is_qi)
5298c2ecf20Sopenharmony_ci			append_seq_load(desc, ivsize, LDST_CLASS_1_CCB |
5308c2ecf20Sopenharmony_ci					LDST_SRCDST_BYTE_CONTEXT |
5318c2ecf20Sopenharmony_ci					(ctx1_iv_off << LDST_OFFSET_SHIFT));
5328c2ecf20Sopenharmony_ci
5338c2ecf20Sopenharmony_ci		goto copy_iv;
5348c2ecf20Sopenharmony_ci	}
5358c2ecf20Sopenharmony_ci
5368c2ecf20Sopenharmony_ci	/* Generate IV */
5378c2ecf20Sopenharmony_ci	geniv = NFIFOENTRY_STYPE_PAD | NFIFOENTRY_DEST_DECO |
5388c2ecf20Sopenharmony_ci		NFIFOENTRY_DTYPE_MSG | NFIFOENTRY_LC1 |
5398c2ecf20Sopenharmony_ci		NFIFOENTRY_PTYPE_RND | (ivsize << NFIFOENTRY_DLEN_SHIFT);
5408c2ecf20Sopenharmony_ci	append_load_imm_u32(desc, geniv, LDST_CLASS_IND_CCB |
5418c2ecf20Sopenharmony_ci			    LDST_SRCDST_WORD_INFO_FIFO | LDST_IMM);
5428c2ecf20Sopenharmony_ci	append_cmd(desc, CMD_LOAD | DISABLE_AUTO_INFO_FIFO);
5438c2ecf20Sopenharmony_ci	append_move(desc, MOVE_WAITCOMP |
5448c2ecf20Sopenharmony_ci		    MOVE_SRC_INFIFO | MOVE_DEST_CLASS1CTX |
5458c2ecf20Sopenharmony_ci		    (ctx1_iv_off << MOVE_OFFSET_SHIFT) |
5468c2ecf20Sopenharmony_ci		    (ivsize << MOVE_LEN_SHIFT));
5478c2ecf20Sopenharmony_ci	append_cmd(desc, CMD_LOAD | ENABLE_AUTO_INFO_FIFO);
5488c2ecf20Sopenharmony_ci
5498c2ecf20Sopenharmony_cicopy_iv:
5508c2ecf20Sopenharmony_ci	/* Copy IV to class 1 context */
5518c2ecf20Sopenharmony_ci	append_move(desc, MOVE_SRC_CLASS1CTX | MOVE_DEST_OUTFIFO |
5528c2ecf20Sopenharmony_ci		    (ctx1_iv_off << MOVE_OFFSET_SHIFT) |
5538c2ecf20Sopenharmony_ci		    (ivsize << MOVE_LEN_SHIFT));
5548c2ecf20Sopenharmony_ci
5558c2ecf20Sopenharmony_ci	/* Return to encryption */
5568c2ecf20Sopenharmony_ci	append_operation(desc, adata->algtype | OP_ALG_AS_INITFINAL |
5578c2ecf20Sopenharmony_ci			 OP_ALG_ENCRYPT);
5588c2ecf20Sopenharmony_ci
5598c2ecf20Sopenharmony_ci	/* Read and write assoclen bytes */
5608c2ecf20Sopenharmony_ci	if (is_qi || era < 3) {
5618c2ecf20Sopenharmony_ci		append_math_add(desc, VARSEQINLEN, ZERO, REG3, CAAM_CMD_SZ);
5628c2ecf20Sopenharmony_ci		append_math_add(desc, VARSEQOUTLEN, ZERO, REG3, CAAM_CMD_SZ);
5638c2ecf20Sopenharmony_ci	} else {
5648c2ecf20Sopenharmony_ci		append_math_add(desc, VARSEQINLEN, ZERO, DPOVRD, CAAM_CMD_SZ);
5658c2ecf20Sopenharmony_ci		append_math_add(desc, VARSEQOUTLEN, ZERO, DPOVRD, CAAM_CMD_SZ);
5668c2ecf20Sopenharmony_ci	}
5678c2ecf20Sopenharmony_ci
5688c2ecf20Sopenharmony_ci	/* Skip assoc data */
5698c2ecf20Sopenharmony_ci	append_seq_fifo_store(desc, 0, FIFOST_TYPE_SKIP | FIFOLDST_VLF);
5708c2ecf20Sopenharmony_ci
5718c2ecf20Sopenharmony_ci	/* read assoc before reading payload */
5728c2ecf20Sopenharmony_ci	append_seq_fifo_load(desc, 0, FIFOLD_CLASS_CLASS2 | FIFOLD_TYPE_MSG |
5738c2ecf20Sopenharmony_ci			     KEY_VLF);
5748c2ecf20Sopenharmony_ci
5758c2ecf20Sopenharmony_ci	/* Copy iv from outfifo to class 2 fifo */
5768c2ecf20Sopenharmony_ci	moveiv = NFIFOENTRY_STYPE_OFIFO | NFIFOENTRY_DEST_CLASS2 |
5778c2ecf20Sopenharmony_ci		 NFIFOENTRY_DTYPE_MSG | (ivsize << NFIFOENTRY_DLEN_SHIFT);
5788c2ecf20Sopenharmony_ci	append_load_imm_u32(desc, moveiv, LDST_CLASS_IND_CCB |
5798c2ecf20Sopenharmony_ci			    LDST_SRCDST_WORD_INFO_FIFO | LDST_IMM);
5808c2ecf20Sopenharmony_ci	append_load_imm_u32(desc, ivsize, LDST_CLASS_2_CCB |
5818c2ecf20Sopenharmony_ci			    LDST_SRCDST_WORD_DATASZ_REG | LDST_IMM);
5828c2ecf20Sopenharmony_ci
5838c2ecf20Sopenharmony_ci	/* Load Counter into CONTEXT1 reg */
5848c2ecf20Sopenharmony_ci	if (is_rfc3686)
5858c2ecf20Sopenharmony_ci		append_load_imm_be32(desc, 1, LDST_IMM | LDST_CLASS_1_CCB |
5868c2ecf20Sopenharmony_ci				     LDST_SRCDST_BYTE_CONTEXT |
5878c2ecf20Sopenharmony_ci				     ((ctx1_iv_off + CTR_RFC3686_IV_SIZE) <<
5888c2ecf20Sopenharmony_ci				      LDST_OFFSET_SHIFT));
5898c2ecf20Sopenharmony_ci
5908c2ecf20Sopenharmony_ci	/* Class 1 operation */
5918c2ecf20Sopenharmony_ci	append_operation(desc, cdata->algtype | OP_ALG_AS_INITFINAL |
5928c2ecf20Sopenharmony_ci			 OP_ALG_ENCRYPT);
5938c2ecf20Sopenharmony_ci
5948c2ecf20Sopenharmony_ci	/* Will write ivsize + cryptlen */
5958c2ecf20Sopenharmony_ci	append_math_add(desc, VARSEQOUTLEN, SEQINLEN, REG0, CAAM_CMD_SZ);
5968c2ecf20Sopenharmony_ci
5978c2ecf20Sopenharmony_ci	/* Not need to reload iv */
5988c2ecf20Sopenharmony_ci	append_seq_fifo_load(desc, ivsize,
5998c2ecf20Sopenharmony_ci			     FIFOLD_CLASS_SKIP);
6008c2ecf20Sopenharmony_ci
6018c2ecf20Sopenharmony_ci	/* Will read cryptlen */
6028c2ecf20Sopenharmony_ci	append_math_add(desc, VARSEQINLEN, SEQINLEN, REG0, CAAM_CMD_SZ);
6038c2ecf20Sopenharmony_ci
6048c2ecf20Sopenharmony_ci	/*
6058c2ecf20Sopenharmony_ci	 * Wait for IV transfer (ofifo -> class2) to finish before starting
6068c2ecf20Sopenharmony_ci	 * ciphertext transfer (ofifo -> external memory).
6078c2ecf20Sopenharmony_ci	 */
6088c2ecf20Sopenharmony_ci	wait_cmd = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL | JUMP_COND_NIFP);
6098c2ecf20Sopenharmony_ci	set_jump_tgt_here(desc, wait_cmd);
6108c2ecf20Sopenharmony_ci
6118c2ecf20Sopenharmony_ci	append_seq_fifo_load(desc, 0, FIFOLD_CLASS_BOTH | KEY_VLF |
6128c2ecf20Sopenharmony_ci			     FIFOLD_TYPE_MSG1OUT2 | FIFOLD_TYPE_LASTBOTH);
6138c2ecf20Sopenharmony_ci	append_seq_fifo_store(desc, 0, FIFOST_TYPE_MESSAGE_DATA | KEY_VLF);
6148c2ecf20Sopenharmony_ci
6158c2ecf20Sopenharmony_ci	/* Write ICV */
6168c2ecf20Sopenharmony_ci	append_seq_store(desc, icvsize, LDST_CLASS_2_CCB |
6178c2ecf20Sopenharmony_ci			 LDST_SRCDST_BYTE_CONTEXT);
6188c2ecf20Sopenharmony_ci
6198c2ecf20Sopenharmony_ci	print_hex_dump_debug("aead givenc shdesc@" __stringify(__LINE__)": ",
6208c2ecf20Sopenharmony_ci			     DUMP_PREFIX_ADDRESS, 16, 4, desc, desc_bytes(desc),
6218c2ecf20Sopenharmony_ci			     1);
6228c2ecf20Sopenharmony_ci}
6238c2ecf20Sopenharmony_ciEXPORT_SYMBOL(cnstr_shdsc_aead_givencap);
6248c2ecf20Sopenharmony_ci
6258c2ecf20Sopenharmony_ci/**
6268c2ecf20Sopenharmony_ci * cnstr_shdsc_gcm_encap - gcm encapsulation shared descriptor
6278c2ecf20Sopenharmony_ci * @desc: pointer to buffer used for descriptor construction
6288c2ecf20Sopenharmony_ci * @cdata: pointer to block cipher transform definitions
6298c2ecf20Sopenharmony_ci *         Valid algorithm values - OP_ALG_ALGSEL_AES ANDed with OP_ALG_AAI_GCM.
6308c2ecf20Sopenharmony_ci * @ivsize: initialization vector size
6318c2ecf20Sopenharmony_ci * @icvsize: integrity check value (ICV) size (truncated or full)
6328c2ecf20Sopenharmony_ci * @is_qi: true when called from caam/qi
6338c2ecf20Sopenharmony_ci */
6348c2ecf20Sopenharmony_civoid cnstr_shdsc_gcm_encap(u32 * const desc, struct alginfo *cdata,
6358c2ecf20Sopenharmony_ci			   unsigned int ivsize, unsigned int icvsize,
6368c2ecf20Sopenharmony_ci			   const bool is_qi)
6378c2ecf20Sopenharmony_ci{
6388c2ecf20Sopenharmony_ci	u32 *key_jump_cmd, *zero_payload_jump_cmd, *zero_assoc_jump_cmd1,
6398c2ecf20Sopenharmony_ci	    *zero_assoc_jump_cmd2;
6408c2ecf20Sopenharmony_ci
6418c2ecf20Sopenharmony_ci	init_sh_desc(desc, HDR_SHARE_SERIAL);
6428c2ecf20Sopenharmony_ci
6438c2ecf20Sopenharmony_ci	/* skip key loading if they are loaded due to sharing */
6448c2ecf20Sopenharmony_ci	key_jump_cmd = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL |
6458c2ecf20Sopenharmony_ci				   JUMP_COND_SHRD);
6468c2ecf20Sopenharmony_ci	if (cdata->key_inline)
6478c2ecf20Sopenharmony_ci		append_key_as_imm(desc, cdata->key_virt, cdata->keylen,
6488c2ecf20Sopenharmony_ci				  cdata->keylen, CLASS_1 | KEY_DEST_CLASS_REG);
6498c2ecf20Sopenharmony_ci	else
6508c2ecf20Sopenharmony_ci		append_key(desc, cdata->key_dma, cdata->keylen, CLASS_1 |
6518c2ecf20Sopenharmony_ci			   KEY_DEST_CLASS_REG);
6528c2ecf20Sopenharmony_ci	set_jump_tgt_here(desc, key_jump_cmd);
6538c2ecf20Sopenharmony_ci
6548c2ecf20Sopenharmony_ci	/* class 1 operation */
6558c2ecf20Sopenharmony_ci	append_operation(desc, cdata->algtype | OP_ALG_AS_INITFINAL |
6568c2ecf20Sopenharmony_ci			 OP_ALG_ENCRYPT);
6578c2ecf20Sopenharmony_ci
6588c2ecf20Sopenharmony_ci	if (is_qi) {
6598c2ecf20Sopenharmony_ci		u32 *wait_load_cmd;
6608c2ecf20Sopenharmony_ci
6618c2ecf20Sopenharmony_ci		/* REG3 = assoclen */
6628c2ecf20Sopenharmony_ci		append_seq_load(desc, 4, LDST_CLASS_DECO |
6638c2ecf20Sopenharmony_ci				LDST_SRCDST_WORD_DECO_MATH3 |
6648c2ecf20Sopenharmony_ci				(4 << LDST_OFFSET_SHIFT));
6658c2ecf20Sopenharmony_ci
6668c2ecf20Sopenharmony_ci		wait_load_cmd = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL |
6678c2ecf20Sopenharmony_ci					    JUMP_COND_CALM | JUMP_COND_NCP |
6688c2ecf20Sopenharmony_ci					    JUMP_COND_NOP | JUMP_COND_NIP |
6698c2ecf20Sopenharmony_ci					    JUMP_COND_NIFP);
6708c2ecf20Sopenharmony_ci		set_jump_tgt_here(desc, wait_load_cmd);
6718c2ecf20Sopenharmony_ci
6728c2ecf20Sopenharmony_ci		append_math_sub_imm_u32(desc, VARSEQOUTLEN, SEQINLEN, IMM,
6738c2ecf20Sopenharmony_ci					ivsize);
6748c2ecf20Sopenharmony_ci	} else {
6758c2ecf20Sopenharmony_ci		append_math_sub(desc, VARSEQOUTLEN, SEQINLEN, REG0,
6768c2ecf20Sopenharmony_ci				CAAM_CMD_SZ);
6778c2ecf20Sopenharmony_ci	}
6788c2ecf20Sopenharmony_ci
6798c2ecf20Sopenharmony_ci	/* if assoclen + cryptlen is ZERO, skip to ICV write */
6808c2ecf20Sopenharmony_ci	zero_assoc_jump_cmd2 = append_jump(desc, JUMP_TEST_ALL |
6818c2ecf20Sopenharmony_ci						 JUMP_COND_MATH_Z);
6828c2ecf20Sopenharmony_ci
6838c2ecf20Sopenharmony_ci	if (is_qi)
6848c2ecf20Sopenharmony_ci		append_seq_fifo_load(desc, ivsize, FIFOLD_CLASS_CLASS1 |
6858c2ecf20Sopenharmony_ci				     FIFOLD_TYPE_IV | FIFOLD_TYPE_FLUSH1);
6868c2ecf20Sopenharmony_ci
6878c2ecf20Sopenharmony_ci	/* if assoclen is ZERO, skip reading the assoc data */
6888c2ecf20Sopenharmony_ci	append_math_add(desc, VARSEQINLEN, ZERO, REG3, CAAM_CMD_SZ);
6898c2ecf20Sopenharmony_ci	zero_assoc_jump_cmd1 = append_jump(desc, JUMP_TEST_ALL |
6908c2ecf20Sopenharmony_ci					   JUMP_COND_MATH_Z);
6918c2ecf20Sopenharmony_ci
6928c2ecf20Sopenharmony_ci	append_math_add(desc, VARSEQOUTLEN, ZERO, REG3, CAAM_CMD_SZ);
6938c2ecf20Sopenharmony_ci
6948c2ecf20Sopenharmony_ci	/* skip assoc data */
6958c2ecf20Sopenharmony_ci	append_seq_fifo_store(desc, 0, FIFOST_TYPE_SKIP | FIFOLDST_VLF);
6968c2ecf20Sopenharmony_ci
6978c2ecf20Sopenharmony_ci	/* cryptlen = seqinlen - assoclen */
6988c2ecf20Sopenharmony_ci	append_math_sub(desc, VARSEQOUTLEN, SEQINLEN, REG3, CAAM_CMD_SZ);
6998c2ecf20Sopenharmony_ci
7008c2ecf20Sopenharmony_ci	/* if cryptlen is ZERO jump to zero-payload commands */
7018c2ecf20Sopenharmony_ci	zero_payload_jump_cmd = append_jump(desc, JUMP_TEST_ALL |
7028c2ecf20Sopenharmony_ci					    JUMP_COND_MATH_Z);
7038c2ecf20Sopenharmony_ci
7048c2ecf20Sopenharmony_ci	/* read assoc data */
7058c2ecf20Sopenharmony_ci	append_seq_fifo_load(desc, 0, FIFOLD_CLASS_CLASS1 | FIFOLDST_VLF |
7068c2ecf20Sopenharmony_ci			     FIFOLD_TYPE_AAD | FIFOLD_TYPE_FLUSH1);
7078c2ecf20Sopenharmony_ci	set_jump_tgt_here(desc, zero_assoc_jump_cmd1);
7088c2ecf20Sopenharmony_ci
7098c2ecf20Sopenharmony_ci	append_math_sub(desc, VARSEQINLEN, SEQINLEN, REG0, CAAM_CMD_SZ);
7108c2ecf20Sopenharmony_ci
7118c2ecf20Sopenharmony_ci	/* write encrypted data */
7128c2ecf20Sopenharmony_ci	append_seq_fifo_store(desc, 0, FIFOST_TYPE_MESSAGE_DATA | FIFOLDST_VLF);
7138c2ecf20Sopenharmony_ci
7148c2ecf20Sopenharmony_ci	/* read payload data */
7158c2ecf20Sopenharmony_ci	append_seq_fifo_load(desc, 0, FIFOLD_CLASS_CLASS1 | FIFOLDST_VLF |
7168c2ecf20Sopenharmony_ci			     FIFOLD_TYPE_MSG | FIFOLD_TYPE_LAST1);
7178c2ecf20Sopenharmony_ci
7188c2ecf20Sopenharmony_ci	/* jump to ICV writing */
7198c2ecf20Sopenharmony_ci	if (is_qi)
7208c2ecf20Sopenharmony_ci		append_jump(desc, JUMP_TEST_ALL | 4);
7218c2ecf20Sopenharmony_ci	else
7228c2ecf20Sopenharmony_ci		append_jump(desc, JUMP_TEST_ALL | 2);
7238c2ecf20Sopenharmony_ci
7248c2ecf20Sopenharmony_ci	/* zero-payload commands */
7258c2ecf20Sopenharmony_ci	set_jump_tgt_here(desc, zero_payload_jump_cmd);
7268c2ecf20Sopenharmony_ci
7278c2ecf20Sopenharmony_ci	/* read assoc data */
7288c2ecf20Sopenharmony_ci	append_seq_fifo_load(desc, 0, FIFOLD_CLASS_CLASS1 | FIFOLDST_VLF |
7298c2ecf20Sopenharmony_ci			     FIFOLD_TYPE_AAD | FIFOLD_TYPE_LAST1);
7308c2ecf20Sopenharmony_ci	if (is_qi)
7318c2ecf20Sopenharmony_ci		/* jump to ICV writing */
7328c2ecf20Sopenharmony_ci		append_jump(desc, JUMP_TEST_ALL | 2);
7338c2ecf20Sopenharmony_ci
7348c2ecf20Sopenharmony_ci	/* There is no input data */
7358c2ecf20Sopenharmony_ci	set_jump_tgt_here(desc, zero_assoc_jump_cmd2);
7368c2ecf20Sopenharmony_ci
7378c2ecf20Sopenharmony_ci	if (is_qi)
7388c2ecf20Sopenharmony_ci		append_seq_fifo_load(desc, ivsize, FIFOLD_CLASS_CLASS1 |
7398c2ecf20Sopenharmony_ci				     FIFOLD_TYPE_IV | FIFOLD_TYPE_FLUSH1 |
7408c2ecf20Sopenharmony_ci				     FIFOLD_TYPE_LAST1);
7418c2ecf20Sopenharmony_ci
7428c2ecf20Sopenharmony_ci	/* write ICV */
7438c2ecf20Sopenharmony_ci	append_seq_store(desc, icvsize, LDST_CLASS_1_CCB |
7448c2ecf20Sopenharmony_ci			 LDST_SRCDST_BYTE_CONTEXT);
7458c2ecf20Sopenharmony_ci
7468c2ecf20Sopenharmony_ci	print_hex_dump_debug("gcm enc shdesc@" __stringify(__LINE__)": ",
7478c2ecf20Sopenharmony_ci			     DUMP_PREFIX_ADDRESS, 16, 4, desc, desc_bytes(desc),
7488c2ecf20Sopenharmony_ci			     1);
7498c2ecf20Sopenharmony_ci}
7508c2ecf20Sopenharmony_ciEXPORT_SYMBOL(cnstr_shdsc_gcm_encap);
7518c2ecf20Sopenharmony_ci
7528c2ecf20Sopenharmony_ci/**
7538c2ecf20Sopenharmony_ci * cnstr_shdsc_gcm_decap - gcm decapsulation shared descriptor
7548c2ecf20Sopenharmony_ci * @desc: pointer to buffer used for descriptor construction
7558c2ecf20Sopenharmony_ci * @cdata: pointer to block cipher transform definitions
7568c2ecf20Sopenharmony_ci *         Valid algorithm values - OP_ALG_ALGSEL_AES ANDed with OP_ALG_AAI_GCM.
7578c2ecf20Sopenharmony_ci * @ivsize: initialization vector size
7588c2ecf20Sopenharmony_ci * @icvsize: integrity check value (ICV) size (truncated or full)
7598c2ecf20Sopenharmony_ci * @is_qi: true when called from caam/qi
7608c2ecf20Sopenharmony_ci */
7618c2ecf20Sopenharmony_civoid cnstr_shdsc_gcm_decap(u32 * const desc, struct alginfo *cdata,
7628c2ecf20Sopenharmony_ci			   unsigned int ivsize, unsigned int icvsize,
7638c2ecf20Sopenharmony_ci			   const bool is_qi)
7648c2ecf20Sopenharmony_ci{
7658c2ecf20Sopenharmony_ci	u32 *key_jump_cmd, *zero_payload_jump_cmd, *zero_assoc_jump_cmd1;
7668c2ecf20Sopenharmony_ci
7678c2ecf20Sopenharmony_ci	init_sh_desc(desc, HDR_SHARE_SERIAL);
7688c2ecf20Sopenharmony_ci
7698c2ecf20Sopenharmony_ci	/* skip key loading if they are loaded due to sharing */
7708c2ecf20Sopenharmony_ci	key_jump_cmd = append_jump(desc, JUMP_JSL |
7718c2ecf20Sopenharmony_ci				   JUMP_TEST_ALL | JUMP_COND_SHRD);
7728c2ecf20Sopenharmony_ci	if (cdata->key_inline)
7738c2ecf20Sopenharmony_ci		append_key_as_imm(desc, cdata->key_virt, cdata->keylen,
7748c2ecf20Sopenharmony_ci				  cdata->keylen, CLASS_1 | KEY_DEST_CLASS_REG);
7758c2ecf20Sopenharmony_ci	else
7768c2ecf20Sopenharmony_ci		append_key(desc, cdata->key_dma, cdata->keylen, CLASS_1 |
7778c2ecf20Sopenharmony_ci			   KEY_DEST_CLASS_REG);
7788c2ecf20Sopenharmony_ci	set_jump_tgt_here(desc, key_jump_cmd);
7798c2ecf20Sopenharmony_ci
7808c2ecf20Sopenharmony_ci	/* class 1 operation */
7818c2ecf20Sopenharmony_ci	append_operation(desc, cdata->algtype | OP_ALG_AS_INITFINAL |
7828c2ecf20Sopenharmony_ci			 OP_ALG_DECRYPT | OP_ALG_ICV_ON);
7838c2ecf20Sopenharmony_ci
7848c2ecf20Sopenharmony_ci	if (is_qi) {
7858c2ecf20Sopenharmony_ci		u32 *wait_load_cmd;
7868c2ecf20Sopenharmony_ci
7878c2ecf20Sopenharmony_ci		/* REG3 = assoclen */
7888c2ecf20Sopenharmony_ci		append_seq_load(desc, 4, LDST_CLASS_DECO |
7898c2ecf20Sopenharmony_ci				LDST_SRCDST_WORD_DECO_MATH3 |
7908c2ecf20Sopenharmony_ci				(4 << LDST_OFFSET_SHIFT));
7918c2ecf20Sopenharmony_ci
7928c2ecf20Sopenharmony_ci		wait_load_cmd = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL |
7938c2ecf20Sopenharmony_ci					    JUMP_COND_CALM | JUMP_COND_NCP |
7948c2ecf20Sopenharmony_ci					    JUMP_COND_NOP | JUMP_COND_NIP |
7958c2ecf20Sopenharmony_ci					    JUMP_COND_NIFP);
7968c2ecf20Sopenharmony_ci		set_jump_tgt_here(desc, wait_load_cmd);
7978c2ecf20Sopenharmony_ci
7988c2ecf20Sopenharmony_ci		append_seq_fifo_load(desc, ivsize, FIFOLD_CLASS_CLASS1 |
7998c2ecf20Sopenharmony_ci				     FIFOLD_TYPE_IV | FIFOLD_TYPE_FLUSH1);
8008c2ecf20Sopenharmony_ci	}
8018c2ecf20Sopenharmony_ci
8028c2ecf20Sopenharmony_ci	/* if assoclen is ZERO, skip reading the assoc data */
8038c2ecf20Sopenharmony_ci	append_math_add(desc, VARSEQINLEN, ZERO, REG3, CAAM_CMD_SZ);
8048c2ecf20Sopenharmony_ci	zero_assoc_jump_cmd1 = append_jump(desc, JUMP_TEST_ALL |
8058c2ecf20Sopenharmony_ci						 JUMP_COND_MATH_Z);
8068c2ecf20Sopenharmony_ci
8078c2ecf20Sopenharmony_ci	append_math_add(desc, VARSEQOUTLEN, ZERO, REG3, CAAM_CMD_SZ);
8088c2ecf20Sopenharmony_ci
8098c2ecf20Sopenharmony_ci	/* skip assoc data */
8108c2ecf20Sopenharmony_ci	append_seq_fifo_store(desc, 0, FIFOST_TYPE_SKIP | FIFOLDST_VLF);
8118c2ecf20Sopenharmony_ci
8128c2ecf20Sopenharmony_ci	/* read assoc data */
8138c2ecf20Sopenharmony_ci	append_seq_fifo_load(desc, 0, FIFOLD_CLASS_CLASS1 | FIFOLDST_VLF |
8148c2ecf20Sopenharmony_ci			     FIFOLD_TYPE_AAD | FIFOLD_TYPE_FLUSH1);
8158c2ecf20Sopenharmony_ci
8168c2ecf20Sopenharmony_ci	set_jump_tgt_here(desc, zero_assoc_jump_cmd1);
8178c2ecf20Sopenharmony_ci
8188c2ecf20Sopenharmony_ci	/* cryptlen = seqoutlen - assoclen */
8198c2ecf20Sopenharmony_ci	append_math_sub(desc, VARSEQINLEN, SEQOUTLEN, REG0, CAAM_CMD_SZ);
8208c2ecf20Sopenharmony_ci
8218c2ecf20Sopenharmony_ci	/* jump to zero-payload command if cryptlen is zero */
8228c2ecf20Sopenharmony_ci	zero_payload_jump_cmd = append_jump(desc, JUMP_TEST_ALL |
8238c2ecf20Sopenharmony_ci					    JUMP_COND_MATH_Z);
8248c2ecf20Sopenharmony_ci
8258c2ecf20Sopenharmony_ci	append_math_sub(desc, VARSEQOUTLEN, SEQOUTLEN, REG0, CAAM_CMD_SZ);
8268c2ecf20Sopenharmony_ci
8278c2ecf20Sopenharmony_ci	/* store encrypted data */
8288c2ecf20Sopenharmony_ci	append_seq_fifo_store(desc, 0, FIFOST_TYPE_MESSAGE_DATA | FIFOLDST_VLF);
8298c2ecf20Sopenharmony_ci
8308c2ecf20Sopenharmony_ci	/* read payload data */
8318c2ecf20Sopenharmony_ci	append_seq_fifo_load(desc, 0, FIFOLD_CLASS_CLASS1 | FIFOLDST_VLF |
8328c2ecf20Sopenharmony_ci			     FIFOLD_TYPE_MSG | FIFOLD_TYPE_FLUSH1);
8338c2ecf20Sopenharmony_ci
8348c2ecf20Sopenharmony_ci	/* zero-payload command */
8358c2ecf20Sopenharmony_ci	set_jump_tgt_here(desc, zero_payload_jump_cmd);
8368c2ecf20Sopenharmony_ci
8378c2ecf20Sopenharmony_ci	/* read ICV */
8388c2ecf20Sopenharmony_ci	append_seq_fifo_load(desc, icvsize, FIFOLD_CLASS_CLASS1 |
8398c2ecf20Sopenharmony_ci			     FIFOLD_TYPE_ICV | FIFOLD_TYPE_LAST1);
8408c2ecf20Sopenharmony_ci
8418c2ecf20Sopenharmony_ci	print_hex_dump_debug("gcm dec shdesc@" __stringify(__LINE__)": ",
8428c2ecf20Sopenharmony_ci			     DUMP_PREFIX_ADDRESS, 16, 4, desc, desc_bytes(desc),
8438c2ecf20Sopenharmony_ci			     1);
8448c2ecf20Sopenharmony_ci}
8458c2ecf20Sopenharmony_ciEXPORT_SYMBOL(cnstr_shdsc_gcm_decap);
8468c2ecf20Sopenharmony_ci
8478c2ecf20Sopenharmony_ci/**
8488c2ecf20Sopenharmony_ci * cnstr_shdsc_rfc4106_encap - IPSec ESP gcm encapsulation shared descriptor
8498c2ecf20Sopenharmony_ci *                             (non-protocol).
8508c2ecf20Sopenharmony_ci * @desc: pointer to buffer used for descriptor construction
8518c2ecf20Sopenharmony_ci * @cdata: pointer to block cipher transform definitions
8528c2ecf20Sopenharmony_ci *         Valid algorithm values - OP_ALG_ALGSEL_AES ANDed with OP_ALG_AAI_GCM.
8538c2ecf20Sopenharmony_ci * @ivsize: initialization vector size
8548c2ecf20Sopenharmony_ci * @icvsize: integrity check value (ICV) size (truncated or full)
8558c2ecf20Sopenharmony_ci * @is_qi: true when called from caam/qi
8568c2ecf20Sopenharmony_ci *
8578c2ecf20Sopenharmony_ci * Input sequence: AAD | PTXT
8588c2ecf20Sopenharmony_ci * Output sequence: AAD | CTXT | ICV
8598c2ecf20Sopenharmony_ci * AAD length (assoclen), which includes the IV length, is available in Math3.
8608c2ecf20Sopenharmony_ci */
8618c2ecf20Sopenharmony_civoid cnstr_shdsc_rfc4106_encap(u32 * const desc, struct alginfo *cdata,
8628c2ecf20Sopenharmony_ci			       unsigned int ivsize, unsigned int icvsize,
8638c2ecf20Sopenharmony_ci			       const bool is_qi)
8648c2ecf20Sopenharmony_ci{
8658c2ecf20Sopenharmony_ci	u32 *key_jump_cmd, *zero_cryptlen_jump_cmd, *skip_instructions;
8668c2ecf20Sopenharmony_ci	init_sh_desc(desc, HDR_SHARE_SERIAL);
8678c2ecf20Sopenharmony_ci
8688c2ecf20Sopenharmony_ci	/* Skip key loading if it is loaded due to sharing */
8698c2ecf20Sopenharmony_ci	key_jump_cmd = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL |
8708c2ecf20Sopenharmony_ci				   JUMP_COND_SHRD);
8718c2ecf20Sopenharmony_ci	if (cdata->key_inline)
8728c2ecf20Sopenharmony_ci		append_key_as_imm(desc, cdata->key_virt, cdata->keylen,
8738c2ecf20Sopenharmony_ci				  cdata->keylen, CLASS_1 | KEY_DEST_CLASS_REG);
8748c2ecf20Sopenharmony_ci	else
8758c2ecf20Sopenharmony_ci		append_key(desc, cdata->key_dma, cdata->keylen, CLASS_1 |
8768c2ecf20Sopenharmony_ci			   KEY_DEST_CLASS_REG);
8778c2ecf20Sopenharmony_ci	set_jump_tgt_here(desc, key_jump_cmd);
8788c2ecf20Sopenharmony_ci
8798c2ecf20Sopenharmony_ci	/* Class 1 operation */
8808c2ecf20Sopenharmony_ci	append_operation(desc, cdata->algtype | OP_ALG_AS_INITFINAL |
8818c2ecf20Sopenharmony_ci			 OP_ALG_ENCRYPT);
8828c2ecf20Sopenharmony_ci
8838c2ecf20Sopenharmony_ci	if (is_qi) {
8848c2ecf20Sopenharmony_ci		u32 *wait_load_cmd;
8858c2ecf20Sopenharmony_ci
8868c2ecf20Sopenharmony_ci		/* REG3 = assoclen */
8878c2ecf20Sopenharmony_ci		append_seq_load(desc, 4, LDST_CLASS_DECO |
8888c2ecf20Sopenharmony_ci				LDST_SRCDST_WORD_DECO_MATH3 |
8898c2ecf20Sopenharmony_ci				(4 << LDST_OFFSET_SHIFT));
8908c2ecf20Sopenharmony_ci
8918c2ecf20Sopenharmony_ci		wait_load_cmd = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL |
8928c2ecf20Sopenharmony_ci					    JUMP_COND_CALM | JUMP_COND_NCP |
8938c2ecf20Sopenharmony_ci					    JUMP_COND_NOP | JUMP_COND_NIP |
8948c2ecf20Sopenharmony_ci					    JUMP_COND_NIFP);
8958c2ecf20Sopenharmony_ci		set_jump_tgt_here(desc, wait_load_cmd);
8968c2ecf20Sopenharmony_ci
8978c2ecf20Sopenharmony_ci		/* Read salt and IV */
8988c2ecf20Sopenharmony_ci		append_fifo_load_as_imm(desc, (void *)(cdata->key_virt +
8998c2ecf20Sopenharmony_ci					cdata->keylen), 4, FIFOLD_CLASS_CLASS1 |
9008c2ecf20Sopenharmony_ci					FIFOLD_TYPE_IV);
9018c2ecf20Sopenharmony_ci		append_seq_fifo_load(desc, ivsize, FIFOLD_CLASS_CLASS1 |
9028c2ecf20Sopenharmony_ci				     FIFOLD_TYPE_IV | FIFOLD_TYPE_FLUSH1);
9038c2ecf20Sopenharmony_ci	}
9048c2ecf20Sopenharmony_ci
9058c2ecf20Sopenharmony_ci	append_math_sub_imm_u32(desc, VARSEQINLEN, REG3, IMM, ivsize);
9068c2ecf20Sopenharmony_ci	append_math_add(desc, VARSEQOUTLEN, ZERO, REG3, CAAM_CMD_SZ);
9078c2ecf20Sopenharmony_ci
9088c2ecf20Sopenharmony_ci	/* Skip AAD */
9098c2ecf20Sopenharmony_ci	append_seq_fifo_store(desc, 0, FIFOST_TYPE_SKIP | FIFOLDST_VLF);
9108c2ecf20Sopenharmony_ci
9118c2ecf20Sopenharmony_ci	/* Read cryptlen and set this value into VARSEQOUTLEN */
9128c2ecf20Sopenharmony_ci	append_math_sub(desc, VARSEQOUTLEN, SEQINLEN, REG3, CAAM_CMD_SZ);
9138c2ecf20Sopenharmony_ci
9148c2ecf20Sopenharmony_ci	/* If cryptlen is ZERO jump to AAD command */
9158c2ecf20Sopenharmony_ci	zero_cryptlen_jump_cmd = append_jump(desc, JUMP_TEST_ALL |
9168c2ecf20Sopenharmony_ci					    JUMP_COND_MATH_Z);
9178c2ecf20Sopenharmony_ci
9188c2ecf20Sopenharmony_ci	/* Read AAD data */
9198c2ecf20Sopenharmony_ci	append_seq_fifo_load(desc, 0, FIFOLD_CLASS_CLASS1 | FIFOLDST_VLF |
9208c2ecf20Sopenharmony_ci			     FIFOLD_TYPE_AAD | FIFOLD_TYPE_FLUSH1);
9218c2ecf20Sopenharmony_ci
9228c2ecf20Sopenharmony_ci	/* Workaround for erratum A-005473 (simultaneous SEQ FIFO skips) */
9238c2ecf20Sopenharmony_ci	append_seq_fifo_store(desc, 0, FIFOST_TYPE_MESSAGE_DATA);
9248c2ecf20Sopenharmony_ci
9258c2ecf20Sopenharmony_ci	/* Skip IV */
9268c2ecf20Sopenharmony_ci	append_seq_fifo_load(desc, ivsize, FIFOLD_CLASS_SKIP);
9278c2ecf20Sopenharmony_ci	append_math_add(desc, VARSEQINLEN, VARSEQOUTLEN, REG0, CAAM_CMD_SZ);
9288c2ecf20Sopenharmony_ci
9298c2ecf20Sopenharmony_ci	/* Write encrypted data */
9308c2ecf20Sopenharmony_ci	append_seq_fifo_store(desc, 0, FIFOST_TYPE_MESSAGE_DATA | FIFOLDST_VLF);
9318c2ecf20Sopenharmony_ci
9328c2ecf20Sopenharmony_ci	/* Read payload data */
9338c2ecf20Sopenharmony_ci	append_seq_fifo_load(desc, 0, FIFOLD_CLASS_CLASS1 | FIFOLDST_VLF |
9348c2ecf20Sopenharmony_ci			     FIFOLD_TYPE_MSG | FIFOLD_TYPE_LAST1);
9358c2ecf20Sopenharmony_ci
9368c2ecf20Sopenharmony_ci	/* Jump instructions to avoid double reading of AAD */
9378c2ecf20Sopenharmony_ci	skip_instructions = append_jump(desc, JUMP_TEST_ALL);
9388c2ecf20Sopenharmony_ci
9398c2ecf20Sopenharmony_ci	/* There is no input data, cryptlen = 0 */
9408c2ecf20Sopenharmony_ci	set_jump_tgt_here(desc, zero_cryptlen_jump_cmd);
9418c2ecf20Sopenharmony_ci
9428c2ecf20Sopenharmony_ci	/* Read AAD */
9438c2ecf20Sopenharmony_ci	append_seq_fifo_load(desc, 0, FIFOLD_CLASS_CLASS1 | FIFOLDST_VLF |
9448c2ecf20Sopenharmony_ci			     FIFOLD_TYPE_AAD | FIFOLD_TYPE_LAST1);
9458c2ecf20Sopenharmony_ci
9468c2ecf20Sopenharmony_ci	set_jump_tgt_here(desc, skip_instructions);
9478c2ecf20Sopenharmony_ci
9488c2ecf20Sopenharmony_ci	/* Write ICV */
9498c2ecf20Sopenharmony_ci	append_seq_store(desc, icvsize, LDST_CLASS_1_CCB |
9508c2ecf20Sopenharmony_ci			 LDST_SRCDST_BYTE_CONTEXT);
9518c2ecf20Sopenharmony_ci
9528c2ecf20Sopenharmony_ci	print_hex_dump_debug("rfc4106 enc shdesc@" __stringify(__LINE__)": ",
9538c2ecf20Sopenharmony_ci			     DUMP_PREFIX_ADDRESS, 16, 4, desc, desc_bytes(desc),
9548c2ecf20Sopenharmony_ci			     1);
9558c2ecf20Sopenharmony_ci}
9568c2ecf20Sopenharmony_ciEXPORT_SYMBOL(cnstr_shdsc_rfc4106_encap);
9578c2ecf20Sopenharmony_ci
9588c2ecf20Sopenharmony_ci/**
9598c2ecf20Sopenharmony_ci * cnstr_shdsc_rfc4106_decap - IPSec ESP gcm decapsulation shared descriptor
9608c2ecf20Sopenharmony_ci *                             (non-protocol).
9618c2ecf20Sopenharmony_ci * @desc: pointer to buffer used for descriptor construction
9628c2ecf20Sopenharmony_ci * @cdata: pointer to block cipher transform definitions
9638c2ecf20Sopenharmony_ci *         Valid algorithm values - OP_ALG_ALGSEL_AES ANDed with OP_ALG_AAI_GCM.
9648c2ecf20Sopenharmony_ci * @ivsize: initialization vector size
9658c2ecf20Sopenharmony_ci * @icvsize: integrity check value (ICV) size (truncated or full)
9668c2ecf20Sopenharmony_ci * @is_qi: true when called from caam/qi
9678c2ecf20Sopenharmony_ci */
9688c2ecf20Sopenharmony_civoid cnstr_shdsc_rfc4106_decap(u32 * const desc, struct alginfo *cdata,
9698c2ecf20Sopenharmony_ci			       unsigned int ivsize, unsigned int icvsize,
9708c2ecf20Sopenharmony_ci			       const bool is_qi)
9718c2ecf20Sopenharmony_ci{
9728c2ecf20Sopenharmony_ci	u32 *key_jump_cmd;
9738c2ecf20Sopenharmony_ci
9748c2ecf20Sopenharmony_ci	init_sh_desc(desc, HDR_SHARE_SERIAL);
9758c2ecf20Sopenharmony_ci
9768c2ecf20Sopenharmony_ci	/* Skip key loading if it is loaded due to sharing */
9778c2ecf20Sopenharmony_ci	key_jump_cmd = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL |
9788c2ecf20Sopenharmony_ci				   JUMP_COND_SHRD);
9798c2ecf20Sopenharmony_ci	if (cdata->key_inline)
9808c2ecf20Sopenharmony_ci		append_key_as_imm(desc, cdata->key_virt, cdata->keylen,
9818c2ecf20Sopenharmony_ci				  cdata->keylen, CLASS_1 |
9828c2ecf20Sopenharmony_ci				  KEY_DEST_CLASS_REG);
9838c2ecf20Sopenharmony_ci	else
9848c2ecf20Sopenharmony_ci		append_key(desc, cdata->key_dma, cdata->keylen, CLASS_1 |
9858c2ecf20Sopenharmony_ci			   KEY_DEST_CLASS_REG);
9868c2ecf20Sopenharmony_ci	set_jump_tgt_here(desc, key_jump_cmd);
9878c2ecf20Sopenharmony_ci
9888c2ecf20Sopenharmony_ci	/* Class 1 operation */
9898c2ecf20Sopenharmony_ci	append_operation(desc, cdata->algtype | OP_ALG_AS_INITFINAL |
9908c2ecf20Sopenharmony_ci			 OP_ALG_DECRYPT | OP_ALG_ICV_ON);
9918c2ecf20Sopenharmony_ci
9928c2ecf20Sopenharmony_ci	if (is_qi) {
9938c2ecf20Sopenharmony_ci		u32 *wait_load_cmd;
9948c2ecf20Sopenharmony_ci
9958c2ecf20Sopenharmony_ci		/* REG3 = assoclen */
9968c2ecf20Sopenharmony_ci		append_seq_load(desc, 4, LDST_CLASS_DECO |
9978c2ecf20Sopenharmony_ci				LDST_SRCDST_WORD_DECO_MATH3 |
9988c2ecf20Sopenharmony_ci				(4 << LDST_OFFSET_SHIFT));
9998c2ecf20Sopenharmony_ci
10008c2ecf20Sopenharmony_ci		wait_load_cmd = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL |
10018c2ecf20Sopenharmony_ci					    JUMP_COND_CALM | JUMP_COND_NCP |
10028c2ecf20Sopenharmony_ci					    JUMP_COND_NOP | JUMP_COND_NIP |
10038c2ecf20Sopenharmony_ci					    JUMP_COND_NIFP);
10048c2ecf20Sopenharmony_ci		set_jump_tgt_here(desc, wait_load_cmd);
10058c2ecf20Sopenharmony_ci
10068c2ecf20Sopenharmony_ci		/* Read salt and IV */
10078c2ecf20Sopenharmony_ci		append_fifo_load_as_imm(desc, (void *)(cdata->key_virt +
10088c2ecf20Sopenharmony_ci					cdata->keylen), 4, FIFOLD_CLASS_CLASS1 |
10098c2ecf20Sopenharmony_ci					FIFOLD_TYPE_IV);
10108c2ecf20Sopenharmony_ci		append_seq_fifo_load(desc, ivsize, FIFOLD_CLASS_CLASS1 |
10118c2ecf20Sopenharmony_ci				     FIFOLD_TYPE_IV | FIFOLD_TYPE_FLUSH1);
10128c2ecf20Sopenharmony_ci	}
10138c2ecf20Sopenharmony_ci
10148c2ecf20Sopenharmony_ci	append_math_sub_imm_u32(desc, VARSEQINLEN, REG3, IMM, ivsize);
10158c2ecf20Sopenharmony_ci	append_math_add(desc, VARSEQOUTLEN, ZERO, REG3, CAAM_CMD_SZ);
10168c2ecf20Sopenharmony_ci
10178c2ecf20Sopenharmony_ci	/* Read assoc data */
10188c2ecf20Sopenharmony_ci	append_seq_fifo_load(desc, 0, FIFOLD_CLASS_CLASS1 | FIFOLDST_VLF |
10198c2ecf20Sopenharmony_ci			     FIFOLD_TYPE_AAD | FIFOLD_TYPE_FLUSH1);
10208c2ecf20Sopenharmony_ci
10218c2ecf20Sopenharmony_ci	/* Skip IV */
10228c2ecf20Sopenharmony_ci	append_seq_fifo_load(desc, ivsize, FIFOLD_CLASS_SKIP);
10238c2ecf20Sopenharmony_ci
10248c2ecf20Sopenharmony_ci	/* Will read cryptlen bytes */
10258c2ecf20Sopenharmony_ci	append_math_sub(desc, VARSEQINLEN, SEQOUTLEN, REG3, CAAM_CMD_SZ);
10268c2ecf20Sopenharmony_ci
10278c2ecf20Sopenharmony_ci	/* Workaround for erratum A-005473 (simultaneous SEQ FIFO skips) */
10288c2ecf20Sopenharmony_ci	append_seq_fifo_load(desc, 0, FIFOLD_CLASS_CLASS1 | FIFOLD_TYPE_MSG);
10298c2ecf20Sopenharmony_ci
10308c2ecf20Sopenharmony_ci	/* Skip assoc data */
10318c2ecf20Sopenharmony_ci	append_seq_fifo_store(desc, 0, FIFOST_TYPE_SKIP | FIFOLDST_VLF);
10328c2ecf20Sopenharmony_ci
10338c2ecf20Sopenharmony_ci	/* Will write cryptlen bytes */
10348c2ecf20Sopenharmony_ci	append_math_sub(desc, VARSEQOUTLEN, SEQOUTLEN, REG0, CAAM_CMD_SZ);
10358c2ecf20Sopenharmony_ci
10368c2ecf20Sopenharmony_ci	/* Store payload data */
10378c2ecf20Sopenharmony_ci	append_seq_fifo_store(desc, 0, FIFOST_TYPE_MESSAGE_DATA | FIFOLDST_VLF);
10388c2ecf20Sopenharmony_ci
10398c2ecf20Sopenharmony_ci	/* Read encrypted data */
10408c2ecf20Sopenharmony_ci	append_seq_fifo_load(desc, 0, FIFOLD_CLASS_CLASS1 | FIFOLDST_VLF |
10418c2ecf20Sopenharmony_ci			     FIFOLD_TYPE_MSG | FIFOLD_TYPE_FLUSH1);
10428c2ecf20Sopenharmony_ci
10438c2ecf20Sopenharmony_ci	/* Read ICV */
10448c2ecf20Sopenharmony_ci	append_seq_fifo_load(desc, icvsize, FIFOLD_CLASS_CLASS1 |
10458c2ecf20Sopenharmony_ci			     FIFOLD_TYPE_ICV | FIFOLD_TYPE_LAST1);
10468c2ecf20Sopenharmony_ci
10478c2ecf20Sopenharmony_ci	print_hex_dump_debug("rfc4106 dec shdesc@" __stringify(__LINE__)": ",
10488c2ecf20Sopenharmony_ci			     DUMP_PREFIX_ADDRESS, 16, 4, desc, desc_bytes(desc),
10498c2ecf20Sopenharmony_ci			     1);
10508c2ecf20Sopenharmony_ci}
10518c2ecf20Sopenharmony_ciEXPORT_SYMBOL(cnstr_shdsc_rfc4106_decap);
10528c2ecf20Sopenharmony_ci
10538c2ecf20Sopenharmony_ci/**
10548c2ecf20Sopenharmony_ci * cnstr_shdsc_rfc4543_encap - IPSec ESP gmac encapsulation shared descriptor
10558c2ecf20Sopenharmony_ci *                             (non-protocol).
10568c2ecf20Sopenharmony_ci * @desc: pointer to buffer used for descriptor construction
10578c2ecf20Sopenharmony_ci * @cdata: pointer to block cipher transform definitions
10588c2ecf20Sopenharmony_ci *         Valid algorithm values - OP_ALG_ALGSEL_AES ANDed with OP_ALG_AAI_GCM.
10598c2ecf20Sopenharmony_ci * @ivsize: initialization vector size
10608c2ecf20Sopenharmony_ci * @icvsize: integrity check value (ICV) size (truncated or full)
10618c2ecf20Sopenharmony_ci * @is_qi: true when called from caam/qi
10628c2ecf20Sopenharmony_ci */
10638c2ecf20Sopenharmony_civoid cnstr_shdsc_rfc4543_encap(u32 * const desc, struct alginfo *cdata,
10648c2ecf20Sopenharmony_ci			       unsigned int ivsize, unsigned int icvsize,
10658c2ecf20Sopenharmony_ci			       const bool is_qi)
10668c2ecf20Sopenharmony_ci{
10678c2ecf20Sopenharmony_ci	u32 *key_jump_cmd, *read_move_cmd, *write_move_cmd;
10688c2ecf20Sopenharmony_ci
10698c2ecf20Sopenharmony_ci	init_sh_desc(desc, HDR_SHARE_SERIAL);
10708c2ecf20Sopenharmony_ci
10718c2ecf20Sopenharmony_ci	/* Skip key loading if it is loaded due to sharing */
10728c2ecf20Sopenharmony_ci	key_jump_cmd = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL |
10738c2ecf20Sopenharmony_ci				   JUMP_COND_SHRD);
10748c2ecf20Sopenharmony_ci	if (cdata->key_inline)
10758c2ecf20Sopenharmony_ci		append_key_as_imm(desc, cdata->key_virt, cdata->keylen,
10768c2ecf20Sopenharmony_ci				  cdata->keylen, CLASS_1 | KEY_DEST_CLASS_REG);
10778c2ecf20Sopenharmony_ci	else
10788c2ecf20Sopenharmony_ci		append_key(desc, cdata->key_dma, cdata->keylen, CLASS_1 |
10798c2ecf20Sopenharmony_ci			   KEY_DEST_CLASS_REG);
10808c2ecf20Sopenharmony_ci	set_jump_tgt_here(desc, key_jump_cmd);
10818c2ecf20Sopenharmony_ci
10828c2ecf20Sopenharmony_ci	/* Class 1 operation */
10838c2ecf20Sopenharmony_ci	append_operation(desc, cdata->algtype | OP_ALG_AS_INITFINAL |
10848c2ecf20Sopenharmony_ci			 OP_ALG_ENCRYPT);
10858c2ecf20Sopenharmony_ci
10868c2ecf20Sopenharmony_ci	if (is_qi) {
10878c2ecf20Sopenharmony_ci		/* assoclen is not needed, skip it */
10888c2ecf20Sopenharmony_ci		append_seq_fifo_load(desc, 4, FIFOLD_CLASS_SKIP);
10898c2ecf20Sopenharmony_ci
10908c2ecf20Sopenharmony_ci		/* Read salt and IV */
10918c2ecf20Sopenharmony_ci		append_fifo_load_as_imm(desc, (void *)(cdata->key_virt +
10928c2ecf20Sopenharmony_ci					cdata->keylen), 4, FIFOLD_CLASS_CLASS1 |
10938c2ecf20Sopenharmony_ci					FIFOLD_TYPE_IV);
10948c2ecf20Sopenharmony_ci		append_seq_fifo_load(desc, ivsize, FIFOLD_CLASS_CLASS1 |
10958c2ecf20Sopenharmony_ci				     FIFOLD_TYPE_IV | FIFOLD_TYPE_FLUSH1);
10968c2ecf20Sopenharmony_ci	}
10978c2ecf20Sopenharmony_ci
10988c2ecf20Sopenharmony_ci	/* assoclen + cryptlen = seqinlen */
10998c2ecf20Sopenharmony_ci	append_math_sub(desc, REG3, SEQINLEN, REG0, CAAM_CMD_SZ);
11008c2ecf20Sopenharmony_ci
11018c2ecf20Sopenharmony_ci	/*
11028c2ecf20Sopenharmony_ci	 * MOVE_LEN opcode is not available in all SEC HW revisions,
11038c2ecf20Sopenharmony_ci	 * thus need to do some magic, i.e. self-patch the descriptor
11048c2ecf20Sopenharmony_ci	 * buffer.
11058c2ecf20Sopenharmony_ci	 */
11068c2ecf20Sopenharmony_ci	read_move_cmd = append_move(desc, MOVE_SRC_DESCBUF | MOVE_DEST_MATH3 |
11078c2ecf20Sopenharmony_ci				    (0x6 << MOVE_LEN_SHIFT));
11088c2ecf20Sopenharmony_ci	write_move_cmd = append_move(desc, MOVE_SRC_MATH3 | MOVE_DEST_DESCBUF |
11098c2ecf20Sopenharmony_ci				     (0x8 << MOVE_LEN_SHIFT) | MOVE_WAITCOMP);
11108c2ecf20Sopenharmony_ci
11118c2ecf20Sopenharmony_ci	/* Will read assoclen + cryptlen bytes */
11128c2ecf20Sopenharmony_ci	append_math_sub(desc, VARSEQINLEN, SEQINLEN, REG0, CAAM_CMD_SZ);
11138c2ecf20Sopenharmony_ci
11148c2ecf20Sopenharmony_ci	/* Will write assoclen + cryptlen bytes */
11158c2ecf20Sopenharmony_ci	append_math_sub(desc, VARSEQOUTLEN, SEQINLEN, REG0, CAAM_CMD_SZ);
11168c2ecf20Sopenharmony_ci
11178c2ecf20Sopenharmony_ci	/* Read and write assoclen + cryptlen bytes */
11188c2ecf20Sopenharmony_ci	aead_append_src_dst(desc, FIFOLD_TYPE_AAD);
11198c2ecf20Sopenharmony_ci
11208c2ecf20Sopenharmony_ci	set_move_tgt_here(desc, read_move_cmd);
11218c2ecf20Sopenharmony_ci	set_move_tgt_here(desc, write_move_cmd);
11228c2ecf20Sopenharmony_ci	append_cmd(desc, CMD_LOAD | DISABLE_AUTO_INFO_FIFO);
11238c2ecf20Sopenharmony_ci	/* Move payload data to OFIFO */
11248c2ecf20Sopenharmony_ci	append_move(desc, MOVE_SRC_INFIFO_CL | MOVE_DEST_OUTFIFO);
11258c2ecf20Sopenharmony_ci
11268c2ecf20Sopenharmony_ci	/* Write ICV */
11278c2ecf20Sopenharmony_ci	append_seq_store(desc, icvsize, LDST_CLASS_1_CCB |
11288c2ecf20Sopenharmony_ci			 LDST_SRCDST_BYTE_CONTEXT);
11298c2ecf20Sopenharmony_ci
11308c2ecf20Sopenharmony_ci	print_hex_dump_debug("rfc4543 enc shdesc@" __stringify(__LINE__)": ",
11318c2ecf20Sopenharmony_ci			     DUMP_PREFIX_ADDRESS, 16, 4, desc, desc_bytes(desc),
11328c2ecf20Sopenharmony_ci			     1);
11338c2ecf20Sopenharmony_ci}
11348c2ecf20Sopenharmony_ciEXPORT_SYMBOL(cnstr_shdsc_rfc4543_encap);
11358c2ecf20Sopenharmony_ci
11368c2ecf20Sopenharmony_ci/**
11378c2ecf20Sopenharmony_ci * cnstr_shdsc_rfc4543_decap - IPSec ESP gmac decapsulation shared descriptor
11388c2ecf20Sopenharmony_ci *                             (non-protocol).
11398c2ecf20Sopenharmony_ci * @desc: pointer to buffer used for descriptor construction
11408c2ecf20Sopenharmony_ci * @cdata: pointer to block cipher transform definitions
11418c2ecf20Sopenharmony_ci *         Valid algorithm values - OP_ALG_ALGSEL_AES ANDed with OP_ALG_AAI_GCM.
11428c2ecf20Sopenharmony_ci * @ivsize: initialization vector size
11438c2ecf20Sopenharmony_ci * @icvsize: integrity check value (ICV) size (truncated or full)
11448c2ecf20Sopenharmony_ci * @is_qi: true when called from caam/qi
11458c2ecf20Sopenharmony_ci */
11468c2ecf20Sopenharmony_civoid cnstr_shdsc_rfc4543_decap(u32 * const desc, struct alginfo *cdata,
11478c2ecf20Sopenharmony_ci			       unsigned int ivsize, unsigned int icvsize,
11488c2ecf20Sopenharmony_ci			       const bool is_qi)
11498c2ecf20Sopenharmony_ci{
11508c2ecf20Sopenharmony_ci	u32 *key_jump_cmd, *read_move_cmd, *write_move_cmd;
11518c2ecf20Sopenharmony_ci
11528c2ecf20Sopenharmony_ci	init_sh_desc(desc, HDR_SHARE_SERIAL);
11538c2ecf20Sopenharmony_ci
11548c2ecf20Sopenharmony_ci	/* Skip key loading if it is loaded due to sharing */
11558c2ecf20Sopenharmony_ci	key_jump_cmd = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL |
11568c2ecf20Sopenharmony_ci				   JUMP_COND_SHRD);
11578c2ecf20Sopenharmony_ci	if (cdata->key_inline)
11588c2ecf20Sopenharmony_ci		append_key_as_imm(desc, cdata->key_virt, cdata->keylen,
11598c2ecf20Sopenharmony_ci				  cdata->keylen, CLASS_1 | KEY_DEST_CLASS_REG);
11608c2ecf20Sopenharmony_ci	else
11618c2ecf20Sopenharmony_ci		append_key(desc, cdata->key_dma, cdata->keylen, CLASS_1 |
11628c2ecf20Sopenharmony_ci			   KEY_DEST_CLASS_REG);
11638c2ecf20Sopenharmony_ci	set_jump_tgt_here(desc, key_jump_cmd);
11648c2ecf20Sopenharmony_ci
11658c2ecf20Sopenharmony_ci	/* Class 1 operation */
11668c2ecf20Sopenharmony_ci	append_operation(desc, cdata->algtype | OP_ALG_AS_INITFINAL |
11678c2ecf20Sopenharmony_ci			 OP_ALG_DECRYPT | OP_ALG_ICV_ON);
11688c2ecf20Sopenharmony_ci
11698c2ecf20Sopenharmony_ci	if (is_qi) {
11708c2ecf20Sopenharmony_ci		/* assoclen is not needed, skip it */
11718c2ecf20Sopenharmony_ci		append_seq_fifo_load(desc, 4, FIFOLD_CLASS_SKIP);
11728c2ecf20Sopenharmony_ci
11738c2ecf20Sopenharmony_ci		/* Read salt and IV */
11748c2ecf20Sopenharmony_ci		append_fifo_load_as_imm(desc, (void *)(cdata->key_virt +
11758c2ecf20Sopenharmony_ci					cdata->keylen), 4, FIFOLD_CLASS_CLASS1 |
11768c2ecf20Sopenharmony_ci					FIFOLD_TYPE_IV);
11778c2ecf20Sopenharmony_ci		append_seq_fifo_load(desc, ivsize, FIFOLD_CLASS_CLASS1 |
11788c2ecf20Sopenharmony_ci				     FIFOLD_TYPE_IV | FIFOLD_TYPE_FLUSH1);
11798c2ecf20Sopenharmony_ci	}
11808c2ecf20Sopenharmony_ci
11818c2ecf20Sopenharmony_ci	/* assoclen + cryptlen = seqoutlen */
11828c2ecf20Sopenharmony_ci	append_math_sub(desc, REG3, SEQOUTLEN, REG0, CAAM_CMD_SZ);
11838c2ecf20Sopenharmony_ci
11848c2ecf20Sopenharmony_ci	/*
11858c2ecf20Sopenharmony_ci	 * MOVE_LEN opcode is not available in all SEC HW revisions,
11868c2ecf20Sopenharmony_ci	 * thus need to do some magic, i.e. self-patch the descriptor
11878c2ecf20Sopenharmony_ci	 * buffer.
11888c2ecf20Sopenharmony_ci	 */
11898c2ecf20Sopenharmony_ci	read_move_cmd = append_move(desc, MOVE_SRC_DESCBUF | MOVE_DEST_MATH3 |
11908c2ecf20Sopenharmony_ci				    (0x6 << MOVE_LEN_SHIFT));
11918c2ecf20Sopenharmony_ci	write_move_cmd = append_move(desc, MOVE_SRC_MATH3 | MOVE_DEST_DESCBUF |
11928c2ecf20Sopenharmony_ci				     (0x8 << MOVE_LEN_SHIFT) | MOVE_WAITCOMP);
11938c2ecf20Sopenharmony_ci
11948c2ecf20Sopenharmony_ci	/* Will read assoclen + cryptlen bytes */
11958c2ecf20Sopenharmony_ci	append_math_sub(desc, VARSEQINLEN, SEQOUTLEN, REG0, CAAM_CMD_SZ);
11968c2ecf20Sopenharmony_ci
11978c2ecf20Sopenharmony_ci	/* Will write assoclen + cryptlen bytes */
11988c2ecf20Sopenharmony_ci	append_math_sub(desc, VARSEQOUTLEN, SEQOUTLEN, REG0, CAAM_CMD_SZ);
11998c2ecf20Sopenharmony_ci
12008c2ecf20Sopenharmony_ci	/* Store payload data */
12018c2ecf20Sopenharmony_ci	append_seq_fifo_store(desc, 0, FIFOST_TYPE_MESSAGE_DATA | FIFOLDST_VLF);
12028c2ecf20Sopenharmony_ci
12038c2ecf20Sopenharmony_ci	/* In-snoop assoclen + cryptlen data */
12048c2ecf20Sopenharmony_ci	append_seq_fifo_load(desc, 0, FIFOLD_CLASS_BOTH | FIFOLDST_VLF |
12058c2ecf20Sopenharmony_ci			     FIFOLD_TYPE_AAD | FIFOLD_TYPE_LAST2FLUSH1);
12068c2ecf20Sopenharmony_ci
12078c2ecf20Sopenharmony_ci	set_move_tgt_here(desc, read_move_cmd);
12088c2ecf20Sopenharmony_ci	set_move_tgt_here(desc, write_move_cmd);
12098c2ecf20Sopenharmony_ci	append_cmd(desc, CMD_LOAD | DISABLE_AUTO_INFO_FIFO);
12108c2ecf20Sopenharmony_ci	/* Move payload data to OFIFO */
12118c2ecf20Sopenharmony_ci	append_move(desc, MOVE_SRC_INFIFO_CL | MOVE_DEST_OUTFIFO);
12128c2ecf20Sopenharmony_ci	append_cmd(desc, CMD_LOAD | ENABLE_AUTO_INFO_FIFO);
12138c2ecf20Sopenharmony_ci
12148c2ecf20Sopenharmony_ci	/* Read ICV */
12158c2ecf20Sopenharmony_ci	append_seq_fifo_load(desc, icvsize, FIFOLD_CLASS_CLASS1 |
12168c2ecf20Sopenharmony_ci			     FIFOLD_TYPE_ICV | FIFOLD_TYPE_LAST1);
12178c2ecf20Sopenharmony_ci
12188c2ecf20Sopenharmony_ci	print_hex_dump_debug("rfc4543 dec shdesc@" __stringify(__LINE__)": ",
12198c2ecf20Sopenharmony_ci			     DUMP_PREFIX_ADDRESS, 16, 4, desc, desc_bytes(desc),
12208c2ecf20Sopenharmony_ci			     1);
12218c2ecf20Sopenharmony_ci}
12228c2ecf20Sopenharmony_ciEXPORT_SYMBOL(cnstr_shdsc_rfc4543_decap);
12238c2ecf20Sopenharmony_ci
12248c2ecf20Sopenharmony_ci/**
12258c2ecf20Sopenharmony_ci * cnstr_shdsc_chachapoly - Chacha20 + Poly1305 generic AEAD (rfc7539) and
12268c2ecf20Sopenharmony_ci *                          IPsec ESP (rfc7634, a.k.a. rfc7539esp) shared
12278c2ecf20Sopenharmony_ci *                          descriptor (non-protocol).
12288c2ecf20Sopenharmony_ci * @desc: pointer to buffer used for descriptor construction
12298c2ecf20Sopenharmony_ci * @cdata: pointer to block cipher transform definitions
12308c2ecf20Sopenharmony_ci *         Valid algorithm values - OP_ALG_ALGSEL_CHACHA20 ANDed with
12318c2ecf20Sopenharmony_ci *         OP_ALG_AAI_AEAD.
12328c2ecf20Sopenharmony_ci * @adata: pointer to authentication transform definitions
12338c2ecf20Sopenharmony_ci *         Valid algorithm values - OP_ALG_ALGSEL_POLY1305 ANDed with
12348c2ecf20Sopenharmony_ci *         OP_ALG_AAI_AEAD.
12358c2ecf20Sopenharmony_ci * @ivsize: initialization vector size
12368c2ecf20Sopenharmony_ci * @icvsize: integrity check value (ICV) size (truncated or full)
12378c2ecf20Sopenharmony_ci * @encap: true if encapsulation, false if decapsulation
12388c2ecf20Sopenharmony_ci * @is_qi: true when called from caam/qi
12398c2ecf20Sopenharmony_ci */
12408c2ecf20Sopenharmony_civoid cnstr_shdsc_chachapoly(u32 * const desc, struct alginfo *cdata,
12418c2ecf20Sopenharmony_ci			    struct alginfo *adata, unsigned int ivsize,
12428c2ecf20Sopenharmony_ci			    unsigned int icvsize, const bool encap,
12438c2ecf20Sopenharmony_ci			    const bool is_qi)
12448c2ecf20Sopenharmony_ci{
12458c2ecf20Sopenharmony_ci	u32 *key_jump_cmd, *wait_cmd;
12468c2ecf20Sopenharmony_ci	u32 nfifo;
12478c2ecf20Sopenharmony_ci	const bool is_ipsec = (ivsize != CHACHAPOLY_IV_SIZE);
12488c2ecf20Sopenharmony_ci
12498c2ecf20Sopenharmony_ci	/* Note: Context registers are saved. */
12508c2ecf20Sopenharmony_ci	init_sh_desc(desc, HDR_SHARE_SERIAL | HDR_SAVECTX);
12518c2ecf20Sopenharmony_ci
12528c2ecf20Sopenharmony_ci	/* skip key loading if they are loaded due to sharing */
12538c2ecf20Sopenharmony_ci	key_jump_cmd = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL |
12548c2ecf20Sopenharmony_ci				   JUMP_COND_SHRD);
12558c2ecf20Sopenharmony_ci
12568c2ecf20Sopenharmony_ci	append_key_as_imm(desc, cdata->key_virt, cdata->keylen, cdata->keylen,
12578c2ecf20Sopenharmony_ci			  CLASS_1 | KEY_DEST_CLASS_REG);
12588c2ecf20Sopenharmony_ci
12598c2ecf20Sopenharmony_ci	/* For IPsec load the salt from keymat in the context register */
12608c2ecf20Sopenharmony_ci	if (is_ipsec)
12618c2ecf20Sopenharmony_ci		append_load_as_imm(desc, cdata->key_virt + cdata->keylen, 4,
12628c2ecf20Sopenharmony_ci				   LDST_CLASS_1_CCB | LDST_SRCDST_BYTE_CONTEXT |
12638c2ecf20Sopenharmony_ci				   4 << LDST_OFFSET_SHIFT);
12648c2ecf20Sopenharmony_ci
12658c2ecf20Sopenharmony_ci	set_jump_tgt_here(desc, key_jump_cmd);
12668c2ecf20Sopenharmony_ci
12678c2ecf20Sopenharmony_ci	/* Class 2 and 1 operations: Poly & ChaCha */
12688c2ecf20Sopenharmony_ci	if (encap) {
12698c2ecf20Sopenharmony_ci		append_operation(desc, adata->algtype | OP_ALG_AS_INITFINAL |
12708c2ecf20Sopenharmony_ci				 OP_ALG_ENCRYPT);
12718c2ecf20Sopenharmony_ci		append_operation(desc, cdata->algtype | OP_ALG_AS_INITFINAL |
12728c2ecf20Sopenharmony_ci				 OP_ALG_ENCRYPT);
12738c2ecf20Sopenharmony_ci	} else {
12748c2ecf20Sopenharmony_ci		append_operation(desc, adata->algtype | OP_ALG_AS_INITFINAL |
12758c2ecf20Sopenharmony_ci				 OP_ALG_DECRYPT | OP_ALG_ICV_ON);
12768c2ecf20Sopenharmony_ci		append_operation(desc, cdata->algtype | OP_ALG_AS_INITFINAL |
12778c2ecf20Sopenharmony_ci				 OP_ALG_DECRYPT);
12788c2ecf20Sopenharmony_ci	}
12798c2ecf20Sopenharmony_ci
12808c2ecf20Sopenharmony_ci	if (is_qi) {
12818c2ecf20Sopenharmony_ci		u32 *wait_load_cmd;
12828c2ecf20Sopenharmony_ci		u32 ctx1_iv_off = is_ipsec ? 8 : 4;
12838c2ecf20Sopenharmony_ci
12848c2ecf20Sopenharmony_ci		/* REG3 = assoclen */
12858c2ecf20Sopenharmony_ci		append_seq_load(desc, 4, LDST_CLASS_DECO |
12868c2ecf20Sopenharmony_ci				LDST_SRCDST_WORD_DECO_MATH3 |
12878c2ecf20Sopenharmony_ci				4 << LDST_OFFSET_SHIFT);
12888c2ecf20Sopenharmony_ci
12898c2ecf20Sopenharmony_ci		wait_load_cmd = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL |
12908c2ecf20Sopenharmony_ci					    JUMP_COND_CALM | JUMP_COND_NCP |
12918c2ecf20Sopenharmony_ci					    JUMP_COND_NOP | JUMP_COND_NIP |
12928c2ecf20Sopenharmony_ci					    JUMP_COND_NIFP);
12938c2ecf20Sopenharmony_ci		set_jump_tgt_here(desc, wait_load_cmd);
12948c2ecf20Sopenharmony_ci
12958c2ecf20Sopenharmony_ci		append_seq_load(desc, ivsize, LDST_CLASS_1_CCB |
12968c2ecf20Sopenharmony_ci				LDST_SRCDST_BYTE_CONTEXT |
12978c2ecf20Sopenharmony_ci				ctx1_iv_off << LDST_OFFSET_SHIFT);
12988c2ecf20Sopenharmony_ci	}
12998c2ecf20Sopenharmony_ci
13008c2ecf20Sopenharmony_ci	/*
13018c2ecf20Sopenharmony_ci	 * MAGIC with NFIFO
13028c2ecf20Sopenharmony_ci	 * Read associated data from the input and send them to class1 and
13038c2ecf20Sopenharmony_ci	 * class2 alignment blocks. From class1 send data to output fifo and
13048c2ecf20Sopenharmony_ci	 * then write it to memory since we don't need to encrypt AD.
13058c2ecf20Sopenharmony_ci	 */
13068c2ecf20Sopenharmony_ci	nfifo = NFIFOENTRY_DEST_BOTH | NFIFOENTRY_FC1 | NFIFOENTRY_FC2 |
13078c2ecf20Sopenharmony_ci		NFIFOENTRY_DTYPE_POLY | NFIFOENTRY_BND;
13088c2ecf20Sopenharmony_ci	append_load_imm_u32(desc, nfifo, LDST_CLASS_IND_CCB |
13098c2ecf20Sopenharmony_ci			    LDST_SRCDST_WORD_INFO_FIFO_SM | LDLEN_MATH3);
13108c2ecf20Sopenharmony_ci
13118c2ecf20Sopenharmony_ci	append_math_add(desc, VARSEQINLEN, ZERO, REG3, CAAM_CMD_SZ);
13128c2ecf20Sopenharmony_ci	append_math_add(desc, VARSEQOUTLEN, ZERO, REG3, CAAM_CMD_SZ);
13138c2ecf20Sopenharmony_ci	append_seq_fifo_load(desc, 0, FIFOLD_TYPE_NOINFOFIFO |
13148c2ecf20Sopenharmony_ci			     FIFOLD_CLASS_CLASS1 | LDST_VLF);
13158c2ecf20Sopenharmony_ci	append_move_len(desc, MOVE_AUX_LS | MOVE_SRC_AUX_ABLK |
13168c2ecf20Sopenharmony_ci			MOVE_DEST_OUTFIFO | MOVELEN_MRSEL_MATH3);
13178c2ecf20Sopenharmony_ci	append_seq_fifo_store(desc, 0, FIFOST_TYPE_MESSAGE_DATA | LDST_VLF);
13188c2ecf20Sopenharmony_ci
13198c2ecf20Sopenharmony_ci	/* IPsec - copy IV at the output */
13208c2ecf20Sopenharmony_ci	if (is_ipsec)
13218c2ecf20Sopenharmony_ci		append_seq_fifo_store(desc, ivsize, FIFOST_TYPE_METADATA |
13228c2ecf20Sopenharmony_ci				      0x2 << 25);
13238c2ecf20Sopenharmony_ci
13248c2ecf20Sopenharmony_ci	wait_cmd = append_jump(desc, JUMP_JSL | JUMP_TYPE_LOCAL |
13258c2ecf20Sopenharmony_ci			       JUMP_COND_NOP | JUMP_TEST_ALL);
13268c2ecf20Sopenharmony_ci	set_jump_tgt_here(desc, wait_cmd);
13278c2ecf20Sopenharmony_ci
13288c2ecf20Sopenharmony_ci	if (encap) {
13298c2ecf20Sopenharmony_ci		/* Read and write cryptlen bytes */
13308c2ecf20Sopenharmony_ci		append_math_add(desc, VARSEQINLEN, SEQINLEN, REG0, CAAM_CMD_SZ);
13318c2ecf20Sopenharmony_ci		append_math_add(desc, VARSEQOUTLEN, SEQINLEN, REG0,
13328c2ecf20Sopenharmony_ci				CAAM_CMD_SZ);
13338c2ecf20Sopenharmony_ci		aead_append_src_dst(desc, FIFOLD_TYPE_MSG1OUT2);
13348c2ecf20Sopenharmony_ci
13358c2ecf20Sopenharmony_ci		/* Write ICV */
13368c2ecf20Sopenharmony_ci		append_seq_store(desc, icvsize, LDST_CLASS_2_CCB |
13378c2ecf20Sopenharmony_ci				 LDST_SRCDST_BYTE_CONTEXT);
13388c2ecf20Sopenharmony_ci	} else {
13398c2ecf20Sopenharmony_ci		/* Read and write cryptlen bytes */
13408c2ecf20Sopenharmony_ci		append_math_add(desc, VARSEQINLEN, SEQOUTLEN, REG0,
13418c2ecf20Sopenharmony_ci				CAAM_CMD_SZ);
13428c2ecf20Sopenharmony_ci		append_math_add(desc, VARSEQOUTLEN, SEQOUTLEN, REG0,
13438c2ecf20Sopenharmony_ci				CAAM_CMD_SZ);
13448c2ecf20Sopenharmony_ci		aead_append_src_dst(desc, FIFOLD_TYPE_MSG);
13458c2ecf20Sopenharmony_ci
13468c2ecf20Sopenharmony_ci		/* Load ICV for verification */
13478c2ecf20Sopenharmony_ci		append_seq_fifo_load(desc, icvsize, FIFOLD_CLASS_CLASS2 |
13488c2ecf20Sopenharmony_ci				     FIFOLD_TYPE_LAST2 | FIFOLD_TYPE_ICV);
13498c2ecf20Sopenharmony_ci	}
13508c2ecf20Sopenharmony_ci
13518c2ecf20Sopenharmony_ci	print_hex_dump_debug("chachapoly shdesc@" __stringify(__LINE__)": ",
13528c2ecf20Sopenharmony_ci			     DUMP_PREFIX_ADDRESS, 16, 4, desc, desc_bytes(desc),
13538c2ecf20Sopenharmony_ci			     1);
13548c2ecf20Sopenharmony_ci}
13558c2ecf20Sopenharmony_ciEXPORT_SYMBOL(cnstr_shdsc_chachapoly);
13568c2ecf20Sopenharmony_ci
13578c2ecf20Sopenharmony_ci/* For skcipher encrypt and decrypt, read from req->src and write to req->dst */
13588c2ecf20Sopenharmony_cistatic inline void skcipher_append_src_dst(u32 *desc)
13598c2ecf20Sopenharmony_ci{
13608c2ecf20Sopenharmony_ci	append_math_add(desc, VARSEQOUTLEN, SEQINLEN, REG0, CAAM_CMD_SZ);
13618c2ecf20Sopenharmony_ci	append_math_add(desc, VARSEQINLEN, SEQINLEN, REG0, CAAM_CMD_SZ);
13628c2ecf20Sopenharmony_ci	append_seq_fifo_load(desc, 0, FIFOLD_CLASS_CLASS1 |
13638c2ecf20Sopenharmony_ci			     KEY_VLF | FIFOLD_TYPE_MSG | FIFOLD_TYPE_LAST1);
13648c2ecf20Sopenharmony_ci	append_seq_fifo_store(desc, 0, FIFOST_TYPE_MESSAGE_DATA | KEY_VLF);
13658c2ecf20Sopenharmony_ci}
13668c2ecf20Sopenharmony_ci
13678c2ecf20Sopenharmony_ci/**
13688c2ecf20Sopenharmony_ci * cnstr_shdsc_skcipher_encap - skcipher encapsulation shared descriptor
13698c2ecf20Sopenharmony_ci * @desc: pointer to buffer used for descriptor construction
13708c2ecf20Sopenharmony_ci * @cdata: pointer to block cipher transform definitions
13718c2ecf20Sopenharmony_ci *         Valid algorithm values - one of OP_ALG_ALGSEL_{AES, DES, 3DES} ANDed
13728c2ecf20Sopenharmony_ci *         with OP_ALG_AAI_CBC or OP_ALG_AAI_CTR_MOD128
13738c2ecf20Sopenharmony_ci *                                - OP_ALG_ALGSEL_CHACHA20
13748c2ecf20Sopenharmony_ci * @ivsize: initialization vector size
13758c2ecf20Sopenharmony_ci * @is_rfc3686: true when ctr(aes) is wrapped by rfc3686 template
13768c2ecf20Sopenharmony_ci * @ctx1_iv_off: IV offset in CONTEXT1 register
13778c2ecf20Sopenharmony_ci */
13788c2ecf20Sopenharmony_civoid cnstr_shdsc_skcipher_encap(u32 * const desc, struct alginfo *cdata,
13798c2ecf20Sopenharmony_ci				unsigned int ivsize, const bool is_rfc3686,
13808c2ecf20Sopenharmony_ci				const u32 ctx1_iv_off)
13818c2ecf20Sopenharmony_ci{
13828c2ecf20Sopenharmony_ci	u32 *key_jump_cmd;
13838c2ecf20Sopenharmony_ci	u32 options = cdata->algtype | OP_ALG_AS_INIT | OP_ALG_ENCRYPT;
13848c2ecf20Sopenharmony_ci	bool is_chacha20 = ((cdata->algtype & OP_ALG_ALGSEL_MASK) ==
13858c2ecf20Sopenharmony_ci			    OP_ALG_ALGSEL_CHACHA20);
13868c2ecf20Sopenharmony_ci
13878c2ecf20Sopenharmony_ci	init_sh_desc(desc, HDR_SHARE_SERIAL | HDR_SAVECTX);
13888c2ecf20Sopenharmony_ci	/* Skip if already shared */
13898c2ecf20Sopenharmony_ci	key_jump_cmd = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL |
13908c2ecf20Sopenharmony_ci				   JUMP_COND_SHRD);
13918c2ecf20Sopenharmony_ci
13928c2ecf20Sopenharmony_ci	/* Load class1 key only */
13938c2ecf20Sopenharmony_ci	append_key_as_imm(desc, cdata->key_virt, cdata->keylen,
13948c2ecf20Sopenharmony_ci			  cdata->keylen, CLASS_1 | KEY_DEST_CLASS_REG);
13958c2ecf20Sopenharmony_ci
13968c2ecf20Sopenharmony_ci	/* Load nonce into CONTEXT1 reg */
13978c2ecf20Sopenharmony_ci	if (is_rfc3686) {
13988c2ecf20Sopenharmony_ci		const u8 *nonce = cdata->key_virt + cdata->keylen;
13998c2ecf20Sopenharmony_ci
14008c2ecf20Sopenharmony_ci		append_load_as_imm(desc, nonce, CTR_RFC3686_NONCE_SIZE,
14018c2ecf20Sopenharmony_ci				   LDST_CLASS_IND_CCB |
14028c2ecf20Sopenharmony_ci				   LDST_SRCDST_BYTE_OUTFIFO | LDST_IMM);
14038c2ecf20Sopenharmony_ci		append_move(desc, MOVE_WAITCOMP | MOVE_SRC_OUTFIFO |
14048c2ecf20Sopenharmony_ci			    MOVE_DEST_CLASS1CTX | (16 << MOVE_OFFSET_SHIFT) |
14058c2ecf20Sopenharmony_ci			    (CTR_RFC3686_NONCE_SIZE << MOVE_LEN_SHIFT));
14068c2ecf20Sopenharmony_ci	}
14078c2ecf20Sopenharmony_ci
14088c2ecf20Sopenharmony_ci	set_jump_tgt_here(desc, key_jump_cmd);
14098c2ecf20Sopenharmony_ci
14108c2ecf20Sopenharmony_ci	/* Load IV, if there is one */
14118c2ecf20Sopenharmony_ci	if (ivsize)
14128c2ecf20Sopenharmony_ci		append_seq_load(desc, ivsize, LDST_SRCDST_BYTE_CONTEXT |
14138c2ecf20Sopenharmony_ci				LDST_CLASS_1_CCB | (ctx1_iv_off <<
14148c2ecf20Sopenharmony_ci				LDST_OFFSET_SHIFT));
14158c2ecf20Sopenharmony_ci
14168c2ecf20Sopenharmony_ci	/* Load counter into CONTEXT1 reg */
14178c2ecf20Sopenharmony_ci	if (is_rfc3686)
14188c2ecf20Sopenharmony_ci		append_load_imm_be32(desc, 1, LDST_IMM | LDST_CLASS_1_CCB |
14198c2ecf20Sopenharmony_ci				     LDST_SRCDST_BYTE_CONTEXT |
14208c2ecf20Sopenharmony_ci				     ((ctx1_iv_off + CTR_RFC3686_IV_SIZE) <<
14218c2ecf20Sopenharmony_ci				      LDST_OFFSET_SHIFT));
14228c2ecf20Sopenharmony_ci
14238c2ecf20Sopenharmony_ci	/* Load operation */
14248c2ecf20Sopenharmony_ci	if (is_chacha20)
14258c2ecf20Sopenharmony_ci		options |= OP_ALG_AS_FINALIZE;
14268c2ecf20Sopenharmony_ci	append_operation(desc, options);
14278c2ecf20Sopenharmony_ci
14288c2ecf20Sopenharmony_ci	/* Perform operation */
14298c2ecf20Sopenharmony_ci	skcipher_append_src_dst(desc);
14308c2ecf20Sopenharmony_ci
14318c2ecf20Sopenharmony_ci	/* Store IV */
14328c2ecf20Sopenharmony_ci	if (!is_chacha20 && ivsize)
14338c2ecf20Sopenharmony_ci		append_seq_store(desc, ivsize, LDST_SRCDST_BYTE_CONTEXT |
14348c2ecf20Sopenharmony_ci				 LDST_CLASS_1_CCB | (ctx1_iv_off <<
14358c2ecf20Sopenharmony_ci				 LDST_OFFSET_SHIFT));
14368c2ecf20Sopenharmony_ci
14378c2ecf20Sopenharmony_ci	print_hex_dump_debug("skcipher enc shdesc@" __stringify(__LINE__)": ",
14388c2ecf20Sopenharmony_ci			     DUMP_PREFIX_ADDRESS, 16, 4, desc, desc_bytes(desc),
14398c2ecf20Sopenharmony_ci			     1);
14408c2ecf20Sopenharmony_ci}
14418c2ecf20Sopenharmony_ciEXPORT_SYMBOL(cnstr_shdsc_skcipher_encap);
14428c2ecf20Sopenharmony_ci
14438c2ecf20Sopenharmony_ci/**
14448c2ecf20Sopenharmony_ci * cnstr_shdsc_skcipher_decap - skcipher decapsulation shared descriptor
14458c2ecf20Sopenharmony_ci * @desc: pointer to buffer used for descriptor construction
14468c2ecf20Sopenharmony_ci * @cdata: pointer to block cipher transform definitions
14478c2ecf20Sopenharmony_ci *         Valid algorithm values - one of OP_ALG_ALGSEL_{AES, DES, 3DES} ANDed
14488c2ecf20Sopenharmony_ci *         with OP_ALG_AAI_CBC or OP_ALG_AAI_CTR_MOD128
14498c2ecf20Sopenharmony_ci *                                - OP_ALG_ALGSEL_CHACHA20
14508c2ecf20Sopenharmony_ci * @ivsize: initialization vector size
14518c2ecf20Sopenharmony_ci * @is_rfc3686: true when ctr(aes) is wrapped by rfc3686 template
14528c2ecf20Sopenharmony_ci * @ctx1_iv_off: IV offset in CONTEXT1 register
14538c2ecf20Sopenharmony_ci */
14548c2ecf20Sopenharmony_civoid cnstr_shdsc_skcipher_decap(u32 * const desc, struct alginfo *cdata,
14558c2ecf20Sopenharmony_ci				unsigned int ivsize, const bool is_rfc3686,
14568c2ecf20Sopenharmony_ci				const u32 ctx1_iv_off)
14578c2ecf20Sopenharmony_ci{
14588c2ecf20Sopenharmony_ci	u32 *key_jump_cmd;
14598c2ecf20Sopenharmony_ci	bool is_chacha20 = ((cdata->algtype & OP_ALG_ALGSEL_MASK) ==
14608c2ecf20Sopenharmony_ci			    OP_ALG_ALGSEL_CHACHA20);
14618c2ecf20Sopenharmony_ci
14628c2ecf20Sopenharmony_ci	init_sh_desc(desc, HDR_SHARE_SERIAL | HDR_SAVECTX);
14638c2ecf20Sopenharmony_ci	/* Skip if already shared */
14648c2ecf20Sopenharmony_ci	key_jump_cmd = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL |
14658c2ecf20Sopenharmony_ci				   JUMP_COND_SHRD);
14668c2ecf20Sopenharmony_ci
14678c2ecf20Sopenharmony_ci	/* Load class1 key only */
14688c2ecf20Sopenharmony_ci	append_key_as_imm(desc, cdata->key_virt, cdata->keylen,
14698c2ecf20Sopenharmony_ci			  cdata->keylen, CLASS_1 | KEY_DEST_CLASS_REG);
14708c2ecf20Sopenharmony_ci
14718c2ecf20Sopenharmony_ci	/* Load nonce into CONTEXT1 reg */
14728c2ecf20Sopenharmony_ci	if (is_rfc3686) {
14738c2ecf20Sopenharmony_ci		const u8 *nonce = cdata->key_virt + cdata->keylen;
14748c2ecf20Sopenharmony_ci
14758c2ecf20Sopenharmony_ci		append_load_as_imm(desc, nonce, CTR_RFC3686_NONCE_SIZE,
14768c2ecf20Sopenharmony_ci				   LDST_CLASS_IND_CCB |
14778c2ecf20Sopenharmony_ci				   LDST_SRCDST_BYTE_OUTFIFO | LDST_IMM);
14788c2ecf20Sopenharmony_ci		append_move(desc, MOVE_WAITCOMP | MOVE_SRC_OUTFIFO |
14798c2ecf20Sopenharmony_ci			    MOVE_DEST_CLASS1CTX | (16 << MOVE_OFFSET_SHIFT) |
14808c2ecf20Sopenharmony_ci			    (CTR_RFC3686_NONCE_SIZE << MOVE_LEN_SHIFT));
14818c2ecf20Sopenharmony_ci	}
14828c2ecf20Sopenharmony_ci
14838c2ecf20Sopenharmony_ci	set_jump_tgt_here(desc, key_jump_cmd);
14848c2ecf20Sopenharmony_ci
14858c2ecf20Sopenharmony_ci	/* Load IV, if there is one */
14868c2ecf20Sopenharmony_ci	if (ivsize)
14878c2ecf20Sopenharmony_ci		append_seq_load(desc, ivsize, LDST_SRCDST_BYTE_CONTEXT |
14888c2ecf20Sopenharmony_ci				LDST_CLASS_1_CCB | (ctx1_iv_off <<
14898c2ecf20Sopenharmony_ci				LDST_OFFSET_SHIFT));
14908c2ecf20Sopenharmony_ci
14918c2ecf20Sopenharmony_ci	/* Load counter into CONTEXT1 reg */
14928c2ecf20Sopenharmony_ci	if (is_rfc3686)
14938c2ecf20Sopenharmony_ci		append_load_imm_be32(desc, 1, LDST_IMM | LDST_CLASS_1_CCB |
14948c2ecf20Sopenharmony_ci				     LDST_SRCDST_BYTE_CONTEXT |
14958c2ecf20Sopenharmony_ci				     ((ctx1_iv_off + CTR_RFC3686_IV_SIZE) <<
14968c2ecf20Sopenharmony_ci				      LDST_OFFSET_SHIFT));
14978c2ecf20Sopenharmony_ci
14988c2ecf20Sopenharmony_ci	/* Choose operation */
14998c2ecf20Sopenharmony_ci	if (ctx1_iv_off)
15008c2ecf20Sopenharmony_ci		append_operation(desc, cdata->algtype | OP_ALG_AS_INIT |
15018c2ecf20Sopenharmony_ci				 OP_ALG_DECRYPT);
15028c2ecf20Sopenharmony_ci	else
15038c2ecf20Sopenharmony_ci		append_dec_op1(desc, cdata->algtype);
15048c2ecf20Sopenharmony_ci
15058c2ecf20Sopenharmony_ci	/* Perform operation */
15068c2ecf20Sopenharmony_ci	skcipher_append_src_dst(desc);
15078c2ecf20Sopenharmony_ci
15088c2ecf20Sopenharmony_ci	/* Store IV */
15098c2ecf20Sopenharmony_ci	if (!is_chacha20 && ivsize)
15108c2ecf20Sopenharmony_ci		append_seq_store(desc, ivsize, LDST_SRCDST_BYTE_CONTEXT |
15118c2ecf20Sopenharmony_ci				 LDST_CLASS_1_CCB | (ctx1_iv_off <<
15128c2ecf20Sopenharmony_ci				 LDST_OFFSET_SHIFT));
15138c2ecf20Sopenharmony_ci
15148c2ecf20Sopenharmony_ci	print_hex_dump_debug("skcipher dec shdesc@" __stringify(__LINE__)": ",
15158c2ecf20Sopenharmony_ci			     DUMP_PREFIX_ADDRESS, 16, 4, desc, desc_bytes(desc),
15168c2ecf20Sopenharmony_ci			     1);
15178c2ecf20Sopenharmony_ci}
15188c2ecf20Sopenharmony_ciEXPORT_SYMBOL(cnstr_shdsc_skcipher_decap);
15198c2ecf20Sopenharmony_ci
15208c2ecf20Sopenharmony_ci/**
15218c2ecf20Sopenharmony_ci * cnstr_shdsc_xts_skcipher_encap - xts skcipher encapsulation shared descriptor
15228c2ecf20Sopenharmony_ci * @desc: pointer to buffer used for descriptor construction
15238c2ecf20Sopenharmony_ci * @cdata: pointer to block cipher transform definitions
15248c2ecf20Sopenharmony_ci *         Valid algorithm values - OP_ALG_ALGSEL_AES ANDed with OP_ALG_AAI_XTS.
15258c2ecf20Sopenharmony_ci */
15268c2ecf20Sopenharmony_civoid cnstr_shdsc_xts_skcipher_encap(u32 * const desc, struct alginfo *cdata)
15278c2ecf20Sopenharmony_ci{
15288c2ecf20Sopenharmony_ci	/*
15298c2ecf20Sopenharmony_ci	 * Set sector size to a big value, practically disabling
15308c2ecf20Sopenharmony_ci	 * sector size segmentation in xts implementation. We cannot
15318c2ecf20Sopenharmony_ci	 * take full advantage of this HW feature with existing
15328c2ecf20Sopenharmony_ci	 * crypto API / dm-crypt SW architecture.
15338c2ecf20Sopenharmony_ci	 */
15348c2ecf20Sopenharmony_ci	__be64 sector_size = cpu_to_be64(BIT(15));
15358c2ecf20Sopenharmony_ci	u32 *key_jump_cmd;
15368c2ecf20Sopenharmony_ci
15378c2ecf20Sopenharmony_ci	init_sh_desc(desc, HDR_SHARE_SERIAL | HDR_SAVECTX);
15388c2ecf20Sopenharmony_ci	/* Skip if already shared */
15398c2ecf20Sopenharmony_ci	key_jump_cmd = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL |
15408c2ecf20Sopenharmony_ci				   JUMP_COND_SHRD);
15418c2ecf20Sopenharmony_ci
15428c2ecf20Sopenharmony_ci	/* Load class1 keys only */
15438c2ecf20Sopenharmony_ci	append_key_as_imm(desc, cdata->key_virt, cdata->keylen,
15448c2ecf20Sopenharmony_ci			  cdata->keylen, CLASS_1 | KEY_DEST_CLASS_REG);
15458c2ecf20Sopenharmony_ci
15468c2ecf20Sopenharmony_ci	/* Load sector size with index 40 bytes (0x28) */
15478c2ecf20Sopenharmony_ci	append_load_as_imm(desc, (void *)&sector_size, 8, LDST_CLASS_1_CCB |
15488c2ecf20Sopenharmony_ci			   LDST_SRCDST_BYTE_CONTEXT |
15498c2ecf20Sopenharmony_ci			   (0x28 << LDST_OFFSET_SHIFT));
15508c2ecf20Sopenharmony_ci
15518c2ecf20Sopenharmony_ci	set_jump_tgt_here(desc, key_jump_cmd);
15528c2ecf20Sopenharmony_ci
15538c2ecf20Sopenharmony_ci	/*
15548c2ecf20Sopenharmony_ci	 * create sequence for loading the sector index / 16B tweak value
15558c2ecf20Sopenharmony_ci	 * Lower 8B of IV - sector index / tweak lower half
15568c2ecf20Sopenharmony_ci	 * Upper 8B of IV - upper half of 16B tweak
15578c2ecf20Sopenharmony_ci	 */
15588c2ecf20Sopenharmony_ci	append_seq_load(desc, 8, LDST_SRCDST_BYTE_CONTEXT | LDST_CLASS_1_CCB |
15598c2ecf20Sopenharmony_ci			(0x20 << LDST_OFFSET_SHIFT));
15608c2ecf20Sopenharmony_ci	append_seq_load(desc, 8, LDST_SRCDST_BYTE_CONTEXT | LDST_CLASS_1_CCB |
15618c2ecf20Sopenharmony_ci			(0x30 << LDST_OFFSET_SHIFT));
15628c2ecf20Sopenharmony_ci
15638c2ecf20Sopenharmony_ci	/* Load operation */
15648c2ecf20Sopenharmony_ci	append_operation(desc, cdata->algtype | OP_ALG_AS_INITFINAL |
15658c2ecf20Sopenharmony_ci			 OP_ALG_ENCRYPT);
15668c2ecf20Sopenharmony_ci
15678c2ecf20Sopenharmony_ci	/* Perform operation */
15688c2ecf20Sopenharmony_ci	skcipher_append_src_dst(desc);
15698c2ecf20Sopenharmony_ci
15708c2ecf20Sopenharmony_ci	/* Store lower 8B and upper 8B of IV */
15718c2ecf20Sopenharmony_ci	append_seq_store(desc, 8, LDST_SRCDST_BYTE_CONTEXT | LDST_CLASS_1_CCB |
15728c2ecf20Sopenharmony_ci			 (0x20 << LDST_OFFSET_SHIFT));
15738c2ecf20Sopenharmony_ci	append_seq_store(desc, 8, LDST_SRCDST_BYTE_CONTEXT | LDST_CLASS_1_CCB |
15748c2ecf20Sopenharmony_ci			 (0x30 << LDST_OFFSET_SHIFT));
15758c2ecf20Sopenharmony_ci
15768c2ecf20Sopenharmony_ci	print_hex_dump_debug("xts skcipher enc shdesc@" __stringify(__LINE__)
15778c2ecf20Sopenharmony_ci			     ": ", DUMP_PREFIX_ADDRESS, 16, 4,
15788c2ecf20Sopenharmony_ci			     desc, desc_bytes(desc), 1);
15798c2ecf20Sopenharmony_ci}
15808c2ecf20Sopenharmony_ciEXPORT_SYMBOL(cnstr_shdsc_xts_skcipher_encap);
15818c2ecf20Sopenharmony_ci
15828c2ecf20Sopenharmony_ci/**
15838c2ecf20Sopenharmony_ci * cnstr_shdsc_xts_skcipher_decap - xts skcipher decapsulation shared descriptor
15848c2ecf20Sopenharmony_ci * @desc: pointer to buffer used for descriptor construction
15858c2ecf20Sopenharmony_ci * @cdata: pointer to block cipher transform definitions
15868c2ecf20Sopenharmony_ci *         Valid algorithm values - OP_ALG_ALGSEL_AES ANDed with OP_ALG_AAI_XTS.
15878c2ecf20Sopenharmony_ci */
15888c2ecf20Sopenharmony_civoid cnstr_shdsc_xts_skcipher_decap(u32 * const desc, struct alginfo *cdata)
15898c2ecf20Sopenharmony_ci{
15908c2ecf20Sopenharmony_ci	/*
15918c2ecf20Sopenharmony_ci	 * Set sector size to a big value, practically disabling
15928c2ecf20Sopenharmony_ci	 * sector size segmentation in xts implementation. We cannot
15938c2ecf20Sopenharmony_ci	 * take full advantage of this HW feature with existing
15948c2ecf20Sopenharmony_ci	 * crypto API / dm-crypt SW architecture.
15958c2ecf20Sopenharmony_ci	 */
15968c2ecf20Sopenharmony_ci	__be64 sector_size = cpu_to_be64(BIT(15));
15978c2ecf20Sopenharmony_ci	u32 *key_jump_cmd;
15988c2ecf20Sopenharmony_ci
15998c2ecf20Sopenharmony_ci	init_sh_desc(desc, HDR_SHARE_SERIAL | HDR_SAVECTX);
16008c2ecf20Sopenharmony_ci	/* Skip if already shared */
16018c2ecf20Sopenharmony_ci	key_jump_cmd = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL |
16028c2ecf20Sopenharmony_ci				   JUMP_COND_SHRD);
16038c2ecf20Sopenharmony_ci
16048c2ecf20Sopenharmony_ci	/* Load class1 key only */
16058c2ecf20Sopenharmony_ci	append_key_as_imm(desc, cdata->key_virt, cdata->keylen,
16068c2ecf20Sopenharmony_ci			  cdata->keylen, CLASS_1 | KEY_DEST_CLASS_REG);
16078c2ecf20Sopenharmony_ci
16088c2ecf20Sopenharmony_ci	/* Load sector size with index 40 bytes (0x28) */
16098c2ecf20Sopenharmony_ci	append_load_as_imm(desc, (void *)&sector_size, 8, LDST_CLASS_1_CCB |
16108c2ecf20Sopenharmony_ci			   LDST_SRCDST_BYTE_CONTEXT |
16118c2ecf20Sopenharmony_ci			   (0x28 << LDST_OFFSET_SHIFT));
16128c2ecf20Sopenharmony_ci
16138c2ecf20Sopenharmony_ci	set_jump_tgt_here(desc, key_jump_cmd);
16148c2ecf20Sopenharmony_ci
16158c2ecf20Sopenharmony_ci	/*
16168c2ecf20Sopenharmony_ci	 * create sequence for loading the sector index / 16B tweak value
16178c2ecf20Sopenharmony_ci	 * Lower 8B of IV - sector index / tweak lower half
16188c2ecf20Sopenharmony_ci	 * Upper 8B of IV - upper half of 16B tweak
16198c2ecf20Sopenharmony_ci	 */
16208c2ecf20Sopenharmony_ci	append_seq_load(desc, 8, LDST_SRCDST_BYTE_CONTEXT | LDST_CLASS_1_CCB |
16218c2ecf20Sopenharmony_ci			(0x20 << LDST_OFFSET_SHIFT));
16228c2ecf20Sopenharmony_ci	append_seq_load(desc, 8, LDST_SRCDST_BYTE_CONTEXT | LDST_CLASS_1_CCB |
16238c2ecf20Sopenharmony_ci			(0x30 << LDST_OFFSET_SHIFT));
16248c2ecf20Sopenharmony_ci	/* Load operation */
16258c2ecf20Sopenharmony_ci	append_dec_op1(desc, cdata->algtype);
16268c2ecf20Sopenharmony_ci
16278c2ecf20Sopenharmony_ci	/* Perform operation */
16288c2ecf20Sopenharmony_ci	skcipher_append_src_dst(desc);
16298c2ecf20Sopenharmony_ci
16308c2ecf20Sopenharmony_ci	/* Store lower 8B and upper 8B of IV */
16318c2ecf20Sopenharmony_ci	append_seq_store(desc, 8, LDST_SRCDST_BYTE_CONTEXT | LDST_CLASS_1_CCB |
16328c2ecf20Sopenharmony_ci			 (0x20 << LDST_OFFSET_SHIFT));
16338c2ecf20Sopenharmony_ci	append_seq_store(desc, 8, LDST_SRCDST_BYTE_CONTEXT | LDST_CLASS_1_CCB |
16348c2ecf20Sopenharmony_ci			 (0x30 << LDST_OFFSET_SHIFT));
16358c2ecf20Sopenharmony_ci
16368c2ecf20Sopenharmony_ci	print_hex_dump_debug("xts skcipher dec shdesc@" __stringify(__LINE__)
16378c2ecf20Sopenharmony_ci			     ": ", DUMP_PREFIX_ADDRESS, 16, 4, desc,
16388c2ecf20Sopenharmony_ci			     desc_bytes(desc), 1);
16398c2ecf20Sopenharmony_ci}
16408c2ecf20Sopenharmony_ciEXPORT_SYMBOL(cnstr_shdsc_xts_skcipher_decap);
16418c2ecf20Sopenharmony_ci
16428c2ecf20Sopenharmony_ciMODULE_LICENSE("GPL");
16438c2ecf20Sopenharmony_ciMODULE_DESCRIPTION("FSL CAAM descriptor support");
16448c2ecf20Sopenharmony_ciMODULE_AUTHOR("Freescale Semiconductor - NMG/STC");
1645