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