xref: /dpdk/drivers/crypto/caam_jr/caam_jr_desc.h (revision e77506397fc8005c5129e22e9e2d15d5876790fd)
16ef6becaSGagandeep Singh /* SPDX-License-Identifier: BSD-3-Clause
26ef6becaSGagandeep Singh  * Copyright 2017-2018 NXP
36ef6becaSGagandeep Singh  */
46ef6becaSGagandeep Singh 
56ef6becaSGagandeep Singh #ifndef CAAM_JR_DESC_H
66ef6becaSGagandeep Singh #define CAAM_JR_DESC_H
76ef6becaSGagandeep Singh 
86ef6becaSGagandeep Singh #define CMD_HDR_CTYPE_SD		0x16
96ef6becaSGagandeep Singh #define CMD_HDR_CTYPE_JD		0x17
106ef6becaSGagandeep Singh 
116ef6becaSGagandeep Singh /* The maximum size of a SEC descriptor, in WORDs (32 bits). */
126ef6becaSGagandeep Singh #define MAX_DESC_SIZE_WORDS                     64
136ef6becaSGagandeep Singh 
146ef6becaSGagandeep Singh /*
156ef6becaSGagandeep Singh  * Macros manipulating descriptors
166ef6becaSGagandeep Singh  */
176ef6becaSGagandeep Singh /* Macro for setting the SD pointer in a JD. Common for all protocols
186ef6becaSGagandeep Singh  * supported by the SEC driver.
196ef6becaSGagandeep Singh  */
206ef6becaSGagandeep Singh #define SEC_JD_SET_SD(descriptor, ptr, len)	   {	  \
216ef6becaSGagandeep Singh 	(descriptor)->sd_ptr = (ptr);			       \
226ef6becaSGagandeep Singh 	(descriptor)->deschdr.command.jd.shr_desc_len = (len);      \
236ef6becaSGagandeep Singh }
246ef6becaSGagandeep Singh 
256ef6becaSGagandeep Singh /* Macro for setting a pointer to the job which this descriptor processes.
266ef6becaSGagandeep Singh  * It eases the lookup procedure for identifying the descriptor that has
276ef6becaSGagandeep Singh  * completed.
286ef6becaSGagandeep Singh  */
296ef6becaSGagandeep Singh #define SEC_JD_SET_JOB_PTR(descriptor, ptr) \
306ef6becaSGagandeep Singh 	((descriptor)->job_ptr = (ptr))
316ef6becaSGagandeep Singh 
326ef6becaSGagandeep Singh /* Macro for setting up a JD. The structure of the JD is common across all
336ef6becaSGagandeep Singh  * supported protocols, thus its structure is identical.
346ef6becaSGagandeep Singh  */
3593998f3cSTyler Retzlaff #define SEC_JD_INIT(descriptor)	      __extension__ ({ \
366ef6becaSGagandeep Singh 	/* CTYPE = job descriptor			       \
376ef6becaSGagandeep Singh 	 * RSMS, DNR = 0
386ef6becaSGagandeep Singh 	 * ONE = 1
396ef6becaSGagandeep Singh 	 * Start Index = 0
406ef6becaSGagandeep Singh 	 * ZRO,TD, MTD = 0
416ef6becaSGagandeep Singh 	 * SHR = 1 (there's a shared descriptor referenced
426ef6becaSGagandeep Singh 	 *	  by this job descriptor,pointer in next word)
436ef6becaSGagandeep Singh 	 * REO = 1 (execute job descr. first, shared descriptor
446ef6becaSGagandeep Singh 	 *	  after)
456ef6becaSGagandeep Singh 	 * SHARE = DEFER
466ef6becaSGagandeep Singh 	 * Descriptor Length = 0 ( to be completed @ runtime ) */ \
476ef6becaSGagandeep Singh 	(descriptor)->deschdr.command.word = 0xB0801C0D;	\
486ef6becaSGagandeep Singh 	/*
496ef6becaSGagandeep Singh 	 * CTYPE = SEQ OUT command * Scater Gather Flag = 0
506ef6becaSGagandeep Singh 	 * (can be updated @ runtime) PRE = 0 * EXT = 1
516ef6becaSGagandeep Singh 	 * (data length is in next word, following the * command)
526ef6becaSGagandeep Singh 	 * RTO = 0 */						\
536ef6becaSGagandeep Singh 	(descriptor)->seq_out.command.word = 0xF8400000; /**/	\
546ef6becaSGagandeep Singh 	/*
556ef6becaSGagandeep Singh 	 * CTYPE = SEQ IN command
566ef6becaSGagandeep Singh 	 * Scater Gather Flag = 0 (can be updated @ runtime)
576ef6becaSGagandeep Singh 	 * PRE = 0
586ef6becaSGagandeep Singh 	 * EXT = 1 ( data length is in next word, following the
596ef6becaSGagandeep Singh 	 *	   command)
606ef6becaSGagandeep Singh 	 * RTO = 0 */						\
616ef6becaSGagandeep Singh 	(descriptor)->seq_in.command.word  = 0xF0400000; /**/	\
626ef6becaSGagandeep Singh 	/*
636ef6becaSGagandeep Singh 	 * In order to be compatible with QI scenarios, the DPOVRD value
646ef6becaSGagandeep Singh 	 * loaded must be formated like this:
656ef6becaSGagandeep Singh 	 * DPOVRD_EN (1b) | Res| DPOVRD Value (right aligned). */ \
666ef6becaSGagandeep Singh 	(descriptor)->load_dpovrd.command.word = 0x16870004;	\
676ef6becaSGagandeep Singh 	/* By default, DPOVRD mechanism is disabled, thus the value to be
686ef6becaSGagandeep Singh 	 * LOAD-ed through the above descriptor command will be
696ef6becaSGagandeep Singh 	 * 0x0000_0000. */					\
706ef6becaSGagandeep Singh 	(descriptor)->dpovrd = 0x00000000;			\
716ef6becaSGagandeep Singh })
726ef6becaSGagandeep Singh 
736ef6becaSGagandeep Singh /* Macro for setting the pointer to the input buffer in the JD, according to
746ef6becaSGagandeep Singh  * the parameters set by the user in the ::sec_packet_t structure.
756ef6becaSGagandeep Singh  */
766ef6becaSGagandeep Singh #define SEC_JD_SET_IN_PTR(descriptor, phys_addr, offset, length) {     \
776ef6becaSGagandeep Singh 	(descriptor)->seq_in_ptr = (phys_addr) + (offset);	      \
786ef6becaSGagandeep Singh 	(descriptor)->in_ext_length = (length);			 \
796ef6becaSGagandeep Singh }
806ef6becaSGagandeep Singh 
816ef6becaSGagandeep Singh /* Macro for setting the pointer to the output buffer in the JD, according to
826ef6becaSGagandeep Singh  * the parameters set by the user in the ::sec_packet_t structure.
836ef6becaSGagandeep Singh  */
846ef6becaSGagandeep Singh #define SEC_JD_SET_OUT_PTR(descriptor, phys_addr, offset, length) {    \
856ef6becaSGagandeep Singh 	(descriptor)->seq_out_ptr = (phys_addr) + (offset);	     \
866ef6becaSGagandeep Singh 	(descriptor)->out_ext_length = (length);			\
876ef6becaSGagandeep Singh }
886ef6becaSGagandeep Singh 
896ef6becaSGagandeep Singh /* Macro for setting the Scatter-Gather flag in the SEQ IN command. Used in
906ef6becaSGagandeep Singh  * case the input buffer is split in multiple buffers, according to the user
916ef6becaSGagandeep Singh  * specification.
926ef6becaSGagandeep Singh  */
936ef6becaSGagandeep Singh #define SEC_JD_SET_SG_IN(descriptor) \
946ef6becaSGagandeep Singh 	((descriptor)->seq_in.command.field.sgf =  1)
956ef6becaSGagandeep Singh 
966ef6becaSGagandeep Singh /* Macro for setting the Scatter-Gather flag in the SEQ OUT command. Used in
976ef6becaSGagandeep Singh  * case the output buffer is split in multiple buffers, according to the user
986ef6becaSGagandeep Singh  * specification.
996ef6becaSGagandeep Singh  */
1006ef6becaSGagandeep Singh #define SEC_JD_SET_SG_OUT(descriptor) \
1016ef6becaSGagandeep Singh 	((descriptor)->seq_out.command.field.sgf = 1)
1026ef6becaSGagandeep Singh 
1036ef6becaSGagandeep Singh #define SEC_JD_SET_DPOVRD(descriptor) \
1046ef6becaSGagandeep Singh 
1056ef6becaSGagandeep Singh /* Macro for retrieving a descriptor's length. Works for both SD and JD. */
1066ef6becaSGagandeep Singh #define SEC_GET_DESC_LEN(descriptor)					\
1076ef6becaSGagandeep Singh 	(((struct descriptor_header_s *)(descriptor))->command.sd.ctype == \
1086ef6becaSGagandeep Singh 	CMD_HDR_CTYPE_SD ? ((struct descriptor_header_s *) \
1096ef6becaSGagandeep Singh 	(descriptor))->command.sd.desclen :	\
1106ef6becaSGagandeep Singh 	((struct descriptor_header_s *)(descriptor))->command.jd.desclen)
1116ef6becaSGagandeep Singh 
1126ef6becaSGagandeep Singh /* Helper macro for dumping the hex representation of a descriptor */
113a8794e39SHemant Agrawal #define SEC_DUMP_DESC(descriptor, f) {					\
1146ef6becaSGagandeep Singh 	int __i;							\
1156ef6becaSGagandeep Singh 	CAAM_JR_INFO("Des@ 0x%08x\n", (uint32_t)((uint32_t *)(descriptor)));\
1166ef6becaSGagandeep Singh 	for (__i = 0;						\
1176ef6becaSGagandeep Singh 		__i < SEC_GET_DESC_LEN(descriptor);			\
1186ef6becaSGagandeep Singh 		__i++) {						\
119a8794e39SHemant Agrawal 		fprintf(f, "0x%08x: 0x%08x\n",			\
1206ef6becaSGagandeep Singh 			(uint32_t)(((uint32_t *)(descriptor)) + __i),	\
1216ef6becaSGagandeep Singh 			*(((uint32_t *)(descriptor)) + __i));		\
1226ef6becaSGagandeep Singh 	}								\
1236ef6becaSGagandeep Singh }
1246ef6becaSGagandeep Singh /* Union describing a descriptor header.
1256ef6becaSGagandeep Singh  */
126*e7750639SAndre Muezerie struct __rte_packed_begin descriptor_header_s {
127*e7750639SAndre Muezerie 	union __rte_packed_begin {
1286ef6becaSGagandeep Singh 		uint32_t word;
1296ef6becaSGagandeep Singh 		struct {
1306ef6becaSGagandeep Singh 			/* 4  */ unsigned int ctype:5;
1316ef6becaSGagandeep Singh 			/* 5  */ unsigned int res1:2;
1326ef6becaSGagandeep Singh 			/* 7  */ unsigned int dnr:1;
1336ef6becaSGagandeep Singh 			/* 8  */ unsigned int one:1;
1346ef6becaSGagandeep Singh 			/* 9  */ unsigned int res2:1;
1356ef6becaSGagandeep Singh 			/* 10 */ unsigned int start_idx:6;
1366ef6becaSGagandeep Singh 			/* 16 */ unsigned int res3:2;
1376ef6becaSGagandeep Singh 			/* 18 */ unsigned int cif:1;
1386ef6becaSGagandeep Singh 			/* 19 */ unsigned int sc:1;
1396ef6becaSGagandeep Singh 			/* 20 */ unsigned int pd:1;
1406ef6becaSGagandeep Singh 			/* 21 */ unsigned int res4:1;
1416ef6becaSGagandeep Singh 			/* 22 */ unsigned int share:2;
1426ef6becaSGagandeep Singh 			/* 24 */ unsigned int res5:2;
1436ef6becaSGagandeep Singh 			/* 26 */ unsigned int desclen:6;
1446ef6becaSGagandeep Singh 		} sd;
1456ef6becaSGagandeep Singh 		struct {
1466ef6becaSGagandeep Singh 			/* TODO only below struct members are corrected,
1476ef6becaSGagandeep Singh 			 * all others also need to be reversed please verify it
1486ef6becaSGagandeep Singh 			 */
1496ef6becaSGagandeep Singh 			/* 0 */ unsigned int desclen:7;
1506ef6becaSGagandeep Singh 			/* 7 */ unsigned int res4:1;
1516ef6becaSGagandeep Singh 			/* 8 */ unsigned int share:3;
1526ef6becaSGagandeep Singh 			/* 11 */ unsigned int reo:1;
1536ef6becaSGagandeep Singh 			/* 12 */ unsigned int shr:1;
1546ef6becaSGagandeep Singh 			/* 13 */ unsigned int mtd:1;
1556ef6becaSGagandeep Singh 			/* 14 */ unsigned int td:1;
1566ef6becaSGagandeep Singh 			/* 15 */ unsigned int zero:1;
1576ef6becaSGagandeep Singh 			/* 16 */ unsigned int shr_desc_len:6;
1586ef6becaSGagandeep Singh 			/* 22  */ unsigned int res2:1;
1596ef6becaSGagandeep Singh 			/* 23  */ unsigned int one:1;
1606ef6becaSGagandeep Singh 			/* 24  */ unsigned int dnr:1;
1616ef6becaSGagandeep Singh 			/* 25  */ unsigned int rsms:1;
1626ef6becaSGagandeep Singh 			/* 26  */ unsigned int res1:1;
1636ef6becaSGagandeep Singh 			/* 27  */ unsigned int ctype:5;
1646ef6becaSGagandeep Singh 		} jd;
165*e7750639SAndre Muezerie 	} __rte_packed_end command;
166*e7750639SAndre Muezerie } __rte_packed_end;
1676ef6becaSGagandeep Singh 
1686ef6becaSGagandeep Singh /* Union describing a KEY command in a descriptor.
1696ef6becaSGagandeep Singh  */
170*e7750639SAndre Muezerie struct __rte_packed_begin key_command_s {
171*e7750639SAndre Muezerie 	union __rte_packed_begin {
1726ef6becaSGagandeep Singh 		uint32_t word;
173*e7750639SAndre Muezerie 		struct __rte_packed_begin {
1746ef6becaSGagandeep Singh 			unsigned int ctype:5;
1756ef6becaSGagandeep Singh 			unsigned int cls:2;
1766ef6becaSGagandeep Singh 			unsigned int sgf:1;
1776ef6becaSGagandeep Singh 			unsigned int imm:1;
1786ef6becaSGagandeep Singh 			unsigned int enc:1;
1796ef6becaSGagandeep Singh 			unsigned int nwb:1;
1806ef6becaSGagandeep Singh 			unsigned int ekt:1;
1816ef6becaSGagandeep Singh 			unsigned int kdest:4;
1826ef6becaSGagandeep Singh 			unsigned int tk:1;
1836ef6becaSGagandeep Singh 			unsigned int rsvd1:5;
1846ef6becaSGagandeep Singh 			unsigned int length:10;
185*e7750639SAndre Muezerie 		} __rte_packed_end field;
186*e7750639SAndre Muezerie 	} __rte_packed_end command;
187*e7750639SAndre Muezerie } __rte_packed_end;
1886ef6becaSGagandeep Singh 
1896ef6becaSGagandeep Singh /* Union describing a PROTOCOL command
1906ef6becaSGagandeep Singh  * in a descriptor.
1916ef6becaSGagandeep Singh  */
192*e7750639SAndre Muezerie struct __rte_packed_begin protocol_operation_command_s {
193*e7750639SAndre Muezerie 	union __rte_packed_begin {
1946ef6becaSGagandeep Singh 		uint32_t word;
195*e7750639SAndre Muezerie 		struct __rte_packed_begin {
1966ef6becaSGagandeep Singh 			unsigned int ctype:5;
1976ef6becaSGagandeep Singh 			unsigned int optype:3;
1986ef6becaSGagandeep Singh 			unsigned char protid;
1996ef6becaSGagandeep Singh 			unsigned short protinfo;
200*e7750639SAndre Muezerie 		} __rte_packed_end field;
201*e7750639SAndre Muezerie 	} __rte_packed_end command;
202*e7750639SAndre Muezerie } __rte_packed_end;
2036ef6becaSGagandeep Singh 
2046ef6becaSGagandeep Singh /* Union describing a SEQIN command in a
2056ef6becaSGagandeep Singh  * descriptor.
2066ef6becaSGagandeep Singh  */
207*e7750639SAndre Muezerie struct __rte_packed_begin seq_in_command_s {
208*e7750639SAndre Muezerie 	union __rte_packed_begin {
2096ef6becaSGagandeep Singh 		uint32_t word;
2106ef6becaSGagandeep Singh 		struct {
2116ef6becaSGagandeep Singh 			unsigned int ctype:5;
2126ef6becaSGagandeep Singh 			unsigned int res1:1;
2136ef6becaSGagandeep Singh 			unsigned int inl:1;
2146ef6becaSGagandeep Singh 			unsigned int sgf:1;
2156ef6becaSGagandeep Singh 			unsigned int pre:1;
2166ef6becaSGagandeep Singh 			unsigned int ext:1;
2176ef6becaSGagandeep Singh 			unsigned int rto:1;
2186ef6becaSGagandeep Singh 			unsigned int rjd:1;
2196ef6becaSGagandeep Singh 			unsigned int res2:4;
2206ef6becaSGagandeep Singh 			unsigned int length:16;
2216ef6becaSGagandeep Singh 		} field;
222*e7750639SAndre Muezerie 	} __rte_packed_end command;
223*e7750639SAndre Muezerie } __rte_packed_end;
2246ef6becaSGagandeep Singh 
2256ef6becaSGagandeep Singh /* Union describing a SEQOUT command in a
2266ef6becaSGagandeep Singh  * descriptor.
2276ef6becaSGagandeep Singh  */
228*e7750639SAndre Muezerie struct __rte_packed_begin seq_out_command_s {
229*e7750639SAndre Muezerie 	union __rte_packed_begin {
2306ef6becaSGagandeep Singh 		uint32_t word;
2316ef6becaSGagandeep Singh 		struct {
2326ef6becaSGagandeep Singh 			unsigned int ctype:5;
2336ef6becaSGagandeep Singh 			unsigned int res1:2;
2346ef6becaSGagandeep Singh 			unsigned int sgf:1;
2356ef6becaSGagandeep Singh 			unsigned int pre:1;
2366ef6becaSGagandeep Singh 			unsigned int ext:1;
2376ef6becaSGagandeep Singh 			unsigned int rto:1;
2386ef6becaSGagandeep Singh 			unsigned int res2:5;
2396ef6becaSGagandeep Singh 			unsigned int length:16;
2406ef6becaSGagandeep Singh 		} field;
241*e7750639SAndre Muezerie 	} __rte_packed_end command;
242*e7750639SAndre Muezerie } __rte_packed_end;
2436ef6becaSGagandeep Singh 
244*e7750639SAndre Muezerie struct __rte_packed_begin load_command_s {
245*e7750639SAndre Muezerie 	union __rte_packed_begin {
2466ef6becaSGagandeep Singh 		uint32_t word;
2476ef6becaSGagandeep Singh 		struct {
2486ef6becaSGagandeep Singh 			unsigned int ctype:5;
2496ef6becaSGagandeep Singh 			unsigned int class:2;
2506ef6becaSGagandeep Singh 			unsigned int sgf:1;
2516ef6becaSGagandeep Singh 			unsigned int imm:1;
2526ef6becaSGagandeep Singh 			unsigned int dst:7;
2536ef6becaSGagandeep Singh 			unsigned char offset;
2546ef6becaSGagandeep Singh 			unsigned char length;
2556ef6becaSGagandeep Singh 		} fields;
256*e7750639SAndre Muezerie 	} __rte_packed_end command;
257*e7750639SAndre Muezerie } __rte_packed_end;
2586ef6becaSGagandeep Singh 
2596ef6becaSGagandeep Singh /* Structure encompassing a general shared descriptor of maximum
2606ef6becaSGagandeep Singh  * size (64 WORDs). Usually, other specific shared descriptor structures
2616ef6becaSGagandeep Singh  * will be type-casted to this one
2626ef6becaSGagandeep Singh  * this one.
2636ef6becaSGagandeep Singh  */
264*e7750639SAndre Muezerie struct __rte_aligned(64) __rte_packed_begin sec_sd_t {
2656ef6becaSGagandeep Singh 	uint32_t rsvd[MAX_DESC_SIZE_WORDS];
266*e7750639SAndre Muezerie } __rte_packed_end;
2676ef6becaSGagandeep Singh 
2686ef6becaSGagandeep Singh /* Structure encompassing a job descriptor which processes
2696ef6becaSGagandeep Singh  * a single packet from a context. The job descriptor references
2706ef6becaSGagandeep Singh  * a shared descriptor from a SEC context.
2716ef6becaSGagandeep Singh  */
272*e7750639SAndre Muezerie struct __rte_aligned(64) __rte_packed_begin sec_job_descriptor_t {
2736ef6becaSGagandeep Singh 	struct descriptor_header_s deschdr;
2746ef6becaSGagandeep Singh 	dma_addr_t sd_ptr;
2756ef6becaSGagandeep Singh 	struct seq_out_command_s seq_out;
2766ef6becaSGagandeep Singh 	dma_addr_t seq_out_ptr;
2776ef6becaSGagandeep Singh 	uint32_t out_ext_length;
2786ef6becaSGagandeep Singh 	struct seq_in_command_s seq_in;
2796ef6becaSGagandeep Singh 	dma_addr_t seq_in_ptr;
2806ef6becaSGagandeep Singh 	uint32_t in_ext_length;
2816ef6becaSGagandeep Singh 	struct load_command_s load_dpovrd;
2826ef6becaSGagandeep Singh 	uint32_t dpovrd;
283*e7750639SAndre Muezerie } __rte_packed_end;
2846ef6becaSGagandeep Singh 
2856ef6becaSGagandeep Singh #endif
286