xref: /dpdk/drivers/crypto/caam_jr/caam_jr_desc.h (revision 68a03efeed657e6e05f281479b33b51102797e15)
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright 2017-2018 NXP
3  */
4 
5 #ifndef CAAM_JR_DESC_H
6 #define CAAM_JR_DESC_H
7 
8 #define CMD_HDR_CTYPE_SD		0x16
9 #define CMD_HDR_CTYPE_JD		0x17
10 
11 /* The maximum size of a SEC descriptor, in WORDs (32 bits). */
12 #define MAX_DESC_SIZE_WORDS                     64
13 
14 /*
15  * Macros manipulating descriptors
16  */
17 /* Macro for setting the SD pointer in a JD. Common for all protocols
18  * supported by the SEC driver.
19  */
20 #define SEC_JD_SET_SD(descriptor, ptr, len)	   {	  \
21 	(descriptor)->sd_ptr = (ptr);			       \
22 	(descriptor)->deschdr.command.jd.shr_desc_len = (len);      \
23 }
24 
25 /* Macro for setting a pointer to the job which this descriptor processes.
26  * It eases the lookup procedure for identifying the descriptor that has
27  * completed.
28  */
29 #define SEC_JD_SET_JOB_PTR(descriptor, ptr) \
30 	((descriptor)->job_ptr = (ptr))
31 
32 /* Macro for setting up a JD. The structure of the JD is common across all
33  * supported protocols, thus its structure is identical.
34  */
35 #define SEC_JD_INIT(descriptor)	      ({ \
36 	/* CTYPE = job descriptor			       \
37 	 * RSMS, DNR = 0
38 	 * ONE = 1
39 	 * Start Index = 0
40 	 * ZRO,TD, MTD = 0
41 	 * SHR = 1 (there's a shared descriptor referenced
42 	 *	  by this job descriptor,pointer in next word)
43 	 * REO = 1 (execute job descr. first, shared descriptor
44 	 *	  after)
45 	 * SHARE = DEFER
46 	 * Descriptor Length = 0 ( to be completed @ runtime ) */ \
47 	(descriptor)->deschdr.command.word = 0xB0801C0D;	\
48 	/*
49 	 * CTYPE = SEQ OUT command * Scater Gather Flag = 0
50 	 * (can be updated @ runtime) PRE = 0 * EXT = 1
51 	 * (data length is in next word, following the * command)
52 	 * RTO = 0 */						\
53 	(descriptor)->seq_out.command.word = 0xF8400000; /**/	\
54 	/*
55 	 * CTYPE = SEQ IN command
56 	 * Scater Gather Flag = 0 (can be updated @ runtime)
57 	 * PRE = 0
58 	 * EXT = 1 ( data length is in next word, following the
59 	 *	   command)
60 	 * RTO = 0 */						\
61 	(descriptor)->seq_in.command.word  = 0xF0400000; /**/	\
62 	/*
63 	 * In order to be compatible with QI scenarios, the DPOVRD value
64 	 * loaded must be formated like this:
65 	 * DPOVRD_EN (1b) | Res| DPOVRD Value (right aligned). */ \
66 	(descriptor)->load_dpovrd.command.word = 0x16870004;	\
67 	/* By default, DPOVRD mechanism is disabled, thus the value to be
68 	 * LOAD-ed through the above descriptor command will be
69 	 * 0x0000_0000. */					\
70 	(descriptor)->dpovrd = 0x00000000;			\
71 })
72 
73 /* Macro for setting the pointer to the input buffer in the JD, according to
74  * the parameters set by the user in the ::sec_packet_t structure.
75  */
76 #define SEC_JD_SET_IN_PTR(descriptor, phys_addr, offset, length) {     \
77 	(descriptor)->seq_in_ptr = (phys_addr) + (offset);	      \
78 	(descriptor)->in_ext_length = (length);			 \
79 }
80 
81 /* Macro for setting the pointer to the output buffer in the JD, according to
82  * the parameters set by the user in the ::sec_packet_t structure.
83  */
84 #define SEC_JD_SET_OUT_PTR(descriptor, phys_addr, offset, length) {    \
85 	(descriptor)->seq_out_ptr = (phys_addr) + (offset);	     \
86 	(descriptor)->out_ext_length = (length);			\
87 }
88 
89 /* Macro for setting the Scatter-Gather flag in the SEQ IN command. Used in
90  * case the input buffer is split in multiple buffers, according to the user
91  * specification.
92  */
93 #define SEC_JD_SET_SG_IN(descriptor) \
94 	((descriptor)->seq_in.command.field.sgf =  1)
95 
96 /* Macro for setting the Scatter-Gather flag in the SEQ OUT command. Used in
97  * case the output buffer is split in multiple buffers, according to the user
98  * specification.
99  */
100 #define SEC_JD_SET_SG_OUT(descriptor) \
101 	((descriptor)->seq_out.command.field.sgf = 1)
102 
103 #define SEC_JD_SET_DPOVRD(descriptor) \
104 
105 /* Macro for retrieving a descriptor's length. Works for both SD and JD. */
106 #define SEC_GET_DESC_LEN(descriptor)					\
107 	(((struct descriptor_header_s *)(descriptor))->command.sd.ctype == \
108 	CMD_HDR_CTYPE_SD ? ((struct descriptor_header_s *) \
109 	(descriptor))->command.sd.desclen :	\
110 	((struct descriptor_header_s *)(descriptor))->command.jd.desclen)
111 
112 /* Helper macro for dumping the hex representation of a descriptor */
113 #define SEC_DUMP_DESC(descriptor) {					\
114 	int __i;							\
115 	CAAM_JR_INFO("Des@ 0x%08x\n", (uint32_t)((uint32_t *)(descriptor)));\
116 	for (__i = 0;						\
117 		__i < SEC_GET_DESC_LEN(descriptor);			\
118 		__i++) {						\
119 		printf("0x%08x: 0x%08x\n",			\
120 			(uint32_t)(((uint32_t *)(descriptor)) + __i),	\
121 			*(((uint32_t *)(descriptor)) + __i));		\
122 	}								\
123 }
124 /* Union describing a descriptor header.
125  */
126 struct descriptor_header_s {
127 	union {
128 		uint32_t word;
129 		struct {
130 			/* 4  */ unsigned int ctype:5;
131 			/* 5  */ unsigned int res1:2;
132 			/* 7  */ unsigned int dnr:1;
133 			/* 8  */ unsigned int one:1;
134 			/* 9  */ unsigned int res2:1;
135 			/* 10 */ unsigned int start_idx:6;
136 			/* 16 */ unsigned int res3:2;
137 			/* 18 */ unsigned int cif:1;
138 			/* 19 */ unsigned int sc:1;
139 			/* 20 */ unsigned int pd:1;
140 			/* 21 */ unsigned int res4:1;
141 			/* 22 */ unsigned int share:2;
142 			/* 24 */ unsigned int res5:2;
143 			/* 26 */ unsigned int desclen:6;
144 		} sd;
145 		struct {
146 			/* TODO only below struct members are corrected,
147 			 * all others also need to be reversed please verify it
148 			 */
149 			/* 0 */ unsigned int desclen:7;
150 			/* 7 */ unsigned int res4:1;
151 			/* 8 */ unsigned int share:3;
152 			/* 11 */ unsigned int reo:1;
153 			/* 12 */ unsigned int shr:1;
154 			/* 13 */ unsigned int mtd:1;
155 			/* 14 */ unsigned int td:1;
156 			/* 15 */ unsigned int zero:1;
157 			/* 16 */ unsigned int shr_desc_len:6;
158 			/* 22  */ unsigned int res2:1;
159 			/* 23  */ unsigned int one:1;
160 			/* 24  */ unsigned int dnr:1;
161 			/* 25  */ unsigned int rsms:1;
162 			/* 26  */ unsigned int res1:1;
163 			/* 27  */ unsigned int ctype:5;
164 		} jd;
165 	} __rte_packed command;
166 } __rte_packed;
167 
168 /* Union describing a KEY command in a descriptor.
169  */
170 struct key_command_s {
171 	union {
172 		uint32_t word;
173 		struct {
174 			unsigned int ctype:5;
175 			unsigned int cls:2;
176 			unsigned int sgf:1;
177 			unsigned int imm:1;
178 			unsigned int enc:1;
179 			unsigned int nwb:1;
180 			unsigned int ekt:1;
181 			unsigned int kdest:4;
182 			unsigned int tk:1;
183 			unsigned int rsvd1:5;
184 			unsigned int length:10;
185 		} __rte_packed field;
186 	} __rte_packed command;
187 } __rte_packed;
188 
189 /* Union describing a PROTOCOL command
190  * in a descriptor.
191  */
192 struct protocol_operation_command_s {
193 	union {
194 		uint32_t word;
195 		struct {
196 			unsigned int ctype:5;
197 			unsigned int optype:3;
198 			unsigned char protid;
199 			unsigned short protinfo;
200 		} __rte_packed field;
201 	} __rte_packed command;
202 } __rte_packed;
203 
204 /* Union describing a SEQIN command in a
205  * descriptor.
206  */
207 struct seq_in_command_s {
208 	union {
209 		uint32_t word;
210 		struct {
211 			unsigned int ctype:5;
212 			unsigned int res1:1;
213 			unsigned int inl:1;
214 			unsigned int sgf:1;
215 			unsigned int pre:1;
216 			unsigned int ext:1;
217 			unsigned int rto:1;
218 			unsigned int rjd:1;
219 			unsigned int res2:4;
220 			unsigned int length:16;
221 		} field;
222 	} __rte_packed command;
223 } __rte_packed;
224 
225 /* Union describing a SEQOUT command in a
226  * descriptor.
227  */
228 struct seq_out_command_s {
229 	union {
230 		uint32_t word;
231 		struct {
232 			unsigned int ctype:5;
233 			unsigned int res1:2;
234 			unsigned int sgf:1;
235 			unsigned int pre:1;
236 			unsigned int ext:1;
237 			unsigned int rto:1;
238 			unsigned int res2:5;
239 			unsigned int length:16;
240 		} field;
241 	} __rte_packed command;
242 } __rte_packed;
243 
244 struct load_command_s {
245 	union {
246 		uint32_t word;
247 		struct {
248 			unsigned int ctype:5;
249 			unsigned int class:2;
250 			unsigned int sgf:1;
251 			unsigned int imm:1;
252 			unsigned int dst:7;
253 			unsigned char offset;
254 			unsigned char length;
255 		} fields;
256 	} __rte_packed command;
257 } __rte_packed;
258 
259 /* Structure encompassing a general shared descriptor of maximum
260  * size (64 WORDs). Usually, other specific shared descriptor structures
261  * will be type-casted to this one
262  * this one.
263  */
264 struct sec_sd_t {
265 	uint32_t rsvd[MAX_DESC_SIZE_WORDS];
266 } __rte_packed __rte_aligned(64);
267 
268 /* Structure encompassing a job descriptor which processes
269  * a single packet from a context. The job descriptor references
270  * a shared descriptor from a SEC context.
271  */
272 struct sec_job_descriptor_t {
273 	struct descriptor_header_s deschdr;
274 	dma_addr_t sd_ptr;
275 	struct seq_out_command_s seq_out;
276 	dma_addr_t seq_out_ptr;
277 	uint32_t out_ext_length;
278 	struct seq_in_command_s seq_in;
279 	dma_addr_t seq_in_ptr;
280 	uint32_t in_ext_length;
281 	struct load_command_s load_dpovrd;
282 	uint32_t dpovrd;
283 } __rte_packed __rte_aligned(64);
284 
285 #endif
286