1 /* SPDX-License-Identifier: (BSD-3-Clause OR GPL-2.0)
3 * Copyright 2008-2016 Freescale Semiconductor Inc.
4 * Copyright 2016,2019 NXP
7 #ifndef __RTA_NFIFO_CMD_H__
8 #define __RTA_NFIFO_CMD_H__
10 extern enum rta_sec_era rta_sec_era;
12 static const uint32_t nfifo_src[][2] = {
13 /*1*/ { IFIFO, NFIFOENTRY_STYPE_DFIFO },
14 { OFIFO, NFIFOENTRY_STYPE_OFIFO },
15 { PAD, NFIFOENTRY_STYPE_PAD },
16 /*4*/ { MSGOUTSNOOP, NFIFOENTRY_STYPE_SNOOP | NFIFOENTRY_DEST_BOTH },
17 /*5*/ { ALTSOURCE, NFIFOENTRY_STYPE_ALTSOURCE },
18 { OFIFO_SYNC, NFIFOENTRY_STYPE_OFIFO_SYNC },
19 /*7*/ { MSGOUTSNOOP_ALT, NFIFOENTRY_STYPE_SNOOP_ALT | NFIFOENTRY_DEST_BOTH }
23 * Allowed NFIFO LOAD sources for each SEC Era.
24 * Values represent the number of entries from nfifo_src[] that are supported.
26 static const unsigned int nfifo_src_sz[] = {4, 5, 5, 5, 5, 5, 5, 7, 7, 7};
28 static const uint32_t nfifo_data[][2] = {
29 { MSG, NFIFOENTRY_DTYPE_MSG },
30 { MSG1, NFIFOENTRY_DEST_CLASS1 | NFIFOENTRY_DTYPE_MSG },
31 { MSG2, NFIFOENTRY_DEST_CLASS2 | NFIFOENTRY_DTYPE_MSG },
32 { IV1, NFIFOENTRY_DEST_CLASS1 | NFIFOENTRY_DTYPE_IV },
33 { IV2, NFIFOENTRY_DEST_CLASS2 | NFIFOENTRY_DTYPE_IV },
34 { ICV1, NFIFOENTRY_DEST_CLASS1 | NFIFOENTRY_DTYPE_ICV },
35 { ICV2, NFIFOENTRY_DEST_CLASS2 | NFIFOENTRY_DTYPE_ICV },
36 { SAD1, NFIFOENTRY_DEST_CLASS1 | NFIFOENTRY_DTYPE_SAD },
37 { AAD1, NFIFOENTRY_DEST_CLASS1 | NFIFOENTRY_DTYPE_AAD },
38 { AAD2, NFIFOENTRY_DEST_CLASS2 | NFIFOENTRY_DTYPE_AAD },
39 { AFHA_SBOX, NFIFOENTRY_DEST_CLASS1 | NFIFOENTRY_DTYPE_SBOX },
40 { SKIP, NFIFOENTRY_DTYPE_SKIP },
41 { PKE, NFIFOENTRY_DEST_CLASS1 | NFIFOENTRY_DTYPE_PK_E },
42 { PKN, NFIFOENTRY_DEST_CLASS1 | NFIFOENTRY_DTYPE_PK_N },
43 { PKA, NFIFOENTRY_DEST_CLASS1 | NFIFOENTRY_DTYPE_PK_A },
44 { PKA0, NFIFOENTRY_DEST_CLASS1 | NFIFOENTRY_DTYPE_PK_A0 },
45 { PKA1, NFIFOENTRY_DEST_CLASS1 | NFIFOENTRY_DTYPE_PK_A1 },
46 { PKA2, NFIFOENTRY_DEST_CLASS1 | NFIFOENTRY_DTYPE_PK_A2 },
47 { PKA3, NFIFOENTRY_DEST_CLASS1 | NFIFOENTRY_DTYPE_PK_A3 },
48 { PKB, NFIFOENTRY_DEST_CLASS1 | NFIFOENTRY_DTYPE_PK_B },
49 { PKB0, NFIFOENTRY_DEST_CLASS1 | NFIFOENTRY_DTYPE_PK_B0 },
50 { PKB1, NFIFOENTRY_DEST_CLASS1 | NFIFOENTRY_DTYPE_PK_B1 },
51 { PKB2, NFIFOENTRY_DEST_CLASS1 | NFIFOENTRY_DTYPE_PK_B2 },
52 { PKB3, NFIFOENTRY_DEST_CLASS1 | NFIFOENTRY_DTYPE_PK_B3 },
53 { AB1, NFIFOENTRY_DEST_CLASS1 },
54 { AB2, NFIFOENTRY_DEST_CLASS2 },
55 { ABD, NFIFOENTRY_DEST_DECO }
58 static const uint32_t nfifo_flags[][2] = {
59 /*1*/ { LAST1, NFIFOENTRY_LC1 },
60 { LAST2, NFIFOENTRY_LC2 },
61 { FLUSH1, NFIFOENTRY_FC1 },
62 { BP, NFIFOENTRY_BND },
63 { PAD_ZERO, NFIFOENTRY_PTYPE_ZEROS },
64 { PAD_NONZERO, NFIFOENTRY_PTYPE_RND_NOZEROS },
65 { PAD_INCREMENT, NFIFOENTRY_PTYPE_INCREMENT },
66 { PAD_RANDOM, NFIFOENTRY_PTYPE_RND },
67 { PAD_ZERO_N1, NFIFOENTRY_PTYPE_ZEROS_NZ },
68 { PAD_NONZERO_0, NFIFOENTRY_PTYPE_RND_NZ_LZ },
69 { PAD_N1, NFIFOENTRY_PTYPE_N },
70 /*12*/ { PAD_NONZERO_N, NFIFOENTRY_PTYPE_RND_NZ_N },
71 { FLUSH2, NFIFOENTRY_FC2 },
76 * Allowed NFIFO LOAD flags for each SEC Era.
77 * Values represent the number of entries from nfifo_flags[] that are supported.
79 static const unsigned int nfifo_flags_sz[] = {12, 14, 14, 14, 14, 14,
82 static const uint32_t nfifo_pad_flags[][2] = {
83 { BM, NFIFOENTRY_BM },
84 { PS, NFIFOENTRY_PS },
89 * Allowed NFIFO LOAD pad flags for each SEC Era.
90 * Values represent the number of entries from nfifo_pad_flags[] that are
93 static const unsigned int nfifo_pad_flags_sz[] = {2, 2, 2, 2, 3, 3, 3, 3, 3, 3};
96 rta_nfifo_load(struct program *program, uint32_t src,
97 uint32_t data, uint32_t length, uint32_t flags)
99 uint32_t opcode = 0, val;
101 uint32_t load_cmd = CMD_LOAD | LDST_IMM | LDST_CLASS_IND_CCB |
102 LDST_SRCDST_WORD_INFO_FIFO;
103 unsigned int start_pc = program->current_pc;
105 if ((data == AFHA_SBOX) && (rta_sec_era == RTA_SEC_ERA_7)) {
106 pr_err("NFIFO: AFHA S-box not supported by SEC Era %d\n",
107 USER_SEC_ERA(rta_sec_era));
111 /* write source field */
112 ret = __rta_map_opcode(src, nfifo_src, nfifo_src_sz[rta_sec_era], &val);
114 pr_err("NFIFO: Invalid SRC. SEC PC: %d; Instr: %d\n",
115 program->current_pc, program->current_instruction);
120 /* write type field */
121 ret = __rta_map_opcode(data, nfifo_data, ARRAY_SIZE(nfifo_data), &val);
123 pr_err("NFIFO: Invalid data. SEC PC: %d; Instr: %d\n",
124 program->current_pc, program->current_instruction);
130 if (!(flags & EXT)) {
131 opcode |= length & NFIFOENTRY_DLEN_MASK;
138 __rta_map_flags(flags, nfifo_flags, nfifo_flags_sz[rta_sec_era],
141 /* in case of padding, check the destination */
143 __rta_map_flags(flags, nfifo_pad_flags,
144 nfifo_pad_flags_sz[rta_sec_era], &opcode);
146 /* write LOAD command first */
147 __rta_out32(program, load_cmd);
148 __rta_out32(program, opcode);
151 __rta_out32(program, length & NFIFOENTRY_DLEN_MASK);
153 program->current_instruction++;
155 return (int)start_pc;
158 program->first_error_pc = start_pc;
159 program->current_instruction++;
163 #endif /* __RTA_NFIFO_CMD_H__ */