crypto/dpaa2_sec: add run-time assembler for descriptor
[dpdk.git] / drivers / crypto / dpaa2_sec / hw / rta / nfifo_cmd.h
1 /*
2  * Copyright 2008-2016 Freescale Semiconductor, Inc.
3  *
4  * SPDX-License-Identifier: BSD-3-Clause or GPL-2.0+
5  */
6
7 #ifndef __RTA_NFIFO_CMD_H__
8 #define __RTA_NFIFO_CMD_H__
9
10 extern enum rta_sec_era rta_sec_era;
11
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 }
20 };
21
22 /*
23  * Allowed NFIFO LOAD sources for each SEC Era.
24  * Values represent the number of entries from nfifo_src[] that are supported.
25  */
26 static const unsigned int nfifo_src_sz[] = {4, 5, 5, 5, 5, 5, 5, 7};
27
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 }
56 };
57
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 },
72         { OC,            NFIFOENTRY_OC }
73 };
74
75 /*
76  * Allowed NFIFO LOAD flags for each SEC Era.
77  * Values represent the number of entries from nfifo_flags[] that are supported.
78  */
79 static const unsigned int nfifo_flags_sz[] = {12, 14, 14, 14, 14, 14, 14, 14};
80
81 static const uint32_t nfifo_pad_flags[][2] = {
82         { BM, NFIFOENTRY_BM },
83         { PS, NFIFOENTRY_PS },
84         { PR, NFIFOENTRY_PR }
85 };
86
87 /*
88  * Allowed NFIFO LOAD pad flags for each SEC Era.
89  * Values represent the number of entries from nfifo_pad_flags[] that are
90  * supported.
91  */
92 static const unsigned int nfifo_pad_flags_sz[] = {2, 2, 2, 2, 3, 3, 3, 3};
93
94 static inline int
95 rta_nfifo_load(struct program *program, uint32_t src,
96                uint32_t data, uint32_t length, uint32_t flags)
97 {
98         uint32_t opcode = 0, val;
99         int ret = -EINVAL;
100         uint32_t load_cmd = CMD_LOAD | LDST_IMM | LDST_CLASS_IND_CCB |
101                             LDST_SRCDST_WORD_INFO_FIFO;
102         unsigned int start_pc = program->current_pc;
103
104         if ((data == AFHA_SBOX) && (rta_sec_era == RTA_SEC_ERA_7)) {
105                 pr_err("NFIFO: AFHA S-box not supported by SEC Era %d\n",
106                        USER_SEC_ERA(rta_sec_era));
107                 goto err;
108         }
109
110         /* write source field */
111         ret = __rta_map_opcode(src, nfifo_src, nfifo_src_sz[rta_sec_era], &val);
112         if (ret < 0) {
113                 pr_err("NFIFO: Invalid SRC. SEC PC: %d; Instr: %d\n",
114                        program->current_pc, program->current_instruction);
115                 goto err;
116         }
117         opcode |= val;
118
119         /* write type field */
120         ret = __rta_map_opcode(data, nfifo_data, ARRAY_SIZE(nfifo_data), &val);
121         if (ret < 0) {
122                 pr_err("NFIFO: Invalid data. SEC PC: %d; Instr: %d\n",
123                        program->current_pc, program->current_instruction);
124                 goto err;
125         }
126         opcode |= val;
127
128         /* write DL field */
129         if (!(flags & EXT)) {
130                 opcode |= length & NFIFOENTRY_DLEN_MASK;
131                 load_cmd |= 4;
132         } else {
133                 load_cmd |= 8;
134         }
135
136         /* write flags */
137         __rta_map_flags(flags, nfifo_flags, nfifo_flags_sz[rta_sec_era],
138                         &opcode);
139
140         /* in case of padding, check the destination */
141         if (src == PAD)
142                 __rta_map_flags(flags, nfifo_pad_flags,
143                                 nfifo_pad_flags_sz[rta_sec_era], &opcode);
144
145         /* write LOAD command first */
146         __rta_out32(program, load_cmd);
147         __rta_out32(program, opcode);
148
149         if (flags & EXT)
150                 __rta_out32(program, length & NFIFOENTRY_DLEN_MASK);
151
152         program->current_instruction++;
153
154         return (int)start_pc;
155
156  err:
157         program->first_error_pc = start_pc;
158         program->current_instruction++;
159         return ret;
160 }
161
162 #endif /* __RTA_NFIFO_CMD_H__ */