1 /* SPDX-License-Identifier: (BSD-3-Clause OR GPL-2.0)
3 * Copyright 2008-2016 Freescale Semiconductor Inc.
4 * Copyright 2016,2019-2021 NXP
7 #ifndef __RTA_OPERATION_CMD_H__
8 #define __RTA_OPERATION_CMD_H__
10 #if defined(RTE_TOOLCHAIN_GCC) && (GCC_VERSION >= 70000)
11 #pragma GCC diagnostic ignored "-Wimplicit-fallthrough"
14 extern enum rta_sec_era rta_sec_era;
17 __rta_alg_aai_aes(uint16_t aai)
19 uint16_t aes_mode = aai & OP_ALG_AESA_MODE_MASK;
21 if (aai & OP_ALG_AAI_C2K) {
22 if (rta_sec_era < RTA_SEC_ERA_5)
24 if ((aes_mode != OP_ALG_AAI_CCM) &&
25 (aes_mode != OP_ALG_AAI_GCM))
30 case OP_ALG_AAI_CBC_CMAC:
31 case OP_ALG_AAI_CTR_CMAC_LTE:
32 case OP_ALG_AAI_CTR_CMAC:
33 if (rta_sec_era < RTA_SEC_ERA_2)
43 case OP_ALG_AAI_XCBC_MAC:
46 case OP_ALG_AAI_CBC_XCBCMAC:
47 case OP_ALG_AAI_CTR_XCBCMAC:
55 __rta_alg_aai_des(uint16_t aai)
57 uint16_t aai_code = (uint16_t)(aai & ~OP_ALG_AAI_CHECKODD);
71 __rta_alg_aai_md5(uint16_t aai)
75 if (rta_sec_era < RTA_SEC_ERA_2)
80 case OP_ALG_AAI_HMAC_PRECOMP:
88 __rta_alg_aai_sha(uint16_t aai)
92 if (rta_sec_era < RTA_SEC_ERA_2)
96 case OP_ALG_AAI_HMAC_PRECOMP:
104 __rta_alg_aai_rng(uint16_t aai)
106 uint16_t rng_mode = aai & OP_ALG_RNG_MODE_MASK;
107 uint16_t rng_sh = aai & OP_ALG_AAI_RNG4_SH_MASK;
111 case OP_ALG_AAI_RNG_NZB:
112 case OP_ALG_AAI_RNG_OBP:
118 /* State Handle bits are valid only for SEC Era >= 5 */
119 if ((rta_sec_era < RTA_SEC_ERA_5) && rng_sh)
122 /* PS, AI, SK bits are also valid only for SEC Era >= 5 */
123 if ((rta_sec_era < RTA_SEC_ERA_5) && (aai &
124 (OP_ALG_AAI_RNG4_PS | OP_ALG_AAI_RNG4_AI | OP_ALG_AAI_RNG4_SK)))
128 case OP_ALG_AAI_RNG4_SH_0:
129 case OP_ALG_AAI_RNG4_SH_1:
137 __rta_alg_aai_crc(uint16_t aai)
139 uint16_t aai_code = aai & OP_ALG_CRC_POLY_MASK;
143 case OP_ALG_AAI_3385:
144 case OP_ALG_AAI_CUST_POLY:
152 __rta_alg_aai_kasumi(uint16_t aai)
156 case OP_ALG_AAI_EDGE:
166 __rta_alg_aai_snow_f9(uint16_t aai)
168 if (aai == OP_ALG_AAI_F9)
175 __rta_alg_aai_snow_f8(uint16_t aai)
177 if (aai == OP_ALG_AAI_F8)
184 __rta_alg_aai_zuce(uint16_t aai)
186 if (aai == OP_ALG_AAI_F8)
193 __rta_alg_aai_zuca(uint16_t aai)
195 if (aai == OP_ALG_AAI_F9)
202 uint32_t chipher_algo;
203 int (*aai_func)(uint16_t);
207 static const struct alg_aai_map alg_table[] = {
208 /*1*/ { OP_ALG_ALGSEL_AES, __rta_alg_aai_aes, OP_TYPE_CLASS1_ALG },
209 { OP_ALG_ALGSEL_DES, __rta_alg_aai_des, OP_TYPE_CLASS1_ALG },
210 { OP_ALG_ALGSEL_3DES, __rta_alg_aai_des, OP_TYPE_CLASS1_ALG },
211 { OP_ALG_ALGSEL_MD5, __rta_alg_aai_md5, OP_TYPE_CLASS2_ALG },
212 { OP_ALG_ALGSEL_SHA1, __rta_alg_aai_md5, OP_TYPE_CLASS2_ALG },
213 { OP_ALG_ALGSEL_SHA224, __rta_alg_aai_sha, OP_TYPE_CLASS2_ALG },
214 { OP_ALG_ALGSEL_SHA256, __rta_alg_aai_sha, OP_TYPE_CLASS2_ALG },
215 { OP_ALG_ALGSEL_SHA384, __rta_alg_aai_sha, OP_TYPE_CLASS2_ALG },
216 { OP_ALG_ALGSEL_SHA512, __rta_alg_aai_sha, OP_TYPE_CLASS2_ALG },
217 { OP_ALG_ALGSEL_RNG, __rta_alg_aai_rng, OP_TYPE_CLASS1_ALG },
218 /*11*/ { OP_ALG_ALGSEL_CRC, __rta_alg_aai_crc, OP_TYPE_CLASS2_ALG },
219 { OP_ALG_ALGSEL_ARC4, NULL, OP_TYPE_CLASS1_ALG },
220 { OP_ALG_ALGSEL_SNOW_F8, __rta_alg_aai_snow_f8, OP_TYPE_CLASS1_ALG },
221 /*14*/ { OP_ALG_ALGSEL_KASUMI, __rta_alg_aai_kasumi, OP_TYPE_CLASS1_ALG },
222 { OP_ALG_ALGSEL_SNOW_F9, __rta_alg_aai_snow_f9, OP_TYPE_CLASS2_ALG },
223 { OP_ALG_ALGSEL_ZUCE, __rta_alg_aai_zuce, OP_TYPE_CLASS1_ALG },
224 /*17*/ { OP_ALG_ALGSEL_ZUCA, __rta_alg_aai_zuca, OP_TYPE_CLASS2_ALG }
228 * Allowed OPERATION algorithms for each SEC Era.
229 * Values represent the number of entries from alg_table[] that are supported.
231 static const unsigned int alg_table_sz[] = {14, 15, 15, 15, 17, 17,
235 rta_operation(struct program *program, uint32_t cipher_algo,
236 uint16_t aai, uint8_t algo_state,
237 int icv_checking, int enc)
239 uint32_t opcode = CMD_OPERATION;
240 unsigned int i, found = 0;
241 unsigned int start_pc = program->current_pc;
244 for (i = 0; i < alg_table_sz[rta_sec_era]; i++) {
245 if (alg_table[i].chipher_algo == cipher_algo) {
246 if ((aai == OP_ALG_AAI_XCBC_MAC) ||
247 (aai == OP_ALG_AAI_CBC_XCBCMAC))
248 opcode |= cipher_algo | OP_TYPE_CLASS2_ALG;
250 opcode |= cipher_algo | alg_table[i].class;
251 /* nothing else to verify */
252 if (alg_table[i].aai_func == NULL) {
257 aai &= OP_ALG_AAI_MASK;
259 ret = (*alg_table[i].aai_func)(aai);
261 pr_err("OPERATION: Bad AAI Type. SEC Program Line: %d\n",
262 program->current_pc);
271 pr_err("OPERATION: Invalid Command. SEC Program Line: %d\n",
272 program->current_pc);
277 switch (algo_state) {
278 case OP_ALG_AS_UPDATE:
280 case OP_ALG_AS_FINALIZE:
281 case OP_ALG_AS_INITFINAL:
282 opcode |= algo_state;
285 pr_err("Invalid Operation Command\n");
290 switch (icv_checking) {
291 case ICV_CHECK_DISABLE:
293 * opcode |= OP_ALG_ICV_OFF;
294 * OP_ALG_ICV_OFF is 0
297 case ICV_CHECK_ENABLE:
298 opcode |= OP_ALG_ICV_ON;
301 pr_err("Invalid Operation Command\n");
309 * opcode |= OP_ALG_DECRYPT;
310 * OP_ALG_DECRYPT is 0
314 opcode |= OP_ALG_ENCRYPT;
317 pr_err("Invalid Operation Command\n");
322 __rta_out32(program, opcode);
323 program->current_instruction++;
324 return (int)start_pc;
327 program->first_error_pc = start_pc;
331 /* For non-proto offload CMAC, GMAC etc cases */
333 rta_operation2(struct program *program, uint32_t cipher_algo,
334 uint16_t aai, uint8_t algo_state,
335 int icv_checking, int enc)
337 uint32_t opcode = CMD_OPERATION;
338 unsigned int i, found = 0;
339 unsigned int start_pc = program->current_pc;
342 for (i = 0; i < alg_table_sz[rta_sec_era]; i++) {
343 if (alg_table[i].chipher_algo == cipher_algo) {
344 if ((aai == OP_ALG_AAI_XCBC_MAC) ||
345 (aai == OP_ALG_AAI_CBC_XCBCMAC) ||
346 (aai == OP_ALG_AAI_CMAC))
347 opcode |= cipher_algo | OP_TYPE_CLASS2_ALG;
349 opcode |= cipher_algo | alg_table[i].class;
350 /* nothing else to verify */
351 if (alg_table[i].aai_func == NULL) {
356 aai &= OP_ALG_AAI_MASK;
358 ret = (*alg_table[i].aai_func)(aai);
360 pr_err("OPERATION: Bad AAI Type. SEC Program Line: %d\n",
361 program->current_pc);
370 pr_err("OPERATION: Invalid Command. SEC Program Line: %d\n",
371 program->current_pc);
376 switch (algo_state) {
377 case OP_ALG_AS_UPDATE:
379 case OP_ALG_AS_FINALIZE:
380 case OP_ALG_AS_INITFINAL:
381 opcode |= algo_state;
384 pr_err("Invalid Operation Command\n");
389 switch (icv_checking) {
390 case ICV_CHECK_DISABLE:
392 * opcode |= OP_ALG_ICV_OFF;
393 * OP_ALG_ICV_OFF is 0
396 case ICV_CHECK_ENABLE:
397 opcode |= OP_ALG_ICV_ON;
400 pr_err("Invalid Operation Command\n");
408 * opcode |= OP_ALG_DECRYPT;
409 * OP_ALG_DECRYPT is 0
413 opcode |= OP_ALG_ENCRYPT;
416 pr_err("Invalid Operation Command\n");
421 __rta_out32(program, opcode);
422 program->current_instruction++;
423 return (int)start_pc;
426 program->first_error_pc = start_pc;
431 * OPERATION PKHA routines
434 __rta_pkha_clearmem(uint32_t pkha_op)
437 case (OP_ALG_PKMODE_CLEARMEM_ALL):
438 case (OP_ALG_PKMODE_CLEARMEM_ABE):
439 case (OP_ALG_PKMODE_CLEARMEM_ABN):
440 case (OP_ALG_PKMODE_CLEARMEM_AB):
441 case (OP_ALG_PKMODE_CLEARMEM_AEN):
442 case (OP_ALG_PKMODE_CLEARMEM_AE):
443 case (OP_ALG_PKMODE_CLEARMEM_AN):
444 case (OP_ALG_PKMODE_CLEARMEM_A):
445 case (OP_ALG_PKMODE_CLEARMEM_BEN):
446 case (OP_ALG_PKMODE_CLEARMEM_BE):
447 case (OP_ALG_PKMODE_CLEARMEM_BN):
448 case (OP_ALG_PKMODE_CLEARMEM_B):
449 case (OP_ALG_PKMODE_CLEARMEM_EN):
450 case (OP_ALG_PKMODE_CLEARMEM_N):
451 case (OP_ALG_PKMODE_CLEARMEM_E):
459 __rta_pkha_mod_arithmetic(uint32_t pkha_op)
461 pkha_op &= (uint32_t)~OP_ALG_PKMODE_OUT_A;
464 case (OP_ALG_PKMODE_MOD_ADD):
465 case (OP_ALG_PKMODE_MOD_SUB_AB):
466 case (OP_ALG_PKMODE_MOD_SUB_BA):
467 case (OP_ALG_PKMODE_MOD_MULT):
468 case (OP_ALG_PKMODE_MOD_MULT_IM):
469 case (OP_ALG_PKMODE_MOD_MULT_IM_OM):
470 case (OP_ALG_PKMODE_MOD_EXPO):
471 case (OP_ALG_PKMODE_MOD_EXPO_TEQ):
472 case (OP_ALG_PKMODE_MOD_EXPO_IM):
473 case (OP_ALG_PKMODE_MOD_EXPO_IM_TEQ):
474 case (OP_ALG_PKMODE_MOD_REDUCT):
475 case (OP_ALG_PKMODE_MOD_INV):
476 case (OP_ALG_PKMODE_MOD_MONT_CNST):
477 case (OP_ALG_PKMODE_MOD_CRT_CNST):
478 case (OP_ALG_PKMODE_MOD_GCD):
479 case (OP_ALG_PKMODE_MOD_PRIMALITY):
480 case (OP_ALG_PKMODE_MOD_SML_EXP):
481 case (OP_ALG_PKMODE_F2M_ADD):
482 case (OP_ALG_PKMODE_F2M_MUL):
483 case (OP_ALG_PKMODE_F2M_MUL_IM):
484 case (OP_ALG_PKMODE_F2M_MUL_IM_OM):
485 case (OP_ALG_PKMODE_F2M_EXP):
486 case (OP_ALG_PKMODE_F2M_EXP_TEQ):
487 case (OP_ALG_PKMODE_F2M_AMODN):
488 case (OP_ALG_PKMODE_F2M_INV):
489 case (OP_ALG_PKMODE_F2M_R2):
490 case (OP_ALG_PKMODE_F2M_GCD):
491 case (OP_ALG_PKMODE_F2M_SML_EXP):
492 case (OP_ALG_PKMODE_ECC_F2M_ADD):
493 case (OP_ALG_PKMODE_ECC_F2M_ADD_IM_OM_PROJ):
494 case (OP_ALG_PKMODE_ECC_F2M_DBL):
495 case (OP_ALG_PKMODE_ECC_F2M_DBL_IM_OM_PROJ):
496 case (OP_ALG_PKMODE_ECC_F2M_MUL):
497 case (OP_ALG_PKMODE_ECC_F2M_MUL_TEQ):
498 case (OP_ALG_PKMODE_ECC_F2M_MUL_R2):
499 case (OP_ALG_PKMODE_ECC_F2M_MUL_R2_TEQ):
500 case (OP_ALG_PKMODE_ECC_F2M_MUL_R2_PROJ):
501 case (OP_ALG_PKMODE_ECC_F2M_MUL_R2_PROJ_TEQ):
502 case (OP_ALG_PKMODE_ECC_MOD_ADD):
503 case (OP_ALG_PKMODE_ECC_MOD_ADD_IM_OM_PROJ):
504 case (OP_ALG_PKMODE_ECC_MOD_DBL):
505 case (OP_ALG_PKMODE_ECC_MOD_DBL_IM_OM_PROJ):
506 case (OP_ALG_PKMODE_ECC_MOD_MUL):
507 case (OP_ALG_PKMODE_ECC_MOD_MUL_TEQ):
508 case (OP_ALG_PKMODE_ECC_MOD_MUL_R2):
509 case (OP_ALG_PKMODE_ECC_MOD_MUL_R2_TEQ):
510 case (OP_ALG_PKMODE_ECC_MOD_MUL_R2_PROJ):
511 case (OP_ALG_PKMODE_ECC_MOD_MUL_R2_PROJ_TEQ):
519 __rta_pkha_copymem(uint32_t pkha_op)
522 case (OP_ALG_PKMODE_COPY_NSZ_A0_B0):
523 case (OP_ALG_PKMODE_COPY_NSZ_A0_B1):
524 case (OP_ALG_PKMODE_COPY_NSZ_A0_B2):
525 case (OP_ALG_PKMODE_COPY_NSZ_A0_B3):
526 case (OP_ALG_PKMODE_COPY_NSZ_A1_B0):
527 case (OP_ALG_PKMODE_COPY_NSZ_A1_B1):
528 case (OP_ALG_PKMODE_COPY_NSZ_A1_B2):
529 case (OP_ALG_PKMODE_COPY_NSZ_A1_B3):
530 case (OP_ALG_PKMODE_COPY_NSZ_A2_B0):
531 case (OP_ALG_PKMODE_COPY_NSZ_A2_B1):
532 case (OP_ALG_PKMODE_COPY_NSZ_A2_B2):
533 case (OP_ALG_PKMODE_COPY_NSZ_A2_B3):
534 case (OP_ALG_PKMODE_COPY_NSZ_A3_B0):
535 case (OP_ALG_PKMODE_COPY_NSZ_A3_B1):
536 case (OP_ALG_PKMODE_COPY_NSZ_A3_B2):
537 case (OP_ALG_PKMODE_COPY_NSZ_A3_B3):
538 case (OP_ALG_PKMODE_COPY_NSZ_B0_A0):
539 case (OP_ALG_PKMODE_COPY_NSZ_B0_A1):
540 case (OP_ALG_PKMODE_COPY_NSZ_B0_A2):
541 case (OP_ALG_PKMODE_COPY_NSZ_B0_A3):
542 case (OP_ALG_PKMODE_COPY_NSZ_B1_A0):
543 case (OP_ALG_PKMODE_COPY_NSZ_B1_A1):
544 case (OP_ALG_PKMODE_COPY_NSZ_B1_A2):
545 case (OP_ALG_PKMODE_COPY_NSZ_B1_A3):
546 case (OP_ALG_PKMODE_COPY_NSZ_B2_A0):
547 case (OP_ALG_PKMODE_COPY_NSZ_B2_A1):
548 case (OP_ALG_PKMODE_COPY_NSZ_B2_A2):
549 case (OP_ALG_PKMODE_COPY_NSZ_B2_A3):
550 case (OP_ALG_PKMODE_COPY_NSZ_B3_A0):
551 case (OP_ALG_PKMODE_COPY_NSZ_B3_A1):
552 case (OP_ALG_PKMODE_COPY_NSZ_B3_A2):
553 case (OP_ALG_PKMODE_COPY_NSZ_B3_A3):
554 case (OP_ALG_PKMODE_COPY_NSZ_A_E):
555 case (OP_ALG_PKMODE_COPY_NSZ_A_N):
556 case (OP_ALG_PKMODE_COPY_NSZ_B_E):
557 case (OP_ALG_PKMODE_COPY_NSZ_B_N):
558 case (OP_ALG_PKMODE_COPY_NSZ_N_A):
559 case (OP_ALG_PKMODE_COPY_NSZ_N_B):
560 case (OP_ALG_PKMODE_COPY_NSZ_N_E):
561 case (OP_ALG_PKMODE_COPY_SSZ_A0_B0):
562 case (OP_ALG_PKMODE_COPY_SSZ_A0_B1):
563 case (OP_ALG_PKMODE_COPY_SSZ_A0_B2):
564 case (OP_ALG_PKMODE_COPY_SSZ_A0_B3):
565 case (OP_ALG_PKMODE_COPY_SSZ_A1_B0):
566 case (OP_ALG_PKMODE_COPY_SSZ_A1_B1):
567 case (OP_ALG_PKMODE_COPY_SSZ_A1_B2):
568 case (OP_ALG_PKMODE_COPY_SSZ_A1_B3):
569 case (OP_ALG_PKMODE_COPY_SSZ_A2_B0):
570 case (OP_ALG_PKMODE_COPY_SSZ_A2_B1):
571 case (OP_ALG_PKMODE_COPY_SSZ_A2_B2):
572 case (OP_ALG_PKMODE_COPY_SSZ_A2_B3):
573 case (OP_ALG_PKMODE_COPY_SSZ_A3_B0):
574 case (OP_ALG_PKMODE_COPY_SSZ_A3_B1):
575 case (OP_ALG_PKMODE_COPY_SSZ_A3_B2):
576 case (OP_ALG_PKMODE_COPY_SSZ_A3_B3):
577 case (OP_ALG_PKMODE_COPY_SSZ_B0_A0):
578 case (OP_ALG_PKMODE_COPY_SSZ_B0_A1):
579 case (OP_ALG_PKMODE_COPY_SSZ_B0_A2):
580 case (OP_ALG_PKMODE_COPY_SSZ_B0_A3):
581 case (OP_ALG_PKMODE_COPY_SSZ_B1_A0):
582 case (OP_ALG_PKMODE_COPY_SSZ_B1_A1):
583 case (OP_ALG_PKMODE_COPY_SSZ_B1_A2):
584 case (OP_ALG_PKMODE_COPY_SSZ_B1_A3):
585 case (OP_ALG_PKMODE_COPY_SSZ_B2_A0):
586 case (OP_ALG_PKMODE_COPY_SSZ_B2_A1):
587 case (OP_ALG_PKMODE_COPY_SSZ_B2_A2):
588 case (OP_ALG_PKMODE_COPY_SSZ_B2_A3):
589 case (OP_ALG_PKMODE_COPY_SSZ_B3_A0):
590 case (OP_ALG_PKMODE_COPY_SSZ_B3_A1):
591 case (OP_ALG_PKMODE_COPY_SSZ_B3_A2):
592 case (OP_ALG_PKMODE_COPY_SSZ_B3_A3):
593 case (OP_ALG_PKMODE_COPY_SSZ_A_E):
594 case (OP_ALG_PKMODE_COPY_SSZ_A_N):
595 case (OP_ALG_PKMODE_COPY_SSZ_B_E):
596 case (OP_ALG_PKMODE_COPY_SSZ_B_N):
597 case (OP_ALG_PKMODE_COPY_SSZ_N_A):
598 case (OP_ALG_PKMODE_COPY_SSZ_N_B):
599 case (OP_ALG_PKMODE_COPY_SSZ_N_E):
607 rta_pkha_operation(struct program *program, uint32_t op_pkha)
609 uint32_t opcode = CMD_OPERATION | OP_TYPE_PK | OP_ALG_PK;
611 unsigned int start_pc = program->current_pc;
614 pkha_func = op_pkha & OP_ALG_PK_FUN_MASK;
617 case (OP_ALG_PKMODE_CLEARMEM):
618 ret = __rta_pkha_clearmem(op_pkha);
620 pr_err("OPERATION PKHA: Type not supported. SEC Program Line: %d\n",
621 program->current_pc);
625 case (OP_ALG_PKMODE_MOD_ADD):
626 case (OP_ALG_PKMODE_MOD_SUB_AB):
627 case (OP_ALG_PKMODE_MOD_SUB_BA):
628 case (OP_ALG_PKMODE_MOD_MULT):
629 case (OP_ALG_PKMODE_MOD_EXPO):
630 case (OP_ALG_PKMODE_MOD_REDUCT):
631 case (OP_ALG_PKMODE_MOD_INV):
632 case (OP_ALG_PKMODE_MOD_MONT_CNST):
633 case (OP_ALG_PKMODE_MOD_CRT_CNST):
634 case (OP_ALG_PKMODE_MOD_GCD):
635 case (OP_ALG_PKMODE_MOD_PRIMALITY):
636 case (OP_ALG_PKMODE_MOD_SML_EXP):
637 case (OP_ALG_PKMODE_ECC_MOD_ADD):
638 case (OP_ALG_PKMODE_ECC_MOD_DBL):
639 case (OP_ALG_PKMODE_ECC_MOD_MUL):
640 ret = __rta_pkha_mod_arithmetic(op_pkha);
642 pr_err("OPERATION PKHA: Type not supported. SEC Program Line: %d\n",
643 program->current_pc);
647 case (OP_ALG_PKMODE_COPY_NSZ):
648 case (OP_ALG_PKMODE_COPY_SSZ):
649 ret = __rta_pkha_copymem(op_pkha);
651 pr_err("OPERATION PKHA: Type not supported. SEC Program Line: %d\n",
652 program->current_pc);
657 pr_err("Invalid Operation Command\n");
663 __rta_out32(program, opcode);
664 program->current_instruction++;
665 return (int)start_pc;
668 program->first_error_pc = start_pc;
669 program->current_instruction++;
673 #endif /* __RTA_OPERATION_CMD_H__ */