18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * caam descriptor construction helper functions 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * Copyright 2008-2012 Freescale Semiconductor, Inc. 68c2ecf20Sopenharmony_ci * Copyright 2019 NXP 78c2ecf20Sopenharmony_ci */ 88c2ecf20Sopenharmony_ci 98c2ecf20Sopenharmony_ci#ifndef DESC_CONSTR_H 108c2ecf20Sopenharmony_ci#define DESC_CONSTR_H 118c2ecf20Sopenharmony_ci 128c2ecf20Sopenharmony_ci#include "desc.h" 138c2ecf20Sopenharmony_ci#include "regs.h" 148c2ecf20Sopenharmony_ci 158c2ecf20Sopenharmony_ci#define IMMEDIATE (1 << 23) 168c2ecf20Sopenharmony_ci#define CAAM_CMD_SZ sizeof(u32) 178c2ecf20Sopenharmony_ci#define CAAM_PTR_SZ caam_ptr_sz 188c2ecf20Sopenharmony_ci#define CAAM_PTR_SZ_MAX sizeof(dma_addr_t) 198c2ecf20Sopenharmony_ci#define CAAM_PTR_SZ_MIN sizeof(u32) 208c2ecf20Sopenharmony_ci#define CAAM_DESC_BYTES_MAX (CAAM_CMD_SZ * MAX_CAAM_DESCSIZE) 218c2ecf20Sopenharmony_ci#define __DESC_JOB_IO_LEN(n) (CAAM_CMD_SZ * 5 + (n) * 3) 228c2ecf20Sopenharmony_ci#define DESC_JOB_IO_LEN __DESC_JOB_IO_LEN(CAAM_PTR_SZ) 238c2ecf20Sopenharmony_ci#define DESC_JOB_IO_LEN_MAX __DESC_JOB_IO_LEN(CAAM_PTR_SZ_MAX) 248c2ecf20Sopenharmony_ci#define DESC_JOB_IO_LEN_MIN __DESC_JOB_IO_LEN(CAAM_PTR_SZ_MIN) 258c2ecf20Sopenharmony_ci 268c2ecf20Sopenharmony_ci/* 278c2ecf20Sopenharmony_ci * The CAAM QI hardware constructs a job descriptor which points 288c2ecf20Sopenharmony_ci * to shared descriptor (as pointed by context_a of FQ to CAAM). 298c2ecf20Sopenharmony_ci * When the job descriptor is executed by deco, the whole job 308c2ecf20Sopenharmony_ci * descriptor together with shared descriptor gets loaded in 318c2ecf20Sopenharmony_ci * deco buffer which is 64 words long (each 32-bit). 328c2ecf20Sopenharmony_ci * 338c2ecf20Sopenharmony_ci * The job descriptor constructed by QI hardware has layout: 348c2ecf20Sopenharmony_ci * 358c2ecf20Sopenharmony_ci * HEADER (1 word) 368c2ecf20Sopenharmony_ci * Shdesc ptr (1 or 2 words) 378c2ecf20Sopenharmony_ci * SEQ_OUT_PTR (1 word) 388c2ecf20Sopenharmony_ci * Out ptr (1 or 2 words) 398c2ecf20Sopenharmony_ci * Out length (1 word) 408c2ecf20Sopenharmony_ci * SEQ_IN_PTR (1 word) 418c2ecf20Sopenharmony_ci * In ptr (1 or 2 words) 428c2ecf20Sopenharmony_ci * In length (1 word) 438c2ecf20Sopenharmony_ci * 448c2ecf20Sopenharmony_ci * The shdesc ptr is used to fetch shared descriptor contents 458c2ecf20Sopenharmony_ci * into deco buffer. 468c2ecf20Sopenharmony_ci * 478c2ecf20Sopenharmony_ci * Apart from shdesc contents, the total number of words that 488c2ecf20Sopenharmony_ci * get loaded in deco buffer are '8' or '11'. The remaining words 498c2ecf20Sopenharmony_ci * in deco buffer can be used for storing shared descriptor. 508c2ecf20Sopenharmony_ci */ 518c2ecf20Sopenharmony_ci#define MAX_SDLEN ((CAAM_DESC_BYTES_MAX - DESC_JOB_IO_LEN_MIN) / CAAM_CMD_SZ) 528c2ecf20Sopenharmony_ci 538c2ecf20Sopenharmony_ci#ifdef DEBUG 548c2ecf20Sopenharmony_ci#define PRINT_POS do { printk(KERN_DEBUG "%02d: %s\n", desc_len(desc),\ 558c2ecf20Sopenharmony_ci &__func__[sizeof("append")]); } while (0) 568c2ecf20Sopenharmony_ci#else 578c2ecf20Sopenharmony_ci#define PRINT_POS 588c2ecf20Sopenharmony_ci#endif 598c2ecf20Sopenharmony_ci 608c2ecf20Sopenharmony_ci#define SET_OK_NO_PROP_ERRORS (IMMEDIATE | LDST_CLASS_DECO | \ 618c2ecf20Sopenharmony_ci LDST_SRCDST_WORD_DECOCTRL | \ 628c2ecf20Sopenharmony_ci (LDOFF_CHG_SHARE_OK_NO_PROP << \ 638c2ecf20Sopenharmony_ci LDST_OFFSET_SHIFT)) 648c2ecf20Sopenharmony_ci#define DISABLE_AUTO_INFO_FIFO (IMMEDIATE | LDST_CLASS_DECO | \ 658c2ecf20Sopenharmony_ci LDST_SRCDST_WORD_DECOCTRL | \ 668c2ecf20Sopenharmony_ci (LDOFF_DISABLE_AUTO_NFIFO << LDST_OFFSET_SHIFT)) 678c2ecf20Sopenharmony_ci#define ENABLE_AUTO_INFO_FIFO (IMMEDIATE | LDST_CLASS_DECO | \ 688c2ecf20Sopenharmony_ci LDST_SRCDST_WORD_DECOCTRL | \ 698c2ecf20Sopenharmony_ci (LDOFF_ENABLE_AUTO_NFIFO << LDST_OFFSET_SHIFT)) 708c2ecf20Sopenharmony_ci 718c2ecf20Sopenharmony_ciextern bool caam_little_end; 728c2ecf20Sopenharmony_ciextern size_t caam_ptr_sz; 738c2ecf20Sopenharmony_ci 748c2ecf20Sopenharmony_ci/* 758c2ecf20Sopenharmony_ci * HW fetches 4 S/G table entries at a time, irrespective of how many entries 768c2ecf20Sopenharmony_ci * are in the table. It's SW's responsibility to make sure these accesses 778c2ecf20Sopenharmony_ci * do not have side effects. 788c2ecf20Sopenharmony_ci */ 798c2ecf20Sopenharmony_cistatic inline int pad_sg_nents(int sg_nents) 808c2ecf20Sopenharmony_ci{ 818c2ecf20Sopenharmony_ci return ALIGN(sg_nents, 4); 828c2ecf20Sopenharmony_ci} 838c2ecf20Sopenharmony_ci 848c2ecf20Sopenharmony_cistatic inline int desc_len(u32 * const desc) 858c2ecf20Sopenharmony_ci{ 868c2ecf20Sopenharmony_ci return caam32_to_cpu(*desc) & HDR_DESCLEN_MASK; 878c2ecf20Sopenharmony_ci} 888c2ecf20Sopenharmony_ci 898c2ecf20Sopenharmony_cistatic inline int desc_bytes(void * const desc) 908c2ecf20Sopenharmony_ci{ 918c2ecf20Sopenharmony_ci return desc_len(desc) * CAAM_CMD_SZ; 928c2ecf20Sopenharmony_ci} 938c2ecf20Sopenharmony_ci 948c2ecf20Sopenharmony_cistatic inline u32 *desc_end(u32 * const desc) 958c2ecf20Sopenharmony_ci{ 968c2ecf20Sopenharmony_ci return desc + desc_len(desc); 978c2ecf20Sopenharmony_ci} 988c2ecf20Sopenharmony_ci 998c2ecf20Sopenharmony_cistatic inline void *sh_desc_pdb(u32 * const desc) 1008c2ecf20Sopenharmony_ci{ 1018c2ecf20Sopenharmony_ci return desc + 1; 1028c2ecf20Sopenharmony_ci} 1038c2ecf20Sopenharmony_ci 1048c2ecf20Sopenharmony_cistatic inline void init_desc(u32 * const desc, u32 options) 1058c2ecf20Sopenharmony_ci{ 1068c2ecf20Sopenharmony_ci *desc = cpu_to_caam32((options | HDR_ONE) + 1); 1078c2ecf20Sopenharmony_ci} 1088c2ecf20Sopenharmony_ci 1098c2ecf20Sopenharmony_cistatic inline void init_sh_desc(u32 * const desc, u32 options) 1108c2ecf20Sopenharmony_ci{ 1118c2ecf20Sopenharmony_ci PRINT_POS; 1128c2ecf20Sopenharmony_ci init_desc(desc, CMD_SHARED_DESC_HDR | options); 1138c2ecf20Sopenharmony_ci} 1148c2ecf20Sopenharmony_ci 1158c2ecf20Sopenharmony_cistatic inline void init_sh_desc_pdb(u32 * const desc, u32 options, 1168c2ecf20Sopenharmony_ci size_t pdb_bytes) 1178c2ecf20Sopenharmony_ci{ 1188c2ecf20Sopenharmony_ci u32 pdb_len = (pdb_bytes + CAAM_CMD_SZ - 1) / CAAM_CMD_SZ; 1198c2ecf20Sopenharmony_ci 1208c2ecf20Sopenharmony_ci init_sh_desc(desc, (((pdb_len + 1) << HDR_START_IDX_SHIFT) + pdb_len) | 1218c2ecf20Sopenharmony_ci options); 1228c2ecf20Sopenharmony_ci} 1238c2ecf20Sopenharmony_ci 1248c2ecf20Sopenharmony_cistatic inline void init_job_desc(u32 * const desc, u32 options) 1258c2ecf20Sopenharmony_ci{ 1268c2ecf20Sopenharmony_ci init_desc(desc, CMD_DESC_HDR | options); 1278c2ecf20Sopenharmony_ci} 1288c2ecf20Sopenharmony_ci 1298c2ecf20Sopenharmony_cistatic inline void init_job_desc_pdb(u32 * const desc, u32 options, 1308c2ecf20Sopenharmony_ci size_t pdb_bytes) 1318c2ecf20Sopenharmony_ci{ 1328c2ecf20Sopenharmony_ci u32 pdb_len = (pdb_bytes + CAAM_CMD_SZ - 1) / CAAM_CMD_SZ; 1338c2ecf20Sopenharmony_ci 1348c2ecf20Sopenharmony_ci init_job_desc(desc, (((pdb_len + 1) << HDR_START_IDX_SHIFT)) | options); 1358c2ecf20Sopenharmony_ci} 1368c2ecf20Sopenharmony_ci 1378c2ecf20Sopenharmony_cistatic inline void append_ptr(u32 * const desc, dma_addr_t ptr) 1388c2ecf20Sopenharmony_ci{ 1398c2ecf20Sopenharmony_ci if (caam_ptr_sz == sizeof(dma_addr_t)) { 1408c2ecf20Sopenharmony_ci dma_addr_t *offset = (dma_addr_t *)desc_end(desc); 1418c2ecf20Sopenharmony_ci 1428c2ecf20Sopenharmony_ci *offset = cpu_to_caam_dma(ptr); 1438c2ecf20Sopenharmony_ci } else { 1448c2ecf20Sopenharmony_ci u32 *offset = (u32 *)desc_end(desc); 1458c2ecf20Sopenharmony_ci 1468c2ecf20Sopenharmony_ci *offset = cpu_to_caam_dma(ptr); 1478c2ecf20Sopenharmony_ci } 1488c2ecf20Sopenharmony_ci 1498c2ecf20Sopenharmony_ci (*desc) = cpu_to_caam32(caam32_to_cpu(*desc) + 1508c2ecf20Sopenharmony_ci CAAM_PTR_SZ / CAAM_CMD_SZ); 1518c2ecf20Sopenharmony_ci} 1528c2ecf20Sopenharmony_ci 1538c2ecf20Sopenharmony_cistatic inline void init_job_desc_shared(u32 * const desc, dma_addr_t ptr, 1548c2ecf20Sopenharmony_ci int len, u32 options) 1558c2ecf20Sopenharmony_ci{ 1568c2ecf20Sopenharmony_ci PRINT_POS; 1578c2ecf20Sopenharmony_ci init_job_desc(desc, HDR_SHARED | options | 1588c2ecf20Sopenharmony_ci (len << HDR_START_IDX_SHIFT)); 1598c2ecf20Sopenharmony_ci append_ptr(desc, ptr); 1608c2ecf20Sopenharmony_ci} 1618c2ecf20Sopenharmony_ci 1628c2ecf20Sopenharmony_cistatic inline void append_data(u32 * const desc, const void *data, int len) 1638c2ecf20Sopenharmony_ci{ 1648c2ecf20Sopenharmony_ci u32 *offset = desc_end(desc); 1658c2ecf20Sopenharmony_ci 1668c2ecf20Sopenharmony_ci if (len) /* avoid sparse warning: memcpy with byte count of 0 */ 1678c2ecf20Sopenharmony_ci memcpy(offset, data, len); 1688c2ecf20Sopenharmony_ci 1698c2ecf20Sopenharmony_ci (*desc) = cpu_to_caam32(caam32_to_cpu(*desc) + 1708c2ecf20Sopenharmony_ci (len + CAAM_CMD_SZ - 1) / CAAM_CMD_SZ); 1718c2ecf20Sopenharmony_ci} 1728c2ecf20Sopenharmony_ci 1738c2ecf20Sopenharmony_cistatic inline void append_cmd(u32 * const desc, u32 command) 1748c2ecf20Sopenharmony_ci{ 1758c2ecf20Sopenharmony_ci u32 *cmd = desc_end(desc); 1768c2ecf20Sopenharmony_ci 1778c2ecf20Sopenharmony_ci *cmd = cpu_to_caam32(command); 1788c2ecf20Sopenharmony_ci 1798c2ecf20Sopenharmony_ci (*desc) = cpu_to_caam32(caam32_to_cpu(*desc) + 1); 1808c2ecf20Sopenharmony_ci} 1818c2ecf20Sopenharmony_ci 1828c2ecf20Sopenharmony_ci#define append_u32 append_cmd 1838c2ecf20Sopenharmony_ci 1848c2ecf20Sopenharmony_cistatic inline void append_u64(u32 * const desc, u64 data) 1858c2ecf20Sopenharmony_ci{ 1868c2ecf20Sopenharmony_ci u32 *offset = desc_end(desc); 1878c2ecf20Sopenharmony_ci 1888c2ecf20Sopenharmony_ci /* Only 32-bit alignment is guaranteed in descriptor buffer */ 1898c2ecf20Sopenharmony_ci if (caam_little_end) { 1908c2ecf20Sopenharmony_ci *offset = cpu_to_caam32(lower_32_bits(data)); 1918c2ecf20Sopenharmony_ci *(++offset) = cpu_to_caam32(upper_32_bits(data)); 1928c2ecf20Sopenharmony_ci } else { 1938c2ecf20Sopenharmony_ci *offset = cpu_to_caam32(upper_32_bits(data)); 1948c2ecf20Sopenharmony_ci *(++offset) = cpu_to_caam32(lower_32_bits(data)); 1958c2ecf20Sopenharmony_ci } 1968c2ecf20Sopenharmony_ci 1978c2ecf20Sopenharmony_ci (*desc) = cpu_to_caam32(caam32_to_cpu(*desc) + 2); 1988c2ecf20Sopenharmony_ci} 1998c2ecf20Sopenharmony_ci 2008c2ecf20Sopenharmony_ci/* Write command without affecting header, and return pointer to next word */ 2018c2ecf20Sopenharmony_cistatic inline u32 *write_cmd(u32 * const desc, u32 command) 2028c2ecf20Sopenharmony_ci{ 2038c2ecf20Sopenharmony_ci *desc = cpu_to_caam32(command); 2048c2ecf20Sopenharmony_ci 2058c2ecf20Sopenharmony_ci return desc + 1; 2068c2ecf20Sopenharmony_ci} 2078c2ecf20Sopenharmony_ci 2088c2ecf20Sopenharmony_cistatic inline void append_cmd_ptr(u32 * const desc, dma_addr_t ptr, int len, 2098c2ecf20Sopenharmony_ci u32 command) 2108c2ecf20Sopenharmony_ci{ 2118c2ecf20Sopenharmony_ci append_cmd(desc, command | len); 2128c2ecf20Sopenharmony_ci append_ptr(desc, ptr); 2138c2ecf20Sopenharmony_ci} 2148c2ecf20Sopenharmony_ci 2158c2ecf20Sopenharmony_ci/* Write length after pointer, rather than inside command */ 2168c2ecf20Sopenharmony_cistatic inline void append_cmd_ptr_extlen(u32 * const desc, dma_addr_t ptr, 2178c2ecf20Sopenharmony_ci unsigned int len, u32 command) 2188c2ecf20Sopenharmony_ci{ 2198c2ecf20Sopenharmony_ci append_cmd(desc, command); 2208c2ecf20Sopenharmony_ci if (!(command & (SQIN_RTO | SQIN_PRE))) 2218c2ecf20Sopenharmony_ci append_ptr(desc, ptr); 2228c2ecf20Sopenharmony_ci append_cmd(desc, len); 2238c2ecf20Sopenharmony_ci} 2248c2ecf20Sopenharmony_ci 2258c2ecf20Sopenharmony_cistatic inline void append_cmd_data(u32 * const desc, const void *data, int len, 2268c2ecf20Sopenharmony_ci u32 command) 2278c2ecf20Sopenharmony_ci{ 2288c2ecf20Sopenharmony_ci append_cmd(desc, command | IMMEDIATE | len); 2298c2ecf20Sopenharmony_ci append_data(desc, data, len); 2308c2ecf20Sopenharmony_ci} 2318c2ecf20Sopenharmony_ci 2328c2ecf20Sopenharmony_ci#define APPEND_CMD_RET(cmd, op) \ 2338c2ecf20Sopenharmony_cistatic inline u32 *append_##cmd(u32 * const desc, u32 options) \ 2348c2ecf20Sopenharmony_ci{ \ 2358c2ecf20Sopenharmony_ci u32 *cmd = desc_end(desc); \ 2368c2ecf20Sopenharmony_ci PRINT_POS; \ 2378c2ecf20Sopenharmony_ci append_cmd(desc, CMD_##op | options); \ 2388c2ecf20Sopenharmony_ci return cmd; \ 2398c2ecf20Sopenharmony_ci} 2408c2ecf20Sopenharmony_ciAPPEND_CMD_RET(jump, JUMP) 2418c2ecf20Sopenharmony_ciAPPEND_CMD_RET(move, MOVE) 2428c2ecf20Sopenharmony_ciAPPEND_CMD_RET(move_len, MOVE_LEN) 2438c2ecf20Sopenharmony_ci 2448c2ecf20Sopenharmony_cistatic inline void set_jump_tgt_here(u32 * const desc, u32 *jump_cmd) 2458c2ecf20Sopenharmony_ci{ 2468c2ecf20Sopenharmony_ci *jump_cmd = cpu_to_caam32(caam32_to_cpu(*jump_cmd) | 2478c2ecf20Sopenharmony_ci (desc_len(desc) - (jump_cmd - desc))); 2488c2ecf20Sopenharmony_ci} 2498c2ecf20Sopenharmony_ci 2508c2ecf20Sopenharmony_cistatic inline void set_move_tgt_here(u32 * const desc, u32 *move_cmd) 2518c2ecf20Sopenharmony_ci{ 2528c2ecf20Sopenharmony_ci u32 val = caam32_to_cpu(*move_cmd); 2538c2ecf20Sopenharmony_ci 2548c2ecf20Sopenharmony_ci val &= ~MOVE_OFFSET_MASK; 2558c2ecf20Sopenharmony_ci val |= (desc_len(desc) << (MOVE_OFFSET_SHIFT + 2)) & MOVE_OFFSET_MASK; 2568c2ecf20Sopenharmony_ci *move_cmd = cpu_to_caam32(val); 2578c2ecf20Sopenharmony_ci} 2588c2ecf20Sopenharmony_ci 2598c2ecf20Sopenharmony_ci#define APPEND_CMD(cmd, op) \ 2608c2ecf20Sopenharmony_cistatic inline void append_##cmd(u32 * const desc, u32 options) \ 2618c2ecf20Sopenharmony_ci{ \ 2628c2ecf20Sopenharmony_ci PRINT_POS; \ 2638c2ecf20Sopenharmony_ci append_cmd(desc, CMD_##op | options); \ 2648c2ecf20Sopenharmony_ci} 2658c2ecf20Sopenharmony_ciAPPEND_CMD(operation, OPERATION) 2668c2ecf20Sopenharmony_ci 2678c2ecf20Sopenharmony_ci#define APPEND_CMD_LEN(cmd, op) \ 2688c2ecf20Sopenharmony_cistatic inline void append_##cmd(u32 * const desc, unsigned int len, \ 2698c2ecf20Sopenharmony_ci u32 options) \ 2708c2ecf20Sopenharmony_ci{ \ 2718c2ecf20Sopenharmony_ci PRINT_POS; \ 2728c2ecf20Sopenharmony_ci append_cmd(desc, CMD_##op | len | options); \ 2738c2ecf20Sopenharmony_ci} 2748c2ecf20Sopenharmony_ci 2758c2ecf20Sopenharmony_ciAPPEND_CMD_LEN(seq_load, SEQ_LOAD) 2768c2ecf20Sopenharmony_ciAPPEND_CMD_LEN(seq_store, SEQ_STORE) 2778c2ecf20Sopenharmony_ciAPPEND_CMD_LEN(seq_fifo_load, SEQ_FIFO_LOAD) 2788c2ecf20Sopenharmony_ciAPPEND_CMD_LEN(seq_fifo_store, SEQ_FIFO_STORE) 2798c2ecf20Sopenharmony_ci 2808c2ecf20Sopenharmony_ci#define APPEND_CMD_PTR(cmd, op) \ 2818c2ecf20Sopenharmony_cistatic inline void append_##cmd(u32 * const desc, dma_addr_t ptr, \ 2828c2ecf20Sopenharmony_ci unsigned int len, u32 options) \ 2838c2ecf20Sopenharmony_ci{ \ 2848c2ecf20Sopenharmony_ci PRINT_POS; \ 2858c2ecf20Sopenharmony_ci append_cmd_ptr(desc, ptr, len, CMD_##op | options); \ 2868c2ecf20Sopenharmony_ci} 2878c2ecf20Sopenharmony_ciAPPEND_CMD_PTR(key, KEY) 2888c2ecf20Sopenharmony_ciAPPEND_CMD_PTR(load, LOAD) 2898c2ecf20Sopenharmony_ciAPPEND_CMD_PTR(fifo_load, FIFO_LOAD) 2908c2ecf20Sopenharmony_ciAPPEND_CMD_PTR(fifo_store, FIFO_STORE) 2918c2ecf20Sopenharmony_ci 2928c2ecf20Sopenharmony_cistatic inline void append_store(u32 * const desc, dma_addr_t ptr, 2938c2ecf20Sopenharmony_ci unsigned int len, u32 options) 2948c2ecf20Sopenharmony_ci{ 2958c2ecf20Sopenharmony_ci u32 cmd_src; 2968c2ecf20Sopenharmony_ci 2978c2ecf20Sopenharmony_ci cmd_src = options & LDST_SRCDST_MASK; 2988c2ecf20Sopenharmony_ci 2998c2ecf20Sopenharmony_ci append_cmd(desc, CMD_STORE | options | len); 3008c2ecf20Sopenharmony_ci 3018c2ecf20Sopenharmony_ci /* The following options do not require pointer */ 3028c2ecf20Sopenharmony_ci if (!(cmd_src == LDST_SRCDST_WORD_DESCBUF_SHARED || 3038c2ecf20Sopenharmony_ci cmd_src == LDST_SRCDST_WORD_DESCBUF_JOB || 3048c2ecf20Sopenharmony_ci cmd_src == LDST_SRCDST_WORD_DESCBUF_JOB_WE || 3058c2ecf20Sopenharmony_ci cmd_src == LDST_SRCDST_WORD_DESCBUF_SHARED_WE)) 3068c2ecf20Sopenharmony_ci append_ptr(desc, ptr); 3078c2ecf20Sopenharmony_ci} 3088c2ecf20Sopenharmony_ci 3098c2ecf20Sopenharmony_ci#define APPEND_SEQ_PTR_INTLEN(cmd, op) \ 3108c2ecf20Sopenharmony_cistatic inline void append_seq_##cmd##_ptr_intlen(u32 * const desc, \ 3118c2ecf20Sopenharmony_ci dma_addr_t ptr, \ 3128c2ecf20Sopenharmony_ci unsigned int len, \ 3138c2ecf20Sopenharmony_ci u32 options) \ 3148c2ecf20Sopenharmony_ci{ \ 3158c2ecf20Sopenharmony_ci PRINT_POS; \ 3168c2ecf20Sopenharmony_ci if (options & (SQIN_RTO | SQIN_PRE)) \ 3178c2ecf20Sopenharmony_ci append_cmd(desc, CMD_SEQ_##op##_PTR | len | options); \ 3188c2ecf20Sopenharmony_ci else \ 3198c2ecf20Sopenharmony_ci append_cmd_ptr(desc, ptr, len, CMD_SEQ_##op##_PTR | options); \ 3208c2ecf20Sopenharmony_ci} 3218c2ecf20Sopenharmony_ciAPPEND_SEQ_PTR_INTLEN(in, IN) 3228c2ecf20Sopenharmony_ciAPPEND_SEQ_PTR_INTLEN(out, OUT) 3238c2ecf20Sopenharmony_ci 3248c2ecf20Sopenharmony_ci#define APPEND_CMD_PTR_TO_IMM(cmd, op) \ 3258c2ecf20Sopenharmony_cistatic inline void append_##cmd##_as_imm(u32 * const desc, const void *data, \ 3268c2ecf20Sopenharmony_ci unsigned int len, u32 options) \ 3278c2ecf20Sopenharmony_ci{ \ 3288c2ecf20Sopenharmony_ci PRINT_POS; \ 3298c2ecf20Sopenharmony_ci append_cmd_data(desc, data, len, CMD_##op | options); \ 3308c2ecf20Sopenharmony_ci} 3318c2ecf20Sopenharmony_ciAPPEND_CMD_PTR_TO_IMM(load, LOAD); 3328c2ecf20Sopenharmony_ciAPPEND_CMD_PTR_TO_IMM(fifo_load, FIFO_LOAD); 3338c2ecf20Sopenharmony_ci 3348c2ecf20Sopenharmony_ci#define APPEND_CMD_PTR_EXTLEN(cmd, op) \ 3358c2ecf20Sopenharmony_cistatic inline void append_##cmd##_extlen(u32 * const desc, dma_addr_t ptr, \ 3368c2ecf20Sopenharmony_ci unsigned int len, u32 options) \ 3378c2ecf20Sopenharmony_ci{ \ 3388c2ecf20Sopenharmony_ci PRINT_POS; \ 3398c2ecf20Sopenharmony_ci append_cmd_ptr_extlen(desc, ptr, len, CMD_##op | SQIN_EXT | options); \ 3408c2ecf20Sopenharmony_ci} 3418c2ecf20Sopenharmony_ciAPPEND_CMD_PTR_EXTLEN(seq_in_ptr, SEQ_IN_PTR) 3428c2ecf20Sopenharmony_ciAPPEND_CMD_PTR_EXTLEN(seq_out_ptr, SEQ_OUT_PTR) 3438c2ecf20Sopenharmony_ci 3448c2ecf20Sopenharmony_ci/* 3458c2ecf20Sopenharmony_ci * Determine whether to store length internally or externally depending on 3468c2ecf20Sopenharmony_ci * the size of its type 3478c2ecf20Sopenharmony_ci */ 3488c2ecf20Sopenharmony_ci#define APPEND_CMD_PTR_LEN(cmd, op, type) \ 3498c2ecf20Sopenharmony_cistatic inline void append_##cmd(u32 * const desc, dma_addr_t ptr, \ 3508c2ecf20Sopenharmony_ci type len, u32 options) \ 3518c2ecf20Sopenharmony_ci{ \ 3528c2ecf20Sopenharmony_ci PRINT_POS; \ 3538c2ecf20Sopenharmony_ci if (sizeof(type) > sizeof(u16)) \ 3548c2ecf20Sopenharmony_ci append_##cmd##_extlen(desc, ptr, len, options); \ 3558c2ecf20Sopenharmony_ci else \ 3568c2ecf20Sopenharmony_ci append_##cmd##_intlen(desc, ptr, len, options); \ 3578c2ecf20Sopenharmony_ci} 3588c2ecf20Sopenharmony_ciAPPEND_CMD_PTR_LEN(seq_in_ptr, SEQ_IN_PTR, u32) 3598c2ecf20Sopenharmony_ciAPPEND_CMD_PTR_LEN(seq_out_ptr, SEQ_OUT_PTR, u32) 3608c2ecf20Sopenharmony_ci 3618c2ecf20Sopenharmony_ci/* 3628c2ecf20Sopenharmony_ci * 2nd variant for commands whose specified immediate length differs 3638c2ecf20Sopenharmony_ci * from length of immediate data provided, e.g., split keys 3648c2ecf20Sopenharmony_ci */ 3658c2ecf20Sopenharmony_ci#define APPEND_CMD_PTR_TO_IMM2(cmd, op) \ 3668c2ecf20Sopenharmony_cistatic inline void append_##cmd##_as_imm(u32 * const desc, const void *data, \ 3678c2ecf20Sopenharmony_ci unsigned int data_len, \ 3688c2ecf20Sopenharmony_ci unsigned int len, u32 options) \ 3698c2ecf20Sopenharmony_ci{ \ 3708c2ecf20Sopenharmony_ci PRINT_POS; \ 3718c2ecf20Sopenharmony_ci append_cmd(desc, CMD_##op | IMMEDIATE | len | options); \ 3728c2ecf20Sopenharmony_ci append_data(desc, data, data_len); \ 3738c2ecf20Sopenharmony_ci} 3748c2ecf20Sopenharmony_ciAPPEND_CMD_PTR_TO_IMM2(key, KEY); 3758c2ecf20Sopenharmony_ci 3768c2ecf20Sopenharmony_ci#define APPEND_CMD_RAW_IMM(cmd, op, type) \ 3778c2ecf20Sopenharmony_cistatic inline void append_##cmd##_imm_##type(u32 * const desc, type immediate, \ 3788c2ecf20Sopenharmony_ci u32 options) \ 3798c2ecf20Sopenharmony_ci{ \ 3808c2ecf20Sopenharmony_ci PRINT_POS; \ 3818c2ecf20Sopenharmony_ci if (options & LDST_LEN_MASK) \ 3828c2ecf20Sopenharmony_ci append_cmd(desc, CMD_##op | IMMEDIATE | options); \ 3838c2ecf20Sopenharmony_ci else \ 3848c2ecf20Sopenharmony_ci append_cmd(desc, CMD_##op | IMMEDIATE | options | \ 3858c2ecf20Sopenharmony_ci sizeof(type)); \ 3868c2ecf20Sopenharmony_ci append_cmd(desc, immediate); \ 3878c2ecf20Sopenharmony_ci} 3888c2ecf20Sopenharmony_ciAPPEND_CMD_RAW_IMM(load, LOAD, u32); 3898c2ecf20Sopenharmony_ci 3908c2ecf20Sopenharmony_ci/* 3918c2ecf20Sopenharmony_ci * ee - endianness 3928c2ecf20Sopenharmony_ci * size - size of immediate type in bytes 3938c2ecf20Sopenharmony_ci */ 3948c2ecf20Sopenharmony_ci#define APPEND_CMD_RAW_IMM2(cmd, op, ee, size) \ 3958c2ecf20Sopenharmony_cistatic inline void append_##cmd##_imm_##ee##size(u32 *desc, \ 3968c2ecf20Sopenharmony_ci u##size immediate, \ 3978c2ecf20Sopenharmony_ci u32 options) \ 3988c2ecf20Sopenharmony_ci{ \ 3998c2ecf20Sopenharmony_ci __##ee##size data = cpu_to_##ee##size(immediate); \ 4008c2ecf20Sopenharmony_ci PRINT_POS; \ 4018c2ecf20Sopenharmony_ci append_cmd(desc, CMD_##op | IMMEDIATE | options | sizeof(data)); \ 4028c2ecf20Sopenharmony_ci append_data(desc, &data, sizeof(data)); \ 4038c2ecf20Sopenharmony_ci} 4048c2ecf20Sopenharmony_ci 4058c2ecf20Sopenharmony_ciAPPEND_CMD_RAW_IMM2(load, LOAD, be, 32); 4068c2ecf20Sopenharmony_ci 4078c2ecf20Sopenharmony_ci/* 4088c2ecf20Sopenharmony_ci * Append math command. Only the last part of destination and source need to 4098c2ecf20Sopenharmony_ci * be specified 4108c2ecf20Sopenharmony_ci */ 4118c2ecf20Sopenharmony_ci#define APPEND_MATH(op, desc, dest, src_0, src_1, len) \ 4128c2ecf20Sopenharmony_ciappend_cmd(desc, CMD_MATH | MATH_FUN_##op | MATH_DEST_##dest | \ 4138c2ecf20Sopenharmony_ci MATH_SRC0_##src_0 | MATH_SRC1_##src_1 | (u32)len); 4148c2ecf20Sopenharmony_ci 4158c2ecf20Sopenharmony_ci#define append_math_add(desc, dest, src0, src1, len) \ 4168c2ecf20Sopenharmony_ci APPEND_MATH(ADD, desc, dest, src0, src1, len) 4178c2ecf20Sopenharmony_ci#define append_math_sub(desc, dest, src0, src1, len) \ 4188c2ecf20Sopenharmony_ci APPEND_MATH(SUB, desc, dest, src0, src1, len) 4198c2ecf20Sopenharmony_ci#define append_math_add_c(desc, dest, src0, src1, len) \ 4208c2ecf20Sopenharmony_ci APPEND_MATH(ADDC, desc, dest, src0, src1, len) 4218c2ecf20Sopenharmony_ci#define append_math_sub_b(desc, dest, src0, src1, len) \ 4228c2ecf20Sopenharmony_ci APPEND_MATH(SUBB, desc, dest, src0, src1, len) 4238c2ecf20Sopenharmony_ci#define append_math_and(desc, dest, src0, src1, len) \ 4248c2ecf20Sopenharmony_ci APPEND_MATH(AND, desc, dest, src0, src1, len) 4258c2ecf20Sopenharmony_ci#define append_math_or(desc, dest, src0, src1, len) \ 4268c2ecf20Sopenharmony_ci APPEND_MATH(OR, desc, dest, src0, src1, len) 4278c2ecf20Sopenharmony_ci#define append_math_xor(desc, dest, src0, src1, len) \ 4288c2ecf20Sopenharmony_ci APPEND_MATH(XOR, desc, dest, src0, src1, len) 4298c2ecf20Sopenharmony_ci#define append_math_lshift(desc, dest, src0, src1, len) \ 4308c2ecf20Sopenharmony_ci APPEND_MATH(LSHIFT, desc, dest, src0, src1, len) 4318c2ecf20Sopenharmony_ci#define append_math_rshift(desc, dest, src0, src1, len) \ 4328c2ecf20Sopenharmony_ci APPEND_MATH(RSHIFT, desc, dest, src0, src1, len) 4338c2ecf20Sopenharmony_ci#define append_math_ldshift(desc, dest, src0, src1, len) \ 4348c2ecf20Sopenharmony_ci APPEND_MATH(SHLD, desc, dest, src0, src1, len) 4358c2ecf20Sopenharmony_ci 4368c2ecf20Sopenharmony_ci/* Exactly one source is IMM. Data is passed in as u32 value */ 4378c2ecf20Sopenharmony_ci#define APPEND_MATH_IMM_u32(op, desc, dest, src_0, src_1, data) \ 4388c2ecf20Sopenharmony_cido { \ 4398c2ecf20Sopenharmony_ci APPEND_MATH(op, desc, dest, src_0, src_1, CAAM_CMD_SZ); \ 4408c2ecf20Sopenharmony_ci append_cmd(desc, data); \ 4418c2ecf20Sopenharmony_ci} while (0) 4428c2ecf20Sopenharmony_ci 4438c2ecf20Sopenharmony_ci#define append_math_add_imm_u32(desc, dest, src0, src1, data) \ 4448c2ecf20Sopenharmony_ci APPEND_MATH_IMM_u32(ADD, desc, dest, src0, src1, data) 4458c2ecf20Sopenharmony_ci#define append_math_sub_imm_u32(desc, dest, src0, src1, data) \ 4468c2ecf20Sopenharmony_ci APPEND_MATH_IMM_u32(SUB, desc, dest, src0, src1, data) 4478c2ecf20Sopenharmony_ci#define append_math_add_c_imm_u32(desc, dest, src0, src1, data) \ 4488c2ecf20Sopenharmony_ci APPEND_MATH_IMM_u32(ADDC, desc, dest, src0, src1, data) 4498c2ecf20Sopenharmony_ci#define append_math_sub_b_imm_u32(desc, dest, src0, src1, data) \ 4508c2ecf20Sopenharmony_ci APPEND_MATH_IMM_u32(SUBB, desc, dest, src0, src1, data) 4518c2ecf20Sopenharmony_ci#define append_math_and_imm_u32(desc, dest, src0, src1, data) \ 4528c2ecf20Sopenharmony_ci APPEND_MATH_IMM_u32(AND, desc, dest, src0, src1, data) 4538c2ecf20Sopenharmony_ci#define append_math_or_imm_u32(desc, dest, src0, src1, data) \ 4548c2ecf20Sopenharmony_ci APPEND_MATH_IMM_u32(OR, desc, dest, src0, src1, data) 4558c2ecf20Sopenharmony_ci#define append_math_xor_imm_u32(desc, dest, src0, src1, data) \ 4568c2ecf20Sopenharmony_ci APPEND_MATH_IMM_u32(XOR, desc, dest, src0, src1, data) 4578c2ecf20Sopenharmony_ci#define append_math_lshift_imm_u32(desc, dest, src0, src1, data) \ 4588c2ecf20Sopenharmony_ci APPEND_MATH_IMM_u32(LSHIFT, desc, dest, src0, src1, data) 4598c2ecf20Sopenharmony_ci#define append_math_rshift_imm_u32(desc, dest, src0, src1, data) \ 4608c2ecf20Sopenharmony_ci APPEND_MATH_IMM_u32(RSHIFT, desc, dest, src0, src1, data) 4618c2ecf20Sopenharmony_ci 4628c2ecf20Sopenharmony_ci/* Exactly one source is IMM. Data is passed in as u64 value */ 4638c2ecf20Sopenharmony_ci#define APPEND_MATH_IMM_u64(op, desc, dest, src_0, src_1, data) \ 4648c2ecf20Sopenharmony_cido { \ 4658c2ecf20Sopenharmony_ci u32 upper = (data >> 16) >> 16; \ 4668c2ecf20Sopenharmony_ci APPEND_MATH(op, desc, dest, src_0, src_1, CAAM_CMD_SZ * 2 | \ 4678c2ecf20Sopenharmony_ci (upper ? 0 : MATH_IFB)); \ 4688c2ecf20Sopenharmony_ci if (upper) \ 4698c2ecf20Sopenharmony_ci append_u64(desc, data); \ 4708c2ecf20Sopenharmony_ci else \ 4718c2ecf20Sopenharmony_ci append_u32(desc, lower_32_bits(data)); \ 4728c2ecf20Sopenharmony_ci} while (0) 4738c2ecf20Sopenharmony_ci 4748c2ecf20Sopenharmony_ci#define append_math_add_imm_u64(desc, dest, src0, src1, data) \ 4758c2ecf20Sopenharmony_ci APPEND_MATH_IMM_u64(ADD, desc, dest, src0, src1, data) 4768c2ecf20Sopenharmony_ci#define append_math_sub_imm_u64(desc, dest, src0, src1, data) \ 4778c2ecf20Sopenharmony_ci APPEND_MATH_IMM_u64(SUB, desc, dest, src0, src1, data) 4788c2ecf20Sopenharmony_ci#define append_math_add_c_imm_u64(desc, dest, src0, src1, data) \ 4798c2ecf20Sopenharmony_ci APPEND_MATH_IMM_u64(ADDC, desc, dest, src0, src1, data) 4808c2ecf20Sopenharmony_ci#define append_math_sub_b_imm_u64(desc, dest, src0, src1, data) \ 4818c2ecf20Sopenharmony_ci APPEND_MATH_IMM_u64(SUBB, desc, dest, src0, src1, data) 4828c2ecf20Sopenharmony_ci#define append_math_and_imm_u64(desc, dest, src0, src1, data) \ 4838c2ecf20Sopenharmony_ci APPEND_MATH_IMM_u64(AND, desc, dest, src0, src1, data) 4848c2ecf20Sopenharmony_ci#define append_math_or_imm_u64(desc, dest, src0, src1, data) \ 4858c2ecf20Sopenharmony_ci APPEND_MATH_IMM_u64(OR, desc, dest, src0, src1, data) 4868c2ecf20Sopenharmony_ci#define append_math_xor_imm_u64(desc, dest, src0, src1, data) \ 4878c2ecf20Sopenharmony_ci APPEND_MATH_IMM_u64(XOR, desc, dest, src0, src1, data) 4888c2ecf20Sopenharmony_ci#define append_math_lshift_imm_u64(desc, dest, src0, src1, data) \ 4898c2ecf20Sopenharmony_ci APPEND_MATH_IMM_u64(LSHIFT, desc, dest, src0, src1, data) 4908c2ecf20Sopenharmony_ci#define append_math_rshift_imm_u64(desc, dest, src0, src1, data) \ 4918c2ecf20Sopenharmony_ci APPEND_MATH_IMM_u64(RSHIFT, desc, dest, src0, src1, data) 4928c2ecf20Sopenharmony_ci 4938c2ecf20Sopenharmony_ci/** 4948c2ecf20Sopenharmony_ci * struct alginfo - Container for algorithm details 4958c2ecf20Sopenharmony_ci * @algtype: algorithm selector; for valid values, see documentation of the 4968c2ecf20Sopenharmony_ci * functions where it is used. 4978c2ecf20Sopenharmony_ci * @keylen: length of the provided algorithm key, in bytes 4988c2ecf20Sopenharmony_ci * @keylen_pad: padded length of the provided algorithm key, in bytes 4998c2ecf20Sopenharmony_ci * @key_dma: dma (bus) address where algorithm key resides 5008c2ecf20Sopenharmony_ci * @key_virt: virtual address where algorithm key resides 5018c2ecf20Sopenharmony_ci * @key_inline: true - key can be inlined in the descriptor; false - key is 5028c2ecf20Sopenharmony_ci * referenced by the descriptor 5038c2ecf20Sopenharmony_ci */ 5048c2ecf20Sopenharmony_cistruct alginfo { 5058c2ecf20Sopenharmony_ci u32 algtype; 5068c2ecf20Sopenharmony_ci unsigned int keylen; 5078c2ecf20Sopenharmony_ci unsigned int keylen_pad; 5088c2ecf20Sopenharmony_ci dma_addr_t key_dma; 5098c2ecf20Sopenharmony_ci const void *key_virt; 5108c2ecf20Sopenharmony_ci bool key_inline; 5118c2ecf20Sopenharmony_ci}; 5128c2ecf20Sopenharmony_ci 5138c2ecf20Sopenharmony_ci/** 5148c2ecf20Sopenharmony_ci * desc_inline_query() - Provide indications on which data items can be inlined 5158c2ecf20Sopenharmony_ci * and which shall be referenced in a shared descriptor. 5168c2ecf20Sopenharmony_ci * @sd_base_len: Shared descriptor base length - bytes consumed by the commands, 5178c2ecf20Sopenharmony_ci * excluding the data items to be inlined (or corresponding 5188c2ecf20Sopenharmony_ci * pointer if an item is not inlined). Each cnstr_* function that 5198c2ecf20Sopenharmony_ci * generates descriptors should have a define mentioning 5208c2ecf20Sopenharmony_ci * corresponding length. 5218c2ecf20Sopenharmony_ci * @jd_len: Maximum length of the job descriptor(s) that will be used 5228c2ecf20Sopenharmony_ci * together with the shared descriptor. 5238c2ecf20Sopenharmony_ci * @data_len: Array of lengths of the data items trying to be inlined 5248c2ecf20Sopenharmony_ci * @inl_mask: 32bit mask with bit x = 1 if data item x can be inlined, 0 5258c2ecf20Sopenharmony_ci * otherwise. 5268c2ecf20Sopenharmony_ci * @count: Number of data items (size of @data_len array); must be <= 32 5278c2ecf20Sopenharmony_ci * 5288c2ecf20Sopenharmony_ci * Return: 0 if data can be inlined / referenced, negative value if not. If 0, 5298c2ecf20Sopenharmony_ci * check @inl_mask for details. 5308c2ecf20Sopenharmony_ci */ 5318c2ecf20Sopenharmony_cistatic inline int desc_inline_query(unsigned int sd_base_len, 5328c2ecf20Sopenharmony_ci unsigned int jd_len, unsigned int *data_len, 5338c2ecf20Sopenharmony_ci u32 *inl_mask, unsigned int count) 5348c2ecf20Sopenharmony_ci{ 5358c2ecf20Sopenharmony_ci int rem_bytes = (int)(CAAM_DESC_BYTES_MAX - sd_base_len - jd_len); 5368c2ecf20Sopenharmony_ci unsigned int i; 5378c2ecf20Sopenharmony_ci 5388c2ecf20Sopenharmony_ci *inl_mask = 0; 5398c2ecf20Sopenharmony_ci for (i = 0; (i < count) && (rem_bytes > 0); i++) { 5408c2ecf20Sopenharmony_ci if (rem_bytes - (int)(data_len[i] + 5418c2ecf20Sopenharmony_ci (count - i - 1) * CAAM_PTR_SZ) >= 0) { 5428c2ecf20Sopenharmony_ci rem_bytes -= data_len[i]; 5438c2ecf20Sopenharmony_ci *inl_mask |= (1 << i); 5448c2ecf20Sopenharmony_ci } else { 5458c2ecf20Sopenharmony_ci rem_bytes -= CAAM_PTR_SZ; 5468c2ecf20Sopenharmony_ci } 5478c2ecf20Sopenharmony_ci } 5488c2ecf20Sopenharmony_ci 5498c2ecf20Sopenharmony_ci return (rem_bytes >= 0) ? 0 : -1; 5508c2ecf20Sopenharmony_ci} 5518c2ecf20Sopenharmony_ci 5528c2ecf20Sopenharmony_ci/** 5538c2ecf20Sopenharmony_ci * append_proto_dkp - Derived Key Protocol (DKP): key -> split key 5548c2ecf20Sopenharmony_ci * @desc: pointer to buffer used for descriptor construction 5558c2ecf20Sopenharmony_ci * @adata: pointer to authentication transform definitions. 5568c2ecf20Sopenharmony_ci * keylen should be the length of initial key, while keylen_pad 5578c2ecf20Sopenharmony_ci * the length of the derived (split) key. 5588c2ecf20Sopenharmony_ci * Valid algorithm values - one of OP_ALG_ALGSEL_{MD5, SHA1, SHA224, 5598c2ecf20Sopenharmony_ci * SHA256, SHA384, SHA512}. 5608c2ecf20Sopenharmony_ci */ 5618c2ecf20Sopenharmony_cistatic inline void append_proto_dkp(u32 * const desc, struct alginfo *adata) 5628c2ecf20Sopenharmony_ci{ 5638c2ecf20Sopenharmony_ci u32 protid; 5648c2ecf20Sopenharmony_ci 5658c2ecf20Sopenharmony_ci /* 5668c2ecf20Sopenharmony_ci * Quick & dirty translation from OP_ALG_ALGSEL_{MD5, SHA*} 5678c2ecf20Sopenharmony_ci * to OP_PCLID_DKP_{MD5, SHA*} 5688c2ecf20Sopenharmony_ci */ 5698c2ecf20Sopenharmony_ci protid = (adata->algtype & OP_ALG_ALGSEL_SUBMASK) | 5708c2ecf20Sopenharmony_ci (0x20 << OP_ALG_ALGSEL_SHIFT); 5718c2ecf20Sopenharmony_ci 5728c2ecf20Sopenharmony_ci if (adata->key_inline) { 5738c2ecf20Sopenharmony_ci int words; 5748c2ecf20Sopenharmony_ci 5758c2ecf20Sopenharmony_ci if (adata->keylen > adata->keylen_pad) { 5768c2ecf20Sopenharmony_ci append_operation(desc, OP_TYPE_UNI_PROTOCOL | protid | 5778c2ecf20Sopenharmony_ci OP_PCL_DKP_SRC_PTR | 5788c2ecf20Sopenharmony_ci OP_PCL_DKP_DST_IMM | adata->keylen); 5798c2ecf20Sopenharmony_ci append_ptr(desc, adata->key_dma); 5808c2ecf20Sopenharmony_ci 5818c2ecf20Sopenharmony_ci words = (ALIGN(adata->keylen_pad, CAAM_CMD_SZ) - 5828c2ecf20Sopenharmony_ci CAAM_PTR_SZ) / CAAM_CMD_SZ; 5838c2ecf20Sopenharmony_ci } else { 5848c2ecf20Sopenharmony_ci append_operation(desc, OP_TYPE_UNI_PROTOCOL | protid | 5858c2ecf20Sopenharmony_ci OP_PCL_DKP_SRC_IMM | 5868c2ecf20Sopenharmony_ci OP_PCL_DKP_DST_IMM | adata->keylen); 5878c2ecf20Sopenharmony_ci append_data(desc, adata->key_virt, adata->keylen); 5888c2ecf20Sopenharmony_ci 5898c2ecf20Sopenharmony_ci words = (ALIGN(adata->keylen_pad, CAAM_CMD_SZ) - 5908c2ecf20Sopenharmony_ci ALIGN(adata->keylen, CAAM_CMD_SZ)) / 5918c2ecf20Sopenharmony_ci CAAM_CMD_SZ; 5928c2ecf20Sopenharmony_ci } 5938c2ecf20Sopenharmony_ci 5948c2ecf20Sopenharmony_ci /* Reserve space in descriptor buffer for the derived key */ 5958c2ecf20Sopenharmony_ci if (words) 5968c2ecf20Sopenharmony_ci (*desc) = cpu_to_caam32(caam32_to_cpu(*desc) + words); 5978c2ecf20Sopenharmony_ci } else { 5988c2ecf20Sopenharmony_ci append_operation(desc, OP_TYPE_UNI_PROTOCOL | protid | 5998c2ecf20Sopenharmony_ci OP_PCL_DKP_SRC_PTR | OP_PCL_DKP_DST_PTR | 6008c2ecf20Sopenharmony_ci adata->keylen); 6018c2ecf20Sopenharmony_ci append_ptr(desc, adata->key_dma); 6028c2ecf20Sopenharmony_ci } 6038c2ecf20Sopenharmony_ci} 6048c2ecf20Sopenharmony_ci 6058c2ecf20Sopenharmony_ci#endif /* DESC_CONSTR_H */ 606