5 #include "sw/device/silicon_creator/lib/drivers/rnd.h"
9 #include "sw/device/lib/base/crc32.h"
13 #include "sw/device/silicon_creator/lib/drivers/otp.h"
15 #include "entropy_src_regs.h"
17 #include "otp_ctrl_regs.h"
18 #include "rv_core_ibex_regs.h"
23 kIbexRndStatusReg = kBaseIbex + RV_CORE_IBEX_RND_STATUS_REG_OFFSET,
27 kNumHealthRegisters = 9,
31 static_assert(kNumHealthRegisters ==
32 (ENTROPY_SRC_EXTHT_LO_THRESHOLDS_REG_OFFSET -
33 ENTROPY_SRC_REPCNT_THRESHOLDS_REG_OFFSET) /
36 "Unexpected entropy_src health register count.");
41 #define ASSERT_REG_OFFSET(otp_offset_, entropy_src_offset_) \
43 ((otp_offset_)-OTP_CTRL_PARAM_CREATOR_SW_CFG_RNG_REPCNT_THRESHOLDS_OFFSET) == \
44 ((entropy_src_offset_)-ENTROPY_SRC_REPCNT_THRESHOLDS_REG_OFFSET), \
45 "OTP configuration offset does not match the expected entropy_src " \
48 ASSERT_REG_OFFSET(OTP_CTRL_PARAM_CREATOR_SW_CFG_RNG_REPCNT_THRESHOLDS_OFFSET,
49 ENTROPY_SRC_REPCNT_THRESHOLDS_REG_OFFSET);
50 ASSERT_REG_OFFSET(OTP_CTRL_PARAM_CREATOR_SW_CFG_RNG_REPCNTS_THRESHOLDS_OFFSET,
51 ENTROPY_SRC_REPCNTS_THRESHOLDS_REG_OFFSET);
52 ASSERT_REG_OFFSET(OTP_CTRL_PARAM_CREATOR_SW_CFG_RNG_ADAPTP_HI_THRESHOLDS_OFFSET,
53 ENTROPY_SRC_ADAPTP_HI_THRESHOLDS_REG_OFFSET);
54 ASSERT_REG_OFFSET(OTP_CTRL_PARAM_CREATOR_SW_CFG_RNG_ADAPTP_LO_THRESHOLDS_OFFSET,
55 ENTROPY_SRC_ADAPTP_LO_THRESHOLDS_REG_OFFSET);
56 ASSERT_REG_OFFSET(OTP_CTRL_PARAM_CREATOR_SW_CFG_RNG_BUCKET_THRESHOLDS_OFFSET,
57 ENTROPY_SRC_BUCKET_THRESHOLDS_REG_OFFSET);
58 ASSERT_REG_OFFSET(OTP_CTRL_PARAM_CREATOR_SW_CFG_RNG_MARKOV_HI_THRESHOLDS_OFFSET,
59 ENTROPY_SRC_MARKOV_HI_THRESHOLDS_REG_OFFSET);
60 ASSERT_REG_OFFSET(OTP_CTRL_PARAM_CREATOR_SW_CFG_RNG_MARKOV_LO_THRESHOLDS_OFFSET,
61 ENTROPY_SRC_MARKOV_LO_THRESHOLDS_REG_OFFSET);
62 ASSERT_REG_OFFSET(OTP_CTRL_PARAM_CREATOR_SW_CFG_RNG_EXTHT_HI_THRESHOLDS_OFFSET,
63 ENTROPY_SRC_EXTHT_HI_THRESHOLDS_REG_OFFSET);
64 ASSERT_REG_OFFSET(OTP_CTRL_PARAM_CREATOR_SW_CFG_RNG_EXTHT_LO_THRESHOLDS_OFFSET,
65 ENTROPY_SRC_EXTHT_LO_THRESHOLDS_REG_OFFSET);
70 static uint32_t health_config_crc32(
void) {
75 uint32_t offset = ENTROPY_SRC_REPCNT_THRESHOLDS_REG_OFFSET;
76 for (
size_t i = 0; i < kNumHealthRegisters; ++i, offset +=
sizeof(uint32_t)) {
77 crc32_add32(&ctx, abs_mmio_read32(kBaseEntropySrc + offset));
79 crc32_add32(&ctx, abs_mmio_read32(kBaseEntropySrc +
80 ENTROPY_SRC_ALERT_THRESHOLD_REG_OFFSET));
81 return crc32_finish(&ctx);
84 rom_error_t rnd_health_config_check(lifecycle_state_t lc_state) {
85 if (otp_read32(OTP_CTRL_PARAM_CREATOR_SW_CFG_RNG_EN_OFFSET) !=
90 uint32_t crc32 = health_config_crc32();
91 rom_error_t res = crc32;
93 if (launder32(lc_state) == kLcStateTest) {
94 res ^= crc32 ^ kErrorOk;
101 otp_read32(OTP_CTRL_PARAM_CREATOR_SW_CFG_RNG_HEALTH_CONFIG_DIGEST_OFFSET);
102 if (launder32(res) != kErrorOk) {
103 return kErrorRndBadCrc32;
110 uint32_t rnd_uint32(
void) {
112 otp_read32(OTP_CTRL_PARAM_CREATOR_SW_CFG_RNG_EN_OFFSET) ==
116 while (!(abs_mmio_read32(kIbexRndStatusReg) & 1)) {
121 return mcycle + abs_mmio_read32(kBaseIbex + RV_CORE_IBEX_RND_DATA_REG_OFFSET);