drivers: use SPDX tag in NXP dpaa2 files
[dpdk.git] / drivers / crypto / dpaa2_sec / hw / rta / operation_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_OPERATION_CMD_H__
9 #define __RTA_OPERATION_CMD_H__
10
11 extern enum rta_sec_era rta_sec_era;
12
13 static inline int
14 __rta_alg_aai_aes(uint16_t aai)
15 {
16         uint16_t aes_mode = aai & OP_ALG_AESA_MODE_MASK;
17
18         if (aai & OP_ALG_AAI_C2K) {
19                 if (rta_sec_era < RTA_SEC_ERA_5)
20                         return -1;
21                 if ((aes_mode != OP_ALG_AAI_CCM) &&
22                     (aes_mode != OP_ALG_AAI_GCM))
23                         return -EINVAL;
24         }
25
26         switch (aes_mode) {
27         case OP_ALG_AAI_CBC_CMAC:
28         case OP_ALG_AAI_CTR_CMAC_LTE:
29         case OP_ALG_AAI_CTR_CMAC:
30                 if (rta_sec_era < RTA_SEC_ERA_2)
31                         return -EINVAL;
32                 /* no break */
33         case OP_ALG_AAI_CTR:
34         case OP_ALG_AAI_CBC:
35         case OP_ALG_AAI_ECB:
36         case OP_ALG_AAI_OFB:
37         case OP_ALG_AAI_CFB:
38         case OP_ALG_AAI_XTS:
39         case OP_ALG_AAI_CMAC:
40         case OP_ALG_AAI_XCBC_MAC:
41         case OP_ALG_AAI_CCM:
42         case OP_ALG_AAI_GCM:
43         case OP_ALG_AAI_CBC_XCBCMAC:
44         case OP_ALG_AAI_CTR_XCBCMAC:
45                 return 0;
46         }
47
48         return -EINVAL;
49 }
50
51 static inline int
52 __rta_alg_aai_des(uint16_t aai)
53 {
54         uint16_t aai_code = (uint16_t)(aai & ~OP_ALG_AAI_CHECKODD);
55
56         switch (aai_code) {
57         case OP_ALG_AAI_CBC:
58         case OP_ALG_AAI_ECB:
59         case OP_ALG_AAI_CFB:
60         case OP_ALG_AAI_OFB:
61                 return 0;
62         }
63
64         return -EINVAL;
65 }
66
67 static inline int
68 __rta_alg_aai_md5(uint16_t aai)
69 {
70         switch (aai) {
71         case OP_ALG_AAI_HMAC:
72                 if (rta_sec_era < RTA_SEC_ERA_2)
73                         return -EINVAL;
74                 /* no break */
75         case OP_ALG_AAI_SMAC:
76         case OP_ALG_AAI_HASH:
77         case OP_ALG_AAI_HMAC_PRECOMP:
78                 return 0;
79         }
80
81         return -EINVAL;
82 }
83
84 static inline int
85 __rta_alg_aai_sha(uint16_t aai)
86 {
87         switch (aai) {
88         case OP_ALG_AAI_HMAC:
89                 if (rta_sec_era < RTA_SEC_ERA_2)
90                         return -EINVAL;
91                 /* no break */
92         case OP_ALG_AAI_HASH:
93         case OP_ALG_AAI_HMAC_PRECOMP:
94                 return 0;
95         }
96
97         return -EINVAL;
98 }
99
100 static inline int
101 __rta_alg_aai_rng(uint16_t aai)
102 {
103         uint16_t rng_mode = aai & OP_ALG_RNG_MODE_MASK;
104         uint16_t rng_sh = aai & OP_ALG_AAI_RNG4_SH_MASK;
105
106         switch (rng_mode) {
107         case OP_ALG_AAI_RNG:
108         case OP_ALG_AAI_RNG_NZB:
109         case OP_ALG_AAI_RNG_OBP:
110                 break;
111         default:
112                 return -EINVAL;
113         }
114
115         /* State Handle bits are valid only for SEC Era >= 5 */
116         if ((rta_sec_era < RTA_SEC_ERA_5) && rng_sh)
117                 return -EINVAL;
118
119         /* PS, AI, SK bits are also valid only for SEC Era >= 5 */
120         if ((rta_sec_era < RTA_SEC_ERA_5) && (aai &
121              (OP_ALG_AAI_RNG4_PS | OP_ALG_AAI_RNG4_AI | OP_ALG_AAI_RNG4_SK)))
122                 return -EINVAL;
123
124         switch (rng_sh) {
125         case OP_ALG_AAI_RNG4_SH_0:
126         case OP_ALG_AAI_RNG4_SH_1:
127                 return 0;
128         }
129
130         return -EINVAL;
131 }
132
133 static inline int
134 __rta_alg_aai_crc(uint16_t aai)
135 {
136         uint16_t aai_code = aai & OP_ALG_CRC_POLY_MASK;
137
138         switch (aai_code) {
139         case OP_ALG_AAI_802:
140         case OP_ALG_AAI_3385:
141         case OP_ALG_AAI_CUST_POLY:
142                 return 0;
143         }
144
145         return -EINVAL;
146 }
147
148 static inline int
149 __rta_alg_aai_kasumi(uint16_t aai)
150 {
151         switch (aai) {
152         case OP_ALG_AAI_GSM:
153         case OP_ALG_AAI_EDGE:
154         case OP_ALG_AAI_F8:
155         case OP_ALG_AAI_F9:
156                 return 0;
157         }
158
159         return -EINVAL;
160 }
161
162 static inline int
163 __rta_alg_aai_snow_f9(uint16_t aai)
164 {
165         if (aai == OP_ALG_AAI_F9)
166                 return 0;
167
168         return -EINVAL;
169 }
170
171 static inline int
172 __rta_alg_aai_snow_f8(uint16_t aai)
173 {
174         if (aai == OP_ALG_AAI_F8)
175                 return 0;
176
177         return -EINVAL;
178 }
179
180 static inline int
181 __rta_alg_aai_zuce(uint16_t aai)
182 {
183         if (aai == OP_ALG_AAI_F8)
184                 return 0;
185
186         return -EINVAL;
187 }
188
189 static inline int
190 __rta_alg_aai_zuca(uint16_t aai)
191 {
192         if (aai == OP_ALG_AAI_F9)
193                 return 0;
194
195         return -EINVAL;
196 }
197
198 struct alg_aai_map {
199         uint32_t chipher_algo;
200         int (*aai_func)(uint16_t);
201         uint32_t class;
202 };
203
204 static const struct alg_aai_map alg_table[] = {
205 /*1*/   { OP_ALG_ALGSEL_AES,      __rta_alg_aai_aes,    OP_TYPE_CLASS1_ALG },
206         { OP_ALG_ALGSEL_DES,      __rta_alg_aai_des,    OP_TYPE_CLASS1_ALG },
207         { OP_ALG_ALGSEL_3DES,     __rta_alg_aai_des,    OP_TYPE_CLASS1_ALG },
208         { OP_ALG_ALGSEL_MD5,      __rta_alg_aai_md5,    OP_TYPE_CLASS2_ALG },
209         { OP_ALG_ALGSEL_SHA1,     __rta_alg_aai_md5,    OP_TYPE_CLASS2_ALG },
210         { OP_ALG_ALGSEL_SHA224,   __rta_alg_aai_sha,    OP_TYPE_CLASS2_ALG },
211         { OP_ALG_ALGSEL_SHA256,   __rta_alg_aai_sha,    OP_TYPE_CLASS2_ALG },
212         { OP_ALG_ALGSEL_SHA384,   __rta_alg_aai_sha,    OP_TYPE_CLASS2_ALG },
213         { OP_ALG_ALGSEL_SHA512,   __rta_alg_aai_sha,    OP_TYPE_CLASS2_ALG },
214         { OP_ALG_ALGSEL_RNG,      __rta_alg_aai_rng,    OP_TYPE_CLASS1_ALG },
215 /*11*/  { OP_ALG_ALGSEL_CRC,      __rta_alg_aai_crc,    OP_TYPE_CLASS2_ALG },
216         { OP_ALG_ALGSEL_ARC4,     NULL,                 OP_TYPE_CLASS1_ALG },
217         { OP_ALG_ALGSEL_SNOW_F8,  __rta_alg_aai_snow_f8, OP_TYPE_CLASS1_ALG },
218 /*14*/  { OP_ALG_ALGSEL_KASUMI,   __rta_alg_aai_kasumi, OP_TYPE_CLASS1_ALG },
219         { OP_ALG_ALGSEL_SNOW_F9,  __rta_alg_aai_snow_f9, OP_TYPE_CLASS2_ALG },
220         { OP_ALG_ALGSEL_ZUCE,     __rta_alg_aai_zuce,   OP_TYPE_CLASS1_ALG },
221 /*17*/  { OP_ALG_ALGSEL_ZUCA,     __rta_alg_aai_zuca,   OP_TYPE_CLASS2_ALG }
222 };
223
224 /*
225  * Allowed OPERATION algorithms for each SEC Era.
226  * Values represent the number of entries from alg_table[] that are supported.
227  */
228 static const unsigned int alg_table_sz[] = {14, 15, 15, 15, 17, 17, 11, 17};
229
230 static inline int
231 rta_operation(struct program *program, uint32_t cipher_algo,
232               uint16_t aai, uint8_t algo_state,
233               int icv_checking, int enc)
234 {
235         uint32_t opcode = CMD_OPERATION;
236         unsigned int i, found = 0;
237         unsigned int start_pc = program->current_pc;
238         int ret;
239
240         for (i = 0; i < alg_table_sz[rta_sec_era]; i++) {
241                 if (alg_table[i].chipher_algo == cipher_algo) {
242                         opcode |= cipher_algo | alg_table[i].class;
243                         /* nothing else to verify */
244                         if (alg_table[i].aai_func == NULL) {
245                                 found = 1;
246                                 break;
247                         }
248
249                         aai &= OP_ALG_AAI_MASK;
250
251                         ret = (*alg_table[i].aai_func)(aai);
252                         if (ret < 0) {
253                                 pr_err("OPERATION: Bad AAI Type. SEC Program Line: %d\n",
254                                        program->current_pc);
255                                 goto err;
256                         }
257                         opcode |= aai;
258                         found = 1;
259                         break;
260                 }
261         }
262         if (!found) {
263                 pr_err("OPERATION: Invalid Command. SEC Program Line: %d\n",
264                        program->current_pc);
265                 ret = -EINVAL;
266                 goto err;
267         }
268
269         switch (algo_state) {
270         case OP_ALG_AS_UPDATE:
271         case OP_ALG_AS_INIT:
272         case OP_ALG_AS_FINALIZE:
273         case OP_ALG_AS_INITFINAL:
274                 opcode |= algo_state;
275                 break;
276         default:
277                 pr_err("Invalid Operation Command\n");
278                 ret = -EINVAL;
279                 goto err;
280         }
281
282         switch (icv_checking) {
283         case ICV_CHECK_DISABLE:
284                 /*
285                  * opcode |= OP_ALG_ICV_OFF;
286                  * OP_ALG_ICV_OFF is 0
287                  */
288                 break;
289         case ICV_CHECK_ENABLE:
290                 opcode |= OP_ALG_ICV_ON;
291                 break;
292         default:
293                 pr_err("Invalid Operation Command\n");
294                 ret = -EINVAL;
295                 goto err;
296         }
297
298         switch (enc) {
299         case DIR_DEC:
300                 /*
301                  * opcode |= OP_ALG_DECRYPT;
302                  * OP_ALG_DECRYPT is 0
303                  */
304                 break;
305         case DIR_ENC:
306                 opcode |= OP_ALG_ENCRYPT;
307                 break;
308         default:
309                 pr_err("Invalid Operation Command\n");
310                 ret = -EINVAL;
311                 goto err;
312         }
313
314         __rta_out32(program, opcode);
315         program->current_instruction++;
316         return (int)start_pc;
317
318  err:
319         program->first_error_pc = start_pc;
320         return ret;
321 }
322
323 /*
324  * OPERATION PKHA routines
325  */
326 static inline int
327 __rta_pkha_clearmem(uint32_t pkha_op)
328 {
329         switch (pkha_op) {
330         case (OP_ALG_PKMODE_CLEARMEM_ALL):
331         case (OP_ALG_PKMODE_CLEARMEM_ABE):
332         case (OP_ALG_PKMODE_CLEARMEM_ABN):
333         case (OP_ALG_PKMODE_CLEARMEM_AB):
334         case (OP_ALG_PKMODE_CLEARMEM_AEN):
335         case (OP_ALG_PKMODE_CLEARMEM_AE):
336         case (OP_ALG_PKMODE_CLEARMEM_AN):
337         case (OP_ALG_PKMODE_CLEARMEM_A):
338         case (OP_ALG_PKMODE_CLEARMEM_BEN):
339         case (OP_ALG_PKMODE_CLEARMEM_BE):
340         case (OP_ALG_PKMODE_CLEARMEM_BN):
341         case (OP_ALG_PKMODE_CLEARMEM_B):
342         case (OP_ALG_PKMODE_CLEARMEM_EN):
343         case (OP_ALG_PKMODE_CLEARMEM_N):
344         case (OP_ALG_PKMODE_CLEARMEM_E):
345                 return 0;
346         }
347
348         return -EINVAL;
349 }
350
351 static inline int
352 __rta_pkha_mod_arithmetic(uint32_t pkha_op)
353 {
354         pkha_op &= (uint32_t)~OP_ALG_PKMODE_OUT_A;
355
356         switch (pkha_op) {
357         case (OP_ALG_PKMODE_MOD_ADD):
358         case (OP_ALG_PKMODE_MOD_SUB_AB):
359         case (OP_ALG_PKMODE_MOD_SUB_BA):
360         case (OP_ALG_PKMODE_MOD_MULT):
361         case (OP_ALG_PKMODE_MOD_MULT_IM):
362         case (OP_ALG_PKMODE_MOD_MULT_IM_OM):
363         case (OP_ALG_PKMODE_MOD_EXPO):
364         case (OP_ALG_PKMODE_MOD_EXPO_TEQ):
365         case (OP_ALG_PKMODE_MOD_EXPO_IM):
366         case (OP_ALG_PKMODE_MOD_EXPO_IM_TEQ):
367         case (OP_ALG_PKMODE_MOD_REDUCT):
368         case (OP_ALG_PKMODE_MOD_INV):
369         case (OP_ALG_PKMODE_MOD_MONT_CNST):
370         case (OP_ALG_PKMODE_MOD_CRT_CNST):
371         case (OP_ALG_PKMODE_MOD_GCD):
372         case (OP_ALG_PKMODE_MOD_PRIMALITY):
373         case (OP_ALG_PKMODE_MOD_SML_EXP):
374         case (OP_ALG_PKMODE_F2M_ADD):
375         case (OP_ALG_PKMODE_F2M_MUL):
376         case (OP_ALG_PKMODE_F2M_MUL_IM):
377         case (OP_ALG_PKMODE_F2M_MUL_IM_OM):
378         case (OP_ALG_PKMODE_F2M_EXP):
379         case (OP_ALG_PKMODE_F2M_EXP_TEQ):
380         case (OP_ALG_PKMODE_F2M_AMODN):
381         case (OP_ALG_PKMODE_F2M_INV):
382         case (OP_ALG_PKMODE_F2M_R2):
383         case (OP_ALG_PKMODE_F2M_GCD):
384         case (OP_ALG_PKMODE_F2M_SML_EXP):
385         case (OP_ALG_PKMODE_ECC_F2M_ADD):
386         case (OP_ALG_PKMODE_ECC_F2M_ADD_IM_OM_PROJ):
387         case (OP_ALG_PKMODE_ECC_F2M_DBL):
388         case (OP_ALG_PKMODE_ECC_F2M_DBL_IM_OM_PROJ):
389         case (OP_ALG_PKMODE_ECC_F2M_MUL):
390         case (OP_ALG_PKMODE_ECC_F2M_MUL_TEQ):
391         case (OP_ALG_PKMODE_ECC_F2M_MUL_R2):
392         case (OP_ALG_PKMODE_ECC_F2M_MUL_R2_TEQ):
393         case (OP_ALG_PKMODE_ECC_F2M_MUL_R2_PROJ):
394         case (OP_ALG_PKMODE_ECC_F2M_MUL_R2_PROJ_TEQ):
395         case (OP_ALG_PKMODE_ECC_MOD_ADD):
396         case (OP_ALG_PKMODE_ECC_MOD_ADD_IM_OM_PROJ):
397         case (OP_ALG_PKMODE_ECC_MOD_DBL):
398         case (OP_ALG_PKMODE_ECC_MOD_DBL_IM_OM_PROJ):
399         case (OP_ALG_PKMODE_ECC_MOD_MUL):
400         case (OP_ALG_PKMODE_ECC_MOD_MUL_TEQ):
401         case (OP_ALG_PKMODE_ECC_MOD_MUL_R2):
402         case (OP_ALG_PKMODE_ECC_MOD_MUL_R2_TEQ):
403         case (OP_ALG_PKMODE_ECC_MOD_MUL_R2_PROJ):
404         case (OP_ALG_PKMODE_ECC_MOD_MUL_R2_PROJ_TEQ):
405                 return 0;
406         }
407
408         return -EINVAL;
409 }
410
411 static inline int
412 __rta_pkha_copymem(uint32_t pkha_op)
413 {
414         switch (pkha_op) {
415         case (OP_ALG_PKMODE_COPY_NSZ_A0_B0):
416         case (OP_ALG_PKMODE_COPY_NSZ_A0_B1):
417         case (OP_ALG_PKMODE_COPY_NSZ_A0_B2):
418         case (OP_ALG_PKMODE_COPY_NSZ_A0_B3):
419         case (OP_ALG_PKMODE_COPY_NSZ_A1_B0):
420         case (OP_ALG_PKMODE_COPY_NSZ_A1_B1):
421         case (OP_ALG_PKMODE_COPY_NSZ_A1_B2):
422         case (OP_ALG_PKMODE_COPY_NSZ_A1_B3):
423         case (OP_ALG_PKMODE_COPY_NSZ_A2_B0):
424         case (OP_ALG_PKMODE_COPY_NSZ_A2_B1):
425         case (OP_ALG_PKMODE_COPY_NSZ_A2_B2):
426         case (OP_ALG_PKMODE_COPY_NSZ_A2_B3):
427         case (OP_ALG_PKMODE_COPY_NSZ_A3_B0):
428         case (OP_ALG_PKMODE_COPY_NSZ_A3_B1):
429         case (OP_ALG_PKMODE_COPY_NSZ_A3_B2):
430         case (OP_ALG_PKMODE_COPY_NSZ_A3_B3):
431         case (OP_ALG_PKMODE_COPY_NSZ_B0_A0):
432         case (OP_ALG_PKMODE_COPY_NSZ_B0_A1):
433         case (OP_ALG_PKMODE_COPY_NSZ_B0_A2):
434         case (OP_ALG_PKMODE_COPY_NSZ_B0_A3):
435         case (OP_ALG_PKMODE_COPY_NSZ_B1_A0):
436         case (OP_ALG_PKMODE_COPY_NSZ_B1_A1):
437         case (OP_ALG_PKMODE_COPY_NSZ_B1_A2):
438         case (OP_ALG_PKMODE_COPY_NSZ_B1_A3):
439         case (OP_ALG_PKMODE_COPY_NSZ_B2_A0):
440         case (OP_ALG_PKMODE_COPY_NSZ_B2_A1):
441         case (OP_ALG_PKMODE_COPY_NSZ_B2_A2):
442         case (OP_ALG_PKMODE_COPY_NSZ_B2_A3):
443         case (OP_ALG_PKMODE_COPY_NSZ_B3_A0):
444         case (OP_ALG_PKMODE_COPY_NSZ_B3_A1):
445         case (OP_ALG_PKMODE_COPY_NSZ_B3_A2):
446         case (OP_ALG_PKMODE_COPY_NSZ_B3_A3):
447         case (OP_ALG_PKMODE_COPY_NSZ_A_E):
448         case (OP_ALG_PKMODE_COPY_NSZ_A_N):
449         case (OP_ALG_PKMODE_COPY_NSZ_B_E):
450         case (OP_ALG_PKMODE_COPY_NSZ_B_N):
451         case (OP_ALG_PKMODE_COPY_NSZ_N_A):
452         case (OP_ALG_PKMODE_COPY_NSZ_N_B):
453         case (OP_ALG_PKMODE_COPY_NSZ_N_E):
454         case (OP_ALG_PKMODE_COPY_SSZ_A0_B0):
455         case (OP_ALG_PKMODE_COPY_SSZ_A0_B1):
456         case (OP_ALG_PKMODE_COPY_SSZ_A0_B2):
457         case (OP_ALG_PKMODE_COPY_SSZ_A0_B3):
458         case (OP_ALG_PKMODE_COPY_SSZ_A1_B0):
459         case (OP_ALG_PKMODE_COPY_SSZ_A1_B1):
460         case (OP_ALG_PKMODE_COPY_SSZ_A1_B2):
461         case (OP_ALG_PKMODE_COPY_SSZ_A1_B3):
462         case (OP_ALG_PKMODE_COPY_SSZ_A2_B0):
463         case (OP_ALG_PKMODE_COPY_SSZ_A2_B1):
464         case (OP_ALG_PKMODE_COPY_SSZ_A2_B2):
465         case (OP_ALG_PKMODE_COPY_SSZ_A2_B3):
466         case (OP_ALG_PKMODE_COPY_SSZ_A3_B0):
467         case (OP_ALG_PKMODE_COPY_SSZ_A3_B1):
468         case (OP_ALG_PKMODE_COPY_SSZ_A3_B2):
469         case (OP_ALG_PKMODE_COPY_SSZ_A3_B3):
470         case (OP_ALG_PKMODE_COPY_SSZ_B0_A0):
471         case (OP_ALG_PKMODE_COPY_SSZ_B0_A1):
472         case (OP_ALG_PKMODE_COPY_SSZ_B0_A2):
473         case (OP_ALG_PKMODE_COPY_SSZ_B0_A3):
474         case (OP_ALG_PKMODE_COPY_SSZ_B1_A0):
475         case (OP_ALG_PKMODE_COPY_SSZ_B1_A1):
476         case (OP_ALG_PKMODE_COPY_SSZ_B1_A2):
477         case (OP_ALG_PKMODE_COPY_SSZ_B1_A3):
478         case (OP_ALG_PKMODE_COPY_SSZ_B2_A0):
479         case (OP_ALG_PKMODE_COPY_SSZ_B2_A1):
480         case (OP_ALG_PKMODE_COPY_SSZ_B2_A2):
481         case (OP_ALG_PKMODE_COPY_SSZ_B2_A3):
482         case (OP_ALG_PKMODE_COPY_SSZ_B3_A0):
483         case (OP_ALG_PKMODE_COPY_SSZ_B3_A1):
484         case (OP_ALG_PKMODE_COPY_SSZ_B3_A2):
485         case (OP_ALG_PKMODE_COPY_SSZ_B3_A3):
486         case (OP_ALG_PKMODE_COPY_SSZ_A_E):
487         case (OP_ALG_PKMODE_COPY_SSZ_A_N):
488         case (OP_ALG_PKMODE_COPY_SSZ_B_E):
489         case (OP_ALG_PKMODE_COPY_SSZ_B_N):
490         case (OP_ALG_PKMODE_COPY_SSZ_N_A):
491         case (OP_ALG_PKMODE_COPY_SSZ_N_B):
492         case (OP_ALG_PKMODE_COPY_SSZ_N_E):
493                 return 0;
494         }
495
496         return -EINVAL;
497 }
498
499 static inline int
500 rta_pkha_operation(struct program *program, uint32_t op_pkha)
501 {
502         uint32_t opcode = CMD_OPERATION | OP_TYPE_PK | OP_ALG_PK;
503         uint32_t pkha_func;
504         unsigned int start_pc = program->current_pc;
505         int ret = -EINVAL;
506
507         pkha_func = op_pkha & OP_ALG_PK_FUN_MASK;
508
509         switch (pkha_func) {
510         case (OP_ALG_PKMODE_CLEARMEM):
511                 ret = __rta_pkha_clearmem(op_pkha);
512                 if (ret < 0) {
513                         pr_err("OPERATION PKHA: Type not supported. SEC Program Line: %d\n",
514                                program->current_pc);
515                         goto err;
516                 }
517                 break;
518         case (OP_ALG_PKMODE_MOD_ADD):
519         case (OP_ALG_PKMODE_MOD_SUB_AB):
520         case (OP_ALG_PKMODE_MOD_SUB_BA):
521         case (OP_ALG_PKMODE_MOD_MULT):
522         case (OP_ALG_PKMODE_MOD_EXPO):
523         case (OP_ALG_PKMODE_MOD_REDUCT):
524         case (OP_ALG_PKMODE_MOD_INV):
525         case (OP_ALG_PKMODE_MOD_MONT_CNST):
526         case (OP_ALG_PKMODE_MOD_CRT_CNST):
527         case (OP_ALG_PKMODE_MOD_GCD):
528         case (OP_ALG_PKMODE_MOD_PRIMALITY):
529         case (OP_ALG_PKMODE_MOD_SML_EXP):
530         case (OP_ALG_PKMODE_ECC_MOD_ADD):
531         case (OP_ALG_PKMODE_ECC_MOD_DBL):
532         case (OP_ALG_PKMODE_ECC_MOD_MUL):
533                 ret = __rta_pkha_mod_arithmetic(op_pkha);
534                 if (ret < 0) {
535                         pr_err("OPERATION PKHA: Type not supported. SEC Program Line: %d\n",
536                                program->current_pc);
537                         goto err;
538                 }
539                 break;
540         case (OP_ALG_PKMODE_COPY_NSZ):
541         case (OP_ALG_PKMODE_COPY_SSZ):
542                 ret = __rta_pkha_copymem(op_pkha);
543                 if (ret < 0) {
544                         pr_err("OPERATION PKHA: Type not supported. SEC Program Line: %d\n",
545                                program->current_pc);
546                         goto err;
547                 }
548                 break;
549         default:
550                 pr_err("Invalid Operation Command\n");
551                 goto err;
552         }
553
554         opcode |= op_pkha;
555
556         __rta_out32(program, opcode);
557         program->current_instruction++;
558         return (int)start_pc;
559
560  err:
561         program->first_error_pc = start_pc;
562         program->current_instruction++;
563         return ret;
564 }
565
566 #endif /* __RTA_OPERATION_CMD_H__ */