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