10 #include "gtest/gtest.h"
12 #include "sw/device/lib/base/mock_mmio.h"
15 #include "otp_ctrl_regs.h"
17 namespace dif_otp_ctrl_unittest {
19 using ::mock_mmio::LeInt;
20 using ::mock_mmio::MmioTest;
21 using ::mock_mmio::MockDevice;
22 using ::testing::Each;
23 using ::testing::ElementsAre;
25 class OtpTest :
public testing::Test,
public MmioTest {
27 dif_otp_ctrl_t otp_ = {.base_addr = dev().region()};
34 OTP_CTRL_DIRECT_ACCESS_REGWEN_REG_OFFSET,
35 {{OTP_CTRL_DIRECT_ACCESS_REGWEN_DIRECT_ACCESS_REGWEN_BIT,
false}});
39 TEST_F(DaiRegwenTest, IsDaiLocked) {
43 OTP_CTRL_DIRECT_ACCESS_REGWEN_REG_OFFSET,
44 {{OTP_CTRL_DIRECT_ACCESS_REGWEN_DIRECT_ACCESS_REGWEN_BIT,
true}});
49 OTP_CTRL_DIRECT_ACCESS_REGWEN_REG_OFFSET,
50 {{OTP_CTRL_DIRECT_ACCESS_REGWEN_DIRECT_ACCESS_REGWEN_BIT,
false}});
55 TEST_F(DaiRegwenTest, NullArgs) {
68 .integrity_period_mask = 0x3'ffff,
69 .consistency_period_mask = 0x3ff'ffff,
72 EXPECT_READ32(OTP_CTRL_CHECK_REGWEN_REG_OFFSET,
73 {{OTP_CTRL_CHECK_REGWEN_CHECK_REGWEN_BIT,
true}});
75 EXPECT_WRITE32(OTP_CTRL_CHECK_TIMEOUT_REG_OFFSET, config.
check_timeout);
76 EXPECT_WRITE32(OTP_CTRL_INTEGRITY_CHECK_PERIOD_REG_OFFSET,
78 EXPECT_WRITE32(OTP_CTRL_CONSISTENCY_CHECK_PERIOD_REG_OFFSET,
84 TEST_F(ConfigTest, Locked) {
85 EXPECT_READ32(OTP_CTRL_CHECK_REGWEN_REG_OFFSET,
86 {{OTP_CTRL_CHECK_REGWEN_CHECK_REGWEN_BIT,
false}});
91 TEST_F(ConfigTest, IsConfigLocked) {
94 EXPECT_READ32(OTP_CTRL_CHECK_REGWEN_REG_OFFSET,
95 {{OTP_CTRL_CHECK_REGWEN_CHECK_REGWEN_BIT,
true}});
99 EXPECT_READ32(OTP_CTRL_CHECK_REGWEN_REG_OFFSET,
100 {{OTP_CTRL_CHECK_REGWEN_CHECK_REGWEN_BIT,
false}});
105 TEST_F(ConfigTest, LockConfig) {
106 EXPECT_WRITE32(OTP_CTRL_CHECK_REGWEN_REG_OFFSET,
107 {{OTP_CTRL_CHECK_REGWEN_CHECK_REGWEN_BIT,
false}});
111 TEST_F(ConfigTest, NullArgs) {
125 OTP_CTRL_CHECK_TRIGGER_REGWEN_REG_OFFSET,
126 {{OTP_CTRL_CHECK_TRIGGER_REGWEN_CHECK_TRIGGER_REGWEN_BIT,
true}});
127 EXPECT_WRITE32(OTP_CTRL_CHECK_TRIGGER_REG_OFFSET,
128 {{OTP_CTRL_CHECK_TRIGGER_INTEGRITY_BIT,
true}});
133 TEST_F(CheckTest, Consistency) {
135 OTP_CTRL_CHECK_TRIGGER_REGWEN_REG_OFFSET,
136 {{OTP_CTRL_CHECK_TRIGGER_REGWEN_CHECK_TRIGGER_REGWEN_BIT,
true}});
137 EXPECT_WRITE32(OTP_CTRL_CHECK_TRIGGER_REG_OFFSET,
138 {{OTP_CTRL_CHECK_TRIGGER_CONSISTENCY_BIT,
true}});
143 TEST_F(CheckTest, LockTrigger) {
145 OTP_CTRL_CHECK_TRIGGER_REGWEN_REG_OFFSET,
146 {{OTP_CTRL_CHECK_TRIGGER_REGWEN_CHECK_TRIGGER_REGWEN_BIT,
false}});
150 TEST_F(CheckTest, Locked) {
152 OTP_CTRL_CHECK_TRIGGER_REGWEN_REG_OFFSET,
153 {{OTP_CTRL_CHECK_TRIGGER_REGWEN_CHECK_TRIGGER_REGWEN_BIT,
false}});
157 OTP_CTRL_CHECK_TRIGGER_REGWEN_REG_OFFSET,
158 {{OTP_CTRL_CHECK_TRIGGER_REGWEN_CHECK_TRIGGER_REGWEN_BIT,
false}});
162 TEST_F(CheckTest, NullArgs) {
175 OTP_CTRL_VENDOR_TEST_READ_LOCK_REG_OFFSET,
176 {{OTP_CTRL_VENDOR_TEST_READ_LOCK_VENDOR_TEST_READ_LOCK_BIT,
183 OTP_CTRL_VENDOR_TEST_READ_LOCK_REG_OFFSET,
184 {{OTP_CTRL_VENDOR_TEST_READ_LOCK_VENDOR_TEST_READ_LOCK_BIT,
191 OTP_CTRL_CREATOR_SW_CFG_READ_LOCK_REG_OFFSET,
192 {{OTP_CTRL_CREATOR_SW_CFG_READ_LOCK_CREATOR_SW_CFG_READ_LOCK_BIT,
199 OTP_CTRL_CREATOR_SW_CFG_READ_LOCK_REG_OFFSET,
200 {{OTP_CTRL_CREATOR_SW_CFG_READ_LOCK_CREATOR_SW_CFG_READ_LOCK_BIT,
207 OTP_CTRL_OWNER_SW_CFG_READ_LOCK_REG_OFFSET,
208 {{OTP_CTRL_OWNER_SW_CFG_READ_LOCK_OWNER_SW_CFG_READ_LOCK_BIT,
215 OTP_CTRL_OWNER_SW_CFG_READ_LOCK_REG_OFFSET,
216 {{OTP_CTRL_OWNER_SW_CFG_READ_LOCK_OWNER_SW_CFG_READ_LOCK_BIT,
223 OTP_CTRL_ROT_CREATOR_AUTH_CODESIGN_READ_LOCK_REG_OFFSET,
224 {{OTP_CTRL_ROT_CREATOR_AUTH_CODESIGN_READ_LOCK_ROT_CREATOR_AUTH_CODESIGN_READ_LOCK_BIT,
227 &otp_, kDifOtpCtrlPartitionRotCreatorAuthCodesign, &flag));
231 OTP_CTRL_ROT_CREATOR_AUTH_CODESIGN_READ_LOCK_REG_OFFSET,
232 {{OTP_CTRL_ROT_CREATOR_AUTH_CODESIGN_READ_LOCK_ROT_CREATOR_AUTH_CODESIGN_READ_LOCK_BIT,
235 &otp_, kDifOtpCtrlPartitionRotCreatorAuthCodesign, &flag));
239 OTP_CTRL_ROT_CREATOR_AUTH_STATE_READ_LOCK_REG_OFFSET,
240 {{OTP_CTRL_ROT_CREATOR_AUTH_STATE_READ_LOCK_ROT_CREATOR_AUTH_STATE_READ_LOCK_BIT,
243 &otp_, kDifOtpCtrlPartitionRotCreatorAuthState, &flag));
247 OTP_CTRL_ROT_CREATOR_AUTH_STATE_READ_LOCK_REG_OFFSET,
248 {{OTP_CTRL_ROT_CREATOR_AUTH_STATE_READ_LOCK_ROT_CREATOR_AUTH_STATE_READ_LOCK_BIT,
251 &otp_, kDifOtpCtrlPartitionRotCreatorAuthState, &flag));
255 TEST_F(ReadLockTest, Lock) {
257 OTP_CTRL_VENDOR_TEST_READ_LOCK_REG_OFFSET,
258 {{OTP_CTRL_VENDOR_TEST_READ_LOCK_VENDOR_TEST_READ_LOCK_BIT,
264 OTP_CTRL_CREATOR_SW_CFG_READ_LOCK_REG_OFFSET,
265 {{OTP_CTRL_CREATOR_SW_CFG_READ_LOCK_CREATOR_SW_CFG_READ_LOCK_BIT,
271 OTP_CTRL_OWNER_SW_CFG_READ_LOCK_REG_OFFSET,
272 {{OTP_CTRL_OWNER_SW_CFG_READ_LOCK_OWNER_SW_CFG_READ_LOCK_BIT,
278 OTP_CTRL_ROT_CREATOR_AUTH_CODESIGN_READ_LOCK_REG_OFFSET,
279 {{OTP_CTRL_ROT_CREATOR_AUTH_CODESIGN_READ_LOCK_ROT_CREATOR_AUTH_CODESIGN_READ_LOCK_BIT,
282 &otp_, kDifOtpCtrlPartitionRotCreatorAuthCodesign));
285 OTP_CTRL_ROT_CREATOR_AUTH_STATE_READ_LOCK_REG_OFFSET,
286 {{OTP_CTRL_ROT_CREATOR_AUTH_STATE_READ_LOCK_ROT_CREATOR_AUTH_STATE_READ_LOCK_BIT,
289 &otp_, kDifOtpCtrlPartitionRotCreatorAuthState));
292 TEST_F(ReadLockTest, NotLockablePartitions) {
326 TEST_F(ReadLockTest, NullArgs) {
350 nullptr, kDifOtpCtrlPartitionRotCreatorAuthCodesign, &flag));
352 &otp_, kDifOtpCtrlPartitionRotCreatorAuthCodesign,
nullptr));
354 nullptr, kDifOtpCtrlPartitionRotCreatorAuthCodesign));
357 nullptr, kDifOtpCtrlPartitionRotCreatorAuthState, &flag));
359 &otp_, kDifOtpCtrlPartitionRotCreatorAuthState,
nullptr));
361 nullptr, kDifOtpCtrlPartitionRotCreatorAuthState));
369 EXPECT_READ32(OTP_CTRL_STATUS_REG_OFFSET,
370 {{OTP_CTRL_STATUS_DAI_IDLE_BIT,
true}});
377 TEST_F(StatusTest, Errors) {
380 EXPECT_READ32(OTP_CTRL_STATUS_REG_OFFSET,
382 {OTP_CTRL_STATUS_DAI_IDLE_BIT,
true},
383 {OTP_CTRL_STATUS_HW_CFG0_ERROR_BIT,
true},
384 {OTP_CTRL_STATUS_LCI_ERROR_BIT,
true},
387 EXPECT_READ32(OTP_CTRL_ERR_CODE_5_REG_OFFSET,
388 {{OTP_CTRL_ERR_CODE_0_ERR_CODE_0_OFFSET,
389 OTP_CTRL_ERR_CODE_0_ERR_CODE_0_VALUE_MACRO_ECC_CORR_ERROR}});
390 EXPECT_READ32(OTP_CTRL_ERR_CODE_12_REG_OFFSET,
391 {{OTP_CTRL_ERR_CODE_0_ERR_CODE_0_OFFSET,
392 OTP_CTRL_ERR_CODE_0_ERR_CODE_0_VALUE_MACRO_ERROR}});
404 TEST_F(StatusTest, NullArgs) {
414 uint32_t abs_address;
416 uint32_t expected_relative_address;
421 public testing::WithParamInterface<RelativeAddressParams> {};
424 uint32_t got_relative_address;
426 GetParam().partition, GetParam().abs_address, &got_relative_address);
427 EXPECT_EQ(got_result, GetParam().expected_result);
428 EXPECT_EQ(got_relative_address, GetParam().expected_relative_address);
431 INSTANTIATE_TEST_SUITE_P(
432 AllPartitions, RelativeAddress,
434 RelativeAddressParams{
437 OTP_CTRL_PARAM_VENDOR_TEST_OFFSET + 4,
441 RelativeAddressParams{
442 "VendorTestUnaligned",
444 OTP_CTRL_PARAM_VENDOR_TEST_OFFSET + 1,
448 RelativeAddressParams{
449 "VendorTestOutOfRangePastEnd",
451 OTP_CTRL_PARAM_VENDOR_TEST_OFFSET + OTP_CTRL_PARAM_VENDOR_TEST_SIZE,
455 RelativeAddressParams{
458 OTP_CTRL_PARAM_CREATOR_SW_CFG_OFFSET + 4,
462 RelativeAddressParams{
463 "CreatorSwCfgUnaligned",
465 OTP_CTRL_PARAM_CREATOR_SW_CFG_OFFSET + 1,
469 RelativeAddressParams{
470 "CreatorSwCfgOutOfRangeBeforeStart",
472 OTP_CTRL_PARAM_CREATOR_SW_CFG_OFFSET - 4,
476 RelativeAddressParams{
477 "CreatorSwCfgOutOfRangePastEnd",
479 OTP_CTRL_PARAM_CREATOR_SW_CFG_OFFSET +
480 OTP_CTRL_PARAM_CREATOR_SW_CFG_SIZE,
484 RelativeAddressParams{
487 OTP_CTRL_PARAM_OWNER_SW_CFG_OFFSET + 4,
491 RelativeAddressParams{
492 "OwnerSwCfgUnaligned",
494 OTP_CTRL_PARAM_OWNER_SW_CFG_OFFSET + 1,
498 RelativeAddressParams{
499 "OwnerSwCfgOutOfRangeBeforeStart",
501 OTP_CTRL_PARAM_OWNER_SW_CFG_OFFSET - 4,
505 RelativeAddressParams{
506 "OwnerSwCfgOutOfRangePastEnd",
508 OTP_CTRL_PARAM_OWNER_SW_CFG_OFFSET +
509 OTP_CTRL_PARAM_OWNER_SW_CFG_SIZE,
513 RelativeAddressParams{
514 "RotCreatorAuthCodesignOkay",
515 kDifOtpCtrlPartitionRotCreatorAuthCodesign,
516 OTP_CTRL_PARAM_ROT_CREATOR_AUTH_CODESIGN_OFFSET + 4,
520 RelativeAddressParams{
521 "RotCreatorAuthCodesignUnaligned",
522 kDifOtpCtrlPartitionRotCreatorAuthCodesign,
523 OTP_CTRL_PARAM_ROT_CREATOR_AUTH_CODESIGN_OFFSET + 1,
527 RelativeAddressParams{
528 "RotCreatorAuthCodesignOutOfRangeBeforeStart",
529 kDifOtpCtrlPartitionRotCreatorAuthCodesign,
530 OTP_CTRL_PARAM_ROT_CREATOR_AUTH_CODESIGN_OFFSET - 4,
534 RelativeAddressParams{
535 "RotCreatorAuthCodesignOutOfRangePastEnd",
536 kDifOtpCtrlPartitionRotCreatorAuthCodesign,
537 OTP_CTRL_PARAM_ROT_CREATOR_AUTH_CODESIGN_OFFSET +
538 OTP_CTRL_PARAM_ROT_CREATOR_AUTH_CODESIGN_SIZE,
542 RelativeAddressParams{
543 "RotCreatorAuthStateOkay",
544 kDifOtpCtrlPartitionRotCreatorAuthState,
545 OTP_CTRL_PARAM_ROT_CREATOR_AUTH_STATE_OFFSET + 4,
549 RelativeAddressParams{
550 "RotCreatorAuthStateUnaligned",
551 kDifOtpCtrlPartitionRotCreatorAuthState,
552 OTP_CTRL_PARAM_ROT_CREATOR_AUTH_STATE_OFFSET + 1,
556 RelativeAddressParams{
557 "RotCreatorAuthStateOutOfRangeBeforeStart",
558 kDifOtpCtrlPartitionRotCreatorAuthState,
559 OTP_CTRL_PARAM_ROT_CREATOR_AUTH_STATE_OFFSET - 4,
563 RelativeAddressParams{
564 "RotCreatorAuthStateOutOfRangePastEnd",
565 kDifOtpCtrlPartitionRotCreatorAuthState,
566 OTP_CTRL_PARAM_ROT_CREATOR_AUTH_STATE_OFFSET +
567 OTP_CTRL_PARAM_ROT_CREATOR_AUTH_STATE_SIZE,
571 RelativeAddressParams{
574 OTP_CTRL_PARAM_HW_CFG0_OFFSET + 4,
578 RelativeAddressParams{
581 OTP_CTRL_PARAM_HW_CFG0_OFFSET + 1,
585 RelativeAddressParams{
586 "HwCfg0OutOfRangeBeforeStart",
588 OTP_CTRL_PARAM_HW_CFG0_OFFSET - 4,
592 RelativeAddressParams{
593 "HwCfg0OutOfRangePastEnd",
595 OTP_CTRL_PARAM_HW_CFG0_OFFSET + OTP_CTRL_PARAM_HW_CFG0_SIZE,
599 RelativeAddressParams{
602 OTP_CTRL_PARAM_HW_CFG1_OFFSET + 4,
606 RelativeAddressParams{
609 OTP_CTRL_PARAM_HW_CFG1_OFFSET + 1,
613 RelativeAddressParams{
614 "HwCfg1OutOfRangeBeforeStart",
616 OTP_CTRL_PARAM_HW_CFG1_OFFSET - 4,
620 RelativeAddressParams{
621 "HwCfg1OutOfRangePastEnd",
623 OTP_CTRL_PARAM_HW_CFG1_OFFSET + OTP_CTRL_PARAM_HW_CFG1_SIZE,
627 RelativeAddressParams{
630 OTP_CTRL_PARAM_SECRET0_OFFSET + 8,
634 RelativeAddressParams{
637 OTP_CTRL_PARAM_SECRET0_OFFSET + 1,
641 RelativeAddressParams{
642 "Secret0OutOfRangeBeforeStart",
644 OTP_CTRL_PARAM_SECRET0_OFFSET - 8,
648 RelativeAddressParams{
649 "Secret0OutOfRangePastEnd",
651 OTP_CTRL_PARAM_SECRET0_OFFSET + OTP_CTRL_PARAM_SECRET0_SIZE,
655 RelativeAddressParams{
658 OTP_CTRL_PARAM_SECRET1_OFFSET + 8,
662 RelativeAddressParams{
665 OTP_CTRL_PARAM_SECRET1_OFFSET + 1,
669 RelativeAddressParams{
670 "Secret1OutOfRangeBeforeStart",
672 OTP_CTRL_PARAM_SECRET1_OFFSET - 8,
676 RelativeAddressParams{
677 "Secret1OutOfRangePastEnd",
679 OTP_CTRL_PARAM_SECRET1_OFFSET + OTP_CTRL_PARAM_SECRET1_SIZE,
683 RelativeAddressParams{
686 OTP_CTRL_PARAM_SECRET2_OFFSET + 8,
690 RelativeAddressParams{
693 OTP_CTRL_PARAM_SECRET2_OFFSET + 1,
697 RelativeAddressParams{
698 "Secret2OutOfRangeBeforeStart",
700 OTP_CTRL_PARAM_SECRET2_OFFSET - 8,
704 RelativeAddressParams{
705 "Secret2OutOfRangePastEnd",
707 OTP_CTRL_PARAM_SECRET2_OFFSET + OTP_CTRL_PARAM_SECRET2_SIZE,
711 RelativeAddressParams{
714 OTP_CTRL_PARAM_LIFE_CYCLE_OFFSET + 4,
718 RelativeAddressParams{
719 "LifeCycleUnaligned",
721 OTP_CTRL_PARAM_LIFE_CYCLE_OFFSET + 1,
725 RelativeAddressParams{
726 "LifeCycleOutOfRangeBeforeStart",
728 OTP_CTRL_PARAM_LIFE_CYCLE_OFFSET - 4,
732 RelativeAddressParams{
733 "LifeCycleOutOfRangePastEnd",
735 OTP_CTRL_PARAM_LIFE_CYCLE_OFFSET + OTP_CTRL_PARAM_LIFE_CYCLE_SIZE,
739 [](
const testing::TestParamInfo<RelativeAddress::ParamType> &info) {
740 return info.param.name;
746 EXPECT_WRITE32(OTP_CTRL_DIRECT_ACCESS_ADDRESS_REG_OFFSET,
747 OTP_CTRL_PARAM_MANUF_STATE_OFFSET);
748 EXPECT_WRITE32(OTP_CTRL_DIRECT_ACCESS_CMD_REG_OFFSET,
749 {{OTP_CTRL_DIRECT_ACCESS_CMD_RD_BIT,
true}});
754 EXPECT_READ32(OTP_CTRL_DIRECT_ACCESS_RDATA_0_REG_OFFSET, 0x12345678);
758 EXPECT_EQ(val, 0x12345678);
761 TEST_F(DaiReadTest, Read64) {
763 EXPECT_WRITE32(OTP_CTRL_DIRECT_ACCESS_ADDRESS_REG_OFFSET,
764 OTP_CTRL_PARAM_SECRET0_OFFSET + 0x8);
765 EXPECT_WRITE32(OTP_CTRL_DIRECT_ACCESS_CMD_REG_OFFSET,
766 {{OTP_CTRL_DIRECT_ACCESS_CMD_RD_BIT,
true}});
771 EXPECT_READ32(OTP_CTRL_DIRECT_ACCESS_RDATA_1_REG_OFFSET, 0x12345678);
772 EXPECT_READ32(OTP_CTRL_DIRECT_ACCESS_RDATA_0_REG_OFFSET, 0x90abcdef);
775 EXPECT_EQ(val, 0x1234567890abcdef);
777 EXPECT_WRITE32(OTP_CTRL_DIRECT_ACCESS_ADDRESS_REG_OFFSET,
778 OTP_CTRL_PARAM_SECRET1_OFFSET + 0x8);
779 EXPECT_WRITE32(OTP_CTRL_DIRECT_ACCESS_CMD_REG_OFFSET,
780 {{OTP_CTRL_DIRECT_ACCESS_CMD_RD_BIT,
true}});
785 EXPECT_READ32(OTP_CTRL_DIRECT_ACCESS_RDATA_1_REG_OFFSET, 0x12345678);
786 EXPECT_READ32(OTP_CTRL_DIRECT_ACCESS_RDATA_0_REG_OFFSET, 0x90abcdef);
789 EXPECT_EQ(val, 0x1234567890abcdef);
791 EXPECT_WRITE32(OTP_CTRL_DIRECT_ACCESS_ADDRESS_REG_OFFSET,
792 OTP_CTRL_PARAM_SECRET2_OFFSET + 0x8);
793 EXPECT_WRITE32(OTP_CTRL_DIRECT_ACCESS_CMD_REG_OFFSET,
794 {{OTP_CTRL_DIRECT_ACCESS_CMD_RD_BIT,
true}});
799 EXPECT_READ32(OTP_CTRL_DIRECT_ACCESS_RDATA_1_REG_OFFSET, 0x12345678);
800 EXPECT_READ32(OTP_CTRL_DIRECT_ACCESS_RDATA_0_REG_OFFSET, 0x90abcdef);
803 EXPECT_EQ(val, 0x1234567890abcdef);
806 TEST_F(DaiReadTest, Unaligned) {
815 TEST_F(DaiReadTest, OutOfRange) {
821 TEST_F(DaiReadTest, NullArgs) {
838 EXPECT_WRITE32(OTP_CTRL_DIRECT_ACCESS_ADDRESS_REG_OFFSET,
839 OTP_CTRL_PARAM_MANUF_STATE_OFFSET);
840 EXPECT_WRITE32(OTP_CTRL_DIRECT_ACCESS_WDATA_0_REG_OFFSET, 0x12345678);
841 EXPECT_WRITE32(OTP_CTRL_DIRECT_ACCESS_CMD_REG_OFFSET,
842 {{OTP_CTRL_DIRECT_ACCESS_CMD_WR_BIT,
true}});
849 TEST_F(DaiProgramTest, Program64) {
850 EXPECT_WRITE32(OTP_CTRL_DIRECT_ACCESS_ADDRESS_REG_OFFSET,
851 OTP_CTRL_PARAM_SECRET2_OFFSET + 0x8);
852 EXPECT_WRITE32(OTP_CTRL_DIRECT_ACCESS_WDATA_0_REG_OFFSET, 0x90abcdef);
853 EXPECT_WRITE32(OTP_CTRL_DIRECT_ACCESS_WDATA_1_REG_OFFSET, 0x12345678);
854 EXPECT_WRITE32(OTP_CTRL_DIRECT_ACCESS_CMD_REG_OFFSET,
855 {{OTP_CTRL_DIRECT_ACCESS_CMD_WR_BIT,
true}});
859 0x1234567890abcdef));
862 TEST_F(DaiProgramTest, BadPartition) {
876 TEST_F(DaiProgramTest, Unaligned) {
885 TEST_F(DaiProgramTest, OutOfRange) {
889 OTP_CTRL_PARAM_CREATOR_SW_CFG_DIGEST_OFFSET,
896 OTP_CTRL_PARAM_SECRET2_DIGEST_OFFSET, 42),
900 TEST_F(DaiProgramTest, NullArgs) {
912 EXPECT_WRITE32(OTP_CTRL_DIRECT_ACCESS_ADDRESS_REG_OFFSET,
913 OTP_CTRL_PARAM_VENDOR_TEST_DIGEST_OFFSET);
914 EXPECT_WRITE32(OTP_CTRL_DIRECT_ACCESS_WDATA_0_REG_OFFSET, 0x00abcdef);
915 EXPECT_WRITE32(OTP_CTRL_DIRECT_ACCESS_WDATA_1_REG_OFFSET, 0xabcdef00);
916 EXPECT_WRITE32(OTP_CTRL_DIRECT_ACCESS_CMD_REG_OFFSET,
917 {{OTP_CTRL_DIRECT_ACCESS_CMD_WR_BIT,
true}});
920 0xabcdef0000abcdef));
922 EXPECT_WRITE32(OTP_CTRL_DIRECT_ACCESS_ADDRESS_REG_OFFSET,
923 OTP_CTRL_PARAM_CREATOR_SW_CFG_DIGEST_OFFSET);
924 EXPECT_WRITE32(OTP_CTRL_DIRECT_ACCESS_WDATA_0_REG_OFFSET, 0x00abcdef);
925 EXPECT_WRITE32(OTP_CTRL_DIRECT_ACCESS_WDATA_1_REG_OFFSET, 0xabcdef00);
926 EXPECT_WRITE32(OTP_CTRL_DIRECT_ACCESS_CMD_REG_OFFSET,
927 {{OTP_CTRL_DIRECT_ACCESS_CMD_WR_BIT,
true}});
930 0xabcdef0000abcdef));
932 EXPECT_WRITE32(OTP_CTRL_DIRECT_ACCESS_ADDRESS_REG_OFFSET,
933 OTP_CTRL_PARAM_OWNER_SW_CFG_DIGEST_OFFSET);
934 EXPECT_WRITE32(OTP_CTRL_DIRECT_ACCESS_WDATA_0_REG_OFFSET, 0x00abcdef);
935 EXPECT_WRITE32(OTP_CTRL_DIRECT_ACCESS_WDATA_1_REG_OFFSET, 0xabcdef00);
936 EXPECT_WRITE32(OTP_CTRL_DIRECT_ACCESS_CMD_REG_OFFSET,
937 {{OTP_CTRL_DIRECT_ACCESS_CMD_WR_BIT,
true}});
940 0xabcdef0000abcdef));
942 EXPECT_WRITE32(OTP_CTRL_DIRECT_ACCESS_ADDRESS_REG_OFFSET,
943 OTP_CTRL_PARAM_ROT_CREATOR_AUTH_CODESIGN_DIGEST_OFFSET);
944 EXPECT_WRITE32(OTP_CTRL_DIRECT_ACCESS_WDATA_0_REG_OFFSET, 0x00abcdef);
945 EXPECT_WRITE32(OTP_CTRL_DIRECT_ACCESS_WDATA_1_REG_OFFSET, 0xabcdef00);
946 EXPECT_WRITE32(OTP_CTRL_DIRECT_ACCESS_CMD_REG_OFFSET,
947 {{OTP_CTRL_DIRECT_ACCESS_CMD_WR_BIT,
true}});
951 0xabcdef0000abcdef));
953 EXPECT_WRITE32(OTP_CTRL_DIRECT_ACCESS_ADDRESS_REG_OFFSET,
954 OTP_CTRL_PARAM_ROT_CREATOR_AUTH_STATE_DIGEST_OFFSET);
955 EXPECT_WRITE32(OTP_CTRL_DIRECT_ACCESS_WDATA_0_REG_OFFSET, 0x00abcdef);
956 EXPECT_WRITE32(OTP_CTRL_DIRECT_ACCESS_WDATA_1_REG_OFFSET, 0xabcdef00);
957 EXPECT_WRITE32(OTP_CTRL_DIRECT_ACCESS_CMD_REG_OFFSET,
958 {{OTP_CTRL_DIRECT_ACCESS_CMD_WR_BIT,
true}});
961 kDifOtpCtrlPartitionRotCreatorAuthState,
962 0xabcdef0000abcdef));
965 TEST_F(DaiDigestTest, DigestHw) {
966 EXPECT_WRITE32(OTP_CTRL_DIRECT_ACCESS_ADDRESS_REG_OFFSET,
967 OTP_CTRL_PARAM_HW_CFG0_OFFSET);
968 EXPECT_WRITE32(OTP_CTRL_DIRECT_ACCESS_CMD_REG_OFFSET,
969 {{OTP_CTRL_DIRECT_ACCESS_CMD_DIGEST_BIT,
true}});
974 EXPECT_WRITE32(OTP_CTRL_DIRECT_ACCESS_ADDRESS_REG_OFFSET,
975 OTP_CTRL_PARAM_HW_CFG1_OFFSET);
976 EXPECT_WRITE32(OTP_CTRL_DIRECT_ACCESS_CMD_REG_OFFSET,
977 {{OTP_CTRL_DIRECT_ACCESS_CMD_DIGEST_BIT,
true}});
982 EXPECT_WRITE32(OTP_CTRL_DIRECT_ACCESS_ADDRESS_REG_OFFSET,
983 OTP_CTRL_PARAM_SECRET0_OFFSET);
984 EXPECT_WRITE32(OTP_CTRL_DIRECT_ACCESS_CMD_REG_OFFSET,
985 {{OTP_CTRL_DIRECT_ACCESS_CMD_DIGEST_BIT,
true}});
990 EXPECT_WRITE32(OTP_CTRL_DIRECT_ACCESS_ADDRESS_REG_OFFSET,
991 OTP_CTRL_PARAM_SECRET1_OFFSET);
992 EXPECT_WRITE32(OTP_CTRL_DIRECT_ACCESS_CMD_REG_OFFSET,
993 {{OTP_CTRL_DIRECT_ACCESS_CMD_DIGEST_BIT,
true}});
998 EXPECT_WRITE32(OTP_CTRL_DIRECT_ACCESS_ADDRESS_REG_OFFSET,
999 OTP_CTRL_PARAM_SECRET2_OFFSET);
1000 EXPECT_WRITE32(OTP_CTRL_DIRECT_ACCESS_CMD_REG_OFFSET,
1001 {{OTP_CTRL_DIRECT_ACCESS_CMD_DIGEST_BIT,
true}});
1007 TEST_F(DaiDigestTest, BadPartition) {
1013 TEST_F(DaiDigestTest, BadDigest) {
1015 0xabcdef0000abcdef));
1021 TEST_F(DaiDigestTest, NullArgs) {
1024 0xabcdef0000abcdef));
1039 TEST_F(IsDigestComputed, BadPartition) {
1045 TEST_F(IsDigestComputed, Success) {
1048 EXPECT_READ32(OTP_CTRL_SECRET2_DIGEST_1_REG_OFFSET, 0x98abcdef);
1049 EXPECT_READ32(OTP_CTRL_SECRET2_DIGEST_0_REG_OFFSET, 0xabcdef01);
1052 EXPECT_TRUE(is_computed);
1054 EXPECT_READ32(OTP_CTRL_SECRET2_DIGEST_1_REG_OFFSET, 0);
1055 EXPECT_READ32(OTP_CTRL_SECRET2_DIGEST_0_REG_OFFSET, 0);
1058 EXPECT_FALSE(is_computed);
1064 ptrdiff_t reg0, reg1;
1068 public testing::WithParamInterface<DigestParams> {};
1071 if (!GetParam().has_digest) {
1078 EXPECT_READ32(GetParam().reg1, 0xabcdef99);
1079 EXPECT_READ32(GetParam().reg0, 0x99abcdef);
1083 EXPECT_EQ(digest, 0xabcdef9999abcdef);
1086 TEST_P(GetDigest, BadDigest) {
1087 if (!GetParam().has_digest) {
1091 EXPECT_READ32(GetParam().reg1, 0x0);
1092 EXPECT_READ32(GetParam().reg0, 0x0);
1099 TEST_P(GetDigest, NullArgs) {
1110 INSTANTIATE_TEST_SUITE_P(
1111 AllDigests, GetDigest,
1116 OTP_CTRL_VENDOR_TEST_DIGEST_0_REG_OFFSET,
1117 OTP_CTRL_VENDOR_TEST_DIGEST_1_REG_OFFSET,
1122 OTP_CTRL_CREATOR_SW_CFG_DIGEST_0_REG_OFFSET,
1123 OTP_CTRL_CREATOR_SW_CFG_DIGEST_1_REG_OFFSET,
1128 OTP_CTRL_OWNER_SW_CFG_DIGEST_0_REG_OFFSET,
1129 OTP_CTRL_OWNER_SW_CFG_DIGEST_1_REG_OFFSET,
1132 kDifOtpCtrlPartitionRotCreatorAuthCodesign,
1134 OTP_CTRL_ROT_CREATOR_AUTH_CODESIGN_DIGEST_0_REG_OFFSET,
1135 OTP_CTRL_ROT_CREATOR_AUTH_CODESIGN_DIGEST_1_REG_OFFSET,
1138 kDifOtpCtrlPartitionRotCreatorAuthState,
1140 OTP_CTRL_ROT_CREATOR_AUTH_STATE_DIGEST_0_REG_OFFSET,
1141 OTP_CTRL_ROT_CREATOR_AUTH_STATE_DIGEST_1_REG_OFFSET,
1146 OTP_CTRL_HW_CFG0_DIGEST_0_REG_OFFSET,
1147 OTP_CTRL_HW_CFG0_DIGEST_1_REG_OFFSET,
1152 OTP_CTRL_HW_CFG1_DIGEST_0_REG_OFFSET,
1153 OTP_CTRL_HW_CFG1_DIGEST_1_REG_OFFSET,
1158 OTP_CTRL_SECRET0_DIGEST_0_REG_OFFSET,
1159 OTP_CTRL_SECRET0_DIGEST_1_REG_OFFSET,
1164 OTP_CTRL_SECRET1_DIGEST_0_REG_OFFSET,
1165 OTP_CTRL_SECRET1_DIGEST_1_REG_OFFSET,
1170 OTP_CTRL_SECRET2_DIGEST_0_REG_OFFSET,
1171 OTP_CTRL_SECRET2_DIGEST_1_REG_OFFSET,
1183 static constexpr
size_t kWords = 4;
1187 for (
size_t i = 0; i < kWords; ++i) {
1189 OTP_CTRL_PARAM_OWNER_SW_CFG_OFFSET + 0x10 + i *
sizeof(uint32_t);
1190 EXPECT_READ32(OTP_CTRL_SW_CFG_WINDOW_REG_OFFSET + offset, i + 1);
1193 std::vector<uint32_t> buf(kWords);
1196 EXPECT_THAT(buf, ElementsAre(1, 2, 3, 4));
1199 TEST_F(BlockingIoTest, BadPartition) {
1200 std::vector<uint32_t> buf(kWords);
1202 buf.data(), buf.size()),
1206 TEST_F(BlockingIoTest, Unaligned) {
1207 std::vector<uint32_t> buf(kWords);
1209 0x11, buf.data(), buf.size()),
1213 TEST_F(BlockingIoTest, OutOfRange) {
1214 std::vector<uint32_t> buf(0x2f0);
1216 0x300, buf.data(), buf.size()),
1219 0x10, buf.data(), 0x330),
1223 TEST_F(BlockingIoTest, NullArgs) {
1224 std::vector<uint32_t> buf(kWords);