1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright (C) 2019 Marvell International Ltd.
3 */
4
5 #include <rte_cryptodev.h>
6 #include <rte_security.h>
7
8 #include "otx2_cryptodev.h"
9 #include "otx2_cryptodev_capabilities.h"
10 #include "otx2_mbox.h"
11
12 #define CPT_EGRP_GET(hw_caps, name, egrp) do { \
13 if ((hw_caps[CPT_ENG_TYPE_SE].name) && \
14 (hw_caps[CPT_ENG_TYPE_IE].name)) \
15 *egrp = OTX2_CPT_EGRP_SE_IE; \
16 else if (hw_caps[CPT_ENG_TYPE_SE].name) \
17 *egrp = OTX2_CPT_EGRP_SE; \
18 else if (hw_caps[CPT_ENG_TYPE_AE].name) \
19 *egrp = OTX2_CPT_EGRP_AE; \
20 else \
21 *egrp = OTX2_CPT_EGRP_MAX; \
22 } while (0)
23
24 #define CPT_CAPS_ADD(hw_caps, name) do { \
25 enum otx2_cpt_egrp egrp; \
26 CPT_EGRP_GET(hw_caps, name, &egrp); \
27 if (egrp < OTX2_CPT_EGRP_MAX) \
28 cpt_caps_add(caps_##name, RTE_DIM(caps_##name)); \
29 } while (0)
30
31 #define SEC_CAPS_ADD(hw_caps, name) do { \
32 enum otx2_cpt_egrp egrp; \
33 CPT_EGRP_GET(hw_caps, name, &egrp); \
34 if (egrp < OTX2_CPT_EGRP_MAX) \
35 sec_caps_add(sec_caps_##name, RTE_DIM(sec_caps_##name));\
36 } while (0)
37
38 #define OTX2_CPT_MAX_CAPS 34
39 #define OTX2_SEC_MAX_CAPS 4
40
41 static struct rte_cryptodev_capabilities otx2_cpt_caps[OTX2_CPT_MAX_CAPS];
42 static struct rte_cryptodev_capabilities otx2_cpt_sec_caps[OTX2_SEC_MAX_CAPS];
43
44 static const struct rte_cryptodev_capabilities caps_mul[] = {
45 { /* RSA */
46 .op = RTE_CRYPTO_OP_TYPE_ASYMMETRIC,
47 {.asym = {
48 .xform_capa = {
49 .xform_type = RTE_CRYPTO_ASYM_XFORM_RSA,
50 .op_types = ((1 << RTE_CRYPTO_ASYM_OP_SIGN) |
51 (1 << RTE_CRYPTO_ASYM_OP_VERIFY) |
52 (1 << RTE_CRYPTO_ASYM_OP_ENCRYPT) |
53 (1 << RTE_CRYPTO_ASYM_OP_DECRYPT)),
54 {.modlen = {
55 .min = 17,
56 .max = 1024,
57 .increment = 1
58 }, }
59 }
60 }, }
61 },
62 { /* MOD_EXP */
63 .op = RTE_CRYPTO_OP_TYPE_ASYMMETRIC,
64 {.asym = {
65 .xform_capa = {
66 .xform_type = RTE_CRYPTO_ASYM_XFORM_MODEX,
67 .op_types = 0,
68 {.modlen = {
69 .min = 17,
70 .max = 1024,
71 .increment = 1
72 }, }
73 }
74 }, }
75 },
76 { /* ECDSA */
77 .op = RTE_CRYPTO_OP_TYPE_ASYMMETRIC,
78 {.asym = {
79 .xform_capa = {
80 .xform_type = RTE_CRYPTO_ASYM_XFORM_ECDSA,
81 .op_types = ((1 << RTE_CRYPTO_ASYM_OP_SIGN) |
82 (1 << RTE_CRYPTO_ASYM_OP_VERIFY)),
83 }
84 },
85 }
86 },
87 { /* ECPM */
88 .op = RTE_CRYPTO_OP_TYPE_ASYMMETRIC,
89 {.asym = {
90 .xform_capa = {
91 .xform_type = RTE_CRYPTO_ASYM_XFORM_ECPM,
92 .op_types = 0
93 }
94 },
95 }
96 },
97 };
98
99 static const struct rte_cryptodev_capabilities caps_sha1_sha2[] = {
100 { /* SHA1 */
101 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
102 {.sym = {
103 .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
104 {.auth = {
105 .algo = RTE_CRYPTO_AUTH_SHA1,
106 .block_size = 64,
107 .key_size = {
108 .min = 0,
109 .max = 0,
110 .increment = 0
111 },
112 .digest_size = {
113 .min = 20,
114 .max = 20,
115 .increment = 0
116 },
117 }, }
118 }, }
119 },
120 { /* SHA1 HMAC */
121 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
122 {.sym = {
123 .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
124 {.auth = {
125 .algo = RTE_CRYPTO_AUTH_SHA1_HMAC,
126 .block_size = 64,
127 .key_size = {
128 .min = 1,
129 .max = 1024,
130 .increment = 1
131 },
132 .digest_size = {
133 .min = 12,
134 .max = 20,
135 .increment = 8
136 },
137 }, }
138 }, }
139 },
140 { /* SHA224 */
141 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
142 {.sym = {
143 .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
144 {.auth = {
145 .algo = RTE_CRYPTO_AUTH_SHA224,
146 .block_size = 64,
147 .key_size = {
148 .min = 0,
149 .max = 0,
150 .increment = 0
151 },
152 .digest_size = {
153 .min = 28,
154 .max = 28,
155 .increment = 0
156 },
157 }, }
158 }, }
159 },
160 { /* SHA224 HMAC */
161 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
162 {.sym = {
163 .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
164 {.auth = {
165 .algo = RTE_CRYPTO_AUTH_SHA224_HMAC,
166 .block_size = 64,
167 .key_size = {
168 .min = 1,
169 .max = 1024,
170 .increment = 1
171 },
172 .digest_size = {
173 .min = 28,
174 .max = 28,
175 .increment = 0
176 },
177 }, }
178 }, }
179 },
180 { /* SHA256 */
181 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
182 {.sym = {
183 .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
184 {.auth = {
185 .algo = RTE_CRYPTO_AUTH_SHA256,
186 .block_size = 64,
187 .key_size = {
188 .min = 0,
189 .max = 0,
190 .increment = 0
191 },
192 .digest_size = {
193 .min = 32,
194 .max = 32,
195 .increment = 0
196 },
197 }, }
198 }, }
199 },
200 { /* SHA256 HMAC */
201 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
202 {.sym = {
203 .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
204 {.auth = {
205 .algo = RTE_CRYPTO_AUTH_SHA256_HMAC,
206 .block_size = 64,
207 .key_size = {
208 .min = 1,
209 .max = 1024,
210 .increment = 1
211 },
212 .digest_size = {
213 .min = 16,
214 .max = 32,
215 .increment = 16
216 },
217 }, }
218 }, }
219 },
220 { /* SHA384 */
221 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
222 {.sym = {
223 .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
224 {.auth = {
225 .algo = RTE_CRYPTO_AUTH_SHA384,
226 .block_size = 64,
227 .key_size = {
228 .min = 0,
229 .max = 0,
230 .increment = 0
231 },
232 .digest_size = {
233 .min = 48,
234 .max = 48,
235 .increment = 0
236 },
237 }, }
238 }, }
239 },
240 { /* SHA384 HMAC */
241 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
242 {.sym = {
243 .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
244 {.auth = {
245 .algo = RTE_CRYPTO_AUTH_SHA384_HMAC,
246 .block_size = 64,
247 .key_size = {
248 .min = 1,
249 .max = 1024,
250 .increment = 1
251 },
252 .digest_size = {
253 .min = 24,
254 .max = 48,
255 .increment = 24
256 },
257 }, }
258 }, }
259 },
260 { /* SHA512 */
261 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
262 {.sym = {
263 .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
264 {.auth = {
265 .algo = RTE_CRYPTO_AUTH_SHA512,
266 .block_size = 128,
267 .key_size = {
268 .min = 0,
269 .max = 0,
270 .increment = 0
271 },
272 .digest_size = {
273 .min = 64,
274 .max = 64,
275 .increment = 0
276 },
277 }, }
278 }, }
279 },
280 { /* SHA512 HMAC */
281 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
282 {.sym = {
283 .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
284 {.auth = {
285 .algo = RTE_CRYPTO_AUTH_SHA512_HMAC,
286 .block_size = 128,
287 .key_size = {
288 .min = 1,
289 .max = 1024,
290 .increment = 1
291 },
292 .digest_size = {
293 .min = 32,
294 .max = 64,
295 .increment = 32
296 },
297 }, }
298 }, }
299 },
300 { /* MD5 */
301 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
302 {.sym = {
303 .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
304 {.auth = {
305 .algo = RTE_CRYPTO_AUTH_MD5,
306 .block_size = 64,
307 .key_size = {
308 .min = 0,
309 .max = 0,
310 .increment = 0
311 },
312 .digest_size = {
313 .min = 16,
314 .max = 16,
315 .increment = 0
316 },
317 }, }
318 }, }
319 },
320 { /* MD5 HMAC */
321 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
322 {.sym = {
323 .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
324 {.auth = {
325 .algo = RTE_CRYPTO_AUTH_MD5_HMAC,
326 .block_size = 64,
327 .key_size = {
328 .min = 8,
329 .max = 64,
330 .increment = 8
331 },
332 .digest_size = {
333 .min = 12,
334 .max = 16,
335 .increment = 4
336 },
337 }, }
338 }, }
339 },
340 };
341
342 static const struct rte_cryptodev_capabilities caps_chacha20[] = {
343 { /* Chacha20-Poly1305 */
344 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
345 {.sym = {
346 .xform_type = RTE_CRYPTO_SYM_XFORM_AEAD,
347 {.aead = {
348 .algo = RTE_CRYPTO_AEAD_CHACHA20_POLY1305,
349 .block_size = 64,
350 .key_size = {
351 .min = 32,
352 .max = 32,
353 .increment = 0
354 },
355 .digest_size = {
356 .min = 16,
357 .max = 16,
358 .increment = 0
359 },
360 .aad_size = {
361 .min = 0,
362 .max = 1024,
363 .increment = 1
364 },
365 .iv_size = {
366 .min = 12,
367 .max = 12,
368 .increment = 0
369 },
370 }, }
371 }, }
372 }
373 };
374
375 static const struct rte_cryptodev_capabilities caps_zuc_snow3g[] = {
376 { /* SNOW 3G (UEA2) */
377 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
378 {.sym = {
379 .xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
380 {.cipher = {
381 .algo = RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
382 .block_size = 16,
383 .key_size = {
384 .min = 16,
385 .max = 16,
386 .increment = 0
387 },
388 .iv_size = {
389 .min = 16,
390 .max = 16,
391 .increment = 0
392 }
393 }, }
394 }, }
395 },
396 { /* ZUC (EEA3) */
397 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
398 {.sym = {
399 .xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
400 {.cipher = {
401 .algo = RTE_CRYPTO_CIPHER_ZUC_EEA3,
402 .block_size = 16,
403 .key_size = {
404 .min = 16,
405 .max = 16,
406 .increment = 0
407 },
408 .iv_size = {
409 .min = 16,
410 .max = 16,
411 .increment = 0
412 }
413 }, }
414 }, }
415 },
416 { /* SNOW 3G (UIA2) */
417 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
418 {.sym = {
419 .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
420 {.auth = {
421 .algo = RTE_CRYPTO_AUTH_SNOW3G_UIA2,
422 .block_size = 16,
423 .key_size = {
424 .min = 16,
425 .max = 16,
426 .increment = 0
427 },
428 .digest_size = {
429 .min = 4,
430 .max = 4,
431 .increment = 0
432 },
433 .iv_size = {
434 .min = 16,
435 .max = 16,
436 .increment = 0
437 }
438 }, }
439 }, }
440 },
441 { /* ZUC (EIA3) */
442 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
443 {.sym = {
444 .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
445 {.auth = {
446 .algo = RTE_CRYPTO_AUTH_ZUC_EIA3,
447 .block_size = 16,
448 .key_size = {
449 .min = 16,
450 .max = 16,
451 .increment = 0
452 },
453 .digest_size = {
454 .min = 4,
455 .max = 4,
456 .increment = 0
457 },
458 .iv_size = {
459 .min = 16,
460 .max = 16,
461 .increment = 0
462 }
463 }, }
464 }, }
465 },
466 };
467
468 static const struct rte_cryptodev_capabilities caps_aes[] = {
469 { /* AES GMAC (AUTH) */
470 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
471 {.sym = {
472 .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
473 {.auth = {
474 .algo = RTE_CRYPTO_AUTH_AES_GMAC,
475 .block_size = 16,
476 .key_size = {
477 .min = 16,
478 .max = 32,
479 .increment = 8
480 },
481 .digest_size = {
482 .min = 8,
483 .max = 16,
484 .increment = 4
485 },
486 .iv_size = {
487 .min = 12,
488 .max = 12,
489 .increment = 0
490 }
491 }, }
492 }, }
493 },
494 { /* AES CBC */
495 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
496 {.sym = {
497 .xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
498 {.cipher = {
499 .algo = RTE_CRYPTO_CIPHER_AES_CBC,
500 .block_size = 16,
501 .key_size = {
502 .min = 16,
503 .max = 32,
504 .increment = 8
505 },
506 .iv_size = {
507 .min = 16,
508 .max = 16,
509 .increment = 0
510 }
511 }, }
512 }, }
513 },
514 { /* AES CTR */
515 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
516 {.sym = {
517 .xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
518 {.cipher = {
519 .algo = RTE_CRYPTO_CIPHER_AES_CTR,
520 .block_size = 16,
521 .key_size = {
522 .min = 16,
523 .max = 32,
524 .increment = 8
525 },
526 .iv_size = {
527 .min = 12,
528 .max = 16,
529 .increment = 4
530 }
531 }, }
532 }, }
533 },
534 { /* AES XTS */
535 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
536 {.sym = {
537 .xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
538 {.cipher = {
539 .algo = RTE_CRYPTO_CIPHER_AES_XTS,
540 .block_size = 16,
541 .key_size = {
542 .min = 32,
543 .max = 64,
544 .increment = 0
545 },
546 .iv_size = {
547 .min = 16,
548 .max = 16,
549 .increment = 0
550 }
551 }, }
552 }, }
553 },
554 { /* AES GCM */
555 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
556 {.sym = {
557 .xform_type = RTE_CRYPTO_SYM_XFORM_AEAD,
558 {.aead = {
559 .algo = RTE_CRYPTO_AEAD_AES_GCM,
560 .block_size = 16,
561 .key_size = {
562 .min = 16,
563 .max = 32,
564 .increment = 8
565 },
566 .digest_size = {
567 .min = 4,
568 .max = 16,
569 .increment = 1
570 },
571 .aad_size = {
572 .min = 0,
573 .max = 1024,
574 .increment = 1
575 },
576 .iv_size = {
577 .min = 12,
578 .max = 12,
579 .increment = 0
580 }
581 }, }
582 }, }
583 },
584 };
585
586 static const struct rte_cryptodev_capabilities caps_kasumi[] = {
587 { /* KASUMI (F8) */
588 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
589 {.sym = {
590 .xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
591 {.cipher = {
592 .algo = RTE_CRYPTO_CIPHER_KASUMI_F8,
593 .block_size = 8,
594 .key_size = {
595 .min = 16,
596 .max = 16,
597 .increment = 0
598 },
599 .iv_size = {
600 .min = 8,
601 .max = 8,
602 .increment = 0
603 }
604 }, }
605 }, }
606 },
607 { /* KASUMI (F9) */
608 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
609 {.sym = {
610 .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
611 {.auth = {
612 .algo = RTE_CRYPTO_AUTH_KASUMI_F9,
613 .block_size = 8,
614 .key_size = {
615 .min = 16,
616 .max = 16,
617 .increment = 0
618 },
619 .digest_size = {
620 .min = 4,
621 .max = 4,
622 .increment = 0
623 },
624 }, }
625 }, }
626 },
627 };
628
629 static const struct rte_cryptodev_capabilities caps_des[] = {
630 { /* 3DES CBC */
631 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
632 {.sym = {
633 .xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
634 {.cipher = {
635 .algo = RTE_CRYPTO_CIPHER_3DES_CBC,
636 .block_size = 8,
637 .key_size = {
638 .min = 24,
639 .max = 24,
640 .increment = 0
641 },
642 .iv_size = {
643 .min = 8,
644 .max = 16,
645 .increment = 8
646 }
647 }, }
648 }, }
649 },
650 { /* 3DES ECB */
651 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
652 {.sym = {
653 .xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
654 {.cipher = {
655 .algo = RTE_CRYPTO_CIPHER_3DES_ECB,
656 .block_size = 8,
657 .key_size = {
658 .min = 24,
659 .max = 24,
660 .increment = 0
661 },
662 .iv_size = {
663 .min = 0,
664 .max = 0,
665 .increment = 0
666 }
667 }, }
668 }, }
669 },
670 { /* DES CBC */
671 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
672 {.sym = {
673 .xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
674 {.cipher = {
675 .algo = RTE_CRYPTO_CIPHER_DES_CBC,
676 .block_size = 8,
677 .key_size = {
678 .min = 8,
679 .max = 8,
680 .increment = 0
681 },
682 .iv_size = {
683 .min = 8,
684 .max = 8,
685 .increment = 0
686 }
687 }, }
688 }, }
689 },
690 };
691
692 static const struct rte_cryptodev_capabilities caps_null[] = {
693 { /* NULL (AUTH) */
694 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
695 {.sym = {
696 .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
697 {.auth = {
698 .algo = RTE_CRYPTO_AUTH_NULL,
699 .block_size = 1,
700 .key_size = {
701 .min = 0,
702 .max = 0,
703 .increment = 0
704 },
705 .digest_size = {
706 .min = 0,
707 .max = 0,
708 .increment = 0
709 },
710 }, },
711 }, },
712 },
713 { /* NULL (CIPHER) */
714 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
715 {.sym = {
716 .xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
717 {.cipher = {
718 .algo = RTE_CRYPTO_CIPHER_NULL,
719 .block_size = 1,
720 .key_size = {
721 .min = 0,
722 .max = 0,
723 .increment = 0
724 },
725 .iv_size = {
726 .min = 0,
727 .max = 0,
728 .increment = 0
729 }
730 }, },
731 }, }
732 },
733 };
734
735 static const struct rte_cryptodev_capabilities caps_end[] = {
736 RTE_CRYPTODEV_END_OF_CAPABILITIES_LIST()
737 };
738
739 static const struct rte_cryptodev_capabilities sec_caps_aes[] = {
740 { /* AES GCM */
741 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
742 {.sym = {
743 .xform_type = RTE_CRYPTO_SYM_XFORM_AEAD,
744 {.aead = {
745 .algo = RTE_CRYPTO_AEAD_AES_GCM,
746 .block_size = 16,
747 .key_size = {
748 .min = 16,
749 .max = 32,
750 .increment = 8
751 },
752 .digest_size = {
753 .min = 16,
754 .max = 16,
755 .increment = 0
756 },
757 .aad_size = {
758 .min = 8,
759 .max = 12,
760 .increment = 4
761 },
762 .iv_size = {
763 .min = 12,
764 .max = 12,
765 .increment = 0
766 }
767 }, }
768 }, }
769 },
770 };
771
772 static const struct rte_security_capability
773 otx2_crypto_sec_capabilities[] = {
774 { /* IPsec Lookaside Protocol ESP Tunnel Ingress */
775 .action = RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL,
776 .protocol = RTE_SECURITY_PROTOCOL_IPSEC,
777 .ipsec = {
778 .proto = RTE_SECURITY_IPSEC_SA_PROTO_ESP,
779 .mode = RTE_SECURITY_IPSEC_SA_MODE_TUNNEL,
780 .direction = RTE_SECURITY_IPSEC_SA_DIR_INGRESS,
781 .options = { 0 }
782 },
783 .crypto_capabilities = otx2_cpt_sec_caps,
784 .ol_flags = RTE_SECURITY_TX_OLOAD_NEED_MDATA
785 },
786 { /* IPsec Lookaside Protocol ESP Tunnel Egress */
787 .action = RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL,
788 .protocol = RTE_SECURITY_PROTOCOL_IPSEC,
789 .ipsec = {
790 .proto = RTE_SECURITY_IPSEC_SA_PROTO_ESP,
791 .mode = RTE_SECURITY_IPSEC_SA_MODE_TUNNEL,
792 .direction = RTE_SECURITY_IPSEC_SA_DIR_EGRESS,
793 .options = { 0 }
794 },
795 .crypto_capabilities = otx2_cpt_sec_caps,
796 .ol_flags = RTE_SECURITY_TX_OLOAD_NEED_MDATA
797 },
798 {
799 .action = RTE_SECURITY_ACTION_TYPE_NONE
800 }
801 };
802
803 static void
cpt_caps_add(const struct rte_cryptodev_capabilities * caps,int nb_caps)804 cpt_caps_add(const struct rte_cryptodev_capabilities *caps, int nb_caps)
805 {
806 static int cur_pos;
807
808 if (cur_pos + nb_caps > OTX2_CPT_MAX_CAPS)
809 return;
810
811 memcpy(&otx2_cpt_caps[cur_pos], caps, nb_caps * sizeof(caps[0]));
812 cur_pos += nb_caps;
813 }
814
815 void
otx2_crypto_capabilities_init(union cpt_eng_caps * hw_caps)816 otx2_crypto_capabilities_init(union cpt_eng_caps *hw_caps)
817 {
818 CPT_CAPS_ADD(hw_caps, mul);
819 CPT_CAPS_ADD(hw_caps, sha1_sha2);
820 CPT_CAPS_ADD(hw_caps, chacha20);
821 CPT_CAPS_ADD(hw_caps, zuc_snow3g);
822 CPT_CAPS_ADD(hw_caps, aes);
823 CPT_CAPS_ADD(hw_caps, kasumi);
824 CPT_CAPS_ADD(hw_caps, des);
825
826 cpt_caps_add(caps_null, RTE_DIM(caps_null));
827 cpt_caps_add(caps_end, RTE_DIM(caps_end));
828 }
829
830 const struct rte_cryptodev_capabilities *
otx2_cpt_capabilities_get(void)831 otx2_cpt_capabilities_get(void)
832 {
833 return otx2_cpt_caps;
834 }
835
836 static void
sec_caps_add(const struct rte_cryptodev_capabilities * caps,int nb_caps)837 sec_caps_add(const struct rte_cryptodev_capabilities *caps, int nb_caps)
838 {
839 static int cur_pos;
840
841 if (cur_pos + nb_caps > OTX2_SEC_MAX_CAPS)
842 return;
843
844 memcpy(&otx2_cpt_sec_caps[cur_pos], caps, nb_caps * sizeof(caps[0]));
845 cur_pos += nb_caps;
846 }
847
848 void
otx2_crypto_sec_capabilities_init(union cpt_eng_caps * hw_caps)849 otx2_crypto_sec_capabilities_init(union cpt_eng_caps *hw_caps)
850 {
851 SEC_CAPS_ADD(hw_caps, aes);
852
853 sec_caps_add(caps_end, RTE_DIM(caps_end));
854 }
855
856 const struct rte_security_capability *
otx2_crypto_sec_capabilities_get(void * device __rte_unused)857 otx2_crypto_sec_capabilities_get(void *device __rte_unused)
858 {
859 return otx2_crypto_sec_capabilities;
860 }
861