gk7205v200-uboot/product/cipher/v2/drv/spacc/spacc_body.h
2025-08-07 17:13:54 +08:00

225 lines
6.8 KiB
C
Executable File

/*
* Copyright (c) Hunan Goke,Chengdu Goke,Shandong Goke. 2021. All rights reserved.
*/
#ifndef _SPACC_BODY_H_
#define _SPACC_BODY_H_
#define SPACC_LOGIC_MAX_CHN 8
#define CIPHER_PKG_1_CHN 0
#define SPACC_MAX_DEPTH 127
#define SPACC_MAX_HMAC_KEY_LEN 512
#define SPACC_PAGE_SIZE 4096
#define CIPHER_PKG_N_CHN_MIN 1
#define CIPHER_PKG_N_CHN_MAX 7
#define SPACC_CHN_MASK 0xFE
#define CIPHER_DMA_MINALIGN ARCH_DMA_MINALIGN
typedef enum {
SYMC_ALG_DES = 0,
SYMC_ALG_3DES,
SYMC_ALG_AES,
SYMC_ALG_SM4,
SYMC_ALG_SM1,
SYMC_ALG_NULL_CIPHER,
SYMC_ALG_COUNT,
} symc_alg_en;
typedef enum {
SYMC_MODE_ECB = 0,
SYMC_MODE_CBC,
SYMC_MODE_CFB,
SYMC_MODE_OFB,
SYMC_MODE_CTR,
SYMC_MODE_CCM,
SYMC_MODE_GCM,
SYMC_MODE_COUNT,
} symc_mode_en;
typedef enum {
SYMC_DAT_WIDTH_128 = 0,
SYMC_DAT_WIDTH_64 = 0,
SYMC_DAT_WIDTH_8,
SYMC_DAT_WIDTH_1,
SYMC_DAT_WIDTH_COUNT,
} symc_dat_width_en;
typedef enum {
DIGEST_MODE_HASH,
DIGEST_MODE_HMAC,
DIGEST_MODE_COUNT,
} digest_mode_en;
typedef enum {
DIGEST_ALG_SHA1,
DIGEST_ALG_SHA224,
DIGEST_ALG_SHA256,
DIGEST_ALG_SHA384,
DIGEST_ALG_SHA512,
DIGEST_ALG_SM3,
DIGEST_ALG_COUNT,
} digest_alg_en;
typedef enum {
SPACC_ALLIED_SYMC = 0x00,
SPACC_ALLIED_DIGEST,
SPACC_ALLIED_SYMC_WITH_DIGEST,
SPACC_ALLIED_DIGEST_WITH_SYMC,
SPACC_ALLIED_COUNT,
} spacc_allied_en;
typedef enum {
SPACC_BUF_TYPE_SYMC_IN,
SPACC_BUF_TYPE_SYMC_OUT,
SPACC_BUF_TYPE_DIGEST_IN,
SPACC_BUF_TYPE_COUNT,
} spacc_buf_type_en;
typedef enum {
SPACC_CTRL_NONE = 0x00,
SPACC_CTRL_SYMC_IN_GCM_A = 0x00,
SPACC_CTRL_SYMC_IN_GCM_P = 0x08,
SPACC_CTRL_SYMC_IN_GCM_LEN = 0x10,
SPACC_CTRL_SYMC_IN_CCM_N = 0x00,
SPACC_CTRL_SYMC_IN_CCM_A = 0x08,
SPACC_CTRL_SYMC_IN_CCM_P = 0x10,
SPACC_CTRL_SYMC_IN_CBC_OUTPUT_DISABLE = 0x04,
SPACC_CTRL_SYMC_IN_FIRST = 0x01,
SPACC_CTRL_SYMC_IN_LAST = 0x02,
SPACC_CTRL_HASH_IN_PAD = 0x04,
SPACC_CTRL_HASH_IN_FIRST = 0x01,
SPACC_CTRL_HASH_IN_LAST = 0x02,
SPACC_CTRL_HASH_IN_AUTO_PADDING = 0x04,
SPACC_CTRL_HASH_IN_HMAC_END = 0x08,
SPACC_CTRL_SYMC_OUT_LAST = 0x02,
SPACC_CTRL_SYMC_CCM_LAST = 0x20,
SPACC_CTRL_SYMC_ODD_KEY = 0x40,
SPACC_CTRL_SYMC_EVEN_KEY = 0x00,
SPACC_CTRL_COUNT,
} spacc_ctrl_en;
typedef enum {
SPACC_DATA_SEAT_FIRST,
SPACC_DATA_SEAT_MIDDLE,
SPACC_DATA_SEAT_LAST,
SPACC_DATA_SEAT_COUNT,
} spacc_data_seat_en;
typedef struct {
symc_alg_en symc_alg;
symc_mode_en symc_mode;
symc_dat_width_en symc_width;
gk_u32 key_len;
} spacc_symc_config_s;
#define SPACC_OK 0x000
#define SPACC_DIGEST_DONE 0x001
#define SPACC_DIGEST_LEN_ERR 0x002
#define SPACC_SYMC_DONE 0x004
#define SPACC_AEAD_DONE 0x008
#define SPACC_SYMC_KEY_ERR 0x0100
#define SPACC_SYMC_LEN_ERR 0x0200
#define SPACC_SYMC_DFA_ATTACK 0x0400
#define SPACC_ERR_NULL_POINT 0x400
#define SPACC_ERR_INVALID_PARAM 0x401
#define SPACC_ERR_BUSY 0x402
#define SPACC_ERR_TIMEOUT 0x403
#define SPACC_CHN_SECURE_ENABLE 0x80000000
#define get_ulong_low(dw) (unsigned int)(dw)
#define get_ulong_high(dw) 0
#define make_ulong(low, high) (low)
#define make_size(low) (((unsigned long)(low##High) << 32) | (low))
#if (defined(CONFIG_TARGET_GK7205V200) || defined(CONFIG_TARGET_GK7205V300) || \
defined(CONFIG_TARGET_GK7202V300) || defined(CONFIG_TARGET_GK7605V100))
#define HASH_RESULT_MAX_SIZE_IN_WORD 8
#else
#define HASH_RESULT_MAX_SIZE_IN_WORD 16
#endif
#define CACHE_LINE_VALUE CONFIG_SYS_CACHELINE_SIZE
#define cipher_align_down(addr) ((addr) & (~((CACHE_LINE_VALUE) - 1)))
#define cipher_align_size(addr, size) ALIGN((size) + ((addr) & (CACHE_LINE_VALUE - 1)), CIPHER_DMA_MINALIGN)
int spacc_init(gk_void *reg_base, unsigned int mmu_table_addr,
unsigned long entry_phy_addr, gk_void *entry_via_addr);
int spacc_deinit(void);
unsigned int spacc_get_node_list_size(void);
/**************************** SYMC API ********************************/
int spacc_symc_getiv(unsigned int chn_num, unsigned int *iv, unsigned int ivsize);
int spacc_symc_gettag(unsigned int chn_num, unsigned char *tag);
int spacc_symc_setkey(unsigned int chn_num,
unsigned int *even_key,
unsigned int *odd_key,
unsigned int klen);
int spacc_symc_setiv(unsigned int chn_num,
unsigned char *iv, unsigned int ivlen);
int spacc_symc_addbuf(unsigned int chn_num,
unsigned long buf_phy,
unsigned int buf_size,
spacc_buf_type_en type,
unsigned int ctrl);
int spacc_symc_addctrl(unsigned int chn_num, spacc_buf_type_en type, unsigned int ctrl);
int spacc_symc_config(unsigned int chn_num, spacc_symc_config_s *symc_cfg,
unsigned char sm1_round_num, unsigned char hard_key);
int spacc_symc_start(unsigned int chn_num, unsigned int decrypt, unsigned int iv_set_flag);
void spacc_symc_restart(unsigned int chn_num, unsigned int iv_set_flag);
unsigned int spacc_symc_get_free_nodes(unsigned int chn_num);
unsigned int spacc_symc_is_free(unsigned int chn_num);
unsigned int spacc_symc_done_notify(void);
unsigned int spacc_symc_done_try(unsigned int chn_num);
unsigned int spacc_symc_get_err_code(unsigned int chn_num, unsigned int *src_addr, unsigned int *dst_addr);
/**************************** DIGEST API ********************************/
int spacc_digest_config(unsigned int chn_num,
digest_alg_en digest_alg,
digest_mode_en digest_mode,
unsigned char hard_key);
void spacc_digest_get_init_val(digest_alg_en digest_alg, unsigned int state[16]); /* 16 */
int spacc_digest_addbuf(unsigned int chn_num,
unsigned long buf_phy,
unsigned int buf_size,
unsigned int ctrl);
int spacc_digest_addctrl(unsigned int chn_num, unsigned int ctrl);
int spacc_digest_start(unsigned int chn_num, spacc_ctrl_en enCtrl, unsigned int *state);
unsigned int spacc_digest_done_notify(void);
unsigned int spacc_digest_done_try(unsigned int chn_num);
int spacc_digest_get(unsigned int chn_num, unsigned int *digest);
unsigned int spacc_digest_get_err_code(unsigned int chn_num, unsigned int *src_addr);
/* proc function begin */
#ifndef DISABLE_DEBUG_INFO
gk_s32 spacc_symc_proc_status(cipher_chn_status_s *cipher_statue);
/* proc function end */
#endif
#endif