1b9eebfadSRuchika Gupta /*
2b9eebfadSRuchika Gupta * caam descriptor construction helper functions
3b9eebfadSRuchika Gupta *
4b9eebfadSRuchika Gupta * Copyright 2008-2014 Freescale Semiconductor, Inc.
5b9eebfadSRuchika Gupta *
6b9eebfadSRuchika Gupta * SPDX-License-Identifier: GPL-2.0+
7b9eebfadSRuchika Gupta *
8b9eebfadSRuchika Gupta * Based on desc_constr.h file in linux drivers/crypto/caam
9b9eebfadSRuchika Gupta */
10b9eebfadSRuchika Gupta
11b9eebfadSRuchika Gupta #include <linux/compat.h>
12b9eebfadSRuchika Gupta #include "desc.h"
13b9eebfadSRuchika Gupta
14b9eebfadSRuchika Gupta #define IMMEDIATE (1 << 23)
15b9eebfadSRuchika Gupta #define CAAM_CMD_SZ sizeof(u32)
16b9eebfadSRuchika Gupta #define CAAM_PTR_SZ sizeof(dma_addr_t)
17b9eebfadSRuchika Gupta #define CAAM_DESC_BYTES_MAX (CAAM_CMD_SZ * MAX_CAAM_DESCSIZE)
18b9eebfadSRuchika Gupta #define DESC_JOB_IO_LEN (CAAM_CMD_SZ * 5 + CAAM_PTR_SZ * 3)
19b9eebfadSRuchika Gupta
20b9eebfadSRuchika Gupta #ifdef DEBUG
21b9eebfadSRuchika Gupta #define PRINT_POS do { printf("%02d: %s\n", desc_len(desc),\
22b9eebfadSRuchika Gupta &__func__[sizeof("append")]); \
23b9eebfadSRuchika Gupta } while (0)
24b9eebfadSRuchika Gupta #else
25b9eebfadSRuchika Gupta #define PRINT_POS
26b9eebfadSRuchika Gupta #endif
27b9eebfadSRuchika Gupta
28b9eebfadSRuchika Gupta #define SET_OK_NO_PROP_ERRORS (IMMEDIATE | LDST_CLASS_DECO | \
29b9eebfadSRuchika Gupta LDST_SRCDST_WORD_DECOCTRL | \
30b9eebfadSRuchika Gupta (LDOFF_CHG_SHARE_OK_NO_PROP << \
31b9eebfadSRuchika Gupta LDST_OFFSET_SHIFT))
32b9eebfadSRuchika Gupta #define DISABLE_AUTO_INFO_FIFO (IMMEDIATE | LDST_CLASS_DECO | \
33b9eebfadSRuchika Gupta LDST_SRCDST_WORD_DECOCTRL | \
34b9eebfadSRuchika Gupta (LDOFF_DISABLE_AUTO_NFIFO << LDST_OFFSET_SHIFT))
35b9eebfadSRuchika Gupta #define ENABLE_AUTO_INFO_FIFO (IMMEDIATE | LDST_CLASS_DECO | \
36b9eebfadSRuchika Gupta LDST_SRCDST_WORD_DECOCTRL | \
37b9eebfadSRuchika Gupta (LDOFF_ENABLE_AUTO_NFIFO << LDST_OFFSET_SHIFT))
38b9eebfadSRuchika Gupta
39f59e69cbSAneesh Bansal #ifdef CONFIG_PHYS_64BIT
40f59e69cbSAneesh Bansal union ptr_addr_t {
41f59e69cbSAneesh Bansal u64 m_whole;
42f59e69cbSAneesh Bansal struct {
43f59e69cbSAneesh Bansal #ifdef CONFIG_SYS_FSL_SEC_LE
44f59e69cbSAneesh Bansal u32 low;
45f59e69cbSAneesh Bansal u32 high;
46f59e69cbSAneesh Bansal #elif defined(CONFIG_SYS_FSL_SEC_BE)
47f59e69cbSAneesh Bansal u32 high;
48f59e69cbSAneesh Bansal u32 low;
49f59e69cbSAneesh Bansal #else
50f59e69cbSAneesh Bansal #error Neither CONFIG_SYS_FSL_SEC_LE nor CONFIG_SYS_FSL_SEC_BE is defined
51f59e69cbSAneesh Bansal #endif
52f59e69cbSAneesh Bansal } m_halfs;
53f59e69cbSAneesh Bansal };
54f59e69cbSAneesh Bansal #endif
55f59e69cbSAneesh Bansal
pdb_add_ptr(dma_addr_t * offset,dma_addr_t ptr)5629590370SAneesh Bansal static inline void pdb_add_ptr(dma_addr_t *offset, dma_addr_t ptr)
5729590370SAneesh Bansal {
5829590370SAneesh Bansal #ifdef CONFIG_PHYS_64BIT
5929590370SAneesh Bansal /* The Position of low and high part of 64 bit address
6029590370SAneesh Bansal * will depend on the endianness of CAAM Block */
6129590370SAneesh Bansal union ptr_addr_t *ptr_addr = (union ptr_addr_t *)offset;
6229590370SAneesh Bansal ptr_addr->m_halfs.high = (u32)(ptr >> 32);
6329590370SAneesh Bansal ptr_addr->m_halfs.low = (u32)ptr;
6429590370SAneesh Bansal #else
6529590370SAneesh Bansal *offset = ptr;
6629590370SAneesh Bansal #endif
6729590370SAneesh Bansal }
6829590370SAneesh Bansal
desc_len(u32 * desc)69b9eebfadSRuchika Gupta static inline int desc_len(u32 *desc)
70b9eebfadSRuchika Gupta {
71b9eebfadSRuchika Gupta return *desc & HDR_DESCLEN_MASK;
72b9eebfadSRuchika Gupta }
73b9eebfadSRuchika Gupta
desc_bytes(void * desc)74b9eebfadSRuchika Gupta static inline int desc_bytes(void *desc)
75b9eebfadSRuchika Gupta {
76b9eebfadSRuchika Gupta return desc_len(desc) * CAAM_CMD_SZ;
77b9eebfadSRuchika Gupta }
78b9eebfadSRuchika Gupta
desc_end(u32 * desc)79b9eebfadSRuchika Gupta static inline u32 *desc_end(u32 *desc)
80b9eebfadSRuchika Gupta {
81b9eebfadSRuchika Gupta return desc + desc_len(desc);
82b9eebfadSRuchika Gupta }
83b9eebfadSRuchika Gupta
desc_pdb(u32 * desc)8429590370SAneesh Bansal static inline void *desc_pdb(u32 *desc)
8529590370SAneesh Bansal {
8629590370SAneesh Bansal return desc + 1;
8729590370SAneesh Bansal }
8829590370SAneesh Bansal
init_desc(u32 * desc,u32 options)89b9eebfadSRuchika Gupta static inline void init_desc(u32 *desc, u32 options)
90b9eebfadSRuchika Gupta {
91b9eebfadSRuchika Gupta *desc = (options | HDR_ONE) + 1;
92b9eebfadSRuchika Gupta }
93b9eebfadSRuchika Gupta
init_job_desc(u32 * desc,u32 options)94b9eebfadSRuchika Gupta static inline void init_job_desc(u32 *desc, u32 options)
95b9eebfadSRuchika Gupta {
96b9eebfadSRuchika Gupta init_desc(desc, CMD_DESC_HDR | options);
97b9eebfadSRuchika Gupta }
98b9eebfadSRuchika Gupta
init_job_desc_pdb(u32 * desc,u32 options,size_t pdb_bytes)9929590370SAneesh Bansal static inline void init_job_desc_pdb(u32 *desc, u32 options, size_t pdb_bytes)
10029590370SAneesh Bansal {
10129590370SAneesh Bansal u32 pdb_len = (pdb_bytes + CAAM_CMD_SZ - 1) / CAAM_CMD_SZ;
10229590370SAneesh Bansal
10329590370SAneesh Bansal init_job_desc(desc,
10429590370SAneesh Bansal (((pdb_len + 1) << HDR_START_IDX_SHIFT) + pdb_len) |
10529590370SAneesh Bansal options);
10629590370SAneesh Bansal }
10729590370SAneesh Bansal
append_ptr(u32 * desc,dma_addr_t ptr)108b9eebfadSRuchika Gupta static inline void append_ptr(u32 *desc, dma_addr_t ptr)
109b9eebfadSRuchika Gupta {
110b9eebfadSRuchika Gupta dma_addr_t *offset = (dma_addr_t *)desc_end(desc);
111b9eebfadSRuchika Gupta
112f59e69cbSAneesh Bansal #ifdef CONFIG_PHYS_64BIT
113f59e69cbSAneesh Bansal /* The Position of low and high part of 64 bit address
114f59e69cbSAneesh Bansal * will depend on the endianness of CAAM Block */
115*69b6a796SSaksham Jain union ptr_addr_t *ptr_addr = (union ptr_addr_t *)offset;
116*69b6a796SSaksham Jain ptr_addr->m_halfs.high = (u32)(ptr >> 32);
117*69b6a796SSaksham Jain ptr_addr->m_halfs.low = (u32)ptr;
118f59e69cbSAneesh Bansal #else
119b9eebfadSRuchika Gupta *offset = ptr;
120f59e69cbSAneesh Bansal #endif
121b9eebfadSRuchika Gupta
122b9eebfadSRuchika Gupta (*desc) += CAAM_PTR_SZ / CAAM_CMD_SZ;
123b9eebfadSRuchika Gupta }
124b9eebfadSRuchika Gupta
append_data(u32 * desc,void * data,int len)125b9eebfadSRuchika Gupta static inline void append_data(u32 *desc, void *data, int len)
126b9eebfadSRuchika Gupta {
127b9eebfadSRuchika Gupta u32 *offset = desc_end(desc);
128b9eebfadSRuchika Gupta
129b9eebfadSRuchika Gupta if (len) /* avoid sparse warning: memcpy with byte count of 0 */
130b9eebfadSRuchika Gupta memcpy(offset, data, len);
131b9eebfadSRuchika Gupta
132b9eebfadSRuchika Gupta (*desc) += (len + CAAM_CMD_SZ - 1) / CAAM_CMD_SZ;
133b9eebfadSRuchika Gupta }
134b9eebfadSRuchika Gupta
append_cmd(u32 * desc,u32 command)135b9eebfadSRuchika Gupta static inline void append_cmd(u32 *desc, u32 command)
136b9eebfadSRuchika Gupta {
137b9eebfadSRuchika Gupta u32 *cmd = desc_end(desc);
138b9eebfadSRuchika Gupta
139b9eebfadSRuchika Gupta *cmd = command;
140b9eebfadSRuchika Gupta
141b9eebfadSRuchika Gupta (*desc)++;
142b9eebfadSRuchika Gupta }
143b9eebfadSRuchika Gupta
144b9eebfadSRuchika Gupta #define append_u32 append_cmd
145b9eebfadSRuchika Gupta
append_u64(u32 * desc,u64 data)146b9eebfadSRuchika Gupta static inline void append_u64(u32 *desc, u64 data)
147b9eebfadSRuchika Gupta {
148b9eebfadSRuchika Gupta u32 *offset = desc_end(desc);
149b9eebfadSRuchika Gupta
150b9eebfadSRuchika Gupta *offset = upper_32_bits(data);
151b9eebfadSRuchika Gupta *(++offset) = lower_32_bits(data);
152b9eebfadSRuchika Gupta
153b9eebfadSRuchika Gupta (*desc) += 2;
154b9eebfadSRuchika Gupta }
155b9eebfadSRuchika Gupta
156b9eebfadSRuchika Gupta /* Write command without affecting header, and return pointer to next word */
write_cmd(u32 * desc,u32 command)157b9eebfadSRuchika Gupta static inline u32 *write_cmd(u32 *desc, u32 command)
158b9eebfadSRuchika Gupta {
159b9eebfadSRuchika Gupta *desc = command;
160b9eebfadSRuchika Gupta
161b9eebfadSRuchika Gupta return desc + 1;
162b9eebfadSRuchika Gupta }
163b9eebfadSRuchika Gupta
append_cmd_ptr(u32 * desc,dma_addr_t ptr,int len,u32 command)164b9eebfadSRuchika Gupta static inline void append_cmd_ptr(u32 *desc, dma_addr_t ptr, int len,
165b9eebfadSRuchika Gupta u32 command)
166b9eebfadSRuchika Gupta {
167b9eebfadSRuchika Gupta append_cmd(desc, command | len);
168b9eebfadSRuchika Gupta append_ptr(desc, ptr);
169b9eebfadSRuchika Gupta }
170b9eebfadSRuchika Gupta
171b9eebfadSRuchika Gupta /* Write length after pointer, rather than inside command */
append_cmd_ptr_extlen(u32 * desc,dma_addr_t ptr,unsigned int len,u32 command)172b9eebfadSRuchika Gupta static inline void append_cmd_ptr_extlen(u32 *desc, dma_addr_t ptr,
173b9eebfadSRuchika Gupta unsigned int len, u32 command)
174b9eebfadSRuchika Gupta {
175b9eebfadSRuchika Gupta append_cmd(desc, command);
176b9eebfadSRuchika Gupta if (!(command & (SQIN_RTO | SQIN_PRE)))
177b9eebfadSRuchika Gupta append_ptr(desc, ptr);
178b9eebfadSRuchika Gupta append_cmd(desc, len);
179b9eebfadSRuchika Gupta }
180b9eebfadSRuchika Gupta
append_cmd_data(u32 * desc,void * data,int len,u32 command)181b9eebfadSRuchika Gupta static inline void append_cmd_data(u32 *desc, void *data, int len,
182b9eebfadSRuchika Gupta u32 command)
183b9eebfadSRuchika Gupta {
184b9eebfadSRuchika Gupta append_cmd(desc, command | IMMEDIATE | len);
185b9eebfadSRuchika Gupta append_data(desc, data, len);
186b9eebfadSRuchika Gupta }
187b9eebfadSRuchika Gupta
188b9eebfadSRuchika Gupta #define APPEND_CMD_RET(cmd, op) \
189b9eebfadSRuchika Gupta static inline u32 *append_##cmd(u32 *desc, u32 options) \
190b9eebfadSRuchika Gupta { \
191b9eebfadSRuchika Gupta u32 *cmd = desc_end(desc); \
192b9eebfadSRuchika Gupta PRINT_POS; \
193b9eebfadSRuchika Gupta append_cmd(desc, CMD_##op | options); \
194b9eebfadSRuchika Gupta return cmd; \
195b9eebfadSRuchika Gupta }
APPEND_CMD_RET(jump,JUMP)196b9eebfadSRuchika Gupta APPEND_CMD_RET(jump, JUMP)
197b9eebfadSRuchika Gupta APPEND_CMD_RET(move, MOVE)
198b9eebfadSRuchika Gupta
199b9eebfadSRuchika Gupta static inline void set_jump_tgt_here(u32 *desc, u32 *jump_cmd)
200b9eebfadSRuchika Gupta {
201b9eebfadSRuchika Gupta *jump_cmd = *jump_cmd | (desc_len(desc) - (jump_cmd - desc));
202b9eebfadSRuchika Gupta }
203b9eebfadSRuchika Gupta
set_move_tgt_here(u32 * desc,u32 * move_cmd)204b9eebfadSRuchika Gupta static inline void set_move_tgt_here(u32 *desc, u32 *move_cmd)
205b9eebfadSRuchika Gupta {
206b9eebfadSRuchika Gupta *move_cmd &= ~MOVE_OFFSET_MASK;
207b9eebfadSRuchika Gupta *move_cmd = *move_cmd | ((desc_len(desc) << (MOVE_OFFSET_SHIFT + 2)) &
208b9eebfadSRuchika Gupta MOVE_OFFSET_MASK);
209b9eebfadSRuchika Gupta }
210b9eebfadSRuchika Gupta
211b9eebfadSRuchika Gupta #define APPEND_CMD(cmd, op) \
212b9eebfadSRuchika Gupta static inline void append_##cmd(u32 *desc, u32 options) \
213b9eebfadSRuchika Gupta { \
214b9eebfadSRuchika Gupta PRINT_POS; \
215b9eebfadSRuchika Gupta append_cmd(desc, CMD_##op | options); \
216b9eebfadSRuchika Gupta }
APPEND_CMD(operation,OPERATION)217b9eebfadSRuchika Gupta APPEND_CMD(operation, OPERATION)
218b9eebfadSRuchika Gupta
219b9eebfadSRuchika Gupta #define APPEND_CMD_LEN(cmd, op) \
220b9eebfadSRuchika Gupta static inline void append_##cmd(u32 *desc, unsigned int len, u32 options) \
221b9eebfadSRuchika Gupta { \
222b9eebfadSRuchika Gupta PRINT_POS; \
223b9eebfadSRuchika Gupta append_cmd(desc, CMD_##op | len | options); \
224b9eebfadSRuchika Gupta }
225b9eebfadSRuchika Gupta APPEND_CMD_LEN(seq_store, SEQ_STORE)
226b9eebfadSRuchika Gupta APPEND_CMD_LEN(seq_fifo_load, SEQ_FIFO_LOAD)
227b9eebfadSRuchika Gupta APPEND_CMD_LEN(seq_fifo_store, SEQ_FIFO_STORE)
228b9eebfadSRuchika Gupta
229b9eebfadSRuchika Gupta #define APPEND_CMD_PTR(cmd, op) \
230b9eebfadSRuchika Gupta static inline void append_##cmd(u32 *desc, dma_addr_t ptr, unsigned int len, \
231b9eebfadSRuchika Gupta u32 options) \
232b9eebfadSRuchika Gupta { \
233b9eebfadSRuchika Gupta PRINT_POS; \
234b9eebfadSRuchika Gupta append_cmd_ptr(desc, ptr, len, CMD_##op | options); \
235b9eebfadSRuchika Gupta }
236b9eebfadSRuchika Gupta APPEND_CMD_PTR(key, KEY)
237b9eebfadSRuchika Gupta APPEND_CMD_PTR(load, LOAD)
238b9eebfadSRuchika Gupta APPEND_CMD_PTR(fifo_load, FIFO_LOAD)
239b9eebfadSRuchika Gupta APPEND_CMD_PTR(fifo_store, FIFO_STORE)
240b9eebfadSRuchika Gupta
241b9eebfadSRuchika Gupta static inline void append_store(u32 *desc, dma_addr_t ptr, unsigned int len,
242b9eebfadSRuchika Gupta u32 options)
243b9eebfadSRuchika Gupta {
244b9eebfadSRuchika Gupta u32 cmd_src;
245b9eebfadSRuchika Gupta
246b9eebfadSRuchika Gupta cmd_src = options & LDST_SRCDST_MASK;
247b9eebfadSRuchika Gupta
248b9eebfadSRuchika Gupta append_cmd(desc, CMD_STORE | options | len);
249b9eebfadSRuchika Gupta
250b9eebfadSRuchika Gupta /* The following options do not require pointer */
251b9eebfadSRuchika Gupta if (!(cmd_src == LDST_SRCDST_WORD_DESCBUF_SHARED ||
252b9eebfadSRuchika Gupta cmd_src == LDST_SRCDST_WORD_DESCBUF_JOB ||
253b9eebfadSRuchika Gupta cmd_src == LDST_SRCDST_WORD_DESCBUF_JOB_WE ||
254b9eebfadSRuchika Gupta cmd_src == LDST_SRCDST_WORD_DESCBUF_SHARED_WE))
255b9eebfadSRuchika Gupta append_ptr(desc, ptr);
256b9eebfadSRuchika Gupta }
257b9eebfadSRuchika Gupta
258b9eebfadSRuchika Gupta #define APPEND_SEQ_PTR_INTLEN(cmd, op) \
259b9eebfadSRuchika Gupta static inline void append_seq_##cmd##_ptr_intlen(u32 *desc, dma_addr_t ptr, \
260b9eebfadSRuchika Gupta unsigned int len, \
261b9eebfadSRuchika Gupta u32 options) \
262b9eebfadSRuchika Gupta { \
263b9eebfadSRuchika Gupta PRINT_POS; \
264b9eebfadSRuchika Gupta if (options & (SQIN_RTO | SQIN_PRE)) \
265b9eebfadSRuchika Gupta append_cmd(desc, CMD_SEQ_##op##_PTR | len | options); \
266b9eebfadSRuchika Gupta else \
267b9eebfadSRuchika Gupta append_cmd_ptr(desc, ptr, len, CMD_SEQ_##op##_PTR | options); \
268b9eebfadSRuchika Gupta }
269b9eebfadSRuchika Gupta APPEND_SEQ_PTR_INTLEN(in, IN)
270b9eebfadSRuchika Gupta APPEND_SEQ_PTR_INTLEN(out, OUT)
271b9eebfadSRuchika Gupta
272b9eebfadSRuchika Gupta #define APPEND_CMD_PTR_TO_IMM(cmd, op) \
273b9eebfadSRuchika Gupta static inline void append_##cmd##_as_imm(u32 *desc, void *data, \
274b9eebfadSRuchika Gupta unsigned int len, u32 options) \
275b9eebfadSRuchika Gupta { \
276b9eebfadSRuchika Gupta PRINT_POS; \
277b9eebfadSRuchika Gupta append_cmd_data(desc, data, len, CMD_##op | options); \
278b9eebfadSRuchika Gupta }
279b9eebfadSRuchika Gupta APPEND_CMD_PTR_TO_IMM(load, LOAD);
280b9eebfadSRuchika Gupta APPEND_CMD_PTR_TO_IMM(fifo_load, FIFO_LOAD);
281b9eebfadSRuchika Gupta
282b9eebfadSRuchika Gupta #define APPEND_CMD_PTR_EXTLEN(cmd, op) \
283b9eebfadSRuchika Gupta static inline void append_##cmd##_extlen(u32 *desc, dma_addr_t ptr, \
284b9eebfadSRuchika Gupta unsigned int len, u32 options) \
285b9eebfadSRuchika Gupta { \
286b9eebfadSRuchika Gupta PRINT_POS; \
287b9eebfadSRuchika Gupta append_cmd_ptr_extlen(desc, ptr, len, CMD_##op | SQIN_EXT | options); \
288b9eebfadSRuchika Gupta }
289b9eebfadSRuchika Gupta APPEND_CMD_PTR_EXTLEN(seq_in_ptr, SEQ_IN_PTR)
290b9eebfadSRuchika Gupta APPEND_CMD_PTR_EXTLEN(seq_out_ptr, SEQ_OUT_PTR)
291b9eebfadSRuchika Gupta
292b9eebfadSRuchika Gupta /*
293b9eebfadSRuchika Gupta * Determine whether to store length internally or externally depending on
294b9eebfadSRuchika Gupta * the size of its type
295b9eebfadSRuchika Gupta */
296b9eebfadSRuchika Gupta #define APPEND_CMD_PTR_LEN(cmd, op, type) \
297b9eebfadSRuchika Gupta static inline void append_##cmd(u32 *desc, dma_addr_t ptr, \
298b9eebfadSRuchika Gupta type len, u32 options) \
299b9eebfadSRuchika Gupta { \
300b9eebfadSRuchika Gupta PRINT_POS; \
301b9eebfadSRuchika Gupta if (sizeof(type) > sizeof(u16)) \
302b9eebfadSRuchika Gupta append_##cmd##_extlen(desc, ptr, len, options); \
303b9eebfadSRuchika Gupta else \
304b9eebfadSRuchika Gupta append_##cmd##_intlen(desc, ptr, len, options); \
305b9eebfadSRuchika Gupta }
306b9eebfadSRuchika Gupta APPEND_CMD_PTR_LEN(seq_in_ptr, SEQ_IN_PTR, u32)
307b9eebfadSRuchika Gupta APPEND_CMD_PTR_LEN(seq_out_ptr, SEQ_OUT_PTR, u32)
308b9eebfadSRuchika Gupta
309b9eebfadSRuchika Gupta /*
310b9eebfadSRuchika Gupta * 2nd variant for commands whose specified immediate length differs
311b9eebfadSRuchika Gupta * from length of immediate data provided, e.g., split keys
312b9eebfadSRuchika Gupta */
313b9eebfadSRuchika Gupta #define APPEND_CMD_PTR_TO_IMM2(cmd, op) \
314b9eebfadSRuchika Gupta static inline void append_##cmd##_as_imm(u32 *desc, void *data, \
315b9eebfadSRuchika Gupta unsigned int data_len, \
316b9eebfadSRuchika Gupta unsigned int len, u32 options) \
317b9eebfadSRuchika Gupta { \
318b9eebfadSRuchika Gupta PRINT_POS; \
319b9eebfadSRuchika Gupta append_cmd(desc, CMD_##op | IMMEDIATE | len | options); \
320b9eebfadSRuchika Gupta append_data(desc, data, data_len); \
321b9eebfadSRuchika Gupta }
322b9eebfadSRuchika Gupta APPEND_CMD_PTR_TO_IMM2(key, KEY);
323b9eebfadSRuchika Gupta
324b9eebfadSRuchika Gupta #define APPEND_CMD_RAW_IMM(cmd, op, type) \
325b9eebfadSRuchika Gupta static inline void append_##cmd##_imm_##type(u32 *desc, type immediate, \
326b9eebfadSRuchika Gupta u32 options) \
327b9eebfadSRuchika Gupta { \
328b9eebfadSRuchika Gupta PRINT_POS; \
329b9eebfadSRuchika Gupta append_cmd(desc, CMD_##op | IMMEDIATE | options | sizeof(type)); \
330b9eebfadSRuchika Gupta append_cmd(desc, immediate); \
331b9eebfadSRuchika Gupta }
332b9eebfadSRuchika Gupta APPEND_CMD_RAW_IMM(load, LOAD, u32);
333