5#include "sw/device/silicon_creator/lib/drivers/rnd.h"
7#include "hw/top/dt/entropy_src.h"
8#include "hw/top/dt/rv_core_ibex.h"
11#include "sw/device/lib/base/crc32.h"
15#include "sw/device/silicon_creator/lib/drivers/otp.h"
17#include "hw/top/entropy_src_regs.h"
18#include "hw/top/otp_ctrl_regs.h"
19#include "hw/top/rv_core_ibex_regs.h"
24 kNumHealthRegisters = 9,
27static inline uint32_t entropy_src_base(
void) {
31static inline uint32_t ibex_base(
void) {
36static_assert(kNumHealthRegisters ==
37 (ENTROPY_SRC_EXTHT_LO_THRESHOLDS_REG_OFFSET -
38 ENTROPY_SRC_REPCNT_THRESHOLDS_REG_OFFSET) /
41 "Unexpected entropy_src health register count.");
46#define ASSERT_REG_OFFSET(otp_offset_, entropy_src_offset_) \
48 ((otp_offset_)-OTP_CTRL_PARAM_CREATOR_SW_CFG_RNG_REPCNT_THRESHOLDS_OFFSET) == \
49 ((entropy_src_offset_)-ENTROPY_SRC_REPCNT_THRESHOLDS_REG_OFFSET), \
50 "OTP configuration offset does not match the expected entropy_src " \
53ASSERT_REG_OFFSET(OTP_CTRL_PARAM_CREATOR_SW_CFG_RNG_REPCNT_THRESHOLDS_OFFSET,
54 ENTROPY_SRC_REPCNT_THRESHOLDS_REG_OFFSET);
55ASSERT_REG_OFFSET(OTP_CTRL_PARAM_CREATOR_SW_CFG_RNG_REPCNTS_THRESHOLDS_OFFSET,
56 ENTROPY_SRC_REPCNTS_THRESHOLDS_REG_OFFSET);
57ASSERT_REG_OFFSET(OTP_CTRL_PARAM_CREATOR_SW_CFG_RNG_ADAPTP_HI_THRESHOLDS_OFFSET,
58 ENTROPY_SRC_ADAPTP_HI_THRESHOLDS_REG_OFFSET);
59ASSERT_REG_OFFSET(OTP_CTRL_PARAM_CREATOR_SW_CFG_RNG_ADAPTP_LO_THRESHOLDS_OFFSET,
60 ENTROPY_SRC_ADAPTP_LO_THRESHOLDS_REG_OFFSET);
61ASSERT_REG_OFFSET(OTP_CTRL_PARAM_CREATOR_SW_CFG_RNG_BUCKET_THRESHOLDS_OFFSET,
62 ENTROPY_SRC_BUCKET_THRESHOLDS_REG_OFFSET);
63ASSERT_REG_OFFSET(OTP_CTRL_PARAM_CREATOR_SW_CFG_RNG_MARKOV_HI_THRESHOLDS_OFFSET,
64 ENTROPY_SRC_MARKOV_HI_THRESHOLDS_REG_OFFSET);
65ASSERT_REG_OFFSET(OTP_CTRL_PARAM_CREATOR_SW_CFG_RNG_MARKOV_LO_THRESHOLDS_OFFSET,
66 ENTROPY_SRC_MARKOV_LO_THRESHOLDS_REG_OFFSET);
67ASSERT_REG_OFFSET(OTP_CTRL_PARAM_CREATOR_SW_CFG_RNG_EXTHT_HI_THRESHOLDS_OFFSET,
68 ENTROPY_SRC_EXTHT_HI_THRESHOLDS_REG_OFFSET);
69ASSERT_REG_OFFSET(OTP_CTRL_PARAM_CREATOR_SW_CFG_RNG_EXTHT_LO_THRESHOLDS_OFFSET,
70 ENTROPY_SRC_EXTHT_LO_THRESHOLDS_REG_OFFSET);
75static uint32_t health_config_crc32(
void) {
80 uint32_t offset = ENTROPY_SRC_REPCNT_THRESHOLDS_REG_OFFSET;
81 for (
size_t i = 0; i < kNumHealthRegisters; ++i, offset +=
sizeof(uint32_t)) {
82 crc32_add32(&ctx, abs_mmio_read32(entropy_src_base() + offset));
84 crc32_add32(&ctx, abs_mmio_read32(entropy_src_base() +
85 ENTROPY_SRC_ALERT_THRESHOLD_REG_OFFSET));
86 return crc32_finish(&ctx);
89rom_error_t rnd_health_config_check(lifecycle_state_t lc_state) {
90 if (otp_read32(OTP_CTRL_PARAM_CREATOR_SW_CFG_RNG_EN_OFFSET) !=
95 uint32_t crc32 = health_config_crc32();
96 rom_error_t res = crc32;
98 if (launder32(lc_state) == kLcStateTest) {
99 res ^= crc32 ^ kErrorOk;
106 otp_read32(OTP_CTRL_PARAM_CREATOR_SW_CFG_RNG_HEALTH_CONFIG_DIGEST_OFFSET);
107 if (launder32(res) != kErrorOk) {
108 return kErrorRndBadCrc32;
115uint32_t rnd_uint32(
void) {
117 otp_read32(OTP_CTRL_PARAM_CREATOR_SW_CFG_RNG_EN_OFFSET) ==
121 while (!(abs_mmio_read32(ibex_base() + RV_CORE_IBEX_RND_STATUS_REG_OFFSET) &
128 abs_mmio_read32(ibex_base() + RV_CORE_IBEX_RND_DATA_REG_OFFSET);