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