5#include "sw/device/silicon_creator/lib/drivers/otp.h"
9#include "hw/top/dt/otp_ctrl.h"
14#include "sw/device/silicon_creator/lib/error.h"
16#include "hw/top/otp_ctrl_regs.h"
18static inline uint32_t otp_ctrl_base(
void) {
19 return dt_otp_ctrl_primary_reg_block(
kDtOtpCtrl);
22uint32_t otp_read32(uint32_t address) {
23 return sec_mmio_read32(otp_ctrl_base() + OTP_CTRL_SW_CFG_WINDOW_REG_OFFSET +
27uint64_t otp_read64(uint32_t address) {
28 uint32_t reg_offset = OTP_CTRL_SW_CFG_WINDOW_REG_OFFSET + address;
37void otp_read(uint32_t address, uint32_t *data,
size_t num_words) {
38 uint32_t reg_offset = OTP_CTRL_SW_CFG_WINDOW_REG_OFFSET + address;
39 size_t i = 0, r = num_words - 1;
40 for (; launder32(i) < num_words && launder32(r) < num_words; ++i, --r) {
49 HARDENED_CHECK_LT(partition, kOtpPartitionCount);
60 otp_readable_partition_info(partition).digest_reg_offset;
67static void wait_for_dai_idle(
void) {
71 status = abs_mmio_read32(otp_ctrl_base() + OTP_CTRL_STATUS_REG_OFFSET);
72 idle = bitfield_bit32_read(
status, OTP_CTRL_STATUS_DAI_IDLE_BIT);
77 uint32_t relative_address) {
80 relative_address & otp_readable_partition_info(partition).align_mask, 0);
82 otp_ctrl_base() + OTP_CTRL_DIRECT_ACCESS_ADDRESS_REG_OFFSET,
83 otp_readable_partition_info(partition).start_addr + relative_address);
85 bitfield_bit32_write(0, OTP_CTRL_DIRECT_ACCESS_CMD_RD_BIT,
true);
86 abs_mmio_write32(otp_ctrl_base() + OTP_CTRL_DIRECT_ACCESS_CMD_REG_OFFSET,
91uint32_t otp_dai_read32(
otp_partition_t partition, uint32_t relative_address) {
92 dai_read_blocking(partition, relative_address);
93 return abs_mmio_read32(otp_ctrl_base() +
94 OTP_CTRL_DIRECT_ACCESS_RDATA_0_REG_OFFSET);
97uint64_t otp_dai_read64(
otp_partition_t partition, uint32_t relative_address) {
98 dai_read_blocking(partition, relative_address);
99 uint64_t value = abs_mmio_read32(otp_ctrl_base() +
100 OTP_CTRL_DIRECT_ACCESS_RDATA_1_REG_OFFSET);
102 value |= abs_mmio_read32(otp_ctrl_base() +
103 OTP_CTRL_DIRECT_ACCESS_RDATA_0_REG_OFFSET);
107rom_error_t otp_dai_read(
otp_partition_t partition, uint32_t relative_address,
108 uint32_t *data,
size_t num_words) {
109 size_t i = 0, r = num_words - 1;
110 uint32_t addr = relative_address;
111 for (; launder32(i) < num_words && launder32(r) < num_words; ++i, --r) {
112 data[i] = otp_dai_read32(partition, addr);
113 addr +=
sizeof(uint32_t);
120void otp_creator_sw_cfg_lockdown(
void) {
123 otp_ctrl_base() + OTP_CTRL_CREATOR_SW_CFG_READ_LOCK_REG_OFFSET, 0);