arm: npcm8xx: add security feature header

The NPCM driver can use on npcm7xx/npcm8xx
so add npcm8xx header for driver.

Signed-off-by: Jim Liu <JJLIU0@nuvoton.com>
This commit is contained in:
Jim Liu
2023-01-27 12:51:26 -05:00
committed by Tom Rini
parent a3c191aec0
commit 337bc26f05
4 changed files with 223 additions and 0 deletions
+53
View File
@@ -0,0 +1,53 @@
/* SPDX-License-Identifier: GPL-2.0+ */
#ifndef _NPCM_AES_H_
#define _NPCM_AES_H_
#define AES_OP_ENCRYPT 0
#define AES_OP_DECRYPT 1
#define SIZE_AES_BLOCK (AES128_KEY_LENGTH)
struct npcm_aes_regs {
unsigned char reserved_0[0x400]; // 0x000
unsigned int aes_key_0; // 0x400
unsigned int aes_key_1; // 0x404
unsigned int aes_key_2; // 0x408
unsigned int aes_key_3; // 0x40c
unsigned char reserved_1[0x30]; // 0x410
unsigned int aes_iv_0; // 0x440
unsigned char reserved_2[0x1c]; // 0x444
unsigned int aes_ctr_0; // 0x460
unsigned char reserved_3[0x0c]; // 0x464
unsigned int aes_busy; // 0x470
unsigned char reserved_4[0x04]; // 0x474
unsigned int aes_sk; // 0x478
unsigned char reserved_5[0x14]; // 0x47c
unsigned int aes_prev_iv_0; // 0x490
unsigned char reserved_6[0x0c]; // 0x494
unsigned int aes_din_dout; // 0x4a0
unsigned char reserved_7[0x1c]; // 0x4a4
unsigned int aes_control; // 0x4c0
unsigned int aes_version; // 0x4c4
unsigned int aes_hw_flags; // 0x4c8
unsigned char reserved_8[0x28]; // 0x4cc
unsigned int aes_sw_reset; // 0x4f4
unsigned char reserved_9[0x08]; // 0x4f8
unsigned int aes_fifo_data; // 0x500
unsigned char reserved_10[0xfc]; // 0x504
unsigned int aes_fifo_status; // 0x600
};
#define AES_BUSY_BIT BIT(0)
#define SW_RESET_BIT BIT(0)
#define AES_SK_BIT BIT(0)
#define DIN_FIFO_FULL BIT(0)
#define DIN_FIFO_EMPTY BIT(1)
#define DOUT_FIFO_FULL BIT(2)
#define DOUT_FIFO_EMPTY BIT(3)
#define DIN_FIFO_OVERFLOW BIT(4)
#define DOUT_FIFO_UNDERFLOW BIT(5)
int npcm_aes_select_key(u8 fkeyind);
#endif
+93
View File
@@ -0,0 +1,93 @@
/* SPDX-License-Identifier: GPL-2.0+ */
#ifndef _NPCM_OTP_H_
#define _NPCM_OTP_H_
#ifdef CONFIG_ARCH_NPCM8XX
enum {
NPCM_KEY_SA = 0,
NPCM_FUSE_SA = 0,
NPCM_NUM_OF_SA = 1
};
#else
enum {
NPCM_KEY_SA = 0,
NPCM_FUSE_SA = 1,
NPCM_NUM_OF_SA = 2
};
#endif
/* arrray images in flash, to program during fisrt boot (offsets in sector) */
#define SA_KEYS_FLASH_IMAGE_OFFSET (0x000)
#define SA_FUSE_FLASH_IMAGE_OFFSET (0x400)
#define SA_TAG_FLASH_IMAGE_OFFSET (0x800)
/* F U S E I M G S */
#define SA_TAG_FLASH_IMAGE_VAL {0x46, 0x55, 0x53, 0x45, 0x49, 0x4d, 0x47, 0x53}
#define SA_TAG_FLASH_IMAGE_SIZE (8)
#define SA_FUSE_FUSTRAP_OFFSET (0x00)
#define SA_FUSE_FUSTRAP_OSECBOOT_MASK (0x00800000)
struct npcm_otp_regs {
unsigned int fst;
unsigned int faddr;
unsigned int fdata;
unsigned int fcfg;
unsigned int fustrap_fkeyind;
unsigned int fctl;
};
#define FST_RDY BIT(0)
#define FST_RDST BIT(1)
#define FST_RIEN BIT(2)
#ifdef CONFIG_ARCH_NPCM8XX
#define FADDR_BYTEADDR(addr) ((addr) << 3)
#define FADDR_BITPOS(pos) ((pos) << 0)
#define FADDR_VAL(addr, pos) (FADDR_BITPOS(pos) | FADDR_BYTEADDR(addr))
#define FADDR_IN_PROG BIT(16)
#else
#define FADDR_BYTEADDR(addr) ((addr) << 0)
#define FADDR_BITPOS(pos) ((pos) << 10)
#define FADDR_VAL(addr, pos) (FADDR_BYTEADDR(addr) | FADDR_BITPOS(pos))
#endif
#define FDATA_MASK (0xff)
#define FUSTRAP_O_SECBOOT BIT(23)
#define FCFG_FDIS BIT(31)
#define FKEYIND_KVAL BIT(0)
#define FKEYIND_KSIZE_MASK (0x00000070)
#define FKEYIND_KSIZE_128 (0x4 << 4)
#define FKEYIND_KSIZE_192 (0x5 << 4)
#define FKEYIND_KSIZE_256 (0x6 << 4)
#define FKEYIND_KIND_MASK (0x000c0000)
#define FKEYIND_KIND_KEY(indx) ((indx) << 18)
/* Program cycle initiation values (sequence of two adjacent writes) */
#define PROGRAM_ARM 0x1
#define PROGRAM_INIT 0xBF79E5D0
/* Read cycle initiation value */
#define READ_INIT 0x02
/* Value to clean FDATA contents */
#define FDATA_CLEAN_VALUE 0x01
#ifdef CONFIG_ARCH_NPCM8XX
#define NPCM_OTP_ARR_BYTE_SIZE 8192
#else
#define NPCM_OTP_ARR_BYTE_SIZE 1024
#endif
#define MIN_PROGRAM_PULSES 4
#define MAX_PROGRAM_PULSES 20
int fuse_prog_image(u32 bank, uintptr_t address);
int fuse_program_data(u32 bank, u32 word, u8 *data, u32 size);
int npcm_otp_select_key(u8 key_index);
bool npcm_otp_is_fuse_array_disabled(u32 arr);
void npcm_otp_nibble_parity_ecc_encode(u8 *datain, u8 *dataout, u32 size);
void npcm_otp_majority_rule_ecc_encode(u8 *datain, u8 *dataout, u32 size);
#endif
+43
View File
@@ -0,0 +1,43 @@
/* SPDX-License-Identifier: GPL-2.0+ */
#ifndef _NPCM_RNG_H_
#define _NPCM_RNG_H_
struct npcm_rng_regs {
unsigned int rngcs;
unsigned int rngd;
unsigned int rngmode;
};
#define RNGCS_RNGE (1 << 0)
#define RNGCS_DVALID (1 << 1)
#define RNGCS_CLKP(range) ((0x0f & (range)) << 2)
#define RNGMODE_M1ROSEL_VAL (0x02) /* Ring Oscillator Select for Method I */
/*----------------------------------------------------------------------------*/
/* Core Domain Clock Frequency Range for the selected value is higher */
/* than or equal to the actual Core domain clock frequency */
/*----------------------------------------------------------------------------*/
enum {
RNG_CLKP_80_100_MHZ = 0x00, /*default */
RNG_CLKP_60_80_MHZ = 0x01,
RNG_CLKP_50_60_MHZ = 0x02,
RNG_CLKP_40_50_MHZ = 0x03,
RNG_CLKP_30_40_MHZ = 0x04,
RNG_CLKP_25_30_MHZ = 0x05,
RNG_CLKP_20_25_MHZ = 0x06,
RNG_CLKP_5_20_MHZ = 0x07,
RNG_CLKP_2_15_MHZ = 0x08,
RNG_CLKP_9_12_MHZ = 0x09,
RNG_CLKP_7_9_MHZ = 0x0A,
RNG_CLKP_6_7_MHZ = 0x0B,
RNG_CLKP_5_6_MHZ = 0x0C,
RNG_CLKP_4_5_MHZ = 0x0D,
RNG_CLKP_3_4_MHZ = 0x0E,
RNG_NUM_OF_CLKP
};
void npcm_rng_init(void);
void npcm_rng_disable(void);
#endif
+34
View File
@@ -0,0 +1,34 @@
/* SPDX-License-Identifier: GPL-2.0+ */
#ifndef _NPCM_SHA_H_
#define _NPCM_SHA_H_
#define HASH_DIG_H_NUM 8
/* SHA type */
enum npcm_sha_type {
npcm_sha_type_sha2 = 0,
npcm_sha_type_sha1,
npcm_sha_type_num
};
struct npcm_sha_regs {
unsigned int hash_data_in;
unsigned char hash_ctr_sts;
unsigned char reserved_0[0x03];
unsigned char hash_cfg;
unsigned char reserved_1[0x03];
unsigned char hash_ver;
unsigned char reserved_2[0x13];
unsigned int hash_dig[HASH_DIG_H_NUM];
};
#define HASH_CTR_STS_SHA_EN BIT(0)
#define HASH_CTR_STS_SHA_BUSY BIT(1)
#define HASH_CTR_STS_SHA_RST BIT(2)
#define HASH_CFG_SHA1_SHA2 BIT(0)
int npcm_sha_calc(u8 type, const u8 *buf, u32 len, u8 *digest);
int npcm_sha_selftest(u8 type);
#endif