New upstream version 18.02
[deb_dpdk.git] / drivers / crypto / dpaa2_sec / hw / rta / nfifo_cmd.h
1 /* SPDX-License-Identifier: (BSD-3-Clause OR GPL-2.0)
2  *
3  * Copyright 2008-2016 Freescale Semiconductor Inc.
4  * Copyright 2016 NXP
5  *
6  */
7
8 #ifndef __RTA_NFIFO_CMD_H__
9 #define __RTA_NFIFO_CMD_H__
10
11 extern enum rta_sec_era rta_sec_era;
12
13 static const uint32_t nfifo_src[][2] = {
14 /*1*/   { IFIFO,       NFIFOENTRY_STYPE_DFIFO },
15         { OFIFO,       NFIFOENTRY_STYPE_OFIFO },
16         { PAD,         NFIFOENTRY_STYPE_PAD },
17 /*4*/   { MSGOUTSNOOP, NFIFOENTRY_STYPE_SNOOP | NFIFOENTRY_DEST_BOTH },
18 /*5*/   { ALTSOURCE,   NFIFOENTRY_STYPE_ALTSOURCE },
19         { OFIFO_SYNC,  NFIFOENTRY_STYPE_OFIFO_SYNC },
20 /*7*/   { MSGOUTSNOOP_ALT, NFIFOENTRY_STYPE_SNOOP_ALT | NFIFOENTRY_DEST_BOTH }
21 };
22
23 /*
24  * Allowed NFIFO LOAD sources for each SEC Era.
25  * Values represent the number of entries from nfifo_src[] that are supported.
26  */
27 static const unsigned int nfifo_src_sz[] = {4, 5, 5, 5, 5, 5, 5, 7};
28
29 static const uint32_t nfifo_data[][2] = {
30         { MSG,   NFIFOENTRY_DTYPE_MSG },
31         { MSG1,  NFIFOENTRY_DEST_CLASS1 | NFIFOENTRY_DTYPE_MSG },
32         { MSG2,  NFIFOENTRY_DEST_CLASS2 | NFIFOENTRY_DTYPE_MSG },
33         { IV1,   NFIFOENTRY_DEST_CLASS1 | NFIFOENTRY_DTYPE_IV },
34         { IV2,   NFIFOENTRY_DEST_CLASS2 | NFIFOENTRY_DTYPE_IV },
35         { ICV1,  NFIFOENTRY_DEST_CLASS1 | NFIFOENTRY_DTYPE_ICV },
36         { ICV2,  NFIFOENTRY_DEST_CLASS2 | NFIFOENTRY_DTYPE_ICV },
37         { SAD1,  NFIFOENTRY_DEST_CLASS1 | NFIFOENTRY_DTYPE_SAD },
38         { AAD1,  NFIFOENTRY_DEST_CLASS1 | NFIFOENTRY_DTYPE_AAD },
39         { AAD2,  NFIFOENTRY_DEST_CLASS2 | NFIFOENTRY_DTYPE_AAD },
40         { AFHA_SBOX, NFIFOENTRY_DEST_CLASS1 | NFIFOENTRY_DTYPE_SBOX },
41         { SKIP,  NFIFOENTRY_DTYPE_SKIP },
42         { PKE,   NFIFOENTRY_DEST_CLASS1 | NFIFOENTRY_DTYPE_PK_E },
43         { PKN,   NFIFOENTRY_DEST_CLASS1 | NFIFOENTRY_DTYPE_PK_N },
44         { PKA,   NFIFOENTRY_DEST_CLASS1 | NFIFOENTRY_DTYPE_PK_A },
45         { PKA0,  NFIFOENTRY_DEST_CLASS1 | NFIFOENTRY_DTYPE_PK_A0 },
46         { PKA1,  NFIFOENTRY_DEST_CLASS1 | NFIFOENTRY_DTYPE_PK_A1 },
47         { PKA2,  NFIFOENTRY_DEST_CLASS1 | NFIFOENTRY_DTYPE_PK_A2 },
48         { PKA3,  NFIFOENTRY_DEST_CLASS1 | NFIFOENTRY_DTYPE_PK_A3 },
49         { PKB,   NFIFOENTRY_DEST_CLASS1 | NFIFOENTRY_DTYPE_PK_B },
50         { PKB0,  NFIFOENTRY_DEST_CLASS1 | NFIFOENTRY_DTYPE_PK_B0 },
51         { PKB1,  NFIFOENTRY_DEST_CLASS1 | NFIFOENTRY_DTYPE_PK_B1 },
52         { PKB2,  NFIFOENTRY_DEST_CLASS1 | NFIFOENTRY_DTYPE_PK_B2 },
53         { PKB3,  NFIFOENTRY_DEST_CLASS1 | NFIFOENTRY_DTYPE_PK_B3 },
54         { AB1,   NFIFOENTRY_DEST_CLASS1 },
55         { AB2,   NFIFOENTRY_DEST_CLASS2 },
56         { ABD,   NFIFOENTRY_DEST_DECO }
57 };
58
59 static const uint32_t nfifo_flags[][2] = {
60 /*1*/   { LAST1,         NFIFOENTRY_LC1 },
61         { LAST2,         NFIFOENTRY_LC2 },
62         { FLUSH1,        NFIFOENTRY_FC1 },
63         { BP,            NFIFOENTRY_BND },
64         { PAD_ZERO,      NFIFOENTRY_PTYPE_ZEROS },
65         { PAD_NONZERO,   NFIFOENTRY_PTYPE_RND_NOZEROS },
66         { PAD_INCREMENT, NFIFOENTRY_PTYPE_INCREMENT },
67         { PAD_RANDOM,    NFIFOENTRY_PTYPE_RND },
68         { PAD_ZERO_N1,   NFIFOENTRY_PTYPE_ZEROS_NZ },
69         { PAD_NONZERO_0, NFIFOENTRY_PTYPE_RND_NZ_LZ },
70         { PAD_N1,        NFIFOENTRY_PTYPE_N },
71 /*12*/  { PAD_NONZERO_N, NFIFOENTRY_PTYPE_RND_NZ_N },
72         { FLUSH2,        NFIFOENTRY_FC2 },
73         { OC,            NFIFOENTRY_OC }
74 };
75
76 /*
77  * Allowed NFIFO LOAD flags for each SEC Era.
78  * Values represent the number of entries from nfifo_flags[] that are supported.
79  */
80 static const unsigned int nfifo_flags_sz[] = {12, 14, 14, 14, 14, 14, 14, 14};
81
82 static const uint32_t nfifo_pad_flags[][2] = {
83         { BM, NFIFOENTRY_BM },
84         { PS, NFIFOENTRY_PS },
85         { PR, NFIFOENTRY_PR }
86 };
87
88 /*
89  * Allowed NFIFO LOAD pad flags for each SEC Era.
90  * Values represent the number of entries from nfifo_pad_flags[] that are
91  * supported.
92  */
93 static const unsigned int nfifo_pad_flags_sz[] = {2, 2, 2, 2, 3, 3, 3, 3};
94
95 static inline int
96 rta_nfifo_load(struct program *program, uint32_t src,
97                uint32_t data, uint32_t length, uint32_t flags)
98 {
99         uint32_t opcode = 0, val;
100         int ret = -EINVAL;
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;
104
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));
108                 goto err;
109         }
110
111         /* write source field */
112         ret = __rta_map_opcode(src, nfifo_src, nfifo_src_sz[rta_sec_era], &val);
113         if (ret < 0) {
114                 pr_err("NFIFO: Invalid SRC. SEC PC: %d; Instr: %d\n",
115                        program->current_pc, program->current_instruction);
116                 goto err;
117         }
118         opcode |= val;
119
120         /* write type field */
121         ret = __rta_map_opcode(data, nfifo_data, ARRAY_SIZE(nfifo_data), &val);
122         if (ret < 0) {
123                 pr_err("NFIFO: Invalid data. SEC PC: %d; Instr: %d\n",
124                        program->current_pc, program->current_instruction);
125                 goto err;
126         }
127         opcode |= val;
128
129         /* write DL field */
130         if (!(flags & EXT)) {
131                 opcode |= length & NFIFOENTRY_DLEN_MASK;
132                 load_cmd |= 4;
133         } else {
134                 load_cmd |= 8;
135         }
136
137         /* write flags */
138         __rta_map_flags(flags, nfifo_flags, nfifo_flags_sz[rta_sec_era],
139                         &opcode);
140
141         /* in case of padding, check the destination */
142         if (src == PAD)
143                 __rta_map_flags(flags, nfifo_pad_flags,
144                                 nfifo_pad_flags_sz[rta_sec_era], &opcode);
145
146         /* write LOAD command first */
147         __rta_out32(program, load_cmd);
148         __rta_out32(program, opcode);
149
150         if (flags & EXT)
151                 __rta_out32(program, length & NFIFOENTRY_DLEN_MASK);
152
153         program->current_instruction++;
154
155         return (int)start_pc;
156
157  err:
158         program->first_error_pc = start_pc;
159         program->current_instruction++;
160         return ret;
161 }
162
163 #endif /* __RTA_NFIFO_CMD_H__ */