12#include "hw/top/otp_ctrl_regs.h"
23static bool checks_are_locked(
const dif_otp_ctrl_t *otp,
bool check_config) {
24 ptrdiff_t reg_offset = check_config
25 ? OTP_CTRL_CHECK_REGWEN_REG_OFFSET
26 : OTP_CTRL_CHECK_TRIGGER_REGWEN_REG_OFFSET;
28 check_config ? OTP_CTRL_CHECK_REGWEN_CHECK_REGWEN_BIT
29 : OTP_CTRL_CHECK_TRIGGER_REGWEN_CHECK_TRIGGER_REGWEN_BIT;
30 uint32_t locked = mmio_region_read32(otp->
base_addr, reg_offset);
31 return !bitfield_bit32_read(locked, regwen_bit);
35 uint32_t partition_number,
39 .mask = OTP_CTRL_ERR_CODE_0_ERR_CODE_0_MASK,
40 .index = OTP_CTRL_ERR_CODE_0_ERR_CODE_0_OFFSET,
43 ptrdiff_t err_code_address =
44 OTP_CTRL_ERR_CODE_0_REG_OFFSET +
45 (ptrdiff_t)partition_number * (ptrdiff_t)
sizeof(uint32_t);
46 uint32_t error_code = mmio_region_read32(otp->
base_addr, err_code_address);
48 switch (bitfield_field32_read(error_code, field)) {
49 case OTP_CTRL_ERR_CODE_0_ERR_CODE_0_VALUE_NO_ERROR:
52 case OTP_CTRL_ERR_CODE_0_ERR_CODE_0_VALUE_MACRO_ERROR:
55 case OTP_CTRL_ERR_CODE_0_ERR_CODE_0_VALUE_MACRO_ECC_CORR_ERROR:
58 case OTP_CTRL_ERR_CODE_0_ERR_CODE_0_VALUE_MACRO_ECC_UNCORR_ERROR:
61 case OTP_CTRL_ERR_CODE_0_ERR_CODE_0_VALUE_MACRO_WRITE_BLANK_ERROR:
64 case OTP_CTRL_ERR_CODE_0_ERR_CODE_0_VALUE_ACCESS_ERROR:
67 case OTP_CTRL_ERR_CODE_0_ERR_CODE_0_VALUE_CHECK_FAIL_ERROR:
70 case OTP_CTRL_ERR_CODE_0_ERR_CODE_0_VALUE_FSM_STATE_ERROR:
84 if (checks_are_locked(otp,
true)) {
88 mmio_region_write32(otp->
base_addr, OTP_CTRL_CHECK_TIMEOUT_REG_OFFSET,
91 OTP_CTRL_INTEGRITY_CHECK_PERIOD_REG_OFFSET,
94 OTP_CTRL_CONSISTENCY_CHECK_PERIOD_REG_OFFSET,
104 if (checks_are_locked(otp,
false)) {
109 bitfield_bit32_write(0, OTP_CTRL_CHECK_TRIGGER_INTEGRITY_BIT,
true);
110 mmio_region_write32(otp->
base_addr, OTP_CTRL_CHECK_TRIGGER_REG_OFFSET, reg);
119 if (checks_are_locked(otp,
false)) {
124 bitfield_bit32_write(0, OTP_CTRL_CHECK_TRIGGER_CONSISTENCY_BIT,
true);
125 mmio_region_write32(otp->
base_addr, OTP_CTRL_CHECK_TRIGGER_REG_OFFSET, reg);
135 uint32_t reg = bitfield_bit32_write(
136 0, OTP_CTRL_DIRECT_ACCESS_REGWEN_DIRECT_ACCESS_REGWEN_BIT,
false);
137 mmio_region_write32(otp->
base_addr, OTP_CTRL_DIRECT_ACCESS_REGWEN_REG_OFFSET,
145 if (otp == NULL || is_locked == NULL) {
149 uint32_t reg = mmio_region_read32(otp->
base_addr,
150 OTP_CTRL_DIRECT_ACCESS_REGWEN_REG_OFFSET);
151 *is_locked = !bitfield_bit32_read(
152 reg, OTP_CTRL_DIRECT_ACCESS_REGWEN_DIRECT_ACCESS_REGWEN_BIT);
163 bitfield_bit32_write(0, OTP_CTRL_CHECK_REGWEN_CHECK_REGWEN_BIT,
false);
164 mmio_region_write32(otp->
base_addr, OTP_CTRL_CHECK_REGWEN_REG_OFFSET, reg);
171 if (otp == NULL || is_locked == NULL) {
175 *is_locked = checks_are_locked(otp,
true);
184 uint32_t reg = bitfield_bit32_write(
185 0, OTP_CTRL_CHECK_TRIGGER_REGWEN_CHECK_TRIGGER_REGWEN_BIT,
false);
186 mmio_region_write32(otp->
base_addr, OTP_CTRL_CHECK_TRIGGER_REGWEN_REG_OFFSET,
194 if (otp == NULL || is_locked == NULL) {
198 *is_locked = checks_are_locked(otp,
false);
203 ptrdiff_t *reg_offset,
207 *reg_offset = OTP_CTRL_VENDOR_TEST_READ_LOCK_REG_OFFSET;
208 *index = OTP_CTRL_VENDOR_TEST_READ_LOCK_VENDOR_TEST_READ_LOCK_BIT;
211 *reg_offset = OTP_CTRL_CREATOR_SW_CFG_READ_LOCK_REG_OFFSET;
212 *index = OTP_CTRL_CREATOR_SW_CFG_READ_LOCK_CREATOR_SW_CFG_READ_LOCK_BIT;
215 *reg_offset = OTP_CTRL_OWNER_SW_CFG_READ_LOCK_REG_OFFSET;
216 *index = OTP_CTRL_OWNER_SW_CFG_READ_LOCK_OWNER_SW_CFG_READ_LOCK_BIT;
218#if defined(OPENTITAN_IS_EARLGREY)
219 case kDifOtpCtrlPartitionRotCreatorAuthCodesign:
220 *reg_offset = OTP_CTRL_ROT_CREATOR_AUTH_CODESIGN_READ_LOCK_REG_OFFSET;
222 OTP_CTRL_ROT_CREATOR_AUTH_CODESIGN_READ_LOCK_ROT_CREATOR_AUTH_CODESIGN_READ_LOCK_BIT;
224 case kDifOtpCtrlPartitionRotCreatorAuthState:
225 *reg_offset = OTP_CTRL_ROT_CREATOR_AUTH_STATE_READ_LOCK_REG_OFFSET;
227 OTP_CTRL_ROT_CREATOR_AUTH_STATE_READ_LOCK_ROT_CREATOR_AUTH_STATE_READ_LOCK_BIT;
229#elif defined(OPENTITAN_IS_DARJEELING)
230 case kDifOtpCtrlPartitionOwnershipSlotState:
231 *reg_offset = OTP_CTRL_OWNERSHIP_SLOT_STATE_READ_LOCK_REG_OFFSET;
233 OTP_CTRL_OWNERSHIP_SLOT_STATE_READ_LOCK_OWNERSHIP_SLOT_STATE_READ_LOCK_BIT;
235 case kDifOtpCtrlPartitionRotCreatorAuth:
236 *reg_offset = OTP_CTRL_ROT_CREATOR_AUTH_READ_LOCK_REG_OFFSET;
238 OTP_CTRL_ROT_CREATOR_AUTH_READ_LOCK_ROT_CREATOR_AUTH_READ_LOCK_BIT;
240 case kDifOtpCtrlPartitionRotOwnerAuthSlot0:
241 *reg_offset = OTP_CTRL_ROT_OWNER_AUTH_SLOT0_READ_LOCK_REG_OFFSET;
243 OTP_CTRL_ROT_OWNER_AUTH_SLOT0_READ_LOCK_ROT_OWNER_AUTH_SLOT0_READ_LOCK_BIT;
245 case kDifOtpCtrlPartitionRotOwnerAuthSlot1:
246 *reg_offset = OTP_CTRL_ROT_OWNER_AUTH_SLOT1_READ_LOCK_REG_OFFSET;
248 OTP_CTRL_ROT_OWNER_AUTH_SLOT1_READ_LOCK_ROT_OWNER_AUTH_SLOT1_READ_LOCK_BIT;
250 case kDifOtpCtrlPartitionPlatIntegAuthSlot0:
251 *reg_offset = OTP_CTRL_PLAT_INTEG_AUTH_SLOT0_READ_LOCK_REG_OFFSET;
253 OTP_CTRL_PLAT_INTEG_AUTH_SLOT0_READ_LOCK_PLAT_INTEG_AUTH_SLOT0_READ_LOCK_BIT;
255 case kDifOtpCtrlPartitionPlatIntegAuthSlot1:
256 *reg_offset = OTP_CTRL_PLAT_INTEG_AUTH_SLOT1_READ_LOCK_REG_OFFSET;
258 OTP_CTRL_PLAT_INTEG_AUTH_SLOT1_READ_LOCK_PLAT_INTEG_AUTH_SLOT1_READ_LOCK_BIT;
260 case kDifOtpCtrlPartitionPlatOwnerAuthSlot0:
261 *reg_offset = OTP_CTRL_PLAT_OWNER_AUTH_SLOT0_READ_LOCK_REG_OFFSET;
263 OTP_CTRL_PLAT_OWNER_AUTH_SLOT0_READ_LOCK_PLAT_OWNER_AUTH_SLOT0_READ_LOCK_BIT;
265 case kDifOtpCtrlPartitionPlatOwnerAuthSlot1:
266 *reg_offset = OTP_CTRL_PLAT_OWNER_AUTH_SLOT1_READ_LOCK_REG_OFFSET;
268 OTP_CTRL_PLAT_OWNER_AUTH_SLOT1_READ_LOCK_PLAT_OWNER_AUTH_SLOT1_READ_LOCK_BIT;
270 case kDifOtpCtrlPartitionPlatOwnerAuthSlot2:
271 *reg_offset = OTP_CTRL_PLAT_OWNER_AUTH_SLOT2_READ_LOCK_REG_OFFSET;
273 OTP_CTRL_PLAT_OWNER_AUTH_SLOT2_READ_LOCK_PLAT_OWNER_AUTH_SLOT2_READ_LOCK_BIT;
275 case kDifOtpCtrlPartitionPlatOwnerAuthSlot3:
276 *reg_offset = OTP_CTRL_PLAT_OWNER_AUTH_SLOT3_READ_LOCK_REG_OFFSET;
278 OTP_CTRL_PLAT_OWNER_AUTH_SLOT3_READ_LOCK_PLAT_OWNER_AUTH_SLOT3_READ_LOCK_BIT;
280 case kDifOtpCtrlPartitionExtNvm:
281 *reg_offset = OTP_CTRL_EXT_NVM_READ_LOCK_REG_OFFSET;
282 *index = OTP_CTRL_EXT_NVM_READ_LOCK_EXT_NVM_READ_LOCK_BIT;
284 case kDifOtpCtrlPartitionRomPatch:
285 *reg_offset = OTP_CTRL_ROM_PATCH_READ_LOCK_REG_OFFSET;
286 *index = OTP_CTRL_ROM_PATCH_READ_LOCK_ROM_PATCH_READ_LOCK_BIT;
289#error "dif_otp_ctrl does not support this top"
305 if (!sw_read_lock_reg_offset(partition, &offset, &index)) {
309 uint32_t reg = bitfield_bit32_write(0, index,
false);
310 mmio_region_write32(otp->
base_addr, offset, reg);
318 if (otp == NULL || is_locked == NULL) {
324 if (!sw_read_lock_reg_offset(partition, &offset, &index)) {
328 uint32_t reg = mmio_region_read32(otp->
base_addr, offset);
329 *is_locked = !bitfield_bit32_read(reg, index);
335 if (otp == NULL ||
status == NULL) {
342 uint32_t status_code_reg =
343 mmio_region_read32(otp->
base_addr, OTP_CTRL_STATUS_REG_OFFSET);
346 if (bitfield_bit32_read(status_code_reg,
347 OTP_CTRL_STATUS_PARTITION_ERROR_BIT)) {
349 for (
int status_reg_num = 0; status_reg_num < num_part_status_regs;
351 uint32_t partition_status_reg = mmio_region_read32(
353 (ptrdiff_t)(OTP_CTRL_PARTITION_STATUS_0_REG_OFFSET +
354 (ptrdiff_t)
sizeof(uint32_t) * status_reg_num));
356 for (
int status_idx = 0; status_idx < 32; ++status_idx) {
357 uint32_t partition_number =
358 (uint32_t)status_reg_num * 32 + (uint32_t)status_idx;
364 if (!bitfield_bit32_read(partition_status_reg,
371 status->codes = bitfield_bit32_write(
377 if (get_error_code(otp, partition_number, &err) !=
kDifOk) {
380 status->causes[partition_number] = err;
402 if (get_error_code(otp, err_code_index, &err) !=
kDifOk) {
407 status->causes[err_code_index] = err;
473static uint32_t partition_effective_size(
const partition_info_t *info) {
481static const partition_info_t kPartitions[] = {
483 .start_addr = OTP_CTRL_PARAM_VENDOR_TEST_OFFSET,
484 .len = OTP_CTRL_PARAM_VENDOR_TEST_SIZE,
488 .is_lifecycle =
false,
489 .is_zeroizable =
false},
491 .start_addr = OTP_CTRL_PARAM_CREATOR_SW_CFG_OFFSET,
492 .len = OTP_CTRL_PARAM_CREATOR_SW_CFG_SIZE,
496 .is_lifecycle =
false,
497 .is_zeroizable =
false},
499 .start_addr = OTP_CTRL_PARAM_OWNER_SW_CFG_OFFSET,
500 .len = OTP_CTRL_PARAM_OWNER_SW_CFG_SIZE,
504 .is_lifecycle =
false,
505 .is_zeroizable =
false},
506#if defined(OPENTITAN_IS_EARLGREY)
507 [kDifOtpCtrlPartitionRotCreatorAuthCodesign] = {
508 .start_addr = OTP_CTRL_PARAM_ROT_CREATOR_AUTH_CODESIGN_OFFSET,
509 .len = OTP_CTRL_PARAM_ROT_CREATOR_AUTH_CODESIGN_SIZE,
513 .is_lifecycle =
false,
514 .is_zeroizable =
false},
515 [kDifOtpCtrlPartitionRotCreatorAuthState] = {
516 .start_addr = OTP_CTRL_PARAM_ROT_CREATOR_AUTH_STATE_OFFSET,
517 .len = OTP_CTRL_PARAM_ROT_CREATOR_AUTH_STATE_SIZE,
521 .is_lifecycle =
false,
522 .is_zeroizable =
false},
523#elif defined(OPENTITAN_IS_DARJEELING)
524 [kDifOtpCtrlPartitionOwnershipSlotState] = {
525 .start_addr = OTP_CTRL_PARAM_OWNERSHIP_SLOT_STATE_OFFSET,
526 .len = OTP_CTRL_PARAM_OWNERSHIP_SLOT_STATE_SIZE,
530 .is_lifecycle =
false,
531 .is_zeroizable =
false},
532 [kDifOtpCtrlPartitionRotCreatorAuth] = {
533 .start_addr = OTP_CTRL_PARAM_ROT_CREATOR_AUTH_OFFSET,
534 .len = OTP_CTRL_PARAM_ROT_CREATOR_AUTH_SIZE,
538 .is_lifecycle =
false,
539 .is_zeroizable =
false},
540 [kDifOtpCtrlPartitionRotOwnerAuthSlot0] = {
541 .start_addr = OTP_CTRL_PARAM_ROT_OWNER_AUTH_SLOT0_OFFSET,
542 .len = OTP_CTRL_PARAM_ROT_OWNER_AUTH_SLOT0_SIZE,
546 .is_lifecycle =
false,
547 .is_zeroizable =
false},
548 [kDifOtpCtrlPartitionRotOwnerAuthSlot1] = {
549 .start_addr = OTP_CTRL_PARAM_ROT_OWNER_AUTH_SLOT1_OFFSET,
550 .len = OTP_CTRL_PARAM_ROT_OWNER_AUTH_SLOT1_SIZE,
554 .is_lifecycle =
false,
555 .is_zeroizable =
false},
556 [kDifOtpCtrlPartitionPlatIntegAuthSlot0] = {
557 .start_addr = OTP_CTRL_PARAM_PLAT_INTEG_AUTH_SLOT0_OFFSET,
558 .len = OTP_CTRL_PARAM_PLAT_INTEG_AUTH_SLOT0_SIZE,
562 .is_lifecycle =
false,
563 .is_zeroizable =
false},
564 [kDifOtpCtrlPartitionPlatIntegAuthSlot1] = {
565 .start_addr = OTP_CTRL_PARAM_PLAT_INTEG_AUTH_SLOT1_OFFSET,
566 .len = OTP_CTRL_PARAM_PLAT_INTEG_AUTH_SLOT1_SIZE,
570 .is_lifecycle =
false,
571 .is_zeroizable =
false},
572 [kDifOtpCtrlPartitionPlatOwnerAuthSlot0] = {
573 .start_addr = OTP_CTRL_PARAM_PLAT_OWNER_AUTH_SLOT0_OFFSET,
574 .len = OTP_CTRL_PARAM_PLAT_OWNER_AUTH_SLOT0_SIZE,
578 .is_lifecycle =
false,
579 .is_zeroizable =
false},
580 [kDifOtpCtrlPartitionPlatOwnerAuthSlot1] = {
581 .start_addr = OTP_CTRL_PARAM_PLAT_OWNER_AUTH_SLOT1_OFFSET,
582 .len = OTP_CTRL_PARAM_PLAT_OWNER_AUTH_SLOT1_SIZE,
586 .is_lifecycle =
false,
587 .is_zeroizable =
false},
588 [kDifOtpCtrlPartitionPlatOwnerAuthSlot2] = {
589 .start_addr = OTP_CTRL_PARAM_PLAT_OWNER_AUTH_SLOT2_OFFSET,
590 .len = OTP_CTRL_PARAM_PLAT_OWNER_AUTH_SLOT2_SIZE,
594 .is_lifecycle =
false,
595 .is_zeroizable =
false},
596 [kDifOtpCtrlPartitionPlatOwnerAuthSlot3] = {
597 .start_addr = OTP_CTRL_PARAM_PLAT_OWNER_AUTH_SLOT3_OFFSET,
598 .len = OTP_CTRL_PARAM_PLAT_OWNER_AUTH_SLOT3_SIZE,
602 .is_lifecycle =
false,
603 .is_zeroizable =
false},
604 [kDifOtpCtrlPartitionExtNvm] = {
605 .start_addr = OTP_CTRL_PARAM_EXT_NVM_OFFSET,
606 .len = OTP_CTRL_PARAM_EXT_NVM_SIZE,
610 .is_lifecycle =
false,
611 .is_zeroizable =
false},
612 [kDifOtpCtrlPartitionRomPatch] = {
613 .start_addr = OTP_CTRL_PARAM_ROM_PATCH_OFFSET,
614 .len = OTP_CTRL_PARAM_ROM_PATCH_SIZE,
618 .is_lifecycle =
false,
619 .is_zeroizable =
false},
621#error "dif_otp_ctrl does not support this top"
624 .start_addr = OTP_CTRL_PARAM_HW_CFG0_OFFSET,
625 .len = OTP_CTRL_PARAM_HW_CFG0_SIZE,
627 .is_software =
false,
629 .is_lifecycle =
false,
630 .is_zeroizable =
false},
632 .start_addr = OTP_CTRL_PARAM_HW_CFG1_OFFSET,
633 .len = OTP_CTRL_PARAM_HW_CFG1_SIZE,
635 .is_software =
false,
637 .is_lifecycle =
false,
638 .is_zeroizable =
false},
640 .start_addr = OTP_CTRL_PARAM_SECRET0_OFFSET,
641 .len = OTP_CTRL_PARAM_SECRET0_SIZE,
643 .is_software =
false,
645 .is_lifecycle =
false,
646 .is_zeroizable =
true},
648 .start_addr = OTP_CTRL_PARAM_SECRET1_OFFSET,
649 .len = OTP_CTRL_PARAM_SECRET1_SIZE,
651 .is_software =
false,
653 .is_lifecycle =
false,
654 .is_zeroizable =
true},
656 .start_addr = OTP_CTRL_PARAM_SECRET2_OFFSET,
657 .len = OTP_CTRL_PARAM_SECRET2_SIZE,
659 .is_software =
false,
661 .is_lifecycle =
false,
662 .is_zeroizable =
true},
663#if defined(OPENTITAN_IS_DARJEELING)
664 [kDifOtpCtrlPartitionSecret3] = {
665 .start_addr = OTP_CTRL_PARAM_SECRET3_OFFSET,
666 .len = OTP_CTRL_PARAM_SECRET3_SIZE,
668 .is_software =
false,
670 .is_lifecycle =
false,
671 .is_zeroizable =
true},
672#elif defined(OPENTITAN_IS_EARLGREY)
675#error "dif_otp_ctrl does not support this top"
678 .start_addr = OTP_CTRL_PARAM_LIFE_CYCLE_OFFSET,
679 .len = OTP_CTRL_PARAM_LIFE_CYCLE_SIZE,
681 .is_software =
false,
683 .is_lifecycle =
true,
684 .is_zeroizable =
false},
689 uint32_t abs_address,
690 uint32_t *relative_address) {
691 *relative_address = 0;
693 if (partition >=
ARRAYSIZE(kPartitions)) {
697 if ((abs_address & kPartitions[partition].align_mask) != 0) {
701 if (abs_address < kPartitions[partition].start_addr) {
705 *relative_address = abs_address - kPartitions[partition].start_addr;
706 if (*relative_address >= kPartitions[partition].len) {
707 *relative_address = 0;
717 if (otp == NULL || partition >=
ARRAYSIZE(kPartitions)) {
721 if ((address & kPartitions[partition].align_mask) != 0) {
725 if (address >= kPartitions[partition].len) {
729 address += kPartitions[partition].start_addr;
730 mmio_region_write32(otp->
base_addr, OTP_CTRL_DIRECT_ACCESS_ADDRESS_REG_OFFSET,
734 bitfield_bit32_write(0, OTP_CTRL_DIRECT_ACCESS_CMD_RD_BIT,
true);
735 mmio_region_write32(otp->
base_addr, OTP_CTRL_DIRECT_ACCESS_CMD_REG_OFFSET,
743 if (otp == NULL || value == NULL) {
747 *value = mmio_region_read32(otp->
base_addr,
748 OTP_CTRL_DIRECT_ACCESS_RDATA_0_REG_OFFSET);
754 if (otp == NULL || value == NULL) {
758 *value = mmio_region_read32(otp->
base_addr,
759 OTP_CTRL_DIRECT_ACCESS_RDATA_1_REG_OFFSET);
761 *value |= mmio_region_read32(otp->
base_addr,
762 OTP_CTRL_DIRECT_ACCESS_RDATA_0_REG_OFFSET);
768 uint32_t address, uint32_t value) {
769 if (otp == NULL || partition >=
ARRAYSIZE(kPartitions)) {
778 if (kPartitions[partition].align_mask != 0x3 ||
779 kPartitions[partition].is_lifecycle) {
783 if ((address & kPartitions[partition].align_mask) != 0) {
789 if (address >= partition_effective_size(&kPartitions[partition])) {
793 address += kPartitions[partition].start_addr;
794 mmio_region_write32(otp->
base_addr, OTP_CTRL_DIRECT_ACCESS_ADDRESS_REG_OFFSET,
797 mmio_region_write32(otp->
base_addr, OTP_CTRL_DIRECT_ACCESS_WDATA_0_REG_OFFSET,
801 bitfield_bit32_write(0, OTP_CTRL_DIRECT_ACCESS_CMD_WR_BIT,
true);
802 mmio_region_write32(otp->
base_addr, OTP_CTRL_DIRECT_ACCESS_CMD_REG_OFFSET,
810 uint32_t address, uint64_t value) {
811 if (otp == NULL || partition >=
ARRAYSIZE(kPartitions)) {
817 if (kPartitions[partition].align_mask != 0x7) {
821 if ((address & kPartitions[partition].align_mask) != 0) {
827 if (address >= partition_effective_size(&kPartitions[partition])) {
831 address += kPartitions[partition].start_addr;
832 mmio_region_write32(otp->
base_addr, OTP_CTRL_DIRECT_ACCESS_ADDRESS_REG_OFFSET,
835 mmio_region_write32(otp->
base_addr, OTP_CTRL_DIRECT_ACCESS_WDATA_0_REG_OFFSET,
837 mmio_region_write32(otp->
base_addr, OTP_CTRL_DIRECT_ACCESS_WDATA_1_REG_OFFSET,
841 bitfield_bit32_write(0, OTP_CTRL_DIRECT_ACCESS_CMD_WR_BIT,
true);
842 mmio_region_write32(otp->
base_addr, OTP_CTRL_DIRECT_ACCESS_CMD_REG_OFFSET,
851 if (otp == NULL || partition >=
ARRAYSIZE(kPartitions)) {
856 if (!kPartitions[partition].has_digest) {
862 bool is_sw = kPartitions[partition].is_software;
863 if (is_sw == (digest == 0)) {
867 uint32_t address = kPartitions[partition].start_addr;
870 address += partition_effective_size(&kPartitions[partition]);
872 mmio_region_write32(otp->
base_addr, OTP_CTRL_DIRECT_ACCESS_ADDRESS_REG_OFFSET,
877 OTP_CTRL_DIRECT_ACCESS_WDATA_0_REG_OFFSET,
878 digest & 0xffffffff);
880 OTP_CTRL_DIRECT_ACCESS_WDATA_1_REG_OFFSET,
885 ? OTP_CTRL_DIRECT_ACCESS_CMD_WR_BIT
886 : OTP_CTRL_DIRECT_ACCESS_CMD_DIGEST_BIT;
887 uint32_t cmd = bitfield_bit32_write(0, cmd_bit,
true);
888 mmio_region_write32(otp->
base_addr, OTP_CTRL_DIRECT_ACCESS_CMD_REG_OFFSET,
898 *reg0 = OTP_CTRL_VENDOR_TEST_DIGEST_0_REG_OFFSET;
899 *reg1 = OTP_CTRL_VENDOR_TEST_DIGEST_1_REG_OFFSET;
902 *reg0 = OTP_CTRL_CREATOR_SW_CFG_DIGEST_0_REG_OFFSET;
903 *reg1 = OTP_CTRL_CREATOR_SW_CFG_DIGEST_1_REG_OFFSET;
906 *reg0 = OTP_CTRL_OWNER_SW_CFG_DIGEST_0_REG_OFFSET;
907 *reg1 = OTP_CTRL_OWNER_SW_CFG_DIGEST_1_REG_OFFSET;
909#if defined(OPENTITAN_IS_EARLGREY)
910 case kDifOtpCtrlPartitionRotCreatorAuthCodesign:
911 *reg0 = OTP_CTRL_ROT_CREATOR_AUTH_CODESIGN_DIGEST_0_REG_OFFSET;
912 *reg1 = OTP_CTRL_ROT_CREATOR_AUTH_CODESIGN_DIGEST_1_REG_OFFSET;
914 case kDifOtpCtrlPartitionRotCreatorAuthState:
915 *reg0 = OTP_CTRL_ROT_CREATOR_AUTH_STATE_DIGEST_0_REG_OFFSET;
916 *reg1 = OTP_CTRL_ROT_CREATOR_AUTH_STATE_DIGEST_1_REG_OFFSET;
918#elif defined(OPENTITAN_IS_DARJEELING)
919 case kDifOtpCtrlPartitionRotCreatorAuth:
920 *reg0 = OTP_CTRL_ROT_CREATOR_AUTH_DIGEST_0_REG_OFFSET;
921 *reg1 = OTP_CTRL_ROT_CREATOR_AUTH_DIGEST_1_REG_OFFSET;
923 case kDifOtpCtrlPartitionRotOwnerAuthSlot0:
924 *reg0 = OTP_CTRL_ROT_OWNER_AUTH_SLOT0_DIGEST_0_REG_OFFSET;
925 *reg1 = OTP_CTRL_ROT_OWNER_AUTH_SLOT0_DIGEST_1_REG_OFFSET;
927 case kDifOtpCtrlPartitionRotOwnerAuthSlot1:
928 *reg0 = OTP_CTRL_ROT_OWNER_AUTH_SLOT1_DIGEST_0_REG_OFFSET;
929 *reg1 = OTP_CTRL_ROT_OWNER_AUTH_SLOT1_DIGEST_1_REG_OFFSET;
931 case kDifOtpCtrlPartitionPlatIntegAuthSlot0:
932 *reg0 = OTP_CTRL_PLAT_INTEG_AUTH_SLOT0_DIGEST_0_REG_OFFSET;
933 *reg1 = OTP_CTRL_PLAT_INTEG_AUTH_SLOT0_DIGEST_1_REG_OFFSET;
935 case kDifOtpCtrlPartitionPlatIntegAuthSlot1:
936 *reg0 = OTP_CTRL_PLAT_INTEG_AUTH_SLOT1_DIGEST_0_REG_OFFSET;
937 *reg1 = OTP_CTRL_PLAT_INTEG_AUTH_SLOT1_DIGEST_1_REG_OFFSET;
939 case kDifOtpCtrlPartitionPlatOwnerAuthSlot0:
940 *reg0 = OTP_CTRL_PLAT_OWNER_AUTH_SLOT0_DIGEST_0_REG_OFFSET;
941 *reg1 = OTP_CTRL_PLAT_OWNER_AUTH_SLOT0_DIGEST_1_REG_OFFSET;
943 case kDifOtpCtrlPartitionPlatOwnerAuthSlot1:
944 *reg0 = OTP_CTRL_PLAT_OWNER_AUTH_SLOT1_DIGEST_0_REG_OFFSET;
945 *reg1 = OTP_CTRL_PLAT_OWNER_AUTH_SLOT1_DIGEST_1_REG_OFFSET;
947 case kDifOtpCtrlPartitionPlatOwnerAuthSlot2:
948 *reg0 = OTP_CTRL_PLAT_OWNER_AUTH_SLOT2_DIGEST_0_REG_OFFSET;
949 *reg1 = OTP_CTRL_PLAT_OWNER_AUTH_SLOT2_DIGEST_1_REG_OFFSET;
951 case kDifOtpCtrlPartitionPlatOwnerAuthSlot3:
952 *reg0 = OTP_CTRL_PLAT_OWNER_AUTH_SLOT3_DIGEST_0_REG_OFFSET;
953 *reg1 = OTP_CTRL_PLAT_OWNER_AUTH_SLOT3_DIGEST_1_REG_OFFSET;
955 case kDifOtpCtrlPartitionRomPatch:
956 *reg0 = OTP_CTRL_ROM_PATCH_DIGEST_0_REG_OFFSET;
957 *reg1 = OTP_CTRL_ROM_PATCH_DIGEST_1_REG_OFFSET;
960#error "dif_otp_ctrl does not support this top"
963 *reg0 = OTP_CTRL_HW_CFG0_DIGEST_0_REG_OFFSET;
964 *reg1 = OTP_CTRL_HW_CFG0_DIGEST_1_REG_OFFSET;
967 *reg0 = OTP_CTRL_HW_CFG1_DIGEST_0_REG_OFFSET;
968 *reg1 = OTP_CTRL_HW_CFG1_DIGEST_1_REG_OFFSET;
971 *reg0 = OTP_CTRL_SECRET0_DIGEST_0_REG_OFFSET;
972 *reg1 = OTP_CTRL_SECRET0_DIGEST_1_REG_OFFSET;
975 *reg0 = OTP_CTRL_SECRET1_DIGEST_0_REG_OFFSET;
976 *reg1 = OTP_CTRL_SECRET1_DIGEST_1_REG_OFFSET;
979 *reg0 = OTP_CTRL_SECRET2_DIGEST_0_REG_OFFSET;
980 *reg1 = OTP_CTRL_SECRET2_DIGEST_1_REG_OFFSET;
982#if defined(OPENTITAN_IS_DARJEELING)
983 case kDifOtpCtrlPartitionSecret3:
984 *reg0 = OTP_CTRL_SECRET3_DIGEST_0_REG_OFFSET;
985 *reg1 = OTP_CTRL_SECRET3_DIGEST_1_REG_OFFSET;
987#elif defined(OPENTITAN_IS_EARLGREY)
990#error "dif_otp_ctrl does not support this top"
1001 bool *is_computed) {
1002 if (otp == NULL || is_computed == NULL) {
1006 ptrdiff_t reg0, reg1;
1007 if (!get_digest_regs(partition, ®0, ®1)) {
1011 uint64_t value = mmio_region_read32(otp->
base_addr, reg1);
1013 value |= mmio_region_read32(otp->
base_addr, reg0);
1015 *is_computed = value != 0;
1023 if (otp == NULL || digest == NULL) {
1027 ptrdiff_t reg0, reg1;
1028 if (!get_digest_regs(partition, ®0, ®1)) {
1032 uint64_t value = mmio_region_read32(otp->
base_addr, reg1);
1034 value |= mmio_region_read32(otp->
base_addr, reg0);
1046 uint32_t address, uint32_t *buf,
1048 if (otp == NULL || partition >=
ARRAYSIZE(kPartitions) || buf == NULL) {
1052 if (!kPartitions[partition].is_software) {
1056 if ((address & kPartitions[partition].align_mask) != 0) {
1060 if (address + len >= kPartitions[partition].len) {
1064 uint32_t reg_offset = OTP_CTRL_SW_CFG_WINDOW_REG_OFFSET +
1065 kPartitions[partition].start_addr + address;
1066 mmio_region_memcpy_from_mmio32(otp->
base_addr, reg_offset, buf,
1067 len *
sizeof(uint32_t));