xref: /dpdk/drivers/common/dpaax/caamflib/rta/math_cmd.h (revision 882f25383499f422dc36cfd96ea688a92fb47d94)
1*c0ded849SHemant Agrawal /* SPDX-License-Identifier: (BSD-3-Clause OR GPL-2.0)
2*c0ded849SHemant Agrawal  *
3*c0ded849SHemant Agrawal  * Copyright 2008-2016 Freescale Semiconductor Inc.
4*c0ded849SHemant Agrawal  * Copyright 2016,2019 NXP
5*c0ded849SHemant Agrawal  */
6*c0ded849SHemant Agrawal 
7*c0ded849SHemant Agrawal #ifndef __RTA_MATH_CMD_H__
8*c0ded849SHemant Agrawal #define __RTA_MATH_CMD_H__
9*c0ded849SHemant Agrawal 
10*c0ded849SHemant Agrawal extern enum rta_sec_era rta_sec_era;
11*c0ded849SHemant Agrawal 
12*c0ded849SHemant Agrawal static const uint32_t math_op1[][2] = {
13*c0ded849SHemant Agrawal /*1*/	{ MATH0,     MATH_SRC0_REG0 },
14*c0ded849SHemant Agrawal 	{ MATH1,     MATH_SRC0_REG1 },
15*c0ded849SHemant Agrawal 	{ MATH2,     MATH_SRC0_REG2 },
16*c0ded849SHemant Agrawal 	{ MATH3,     MATH_SRC0_REG3 },
17*c0ded849SHemant Agrawal 	{ SEQINSZ,   MATH_SRC0_SEQINLEN },
18*c0ded849SHemant Agrawal 	{ SEQOUTSZ,  MATH_SRC0_SEQOUTLEN },
19*c0ded849SHemant Agrawal 	{ VSEQINSZ,  MATH_SRC0_VARSEQINLEN },
20*c0ded849SHemant Agrawal 	{ VSEQOUTSZ, MATH_SRC0_VARSEQOUTLEN },
21*c0ded849SHemant Agrawal 	{ ZERO,      MATH_SRC0_ZERO },
22*c0ded849SHemant Agrawal /*10*/	{ NONE,      0 }, /* dummy value */
23*c0ded849SHemant Agrawal 	{ DPOVRD,    MATH_SRC0_DPOVRD },
24*c0ded849SHemant Agrawal 	{ ONE,       MATH_SRC0_ONE }
25*c0ded849SHemant Agrawal };
26*c0ded849SHemant Agrawal 
27*c0ded849SHemant Agrawal /*
28*c0ded849SHemant Agrawal  * Allowed MATH op1 sources for each SEC Era.
29*c0ded849SHemant Agrawal  * Values represent the number of entries from math_op1[] that are supported.
30*c0ded849SHemant Agrawal  */
31*c0ded849SHemant Agrawal static const unsigned int math_op1_sz[] = {10, 10, 12, 12, 12, 12,
32*c0ded849SHemant Agrawal 					   12, 12, 12, 12};
33*c0ded849SHemant Agrawal 
34*c0ded849SHemant Agrawal static const uint32_t math_op2[][2] = {
35*c0ded849SHemant Agrawal /*1*/	{ MATH0,     MATH_SRC1_REG0 },
36*c0ded849SHemant Agrawal 	{ MATH1,     MATH_SRC1_REG1 },
37*c0ded849SHemant Agrawal 	{ MATH2,     MATH_SRC1_REG2 },
38*c0ded849SHemant Agrawal 	{ MATH3,     MATH_SRC1_REG3 },
39*c0ded849SHemant Agrawal 	{ ABD,       MATH_SRC1_INFIFO },
40*c0ded849SHemant Agrawal 	{ OFIFO,     MATH_SRC1_OUTFIFO },
41*c0ded849SHemant Agrawal 	{ ONE,       MATH_SRC1_ONE },
42*c0ded849SHemant Agrawal /*8*/	{ NONE,      0 }, /* dummy value */
43*c0ded849SHemant Agrawal 	{ JOBSRC,    MATH_SRC1_JOBSOURCE },
44*c0ded849SHemant Agrawal 	{ DPOVRD,    MATH_SRC1_DPOVRD },
45*c0ded849SHemant Agrawal 	{ VSEQINSZ,  MATH_SRC1_VARSEQINLEN },
46*c0ded849SHemant Agrawal 	{ VSEQOUTSZ, MATH_SRC1_VARSEQOUTLEN },
47*c0ded849SHemant Agrawal /*13*/	{ ZERO,      MATH_SRC1_ZERO }
48*c0ded849SHemant Agrawal };
49*c0ded849SHemant Agrawal 
50*c0ded849SHemant Agrawal /*
51*c0ded849SHemant Agrawal  * Allowed MATH op2 sources for each SEC Era.
52*c0ded849SHemant Agrawal  * Values represent the number of entries from math_op2[] that are supported.
53*c0ded849SHemant Agrawal  */
54*c0ded849SHemant Agrawal static const unsigned int math_op2_sz[] = {8, 9, 13, 13, 13, 13, 13, 13,
55*c0ded849SHemant Agrawal 					   13, 13};
56*c0ded849SHemant Agrawal 
57*c0ded849SHemant Agrawal static const uint32_t math_result[][2] = {
58*c0ded849SHemant Agrawal /*1*/	{ MATH0,     MATH_DEST_REG0 },
59*c0ded849SHemant Agrawal 	{ MATH1,     MATH_DEST_REG1 },
60*c0ded849SHemant Agrawal 	{ MATH2,     MATH_DEST_REG2 },
61*c0ded849SHemant Agrawal 	{ MATH3,     MATH_DEST_REG3 },
62*c0ded849SHemant Agrawal 	{ SEQINSZ,   MATH_DEST_SEQINLEN },
63*c0ded849SHemant Agrawal 	{ SEQOUTSZ,  MATH_DEST_SEQOUTLEN },
64*c0ded849SHemant Agrawal 	{ VSEQINSZ,  MATH_DEST_VARSEQINLEN },
65*c0ded849SHemant Agrawal 	{ VSEQOUTSZ, MATH_DEST_VARSEQOUTLEN },
66*c0ded849SHemant Agrawal /*9*/	{ NONE,      MATH_DEST_NONE },
67*c0ded849SHemant Agrawal 	{ DPOVRD,    MATH_DEST_DPOVRD }
68*c0ded849SHemant Agrawal };
69*c0ded849SHemant Agrawal 
70*c0ded849SHemant Agrawal /*
71*c0ded849SHemant Agrawal  * Allowed MATH result destinations for each SEC Era.
72*c0ded849SHemant Agrawal  * Values represent the number of entries from math_result[] that are
73*c0ded849SHemant Agrawal  * supported.
74*c0ded849SHemant Agrawal  */
75*c0ded849SHemant Agrawal static const unsigned int math_result_sz[] = {9, 9, 10, 10, 10, 10, 10, 10,
76*c0ded849SHemant Agrawal 					      10, 10};
77*c0ded849SHemant Agrawal 
78*c0ded849SHemant Agrawal static inline int
rta_math(struct program * program,uint64_t operand1,uint32_t op,uint64_t operand2,uint32_t result,int length,uint32_t options)79*c0ded849SHemant Agrawal rta_math(struct program *program, uint64_t operand1,
80*c0ded849SHemant Agrawal 	 uint32_t op, uint64_t operand2, uint32_t result,
81*c0ded849SHemant Agrawal 	 int length, uint32_t options)
82*c0ded849SHemant Agrawal {
83*c0ded849SHemant Agrawal 	uint32_t opcode = CMD_MATH;
84*c0ded849SHemant Agrawal 	uint32_t val = 0;
85*c0ded849SHemant Agrawal 	int ret = -EINVAL;
86*c0ded849SHemant Agrawal 	unsigned int start_pc = program->current_pc;
87*c0ded849SHemant Agrawal 
88*c0ded849SHemant Agrawal 	if (options & SWP) {
89*c0ded849SHemant Agrawal 		if ((options & IFB) ||
90*c0ded849SHemant Agrawal 		    (!(options & IMMED) && !(options & IMMED2)) ||
91*c0ded849SHemant Agrawal 		    ((options & IMMED) && (options & IMMED2))) {
92*c0ded849SHemant Agrawal 			pr_err("MATH: SWP - invalid configuration. SEC PC: %d; Instr: %d\n",
93*c0ded849SHemant Agrawal 			       program->current_pc,
94*c0ded849SHemant Agrawal 			       program->current_instruction);
95*c0ded849SHemant Agrawal 			goto err;
96*c0ded849SHemant Agrawal 		}
97*c0ded849SHemant Agrawal 	}
98*c0ded849SHemant Agrawal 
99*c0ded849SHemant Agrawal 	/*
100*c0ded849SHemant Agrawal 	 * SHLD operation is different from others and we
101*c0ded849SHemant Agrawal 	 * assume that we can have _NONE as first operand
102*c0ded849SHemant Agrawal 	 * or _SEQINSZ as second operand
103*c0ded849SHemant Agrawal 	 */
104*c0ded849SHemant Agrawal 	if ((op != MATH_FUN_SHLD) && ((operand1 == NONE) ||
105*c0ded849SHemant Agrawal 				      (operand2 == SEQINSZ))) {
106*c0ded849SHemant Agrawal 		pr_err("MATH: Invalid operand. SEC PC: %d; Instr: %d\n",
107*c0ded849SHemant Agrawal 		       program->current_pc, program->current_instruction);
108*c0ded849SHemant Agrawal 		goto err;
109*c0ded849SHemant Agrawal 	}
110*c0ded849SHemant Agrawal 
111*c0ded849SHemant Agrawal 	/*
112*c0ded849SHemant Agrawal 	 * We first check if it is unary operation. In that
113*c0ded849SHemant Agrawal 	 * case second operand must be _NONE
114*c0ded849SHemant Agrawal 	 */
115*c0ded849SHemant Agrawal 	if (((op == MATH_FUN_ZBYT) || (op == MATH_FUN_BSWAP)) &&
116*c0ded849SHemant Agrawal 	    (operand2 != NONE)) {
117*c0ded849SHemant Agrawal 		pr_err("MATH: Invalid operand2. SEC PC: %d; Instr: %d\n",
118*c0ded849SHemant Agrawal 		       program->current_pc, program->current_instruction);
119*c0ded849SHemant Agrawal 		goto err;
120*c0ded849SHemant Agrawal 	}
121*c0ded849SHemant Agrawal 
122*c0ded849SHemant Agrawal 	/* Write first operand field */
123*c0ded849SHemant Agrawal 	if (options & IMMED) {
124*c0ded849SHemant Agrawal 		opcode |= MATH_SRC0_IMM;
125*c0ded849SHemant Agrawal 	} else {
126*c0ded849SHemant Agrawal 		ret = __rta_map_opcode((uint32_t)operand1, math_op1,
127*c0ded849SHemant Agrawal 				       math_op1_sz[rta_sec_era], &val);
128*c0ded849SHemant Agrawal 		if (ret < 0) {
129*c0ded849SHemant Agrawal 			pr_err("MATH: operand1 not supported. SEC PC: %d; Instr: %d\n",
130*c0ded849SHemant Agrawal 			       program->current_pc,
131*c0ded849SHemant Agrawal 			       program->current_instruction);
132*c0ded849SHemant Agrawal 			goto err;
133*c0ded849SHemant Agrawal 		}
134*c0ded849SHemant Agrawal 		opcode |= val;
135*c0ded849SHemant Agrawal 	}
136*c0ded849SHemant Agrawal 
137*c0ded849SHemant Agrawal 	/* Write second operand field */
138*c0ded849SHemant Agrawal 	if (options & IMMED2) {
139*c0ded849SHemant Agrawal 		opcode |= MATH_SRC1_IMM;
140*c0ded849SHemant Agrawal 	} else {
141*c0ded849SHemant Agrawal 		ret = __rta_map_opcode((uint32_t)operand2, math_op2,
142*c0ded849SHemant Agrawal 				       math_op2_sz[rta_sec_era], &val);
143*c0ded849SHemant Agrawal 		if (ret < 0) {
144*c0ded849SHemant Agrawal 			pr_err("MATH: operand2 not supported. SEC PC: %d; Instr: %d\n",
145*c0ded849SHemant Agrawal 			       program->current_pc,
146*c0ded849SHemant Agrawal 			       program->current_instruction);
147*c0ded849SHemant Agrawal 			goto err;
148*c0ded849SHemant Agrawal 		}
149*c0ded849SHemant Agrawal 		opcode |= val;
150*c0ded849SHemant Agrawal 	}
151*c0ded849SHemant Agrawal 
152*c0ded849SHemant Agrawal 	/* Write result field */
153*c0ded849SHemant Agrawal 	ret = __rta_map_opcode(result, math_result, math_result_sz[rta_sec_era],
154*c0ded849SHemant Agrawal 			       &val);
155*c0ded849SHemant Agrawal 	if (ret < 0) {
156*c0ded849SHemant Agrawal 		pr_err("MATH: result not supported. SEC PC: %d; Instr: %d\n",
157*c0ded849SHemant Agrawal 		       program->current_pc, program->current_instruction);
158*c0ded849SHemant Agrawal 		goto err;
159*c0ded849SHemant Agrawal 	}
160*c0ded849SHemant Agrawal 	opcode |= val;
161*c0ded849SHemant Agrawal 
162*c0ded849SHemant Agrawal 	/*
163*c0ded849SHemant Agrawal 	 * as we encode operations with their "real" values, we do not
164*c0ded849SHemant Agrawal 	 * to translate but we do need to validate the value
165*c0ded849SHemant Agrawal 	 */
166*c0ded849SHemant Agrawal 	switch (op) {
167*c0ded849SHemant Agrawal 	/*Binary operators */
168*c0ded849SHemant Agrawal 	case (MATH_FUN_ADD):
169*c0ded849SHemant Agrawal 	case (MATH_FUN_ADDC):
170*c0ded849SHemant Agrawal 	case (MATH_FUN_SUB):
171*c0ded849SHemant Agrawal 	case (MATH_FUN_SUBB):
172*c0ded849SHemant Agrawal 	case (MATH_FUN_OR):
173*c0ded849SHemant Agrawal 	case (MATH_FUN_AND):
174*c0ded849SHemant Agrawal 	case (MATH_FUN_XOR):
175*c0ded849SHemant Agrawal 	case (MATH_FUN_LSHIFT):
176*c0ded849SHemant Agrawal 	case (MATH_FUN_RSHIFT):
177*c0ded849SHemant Agrawal 	case (MATH_FUN_SHLD):
178*c0ded849SHemant Agrawal 	/* Unary operators */
179*c0ded849SHemant Agrawal 	case (MATH_FUN_ZBYT):
180*c0ded849SHemant Agrawal 	case (MATH_FUN_BSWAP):
181*c0ded849SHemant Agrawal 		opcode |= op;
182*c0ded849SHemant Agrawal 		break;
183*c0ded849SHemant Agrawal 	default:
184*c0ded849SHemant Agrawal 		pr_err("MATH: operator is not supported. SEC PC: %d; Instr: %d\n",
185*c0ded849SHemant Agrawal 		       program->current_pc, program->current_instruction);
186*c0ded849SHemant Agrawal 		ret = -EINVAL;
187*c0ded849SHemant Agrawal 		goto err;
188*c0ded849SHemant Agrawal 	}
189*c0ded849SHemant Agrawal 
190*c0ded849SHemant Agrawal 	opcode |= (options & ~(IMMED | IMMED2));
191*c0ded849SHemant Agrawal 
192*c0ded849SHemant Agrawal 	/* Verify length */
193*c0ded849SHemant Agrawal 	switch (length) {
194*c0ded849SHemant Agrawal 	case (1):
195*c0ded849SHemant Agrawal 		opcode |= MATH_LEN_1BYTE;
196*c0ded849SHemant Agrawal 		break;
197*c0ded849SHemant Agrawal 	case (2):
198*c0ded849SHemant Agrawal 		opcode |= MATH_LEN_2BYTE;
199*c0ded849SHemant Agrawal 		break;
200*c0ded849SHemant Agrawal 	case (4):
201*c0ded849SHemant Agrawal 		opcode |= MATH_LEN_4BYTE;
202*c0ded849SHemant Agrawal 		break;
203*c0ded849SHemant Agrawal 	case (8):
204*c0ded849SHemant Agrawal 		opcode |= MATH_LEN_8BYTE;
205*c0ded849SHemant Agrawal 		break;
206*c0ded849SHemant Agrawal 	default:
207*c0ded849SHemant Agrawal 		pr_err("MATH: length is not supported. SEC PC: %d; Instr: %d\n",
208*c0ded849SHemant Agrawal 		       program->current_pc, program->current_instruction);
209*c0ded849SHemant Agrawal 		ret = -EINVAL;
210*c0ded849SHemant Agrawal 		goto err;
211*c0ded849SHemant Agrawal 	}
212*c0ded849SHemant Agrawal 
213*c0ded849SHemant Agrawal 	__rta_out32(program, opcode);
214*c0ded849SHemant Agrawal 	program->current_instruction++;
215*c0ded849SHemant Agrawal 
216*c0ded849SHemant Agrawal 	/* Write immediate value */
217*c0ded849SHemant Agrawal 	if ((options & IMMED) && !(options & IMMED2)) {
218*c0ded849SHemant Agrawal 		__rta_out64(program, (length > 4) && !(options & IFB),
219*c0ded849SHemant Agrawal 			    operand1);
220*c0ded849SHemant Agrawal 	} else if ((options & IMMED2) && !(options & IMMED)) {
221*c0ded849SHemant Agrawal 		__rta_out64(program, (length > 4) && !(options & IFB),
222*c0ded849SHemant Agrawal 			    operand2);
223*c0ded849SHemant Agrawal 	} else if ((options & IMMED) && (options & IMMED2)) {
224*c0ded849SHemant Agrawal 		__rta_out32(program, lower_32_bits(operand1));
225*c0ded849SHemant Agrawal 		__rta_out32(program, lower_32_bits(operand2));
226*c0ded849SHemant Agrawal 	}
227*c0ded849SHemant Agrawal 
228*c0ded849SHemant Agrawal 	return (int)start_pc;
229*c0ded849SHemant Agrawal 
230*c0ded849SHemant Agrawal  err:
231*c0ded849SHemant Agrawal 	program->first_error_pc = start_pc;
232*c0ded849SHemant Agrawal 	program->current_instruction++;
233*c0ded849SHemant Agrawal 	return ret;
234*c0ded849SHemant Agrawal }
235*c0ded849SHemant Agrawal 
236*c0ded849SHemant Agrawal static inline int
rta_mathi(struct program * program,uint64_t operand,uint32_t op,uint8_t imm,uint32_t result,int length,uint32_t options)237*c0ded849SHemant Agrawal rta_mathi(struct program *program, uint64_t operand,
238*c0ded849SHemant Agrawal 	  uint32_t op, uint8_t imm, uint32_t result,
239*c0ded849SHemant Agrawal 	  int length, uint32_t options)
240*c0ded849SHemant Agrawal {
241*c0ded849SHemant Agrawal 	uint32_t opcode = CMD_MATHI;
242*c0ded849SHemant Agrawal 	uint32_t val = 0;
243*c0ded849SHemant Agrawal 	int ret = -EINVAL;
244*c0ded849SHemant Agrawal 	unsigned int start_pc = program->current_pc;
245*c0ded849SHemant Agrawal 
246*c0ded849SHemant Agrawal 	if (((op == MATH_FUN_FBYT) && (options & SSEL))) {
247*c0ded849SHemant Agrawal 		pr_err("MATHI: Illegal combination - FBYT and SSEL. SEC PC: %d; Instr: %d\n",
248*c0ded849SHemant Agrawal 		       program->current_pc, program->current_instruction);
249*c0ded849SHemant Agrawal 		goto err;
250*c0ded849SHemant Agrawal 	}
251*c0ded849SHemant Agrawal 
252*c0ded849SHemant Agrawal 	/* Write first operand field */
253*c0ded849SHemant Agrawal 	if (!(options & SSEL))
254*c0ded849SHemant Agrawal 		ret = __rta_map_opcode((uint32_t)operand, math_op1,
255*c0ded849SHemant Agrawal 				       math_op1_sz[rta_sec_era], &val);
256*c0ded849SHemant Agrawal 	else
257*c0ded849SHemant Agrawal 		ret = __rta_map_opcode((uint32_t)operand, math_op2,
258*c0ded849SHemant Agrawal 				       math_op2_sz[rta_sec_era], &val);
259*c0ded849SHemant Agrawal 	if (ret < 0) {
260*c0ded849SHemant Agrawal 		pr_err("MATHI: operand not supported. SEC PC: %d; Instr: %d\n",
261*c0ded849SHemant Agrawal 		       program->current_pc, program->current_instruction);
262*c0ded849SHemant Agrawal 		goto err;
263*c0ded849SHemant Agrawal 	}
264*c0ded849SHemant Agrawal 
265*c0ded849SHemant Agrawal 	if (!(options & SSEL))
266*c0ded849SHemant Agrawal 		opcode |= val;
267*c0ded849SHemant Agrawal 	else
268*c0ded849SHemant Agrawal 		opcode |= (val << (MATHI_SRC1_SHIFT - MATH_SRC1_SHIFT));
269*c0ded849SHemant Agrawal 
270*c0ded849SHemant Agrawal 	/* Write second operand field */
271*c0ded849SHemant Agrawal 	opcode |= (imm << MATHI_IMM_SHIFT);
272*c0ded849SHemant Agrawal 
273*c0ded849SHemant Agrawal 	/* Write result field */
274*c0ded849SHemant Agrawal 	ret = __rta_map_opcode(result, math_result, math_result_sz[rta_sec_era],
275*c0ded849SHemant Agrawal 			       &val);
276*c0ded849SHemant Agrawal 	if (ret < 0) {
277*c0ded849SHemant Agrawal 		pr_err("MATHI: result not supported. SEC PC: %d; Instr: %d\n",
278*c0ded849SHemant Agrawal 		       program->current_pc, program->current_instruction);
279*c0ded849SHemant Agrawal 		goto err;
280*c0ded849SHemant Agrawal 	}
281*c0ded849SHemant Agrawal 	opcode |= (val << (MATHI_DEST_SHIFT - MATH_DEST_SHIFT));
282*c0ded849SHemant Agrawal 
283*c0ded849SHemant Agrawal 	/*
284*c0ded849SHemant Agrawal 	 * as we encode operations with their "real" values, we do not have to
285*c0ded849SHemant Agrawal 	 * translate but we do need to validate the value
286*c0ded849SHemant Agrawal 	 */
287*c0ded849SHemant Agrawal 	switch (op) {
288*c0ded849SHemant Agrawal 	case (MATH_FUN_ADD):
289*c0ded849SHemant Agrawal 	case (MATH_FUN_ADDC):
290*c0ded849SHemant Agrawal 	case (MATH_FUN_SUB):
291*c0ded849SHemant Agrawal 	case (MATH_FUN_SUBB):
292*c0ded849SHemant Agrawal 	case (MATH_FUN_OR):
293*c0ded849SHemant Agrawal 	case (MATH_FUN_AND):
294*c0ded849SHemant Agrawal 	case (MATH_FUN_XOR):
295*c0ded849SHemant Agrawal 	case (MATH_FUN_LSHIFT):
296*c0ded849SHemant Agrawal 	case (MATH_FUN_RSHIFT):
297*c0ded849SHemant Agrawal 	case (MATH_FUN_FBYT):
298*c0ded849SHemant Agrawal 		opcode |= op;
299*c0ded849SHemant Agrawal 		break;
300*c0ded849SHemant Agrawal 	default:
301*c0ded849SHemant Agrawal 		pr_err("MATHI: operator not supported. SEC PC: %d; Instr: %d\n",
302*c0ded849SHemant Agrawal 		       program->current_pc, program->current_instruction);
303*c0ded849SHemant Agrawal 		ret = -EINVAL;
304*c0ded849SHemant Agrawal 		goto err;
305*c0ded849SHemant Agrawal 	}
306*c0ded849SHemant Agrawal 
307*c0ded849SHemant Agrawal 	opcode |= options;
308*c0ded849SHemant Agrawal 
309*c0ded849SHemant Agrawal 	/* Verify length */
310*c0ded849SHemant Agrawal 	switch (length) {
311*c0ded849SHemant Agrawal 	case (1):
312*c0ded849SHemant Agrawal 		opcode |= MATH_LEN_1BYTE;
313*c0ded849SHemant Agrawal 		break;
314*c0ded849SHemant Agrawal 	case (2):
315*c0ded849SHemant Agrawal 		opcode |= MATH_LEN_2BYTE;
316*c0ded849SHemant Agrawal 		break;
317*c0ded849SHemant Agrawal 	case (4):
318*c0ded849SHemant Agrawal 		opcode |= MATH_LEN_4BYTE;
319*c0ded849SHemant Agrawal 		break;
320*c0ded849SHemant Agrawal 	case (8):
321*c0ded849SHemant Agrawal 		opcode |= MATH_LEN_8BYTE;
322*c0ded849SHemant Agrawal 		break;
323*c0ded849SHemant Agrawal 	default:
324*c0ded849SHemant Agrawal 		pr_err("MATHI: length %d not supported. SEC PC: %d; Instr: %d\n",
325*c0ded849SHemant Agrawal 		       length, program->current_pc,
326*c0ded849SHemant Agrawal 		       program->current_instruction);
327*c0ded849SHemant Agrawal 		ret = -EINVAL;
328*c0ded849SHemant Agrawal 		goto err;
329*c0ded849SHemant Agrawal 	}
330*c0ded849SHemant Agrawal 
331*c0ded849SHemant Agrawal 	__rta_out32(program, opcode);
332*c0ded849SHemant Agrawal 	program->current_instruction++;
333*c0ded849SHemant Agrawal 
334*c0ded849SHemant Agrawal 	return (int)start_pc;
335*c0ded849SHemant Agrawal 
336*c0ded849SHemant Agrawal  err:
337*c0ded849SHemant Agrawal 	program->first_error_pc = start_pc;
338*c0ded849SHemant Agrawal 	program->current_instruction++;
339*c0ded849SHemant Agrawal 	return ret;
340*c0ded849SHemant Agrawal }
341*c0ded849SHemant Agrawal 
342*c0ded849SHemant Agrawal #endif /* __RTA_MATH_CMD_H__ */
343