crypto/dpaa2_sec: support CAAM HW era 10
[dpdk.git] / drivers / crypto / dpaa2_sec / hw / rta / seq_in_out_ptr_cmd.h
1 /* SPDX-License-Identifier: (BSD-3-Clause OR GPL-2.0)
2  *
3  * Copyright 2008-2016 Freescale Semiconductor Inc.
4  * Copyright 2016,2019 NXP
5  */
6
7 #ifndef __RTA_SEQ_IN_OUT_PTR_CMD_H__
8 #define __RTA_SEQ_IN_OUT_PTR_CMD_H__
9
10 extern enum rta_sec_era rta_sec_era;
11
12 /* Allowed SEQ IN PTR flags for each SEC Era. */
13 static const uint32_t seq_in_ptr_flags[] = {
14         RBS | INL | SGF | PRE | EXT | RTO,
15         RBS | INL | SGF | PRE | EXT | RTO | RJD,
16         RBS | INL | SGF | PRE | EXT | RTO | RJD,
17         RBS | INL | SGF | PRE | EXT | RTO | RJD,
18         RBS | INL | SGF | PRE | EXT | RTO | RJD | SOP,
19         RBS | INL | SGF | PRE | EXT | RTO | RJD | SOP,
20         RBS | INL | SGF | PRE | EXT | RTO | RJD | SOP,
21         RBS | INL | SGF | PRE | EXT | RTO | RJD | SOP,
22         RBS | INL | SGF | PRE | EXT | RTO | RJD | SOP,
23         RBS | INL | SGF | PRE | EXT | RTO | RJD | SOP
24 };
25
26 /* Allowed SEQ OUT PTR flags for each SEC Era. */
27 static const uint32_t seq_out_ptr_flags[] = {
28         SGF | PRE | EXT,
29         SGF | PRE | EXT | RTO,
30         SGF | PRE | EXT | RTO,
31         SGF | PRE | EXT | RTO,
32         SGF | PRE | EXT | RTO | RST | EWS,
33         SGF | PRE | EXT | RTO | RST | EWS,
34         SGF | PRE | EXT | RTO | RST | EWS,
35         SGF | PRE | EXT | RTO | RST | EWS,
36         SGF | PRE | EXT | RTO | RST | EWS,
37         SGF | PRE | EXT | RTO | RST | EWS
38 };
39
40 static inline int
41 rta_seq_in_ptr(struct program *program, uint64_t src,
42                uint32_t length, uint32_t flags)
43 {
44         uint32_t opcode = CMD_SEQ_IN_PTR;
45         unsigned int start_pc = program->current_pc;
46         int ret = -EINVAL;
47
48         /* Parameters checking */
49         if ((flags & RTO) && (flags & PRE)) {
50                 pr_err("SEQ IN PTR: Invalid usage of RTO and PRE flags\n");
51                 goto err;
52         }
53         if (flags & ~seq_in_ptr_flags[rta_sec_era]) {
54                 pr_err("SEQ IN PTR: Flag(s) not supported by SEC Era %d\n",
55                        USER_SEC_ERA(rta_sec_era));
56                 goto err;
57         }
58         if ((flags & INL) && (flags & RJD)) {
59                 pr_err("SEQ IN PTR: Invalid usage of INL and RJD flags\n");
60                 goto err;
61         }
62         if ((src) && (flags & (SOP | RTO | PRE))) {
63                 pr_err("SEQ IN PTR: Invalid usage of RTO or PRE flag\n");
64                 goto err;
65         }
66         if ((flags & SOP) && (flags & (RBS | PRE | RTO | EXT))) {
67                 pr_err("SEQ IN PTR: Invalid usage of SOP and (RBS or PRE or RTO or EXT) flags\n");
68                 goto err;
69         }
70
71         /* write flag fields */
72         if (flags & RBS)
73                 opcode |= SQIN_RBS;
74         if (flags & INL)
75                 opcode |= SQIN_INL;
76         if (flags & SGF)
77                 opcode |= SQIN_SGF;
78         if (flags & PRE)
79                 opcode |= SQIN_PRE;
80         if (flags & RTO)
81                 opcode |= SQIN_RTO;
82         if (flags & RJD)
83                 opcode |= SQIN_RJD;
84         if (flags & SOP)
85                 opcode |= SQIN_SOP;
86         if ((length >> 16) || (flags & EXT)) {
87                 if (flags & SOP) {
88                         pr_err("SEQ IN PTR: Invalid usage of SOP and EXT flags\n");
89                         goto err;
90                 }
91
92                 opcode |= SQIN_EXT;
93         } else {
94                 opcode |= length & SQIN_LEN_MASK;
95         }
96
97         __rta_out32(program, opcode);
98         program->current_instruction++;
99
100         /* write pointer or immediate data field */
101         if (!(opcode & (SQIN_PRE | SQIN_RTO | SQIN_SOP)))
102                 __rta_out64(program, program->ps, src);
103
104         /* write extended length field */
105         if (opcode & SQIN_EXT)
106                 __rta_out32(program, length);
107
108         return (int)start_pc;
109
110  err:
111         program->first_error_pc = start_pc;
112         program->current_instruction++;
113         return ret;
114 }
115
116 static inline int
117 rta_seq_out_ptr(struct program *program, uint64_t dst,
118                 uint32_t length, uint32_t flags)
119 {
120         uint32_t opcode = CMD_SEQ_OUT_PTR;
121         unsigned int start_pc = program->current_pc;
122         int ret = -EINVAL;
123
124         /* Parameters checking */
125         if (flags & ~seq_out_ptr_flags[rta_sec_era]) {
126                 pr_err("SEQ OUT PTR: Flag(s) not supported by SEC Era %d\n",
127                        USER_SEC_ERA(rta_sec_era));
128                 goto err;
129         }
130         if ((flags & RTO) && (flags & PRE)) {
131                 pr_err("SEQ OUT PTR: Invalid usage of RTO and PRE flags\n");
132                 goto err;
133         }
134         if ((dst) && (flags & (RTO | PRE))) {
135                 pr_err("SEQ OUT PTR: Invalid usage of RTO or PRE flag\n");
136                 goto err;
137         }
138         if ((flags & RST) && !(flags & RTO)) {
139                 pr_err("SEQ OUT PTR: RST flag must be used with RTO flag\n");
140                 goto err;
141         }
142
143         /* write flag fields */
144         if (flags & SGF)
145                 opcode |= SQOUT_SGF;
146         if (flags & PRE)
147                 opcode |= SQOUT_PRE;
148         if (flags & RTO)
149                 opcode |= SQOUT_RTO;
150         if (flags & RST)
151                 opcode |= SQOUT_RST;
152         if (flags & EWS)
153                 opcode |= SQOUT_EWS;
154         if ((length >> 16) || (flags & EXT))
155                 opcode |= SQOUT_EXT;
156         else
157                 opcode |= length & SQOUT_LEN_MASK;
158
159         __rta_out32(program, opcode);
160         program->current_instruction++;
161
162         /* write pointer or immediate data field */
163         if (!(opcode & (SQOUT_PRE | SQOUT_RTO)))
164                 __rta_out64(program, program->ps, dst);
165
166         /* write extended length field */
167         if (opcode & SQOUT_EXT)
168                 __rta_out32(program, length);
169
170         return (int)start_pc;
171
172  err:
173         program->first_error_pc = start_pc;
174         program->current_instruction++;
175         return ret;
176 }
177
178 #endif /* __RTA_SEQ_IN_OUT_PTR_CMD_H__ */