xref: /dpdk/drivers/crypto/dpaa_sec/dpaa_sec.h (revision 6a0c9d364afcb0b0ca445efb12a5f6fb65fd1ae2)
1d81734caSHemant Agrawal /* SPDX-License-Identifier: BSD-3-Clause
2c3e85bdcSAkhil Goyal  *
3d81734caSHemant Agrawal  *   Copyright 2016 NXP
4c3e85bdcSAkhil Goyal  *
5c3e85bdcSAkhil Goyal  */
6c3e85bdcSAkhil Goyal 
7c3e85bdcSAkhil Goyal #ifndef _DPAA_SEC_H_
8c3e85bdcSAkhil Goyal #define _DPAA_SEC_H_
9c3e85bdcSAkhil Goyal 
1069cb2eebSAshish Jain #define CRYPTODEV_NAME_DPAA_SEC_PMD	crypto_dpaa_sec
1169cb2eebSAshish Jain /**< NXP DPAA - SEC PMD device name */
1269cb2eebSAshish Jain 
134e694fe5SAkhil Goyal #define MAX_DPAA_CORES		4
14c3e85bdcSAkhil Goyal #define NUM_POOL_CHANNELS	4
159a984458SAkhil Goyal #define DPAA_SEC_BURST		7
16c3e85bdcSAkhil Goyal #define DPAA_SEC_ALG_UNSUPPORT	(-1)
17c3e85bdcSAkhil Goyal #define TDES_CBC_IV_LEN		8
18c3e85bdcSAkhil Goyal #define AES_CBC_IV_LEN		16
19c3e85bdcSAkhil Goyal #define AES_CTR_IV_LEN		16
20c3e85bdcSAkhil Goyal #define AES_GCM_IV_LEN		12
21c3e85bdcSAkhil Goyal 
225ab35d2eSAkhil Goyal #define DPAA_IPv6_DEFAULT_VTC_FLOW	0x60000000
235ab35d2eSAkhil Goyal 
24c3e85bdcSAkhil Goyal /* Minimum job descriptor consists of a oneword job descriptor HEADER and
25c3e85bdcSAkhil Goyal  * a pointer to the shared descriptor.
26c3e85bdcSAkhil Goyal  */
27c3e85bdcSAkhil Goyal #define MIN_JOB_DESC_SIZE	(CAAM_CMD_SZ + CAAM_PTR_SZ)
28c3e85bdcSAkhil Goyal /* CTX_POOL_NUM_BUFS is set as per the ipsec-secgw application */
29c3e85bdcSAkhil Goyal #define CTX_POOL_NUM_BUFS	32000
30c3e85bdcSAkhil Goyal #define CTX_POOL_BUF_SIZE	sizeof(struct dpaa_sec_op_ctx)
31c3e85bdcSAkhil Goyal #define CTX_POOL_CACHE_SIZE	512
324e694fe5SAkhil Goyal #define RTE_DPAA_SEC_PMD_MAX_NB_SESSIONS 1024
33c3e85bdcSAkhil Goyal 
34c3e85bdcSAkhil Goyal #define DIR_ENC                 1
35c3e85bdcSAkhil Goyal #define DIR_DEC                 0
36c3e85bdcSAkhil Goyal 
37c3e85bdcSAkhil Goyal enum dpaa_sec_op_type {
38c3e85bdcSAkhil Goyal 	DPAA_SEC_NONE,  /*!< No Cipher operations*/
39c3e85bdcSAkhil Goyal 	DPAA_SEC_CIPHER,/*!< CIPHER operations */
40c3e85bdcSAkhil Goyal 	DPAA_SEC_AUTH,  /*!< Authentication Operations */
41c3e85bdcSAkhil Goyal 	DPAA_SEC_AEAD,  /*!< Authenticated Encryption with associated data */
42c3e85bdcSAkhil Goyal 	DPAA_SEC_IPSEC, /*!< IPSEC protocol operations*/
43c3e85bdcSAkhil Goyal 	DPAA_SEC_PDCP,  /*!< PDCP protocol operations*/
44c3e85bdcSAkhil Goyal 	DPAA_SEC_PKC,   /*!< Public Key Cryptographic Operations */
45c3e85bdcSAkhil Goyal 	DPAA_SEC_MAX
46c3e85bdcSAkhil Goyal };
47c3e85bdcSAkhil Goyal 
48c3e85bdcSAkhil Goyal 
49c3e85bdcSAkhil Goyal #define DPAA_SEC_MAX_DESC_SIZE  64
50c3e85bdcSAkhil Goyal /* code or cmd block to caam */
51c3e85bdcSAkhil Goyal struct sec_cdb {
52c3e85bdcSAkhil Goyal 	struct {
53c3e85bdcSAkhil Goyal 		union {
54c3e85bdcSAkhil Goyal 			uint32_t word;
55c3e85bdcSAkhil Goyal 			struct {
56c3e85bdcSAkhil Goyal #if RTE_BYTE_ORDER == RTE_BIG_ENDIAN
57c3e85bdcSAkhil Goyal 				uint16_t rsvd63_48;
58c3e85bdcSAkhil Goyal 				unsigned int rsvd47_39:9;
59c3e85bdcSAkhil Goyal 				unsigned int idlen:7;
60c3e85bdcSAkhil Goyal #else
61c3e85bdcSAkhil Goyal 				unsigned int idlen:7;
62c3e85bdcSAkhil Goyal 				unsigned int rsvd47_39:9;
63c3e85bdcSAkhil Goyal 				uint16_t rsvd63_48;
64c3e85bdcSAkhil Goyal #endif
65c3e85bdcSAkhil Goyal 			} field;
66c3e85bdcSAkhil Goyal 		} __packed hi;
67c3e85bdcSAkhil Goyal 
68c3e85bdcSAkhil Goyal 		union {
69c3e85bdcSAkhil Goyal 			uint32_t word;
70c3e85bdcSAkhil Goyal 			struct {
71c3e85bdcSAkhil Goyal #if RTE_BYTE_ORDER == RTE_BIG_ENDIAN
72c3e85bdcSAkhil Goyal 				unsigned int rsvd31_30:2;
73c3e85bdcSAkhil Goyal 				unsigned int fsgt:1;
74c3e85bdcSAkhil Goyal 				unsigned int lng:1;
75c3e85bdcSAkhil Goyal 				unsigned int offset:2;
76c3e85bdcSAkhil Goyal 				unsigned int abs:1;
77c3e85bdcSAkhil Goyal 				unsigned int add_buf:1;
78c3e85bdcSAkhil Goyal 				uint8_t pool_id;
79c3e85bdcSAkhil Goyal 				uint16_t pool_buffer_size;
80c3e85bdcSAkhil Goyal #else
81c3e85bdcSAkhil Goyal 				uint16_t pool_buffer_size;
82c3e85bdcSAkhil Goyal 				uint8_t pool_id;
83c3e85bdcSAkhil Goyal 				unsigned int add_buf:1;
84c3e85bdcSAkhil Goyal 				unsigned int abs:1;
85c3e85bdcSAkhil Goyal 				unsigned int offset:2;
86c3e85bdcSAkhil Goyal 				unsigned int lng:1;
87c3e85bdcSAkhil Goyal 				unsigned int fsgt:1;
88c3e85bdcSAkhil Goyal 				unsigned int rsvd31_30:2;
89c3e85bdcSAkhil Goyal #endif
90c3e85bdcSAkhil Goyal 			} field;
91c3e85bdcSAkhil Goyal 		} __packed lo;
92c3e85bdcSAkhil Goyal 	} __packed sh_hdr;
93c3e85bdcSAkhil Goyal 
94c3e85bdcSAkhil Goyal 	uint32_t sh_desc[DPAA_SEC_MAX_DESC_SIZE];
95c3e85bdcSAkhil Goyal };
96c3e85bdcSAkhil Goyal 
97a1173d55SHemant Agrawal /*!
98a1173d55SHemant Agrawal  * The structure is to be filled by user as a part of
99a1173d55SHemant Agrawal  * dpaa_sec_proto_ctxt for PDCP Protocol
100a1173d55SHemant Agrawal  */
101a1173d55SHemant Agrawal struct sec_pdcp_ctxt {
102a1173d55SHemant Agrawal 	enum rte_security_pdcp_domain domain; /*!< Data/Control mode*/
103a1173d55SHemant Agrawal 	int8_t bearer;	/*!< PDCP bearer ID */
104a1173d55SHemant Agrawal 	int8_t pkt_dir;/*!< PDCP Frame Direction 0:UL 1:DL*/
105a1173d55SHemant Agrawal 	int8_t hfn_ovd;/*!< Overwrite HFN per packet*/
106*6a0c9d36SAkhil Goyal 	uint8_t sn_size;	/*!< Sequence number size, 5/7/12/15/18 */
107*6a0c9d36SAkhil Goyal 	uint32_t hfn_ovd_offset;/*!< offset from rte_crypto_op at which
108*6a0c9d36SAkhil Goyal 				 * per packet hfn is stored
109*6a0c9d36SAkhil Goyal 				 */
110a1173d55SHemant Agrawal 	uint32_t hfn;	/*!< Hyper Frame Number */
111a1173d55SHemant Agrawal 	uint32_t hfn_threshold;	/*!< HFN Threashold for key renegotiation */
112a1173d55SHemant Agrawal };
113a1173d55SHemant Agrawal 
114e79416d1SHemant Agrawal typedef struct dpaa_sec_session_entry {
115e79416d1SHemant Agrawal 	uint8_t dir;         /*!< Operation Direction */
116e79416d1SHemant Agrawal 	enum rte_crypto_cipher_algorithm cipher_alg; /*!< Cipher Algorithm*/
117e79416d1SHemant Agrawal 	enum rte_crypto_auth_algorithm auth_alg; /*!< Authentication Algorithm*/
1181f14d500SAkhil Goyal 	enum rte_crypto_aead_algorithm aead_alg; /*!< AEAD Algorithm*/
1191f14d500SAkhil Goyal 	enum rte_security_session_protocol proto_alg; /*!< Security Algorithm*/
120e79416d1SHemant Agrawal 	union {
121e79416d1SHemant Agrawal 		struct {
122e79416d1SHemant Agrawal 			uint8_t *data;	/**< pointer to key data */
123e79416d1SHemant Agrawal 			size_t length;	/**< key length in bytes */
124e79416d1SHemant Agrawal 		} aead_key;
125e79416d1SHemant Agrawal 		struct {
126e79416d1SHemant Agrawal 			struct {
127e79416d1SHemant Agrawal 				uint8_t *data;	/**< pointer to key data */
128e79416d1SHemant Agrawal 				size_t length;	/**< key length in bytes */
129e79416d1SHemant Agrawal 			} cipher_key;
130e79416d1SHemant Agrawal 			struct {
131e79416d1SHemant Agrawal 				uint8_t *data;	/**< pointer to key data */
132e79416d1SHemant Agrawal 				size_t length;	/**< key length in bytes */
133e79416d1SHemant Agrawal 			} auth_key;
134e79416d1SHemant Agrawal 		};
135e79416d1SHemant Agrawal 	};
136a1173d55SHemant Agrawal 	union {
137a1173d55SHemant Agrawal 		struct {
138e79416d1SHemant Agrawal 			struct {
139e79416d1SHemant Agrawal 				uint16_t length;
140e79416d1SHemant Agrawal 				uint16_t offset;
141e79416d1SHemant Agrawal 			} iv;	/**< Initialisation vector parameters */
142a1173d55SHemant Agrawal 			uint16_t auth_only_len;
143a1173d55SHemant Agrawal 					/*!< Length of data for Auth only */
144e79416d1SHemant Agrawal 			uint32_t digest_length;
145a1173d55SHemant Agrawal 			struct ipsec_decap_pdb decap_pdb;
1461f14d500SAkhil Goyal 			struct ipsec_encap_pdb encap_pdb;
1475ab35d2eSAkhil Goyal 			union {
1481f14d500SAkhil Goyal 				struct ip ip4_hdr;
1495ab35d2eSAkhil Goyal 				struct rte_ipv6_hdr ip6_hdr;
1505ab35d2eSAkhil Goyal 			};
151a1173d55SHemant Agrawal 		};
152a1173d55SHemant Agrawal 		struct sec_pdcp_ctxt pdcp;
153a1173d55SHemant Agrawal 	};
1544e694fe5SAkhil Goyal 	struct dpaa_sec_qp *qp[MAX_DPAA_CORES];
1554e694fe5SAkhil Goyal 	struct qman_fq *inq[MAX_DPAA_CORES];
156e79416d1SHemant Agrawal 	struct sec_cdb cdb;	/**< cmd block associated with qp */
157e79416d1SHemant Agrawal 	struct rte_mempool *ctx_pool; /* session mempool for dpaa_sec_op_ctx */
158e79416d1SHemant Agrawal } dpaa_sec_session;
159e79416d1SHemant Agrawal 
160c3e85bdcSAkhil Goyal struct dpaa_sec_qp {
161c3e85bdcSAkhil Goyal 	struct dpaa_sec_dev_private *internals;
162c3e85bdcSAkhil Goyal 	struct qman_fq outq;
163c3e85bdcSAkhil Goyal 	int rx_pkts;
164c3e85bdcSAkhil Goyal 	int rx_errs;
165c3e85bdcSAkhil Goyal 	int tx_pkts;
166c3e85bdcSAkhil Goyal 	int tx_errs;
167c3e85bdcSAkhil Goyal };
168c3e85bdcSAkhil Goyal 
169551a42a9SHemant Agrawal #define RTE_DPAA_MAX_NB_SEC_QPS 2
1704e694fe5SAkhil Goyal #define RTE_DPAA_MAX_RX_QUEUE (MAX_DPAA_CORES * RTE_DPAA_SEC_PMD_MAX_NB_SESSIONS)
1719a984458SAkhil Goyal #define DPAA_MAX_DEQUEUE_NUM_FRAMES 63
172e79416d1SHemant Agrawal 
173c3e85bdcSAkhil Goyal /* internal sec queue interface */
174c3e85bdcSAkhil Goyal struct dpaa_sec_dev_private {
175c3e85bdcSAkhil Goyal 	void *sec_hw;
176c3e85bdcSAkhil Goyal 	struct rte_mempool *ctx_pool; /* per dev mempool for dpaa_sec_op_ctx */
177e79416d1SHemant Agrawal 	struct dpaa_sec_qp qps[RTE_DPAA_MAX_NB_SEC_QPS]; /* i/o queue for sec */
178e79416d1SHemant Agrawal 	struct qman_fq inq[RTE_DPAA_MAX_RX_QUEUE];
179e79416d1SHemant Agrawal 	unsigned char inq_attach[RTE_DPAA_MAX_RX_QUEUE];
180c3e85bdcSAkhil Goyal 	unsigned int max_nb_queue_pairs;
181c3e85bdcSAkhil Goyal 	unsigned int max_nb_sessions;
1823b617ee7SAkhil Goyal 	rte_spinlock_t lock;
183c3e85bdcSAkhil Goyal };
184c3e85bdcSAkhil Goyal 
185c3e85bdcSAkhil Goyal #define MAX_SG_ENTRIES		16
186c3e85bdcSAkhil Goyal #define SG_CACHELINE_0		0
187c3e85bdcSAkhil Goyal #define SG_CACHELINE_1		4
188c3e85bdcSAkhil Goyal #define SG_CACHELINE_2		8
189c3e85bdcSAkhil Goyal #define SG_CACHELINE_3		12
190c3e85bdcSAkhil Goyal struct dpaa_sec_job {
191c3e85bdcSAkhil Goyal 	/* sg[0] output, sg[1] input, others are possible sub frames */
192c3e85bdcSAkhil Goyal 	struct qm_sg_entry sg[MAX_SG_ENTRIES];
193c3e85bdcSAkhil Goyal };
194c3e85bdcSAkhil Goyal 
195c3e85bdcSAkhil Goyal #define DPAA_MAX_NB_MAX_DIGEST	32
196c3e85bdcSAkhil Goyal struct dpaa_sec_op_ctx {
197c3e85bdcSAkhil Goyal 	struct dpaa_sec_job job;
198c3e85bdcSAkhil Goyal 	struct rte_crypto_op *op;
199c3e85bdcSAkhil Goyal 	struct rte_mempool *ctx_pool; /* mempool pointer for dpaa_sec_op_ctx */
200c3e85bdcSAkhil Goyal 	uint32_t fd_status;
201fcf67029SHemant Agrawal 	int64_t vtop_offset;
202c3e85bdcSAkhil Goyal 	uint8_t digest[DPAA_MAX_NB_MAX_DIGEST];
203c3e85bdcSAkhil Goyal };
204c3e85bdcSAkhil Goyal 
205c3e85bdcSAkhil Goyal static const struct rte_cryptodev_capabilities dpaa_sec_capabilities[] = {
206c3e85bdcSAkhil Goyal 	{	/* MD5 HMAC */
207c3e85bdcSAkhil Goyal 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
208c3e85bdcSAkhil Goyal 		{.sym = {
209c3e85bdcSAkhil Goyal 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
210c3e85bdcSAkhil Goyal 			{.auth = {
211c3e85bdcSAkhil Goyal 				.algo = RTE_CRYPTO_AUTH_MD5_HMAC,
212c3e85bdcSAkhil Goyal 				.block_size = 64,
213c3e85bdcSAkhil Goyal 				.key_size = {
214c3e85bdcSAkhil Goyal 					.min = 1,
215c3e85bdcSAkhil Goyal 					.max = 64,
216c3e85bdcSAkhil Goyal 					.increment = 1
217c3e85bdcSAkhil Goyal 				},
218c3e85bdcSAkhil Goyal 				.digest_size = {
2196c9c2e46SHemant Agrawal 					.min = 1,
220c3e85bdcSAkhil Goyal 					.max = 16,
2216c9c2e46SHemant Agrawal 					.increment = 1
222c3e85bdcSAkhil Goyal 				},
2236c9c2e46SHemant Agrawal 				.iv_size = { 0 }
224c3e85bdcSAkhil Goyal 			}, }
225c3e85bdcSAkhil Goyal 		}, }
226c3e85bdcSAkhil Goyal 	},
227c3e85bdcSAkhil Goyal 	{	/* SHA1 HMAC */
228c3e85bdcSAkhil Goyal 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
229c3e85bdcSAkhil Goyal 		{.sym = {
230c3e85bdcSAkhil Goyal 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
231c3e85bdcSAkhil Goyal 			{.auth = {
232c3e85bdcSAkhil Goyal 				.algo = RTE_CRYPTO_AUTH_SHA1_HMAC,
233c3e85bdcSAkhil Goyal 				.block_size = 64,
234c3e85bdcSAkhil Goyal 				.key_size = {
235c3e85bdcSAkhil Goyal 					.min = 1,
236c3e85bdcSAkhil Goyal 					.max = 64,
237c3e85bdcSAkhil Goyal 					.increment = 1
238c3e85bdcSAkhil Goyal 				},
239c3e85bdcSAkhil Goyal 				.digest_size = {
2406c9c2e46SHemant Agrawal 					.min = 1,
241c3e85bdcSAkhil Goyal 					.max = 20,
2426c9c2e46SHemant Agrawal 					.increment = 1
243c3e85bdcSAkhil Goyal 				},
2446c9c2e46SHemant Agrawal 				.iv_size = { 0 }
245c3e85bdcSAkhil Goyal 			}, }
246c3e85bdcSAkhil Goyal 		}, }
247c3e85bdcSAkhil Goyal 	},
248c3e85bdcSAkhil Goyal 	{	/* SHA224 HMAC */
249c3e85bdcSAkhil Goyal 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
250c3e85bdcSAkhil Goyal 		{.sym = {
251c3e85bdcSAkhil Goyal 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
252c3e85bdcSAkhil Goyal 			{.auth = {
253c3e85bdcSAkhil Goyal 				.algo = RTE_CRYPTO_AUTH_SHA224_HMAC,
254c3e85bdcSAkhil Goyal 				.block_size = 64,
255c3e85bdcSAkhil Goyal 				.key_size = {
256c3e85bdcSAkhil Goyal 					.min = 1,
257c3e85bdcSAkhil Goyal 					.max = 64,
258c3e85bdcSAkhil Goyal 					.increment = 1
259c3e85bdcSAkhil Goyal 				},
260c3e85bdcSAkhil Goyal 				.digest_size = {
2616c9c2e46SHemant Agrawal 					.min = 1,
262c3e85bdcSAkhil Goyal 					.max = 28,
2636c9c2e46SHemant Agrawal 					.increment = 1
264c3e85bdcSAkhil Goyal 				},
2656c9c2e46SHemant Agrawal 				.iv_size = { 0 }
266c3e85bdcSAkhil Goyal 			}, }
267c3e85bdcSAkhil Goyal 		}, }
268c3e85bdcSAkhil Goyal 	},
269c3e85bdcSAkhil Goyal 	{	/* SHA256 HMAC */
270c3e85bdcSAkhil Goyal 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
271c3e85bdcSAkhil Goyal 		{.sym = {
272c3e85bdcSAkhil Goyal 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
273c3e85bdcSAkhil Goyal 			{.auth = {
274c3e85bdcSAkhil Goyal 				.algo = RTE_CRYPTO_AUTH_SHA256_HMAC,
275c3e85bdcSAkhil Goyal 				.block_size = 64,
276c3e85bdcSAkhil Goyal 				.key_size = {
277c3e85bdcSAkhil Goyal 					.min = 1,
278c3e85bdcSAkhil Goyal 					.max = 64,
279c3e85bdcSAkhil Goyal 					.increment = 1
280c3e85bdcSAkhil Goyal 				},
281c3e85bdcSAkhil Goyal 				.digest_size = {
2826c9c2e46SHemant Agrawal 					.min = 1,
283c3e85bdcSAkhil Goyal 					.max = 32,
2846c9c2e46SHemant Agrawal 					.increment = 1
285c3e85bdcSAkhil Goyal 				},
2866c9c2e46SHemant Agrawal 				.iv_size = { 0 }
287c3e85bdcSAkhil Goyal 			}, }
288c3e85bdcSAkhil Goyal 		}, }
289c3e85bdcSAkhil Goyal 	},
290c3e85bdcSAkhil Goyal 	{	/* SHA384 HMAC */
291c3e85bdcSAkhil Goyal 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
292c3e85bdcSAkhil Goyal 		{.sym = {
293c3e85bdcSAkhil Goyal 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
294c3e85bdcSAkhil Goyal 			{.auth = {
295c3e85bdcSAkhil Goyal 				.algo = RTE_CRYPTO_AUTH_SHA384_HMAC,
296c3e85bdcSAkhil Goyal 				.block_size = 128,
297c3e85bdcSAkhil Goyal 				.key_size = {
298c3e85bdcSAkhil Goyal 					.min = 1,
299c3e85bdcSAkhil Goyal 					.max = 128,
300c3e85bdcSAkhil Goyal 					.increment = 1
301c3e85bdcSAkhil Goyal 				},
302c3e85bdcSAkhil Goyal 				.digest_size = {
3036c9c2e46SHemant Agrawal 					.min = 1,
304c3e85bdcSAkhil Goyal 					.max = 48,
3056c9c2e46SHemant Agrawal 					.increment = 1
306c3e85bdcSAkhil Goyal 				},
3076c9c2e46SHemant Agrawal 				.iv_size = { 0 }
308c3e85bdcSAkhil Goyal 			}, }
309c3e85bdcSAkhil Goyal 		}, }
310c3e85bdcSAkhil Goyal 	},
311c3e85bdcSAkhil Goyal 	{	/* SHA512 HMAC */
312c3e85bdcSAkhil Goyal 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
313c3e85bdcSAkhil Goyal 		{.sym = {
314c3e85bdcSAkhil Goyal 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
315c3e85bdcSAkhil Goyal 			{.auth = {
316c3e85bdcSAkhil Goyal 				.algo = RTE_CRYPTO_AUTH_SHA512_HMAC,
317c3e85bdcSAkhil Goyal 				.block_size = 128,
318c3e85bdcSAkhil Goyal 				.key_size = {
319c3e85bdcSAkhil Goyal 					.min = 1,
320c3e85bdcSAkhil Goyal 					.max = 128,
321c3e85bdcSAkhil Goyal 					.increment = 1
322c3e85bdcSAkhil Goyal 				},
323c3e85bdcSAkhil Goyal 				.digest_size = {
3246c9c2e46SHemant Agrawal 					.min = 1,
325c3e85bdcSAkhil Goyal 					.max = 64,
3266c9c2e46SHemant Agrawal 					.increment = 1
327c3e85bdcSAkhil Goyal 				},
3286c9c2e46SHemant Agrawal 				.iv_size = { 0 }
329c3e85bdcSAkhil Goyal 			}, }
330c3e85bdcSAkhil Goyal 		}, }
331c3e85bdcSAkhil Goyal 	},
332c3e85bdcSAkhil Goyal 	{	/* AES GCM */
333c3e85bdcSAkhil Goyal 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
334c3e85bdcSAkhil Goyal 		{.sym = {
335c3e85bdcSAkhil Goyal 			.xform_type = RTE_CRYPTO_SYM_XFORM_AEAD,
336c25a37d7SHemant Agrawal 			{.aead = {
337c3e85bdcSAkhil Goyal 				.algo = RTE_CRYPTO_AEAD_AES_GCM,
338c3e85bdcSAkhil Goyal 				.block_size = 16,
339c3e85bdcSAkhil Goyal 				.key_size = {
340c3e85bdcSAkhil Goyal 					.min = 16,
341c3e85bdcSAkhil Goyal 					.max = 32,
342c3e85bdcSAkhil Goyal 					.increment = 8
343c3e85bdcSAkhil Goyal 				},
344c3e85bdcSAkhil Goyal 				.digest_size = {
345c3e85bdcSAkhil Goyal 					.min = 8,
346c3e85bdcSAkhil Goyal 					.max = 16,
347c3e85bdcSAkhil Goyal 					.increment = 4
348c3e85bdcSAkhil Goyal 				},
349c3e85bdcSAkhil Goyal 				.aad_size = {
350c3e85bdcSAkhil Goyal 					.min = 0,
351c3e85bdcSAkhil Goyal 					.max = 240,
352c3e85bdcSAkhil Goyal 					.increment = 1
353c3e85bdcSAkhil Goyal 				},
354c3e85bdcSAkhil Goyal 				.iv_size = {
355c3e85bdcSAkhil Goyal 					.min = 12,
356c3e85bdcSAkhil Goyal 					.max = 12,
357c3e85bdcSAkhil Goyal 					.increment = 0
358c3e85bdcSAkhil Goyal 				},
359c3e85bdcSAkhil Goyal 			}, }
360c3e85bdcSAkhil Goyal 		}, }
361c3e85bdcSAkhil Goyal 	},
362c3e85bdcSAkhil Goyal 	{	/* AES CBC */
363c3e85bdcSAkhil Goyal 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
364c3e85bdcSAkhil Goyal 		{.sym = {
365c3e85bdcSAkhil Goyal 			.xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
366c3e85bdcSAkhil Goyal 			{.cipher = {
367c3e85bdcSAkhil Goyal 				.algo = RTE_CRYPTO_CIPHER_AES_CBC,
368c3e85bdcSAkhil Goyal 				.block_size = 16,
369c3e85bdcSAkhil Goyal 				.key_size = {
370c3e85bdcSAkhil Goyal 					.min = 16,
371c3e85bdcSAkhil Goyal 					.max = 32,
372c3e85bdcSAkhil Goyal 					.increment = 8
373c3e85bdcSAkhil Goyal 				},
374c3e85bdcSAkhil Goyal 				.iv_size = {
375c3e85bdcSAkhil Goyal 					.min = 16,
376c3e85bdcSAkhil Goyal 					.max = 16,
377c3e85bdcSAkhil Goyal 					.increment = 0
378c3e85bdcSAkhil Goyal 				}
379c3e85bdcSAkhil Goyal 			}, }
380c3e85bdcSAkhil Goyal 		}, }
381c3e85bdcSAkhil Goyal 	},
382c3e85bdcSAkhil Goyal 	{	/* AES CTR */
383c3e85bdcSAkhil Goyal 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
384c3e85bdcSAkhil Goyal 		{.sym = {
385c3e85bdcSAkhil Goyal 			.xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
386c3e85bdcSAkhil Goyal 			{.cipher = {
387c3e85bdcSAkhil Goyal 				.algo = RTE_CRYPTO_CIPHER_AES_CTR,
388c3e85bdcSAkhil Goyal 				.block_size = 16,
389c3e85bdcSAkhil Goyal 				.key_size = {
390c3e85bdcSAkhil Goyal 					.min = 16,
391c3e85bdcSAkhil Goyal 					.max = 32,
392c3e85bdcSAkhil Goyal 					.increment = 8
393c3e85bdcSAkhil Goyal 				},
394c3e85bdcSAkhil Goyal 				.iv_size = {
395c3e85bdcSAkhil Goyal 					.min = 16,
396c3e85bdcSAkhil Goyal 					.max = 16,
397c3e85bdcSAkhil Goyal 					.increment = 0
398a1173d55SHemant Agrawal 				},
399c3e85bdcSAkhil Goyal 			}, }
400c3e85bdcSAkhil Goyal 		}, }
401c3e85bdcSAkhil Goyal 	},
402c3e85bdcSAkhil Goyal 	{	/* 3DES CBC */
403c3e85bdcSAkhil Goyal 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
404c3e85bdcSAkhil Goyal 		{.sym = {
405c3e85bdcSAkhil Goyal 			.xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
406c3e85bdcSAkhil Goyal 			{.cipher = {
407c3e85bdcSAkhil Goyal 				.algo = RTE_CRYPTO_CIPHER_3DES_CBC,
408c3e85bdcSAkhil Goyal 				.block_size = 8,
409c3e85bdcSAkhil Goyal 				.key_size = {
410c3e85bdcSAkhil Goyal 					.min = 16,
411c3e85bdcSAkhil Goyal 					.max = 24,
412c3e85bdcSAkhil Goyal 					.increment = 8
413c3e85bdcSAkhil Goyal 				},
414c3e85bdcSAkhil Goyal 				.iv_size = {
415c3e85bdcSAkhil Goyal 					.min = 8,
416c3e85bdcSAkhil Goyal 					.max = 8,
417c3e85bdcSAkhil Goyal 					.increment = 0
418c3e85bdcSAkhil Goyal 				}
419c3e85bdcSAkhil Goyal 			}, }
420c3e85bdcSAkhil Goyal 		}, }
421c3e85bdcSAkhil Goyal 	},
422c3e85bdcSAkhil Goyal 
423c3e85bdcSAkhil Goyal 	RTE_CRYPTODEV_END_OF_CAPABILITIES_LIST()
424c3e85bdcSAkhil Goyal };
425c3e85bdcSAkhil Goyal 
426a1173d55SHemant Agrawal static const struct rte_cryptodev_capabilities dpaa_pdcp_capabilities[] = {
427a1173d55SHemant Agrawal 	{	/* SNOW 3G (UIA2) */
428a1173d55SHemant Agrawal 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
429a1173d55SHemant Agrawal 		{.sym = {
430a1173d55SHemant Agrawal 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
431a1173d55SHemant Agrawal 			{.auth = {
432a1173d55SHemant Agrawal 				.algo = RTE_CRYPTO_AUTH_SNOW3G_UIA2,
433a1173d55SHemant Agrawal 				.block_size = 16,
434a1173d55SHemant Agrawal 				.key_size = {
435a1173d55SHemant Agrawal 					.min = 16,
436a1173d55SHemant Agrawal 					.max = 16,
437a1173d55SHemant Agrawal 					.increment = 0
438a1173d55SHemant Agrawal 				},
439a1173d55SHemant Agrawal 				.digest_size = {
440a1173d55SHemant Agrawal 					.min = 4,
441a1173d55SHemant Agrawal 					.max = 4,
442a1173d55SHemant Agrawal 					.increment = 0
443a1173d55SHemant Agrawal 				},
444a1173d55SHemant Agrawal 				.iv_size = {
445a1173d55SHemant Agrawal 					.min = 16,
446a1173d55SHemant Agrawal 					.max = 16,
447a1173d55SHemant Agrawal 					.increment = 0
448a1173d55SHemant Agrawal 				}
449a1173d55SHemant Agrawal 			}, }
450a1173d55SHemant Agrawal 		}, }
451a1173d55SHemant Agrawal 	},
452a1173d55SHemant Agrawal 	{	/* SNOW 3G (UEA2) */
453a1173d55SHemant Agrawal 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
454a1173d55SHemant Agrawal 		{.sym = {
455a1173d55SHemant Agrawal 			.xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
456a1173d55SHemant Agrawal 			{.cipher = {
457a1173d55SHemant Agrawal 				.algo = RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
458a1173d55SHemant Agrawal 				.block_size = 16,
459a1173d55SHemant Agrawal 				.key_size = {
460a1173d55SHemant Agrawal 					.min = 16,
461a1173d55SHemant Agrawal 					.max = 16,
462a1173d55SHemant Agrawal 					.increment = 0
463a1173d55SHemant Agrawal 				},
464a1173d55SHemant Agrawal 				.iv_size = {
465a1173d55SHemant Agrawal 					.min = 16,
466a1173d55SHemant Agrawal 					.max = 16,
467a1173d55SHemant Agrawal 					.increment = 0
468a1173d55SHemant Agrawal 				}
469a1173d55SHemant Agrawal 			}, }
470a1173d55SHemant Agrawal 		}, }
471a1173d55SHemant Agrawal 	},
472a1173d55SHemant Agrawal 	{	/* AES CTR */
473a1173d55SHemant Agrawal 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
474a1173d55SHemant Agrawal 		{.sym = {
475a1173d55SHemant Agrawal 			.xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
476a1173d55SHemant Agrawal 			{.cipher = {
477a1173d55SHemant Agrawal 				.algo = RTE_CRYPTO_CIPHER_AES_CTR,
478a1173d55SHemant Agrawal 				.block_size = 16,
479a1173d55SHemant Agrawal 				.key_size = {
480a1173d55SHemant Agrawal 					.min = 16,
481a1173d55SHemant Agrawal 					.max = 32,
482a1173d55SHemant Agrawal 					.increment = 8
483a1173d55SHemant Agrawal 				},
484a1173d55SHemant Agrawal 				.iv_size = {
485a1173d55SHemant Agrawal 					.min = 16,
486a1173d55SHemant Agrawal 					.max = 16,
487a1173d55SHemant Agrawal 					.increment = 0
488a1173d55SHemant Agrawal 				}
489a1173d55SHemant Agrawal 			}, }
490a1173d55SHemant Agrawal 		}, }
491a1173d55SHemant Agrawal 	},
492a1173d55SHemant Agrawal 	{	/* NULL (AUTH) */
493a1173d55SHemant Agrawal 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
494a1173d55SHemant Agrawal 		{.sym = {
495a1173d55SHemant Agrawal 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
496a1173d55SHemant Agrawal 			{.auth = {
497a1173d55SHemant Agrawal 				.algo = RTE_CRYPTO_AUTH_NULL,
498a1173d55SHemant Agrawal 				.block_size = 1,
499a1173d55SHemant Agrawal 				.key_size = {
500a1173d55SHemant Agrawal 					.min = 0,
501a1173d55SHemant Agrawal 					.max = 0,
502a1173d55SHemant Agrawal 					.increment = 0
503a1173d55SHemant Agrawal 				},
504a1173d55SHemant Agrawal 				.digest_size = {
505a1173d55SHemant Agrawal 					.min = 0,
506a1173d55SHemant Agrawal 					.max = 0,
507a1173d55SHemant Agrawal 					.increment = 0
508a1173d55SHemant Agrawal 				},
509a1173d55SHemant Agrawal 				.iv_size = { 0 }
510a1173d55SHemant Agrawal 			}, },
511a1173d55SHemant Agrawal 		}, },
512a1173d55SHemant Agrawal 	},
513a1173d55SHemant Agrawal 	{	/* NULL (CIPHER) */
514a1173d55SHemant Agrawal 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
515a1173d55SHemant Agrawal 		{.sym = {
516a1173d55SHemant Agrawal 			.xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
517a1173d55SHemant Agrawal 			{.cipher = {
518a1173d55SHemant Agrawal 				.algo = RTE_CRYPTO_CIPHER_NULL,
519a1173d55SHemant Agrawal 				.block_size = 1,
520a1173d55SHemant Agrawal 				.key_size = {
521a1173d55SHemant Agrawal 					.min = 0,
522a1173d55SHemant Agrawal 					.max = 0,
523a1173d55SHemant Agrawal 					.increment = 0
524a1173d55SHemant Agrawal 				},
525a1173d55SHemant Agrawal 				.iv_size = {
526a1173d55SHemant Agrawal 					.min = 0,
527a1173d55SHemant Agrawal 					.max = 0,
528a1173d55SHemant Agrawal 					.increment = 0
529a1173d55SHemant Agrawal 				}
530a1173d55SHemant Agrawal 			}, },
531a1173d55SHemant Agrawal 		}, }
532a1173d55SHemant Agrawal 	},
533a1173d55SHemant Agrawal 	{	/* ZUC (EEA3) */
534a1173d55SHemant Agrawal 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
535a1173d55SHemant Agrawal 		{.sym = {
536a1173d55SHemant Agrawal 			.xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
537a1173d55SHemant Agrawal 			{.cipher = {
538a1173d55SHemant Agrawal 				.algo = RTE_CRYPTO_CIPHER_ZUC_EEA3,
539a1173d55SHemant Agrawal 				.block_size = 16,
540a1173d55SHemant Agrawal 				.key_size = {
541a1173d55SHemant Agrawal 					.min = 16,
542a1173d55SHemant Agrawal 					.max = 16,
543a1173d55SHemant Agrawal 					.increment = 0
544a1173d55SHemant Agrawal 				},
545a1173d55SHemant Agrawal 				.iv_size = {
546a1173d55SHemant Agrawal 					.min = 16,
547a1173d55SHemant Agrawal 					.max = 16,
548a1173d55SHemant Agrawal 					.increment = 0
549a1173d55SHemant Agrawal 				}
550a1173d55SHemant Agrawal 			}, }
551a1173d55SHemant Agrawal 		}, }
552a1173d55SHemant Agrawal 	},
553a1173d55SHemant Agrawal 	{	/* ZUC (EIA3) */
554a1173d55SHemant Agrawal 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
555a1173d55SHemant Agrawal 		{.sym = {
556a1173d55SHemant Agrawal 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
557a1173d55SHemant Agrawal 			{.auth = {
558a1173d55SHemant Agrawal 				.algo = RTE_CRYPTO_AUTH_ZUC_EIA3,
559a1173d55SHemant Agrawal 				.block_size = 16,
560a1173d55SHemant Agrawal 				.key_size = {
561a1173d55SHemant Agrawal 					.min = 16,
562a1173d55SHemant Agrawal 					.max = 16,
563a1173d55SHemant Agrawal 					.increment = 0
564a1173d55SHemant Agrawal 				},
565a1173d55SHemant Agrawal 				.digest_size = {
566a1173d55SHemant Agrawal 					.min = 4,
567a1173d55SHemant Agrawal 					.max = 4,
568a1173d55SHemant Agrawal 					.increment = 0
569a1173d55SHemant Agrawal 				},
570a1173d55SHemant Agrawal 				.iv_size = {
571a1173d55SHemant Agrawal 					.min = 16,
572a1173d55SHemant Agrawal 					.max = 16,
573a1173d55SHemant Agrawal 					.increment = 0
574a1173d55SHemant Agrawal 				}
575a1173d55SHemant Agrawal 			}, }
576a1173d55SHemant Agrawal 		}, }
577a1173d55SHemant Agrawal 	},
578a1173d55SHemant Agrawal 
579a1173d55SHemant Agrawal 	RTE_CRYPTODEV_END_OF_CAPABILITIES_LIST()
580a1173d55SHemant Agrawal };
581a1173d55SHemant Agrawal 
5821f14d500SAkhil Goyal static const struct rte_security_capability dpaa_sec_security_cap[] = {
5831f14d500SAkhil Goyal 	{ /* IPsec Lookaside Protocol offload ESP Transport Egress */
5841f14d500SAkhil Goyal 		.action = RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL,
5851f14d500SAkhil Goyal 		.protocol = RTE_SECURITY_PROTOCOL_IPSEC,
5861f14d500SAkhil Goyal 		.ipsec = {
5871f14d500SAkhil Goyal 			.proto = RTE_SECURITY_IPSEC_SA_PROTO_ESP,
5881f14d500SAkhil Goyal 			.mode = RTE_SECURITY_IPSEC_SA_MODE_TUNNEL,
5891f14d500SAkhil Goyal 			.direction = RTE_SECURITY_IPSEC_SA_DIR_EGRESS,
5901f14d500SAkhil Goyal 			.options = { 0 }
5911f14d500SAkhil Goyal 		},
5921f14d500SAkhil Goyal 		.crypto_capabilities = dpaa_sec_capabilities
5931f14d500SAkhil Goyal 	},
5941f14d500SAkhil Goyal 	{ /* IPsec Lookaside Protocol offload ESP Tunnel Ingress */
5951f14d500SAkhil Goyal 		.action = RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL,
5961f14d500SAkhil Goyal 		.protocol = RTE_SECURITY_PROTOCOL_IPSEC,
5971f14d500SAkhil Goyal 		.ipsec = {
5981f14d500SAkhil Goyal 			.proto = RTE_SECURITY_IPSEC_SA_PROTO_ESP,
5991f14d500SAkhil Goyal 			.mode = RTE_SECURITY_IPSEC_SA_MODE_TUNNEL,
6001f14d500SAkhil Goyal 			.direction = RTE_SECURITY_IPSEC_SA_DIR_INGRESS,
6011f14d500SAkhil Goyal 			.options = { 0 }
6021f14d500SAkhil Goyal 		},
6031f14d500SAkhil Goyal 		.crypto_capabilities = dpaa_sec_capabilities
6041f14d500SAkhil Goyal 	},
605a1173d55SHemant Agrawal 	{ /* PDCP Lookaside Protocol offload Data */
606a1173d55SHemant Agrawal 		.action = RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL,
607a1173d55SHemant Agrawal 		.protocol = RTE_SECURITY_PROTOCOL_PDCP,
608a1173d55SHemant Agrawal 		.pdcp = {
609a1173d55SHemant Agrawal 			.domain = RTE_SECURITY_PDCP_MODE_DATA,
610a1173d55SHemant Agrawal 		},
611a1173d55SHemant Agrawal 		.crypto_capabilities = dpaa_pdcp_capabilities
612a1173d55SHemant Agrawal 	},
613a1173d55SHemant Agrawal 	{ /* PDCP Lookaside Protocol offload Control */
614a1173d55SHemant Agrawal 		.action = RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL,
615a1173d55SHemant Agrawal 		.protocol = RTE_SECURITY_PROTOCOL_PDCP,
616a1173d55SHemant Agrawal 		.pdcp = {
617a1173d55SHemant Agrawal 			.domain = RTE_SECURITY_PDCP_MODE_CONTROL,
618a1173d55SHemant Agrawal 		},
619a1173d55SHemant Agrawal 		.crypto_capabilities = dpaa_pdcp_capabilities
620a1173d55SHemant Agrawal 	},
6211f14d500SAkhil Goyal 	{
6221f14d500SAkhil Goyal 		.action = RTE_SECURITY_ACTION_TYPE_NONE
6231f14d500SAkhil Goyal 	}
6241f14d500SAkhil Goyal };
6251f14d500SAkhil Goyal 
6261f14d500SAkhil Goyal /**
6271f14d500SAkhil Goyal  * Checksum
6281f14d500SAkhil Goyal  *
6291f14d500SAkhil Goyal  * @param buffer calculate chksum for buffer
6301f14d500SAkhil Goyal  * @param len    buffer length
6311f14d500SAkhil Goyal  *
6321f14d500SAkhil Goyal  * @return checksum value in host cpu order
6331f14d500SAkhil Goyal  */
6341f14d500SAkhil Goyal static inline uint16_t
6351f14d500SAkhil Goyal calc_chksum(void *buffer, int len)
6361f14d500SAkhil Goyal {
6371f14d500SAkhil Goyal 	uint16_t *buf = (uint16_t *)buffer;
6381f14d500SAkhil Goyal 	uint32_t sum = 0;
6391f14d500SAkhil Goyal 	uint16_t result;
6401f14d500SAkhil Goyal 
6411f14d500SAkhil Goyal 	for (sum = 0; len > 1; len -= 2)
6421f14d500SAkhil Goyal 		sum += *buf++;
6431f14d500SAkhil Goyal 
6441f14d500SAkhil Goyal 	if (len == 1)
6451f14d500SAkhil Goyal 		sum += *(unsigned char *)buf;
6461f14d500SAkhil Goyal 
6471f14d500SAkhil Goyal 	sum = (sum >> 16) + (sum & 0xFFFF);
6481f14d500SAkhil Goyal 	sum += (sum >> 16);
6491f14d500SAkhil Goyal 	result = ~sum;
6501f14d500SAkhil Goyal 
6511f14d500SAkhil Goyal 	return  result;
6521f14d500SAkhil Goyal }
6531f14d500SAkhil Goyal 
654c3e85bdcSAkhil Goyal #endif /* _DPAA_SEC_H_ */
655