SmartAudio/lichee/linux-4.9/drivers/crypto/sunxi-ss/v1/sunxi_ss_reg.h

163 lines
4.8 KiB
C
Executable File

/*
* The register macro of SUNXI SecuritySystem controller.
*
* Copyright (C) 2013 Allwinner.
*
* Mintow <duanmintao@allwinnertech.com>
*
* This file is licensed under the terms of the GNU General Public
* License version 2. This program is licensed "as is" without any
* warranty of any kind, whether express or implied.
*/
#ifndef _SUNXI_SECURITY_SYSTEM_REG_H_
#define _SUNXI_SECURITY_SYSTEM_REG_H_
#define SS_REG_CTL 0x00
#define SS_REG_KEY_BASE 0x04
#define SS_REG_KEY(n) (SS_REG_KEY_BASE + 4*n)
#define SS_REG_KEY_NUM 8
#define SS_REG_IV_BASE 0x24
#define SS_REG_IV(n) (SS_REG_IV_BASE + 4*n)
#define SS_REG_IV_NUM 4
#define SS_REG_FCSR 0x44
#define SS_REG_ICSR 0x48
#define SS_REG_MD_BASE 0x4C
#define SS_REG_MD(n) (SS_REG_MD_BASE + 4*n)
#define SS_REG_MD_NUM 5
#define SS_REG_CNT_BASE 0x34
#define SS_REG_CNT(n) (SS_REG_CNT_BASE + 4*n)
#define SS_REG_CNT_NUM 4
#if defined(CONFIG_ARCH_SUN8IW5) || defined(CONFIG_ARCH_SUN8IW8)
#define SS_REG_CTS_LEN 0x60
#endif
#define SS_REG_RXFIFO 0x200
#define SS_REG_TXFIFO 0x204
#define SS_KEY_SELECT_INPUT 0
#define SS_KEY_SELECT_SID_R 1
#define SS_KEY_SELECT_SID_B 2
#define SS_KEY_SELECT_INTER 3
#define SS_REG_CTL_KEY_SELECT_SHIFT 24
#define SS_REG_CTL_KEY_SELECT_MASK (0x4 << SS_REG_CTL_KEY_SELECT_SHIFT)
#define SS_RNG_MODE_ONESHOT 0
#define SS_RNG_MODE_CONTINUE 1
#define SS_REG_CTL_PRNG_MODE_SHIFT 15
#define SS_REG_CTL_PRNG_MODE_MASK (1 << SS_REG_CTL_PRNG_MODE_SHIFT)
#define SS_IV_MODE_CONSTANT 0
#define SS_IV_MODE_ARBITRARY 1
#define SS_REG_CTL_IV_MODE_SHIFT 14
#define SS_REG_CTL_IV_MODE_MASK (1 << SS_REG_CTL_IV_MODE_SHIFT)
#define SS_AES_MODE_ECB 0
#define SS_AES_MODE_CBC 1
#define SS_AES_MODE_CTR 2
#if defined(CONFIG_ARCH_SUN8IW5) || defined(CONFIG_ARCH_SUN8IW8)
#define SS_AES_MODE_CTS 3
#endif
#define SS_REG_CTL_OP_MODE_SHIFT 12
#define SS_REG_CTL_OP_MODE_MASK (0x3 << SS_REG_CTL_OP_MODE_SHIFT)
#define SS_CTR_SIZE_16 0
#define SS_CTR_SIZE_32 1
#define SS_CTR_SIZE_64 2
#define SS_REG_CTL_CTR_SIZE_SHIFT 10
#define SS_REG_CTL_CTR_SIZE_MASK (0x3 << SS_REG_CTL_CTR_SIZE_SHIFT)
#define SS_AES_KEY_SIZE_128 0
#define SS_AES_KEY_SIZE_192 1
#define SS_AES_KEY_SIZE_256 2
#define SS_REG_CTL_KEY_SIZE_SHIFT 8
#define SS_REG_CTL_KEY_SIZE_MASK (0x3 << SS_REG_CTL_KEY_SIZE_SHIFT)
#define SS_DIR_ENCRYPT 0
#define SS_DIR_DECRYPT 1
#define SS_REG_CTL_OP_DIR_SHIFT 7
#define SS_REG_CTL_OP_DIR_MASK (0x1 << SS_REG_CTL_OP_DIR_SHIFT)
#define SS_METHOD_AES 0
#define SS_METHOD_DES 1
#define SS_METHOD_3DES 2
#define SS_METHOD_SHA1 3
#define SS_METHOD_MD5 4
#define SS_METHOD_PRNG 5
#define SS_REG_CTL_METHOD_SHIFT 4
#define SS_REG_CTL_METHOD_MASK (0x7 << SS_REG_CTL_METHOD_SHIFT)
#define SS_METHOD_IS_HASH(type) ((type == SS_METHOD_MD5) \
|| (type == SS_METHOD_SHA1))
#define SS_REG_CTL_SHA_END_SHIFT 2
#define SS_REG_CTL_SHA_END_MASK (0x1 << SS_REG_CTL_SHA_END_SHIFT)
#define SS_CTL_START 1
#define SS_REG_CTL_START_MASK 0x1
#define SS_REG_FCSR_RXFIFO_STATUS BIT(30)
#define SS_REG_FCSR_RXFIFO_EMP_CNT_SHIFT 24
#define SS_REG_FCSR_RXFIFO_EMP_CNT_MASK \
(0x3F << SS_REG_FCSR_RXFIFO_EMP_CNT_SHIFT)
#define SS_REG_FCSR_TXFIFO_STATUS BIT(22)
#define SS_REG_FCSR_TXFIFO_AVA_CNT_SHIFT 16
#define SS_REG_FCSR_TXFIFO_AVA_CNT_MASK \
(0x3F << SS_REG_FCSR_TXFIFO_AVA_CNT_SHIFT)
#define SS_REG_FCSR_RXFIFO_TRIG_LEVEL_SHIFT 8
#define SS_REG_FCSR_RXFIFO_TRIG_LEVEL_MASK \
(0x1F << SS_REG_FCSR_RXFIFO_TRIG_LEVEL_SHIFT)
#define SS_REG_FCSR_TXFIFO_TRIG_LEVEL_SHIFT 0
#define SS_REG_FCSR_TXFIFO_TRIG_LEVEL_MASK \
(0x1F << SS_REG_FCSR_TXFIFO_TRIG_LEVEL_SHIFT)
#define SS_REG_ICSR_RXFIFO_EMP_PENDING BIT(10)
#define SS_REG_ICSR_TXFIFO_AVA_PENDING BIT(8)
#define SS_REG_ICSR_DRA_ENABLE BIT(4)
#define SS_REG_ICSR_RXFIFO_EMP_INT_ENABLE BIT(2)
#define SS_REG_ICSR_TXFIFO_AVA_INT_ENABLE BIT(0)
#define SS_SEED_SIZE 24
/* Function declaration */
u32 ss_reg_rd(u32 offset);
void ss_reg_wr(u32 offset, u32 val);
void ss_keyselect_set(int select);
void ss_keysize_set(int size);
void ss_key_set(char *key, int size);
void ss_fifo_init(void);
void ss_flow_enable(int flow);
void ss_flow_mode_set(int mode);
int ss_pending_get(void);
void ss_pending_clear(int flow);
void ss_dma_enable(int flow);
void ss_dma_disable(int flow);
void ss_iv_set(char *iv, int size);
void ss_cntsize_set(int size);
void ss_cnt_set(char *cnt, int size);
void ss_cnt_get(int flow, char *cnt, int size);
void ss_md_get(char *dst, char *src, int size);
void ss_sha_final(void);
void ss_check_sha_end(void);
void ss_iv_mode_set(int mode);
void ss_method_set(int dir, int type);
void ss_aes_mode_set(int mode);
void ss_rng_mode_set(int mode);
int ss_random_rd(char *data, int len);
void ss_wait_idle(void);
void ss_ctrl_start(void);
void ss_ctrl_stop(void);
int ss_reg_print(char *buf, int len);
#endif /* end of _SUNXI_SECURITY_SYSTEM_REG_H_ */