xref: /rk3399_rockchip-uboot/include/rockchip/rkce_core.h (revision 0056558950698852c664324dc1cdc849faed7122)
1*00565589SLin Jinhan /* SPDX-License-Identifier: GPL-2.0 */
2*00565589SLin Jinhan 
3*00565589SLin Jinhan /* Copyright (c) 2025 Rockchip Electronics Co., Ltd. */
4*00565589SLin Jinhan 
5*00565589SLin Jinhan #ifndef __RKCE_CORE_H__
6*00565589SLin Jinhan #define __RKCE_CORE_H__
7*00565589SLin Jinhan 
8*00565589SLin Jinhan #include <linux/bitops.h>
9*00565589SLin Jinhan #include <linux/types.h>
10*00565589SLin Jinhan 
11*00565589SLin Jinhan #include "rkce_buf.h"
12*00565589SLin Jinhan #include "rkce_error.h"
13*00565589SLin Jinhan #include "rkce_reg.h"
14*00565589SLin Jinhan 
15*00565589SLin Jinhan #define RKCE_TD_SG_NUM			8
16*00565589SLin Jinhan 
17*00565589SLin Jinhan #define RKCE_AES_BLOCK_SIZE		16
18*00565589SLin Jinhan #define RKCE_AES_KEYSIZE_128		16
19*00565589SLin Jinhan #define RKCE_AES_KEYSIZE_192		24
20*00565589SLin Jinhan #define RKCE_AES_KEYSIZE_256		32
21*00565589SLin Jinhan 
22*00565589SLin Jinhan #define RKCE_SM4_KEYSIZE		16
23*00565589SLin Jinhan 
24*00565589SLin Jinhan #define RKCE_DES_BLOCK_SIZE		8
25*00565589SLin Jinhan #define RKCE_DES_KEYSIZE		8
26*00565589SLin Jinhan #define RKCE_TDES_EDE_KEYSIZE		24
27*00565589SLin Jinhan 
28*00565589SLin Jinhan #define RKCE_TD_ALIGINMENT		16
29*00565589SLin Jinhan #define RKCE_TD_KEY_SIZE		128
30*00565589SLin Jinhan #define RKCE_TD_IV_SIZE			16
31*00565589SLin Jinhan #define RKCE_TD_GCM_LEN_SIZE		16
32*00565589SLin Jinhan #define RKCE_TD_HASH_CTX_SIZE		RKCE_HASH_CONTEXT_SIZE
33*00565589SLin Jinhan #define RKCE_TD_SYMM_CTX_SIZE		RKCE_SYMM_CONTEXT_SIZE
34*00565589SLin Jinhan #define RKCE_TD_TAG_SIZE		16
35*00565589SLin Jinhan #define RKCE_TD_TAG_SIZE_MIN		8
36*00565589SLin Jinhan #define RKCE_TD_TAG_SIZE_MAX		RKCE_TD_TAG_SIZE
37*00565589SLin Jinhan #define RKCE_TD_HASH_SIZE		64
38*00565589SLin Jinhan #define RKCE_TD_FIFO_DEPTH		8
39*00565589SLin Jinhan 
40*00565589SLin Jinhan #define RKCE_RESET_SYMM			BIT(0)
41*00565589SLin Jinhan #define RKCE_RESET_HASH			BIT(1)
42*00565589SLin Jinhan #define RKCE_RESET_PKA			BIT(2)
43*00565589SLin Jinhan #define RKCE_RESET_ALL			(RKCE_RESET_SYMM | RKCE_RESET_HASH | RKCE_RESET_PKA)
44*00565589SLin Jinhan 
45*00565589SLin Jinhan #define RKCE_WRITE_MASK_SHIFT		(16)
46*00565589SLin Jinhan #define RKCE_WRITE_MASK_ALL		((0xffffu << RKCE_WRITE_MASK_SHIFT))
47*00565589SLin Jinhan 
48*00565589SLin Jinhan enum rkce_expand_bit {
49*00565589SLin Jinhan 	RKCE_EXPAND_BIT_4G = 0,
50*00565589SLin Jinhan 	RKCE_EXPAND_BIT_8G,
51*00565589SLin Jinhan 	RKCE_EXPAND_BIT_16G,
52*00565589SLin Jinhan 	RKCE_EXPAND_BIT_32G,
53*00565589SLin Jinhan };
54*00565589SLin Jinhan 
55*00565589SLin Jinhan enum rkce_td_type {
56*00565589SLin Jinhan 	RKCE_TD_TYPE_SYMM = 0,
57*00565589SLin Jinhan 	RKCE_TD_TYPE_HASH,
58*00565589SLin Jinhan 	RKCE_TD_TYPE_SYMM_HASH_IN,
59*00565589SLin Jinhan 	RKCE_TD_TYPE_SYMM_HASH_OUT,
60*00565589SLin Jinhan 	RKCE_TD_TYPE_MAX,
61*00565589SLin Jinhan };
62*00565589SLin Jinhan 
63*00565589SLin Jinhan enum rkce_algo_symm_type {
64*00565589SLin Jinhan 	RKCE_SYMM_ALGO_AES = 0,
65*00565589SLin Jinhan 	RKCE_SYMM_ALGO_SM4,
66*00565589SLin Jinhan 	RKCE_SYMM_ALGO_DES,
67*00565589SLin Jinhan 	RKCE_SYMM_ALGO_TDES,
68*00565589SLin Jinhan 	RKCE_SYMM_ALGO_MAX,
69*00565589SLin Jinhan };
70*00565589SLin Jinhan 
71*00565589SLin Jinhan enum rkce_algo_symm_mode {
72*00565589SLin Jinhan 	RKCE_SYMM_MODE_ECB = 0,
73*00565589SLin Jinhan 	RKCE_SYMM_MODE_CBC,
74*00565589SLin Jinhan 	RKCE_SYMM_MODE_CTS,
75*00565589SLin Jinhan 	RKCE_SYMM_MODE_CTR,
76*00565589SLin Jinhan 	RKCE_SYMM_MODE_CFB,
77*00565589SLin Jinhan 	RKCE_SYMM_MODE_OFB,
78*00565589SLin Jinhan 	RKCE_SYMM_MODE_XTS,
79*00565589SLin Jinhan 	RKCE_SYMM_MODE_CCM,
80*00565589SLin Jinhan 	RKCE_SYMM_MODE_GCM,
81*00565589SLin Jinhan 	RKCE_SYMM_MODE_CMAC,
82*00565589SLin Jinhan 	RKCE_SYMM_MODE_CBC_MAC,
83*00565589SLin Jinhan 	RKCE_SYMM_MODE_BYPASS = 0xf,
84*00565589SLin Jinhan 	RKCE_SYMM_MODE_MAX,
85*00565589SLin Jinhan };
86*00565589SLin Jinhan 
87*00565589SLin Jinhan enum {
88*00565589SLin Jinhan 	RKCE_KEY_AES_128 = 0,
89*00565589SLin Jinhan 	RKCE_KEY_AES_192,
90*00565589SLin Jinhan 	RKCE_KEY_AES_256,
91*00565589SLin Jinhan };
92*00565589SLin Jinhan 
93*00565589SLin Jinhan enum rkce_algo_hash_type {
94*00565589SLin Jinhan 	RKCE_HASH_ALGO_SHA1 = 0,
95*00565589SLin Jinhan 	RKCE_HASH_ALGO_MD5,
96*00565589SLin Jinhan 	RKCE_HASH_ALGO_SHA256,
97*00565589SLin Jinhan 	RKCE_HASH_ALGO_SHA224,
98*00565589SLin Jinhan 	RKCE_HASH_ALGO_SM3 = 6,
99*00565589SLin Jinhan 	RKCE_HASH_ALGO_SHA512 = 8,
100*00565589SLin Jinhan 	RKCE_HASH_ALGO_SHA384 = 9,
101*00565589SLin Jinhan 	RKCE_HASH_ALGO_SHA512_224,
102*00565589SLin Jinhan 	RKCE_HASH_ALGO_SHA512_256,
103*00565589SLin Jinhan 	RKCE_HASH_ALGO_MAX,
104*00565589SLin Jinhan };
105*00565589SLin Jinhan 
106*00565589SLin Jinhan enum rkce_algo_asym_type {
107*00565589SLin Jinhan 	RKCE_ASYM_ALGO_RSA = 0,
108*00565589SLin Jinhan 	RKCE_ASYM_ALGO_ECC_P192,
109*00565589SLin Jinhan 	RKCE_ASYM_ALGO_ECC_P224,
110*00565589SLin Jinhan 	RKCE_ASYM_ALGO_ECC_P256,
111*00565589SLin Jinhan 	RKCE_ASYM_ALGO_ECC_P384,
112*00565589SLin Jinhan 	RKCE_ASYM_ALGO_ECC_P521,
113*00565589SLin Jinhan 	RKCE_ASYM_ALGO_SM2,
114*00565589SLin Jinhan 	RKCE_ASYM_ALGO_MAX,
115*00565589SLin Jinhan };
116*00565589SLin Jinhan 
117*00565589SLin Jinhan enum rkce_algo_type {
118*00565589SLin Jinhan 	RKCE_ALGO_TYPE_HASH,
119*00565589SLin Jinhan 	RKCE_ALGO_TYPE_HMAC,
120*00565589SLin Jinhan 	RKCE_ALGO_TYPE_CIPHER,
121*00565589SLin Jinhan 	RKCE_ALGO_TYPE_ASYM,
122*00565589SLin Jinhan 	RKCE_ALGO_TYPE_AEAD,
123*00565589SLin Jinhan 	RKCE_ALGO_TYPE_MAX,
124*00565589SLin Jinhan };
125*00565589SLin Jinhan 
126*00565589SLin Jinhan struct rkce_ip_info {
127*00565589SLin Jinhan 	uint32_t	aes_ver;
128*00565589SLin Jinhan 	uint32_t	des_ver;
129*00565589SLin Jinhan 	uint32_t	sm4_ver;
130*00565589SLin Jinhan 	uint32_t	hash_ver;
131*00565589SLin Jinhan 	uint32_t	hmac_ver;
132*00565589SLin Jinhan 	uint32_t	pka_ver;
133*00565589SLin Jinhan 	uint32_t	extra_feature;
134*00565589SLin Jinhan 	uint32_t	ce_ver;
135*00565589SLin Jinhan };
136*00565589SLin Jinhan 
137*00565589SLin Jinhan struct rkce_gcm_len {
138*00565589SLin Jinhan 	uint32_t	pc_len_l;
139*00565589SLin Jinhan 	uint32_t	pc_len_h;
140*00565589SLin Jinhan 	uint32_t	aad_len_l;
141*00565589SLin Jinhan 	uint32_t	aad_len_h;
142*00565589SLin Jinhan };
143*00565589SLin Jinhan 
144*00565589SLin Jinhan struct rkce_sg_info {
145*00565589SLin Jinhan 	uint32_t	src_size;
146*00565589SLin Jinhan 	uint32_t	src_addr_h;
147*00565589SLin Jinhan 	uint32_t	src_addr_l;
148*00565589SLin Jinhan 
149*00565589SLin Jinhan 	uint32_t	dst_size;
150*00565589SLin Jinhan 	uint32_t	dst_addr_h;
151*00565589SLin Jinhan 	uint32_t	dst_addr_l;
152*00565589SLin Jinhan };
153*00565589SLin Jinhan 
154*00565589SLin Jinhan /* total = 64 + 16 + 16 + 16 + 32 = 114(Byte) */
155*00565589SLin Jinhan struct rkce_symm_td_buf {
156*00565589SLin Jinhan 	uint8_t			key1[RKCE_AES_KEYSIZE_256];		// offset 0x00
157*00565589SLin Jinhan 	uint8_t			key2[RKCE_AES_KEYSIZE_256];		// offset 0x20
158*00565589SLin Jinhan 	uint8_t			iv[RKCE_TD_IV_SIZE];			// offset 0x40
159*00565589SLin Jinhan 	struct rkce_gcm_len	gcm_len;				// offset 0x50
160*00565589SLin Jinhan 	uint8_t			tag[RKCE_TD_TAG_SIZE];			// offset 0x60
161*00565589SLin Jinhan 	uint8_t			ctx[RKCE_SYMM_CONTEXT_SIZE];		// offset 0x70
162*00565589SLin Jinhan 	void			*user_data;
163*00565589SLin Jinhan };
164*00565589SLin Jinhan 
165*00565589SLin Jinhan /* total = 128 + 64 + 208 = 360(Byte) */
166*00565589SLin Jinhan struct rkce_hash_td_buf {
167*00565589SLin Jinhan 	uint8_t			key[RKCE_TD_KEY_SIZE];			// offset 0x00
168*00565589SLin Jinhan 	uint8_t			hash[RKCE_TD_HASH_SIZE];		// offset 0x80
169*00565589SLin Jinhan 	uint8_t			ctx[RKCE_HASH_CONTEXT_SIZE];		// offset 0xB0
170*00565589SLin Jinhan 	void			*user_data;
171*00565589SLin Jinhan };
172*00565589SLin Jinhan 
173*00565589SLin Jinhan struct rkce_symm_hash_td_buf {
174*00565589SLin Jinhan 	uint8_t			key1[RKCE_AES_KEYSIZE_256];		// offset 0x00
175*00565589SLin Jinhan 	uint8_t			key2[RKCE_AES_KEYSIZE_256];		// offset 0x20
176*00565589SLin Jinhan 	uint8_t			key3[RKCE_AES_KEYSIZE_256 * 2];		// offset 0x40
177*00565589SLin Jinhan 	uint8_t			iv[RKCE_TD_IV_SIZE];			// offset 0x80
178*00565589SLin Jinhan 	struct rkce_gcm_len	gcm_len;				// offset 0x90
179*00565589SLin Jinhan 	uint8_t			tag[RKCE_TD_TAG_SIZE];			// offset 0xA0
180*00565589SLin Jinhan 	uint8_t			hash[RKCE_TD_HASH_SIZE];		// offset 0xB0
181*00565589SLin Jinhan 	uint8_t			symm_ctx[RKCE_SYMM_CONTEXT_SIZE];	// offset 0xF0
182*00565589SLin Jinhan 	uint8_t			hash_ctx[RKCE_HASH_CONTEXT_SIZE];	// offset 0x110
183*00565589SLin Jinhan 	void			*user_data;
184*00565589SLin Jinhan };
185*00565589SLin Jinhan 
186*00565589SLin Jinhan struct rkce_symm_td_ctrl {
187*00565589SLin Jinhan 	uint32_t	td_type : 2;
188*00565589SLin Jinhan 	uint32_t	is_dec : 1;
189*00565589SLin Jinhan 	uint32_t	is_aad : 1;
190*00565589SLin Jinhan 	uint32_t	symm_algo : 2;
191*00565589SLin Jinhan 	uint32_t : 2;
192*00565589SLin Jinhan 	uint32_t	symm_mode : 4;
193*00565589SLin Jinhan 	uint32_t	key_size : 2;
194*00565589SLin Jinhan 	uint32_t	first_pkg : 1;
195*00565589SLin Jinhan 	uint32_t	last_pkg : 1;
196*00565589SLin Jinhan 	uint32_t	key_sel : 3;
197*00565589SLin Jinhan 	uint32_t	iv_len : 5;
198*00565589SLin Jinhan 	uint32_t : 4;
199*00565589SLin Jinhan 	uint32_t	is_key_inside : 1;
200*00565589SLin Jinhan 	uint32_t : 1;
201*00565589SLin Jinhan 	uint32_t	is_preemptible : 1;
202*00565589SLin Jinhan 	uint32_t	int_en : 1;
203*00565589SLin Jinhan };
204*00565589SLin Jinhan 
205*00565589SLin Jinhan struct rkce_hash_td_ctrl {
206*00565589SLin Jinhan 	uint32_t	td_type : 2;
207*00565589SLin Jinhan 	uint32_t : 5;
208*00565589SLin Jinhan 	uint32_t	hw_pad_en : 1;
209*00565589SLin Jinhan 	uint32_t : 6;
210*00565589SLin Jinhan 	uint32_t	first_pkg : 1;
211*00565589SLin Jinhan 	uint32_t	last_pkg : 1;
212*00565589SLin Jinhan 	uint32_t : 8;
213*00565589SLin Jinhan 	uint32_t	hash_algo: 4;
214*00565589SLin Jinhan 	uint32_t : 1;
215*00565589SLin Jinhan 	uint32_t	hmac_en : 1;
216*00565589SLin Jinhan 	uint32_t	is_preemptible : 1;
217*00565589SLin Jinhan 	uint32_t	int_en : 1;
218*00565589SLin Jinhan };
219*00565589SLin Jinhan 
220*00565589SLin Jinhan struct rkce_symm_hash_td_ctrl {
221*00565589SLin Jinhan 	uint32_t	td_type : 2;
222*00565589SLin Jinhan 	uint32_t	is_dec : 1;
223*00565589SLin Jinhan 	uint32_t	is_aad : 1;
224*00565589SLin Jinhan 	uint32_t	symm_algo : 2;
225*00565589SLin Jinhan 	uint32_t : 1;
226*00565589SLin Jinhan 	uint32_t	hw_pad_en : 1;
227*00565589SLin Jinhan 	uint32_t	symm_mode : 4;
228*00565589SLin Jinhan 	uint32_t	key_size : 2;
229*00565589SLin Jinhan 	uint32_t	first_pkg : 1;
230*00565589SLin Jinhan 	uint32_t	last_pkg : 1;
231*00565589SLin Jinhan 	uint32_t	key_sel : 3;
232*00565589SLin Jinhan 	uint32_t	iv_len : 5;
233*00565589SLin Jinhan 	uint32_t	hash_algo: 4;
234*00565589SLin Jinhan 	uint32_t	is_key_inside : 1;
235*00565589SLin Jinhan 	uint32_t	hmac_en : 1;
236*00565589SLin Jinhan 	uint32_t	is_preemptible : 1;
237*00565589SLin Jinhan 	uint32_t	int_en : 1;
238*00565589SLin Jinhan };
239*00565589SLin Jinhan 
240*00565589SLin Jinhan struct rkce_symm_td {
241*00565589SLin Jinhan 	uint32_t			task_id;
242*00565589SLin Jinhan 	struct rkce_symm_td_ctrl	ctrl;
243*00565589SLin Jinhan 	uint32_t			reserve1;
244*00565589SLin Jinhan 	uint32_t			key_addr;
245*00565589SLin Jinhan 
246*00565589SLin Jinhan 	uint32_t			iv_addr;
247*00565589SLin Jinhan 	uint32_t			gcm_len_addr;
248*00565589SLin Jinhan 	uint32_t			reserve2;
249*00565589SLin Jinhan 	uint32_t			tag_addr;
250*00565589SLin Jinhan 
251*00565589SLin Jinhan 	struct rkce_sg_info		sg[RKCE_TD_SG_NUM];
252*00565589SLin Jinhan 
253*00565589SLin Jinhan 	uint32_t			reserve3;
254*00565589SLin Jinhan 	uint32_t			symm_ctx_addr;
255*00565589SLin Jinhan 	uint32_t			reserve4[5];
256*00565589SLin Jinhan 	uint32_t			next_task;
257*00565589SLin Jinhan };
258*00565589SLin Jinhan 
259*00565589SLin Jinhan struct rkce_hash_td {
260*00565589SLin Jinhan 	uint32_t			task_id;
261*00565589SLin Jinhan 	struct rkce_hash_td_ctrl	ctrl;
262*00565589SLin Jinhan 	uint32_t			reserve1;
263*00565589SLin Jinhan 	uint32_t			key_addr;
264*00565589SLin Jinhan 
265*00565589SLin Jinhan 	uint32_t			reserve2[2];
266*00565589SLin Jinhan 	uint32_t			hash_addr;
267*00565589SLin Jinhan 	uint32_t			reserve3;
268*00565589SLin Jinhan 
269*00565589SLin Jinhan 	struct rkce_sg_info		sg[RKCE_TD_SG_NUM];
270*00565589SLin Jinhan 
271*00565589SLin Jinhan 	uint32_t			hash_ctx_addr;
272*00565589SLin Jinhan 	uint32_t			reserve4[6];
273*00565589SLin Jinhan 	uint32_t			next_task;
274*00565589SLin Jinhan };
275*00565589SLin Jinhan 
276*00565589SLin Jinhan struct rkce_symm_hash_td {
277*00565589SLin Jinhan 	uint32_t			task_id;
278*00565589SLin Jinhan 	struct rkce_symm_hash_td_ctrl	ctrl;
279*00565589SLin Jinhan 	uint32_t			reserve1;
280*00565589SLin Jinhan 	uint32_t			key_addr;
281*00565589SLin Jinhan 
282*00565589SLin Jinhan 	uint32_t			iv_addr;
283*00565589SLin Jinhan 	uint32_t			gcm_len_addr;
284*00565589SLin Jinhan 	uint32_t			hash_addr;
285*00565589SLin Jinhan 	uint32_t			tag_addr;
286*00565589SLin Jinhan 
287*00565589SLin Jinhan 	struct rkce_sg_info		sg[RKCE_TD_SG_NUM];
288*00565589SLin Jinhan 
289*00565589SLin Jinhan 	uint32_t			hash_ctx_addr;
290*00565589SLin Jinhan 	uint32_t			symm_ctx_addr;
291*00565589SLin Jinhan 	uint32_t			reserve3[5];
292*00565589SLin Jinhan 	uint32_t			next_task;
293*00565589SLin Jinhan };
294*00565589SLin Jinhan 
295*00565589SLin Jinhan struct rkce_td {
296*00565589SLin Jinhan 	union {
297*00565589SLin Jinhan 		struct rkce_symm_td	 symm;
298*00565589SLin Jinhan 		struct rkce_hash_td	 hash;
299*00565589SLin Jinhan 		struct rkce_symm_hash_td symm_hash;
300*00565589SLin Jinhan 	} td;
301*00565589SLin Jinhan };
302*00565589SLin Jinhan 
303*00565589SLin Jinhan struct rkce_td_buf {
304*00565589SLin Jinhan 	union {
305*00565589SLin Jinhan 		struct rkce_symm_td_buf	     symm;
306*00565589SLin Jinhan 		struct rkce_hash_td_buf	     hash;
307*00565589SLin Jinhan 		struct rkce_symm_hash_td_buf symm_hash;
308*00565589SLin Jinhan 	} td_buf;
309*00565589SLin Jinhan };
310*00565589SLin Jinhan 
311*00565589SLin Jinhan typedef int (*request_cb_func)(int result, uint32_t td_id, void *td_virt);
312*00565589SLin Jinhan 
313*00565589SLin Jinhan void rkce_dump_reginfo(void *rkce_hw);
314*00565589SLin Jinhan 
315*00565589SLin Jinhan void *rkce_hardware_alloc(void __iomem *reg_base);
316*00565589SLin Jinhan 
317*00565589SLin Jinhan void rkce_hardware_free(void *rkce_hw);
318*00565589SLin Jinhan 
319*00565589SLin Jinhan void rkce_irq_handler(void *rkce_hw);
320*00565589SLin Jinhan 
321*00565589SLin Jinhan void rkce_irq_thread(void *rkce_hw);
322*00565589SLin Jinhan 
323*00565589SLin Jinhan int rkce_irq_callback_set(void *rkce_hw, enum rkce_td_type td_type, request_cb_func cb_func);
324*00565589SLin Jinhan 
325*00565589SLin Jinhan int rkce_soft_reset(void *rkce_hw, uint32_t reset_sel);
326*00565589SLin Jinhan 
327*00565589SLin Jinhan int rkce_push_td(void *rkce_hw, void *td);
328*00565589SLin Jinhan 
329*00565589SLin Jinhan int rkce_push_td_sync(void *rkce_hw, void *td, uint32_t timeout_ms);
330*00565589SLin Jinhan 
331*00565589SLin Jinhan uint32_t rkce_get_td_type(void *td_buf);
332*00565589SLin Jinhan 
333*00565589SLin Jinhan int rkce_init_symm_td(struct rkce_symm_td *td, struct rkce_symm_td_buf *buf);
334*00565589SLin Jinhan 
335*00565589SLin Jinhan int rkce_init_hash_td(struct rkce_hash_td *td, struct rkce_hash_td_buf *buf);
336*00565589SLin Jinhan 
337*00565589SLin Jinhan bool rkce_hw_algo_valid(void *rkce_hw, uint32_t type, uint32_t algo, uint32_t mode);
338*00565589SLin Jinhan 
339*00565589SLin Jinhan #endif
340