Realtek/inc/peripheral/rtl876x_hw_aes.h
2025-11-25 10:21:47 +08:00

182 lines
7.1 KiB
C

/**
*********************************************************************************************************
* Copyright(c) 2016, Realtek Semiconductor Corporation. All rights reserved.
*********************************************************************************************************
* @file rtl876x_hw_aes.h
* @brief
* @details
* @author eason li
* @date 2016-01-04
* @version v0.1
* *********************************************************************************************************
*/
#ifndef __RTL876X_HW_AES_H
#define __RTL876X_HW_AES_H
#ifdef __cplusplus
extern "C" {
#endif
/* Includes ------------------------------------------------------------------*/
#include <stdbool.h>
#include "rtl876x.h"
#include "hw_aes.h"
/**
* @brief referenc to hw aes register table
*/
typedef struct
{
union
{
__IO uint32_t CTL;
struct
{
__IO uint32_t enc_en: 1; /* aes encryption enable */
__IO uint32_t dec_en: 1; /* aes decryption enable */
__IO uint32_t ase256_en: 1; /* aes 256-bit mode enable */
__IO uint32_t aes_mode_sel: 3; /* aes mode select, see HW_AES_MODE below */
__IO uint32_t access_mode: 1; /* 0: CPU mode, 1: DMA mode */
__IO uint32_t scram_en: 1; /* scramble function, 0:disable, 1:enable */
__IO uint32_t use_hidden_key: 1; /* secure related */
__IO uint32_t copy_hidden_key: 1; /* secure related */
__IO uint32_t hidden_256: 1; /* secure related */
__IO uint32_t poly_en: 1; /* XOR polynomial, 0:disable, 1:enable */
__IO uint32_t rsvd: 19;
__IO uint32_t dout_rdy: 1; /* aes data output ready signal used in CPU mode.
when data output is ready, dout_rdy = 1.
if dout_rdy == 1, "CPU reads enc_dout or dec_dout
for 4 times (128 bits)" will clear dout_rdy to 0.
*/
} CTL_BITS;
};
__IO uint32_t data_in;
__I uint32_t enc_dout;
__I uint32_t dec_dout;
__IO uint32_t IRK[8];
__IO uint32_t iv[4];
union
{
__O uint32_t secure_reg[13];
struct
{
__O uint32_t RPZ0_CMP_ADDR_TOP_H; /* 0x40 */
__O uint32_t RPZ0_CMP_ADDR_TOP_L; /* 0x44 */
__O uint32_t RPZ0_CMP_ADDR_BUTTOM_H; /* 0x48 */
__O uint32_t RPZ0_CMP_ADDR_BUTTOM_L; /* 0x4C */
__O uint32_t RPZ1_CMP_ADDR_TOP_H; /* 0x50 */
__O uint32_t RPZ1_CMP_ADDR_TOP_L; /* 0x54 */
__O uint32_t RPZ1_CMP_ADDR_BUTTOM_H; /* 0x58 */
__O uint32_t RPZ1_CMP_ADDR_BUTTOM_L; /* 0x5C */
__O uint32_t RPZ_SWD_CTRL; /* 0x60 */
__O uint32_t DSP_MEM_CTRL_H; /* 0x64 */
__O uint32_t DSP_MEM_CTRL_L; /* 0x68 */
__O uint32_t rsvd; /* 0x6C */
__O uint32_t reg_buf_cache_sram_en; /* 0x70 */
};
};
union
{
__IO uint32_t secure_status;
struct
{
__IO uint32_t cnt: 4;
__IO uint32_t S: 1;
__IO uint32_t irk_cnt: 3;
__IO uint32_t rsvd: 8;
__IO uint32_t hash_: 16;
} SEC_STS;
};
__O uint32_t authentication;
} HW_AES_TypeDef;
#define HWAES_CTL 0x0
#define HWAES_DATAIN 0x4
#define HWAES_ENC_DOUT 0x8
#define HWAES_DEC_DOUT 0xC
#define HWAES_IRK 0x10
#define HWAES_IV 0x30
#define HWAES_SEC_REG 0x40
#define HWAES_SEC_STS 0x74
#define HWAES_AUTHEN 0x78
typedef enum
{
CPU_MODE,
DMA_MODE
} HW_AES_ACCESS_MODE;
#define DMA_CH_BASE(ChNum) (GDMA_CHANNEL_REG_BASE + ChNum * 0x0058)
#define DMA_CH_IRQ(ChNum) ((GDMA0_Channel0_IRQn + ChNum))
#define HW_AES_RX_DMA_IO_NUM 14
#define HW_AES_TX_DMA_IO_NUM 13
#define HW_AES_SET_ENC_EN(isEnable) (HWAES->CTL_BITS.enc_en = isEnable)
#define HW_AES_SET_DEC_EN(isEnable) (HWAES->CTL_BITS.dec_en = isEnable)
#define HW_AES_SET_256_EN(isEnable) (HWAES->CTL_BITS.ase256_en = isEnable)
#define HW_AES_GET_256_EN (HWAES->CTL_BITS.ase256_en)
#define HW_AES_SET_AES_MODE(mode) (HWAES->CTL_BITS.aes_mode_sel = (mode & 0x7))
#define HW_AES_SET_WORK_MODE(mode) (HWAES->CTL_BITS.access_mode = (mode & BIT0))
#define HW_AES_IS_DATA_OUT_READY (HWAES->CTL_BITS.dout_rdy)
#define HW_AES_SET_INPUT_DATA(data) (HWAES->data_in = (uint32_t)data)
#define HW_AES_READ_ENC_OUTPUT(Out) (Out = HWAES->enc_dout)
#define HW_AES_READ_DEC_OUTPUT(Out) (Out = HWAES->dec_dout)
#define HW_AES_SET_IRK(pIRK, cnt) for (uint8_t i = 0;i < cnt;i ++) {HWAES->IRK[(cnt - 1) - i] = pIRK[i];}
#define HW_AES_GET_IRK(pIRK, cnt) for (uint8_t i = 0;i < cnt;i ++) {pIRK[i] = HWAES->IRK[(cnt - 1) - i];}
#define HW_AES_SET_IV(pIV) for (uint8_t i = 0;i < 4;i ++) {HWAES->iv[3 - i] = pIV[i];}
#define HW_AES_GET_IV(pIV) for (uint8_t i = 0;i < 4;i ++) {pIV[i] = HWAES->iv[3 - i];}
#define HW_AES_SET_SCRAMBLE_EN(isEnable) (HWAES->CTL_BITS.scram_en = isEnable)
#define HW_AES_USE_HIDDEN_KEY(isEnable) (HWAES->CTL_BITS.use_hidden_key = isEnable)
#define HW_AES_COPY_HIDDEN_KEY(isEnable) (HWAES->CTL_BITS.copy_hidden_key = isEnable)
#define HW_AES_SET_HIDDEN_256(isEnable) (HWAES->CTL_BITS.hidden_256 = isEnable)
#define HWAES_DMA_RX_CH_NUM 2
#define HWAES_DMA_TX_CH_NUM 1
#define HWAES_DMA_RX_CH GDMA_Channel2
#define HWAES_DMA_TX_CH GDMA_Channel1
#define HWAES_DMA_RX_HANDLER GDMA0_Channel2_Handler
#define HWAES_DMA_TX_HANDLER GDMA0_Channel1_Handler
#define MAX_DMA_BUF_SZ 0xFF0
#if 1
#define AES_INFO(...) DBG_DIRECT(__VA_ARGS__);
#else
#define AES_INFO(...)
#endif
__STATIC_INLINE void hw_aes_clear(void)
{
HWAES->CTL = 0;
}
__STATIC_INLINE void hw_aes_set_clk(bool is_enable)
{
/* turn on hw aes clock */
SYSBLKCTRL->u_238.BITS_238.r_PON_ACTCKE_AES = is_enable;
/* enable hw aes */
SYSBLKCTRL->u_218.BITS_218.r_PON_FEN_AES = is_enable;
}
bool hw_aes_init(const uint32_t *aesKey, uint32_t *iv, T_HW_AES_MODE work_mode, bool isAes256);
bool hw_aes_cpu_operate(uint32_t *in, uint32_t *out, uint32_t word_len, bool isEncrypt);
bool hw_aes_dma_operate(uint32_t *in, uint32_t *out, uint32_t word_len, bool isEncrypt,
uint8_t dma_rx_ch_num, uint8_t dma_tx_ch_num, bool isMac);
void hw_aes_set_dma_rx_done(bool isDone);
bool hw_aes_is_dma_rx_done(void);
void hw_aes_set_dma_tx_done(bool isDone);
bool hw_aes_is_dma_tx_done(void);
bool hw_aes_dma_done(void);
void hw_aes_dma_interrupt_disable(void);
void hw_aes_set_dma_move_src(uint32_t src);
void hw_aes_set_dma_move_dst(uint32_t dst);
void hw_aes_set_dma_carry_size(uint32_t size);
bool aes_cmac_inverse(uint8_t *key, uint8_t *input, uint32_t length, uint8_t *mac, int mode);
uint32_t get_secure_reg_cfg_val(uint32_t in_val);
void share_dsp_and_cache_ram_rom(void);
#ifdef __cplusplus
}
#endif
#endif /*__RTL8762X_GDMA_H*/