xref: /OK3568_Linux_fs/u-boot/include/rockchip/crypto_v2_pka.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * Copyright (c) 2019 Fuzhou Rockchip Electronics Co., Ltd
4*4882a593Smuzhiyun  */
5*4882a593Smuzhiyun 
6*4882a593Smuzhiyun #ifndef _ROCKCHIP_CRYPTO_V2_PKA_H_
7*4882a593Smuzhiyun #define _ROCKCHIP_CRYPTO_V2_PKA_H_
8*4882a593Smuzhiyun #include <common.h>
9*4882a593Smuzhiyun #include <rockchip/crypto_v2.h>
10*4882a593Smuzhiyun #include <rockchip/crypto_v2_util.h>
11*4882a593Smuzhiyun 
12*4882a593Smuzhiyun #define CRYPTO_BASE crypto_base
13*4882a593Smuzhiyun 
14*4882a593Smuzhiyun #define MPA_USE_ALLOC	1
15*4882a593Smuzhiyun 
16*4882a593Smuzhiyun struct mpa_num {
17*4882a593Smuzhiyun 	u32 alloc;
18*4882a593Smuzhiyun 	s32 size;
19*4882a593Smuzhiyun 	u32 *d;
20*4882a593Smuzhiyun };
21*4882a593Smuzhiyun 
22*4882a593Smuzhiyun #define RK_MAX_RSA_NBITS	4096
23*4882a593Smuzhiyun #define RK_MAX_RSA_NCHARS	((RK_MAX_RSA_NBITS) / 8)
24*4882a593Smuzhiyun #define RK_MAX_RSA_BWORDS	((RK_MAX_RSA_NBITS) / 32)
25*4882a593Smuzhiyun 
26*4882a593Smuzhiyun /* define NpCreateFlag values */
27*4882a593Smuzhiyun #define RK_PKA_CREATE_NP		1
28*4882a593Smuzhiyun #define RK_PKA_SET_NP		0
29*4882a593Smuzhiyun /* size of buffer for Barrett modulus tag NP, used in PKI algorithms */
30*4882a593Smuzhiyun #define RK_PKA_BARRETT_IN_WORDS	5
31*4882a593Smuzhiyun /* Barrett modulus tag type - 5 words size array */
32*4882a593Smuzhiyun typedef u32 RK_PKA_NP_t[RK_PKA_BARRETT_IN_WORDS];
33*4882a593Smuzhiyun 
34*4882a593Smuzhiyun #define RK_PKA_MemSetZero(buf, size) \
35*4882a593Smuzhiyun 			util_word_memset((void *)buf, 0x00, size)
36*4882a593Smuzhiyun 
37*4882a593Smuzhiyun #define RK_PKA_FastMemCpy(dst, src, size) \
38*4882a593Smuzhiyun 			util_word_memcpy((void *)dst, (void *)src, size)
39*4882a593Smuzhiyun 
40*4882a593Smuzhiyun #define RK_PKA_ReverseMemcpy(dst, src, size) \
41*4882a593Smuzhiyun 			util_reverse_word_memcpy((void *)dst, (void *)src, size)
42*4882a593Smuzhiyun 
43*4882a593Smuzhiyun #define RES_DISCARD 0x3F
44*4882a593Smuzhiyun 
45*4882a593Smuzhiyun /* base address -  0x00F10B00 */
46*4882a593Smuzhiyun #define RK_PKI_ERROR_BASE			0x00F10B00
47*4882a593Smuzhiyun #define RK_PKI_HW_VER_INCORRECT_ERROR		(RK_PKI_ERROR_BASE + 0x0UL)
48*4882a593Smuzhiyun #define RK_PKI_HW_DECRYPED_ERROR		(RK_PKI_ERROR_BASE + 0x1UL)
49*4882a593Smuzhiyun #define RK_PKI_KEY_SIZE_ERROR			(RK_PKI_ERROR_BASE + 0x2UL)
50*4882a593Smuzhiyun 
51*4882a593Smuzhiyun /* Error definitions for PKA using */
52*4882a593Smuzhiyun #define RK_PKA_ILLEGAL_PTR_ERROR		(RK_PKI_ERROR_BASE + 0x20UL)
53*4882a593Smuzhiyun #define RK_PKA_ENTRIES_COUNT_ERROR		(RK_PKI_ERROR_BASE + 0x21UL)
54*4882a593Smuzhiyun #define RK_PKA_REGISTER_SIZES_ERROR		(RK_PKI_ERROR_BASE + 0x22UL)
55*4882a593Smuzhiyun #define RK_PKA_SET_MAP_MODE_ERROR		(RK_PKI_ERROR_BASE + 0x23UL)
56*4882a593Smuzhiyun 
57*4882a593Smuzhiyun #define RK_PKA_DIVIDER_IS_NULL_ERROR		(RK_PKI_ERROR_BASE + 0x2EUL)
58*4882a593Smuzhiyun #define RK_PKA_MODULUS_IS_NULL_ERROR		(RK_PKI_ERROR_BASE + 0x2FUL)
59*4882a593Smuzhiyun #define RK_PKA_DATA_SIZE_ERROR			(RK_PKI_ERROR_BASE + 0x30UL)
60*4882a593Smuzhiyun #define RK_PKA_OPERATION_SIZE_ERROR		(RK_PKI_ERROR_BASE + 0x31UL)
61*4882a593Smuzhiyun 
62*4882a593Smuzhiyun #define RK_PKA_MAX_REGS_COUNT			8
63*4882a593Smuzhiyun #define RK_PKA_MAX_PHYS_MEM_REGS_COUNT		32
64*4882a593Smuzhiyun #define RK_PKA_MAX_REGS_MEM_SIZE_BYTES		4096
65*4882a593Smuzhiyun 
66*4882a593Smuzhiyun /* PKA control values  */
67*4882a593Smuzhiyun #define RK_PKA_PIPE_READY			1
68*4882a593Smuzhiyun #define RK_PKA_OP_DONE				1
69*4882a593Smuzhiyun #define RK_PKA_SW_REST				1
70*4882a593Smuzhiyun 
71*4882a593Smuzhiyun /* PKA N_NP_T0_T1 register fields positions (low bit position) */
72*4882a593Smuzhiyun #define RK_PKA_N_NP_T0_T1_REG_N_POS		CRYPTO_N_VIRTUAL_ADDR_SHIFT
73*4882a593Smuzhiyun #define RK_PKA_N_NP_T0_T1_REG_NP_POS		CRYPTO_NP_VIRTUAL_ADDR_SHIFT
74*4882a593Smuzhiyun #define RK_PKA_N_NP_T0_T1_REG_T0_POS		CRYPTO_T0_VIRTUAL_ADDR_SHIFT
75*4882a593Smuzhiyun #define RK_PKA_N_NP_T0_T1_REG_T1_POS		CRYPTO_T1_VIRTUAL_ADDR_SHIFT
76*4882a593Smuzhiyun 
77*4882a593Smuzhiyun /* PKA N_NP_T0_T1 register default (reset) value: N=0, NP=1, T0=30, T1=31 */
78*4882a593Smuzhiyun #define PKA_N					0UL
79*4882a593Smuzhiyun #define PKA_NP					1UL
80*4882a593Smuzhiyun #define PKA_T0					30UL
81*4882a593Smuzhiyun #define PKA_T1					31UL
82*4882a593Smuzhiyun #define RK_PKA_N_NP_T0_T1_REG_DEFAULT_VAL \
83*4882a593Smuzhiyun 				(PKA_N  << RK_PKA_N_NP_T0_T1_REG_N_POS | \
84*4882a593Smuzhiyun 				PKA_NP << RK_PKA_N_NP_T0_T1_REG_NP_POS | \
85*4882a593Smuzhiyun 				PKA_T0 << RK_PKA_N_NP_T0_T1_REG_T0_POS | \
86*4882a593Smuzhiyun 				PKA_T1 << RK_PKA_N_NP_T0_T1_REG_T1_POS)
87*4882a593Smuzhiyun 
88*4882a593Smuzhiyun /* PKA STATUS register fields positions (low bit position) */
89*4882a593Smuzhiyun #define RK_PKA_STATUS_PIPE_IS_REDY_POS		0
90*4882a593Smuzhiyun #define RK_PKA_STATUS_PKA_BUSY_POS		1
91*4882a593Smuzhiyun #define RK_PKA_STATUS_ALU_OUT_ZERO_POS		2
92*4882a593Smuzhiyun #define RK_PKA_STATUS_ALU_MODOVRFLW_POS		3
93*4882a593Smuzhiyun #define RK_PKA_STATUS_DIV_BY_ZERO_POS		4
94*4882a593Smuzhiyun #define RK_PKA_STATUS_ALU_CARRY_POS		5
95*4882a593Smuzhiyun #define RK_PKA_STATUS_ALU_SIGN_OUT_POS		6
96*4882a593Smuzhiyun #define RK_PKA_STATUS_MODINV_OF_ZERO_POS	7
97*4882a593Smuzhiyun #define RK_PKA_STATUS_PKA_CPU_BUSY_POS		8
98*4882a593Smuzhiyun #define RK_PKA_STATUS_OPCODE_POS		9
99*4882a593Smuzhiyun #define RK_PKA_STATUS_TAG_POS			14
100*4882a593Smuzhiyun 
101*4882a593Smuzhiyun #define RK_PKA_STATUS_OPCODE_MASK		0x1FUl
102*4882a593Smuzhiyun #define RK_PKA_STATUS_TAG_MASK			0x3FUl
103*4882a593Smuzhiyun 
104*4882a593Smuzhiyun /* PKA OPCODE register fields positions (low bit position) */
105*4882a593Smuzhiyun #define RK_PKA_OPCODE_TAG_POS			0
106*4882a593Smuzhiyun #define RK_PKA_OPCODE_RESULT_POS		6
107*4882a593Smuzhiyun #define RK_PKA_OPCODE_R_DISCARD_POS		11
108*4882a593Smuzhiyun #define RK_PKA_OPCODE_OPERAND_2_POS		12
109*4882a593Smuzhiyun #define RK_PKA_OPCODE_OPERAND_2_IMMED_POS	17
110*4882a593Smuzhiyun #define RK_PKA_OPCODE_OPERAND_1_POS		18
111*4882a593Smuzhiyun #define RK_PKA_OPCODE_OPERAND_1_IMMED_POS	23
112*4882a593Smuzhiyun #define RK_PKA_OPCODE_LEN_POS			24
113*4882a593Smuzhiyun #define RK_PKA_OPCODE_OPERATION_ID_POS		27
114*4882a593Smuzhiyun 
115*4882a593Smuzhiyun /* PKA data registers base address
116*4882a593Smuzhiyun  *should be always zero since it's the offset
117*4882a593Smuzhiyun  * from the start of the PKA memory and not from the HOST memory
118*4882a593Smuzhiyun  */
119*4882a593Smuzhiyun #define RK_PKA_DATA_REGS_BASE_ADDR		(CRYPTO_BASE + CRYPTO_SRAM_BASE)
120*4882a593Smuzhiyun #define RK_PKA_DATA_REGS_MEMORY_OFFSET_ADDR	(CRYPTO_BASE + CRYPTO_SRAM_BASE)
121*4882a593Smuzhiyun 
122*4882a593Smuzhiyun /* Machine Opcodes definitions (according to HW CRS ) */
123*4882a593Smuzhiyun #define   RK_PKA_MIN_OPCODE			0x00
124*4882a593Smuzhiyun 
125*4882a593Smuzhiyun #define PKA_Add					0x04
126*4882a593Smuzhiyun #define PKA_AddIm				0x04
127*4882a593Smuzhiyun #define PKA_Sub					0x05
128*4882a593Smuzhiyun #define PKA_SubIm				0x05
129*4882a593Smuzhiyun #define PKA_Neg					0x05
130*4882a593Smuzhiyun #define PKA_ModAdd				0x06
131*4882a593Smuzhiyun #define PKA_ModAddIm				0x06
132*4882a593Smuzhiyun #define PKA_ModSub				0x07
133*4882a593Smuzhiyun #define PKA_ModSubIm				0x07
134*4882a593Smuzhiyun #define PKA_ModNeg				0x07
135*4882a593Smuzhiyun #define PKA_AND					0x08
136*4882a593Smuzhiyun #define PKA_Test0				0x08
137*4882a593Smuzhiyun #define PKA_Clr0				0x08
138*4882a593Smuzhiyun #define PKA_Clr					0x08
139*4882a593Smuzhiyun #define PKA_OR					0x09
140*4882a593Smuzhiyun #define PKA_Copy				0x09
141*4882a593Smuzhiyun #define PKA_SetBit0				0x09
142*4882a593Smuzhiyun #define PKA_XOR					0x0A
143*4882a593Smuzhiyun #define PKA_Flip0				0x0A
144*4882a593Smuzhiyun #define PKA_InvertBits				0x0A
145*4882a593Smuzhiyun #define PKA_Compare				0x0A
146*4882a593Smuzhiyun #define PKA_SHR0				0x0C
147*4882a593Smuzhiyun #define PKA_SHR1				0x0D
148*4882a593Smuzhiyun #define PKA_SHL0				0x0E
149*4882a593Smuzhiyun #define PKA_SHL1				0x0F
150*4882a593Smuzhiyun #define PKA_LMul				0x10
151*4882a593Smuzhiyun #define PKA_ModMul				0x11
152*4882a593Smuzhiyun #define PKA_ModMulNR				0x12
153*4882a593Smuzhiyun #define PKA_ModExp				0x13
154*4882a593Smuzhiyun #define PKA_Div					0x14
155*4882a593Smuzhiyun #define PKA_ModInv				0x15
156*4882a593Smuzhiyun #define PKA_ModDiv				0x16
157*4882a593Smuzhiyun #define PKA_HMul				0x17
158*4882a593Smuzhiyun #define PKA_Terminate				0x00
159*4882a593Smuzhiyun 
160*4882a593Smuzhiyun #define RK_PKA_MAX_OPCODE			0x17
161*4882a593Smuzhiyun 
162*4882a593Smuzhiyun /*************************************************************/
163*4882a593Smuzhiyun /* Macros for waiting PKA machine ready states               */
164*4882a593Smuzhiyun /*************************************************************/
165*4882a593Smuzhiyun 
166*4882a593Smuzhiyun void rk_pka_ram_ctrl_enable(void);
167*4882a593Smuzhiyun 
168*4882a593Smuzhiyun void rk_pka_ram_ctrl_disable(void);
169*4882a593Smuzhiyun 
170*4882a593Smuzhiyun void rk_pka_wait_on_ram_ready(void);
171*4882a593Smuzhiyun 
172*4882a593Smuzhiyun void rk_pka_wait_on_pipe_ready(void);
173*4882a593Smuzhiyun 
174*4882a593Smuzhiyun void rk_pka_wait_on_done(void);
175*4882a593Smuzhiyun 
176*4882a593Smuzhiyun /*****************************************************
177*4882a593Smuzhiyun  *  Macros for controlling PKA machine and changing  *
178*4882a593Smuzhiyun  *  PKA sizes table and mapping table settings.      *
179*4882a593Smuzhiyun  *****************************************************/
180*4882a593Smuzhiyun #define PKA_CLK_ENABLE()
181*4882a593Smuzhiyun 
182*4882a593Smuzhiyun #define PKA_CLK_DISABLE()
183*4882a593Smuzhiyun 
184*4882a593Smuzhiyun void rk_pka_set_startmemaddr_reg(u32 start_mem_addr);
185*4882a593Smuzhiyun 
186*4882a593Smuzhiyun void rk_pka_set_N_NP_T0_T1_reg(u32 N, u32 NP, u32 T0, u32 T1);
187*4882a593Smuzhiyun 
188*4882a593Smuzhiyun void rk_pka_set_default_N_NP_T0_T1_reg(void);
189*4882a593Smuzhiyun 
190*4882a593Smuzhiyun void rk_pka_get_status(u32 *status);
191*4882a593Smuzhiyun 
192*4882a593Smuzhiyun void rk_pka_get_status_alu_outzero(u32 *status);
193*4882a593Smuzhiyun 
194*4882a593Smuzhiyun void rk_pka_get_status_mod_overfl(u32 *status);
195*4882a593Smuzhiyun 
196*4882a593Smuzhiyun void rk_pka_get_status_div_byzero(u32 *status);
197*4882a593Smuzhiyun 
198*4882a593Smuzhiyun void rk_pka_get_status_carry(u32 *status);
199*4882a593Smuzhiyun 
200*4882a593Smuzhiyun void rk_pka_get_status_alu_signout(u32 *status);
201*4882a593Smuzhiyun 
202*4882a593Smuzhiyun void rk_pka_get_status_modinv_ofzero(u32 *status);
203*4882a593Smuzhiyun 
204*4882a593Smuzhiyun void rk_pka_get_status_opcode(u32 *status);
205*4882a593Smuzhiyun 
206*4882a593Smuzhiyun void rk_pka_get_status_tag(u32 *status);
207*4882a593Smuzhiyun 
208*4882a593Smuzhiyun /******************************************************************
209*4882a593Smuzhiyun  * Macros for setting and reading sizes from PKA regsSizesTable   *
210*4882a593Smuzhiyun  ******************************************************************/
211*4882a593Smuzhiyun void rk_pka_set_regsize(u32 size_bits, u32 entry_num);
212*4882a593Smuzhiyun 
213*4882a593Smuzhiyun void rk_pka_read_regsize(u32 *size_bits, u32 entry_num);
214*4882a593Smuzhiyun 
215*4882a593Smuzhiyun /******************************************************************
216*4882a593Smuzhiyun  * Macros for setting and reading addresses of PKA data registers *
217*4882a593Smuzhiyun  ******************************************************************/
218*4882a593Smuzhiyun void rk_pka_set_regaddr(u32 vir_reg, u32 phys_addr);
219*4882a593Smuzhiyun 
220*4882a593Smuzhiyun void rk_pka_get_regaddr(u32 vir_reg, u32 *phys_addr);
221*4882a593Smuzhiyun 
222*4882a593Smuzhiyun void rk_pka_read_regaddr(u32 vir_reg, u32 *phys_addr);
223*4882a593Smuzhiyun 
224*4882a593Smuzhiyun /**********************************************
225*4882a593Smuzhiyun  *    Macros for setting Full PKI opcode      *
226*4882a593Smuzhiyun  **********************************************/
227*4882a593Smuzhiyun u32 rk_pka_make_full_opcode(u32 opcode, u32 len_id,
228*4882a593Smuzhiyun 			    u32 is_a_immed, u32 op_a,
229*4882a593Smuzhiyun 			    u32 is_b_immed, u32 op_b,
230*4882a593Smuzhiyun 			    u32 res_discard, u32 res,
231*4882a593Smuzhiyun 			    u32 tag);
232*4882a593Smuzhiyun 
233*4882a593Smuzhiyun /******************************************************
234*4882a593Smuzhiyun  * Macros for reading and loading PKA memory data     *
235*4882a593Smuzhiyun  ******************************************************/
236*4882a593Smuzhiyun void rk_pka_hw_load_value2pka_mem(u32 addr, u32 val);
237*4882a593Smuzhiyun 
238*4882a593Smuzhiyun void rk_pka_hw_load_block2pka_mem(u32 addr, u32 *ptr,
239*4882a593Smuzhiyun 				  u32 size_words);
240*4882a593Smuzhiyun 
241*4882a593Smuzhiyun void rk_pka_hw_reverse_load_block2pka_mem(u32 addr, u32 *ptr,
242*4882a593Smuzhiyun 					  u32 size_words);
243*4882a593Smuzhiyun 
244*4882a593Smuzhiyun void rk_pka_hw_clear_pka_mem(u32 addr, u32 size_words);
245*4882a593Smuzhiyun 
246*4882a593Smuzhiyun void rk_pka_hw_read_value_from_pka_mem(u32 addr, u32 *val);
247*4882a593Smuzhiyun 
248*4882a593Smuzhiyun void rk_pka_hw_read_block_from_pka_mem(u32 addr, u32 *ptr,
249*4882a593Smuzhiyun 				       u32 size_words);
250*4882a593Smuzhiyun 
251*4882a593Smuzhiyun void rk_pka_hw_reverse_read_block_from_pka_mem(u32 addr, u32 *ptr,
252*4882a593Smuzhiyun 					       u32 size_words);
253*4882a593Smuzhiyun 
254*4882a593Smuzhiyun u32 rk_pka_exec_operation(u32 opcode, u8 len_id,
255*4882a593Smuzhiyun 			  u8 is_a_immed, s8 op_a,
256*4882a593Smuzhiyun 			  u8 is_b_immed, s8 op_b,
257*4882a593Smuzhiyun 			  u8	res_discard, s8 res, u8 tag);
258*4882a593Smuzhiyun 
259*4882a593Smuzhiyun /*************************************************************************
260*4882a593Smuzhiyun  * Macros for calling PKA operations (names according to operation issue *
261*4882a593Smuzhiyun  *************************************************************************/
262*4882a593Smuzhiyun 
263*4882a593Smuzhiyun /*--------------------------------------*/
264*4882a593Smuzhiyun /*	 1.  ADD - SUBTRACT operations	*/
265*4882a593Smuzhiyun /*--------------------------------------*/
266*4882a593Smuzhiyun /*	Add:   res =  op_a + op_b	*/
267*4882a593Smuzhiyun #define   RK_PKA_Add(len_id, op_a, op_b, res, tag)   \
268*4882a593Smuzhiyun 			rk_pka_exec_operation(PKA_Add, (len_id), 0, (op_a),\
269*4882a593Smuzhiyun 					      0, (op_b), 0, (res), (tag))
270*4882a593Smuzhiyun 
271*4882a593Smuzhiyun /*	AddIm:	res =  op_a + op_b_im	*/
272*4882a593Smuzhiyun #define   RK_PKA_AddIm(len_id, op_a, op_b_im, res, tag)   \
273*4882a593Smuzhiyun 			rk_pka_exec_operation(PKA_Add, (len_id), 0, (op_a), \
274*4882a593Smuzhiyun 					      1, (op_b_im), 0, (res), (tag))
275*4882a593Smuzhiyun 
276*4882a593Smuzhiyun /*	Sub:  res =  op_a - op_b	*/
277*4882a593Smuzhiyun #define   RK_PKA_Sub(len_id, op_a, op_b, res, tag)   \
278*4882a593Smuzhiyun 			rk_pka_exec_operation(PKA_Sub, (len_id), 0, (op_a), \
279*4882a593Smuzhiyun 					      0, (op_b), 0, (res), (tag))
280*4882a593Smuzhiyun 
281*4882a593Smuzhiyun /*	SubIm:	res =  op_a - op_b_im	*/
282*4882a593Smuzhiyun #define   RK_PKA_SubIm(len_id, op_a, op_b_im, res, tag)   \
283*4882a593Smuzhiyun 			rk_pka_exec_operation(PKA_Sub, (len_id), 0, (op_a), \
284*4882a593Smuzhiyun 					      1, (op_b_im), 0, (res), (tag))
285*4882a593Smuzhiyun 
286*4882a593Smuzhiyun /*	Neg:  res =  0 - op_b  */
287*4882a593Smuzhiyun #define   RK_PKA_Neg(len_id, op_b, res, tag)   \
288*4882a593Smuzhiyun 			rk_pka_exec_operation(PKA_Sub, (len_id), 1, 0, \
289*4882a593Smuzhiyun 					      0, (op_b), 0, (res), (tag))
290*4882a593Smuzhiyun 
291*4882a593Smuzhiyun /*	ModAdd:  res =	(op_a + op_b) mod N  */
292*4882a593Smuzhiyun #define   RK_PKA_ModAdd(len_id, op_a, op_b, res, tag)   \
293*4882a593Smuzhiyun 			rk_pka_exec_operation(PKA_ModAdd, (len_id), 0, (op_a), \
294*4882a593Smuzhiyun 					      0, (op_b), 0, (res), (tag))
295*4882a593Smuzhiyun 
296*4882a593Smuzhiyun /*	ModAddIm:  res =  (op_a + op_b_im) mod N  */
297*4882a593Smuzhiyun #define   RK_PKA_ModAddIm(len_id, op_a, op_b_im, res, tag)   \
298*4882a593Smuzhiyun 			rk_pka_exec_operation(PKA_ModAdd, (len_id), 0, (op_a), \
299*4882a593Smuzhiyun 					      1, (op_b_im), 0, (res), (tag))
300*4882a593Smuzhiyun 
301*4882a593Smuzhiyun /*	ModSub:  res =	(op_a - op_b) mod N  */
302*4882a593Smuzhiyun #define   RK_PKA_ModSub(len_id, op_a, op_b, res, tag)   \
303*4882a593Smuzhiyun 			rk_pka_exec_operation(PKA_ModSub, (len_id), 0, (op_a), \
304*4882a593Smuzhiyun 					      0, (op_b), 0, (res), (tag))
305*4882a593Smuzhiyun 
306*4882a593Smuzhiyun /*	ModSubIm:  res =  (op_a - op_b_im) mod N  */
307*4882a593Smuzhiyun #define   RK_PKA_ModSubIm(len_id, op_a, op_b_im, res, tag)   \
308*4882a593Smuzhiyun 			rk_pka_exec_operation(PKA_ModSub, (len_id), 0, (op_a), \
309*4882a593Smuzhiyun 					      1, (op_b_im), 0, (res), (tag))
310*4882a593Smuzhiyun 
311*4882a593Smuzhiyun /*	ModNeg:  res =	(0 - op_b) mod N  */
312*4882a593Smuzhiyun #define   RK_PKA_ModNeg(len_id, op_b, res, tag)   \
313*4882a593Smuzhiyun 			rk_pka_exec_operation(PKA_ModSub, (len_id), 1, 0, \
314*4882a593Smuzhiyun 					      0, (op_b), 0, (res), (tag))
315*4882a593Smuzhiyun 
316*4882a593Smuzhiyun /*--------------------------------------*/
317*4882a593Smuzhiyun /*	 2.  Logical   operations	*/
318*4882a593Smuzhiyun /*--------------------------------------*/
319*4882a593Smuzhiyun 
320*4882a593Smuzhiyun /*	AND:  res =  op_a & op_b	*/
321*4882a593Smuzhiyun #define   RK_PKA_AND(len_id, op_a, op_b, res, tag)   \
322*4882a593Smuzhiyun 			rk_pka_exec_operation(PKA_AND, (len_id), 0, (op_a), \
323*4882a593Smuzhiyun 					      0, (op_b), 0, (res), (tag))
324*4882a593Smuzhiyun 
325*4882a593Smuzhiyun /*	AndIm:	res =  op_a & op_b  */
326*4882a593Smuzhiyun #define   RK_PKA_AndIm(len_id, op_a, op_b, res, tag)   \
327*4882a593Smuzhiyun 			rk_pka_exec_operation(PKA_AND, (len_id), 0, (op_a), \
328*4882a593Smuzhiyun 					      1, (op_b), 0, (res), (tag))
329*4882a593Smuzhiyun 
330*4882a593Smuzhiyun /*	Tst0:  op_a & 0x1 - tests the bit 0 of operand A. */
331*4882a593Smuzhiyun /*	If bit0 = 0, then ZeroOfStatus = 1, else 0  */
332*4882a593Smuzhiyun #define   RK_PKA_Tst0(len_id, op_a, tag)   \
333*4882a593Smuzhiyun 			rk_pka_exec_operation(PKA_AND, (len_id), 0, (op_a), \
334*4882a593Smuzhiyun 					      1, 0x01, 1, RES_DISCARD, (tag))
335*4882a593Smuzhiyun 
336*4882a593Smuzhiyun /*	Clr0:  res =  op_a & (-2)  - clears the bit 0 of operand A. */
337*4882a593Smuzhiyun /*	Note:  -2 = 0x1E  for 5-bit size */
338*4882a593Smuzhiyun #define   RK_PKA_Clr0(len_id, op_a, res, tag)   \
339*4882a593Smuzhiyun 			rk_pka_exec_operation(PKA_AND, (len_id), 0, (op_a), \
340*4882a593Smuzhiyun 					      1, 0x1E, 0, (res), (tag))
341*4882a593Smuzhiyun 
342*4882a593Smuzhiyun /*	Clr:  res =  op_a & 0  - clears the operand A.  */
343*4882a593Smuzhiyun #define   RK_PKA_Clr(len_id, op_a, tag)   \
344*4882a593Smuzhiyun 			rk_pka_exec_operation(PKA_AND, (len_id), 0, (op_a), \
345*4882a593Smuzhiyun 					      1, 0x00, 0, (op_a), (tag))
346*4882a593Smuzhiyun 
347*4882a593Smuzhiyun /*	Clear:	for full clearing the actual register op_a,
348*4882a593Smuzhiyun  *	this macro calls Clr operation twice.
349*4882a593Smuzhiyun  */
350*4882a593Smuzhiyun #define   RK_PKA_Clear(len_id, op_a, tag)   \
351*4882a593Smuzhiyun 		       RK_PKA_Clr(len_id, op_a, tag)
352*4882a593Smuzhiyun 
353*4882a593Smuzhiyun /*	OR:  res =	op_a || op_b	*/
354*4882a593Smuzhiyun #define   RK_PKA_OR(len_id, op_a, op_b, res, tag)   \
355*4882a593Smuzhiyun 			rk_pka_exec_operation(PKA_OR, (len_id), 0, (op_a), \
356*4882a593Smuzhiyun 					      0, (op_b), 0, (res), (tag))
357*4882a593Smuzhiyun 
358*4882a593Smuzhiyun /*	OrIm:  res =  op_a || op_b  */
359*4882a593Smuzhiyun #define   RK_PKA_OrIm(len_id, op_a, op_b, res, tag)   \
360*4882a593Smuzhiyun 			rk_pka_exec_operation(PKA_OR, (len_id), 0, (op_a), \
361*4882a593Smuzhiyun 					      1, (op_b), 0, (res), (tag))
362*4882a593Smuzhiyun 
363*4882a593Smuzhiyun /*	Copy:  OpDest =  OpSrc || 0  */
364*4882a593Smuzhiyun #define   RK_PKA_Copy(len_id, op_dest, op_src, tag)   \
365*4882a593Smuzhiyun 			rk_pka_exec_operation(PKA_OR, (len_id), 0, (op_src), \
366*4882a593Smuzhiyun 					      1, 0x00, 0, (op_dest), (tag))
367*4882a593Smuzhiyun 
368*4882a593Smuzhiyun /*	Set0:  res =  op_a || 1	: set bit0 = 1, other bits are not changed */
369*4882a593Smuzhiyun #define   RK_PKA_Set0(len_id, op_a, res, tag)   \
370*4882a593Smuzhiyun 			rk_pka_exec_operation(PKA_OR, (len_id), 0, (op_a), \
371*4882a593Smuzhiyun 					      1, 0x01, 0, (res), (tag))
372*4882a593Smuzhiyun 
373*4882a593Smuzhiyun /*	Xor:  res =  op_a ^ op_b	*/
374*4882a593Smuzhiyun #define   RK_PKA_Xor(len_id, op_a, op_b, res, tag)   \
375*4882a593Smuzhiyun 			rk_pka_exec_operation(PKA_XOR, (len_id), 0, (op_a), \
376*4882a593Smuzhiyun 					      0, (op_b), 0, (res), (tag))
377*4882a593Smuzhiyun 
378*4882a593Smuzhiyun /*	XorIm:	res =  op_a ^ op_b  */
379*4882a593Smuzhiyun #define   RK_PKA_XorIm(len_id, op_a, op_b, res, tag)   \
380*4882a593Smuzhiyun 			rk_pka_exec_operation(PKA_XOR, (len_id), 0, (op_a), \
381*4882a593Smuzhiyun 					      1, (op_b), 0, (res), (tag))
382*4882a593Smuzhiyun 
383*4882a593Smuzhiyun /*	Flip0:	res =  op_a || 1  - inverts the bit 0 of operand A  */
384*4882a593Smuzhiyun #define   RK_PKA_Flip0(len_id, op_a, res, tag)   \
385*4882a593Smuzhiyun 			rk_pka_exec_operation(PKA_XOR, (len_id), 0, (op_a), \
386*4882a593Smuzhiyun 					      1, 0x01, 0, (res), (tag))
387*4882a593Smuzhiyun 
388*4882a593Smuzhiyun /*	Invert:  res =	op_a ^ 0xFFF.FF	:  inverts all bits of op_a . */
389*4882a593Smuzhiyun /* Note: 0xFFFFF =  0x1F for 5 bits size of second operand */
390*4882a593Smuzhiyun #define   RK_PKA_Invert(len_id, op_a, res, tag)   \
391*4882a593Smuzhiyun 			rk_pka_exec_operation(PKA_XOR, (len_id), 0, (op_a), \
392*4882a593Smuzhiyun 					      1, 0x1F, 0, (res), (tag))
393*4882a593Smuzhiyun 
394*4882a593Smuzhiyun /*	Compare:  op_a ^ op_b . Rsult of compare in ZeroBitOfStatus: */
395*4882a593Smuzhiyun /*	If op_a == op_b then Z = 1 */
396*4882a593Smuzhiyun #define   RK_PKA_Compare(len_id, op_a, op_b, tag)   \
397*4882a593Smuzhiyun 			rk_pka_exec_operation(PKA_XOR, (len_id), 0, (op_a), \
398*4882a593Smuzhiyun 					      0, (op_b), 1, (0), (tag))
399*4882a593Smuzhiyun 
400*4882a593Smuzhiyun /*	CompareImmediate:  op_a ^ op_b . Rsult of compare in ZeroBitOfStatus: */
401*4882a593Smuzhiyun /*	If op_a == op_b then status Z = 1 */
402*4882a593Smuzhiyun #define   RK_PKA_CompareIm(len_id, op_a, op_b, tag)   \
403*4882a593Smuzhiyun 			rk_pka_exec_operation(PKA_XOR, (len_id), 0, (op_a), \
404*4882a593Smuzhiyun 					      1, (op_b), 1, (0), (tag))
405*4882a593Smuzhiyun 
406*4882a593Smuzhiyun /*----------------------------------------------*/
407*4882a593Smuzhiyun /*	 3.  SHIFT	  operations		*/
408*4882a593Smuzhiyun /*----------------------------------------------*/
409*4882a593Smuzhiyun 
410*4882a593Smuzhiyun /*	SHR0:  res =  op_a >> (S+1) :
411*4882a593Smuzhiyun  *	shifts right operand A by S+1 bits, insert 0 to left most bits
412*4882a593Smuzhiyun  */
413*4882a593Smuzhiyun #define   RK_PKA_SHR0(len_id, op_a, S, res, tag)   \
414*4882a593Smuzhiyun 			rk_pka_exec_operation(PKA_SHR0, (len_id), 0, (op_a), \
415*4882a593Smuzhiyun 					      0, (S), 0, (res), (tag))
416*4882a593Smuzhiyun 
417*4882a593Smuzhiyun /*	SHR1:  res =  op_a >> (S+1) :
418*4882a593Smuzhiyun  *	shifts right operand A by S+1 bits, insert 1 to left most bits
419*4882a593Smuzhiyun  */
420*4882a593Smuzhiyun #define   RK_PKA_SHR1(len_id, op_a, S, res, tag)   \
421*4882a593Smuzhiyun 			rk_pka_exec_operation(PKA_SHR1, (len_id), 0, (op_a), \
422*4882a593Smuzhiyun 					      0, (S), 0, (res), (tag))
423*4882a593Smuzhiyun 
424*4882a593Smuzhiyun /*	SHL0:  res =  op_a << (S+1) :
425*4882a593Smuzhiyun  *	shifts left operand A by S+1 bits, insert 0 to right most bits
426*4882a593Smuzhiyun  */
427*4882a593Smuzhiyun #define   RK_PKA_SHL0(len_id, op_a, S, res, tag)   \
428*4882a593Smuzhiyun 			rk_pka_exec_operation(PKA_SHL0, (len_id), 0, (op_a), \
429*4882a593Smuzhiyun 					      0, (S), 0, (res), (tag))
430*4882a593Smuzhiyun 
431*4882a593Smuzhiyun /*	SHL1:  res =  op_a << (S+1) :
432*4882a593Smuzhiyun  *	shifts left operand A by S+1 bits, insert 1 to right most bits
433*4882a593Smuzhiyun  */
434*4882a593Smuzhiyun #define   RK_PKA_SHL1(len_id, op_a, S, res, tag)   \
435*4882a593Smuzhiyun 			rk_pka_exec_operation(PKA_SHL1, (len_id), 0, (op_a), \
436*4882a593Smuzhiyun 					      0, (S), 0, (res), (tag))
437*4882a593Smuzhiyun 
438*4882a593Smuzhiyun /*--------------------------------------------------------------*/
439*4882a593Smuzhiyun /*	 2.  Multiplication and other	operations		*/
440*4882a593Smuzhiyun /*		 Note:	See notes to RK_PKAExecOperation	*/
441*4882a593Smuzhiyun /*--------------------------------------------------------------*/
442*4882a593Smuzhiyun 
443*4882a593Smuzhiyun /*	RMul:  res =  LowHalfOf(op_a * op_b), where size of operands and result
444*4882a593Smuzhiyun  *	is equaled to operation size, defined by len_id. Note: for receiving
445*4882a593Smuzhiyun  *	full result, the len_id must be set according to (sizeA + sizeB) and
446*4882a593Smuzhiyun  *	leading not significant bits of operands must be zeroed
447*4882a593Smuzhiyun  */
448*4882a593Smuzhiyun #define   RK_PKA_LMul(len_id, op_a, op_b, res, tag)   \
449*4882a593Smuzhiyun 			rk_pka_exec_operation(PKA_LMul, (len_id), 0, (op_a), \
450*4882a593Smuzhiyun 					      0, (op_b), 0, (res), (tag))
451*4882a593Smuzhiyun 
452*4882a593Smuzhiyun /*	HMul:  res =  HighHalfOf(op_a * op_b) + one high word of low half of
453*4882a593Smuzhiyun  *	(op_a * op_b), where size of operands is equaled to operation size,
454*4882a593Smuzhiyun  *	defined by len_id. Note: Size of operation result is by one word large,
455*4882a593Smuzhiyun  *	than operation size
456*4882a593Smuzhiyun  */
457*4882a593Smuzhiyun #define   RK_PKA_HMul(len_id, op_a, op_b, res, tag)   \
458*4882a593Smuzhiyun 			rk_pka_exec_operation(PKA_HMul, (len_id), 0, (op_a), \
459*4882a593Smuzhiyun 					      0, (op_b), 0, (res), (tag))
460*4882a593Smuzhiyun 
461*4882a593Smuzhiyun /*	ModMul:  res =	op_a * op_b  mod N - modular multiplication */
462*4882a593Smuzhiyun #define   RK_PKA_ModMul(len_id, op_a, op_b, res, tag)   \
463*4882a593Smuzhiyun 			rk_pka_exec_operation(PKA_ModMul, (len_id), 0, (op_a), \
464*4882a593Smuzhiyun 					      0, (op_b), 0, (res), (tag))
465*4882a593Smuzhiyun 
466*4882a593Smuzhiyun /*	ModMulN:  res =  op_a * op_b	mod N
467*4882a593Smuzhiyun  *	- modular multiplication (final reduction is omitted)
468*4882a593Smuzhiyun  */
469*4882a593Smuzhiyun #define   RK_PKA_ModMulN(len_id, op_a, op_b, res, tag)   \
470*4882a593Smuzhiyun 			rk_pka_exec_operation(PKA_ModMulNR, (len_id), 0, \
471*4882a593Smuzhiyun 					      (op_a), 0, (op_b), 0, \
472*4882a593Smuzhiyun 					      (res), (tag))
473*4882a593Smuzhiyun 
474*4882a593Smuzhiyun /*	ModExp:  res =	op_a ** op_b	mod N - modular exponentiation */
475*4882a593Smuzhiyun #define   RK_PKA_ModExp(len_id, op_a, op_b, res, tag)   \
476*4882a593Smuzhiyun 			rk_pka_exec_operation(PKA_ModExp, (len_id), 0, (op_a), \
477*4882a593Smuzhiyun 					      0, (op_b), 0, (res), (tag))
478*4882a593Smuzhiyun 
479*4882a593Smuzhiyun /*	Divide:  res =	op_a / op_b , op_a = op_a mod op_b - division,  */
480*4882a593Smuzhiyun #define   RK_PKA_Div(len_id, op_a, op_b, res, tag)   \
481*4882a593Smuzhiyun 			rk_pka_exec_operation(PKA_Div, (len_id), 0, (op_a), \
482*4882a593Smuzhiyun 					      0, (op_b), 0, (res), (tag))
483*4882a593Smuzhiyun 
484*4882a593Smuzhiyun /*	ModInv:  Modular inversion: calculates	 res = 1/op_b mod N	*/
485*4882a593Smuzhiyun #define   RK_PKA_ModInv(len_id, op_b, res, tag)   \
486*4882a593Smuzhiyun 			rk_pka_exec_operation(PKA_ModInv, (len_id), 0, 1, \
487*4882a593Smuzhiyun 					      0, (op_b), 0, (res), (tag))
488*4882a593Smuzhiyun #define   RK_PKA_ModDiv(len_id, op_a, op_b, res, tag)   \
489*4882a593Smuzhiyun 			rk_pka_exec_operation(PKA_ModDiv, (len_id), 0, (op_a), \
490*4882a593Smuzhiyun 					      0, (op_b), 0, (res), (tag))
491*4882a593Smuzhiyun 
492*4882a593Smuzhiyun /*	Terminate  - special operation, which allows HOST access */
493*4882a593Smuzhiyun /*	to PKA data memory registers after end of PKA operations */
494*4882a593Smuzhiyun #define   RK_PKA_Terminate(tag)   \
495*4882a593Smuzhiyun 			rk_pka_exec_operation(PKA_Terminate, 0, 0, 0, 0, \
496*4882a593Smuzhiyun 					      0, 0, 0, (tag))
497*4882a593Smuzhiyun 
498*4882a593Smuzhiyun struct rk_pka_regs_map {
499*4882a593Smuzhiyun 	u32 reges_num[RK_PKA_MAX_PHYS_MEM_REGS_COUNT];
500*4882a593Smuzhiyun 	u32 regs_addr[RK_PKA_MAX_PHYS_MEM_REGS_COUNT];
501*4882a593Smuzhiyun };
502*4882a593Smuzhiyun 
503*4882a593Smuzhiyun u32 rk_pka_set_sizes_tab(u32 regs_sizes_ptr[RK_PKA_MAX_REGS_COUNT],
504*4882a593Smuzhiyun 			 u32 count_of_sizes,
505*4882a593Smuzhiyun 			 u32 max_size_bits,
506*4882a593Smuzhiyun 			 u32 is_default_map);
507*4882a593Smuzhiyun 
508*4882a593Smuzhiyun #define RK_PKA_DefaultSetRegsSizesTab(max_size_bits) \
509*4882a593Smuzhiyun 			rk_pka_set_sizes_tab(0, 0, (max_size_bits), 1)
510*4882a593Smuzhiyun u32 rk_pka_set_map_tab(struct rk_pka_regs_map *regs_map_ptr, u32 *count_of_regs,
511*4882a593Smuzhiyun 		       u32 maxsize_words, u32 N_NP_T0_T1,
512*4882a593Smuzhiyun 		       u32 is_default_map);
513*4882a593Smuzhiyun 
514*4882a593Smuzhiyun #define RK_PKA_DefaultSetRegsMapTab(maxsize_words, count_of_regs) \
515*4882a593Smuzhiyun 			rk_pka_set_map_tab(NULL, (count_of_regs), \
516*4882a593Smuzhiyun 					   (maxsize_words), 0, 1)
517*4882a593Smuzhiyun 
518*4882a593Smuzhiyun u32 rk_pka_clear_block_of_regs(u8 first_reg, u8 count_of_regs, u8 len_id);
519*4882a593Smuzhiyun 
520*4882a593Smuzhiyun u32 rk_pka_init(u32 regs_sizes_ptr[RK_PKA_MAX_REGS_COUNT],
521*4882a593Smuzhiyun 		u32 count_of_sizes,
522*4882a593Smuzhiyun 		struct rk_pka_regs_map *regs_map_ptr,
523*4882a593Smuzhiyun 		u32 count_of_regs,
524*4882a593Smuzhiyun 		u32 op_size_bits,
525*4882a593Smuzhiyun 		u32 regsize_words,
526*4882a593Smuzhiyun 		u32 N_NP_T0_T1,
527*4882a593Smuzhiyun 		u32 is_default_map);
528*4882a593Smuzhiyun #define RK_PKA_DefaultInitPKA(max_size_bits, regsize_words) \
529*4882a593Smuzhiyun 			rk_pka_init(0, 0, 0, 0, (max_size_bits), \
530*4882a593Smuzhiyun 				    (regsize_words), 0, 1)
531*4882a593Smuzhiyun 
532*4882a593Smuzhiyun void rk_pka_finish(void);
533*4882a593Smuzhiyun u32 rk_pka_calcNp_and_initmodop(u32 len_id, u32 mod_size_bits,
534*4882a593Smuzhiyun 				s8 r_t0, s8 r_t1, s8 r_t2);
535*4882a593Smuzhiyun 
536*4882a593Smuzhiyun u32 rk_pka_div_long_num(u8 len_id, s8 op_a, u32 s, s8 op_b,
537*4882a593Smuzhiyun 			s8 res, s8 r_t1, s8 r_t2);
538*4882a593Smuzhiyun 
539*4882a593Smuzhiyun u32 rk_calcNp_and_initmodop(u32 *N_ptr, u32 N_size_bits,
540*4882a593Smuzhiyun 			    u32 *NP_ptr, u8 np_create_flag,
541*4882a593Smuzhiyun 			    s8 r_t0, s8 r_t1, s8 r_t2);
542*4882a593Smuzhiyun 
543*4882a593Smuzhiyun void rk_pka_copy_data_into_reg(s8 dst_reg, u8 len_id, u32 *src_ptr,
544*4882a593Smuzhiyun 			       u32 size_words);
545*4882a593Smuzhiyun void rk_pka_copy_data_from_reg(u32 *dst_ptr, u32  size_words,
546*4882a593Smuzhiyun 			       s8 src_reg);
547*4882a593Smuzhiyun int test_rk3326_rsa(void);
548*4882a593Smuzhiyun int rk_mpa_alloc(struct mpa_num **mpa, void *data, u32 word_size);
549*4882a593Smuzhiyun void rk_mpa_free(struct mpa_num **mpa);
550*4882a593Smuzhiyun int rk_abs_add(void *a, void *b, void *c);
551*4882a593Smuzhiyun int rk_mod(void *a, void *b, void *c);
552*4882a593Smuzhiyun int rk_exptmod(void *a, void *b, void *c, void *d);
553*4882a593Smuzhiyun int rk_exptmod_np(void *m, void *e, void *n, void *np, void *d);
554*4882a593Smuzhiyun 
555*4882a593Smuzhiyun #endif
556