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 *)§or_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 *)§or_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