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