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