7 #include "gtest/gtest.h"
10 #include "sw/device/lib/base/mock_mmio.h"
14 #include "rstmgr_regs.h"
16 namespace dif_rstmgr_unittest {
21 using testing::ElementsAreArray;
23 using testing::IsSubsetOf;
28 dif_rstmgr_t rstmgr_ = {.base_addr = dev().region()};
35 TEST_F(ResetTest, Success) {
36 EXPECT_WRITE32(RSTMGR_RESET_INFO_REG_OFFSET,
37 std::numeric_limits<uint32_t>::max());
39 for (uint32_t i = 0; i < RSTMGR_PARAM_NUM_SW_RESETS; i++) {
40 EXPECT_WRITE32(RSTMGR_SW_RST_CTRL_N_0_REG_OFFSET + 4 * i,
41 std::numeric_limits<uint32_t>::max());
53 TEST_F(ResetLockTest, BadPeripheral) {
58 TEST_F(ResetLockTest, Success) {
59 for (uint32_t reg_index = 0; reg_index < RSTMGR_PARAM_NUM_SW_RESETS;
63 EXPECT_WRITE32(RSTMGR_SW_RST_REGWEN_0_REG_OFFSET + reg_index * 4, 0);
78 TEST_F(ResetIsLockedTest, BadPeripheral) {
81 &rstmgr_, RSTMGR_PARAM_NUM_SW_RESETS, &is_locked));
84 TEST_F(ResetIsLockedTest, Success) {
85 for (uint32_t reg_index = 0; reg_index < RSTMGR_PARAM_NUM_SW_RESETS;
89 EXPECT_READ32(RSTMGR_SW_RST_REGWEN_0_REG_OFFSET + reg_index * 4, 0);
91 bool is_locked =
false;
93 EXPECT_TRUE(is_locked);
96 EXPECT_READ32(RSTMGR_SW_RST_REGWEN_0_REG_OFFSET + reg_index * 4, 1);
98 EXPECT_FALSE(is_locked);
114 EXPECT_EQ(reset_info_reasons_.size(), 3);
117 const std::vector<bitfield_field32_t> reset_info_reasons_{
120 RSTMGR_RESET_INFO_HW_REQ_FIELD,
131 TEST_F(ResetCausesGetTest, Success) {
133 for (
auto reason : reset_info_reasons_) {
135 EXPECT_READ32(RSTMGR_RESET_INFO_REG_OFFSET, bitfield);
139 EXPECT_EQ(info & bitfield, info);
145 EXPECT_READ32(RSTMGR_RESET_INFO_REG_OFFSET, {
164 TEST_F(ResetCausesClearTest, Success) {
165 EXPECT_WRITE32(RSTMGR_RESET_INFO_REG_OFFSET,
166 std::numeric_limits<uint32_t>::max());
178 TEST_F(AlertInfoSetTest, Success) {
180 uint32_t alert_regwen =
182 EXPECT_READ32(RSTMGR_ALERT_REGWEN_REG_OFFSET, alert_regwen);
185 EXPECT_WRITE32(RSTMGR_ALERT_INFO_CTRL_REG_OFFSET,
187 {RSTMGR_ALERT_INFO_CTRL_EN_BIT,
true},
192 EXPECT_READ32(RSTMGR_ALERT_REGWEN_REG_OFFSET, alert_regwen);
193 EXPECT_WRITE32(RSTMGR_ALERT_INFO_CTRL_REG_OFFSET,
195 {RSTMGR_ALERT_INFO_CTRL_EN_BIT,
false},
210 TEST_F(AlertInfoGetTest, Success) {
212 EXPECT_READ32(RSTMGR_ALERT_INFO_CTRL_REG_OFFSET,
214 {RSTMGR_ALERT_INFO_CTRL_EN_BIT,
true},
225 uint32_t register_value =
227 RSTMGR_ALERT_INFO_CTRL_EN_BIT,
false);
228 EXPECT_READ32(RSTMGR_ALERT_INFO_CTRL_REG_OFFSET, register_value);
238 EXPECT_READ32(RSTMGR_ALERT_INFO_ATTR_REG_OFFSET, 5);
245 TEST_F(AlertInfoGetSizeTest, BadArgs) {
256 src_[i] = dev().GarbageMemory<uint32_t>();
267 size_t segments_read;
285 TEST_F(AlertInfoDumpReadTest, BadDumpSize) {
286 EXPECT_READ32(RSTMGR_ALERT_INFO_ATTR_REG_OFFSET,
289 size_t segments_read = 0xA5A5A5A5;
295 EXPECT_EQ(segments_read, 0xA5A5A5A5);
298 TEST_F(AlertInfoDumpReadTest, SuccessFullBuffer) {
299 EXPECT_READ32(RSTMGR_ALERT_INFO_ATTR_REG_OFFSET,
301 EXPECT_READ32(RSTMGR_ALERT_INFO_CTRL_REG_OFFSET, 1);
304 EXPECT_WRITE32(RSTMGR_ALERT_INFO_CTRL_REG_OFFSET,
307 RSTMGR_ALERT_INFO_CTRL_EN_BIT,
311 RSTMGR_ALERT_INFO_CTRL_INDEX_OFFSET,
316 EXPECT_READ32(RSTMGR_ALERT_INFO_REG_OFFSET, src_[i]);
319 size_t segments_read = 0;
324 EXPECT_THAT(src_, ElementsAreArray(dump));
327 TEST_F(AlertInfoDumpReadTest, SuccessDumpSmaller) {
330 EXPECT_READ32(RSTMGR_ALERT_INFO_ATTR_REG_OFFSET, dump_size);
331 EXPECT_READ32(RSTMGR_ALERT_INFO_CTRL_REG_OFFSET, 1);
333 for (uint32_t i = 0; i < dump_size; ++i) {
334 EXPECT_WRITE32(RSTMGR_ALERT_INFO_CTRL_REG_OFFSET,
337 RSTMGR_ALERT_INFO_CTRL_EN_BIT,
341 RSTMGR_ALERT_INFO_CTRL_INDEX_OFFSET,
346 EXPECT_READ32(RSTMGR_ALERT_INFO_REG_OFFSET, src_[i]);
349 size_t segments_read = 0;
353 EXPECT_EQ(segments_read, dump_size);
354 EXPECT_THAT(dump, IsSubsetOf(src_));
364 TEST_F(CpuInfoSetTest, Success) {
366 uint32_t cpu_regwen =
368 EXPECT_READ32(RSTMGR_CPU_REGWEN_REG_OFFSET, cpu_regwen);
371 EXPECT_WRITE32(RSTMGR_CPU_INFO_CTRL_REG_OFFSET,
373 {RSTMGR_CPU_INFO_CTRL_EN_BIT,
true},
378 EXPECT_READ32(RSTMGR_CPU_REGWEN_REG_OFFSET, cpu_regwen);
379 EXPECT_WRITE32(RSTMGR_CPU_INFO_CTRL_REG_OFFSET,
381 {RSTMGR_CPU_INFO_CTRL_EN_BIT,
false},
395 TEST_F(CpuInfoGetTest, Success) {
397 EXPECT_READ32(RSTMGR_CPU_INFO_CTRL_REG_OFFSET,
399 {RSTMGR_CPU_INFO_CTRL_EN_BIT,
true},
411 std::numeric_limits<uint32_t>::max(), RSTMGR_CPU_INFO_CTRL_EN_BIT,
false);
412 EXPECT_READ32(RSTMGR_CPU_INFO_CTRL_REG_OFFSET, register_value);
422 EXPECT_READ32(RSTMGR_CPU_INFO_ATTR_REG_OFFSET, 5);
429 TEST_F(CpuInfoGetSizeTest, BadArgs) {
440 src_[i] = dev().GarbageMemory<uint32_t>();
451 size_t segments_read;
469 TEST_F(CpuInfoDumpReadTest, BadDumpSize) {
472 size_t segments_read = 0xA5A5A5A5;
478 EXPECT_EQ(segments_read, 0xA5A5A5A5);
481 TEST_F(CpuInfoDumpReadTest, SuccessFullBuffer) {
483 EXPECT_READ32(RSTMGR_CPU_INFO_CTRL_REG_OFFSET, 1);
486 EXPECT_WRITE32(RSTMGR_CPU_INFO_CTRL_REG_OFFSET,
489 RSTMGR_CPU_INFO_CTRL_EN_BIT,
493 RSTMGR_CPU_INFO_CTRL_INDEX_OFFSET,
498 EXPECT_READ32(RSTMGR_CPU_INFO_REG_OFFSET, src_[i]);
501 size_t segments_read = 0;
506 EXPECT_THAT(src_, ElementsAreArray(dump));
509 TEST_F(CpuInfoDumpReadTest, SuccessDumpSmaller) {
512 EXPECT_READ32(RSTMGR_CPU_INFO_ATTR_REG_OFFSET, dump_size);
513 EXPECT_READ32(RSTMGR_CPU_INFO_CTRL_REG_OFFSET, 1);
515 for (uint32_t i = 0; i < dump_size; ++i) {
516 EXPECT_WRITE32(RSTMGR_CPU_INFO_CTRL_REG_OFFSET,
519 RSTMGR_CPU_INFO_CTRL_EN_BIT,
523 RSTMGR_CPU_INFO_CTRL_INDEX_OFFSET,
528 EXPECT_READ32(RSTMGR_CPU_INFO_REG_OFFSET, src_[i]);
531 size_t segments_read = 0;
535 EXPECT_EQ(segments_read, dump_size);
536 EXPECT_THAT(dump, IsSubsetOf(src_));
546 TEST_F(SoftwareResetTest, BadPeripheral) {
551 TEST_F(SoftwareResetTest, SoftwareResetIsLocked) {
552 for (uint32_t reg_index = 0; reg_index < RSTMGR_PARAM_NUM_SW_RESETS;
556 EXPECT_READ32(RSTMGR_SW_RST_REGWEN_0_REG_OFFSET + reg_index * 4, 0);
564 TEST_F(SoftwareResetTest, SuccessHold) {
565 for (uint32_t reg_index = 0; reg_index < RSTMGR_PARAM_NUM_SW_RESETS;
568 EXPECT_READ32(RSTMGR_SW_RST_REGWEN_0_REG_OFFSET + reg_index * 4, 1);
571 EXPECT_WRITE32(RSTMGR_SW_RST_CTRL_N_0_REG_OFFSET + reg_index * 4, 0);
578 TEST_F(SoftwareResetTest, SuccessRelease) {
579 for (uint32_t reg_index = 0; reg_index < RSTMGR_PARAM_NUM_SW_RESETS;
582 EXPECT_READ32(RSTMGR_SW_RST_REGWEN_0_REG_OFFSET + reg_index * 4, 1);
585 EXPECT_WRITE32(RSTMGR_SW_RST_CTRL_N_0_REG_OFFSET + reg_index * 4, 1);
592 TEST_F(SoftwareResetTest, SuccessReset) {
593 for (uint32_t reg_index = 0; reg_index < RSTMGR_PARAM_NUM_SW_RESETS;
596 EXPECT_READ32(RSTMGR_SW_RST_REGWEN_0_REG_OFFSET + reg_index * 4, 1);
599 EXPECT_WRITE32(RSTMGR_SW_RST_CTRL_N_0_REG_OFFSET + reg_index * 4, 0);
602 EXPECT_WRITE32(RSTMGR_SW_RST_CTRL_N_0_REG_OFFSET + reg_index * 4, 1);
620 TEST_F(SoftwareResetIsHeldTest, BadPeripheral) {
623 &rstmgr_, RSTMGR_PARAM_NUM_SW_RESETS, &asserted));
626 TEST_F(SoftwareResetIsHeldTest, Success) {
627 for (uint32_t reg_index = 0; reg_index < RSTMGR_PARAM_NUM_SW_RESETS;
630 EXPECT_READ32(RSTMGR_SW_RST_CTRL_N_0_REG_OFFSET + reg_index * 4, 0);
632 bool asserted =
false;
635 EXPECT_TRUE(asserted);
638 EXPECT_READ32(RSTMGR_SW_RST_CTRL_N_0_REG_OFFSET + reg_index * 4, 1);
643 EXPECT_FALSE(asserted);
655 TEST_F(FatalErrorTest, GetCodes) {
657 EXPECT_READ32(RSTMGR_ERR_CODE_REG_OFFSET, 6);