5 #include "sw/device/silicon_creator/lib/drivers/otp.h"
13 #include "sw/device/silicon_creator/lib/error.h"
16 #include "otp_ctrl_regs.h"
26 [kOtpPartitionCreatorSwCfg] = {
27 .
start_addr = OTP_CTRL_PARAM_CREATOR_SW_CFG_OFFSET,
28 .size = OTP_CTRL_PARAM_CREATOR_SW_CFG_SIZE -
29 OTP_CTRL_PARAM_CREATOR_SW_CFG_DIGEST_SIZE,
30 .digest_addr = OTP_CTRL_CREATOR_SW_CFG_DIGEST_0_REG_OFFSET,
32 [kOtpPartitionOwnerSwCfg] = {
33 .start_addr = OTP_CTRL_PARAM_OWNER_SW_CFG_OFFSET,
34 .size = OTP_CTRL_PARAM_OWNER_SW_CFG_SIZE -
35 OTP_CTRL_PARAM_OWNER_SW_CFG_DIGEST_SIZE,
36 .digest_addr = OTP_CTRL_OWNER_SW_CFG_DIGEST_0_REG_OFFSET,
38 [kOtpPartitionRotCreatorAuthCodesign] = {
39 .start_addr = OTP_CTRL_PARAM_ROT_CREATOR_AUTH_CODESIGN_OFFSET,
40 .size = OTP_CTRL_PARAM_ROT_CREATOR_AUTH_CODESIGN_SIZE -
41 OTP_CTRL_PARAM_ROT_CREATOR_AUTH_CODESIGN_DIGEST_SIZE,
42 .digest_addr = OTP_CTRL_ROT_CREATOR_AUTH_CODESIGN_DIGEST_0_REG_OFFSET,
44 [kOtpPartitionRotCreatorAuthState] = {
45 .start_addr = OTP_CTRL_PARAM_ROT_CREATOR_AUTH_STATE_OFFSET,
46 .size = OTP_CTRL_PARAM_ROT_CREATOR_AUTH_STATE_SIZE -
47 OTP_CTRL_PARAM_ROT_CREATOR_AUTH_STATE_DIGEST_SIZE,
48 .digest_addr = OTP_CTRL_ROT_CREATOR_AUTH_STATE_DIGEST_0_REG_OFFSET,
50 [kOtpPartitionHwCfg0] = {
51 .start_addr = OTP_CTRL_PARAM_HW_CFG0_OFFSET,
52 .size = OTP_CTRL_PARAM_HW_CFG0_SIZE -
53 OTP_CTRL_PARAM_HW_CFG0_DIGEST_SIZE,
54 .digest_addr = OTP_CTRL_HW_CFG0_DIGEST_0_REG_OFFSET,
56 [kOtpPartitionHwCfg1] = {
57 .start_addr = OTP_CTRL_PARAM_HW_CFG1_OFFSET,
58 .size = OTP_CTRL_PARAM_HW_CFG1_SIZE -
59 OTP_CTRL_PARAM_HW_CFG1_DIGEST_SIZE,
60 .digest_addr = OTP_CTRL_HW_CFG1_DIGEST_0_REG_OFFSET,
65 uint32_t otp_read32(uint32_t address) {
66 return sec_mmio_read32(kBase + OTP_CTRL_SW_CFG_WINDOW_REG_OFFSET + address);
69 uint64_t otp_read64(uint32_t address) {
70 uint32_t reg_offset = OTP_CTRL_SW_CFG_WINDOW_REG_OFFSET + address;
71 uint64_t value =
sec_mmio_read32(kBase + reg_offset +
sizeof(uint32_t));
78 void otp_read(uint32_t address, uint32_t *data,
size_t num_words) {
79 uint32_t reg_offset = OTP_CTRL_SW_CFG_WINDOW_REG_OFFSET + address;
80 size_t i = 0, r = num_words - 1;
81 for (; launder32(i) < num_words && launder32(r) < num_words; ++i, --r) {
88 uint64_t otp_partition_digest_read(otp_partition_t partition) {
89 uint32_t reg_offset = kBase + kOtpPartitions[partition].
digest_addr;
96 static void wait_for_dai_idle(
void) {
100 status = abs_mmio_read32(kBase + OTP_CTRL_STATUS_REG_OFFSET);
105 static void dai_read_blocking(otp_partition_t partition,
106 uint32_t relative_address) {
109 abs_mmio_write32(kBase + OTP_CTRL_DIRECT_ACCESS_ADDRESS_REG_OFFSET,
110 kOtpPartitions[partition].start_addr + relative_address);
113 abs_mmio_write32(kBase + OTP_CTRL_DIRECT_ACCESS_CMD_REG_OFFSET, cmd);
117 uint32_t otp_dai_read32(otp_partition_t partition, uint32_t relative_address) {
118 dai_read_blocking(partition, relative_address);
119 return abs_mmio_read32(kBase + OTP_CTRL_DIRECT_ACCESS_RDATA_0_REG_OFFSET);
122 uint64_t otp_dai_read64(otp_partition_t partition, uint32_t relative_address) {
123 dai_read_blocking(partition, relative_address);
125 abs_mmio_read32(kBase + OTP_CTRL_DIRECT_ACCESS_RDATA_1_REG_OFFSET);
127 value |= abs_mmio_read32(kBase + OTP_CTRL_DIRECT_ACCESS_RDATA_0_REG_OFFSET);
131 rom_error_t otp_dai_read(otp_partition_t partition, uint32_t relative_address,
132 uint32_t *data,
size_t num_words) {
133 HARDENED_CHECK_LT(partition,
ARRAYSIZE(kOtpPartitions));
134 size_t i = 0, r = num_words - 1;
135 uint32_t addr = relative_address;
136 for (; launder32(i) < num_words && launder32(r) < num_words; ++i, --r) {
137 data[i] = otp_dai_read32(partition, addr);
138 addr +=
sizeof(uint32_t);
145 void otp_creator_sw_cfg_lockdown(
void) {