blob: d07548e13280acbccb94c21ed606db1b96fe2caf [file] [log] [blame]
#ifndef _ASR_GEU_H_
#define _ASR_GEU_H_
#include <common.h>
#include <ubi_uboot.h>
enum {
AES_ECB = 0,
AES_CBC,
};
enum {
AES_DECRYPT = 0,
AES_ENCRYPT = 1,
};
#define EACH_DMA_PROCESS_SIZE (64*1024)
/* mem align, align: align mask of bytes */
#define buf_align(buf, align) (void *)(((unsigned long)(buf) + (align)) & ~(align))
#define GEU_BASE (0xD4201000)
#define APMU_BASE (0xD4282800)
#define GEU_STATUS (0x0000)
#define GEU_CONFIG (0x0004)
#define GEU_FUSE_APCFG1 (0x0404)
#define GEU_FUSE_APCFG2 (0x0408)
#define GEU_FUSE_APCFG3 (0x040C)
/* All AES related setting, need to clear before configure AES */
#define GEU_CFG_AES_MSK (0xA100394F)
/* ASR1803/1806/1828/1903 */
#define GEU_SECURE_KEY_ACCESS_DISABLED (1 << 29)
/* 1901/1906 registers */
#define GEU_KSTR_BANK6_LCS (0x0168)
#define GEU_KSTR_LCS_DM_BASE (3)
#define GEU_KSTR_LCS_MASK (0x7)
#define GEU_FUSE_WORD_BANK0 (0x0104)
#define GEU_FUSE_BANK0_127_96 (0x0410)
#define GEU_FUSE_BANK0_159_128 (0x04A8)
#define GEU_FUSE_BANK0_191_160 (0x048C)
#define GEU_FUSE_BANK0_207_192 (0x0418)
#define GEU_FUSE_BANK0_239_208 (0x0414)
#define GEU_FUSE_BANK0_255_240 (0x04C8)
#define GEU_FUSE_VAL_ROOT_KEY(n) (0x424 + (n)*4)
#define GEU_FUSE_VAL_OEM_HASH_KEY(n) (0x444 + (n)*4)
#define GEU_FUSE_BANK3_223_192 (0x041C)
#define GEU_FUSE_BANK3_255_224 (0x0420)
#define GEU_BLOCK3_RESERVED(n) (0x490 + (n)*4)
#define GEU_CFG_DMA_MODE_EN (1 << 31)
#define GEU_CFG_CBC_ECB (1 << 29)
#define GEU_CFG_PWR_BYP (1 << 28)
#define GEU_CFG_WRITE_IV (1 << 24)
#define GEU_CFG_ENA_RKEK (1 << 13)
#define GEU_CFG_ENC_DEC (1 << 3)
#define GEU_CFG_OCB_BYP (1 << 2)
#define GEU_CFG_KEY_SIZE(x) ((x) << 0)
#define GEU_STATUS_DATA_ENCDEC_READY (1 << 3)
#define GEU_STATUS_ROUND_KEY_READY (1 << 2)
#define GEU_STATUS_DATA_ENCDEC_ENA (1 << 1)
#define GEU_STATUS_ROUND_KEY_START (1 << 0)
#define GEU_INIT_KEY(x) (0x08 + (x << 2))
#define GEU_IN_DATA(x) (0x28 + (x << 2))
#define GEU_INIT_IV(x) (0x38 + (x << 2))
#define GEU_OUT_DATA(x) (0x58 + (x << 2))
/* rndom relevant regs */
#define GEU_HW_RANDOM_NUM_GEN (0x488)
#define GEU_HW_RANDOM_NUM_SEED (0x038)
#define GEU_PRNG_CTRL_REG (0x3A8)
#define GEU_PRNG_EN (1 << 24)
/* APMU regs offset */
#define AES_CLK_RES_CTRL 0x68
#define STBL_TIMER 0x084
#define DEBUG_REG 0x088
#define MP_IDLE_CFG0 0x120
#define CORE0_IDLE 0x124
#define GEU_RX_CHANNEL 30
#define GEU_TX_CHANNEL 31
#define DMA_DEVICE_GEU_RXREQ (68)
#define DMA_DEVICE_GEU_TXREQ (69)
struct geu_data {
volatile uint32_t geu_phybase;
uint32_t apmu_phybase;
uint32_t clk_en;
struct mutex clk_lock;
struct mutex eng_lock;
};
void geu_write32(uint32_t reg, uint32_t val);
uint32_t geu_read32(uint32_t reg);
void asr_geu_get(void);
void asr_geu_put(void);
void geu_enable_clk(void);
void geu_disable_clk(void);
int aes_ecb_encrypt_geu(const uint8_t *key, uint32_t keylen, bool use_rkek,\
const void* plaintext, void* ciphertext, size_t size);
int aes_ecb_decrypt_geu(const uint8_t *key, uint32_t keylen, bool use_rkek,\
const void* ciphertext, void* plaintext, size_t size);
int aes_cbc_encrypt_geu(const uint8_t *iv, const uint8_t *key, uint32_t keylen, \
bool use_rkek, const void* plaintext, void* ciphertext, size_t size);
int aes_cbc_decrypt_geu(const uint8_t *iv, const uint8_t *key, uint32_t keylen, \
bool use_rkek, const void* plaintext, void* ciphertext, size_t size);
#ifdef GEU_SELFTEST
void asr_geu_test_init(void);
#endif
#endif