xref: /dpdk/drivers/crypto/dpaa_sec/dpaa_sec.h (revision 7917b0d38e92e8b9ec5a870415b791420e10f11a)
1 /* SPDX-License-Identifier: BSD-3-Clause
2  *
3  *   Copyright 2016-2023 NXP
4  *
5  */
6 
7 #ifndef _DPAA_SEC_H_
8 #define _DPAA_SEC_H_
9 
10 #define CRYPTODEV_NAME_DPAA_SEC_PMD	crypto_dpaa_sec
11 /**< NXP DPAA - SEC PMD device name */
12 
13 #define SEC_BASE_ADDR		0x1700000
14 #define MAP_SIZE		0x100000
15 #define BLOCK_OFFSET		0x10000
16 #define CMD_REG			0x4
17 #define QICTL_DQEN		0x01
18 #define QI_BLOCK_NUMBER		7
19 #define MAX_DPAA_CORES		4
20 #define NUM_POOL_CHANNELS	4
21 #define DPAA_SEC_BURST		7
22 #define DPAA_SEC_ALG_UNSUPPORT	(-1)
23 #define TDES_CBC_IV_LEN		8
24 #define AES_CBC_IV_LEN		16
25 #define AES_CTR_IV_LEN		16
26 #define AES_GCM_IV_LEN		12
27 
28 extern uint8_t dpaa_cryptodev_driver_id;
29 
30 #define DPAA_IPv6_DEFAULT_VTC_FLOW	0x60000000
31 
32 /* Minimum job descriptor consists of a oneword job descriptor HEADER and
33  * a pointer to the shared descriptor.
34  */
35 #define MIN_JOB_DESC_SIZE	(CAAM_CMD_SZ + CAAM_PTR_SZ)
36 /* CTX_POOL_NUM_BUFS is set as per the ipsec-secgw application */
37 #define CTX_POOL_NUM_BUFS	32000
38 #define CTX_POOL_BUF_SIZE	sizeof(struct dpaa_sec_op_ctx)
39 #define CTX_POOL_CACHE_SIZE	512
40 #define RTE_DPAA_SEC_PMD_MAX_NB_SESSIONS 1024
41 
42 #define DIR_ENC                 1
43 #define DIR_DEC                 0
44 
45 enum dpaa_sec_op_type {
46 	DPAA_SEC_NONE,  /*!< No Cipher operations*/
47 	DPAA_SEC_CIPHER,/*!< CIPHER operations */
48 	DPAA_SEC_AUTH,  /*!< Authentication Operations */
49 	DPAA_SEC_AEAD,  /*!< AEAD (AES-GCM/CCM) type operations */
50 	DPAA_SEC_CIPHER_HASH,  /*!< Authenticated Encryption with
51 				* associated data
52 				*/
53 	DPAA_SEC_HASH_CIPHER,  /*!< Encryption with Authenticated
54 				* associated data
55 				*/
56 	DPAA_SEC_IPSEC, /*!< IPSEC protocol operations*/
57 	DPAA_SEC_PDCP,  /*!< PDCP protocol operations*/
58 	DPAA_SEC_PKC,   /*!< Public Key Cryptographic Operations */
59 	DPAA_SEC_MAX
60 };
61 
62 #define DPAA_SEC_MAX_DESC_SIZE  64
63 /* code or cmd block to caam */
64 struct sec_cdb {
65 	struct {
66 		union {
67 			uint32_t word;
68 			struct {
69 #if RTE_BYTE_ORDER == RTE_BIG_ENDIAN
70 				uint16_t rsvd63_48;
71 				unsigned int rsvd47_39:9;
72 				unsigned int idlen:7;
73 #else
74 				unsigned int idlen:7;
75 				unsigned int rsvd47_39:9;
76 				uint16_t rsvd63_48;
77 #endif
78 			} field;
79 		} __packed hi;
80 
81 		union {
82 			uint32_t word;
83 			struct {
84 #if RTE_BYTE_ORDER == RTE_BIG_ENDIAN
85 				unsigned int rsvd31_30:2;
86 				unsigned int fsgt:1;
87 				unsigned int lng:1;
88 				unsigned int offset:2;
89 				unsigned int abs:1;
90 				unsigned int add_buf:1;
91 				uint8_t pool_id;
92 				uint16_t pool_buffer_size;
93 #else
94 				uint16_t pool_buffer_size;
95 				uint8_t pool_id;
96 				unsigned int add_buf:1;
97 				unsigned int abs:1;
98 				unsigned int offset:2;
99 				unsigned int lng:1;
100 				unsigned int fsgt:1;
101 				unsigned int rsvd31_30:2;
102 #endif
103 			} field;
104 		} __packed lo;
105 	} __packed sh_hdr;
106 
107 	uint32_t sh_desc[DPAA_SEC_MAX_DESC_SIZE];
108 };
109 
110 /*!
111  * The structure is to be filled by user as a part of
112  * dpaa_sec_proto_ctxt for PDCP Protocol
113  */
114 struct sec_pdcp_ctxt {
115 	enum rte_security_pdcp_domain domain; /*!< Data/Control mode*/
116 	int8_t bearer;	/*!< PDCP bearer ID */
117 	int8_t pkt_dir;/*!< PDCP Frame Direction 0:UL 1:DL*/
118 	int8_t hfn_ovd;/*!< Overwrite HFN per packet*/
119 	uint8_t sn_size;	/*!< Sequence number size, 5/7/12/15/18 */
120 	uint8_t sdap_enabled;	/*!< SDAP header is enabled */
121 	uint16_t hfn_ovd_offset;/*!< offset from rte_crypto_op at which
122 				 * per packet hfn is stored
123 				 */
124 	uint32_t hfn;	/*!< Hyper Frame Number */
125 	uint32_t hfn_threshold;	/*!< HFN Threashold for key renegotiation */
126 };
127 
128 typedef int (*dpaa_sec_build_fd_t)(
129 	void *qp, uint8_t *drv_ctx, struct rte_crypto_vec *data_vec,
130 	uint16_t n_data_vecs, union rte_crypto_sym_ofs ofs,
131 	struct rte_crypto_va_iova_ptr *iv,
132 	struct rte_crypto_va_iova_ptr *digest,
133 	struct rte_crypto_va_iova_ptr *aad_or_auth_iv,
134 	void *user_data);
135 
136 typedef struct dpaa_sec_job* (*dpaa_sec_build_raw_dp_fd_t)(uint8_t *drv_ctx,
137 			struct rte_crypto_sgl *sgl,
138 			struct rte_crypto_sgl *dest_sgl,
139 			struct rte_crypto_va_iova_ptr *iv,
140 			struct rte_crypto_va_iova_ptr *digest,
141 			struct rte_crypto_va_iova_ptr *auth_iv,
142 			union rte_crypto_sym_ofs ofs,
143 			void *userdata,
144 			struct qm_fd *fd);
145 
146 typedef struct dpaa_sec_session_entry {
147 	struct sec_cdb cdb;	/**< cmd block associated with qp */
148 	struct dpaa_sec_qp *qp[MAX_DPAA_CORES];
149 	struct qman_fq *inq[MAX_DPAA_CORES];
150 	uint8_t dir;         /*!< Operation Direction */
151 	uint8_t ctxt;	/*!< Session Context Type */
152 	enum rte_crypto_cipher_algorithm cipher_alg; /*!< Cipher Algorithm*/
153 	enum rte_crypto_auth_algorithm auth_alg; /*!< Authentication Algorithm*/
154 	enum rte_crypto_aead_algorithm aead_alg; /*!< AEAD Algorithm*/
155 	enum rte_security_session_protocol proto_alg; /*!< Security Algorithm*/
156 	dpaa_sec_build_fd_t build_fd;
157 	dpaa_sec_build_raw_dp_fd_t build_raw_dp_fd;
158 	union {
159 		struct {
160 			uint8_t *data;	/**< pointer to key data */
161 			size_t length;	/**< key length in bytes */
162 			uint32_t alg;
163 			uint32_t algmode;
164 		} aead_key;
165 		struct {
166 			struct {
167 				uint8_t *data;	/**< pointer to key data */
168 				size_t length;	/**< key length in bytes */
169 				uint32_t alg;
170 				uint32_t algmode;
171 			} cipher_key;
172 			struct {
173 				uint8_t *data;	/**< pointer to key data */
174 				size_t length;	/**< key length in bytes */
175 				uint32_t alg;
176 				uint32_t algmode;
177 			} auth_key;
178 		};
179 	};
180 	union {
181 		struct {
182 			struct {
183 				uint16_t length;
184 				uint16_t offset;
185 			} iv;	/**< Initialisation vector parameters */
186 			uint16_t auth_only_len;
187 					/*!< Length of data for Auth only */
188 			uint32_t digest_length;
189 			struct ipsec_decap_pdb decap_pdb;
190 			struct ipsec_encap_pdb encap_pdb;
191 			union {
192 				struct ip ip4_hdr;
193 				struct rte_ipv6_hdr ip6_hdr;
194 			};
195 			uint8_t auth_cipher_text;
196 				/**< Authenticate/cipher ordering */
197 		};
198 		struct sec_pdcp_ctxt pdcp;
199 	};
200 } dpaa_sec_session;
201 
202 struct dpaa_sec_qp {
203 	struct dpaa_sec_dev_private *internals;
204 	struct rte_mempool *ctx_pool; /* mempool for dpaa_sec_op_ctx */
205 	struct qman_fq outq;
206 	int rx_pkts;
207 	int rx_errs;
208 	int tx_pkts;
209 	int tx_errs;
210 };
211 
212 #define RTE_DPAA_MAX_NB_SEC_QPS 2
213 #define RTE_DPAA_MAX_RX_QUEUE (MAX_DPAA_CORES * RTE_DPAA_SEC_PMD_MAX_NB_SESSIONS)
214 #define DPAA_MAX_DEQUEUE_NUM_FRAMES 63
215 
216 /* internal sec queue interface */
217 struct dpaa_sec_dev_private {
218 	void *sec_hw;
219 	struct dpaa_sec_qp qps[RTE_DPAA_MAX_NB_SEC_QPS]; /* i/o queue for sec */
220 	struct qman_fq inq[RTE_DPAA_MAX_RX_QUEUE];
221 	unsigned char inq_attach[RTE_DPAA_MAX_RX_QUEUE];
222 	unsigned int max_nb_queue_pairs;
223 	unsigned int max_nb_sessions;
224 	rte_spinlock_t lock;
225 };
226 
227 #define MAX_SG_ENTRIES		16
228 #define MAX_JOB_SG_ENTRIES	36
229 
230 struct dpaa_sec_job {
231 	/* sg[0] output, sg[1] input, others are possible sub frames */
232 	struct qm_sg_entry sg[MAX_JOB_SG_ENTRIES];
233 };
234 
235 #define DPAA_MAX_NB_MAX_DIGEST	64
236 struct dpaa_sec_op_ctx {
237 	struct dpaa_sec_job job;
238 	union {
239 		struct rte_crypto_op *op;
240 		void *userdata;
241 	};
242 	struct rte_mempool *ctx_pool; /* mempool pointer for dpaa_sec_op_ctx */
243 	uint32_t fd_status;
244 	int64_t vtop_offset;
245 	uint8_t digest[DPAA_MAX_NB_MAX_DIGEST];
246 };
247 
248 static const struct rte_cryptodev_capabilities dpaa_sec_capabilities[] = {
249 	{	/* NULL (AUTH) */
250 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
251 		{.sym = {
252 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
253 			{.auth = {
254 				.algo = RTE_CRYPTO_AUTH_NULL,
255 				.block_size = 1,
256 				.key_size = {
257 					.min = 0,
258 					.max = 0,
259 					.increment = 0
260 				},
261 				.digest_size = {
262 					.min = 0,
263 					.max = 0,
264 					.increment = 0
265 				},
266 				.iv_size = { 0 }
267 			}, },
268 		}, },
269 	},
270 	{       /* MD5 */
271 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
272 		{.sym = {
273 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
274 			{.auth = {
275 				.algo = RTE_CRYPTO_AUTH_MD5,
276 				.block_size = 64,
277 				.key_size = {
278 					.min = 0,
279 					.max = 0,
280 					.increment = 0
281 				},
282 				.digest_size = {
283 					.min = 16,
284 					.max = 16,
285 					.increment = 0
286 				},
287 				.iv_size = { 0 }
288 			}, }
289 		}, }
290 	},
291 	{	/* MD5 HMAC */
292 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
293 		{.sym = {
294 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
295 			{.auth = {
296 				.algo = RTE_CRYPTO_AUTH_MD5_HMAC,
297 				.block_size = 64,
298 				.key_size = {
299 					.min = 1,
300 					.max = 64,
301 					.increment = 1
302 				},
303 				.digest_size = {
304 					.min = 1,
305 					.max = 16,
306 					.increment = 1
307 				},
308 				.iv_size = { 0 }
309 			}, }
310 		}, }
311 	},
312 	{	/* SHA1 */
313 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
314 		{.sym = {
315 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
316 			{.auth = {
317 				.algo = RTE_CRYPTO_AUTH_SHA1,
318 				.block_size = 64,
319 				.key_size = {
320 					.min = 0,
321 					.max = 0,
322 					.increment = 0
323 				},
324 				.digest_size = {
325 					.min = 20,
326 					.max = 20,
327 					.increment = 0
328 				},
329 				.iv_size = { 0 }
330 			}, }
331 		}, }
332 	},
333 	{	/* SHA1 HMAC */
334 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
335 		{.sym = {
336 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
337 			{.auth = {
338 				.algo = RTE_CRYPTO_AUTH_SHA1_HMAC,
339 				.block_size = 64,
340 				.key_size = {
341 					.min = 1,
342 					.max = 64,
343 					.increment = 1
344 				},
345 				.digest_size = {
346 					.min = 1,
347 					.max = 20,
348 					.increment = 1
349 				},
350 				.iv_size = { 0 }
351 			}, }
352 		}, }
353 	},
354 	{	/* SHA224 */
355 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
356 		{.sym = {
357 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
358 			{.auth = {
359 				.algo = RTE_CRYPTO_AUTH_SHA224,
360 				.block_size = 64,
361 					.key_size = {
362 					.min = 0,
363 					.max = 0,
364 					.increment = 0
365 				},
366 				.digest_size = {
367 					.min = 28,
368 					.max = 28,
369 					.increment = 0
370 				},
371 				.iv_size = { 0 }
372 			}, }
373 		}, }
374 	},
375 	{	/* SHA224 HMAC */
376 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
377 		{.sym = {
378 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
379 			{.auth = {
380 				.algo = RTE_CRYPTO_AUTH_SHA224_HMAC,
381 				.block_size = 64,
382 				.key_size = {
383 					.min = 1,
384 					.max = 64,
385 					.increment = 1
386 				},
387 				.digest_size = {
388 					.min = 1,
389 					.max = 28,
390 					.increment = 1
391 				},
392 				.iv_size = { 0 }
393 			}, }
394 		}, }
395 	},
396 	{	/* SHA256 */
397 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
398 		{.sym = {
399 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
400 			{.auth = {
401 				.algo = RTE_CRYPTO_AUTH_SHA256,
402 				.block_size = 64,
403 				.key_size = {
404 					.min = 0,
405 					.max = 0,
406 					.increment = 0
407 				},
408 				.digest_size = {
409 					.min = 32,
410 					.max = 32,
411 					.increment = 0
412 				},
413 				.iv_size = { 0 }
414 			}, }
415 		}, }
416 	},
417 	{	/* SHA256 HMAC */
418 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
419 		{.sym = {
420 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
421 			{.auth = {
422 				.algo = RTE_CRYPTO_AUTH_SHA256_HMAC,
423 				.block_size = 64,
424 				.key_size = {
425 					.min = 1,
426 					.max = 64,
427 					.increment = 1
428 				},
429 				.digest_size = {
430 					.min = 1,
431 					.max = 32,
432 					.increment = 1
433 				},
434 				.iv_size = { 0 }
435 			}, }
436 		}, }
437 	},
438 	{	/* SHA384 */
439 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
440 		{.sym = {
441 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
442 			{.auth = {
443 				.algo = RTE_CRYPTO_AUTH_SHA384,
444 				.block_size = 64,
445 				.key_size = {
446 					.min = 0,
447 					.max = 0,
448 					.increment = 0
449 				},
450 				.digest_size = {
451 					.min = 48,
452 					.max = 48,
453 					.increment = 0
454 					},
455 				.iv_size = { 0 }
456 			}, }
457 		}, }
458 	},
459 	{	/* SHA384 HMAC */
460 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
461 		{.sym = {
462 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
463 			{.auth = {
464 				.algo = RTE_CRYPTO_AUTH_SHA384_HMAC,
465 				.block_size = 128,
466 				.key_size = {
467 					.min = 1,
468 					.max = 128,
469 					.increment = 1
470 				},
471 				.digest_size = {
472 					.min = 1,
473 					.max = 48,
474 					.increment = 1
475 				},
476 				.iv_size = { 0 }
477 			}, }
478 		}, }
479 	},
480 	{	/* SHA512 */
481 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
482 		{.sym = {
483 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
484 			{.auth = {
485 				.algo = RTE_CRYPTO_AUTH_SHA512,
486 				.block_size = 128,
487 				.key_size = {
488 					.min = 0,
489 					.max = 0,
490 					.increment = 0
491 				},
492 				.digest_size = {
493 					.min = 64,
494 					.max = 64,
495 					.increment = 0
496 				},
497 				.iv_size = { 0 }
498 			}, }
499 		}, }
500 	},
501 	{	/* SHA512 HMAC */
502 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
503 		{.sym = {
504 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
505 			{.auth = {
506 				.algo = RTE_CRYPTO_AUTH_SHA512_HMAC,
507 				.block_size = 128,
508 				.key_size = {
509 					.min = 1,
510 					.max = 128,
511 					.increment = 1
512 				},
513 				.digest_size = {
514 					.min = 1,
515 					.max = 64,
516 					.increment = 1
517 				},
518 				.iv_size = { 0 }
519 			}, }
520 		}, }
521 	},
522 	{	/* AES GCM */
523 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
524 		{.sym = {
525 			.xform_type = RTE_CRYPTO_SYM_XFORM_AEAD,
526 			{.aead = {
527 				.algo = RTE_CRYPTO_AEAD_AES_GCM,
528 				.block_size = 16,
529 				.key_size = {
530 					.min = 16,
531 					.max = 32,
532 					.increment = 8
533 				},
534 				.digest_size = {
535 					.min = 8,
536 					.max = 16,
537 					.increment = 4
538 				},
539 				.aad_size = {
540 					.min = 0,
541 					.max = 240,
542 					.increment = 1
543 				},
544 				.iv_size = {
545 					.min = 12,
546 					.max = 12,
547 					.increment = 0
548 				},
549 			}, }
550 		}, }
551 	},
552 	{	/* NULL (CIPHER) */
553 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
554 		{.sym = {
555 			.xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
556 			{.cipher = {
557 				.algo = RTE_CRYPTO_CIPHER_NULL,
558 				.block_size = 1,
559 				.key_size = {
560 					.min = 0,
561 					.max = 0,
562 					.increment = 0
563 				},
564 				.iv_size = {
565 					.min = 0,
566 					.max = 0,
567 					.increment = 0
568 				}
569 			}, },
570 		}, }
571 	},
572 	{	/* AES CBC */
573 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
574 		{.sym = {
575 			.xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
576 			{.cipher = {
577 				.algo = RTE_CRYPTO_CIPHER_AES_CBC,
578 				.block_size = 16,
579 				.key_size = {
580 					.min = 16,
581 					.max = 32,
582 					.increment = 8
583 				},
584 				.iv_size = {
585 					.min = 16,
586 					.max = 16,
587 					.increment = 0
588 				}
589 			}, }
590 		}, }
591 	},
592 	{	/* AES CTR */
593 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
594 		{.sym = {
595 			.xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
596 			{.cipher = {
597 				.algo = RTE_CRYPTO_CIPHER_AES_CTR,
598 				.block_size = 16,
599 				.key_size = {
600 					.min = 16,
601 					.max = 32,
602 					.increment = 8
603 				},
604 				.iv_size = {
605 					.min = 16,
606 					.max = 16,
607 					.increment = 0
608 				},
609 			}, }
610 		}, }
611 	},
612 	{       /* DES CBC */
613 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
614 		{.sym = {
615 			.xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
616 			{.cipher = {
617 				.algo = RTE_CRYPTO_CIPHER_DES_CBC,
618 				.block_size = 8,
619 				.key_size = {
620 					.min = 8,
621 					.max = 8,
622 					.increment = 0
623 				},
624 				.iv_size = {
625 					.min = 8,
626 					.max = 8,
627 					.increment = 0
628 				}
629 			}, }
630 		}, }
631 	},
632 	{	/* 3DES CBC */
633 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
634 		{.sym = {
635 			.xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
636 			{.cipher = {
637 				.algo = RTE_CRYPTO_CIPHER_3DES_CBC,
638 				.block_size = 8,
639 				.key_size = {
640 					.min = 16,
641 					.max = 24,
642 					.increment = 8
643 				},
644 				.iv_size = {
645 					.min = 8,
646 					.max = 8,
647 					.increment = 0
648 				}
649 			}, }
650 		}, }
651 	},
652 	{	/* SNOW 3G (UIA2) */
653 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
654 		{.sym = {
655 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
656 			{.auth = {
657 				.algo = RTE_CRYPTO_AUTH_SNOW3G_UIA2,
658 				.block_size = 16,
659 				.key_size = {
660 					.min = 16,
661 					.max = 16,
662 					.increment = 0
663 				},
664 				.digest_size = {
665 					.min = 4,
666 					.max = 4,
667 					.increment = 0
668 				},
669 				.iv_size = {
670 					.min = 16,
671 					.max = 16,
672 					.increment = 0
673 				}
674 			}, }
675 		}, }
676 	},
677 	{	/* SNOW 3G (UEA2) */
678 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
679 		{.sym = {
680 			.xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
681 			{.cipher = {
682 				.algo = RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
683 				.block_size = 16,
684 				.key_size = {
685 					.min = 16,
686 					.max = 16,
687 					.increment = 0
688 				},
689 				.iv_size = {
690 					.min = 16,
691 					.max = 16,
692 					.increment = 0
693 				}
694 			}, }
695 		}, }
696 	},
697 	{	/* ZUC (EEA3) */
698 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
699 		{.sym = {
700 			.xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
701 			{.cipher = {
702 				.algo = RTE_CRYPTO_CIPHER_ZUC_EEA3,
703 				.block_size = 16,
704 				.key_size = {
705 					.min = 16,
706 					.max = 16,
707 					.increment = 0
708 				},
709 				.iv_size = {
710 					.min = 16,
711 					.max = 16,
712 					.increment = 0
713 				}
714 			}, }
715 		}, }
716 	},
717 	{	/* ZUC (EIA3) */
718 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
719 		{.sym = {
720 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
721 			{.auth = {
722 				.algo = RTE_CRYPTO_AUTH_ZUC_EIA3,
723 				.block_size = 16,
724 				.key_size = {
725 					.min = 16,
726 					.max = 16,
727 					.increment = 0
728 				},
729 				.digest_size = {
730 					.min = 4,
731 					.max = 4,
732 					.increment = 0
733 				},
734 				.iv_size = {
735 					.min = 16,
736 					.max = 16,
737 					.increment = 0
738 				}
739 			}, }
740 		}, }
741 	},
742 	{       /* AES CMAC */
743 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
744 		{.sym = {
745 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
746 			{.auth = {
747 				.algo = RTE_CRYPTO_AUTH_AES_CMAC,
748 				.block_size = 16,
749 				.key_size = {
750 					.min = 1,
751 					.max = 16,
752 					.increment = 1
753 				},
754 				.digest_size = {
755 					.min = 12,
756 					.max = 16,
757 					.increment = 4
758 				},
759 				.iv_size = { 0 }
760 			}, }
761 		}, }
762 	},
763 	{       /* AES XCBC HMAC */
764 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
765 		{.sym = {
766 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
767 			{.auth = {
768 				.algo = RTE_CRYPTO_AUTH_AES_XCBC_MAC,
769 				.block_size = 16,
770 				.key_size = {
771 					.min = 1,
772 					.max = 16,
773 					.increment = 1
774 				},
775 				.digest_size = {
776 					.min = 12,
777 					.max = 16,
778 					.increment = 4
779 				},
780 				.aad_size = { 0 },
781 				.iv_size = { 0 }
782 			}, }
783 		}, }
784 	},
785 	{	/* NULL (AUTH) */
786 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
787 		{.sym = {
788 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
789 			{.auth = {
790 				.algo = RTE_CRYPTO_AUTH_NULL,
791 				.block_size = 1,
792 				.key_size = {
793 					.min = 0,
794 					.max = 0,
795 					.increment = 0
796 				},
797 				.digest_size = {
798 					.min = 0,
799 					.max = 0,
800 					.increment = 0
801 				},
802 			}, },
803 		}, },
804 	},
805 	{	/* NULL (CIPHER) */
806 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
807 		{.sym = {
808 			.xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
809 			{.cipher = {
810 				.algo = RTE_CRYPTO_CIPHER_NULL,
811 				.block_size = 1,
812 				.key_size = {
813 					.min = 0,
814 					.max = 0,
815 					.increment = 0
816 				},
817 				.iv_size = {
818 					.min = 0,
819 					.max = 0,
820 					.increment = 0
821 				}
822 			}, },
823 		}, }
824 	},
825 	RTE_CRYPTODEV_END_OF_CAPABILITIES_LIST()
826 };
827 
828 static const struct rte_cryptodev_capabilities dpaa_pdcp_capabilities[] = {
829 	{	/* SNOW 3G (UIA2) */
830 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
831 		{.sym = {
832 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
833 			{.auth = {
834 				.algo = RTE_CRYPTO_AUTH_SNOW3G_UIA2,
835 				.block_size = 16,
836 				.key_size = {
837 					.min = 16,
838 					.max = 16,
839 					.increment = 0
840 				},
841 				.digest_size = {
842 					.min = 4,
843 					.max = 4,
844 					.increment = 0
845 				},
846 				.iv_size = {
847 					.min = 16,
848 					.max = 16,
849 					.increment = 0
850 				}
851 			}, }
852 		}, }
853 	},
854 	{	/* SNOW 3G (UEA2) */
855 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
856 		{.sym = {
857 			.xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
858 			{.cipher = {
859 				.algo = RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
860 				.block_size = 16,
861 				.key_size = {
862 					.min = 16,
863 					.max = 16,
864 					.increment = 0
865 				},
866 				.iv_size = {
867 					.min = 16,
868 					.max = 16,
869 					.increment = 0
870 				}
871 			}, }
872 		}, }
873 	},
874 	{	/* AES CTR */
875 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
876 		{.sym = {
877 			.xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
878 			{.cipher = {
879 				.algo = RTE_CRYPTO_CIPHER_AES_CTR,
880 				.block_size = 16,
881 				.key_size = {
882 					.min = 16,
883 					.max = 32,
884 					.increment = 8
885 				},
886 				.iv_size = {
887 					.min = 16,
888 					.max = 16,
889 					.increment = 0
890 				}
891 			}, }
892 		}, }
893 	},
894 	{	/* NULL (AUTH) */
895 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
896 		{.sym = {
897 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
898 			{.auth = {
899 				.algo = RTE_CRYPTO_AUTH_NULL,
900 				.block_size = 1,
901 				.key_size = {
902 					.min = 0,
903 					.max = 0,
904 					.increment = 0
905 				},
906 				.digest_size = {
907 					.min = 0,
908 					.max = 0,
909 					.increment = 0
910 				},
911 				.iv_size = { 0 }
912 			}, },
913 		}, },
914 	},
915 	{	/* NULL (CIPHER) */
916 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
917 		{.sym = {
918 			.xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
919 			{.cipher = {
920 				.algo = RTE_CRYPTO_CIPHER_NULL,
921 				.block_size = 1,
922 				.key_size = {
923 					.min = 0,
924 					.max = 0,
925 					.increment = 0
926 				},
927 				.iv_size = {
928 					.min = 0,
929 					.max = 0,
930 					.increment = 0
931 				}
932 			}, },
933 		}, }
934 	},
935 	{	/* ZUC (EEA3) */
936 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
937 		{.sym = {
938 			.xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
939 			{.cipher = {
940 				.algo = RTE_CRYPTO_CIPHER_ZUC_EEA3,
941 				.block_size = 16,
942 				.key_size = {
943 					.min = 16,
944 					.max = 16,
945 					.increment = 0
946 				},
947 				.iv_size = {
948 					.min = 16,
949 					.max = 16,
950 					.increment = 0
951 				}
952 			}, }
953 		}, }
954 	},
955 	{	/* ZUC (EIA3) */
956 		.op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
957 		{.sym = {
958 			.xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
959 			{.auth = {
960 				.algo = RTE_CRYPTO_AUTH_ZUC_EIA3,
961 				.block_size = 16,
962 				.key_size = {
963 					.min = 16,
964 					.max = 16,
965 					.increment = 0
966 				},
967 				.digest_size = {
968 					.min = 4,
969 					.max = 4,
970 					.increment = 0
971 				},
972 				.iv_size = {
973 					.min = 16,
974 					.max = 16,
975 					.increment = 0
976 				}
977 			}, }
978 		}, }
979 	},
980 
981 	RTE_CRYPTODEV_END_OF_CAPABILITIES_LIST()
982 };
983 
984 static const struct rte_security_capability dpaa_sec_security_cap[] = {
985 	{ /* IPsec Lookaside Protocol offload ESP Transport Egress */
986 		.action = RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL,
987 		.protocol = RTE_SECURITY_PROTOCOL_IPSEC,
988 		.ipsec = {
989 			.proto = RTE_SECURITY_IPSEC_SA_PROTO_ESP,
990 			.mode = RTE_SECURITY_IPSEC_SA_MODE_TUNNEL,
991 			.direction = RTE_SECURITY_IPSEC_SA_DIR_EGRESS,
992 			.options = { 0 },
993 			.replay_win_sz_max = 128
994 		},
995 		.crypto_capabilities = dpaa_sec_capabilities
996 	},
997 	{ /* IPsec Lookaside Protocol offload ESP Tunnel Ingress */
998 		.action = RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL,
999 		.protocol = RTE_SECURITY_PROTOCOL_IPSEC,
1000 		.ipsec = {
1001 			.proto = RTE_SECURITY_IPSEC_SA_PROTO_ESP,
1002 			.mode = RTE_SECURITY_IPSEC_SA_MODE_TUNNEL,
1003 			.direction = RTE_SECURITY_IPSEC_SA_DIR_INGRESS,
1004 			.options = { 0 },
1005 			.replay_win_sz_max = 128
1006 		},
1007 		.crypto_capabilities = dpaa_sec_capabilities
1008 	},
1009 	{ /* PDCP Lookaside Protocol offload Data */
1010 		.action = RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL,
1011 		.protocol = RTE_SECURITY_PROTOCOL_PDCP,
1012 		.pdcp = {
1013 			.domain = RTE_SECURITY_PDCP_MODE_DATA,
1014 			.capa_flags = 0
1015 		},
1016 		.crypto_capabilities = dpaa_pdcp_capabilities
1017 	},
1018 	{ /* PDCP Lookaside Protocol offload Control */
1019 		.action = RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL,
1020 		.protocol = RTE_SECURITY_PROTOCOL_PDCP,
1021 		.pdcp = {
1022 			.domain = RTE_SECURITY_PDCP_MODE_CONTROL,
1023 			.capa_flags = 0
1024 		},
1025 		.crypto_capabilities = dpaa_pdcp_capabilities
1026 	},
1027 	{ /* PDCP Lookaside Protocol offload Short MAC */
1028 		.action = RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL,
1029 		.protocol = RTE_SECURITY_PROTOCOL_PDCP,
1030 		.pdcp = {
1031 			.domain = RTE_SECURITY_PDCP_MODE_SHORT_MAC,
1032 			.capa_flags = 0
1033 		},
1034 		.crypto_capabilities = dpaa_pdcp_capabilities
1035 	},
1036 	{
1037 		.action = RTE_SECURITY_ACTION_TYPE_NONE
1038 	}
1039 };
1040 
1041 /**
1042  * Checksum
1043  *
1044  * @param buffer calculate chksum for buffer
1045  * @param len    buffer length
1046  *
1047  * @return checksum value in host cpu order
1048  */
1049 static inline uint16_t
1050 calc_chksum(void *buffer, int len)
1051 {
1052 	uint16_t *buf = (uint16_t *)buffer;
1053 	uint32_t sum = 0;
1054 	uint16_t result;
1055 
1056 	for (sum = 0; len > 1; len -= 2)
1057 		sum += *buf++;
1058 
1059 	if (len == 1)
1060 		sum += *(unsigned char *)buf;
1061 
1062 	sum = (sum >> 16) + (sum & 0xFFFF);
1063 	sum += (sum >> 16);
1064 	result = ~sum;
1065 
1066 	return  result;
1067 }
1068 
1069 int
1070 dpaa_sec_configure_raw_dp_ctx(struct rte_cryptodev *dev, uint16_t qp_id,
1071 	struct rte_crypto_raw_dp_ctx *raw_dp_ctx,
1072 	enum rte_crypto_op_sess_type sess_type,
1073 	union rte_cryptodev_session_ctx session_ctx, uint8_t is_update);
1074 
1075 int
1076 dpaa_sec_get_dp_ctx_size(struct rte_cryptodev *dev);
1077 
1078 int
1079 dpaa_sec_attach_sess_q(struct dpaa_sec_qp *qp, dpaa_sec_session *sess);
1080 
1081 #endif /* _DPAA_SEC_H_ */
1082