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