xref: /optee_os/core/drivers/crypto/hisilicon/sec_main.h (revision 562874beda99c45a47e8e1927a832ba33c65bc11)
1b6a44cc5Sleisen /* SPDX-License-Identifier: BSD-2-Clause */
2b6a44cc5Sleisen /* Copyright (c) 2022-2024 HiSilicon Limited. */
3b6a44cc5Sleisen #ifndef __SEC_MAIN_H
4b6a44cc5Sleisen #define __SEC_MAIN_H
5b6a44cc5Sleisen 
6b6a44cc5Sleisen #include "hisi_qm.h"
7b6a44cc5Sleisen 
8b6a44cc5Sleisen #ifdef CFG_HISILICON_ACC_V3
9b6a44cc5Sleisen #define SEC_BAR			0x160000000
10b6a44cc5Sleisen #else
11b6a44cc5Sleisen #define SEC_BAR			0x141800000
12b6a44cc5Sleisen #endif
13b6a44cc5Sleisen #define SEC_SIZE		0x400000
14b6a44cc5Sleisen 
15b6a44cc5Sleisen #define SEC_SQE_SIZE		128
16b6a44cc5Sleisen #define SEC_SQE_LOG2_SIZE	7
17b6a44cc5Sleisen #define AES_KEYSIZE_128		16
18b6a44cc5Sleisen #define AES_KEYSIZE_192		24
19b6a44cc5Sleisen #define AES_KEYSIZE_256		32
20b6a44cc5Sleisen #define SEC_HW_TASK_DONE	0x1
21b6a44cc5Sleisen #define SEC_DONE_MASK		0x0001
22b6a44cc5Sleisen #define SEC_ICV_MASK		0x000E
23b6a44cc5Sleisen #define SEC_HW_ICV_ERR		0x2
24b6a44cc5Sleisen #define SEC_ENCODE_BYTES	4
25b6a44cc5Sleisen #define BYTE_BITS		0x8
26b6a44cc5Sleisen 
27b6a44cc5Sleisen #define SEC_SCENE_OFFSET	3
28b6a44cc5Sleisen #define SEC_DE_OFFSET		1
29b6a44cc5Sleisen #define SEC_CIPHER_OFFSET	4
30b6a44cc5Sleisen #define SEC_AUTH_OFFSET		6
31b6a44cc5Sleisen #define SEC_CMODE_OFFSET	12
32b6a44cc5Sleisen #define SEC_CKEY_OFFSET		9
33b6a44cc5Sleisen #define SEC_AKEY_OFFSET		5
34b6a44cc5Sleisen #define SEC_AEAD_ALG_OFFSET	11
35b6a44cc5Sleisen #define SEC_HUK_OFFSET		4
36b6a44cc5Sleisen #define SEC_APAD_OFFSET		2
37b6a44cc5Sleisen 
38b6a44cc5Sleisen #define SEC_DE_OFFSET_V3	9
39b6a44cc5Sleisen #define SEC_SCENE_OFFSET_V3	5
40b6a44cc5Sleisen #define SEC_CKEY_OFFSET_V3	13
41b6a44cc5Sleisen #define SEC_CALG_OFFSET_V3	4
42b6a44cc5Sleisen #define SEC_AKEY_OFFSET_V3	9
43b6a44cc5Sleisen #define SEC_MAC_OFFSET_V3	4
44b6a44cc5Sleisen #define SEC_AUTH_ALG_OFFSET_V3	15
45b6a44cc5Sleisen #define SEC_CIPHER_AUTH_V3	0xbf
46b6a44cc5Sleisen #define SEC_AUTH_CIPHER_V3	0x40
47b6a44cc5Sleisen #define SEC_AI_GEN_OFFSET_V3	2
48b6a44cc5Sleisen #define SEC_SEQ_OFFSET_V3	6
49b6a44cc5Sleisen #define SEC_ICV_LEN_OFFSET_V3	4
50b6a44cc5Sleisen #define SEC_DK_LEN_OFFSET_V3	16
51b6a44cc5Sleisen #define SEC_KEY_SEL_OFFSET_V3	21
52b6a44cc5Sleisen #define SEC_GET_FIELD(val, mask, shift) (((val) & (mask)) >> (shift))
53b6a44cc5Sleisen 
54b6a44cc5Sleisen struct hisi_sec_sqe_type2 {
55b6a44cc5Sleisen 	/*
56b6a44cc5Sleisen 	 * mac_len: 0~4 bits
57b6a44cc5Sleisen 	 * a_key_len: 5~10 bits
58b6a44cc5Sleisen 	 * a_alg: 11~16 bits
59b6a44cc5Sleisen 	 */
60b6a44cc5Sleisen 	uint32_t mac_key_alg;
61b6a44cc5Sleisen 
62b6a44cc5Sleisen 	/*
63b6a44cc5Sleisen 	 * c_icv_len: 0~5 bits
64b6a44cc5Sleisen 	 * c_width: 6~8 bits
65b6a44cc5Sleisen 	 * c_key_len: 9~11 bits
66b6a44cc5Sleisen 	 * c_mode: 12~15 bits
67b6a44cc5Sleisen 	 */
68b6a44cc5Sleisen 	uint16_t icvw_kmode;
69b6a44cc5Sleisen 
70b6a44cc5Sleisen 	/* c_alg: 0~3 bits */
71b6a44cc5Sleisen 	uint8_t c_alg;
72b6a44cc5Sleisen 
73b6a44cc5Sleisen 	uint8_t rsvd4;
74b6a44cc5Sleisen 	/*
75b6a44cc5Sleisen 	 * a_len: 0~23 bits
76b6a44cc5Sleisen 	 * iv_offset_l: 24~31 bits
77b6a44cc5Sleisen 	 */
78b6a44cc5Sleisen 	uint32_t alen_ivllen;
79b6a44cc5Sleisen 
80b6a44cc5Sleisen 	/*
81b6a44cc5Sleisen 	 * c_len: 0~23 bits
82b6a44cc5Sleisen 	 * iv_offset_h: 24~31 bits
83b6a44cc5Sleisen 	 */
84b6a44cc5Sleisen 	uint32_t clen_ivhlen;
85b6a44cc5Sleisen 
86b6a44cc5Sleisen 	uint16_t auth_src_offset;
87b6a44cc5Sleisen 	uint16_t cipher_src_offset;
88b6a44cc5Sleisen 	uint16_t cs_ip_header_offset;
89b6a44cc5Sleisen 	uint16_t cs_udp_header_offset;
90b6a44cc5Sleisen 	uint16_t pass_word_len;
91b6a44cc5Sleisen 	uint16_t dk_len;
92b6a44cc5Sleisen 	uint8_t salt3;
93b6a44cc5Sleisen 	uint8_t salt2;
94b6a44cc5Sleisen 	uint8_t salt1;
95b6a44cc5Sleisen 	uint8_t salt0;
96b6a44cc5Sleisen 
97b6a44cc5Sleisen 	uint16_t tag;
98b6a44cc5Sleisen 	uint16_t rsvd5;
99b6a44cc5Sleisen 
100b6a44cc5Sleisen 	/*
101b6a44cc5Sleisen 	 * c_pad_type: 0~3 bits
102b6a44cc5Sleisen 	 * c_pad_len: 4~11 bits
103b6a44cc5Sleisen 	 * c_pad_data_type: 12~15 bits
104b6a44cc5Sleisen 	 */
105b6a44cc5Sleisen 	uint16_t cph_pad;
106b6a44cc5Sleisen 	/* c_pad_len_field: 0~1 bits */
107b6a44cc5Sleisen 	uint16_t c_pad_len_field;
108b6a44cc5Sleisen 
109b6a44cc5Sleisen 	uint64_t long_a_data_len;
110b6a44cc5Sleisen 	uint64_t a_ivin_addr;
111b6a44cc5Sleisen 	uint64_t a_key_addr;
112b6a44cc5Sleisen 	uint64_t mac_addr;
113b6a44cc5Sleisen 	uint64_t c_ivin_addr;
114b6a44cc5Sleisen 	uint64_t c_key_addr;
115b6a44cc5Sleisen 	uint64_t data_src_addr;
116b6a44cc5Sleisen 	uint64_t data_dst_addr;
117b6a44cc5Sleisen 
118b6a44cc5Sleisen 	/*
119b6a44cc5Sleisen 	 * done: 0 bit
120b6a44cc5Sleisen 	 * icv: 1~3 bits
121b6a44cc5Sleisen 	 * csc: 4~6 bits
122b6a44cc5Sleisen 	 * flag: 7~10 bits
123b6a44cc5Sleisen 	 */
124b6a44cc5Sleisen 	uint16_t done_flag;
125b6a44cc5Sleisen 
126b6a44cc5Sleisen 	uint8_t error_type;
127b6a44cc5Sleisen 	uint8_t warning_type;
128b6a44cc5Sleisen 	uint8_t mac_i3;
129b6a44cc5Sleisen 	uint8_t mac_i2;
130b6a44cc5Sleisen 	uint8_t mac_i1;
131b6a44cc5Sleisen 	uint8_t mac_i0;
132b6a44cc5Sleisen 	uint16_t check_sum_i;
133b6a44cc5Sleisen 	uint8_t tls_pad_len_i;
134b6a44cc5Sleisen 	uint8_t rsvd12;
135b6a44cc5Sleisen 	uint32_t counter;
136b6a44cc5Sleisen };
137b6a44cc5Sleisen 
138b6a44cc5Sleisen struct hisi_sec_sqe {
139b6a44cc5Sleisen 	/*
140b6a44cc5Sleisen 	 * type:  0~3 bits;
141b6a44cc5Sleisen 	 * cipher: 4~5 bits;
142b6a44cc5Sleisen 	 * auth: 6~7 bits;
143b6a44cc5Sleisen 	 */
144b6a44cc5Sleisen 	uint8_t type_auth_cipher;
145b6a44cc5Sleisen 	/*
146b6a44cc5Sleisen 	 * seq: 0 bits;
147b6a44cc5Sleisen 	 * de: 1~2 bits;
148b6a44cc5Sleisen 	 * scene: 3~6 bits;
149b6a44cc5Sleisen 	 * src_addr_type: 7 bits;
150b6a44cc5Sleisen 	 */
151b6a44cc5Sleisen 	uint8_t sds_sa_type;
152b6a44cc5Sleisen 	/*
153b6a44cc5Sleisen 	 * src_addr_type: 0~1 bits not used now.
154b6a44cc5Sleisen 	 * dst_addr_type: 2~4 bits;
155b6a44cc5Sleisen 	 * mac_addr_type: 5~7 bits;
156b6a44cc5Sleisen 	 */
157b6a44cc5Sleisen 	uint8_t sdm_addr_type;
158b6a44cc5Sleisen 
159b6a44cc5Sleisen 	uint8_t rsvd0;
160b6a44cc5Sleisen 	/*
161b6a44cc5Sleisen 	 * nonce_len(type): 0~3 bits;
162b6a44cc5Sleisen 	 * huk: 4 bit;
163b6a44cc5Sleisen 	 * key_s: 5 bit
164b6a44cc5Sleisen 	 * ci_gen: 6~7 bits
165b6a44cc5Sleisen 	 */
166b6a44cc5Sleisen 	uint8_t huk_ci_key;
167b6a44cc5Sleisen 	/*
168b6a44cc5Sleisen 	 * ai_gen: 0~1 bits;
169b6a44cc5Sleisen 	 * a_pad : 2~3 bits;
170b6a44cc5Sleisen 	 * c_s : 4~5 bits;
171b6a44cc5Sleisen 	 */
172b6a44cc5Sleisen 	uint8_t ai_apd_cs;
173b6a44cc5Sleisen 	/*
174b6a44cc5Sleisen 	 * rhf(type2): 0 bit;
175b6a44cc5Sleisen 	 * c_key_type: 1~2 bits;
176b6a44cc5Sleisen 	 * a_key_type: 3~4 bits
177b6a44cc5Sleisen 	 * write_frame_len(type2): 5~7bits;
178b6a44cc5Sleisen 	 */
179b6a44cc5Sleisen 	uint8_t rca_key_frm;
180b6a44cc5Sleisen 
181b6a44cc5Sleisen 	uint8_t iv_tls_ld;
182b6a44cc5Sleisen 	struct hisi_sec_sqe_type2 type2; /* the other scene */
183b6a44cc5Sleisen };
184b6a44cc5Sleisen 
185b6a44cc5Sleisen struct bd3_stream_scene {
186b6a44cc5Sleisen 	uint64_t c_ivin_addr;
187b6a44cc5Sleisen 	uint64_t long_a_data_len;
188b6a44cc5Sleisen 
189b6a44cc5Sleisen 	/*
190b6a44cc5Sleisen 	 * auth_pad: 0~1 bits
191b6a44cc5Sleisen 	 * stream_protocol: 2~4 bits
192b6a44cc5Sleisen 	 * reserved: 5~7 bits
193b6a44cc5Sleisen 	 */
194b6a44cc5Sleisen 	uint8_t auth_pad;
195b6a44cc5Sleisen 	uint8_t plaintext_type;
196b6a44cc5Sleisen 	uint16_t pad_len_1p3;
197b6a44cc5Sleisen } __packed __aligned(4);
198b6a44cc5Sleisen 
199b6a44cc5Sleisen struct bd3_no_scene {
200b6a44cc5Sleisen 	uint64_t c_ivin_addr;
201b6a44cc5Sleisen 	uint32_t rsvd0;
202b6a44cc5Sleisen 	uint32_t rsvd1;
203b6a44cc5Sleisen 	uint32_t rsvd2;
204b6a44cc5Sleisen } __packed __aligned(4);
205b6a44cc5Sleisen 
206b6a44cc5Sleisen struct bd3_pbkdf2_scene {
207b6a44cc5Sleisen 	uint64_t c_ivin_addr;
208b6a44cc5Sleisen 
209b6a44cc5Sleisen 	/*
210b6a44cc5Sleisen 	 * pbkdf2_salt_len: 0~23 bits
211b6a44cc5Sleisen 	 * rsvd0: 24~31 bits
212b6a44cc5Sleisen 	 */
213b6a44cc5Sleisen 	uint32_t pbkdf2_salt_len;
214b6a44cc5Sleisen 
215b6a44cc5Sleisen 	/*
216b6a44cc5Sleisen 	 * c_num: 0~23 bits
217b6a44cc5Sleisen 	 * rsvd1: 24~31 bits
218b6a44cc5Sleisen 	 */
219b6a44cc5Sleisen 	uint32_t c_num;
220b6a44cc5Sleisen 
221b6a44cc5Sleisen 	/*
222b6a44cc5Sleisen 	 * pass_word_len: 0~15 bits
223b6a44cc5Sleisen 	 * dk_len: 16~31 bits
224b6a44cc5Sleisen 	 */
225b6a44cc5Sleisen 	uint32_t pass_word_dk_len;
226b6a44cc5Sleisen } __packed __aligned(4);
227b6a44cc5Sleisen 
228b6a44cc5Sleisen struct hisi_sec_bd3_sqe {
229b6a44cc5Sleisen 	/*
230b6a44cc5Sleisen 	 * type: 0~3 bit
231b6a44cc5Sleisen 	 * bd_invalid: 4 bit
232b6a44cc5Sleisen 	 * scene: 5~8 bit
233b6a44cc5Sleisen 	 * de: 9~10 bit
234b6a44cc5Sleisen 	 * src_addr_type: 11~13 bit
235b6a44cc5Sleisen 	 * dst_addr_type: 14~16 bit
236b6a44cc5Sleisen 	 * mac_addr_type: 17~19 bit
237b6a44cc5Sleisen 	 * reserved: 20~31 bits
238b6a44cc5Sleisen 	 */
239b6a44cc5Sleisen 	uint32_t bd_param;
240b6a44cc5Sleisen 
241b6a44cc5Sleisen 	/*
242b6a44cc5Sleisen 	 * cipher: 0~1 bits
243b6a44cc5Sleisen 	 * ci_gen: 2~3 bit
244b6a44cc5Sleisen 	 * c_icv_len: 4~9 bit
245b6a44cc5Sleisen 	 * c_width: 10~12 bits
246b6a44cc5Sleisen 	 * c_key_len: 13~15 bits
247b6a44cc5Sleisen 	 */
248b6a44cc5Sleisen 	uint16_t c_icv_key;
249b6a44cc5Sleisen 
250b6a44cc5Sleisen 	/*
251b6a44cc5Sleisen 	 * c_mode : 0~3 bits
252b6a44cc5Sleisen 	 * c_alg : 4~7 bits
253b6a44cc5Sleisen 	 */
254b6a44cc5Sleisen 	uint8_t c_mode_alg;
255b6a44cc5Sleisen 
256b6a44cc5Sleisen 	/*
257b6a44cc5Sleisen 	 * nonce_len : 0~3 bits
258b6a44cc5Sleisen 	 * huk : 4 bits
259b6a44cc5Sleisen 	 * cal_iv_addr_en : 5 bits
260b6a44cc5Sleisen 	 * seq : 6 bits
261b6a44cc5Sleisen 	 * reserved : 7 bits
262b6a44cc5Sleisen 	 */
263b6a44cc5Sleisen 	uint8_t huk_iv_seq;
264b6a44cc5Sleisen 
265b6a44cc5Sleisen 	uint64_t tag;
266b6a44cc5Sleisen 	uint64_t data_src_addr;
267b6a44cc5Sleisen 	uint64_t a_key_addr;
268b6a44cc5Sleisen 	uint64_t a_ivin_addr;
269b6a44cc5Sleisen 	uint64_t rsvd;
270b6a44cc5Sleisen 	uint64_t c_key_addr;
271b6a44cc5Sleisen 
272b6a44cc5Sleisen 	/*
273b6a44cc5Sleisen 	 * auth: 0~1 bits
274b6a44cc5Sleisen 	 * ai_gen: 2~3 bits
275b6a44cc5Sleisen 	 * mac_len: 4~8 bits
276b6a44cc5Sleisen 	 * akey_len: 9~14 bits
277b6a44cc5Sleisen 	 * a_alg: 15~20 bits
278b6a44cc5Sleisen 	 * key_sel: 21~24 bits
279b6a44cc5Sleisen 	 * ctr_count_mode/sm4_xts: 25~26 bits
280b6a44cc5Sleisen 	 * sva_prefetch: 27 bits
281b6a44cc5Sleisen 	 * key_wrap_num:28~30 bits
282b6a44cc5Sleisen 	 * update_key: 31 bits
283b6a44cc5Sleisen 	 */
284b6a44cc5Sleisen 	uint32_t auth_mac_key;
285b6a44cc5Sleisen 	uint32_t salt;
286b6a44cc5Sleisen 	uint16_t auth_src_offset;
287b6a44cc5Sleisen 	uint16_t cipher_src_offset;
288b6a44cc5Sleisen 
289b6a44cc5Sleisen 	/*
290b6a44cc5Sleisen 	 * auth_len: 0~23 bit
291b6a44cc5Sleisen 	 * auth_key_offset: 24~31 bits
292b6a44cc5Sleisen 	 */
293b6a44cc5Sleisen 	uint32_t a_len_key;
294b6a44cc5Sleisen 
295b6a44cc5Sleisen 	/*
296b6a44cc5Sleisen 	 * cipher_len: 0~23 bit
297b6a44cc5Sleisen 	 * auth_ivin_offset: 24~31 bits
298b6a44cc5Sleisen 	 */
299b6a44cc5Sleisen 	uint32_t c_len_ivin;
300b6a44cc5Sleisen 	uint64_t data_dst_addr;
301b6a44cc5Sleisen 	uint64_t mac_addr;
302b6a44cc5Sleisen 	union {
303b6a44cc5Sleisen 		struct bd3_stream_scene stream_scene;
304b6a44cc5Sleisen 		struct bd3_no_scene no_scene;
305b6a44cc5Sleisen 		struct bd3_pbkdf2_scene pbkdf2_scene;
306b6a44cc5Sleisen 	};
307b6a44cc5Sleisen 
308b6a44cc5Sleisen 	/*
309b6a44cc5Sleisen 	 * done: 0 bit
310b6a44cc5Sleisen 	 * icv: 1~3 bit
311b6a44cc5Sleisen 	 * csc: 4~6 bit
312b6a44cc5Sleisen 	 * flag: 7~10 bit
313b6a44cc5Sleisen 	 * reserved: 11~15 bit
314b6a44cc5Sleisen 	 */
315b6a44cc5Sleisen 	uint16_t done_flag;
316b6a44cc5Sleisen 	uint8_t error_type;
317b6a44cc5Sleisen 	uint8_t warning_type;
318b6a44cc5Sleisen 	uint64_t kek_key_addr;
319b6a44cc5Sleisen 	uint32_t counter;
320b6a44cc5Sleisen } __packed __aligned(4);
321b6a44cc5Sleisen 
322b6a44cc5Sleisen enum sec_bd_type {
323b6a44cc5Sleisen 	BD_TYPE1 = 0x1,
324b6a44cc5Sleisen 	BD_TYPE2 = 0x2,
325b6a44cc5Sleisen 	BD_TYPE3 = 0x3,
326b6a44cc5Sleisen };
327b6a44cc5Sleisen 
328b6a44cc5Sleisen enum sec_bd_scene {
329b6a44cc5Sleisen 	SCENE_NOTHING = 0x0,
330b6a44cc5Sleisen 	SCENE_STREAM = 0x7,
331b6a44cc5Sleisen 	SCENE_PBKDF2 = 0x8,
332b6a44cc5Sleisen };
333b6a44cc5Sleisen 
334b6a44cc5Sleisen enum sec_auth_dir {
335b6a44cc5Sleisen 	NO_AUTH,
336b6a44cc5Sleisen 	AUTH_MAC_CALCULATE,
337b6a44cc5Sleisen 	AUTH_MAC_VERIFY,
338b6a44cc5Sleisen };
339b6a44cc5Sleisen 
340*562874beSleisen enum sec_bd_seq {
341*562874beSleisen 	DATA_DST_ADDR_DISABLE,
342*562874beSleisen 	DATA_DST_ADDR_ENABLE,
343*562874beSleisen };
344*562874beSleisen 
345b6a44cc5Sleisen /*
346b6a44cc5Sleisen  * Create task queue pair for SEC.
347b6a44cc5Sleisen  *
348b6a44cc5Sleisen  * @sq_type Task type of the submmission queue.
349b6a44cc5Sleisen  */
350b6a44cc5Sleisen struct hisi_qp *sec_create_qp(uint8_t sq_type);
351b6a44cc5Sleisen 
352b6a44cc5Sleisen #endif
353