9 #include "gtest/gtest.h"
11 #include "sw/device/lib/base/mock_mmio.h"
15 #include "pwrmgr_regs.h"
17 namespace dif_pwrmgr_unittest {
23 uint32_t AllOnesExcept(uint32_t index) {
return ~(1u << index); }
28 static constexpr std::array<dif_toggle_t, 2> kAllToggles = {
32 static constexpr std::array<bool, 2> kAllBools = {
true,
false};
37 std::numeric_limits<uint8_t>::max();
39 std::numeric_limits<uint32_t>::max();
52 EXPECT_WRITE32(PWRMGR_CFG_CDC_SYNC_REG_OFFSET, 1);
54 uint8_t rand_delay = dev().GarbageMemory<uint32_t>() & 0x7F;
55 for (uint8_t i = 0; i < rand_delay; ++i) {
56 EXPECT_READ32(PWRMGR_CFG_CDC_SYNC_REG_OFFSET, 1);
58 EXPECT_READ32(PWRMGR_CFG_CDC_SYNC_REG_OFFSET, 0);
64 const dif_pwrmgr_t pwrmgr_ = {.base_addr = dev().region()};
86 TEST_F(LowPowerTest, SetLocked) {
87 for (
auto new_toggle : kAllToggles) {
88 for (
auto sync_toggle : kAllToggles) {
89 EXPECT_READ32(PWRMGR_CTRL_CFG_REGWEN_REG_OFFSET,
90 AllOnesExcept(PWRMGR_CTRL_CFG_REGWEN_EN_BIT));
99 TEST_F(LowPowerTest, Set) {
100 for (
auto new_toggle : kAllToggles) {
101 for (
auto sync_toggle : kAllToggles) {
102 EXPECT_READ32(PWRMGR_CTRL_CFG_REGWEN_REG_OFFSET,
104 .offset = PWRMGR_CTRL_CFG_REGWEN_EN_BIT,
107 EXPECT_MASK32(PWRMGR_CONTROL_REG_OFFSET,
109 .offset = PWRMGR_CONTROL_LOW_POWER_HINT_BIT,
122 TEST_F(LowPowerTest, GetBadArgs) {
130 TEST_F(LowPowerTest, Get) {
131 for (
auto toggle : kAllToggles) {
134 EXPECT_READ32(PWRMGR_CONTROL_REG_OFFSET,
136 .offset = PWRMGR_CONTROL_LOW_POWER_HINT_BIT,
141 EXPECT_EQ(state, toggle);
153 kDifPwrmgrDomainOptionUsbClockInLowPower |
154 kDifPwrmgrDomainOptionUsbClockInActivePower |
155 kDifPwrmgrDomainOptionMainPowerInLowPower,
156 .index = PWRMGR_CONTROL_CORE_CLK_EN_BIT,
158 static constexpr std::array<dif_pwrmgr_domain_config_t, 4> kConfigs = {
164 kDifPwrmgrDomainOptionUsbClockInLowPower |
165 kDifPwrmgrDomainOptionUsbClockInActivePower |
166 kDifPwrmgrDomainOptionMainPowerInLowPower,
169 kDifPwrmgrDomainOptionUsbClockInLowPower |
170 kDifPwrmgrDomainOptionMainPowerInLowPower,
173 kDifPwrmgrDomainOptionUsbClockInActivePower,
177 constexpr std::array<dif_pwrmgr_domain_config_t, 4> DomainConfig::kConfigs;
179 TEST_F(DomainConfig, SetBadArgs) {
194 TEST_F(DomainConfig, SetLocked) {
195 EXPECT_READ32(PWRMGR_CTRL_CFG_REGWEN_REG_OFFSET,
196 AllOnesExcept(PWRMGR_WAKEUP_EN_REGWEN_EN_BIT));
202 TEST_F(DomainConfig, Set) {
203 for (
auto config : kConfigs) {
204 for (
auto toggle : kAllToggles) {
205 EXPECT_READ32(PWRMGR_CTRL_CFG_REGWEN_REG_OFFSET,
207 .offset = PWRMGR_CTRL_CFG_REGWEN_EN_BIT,
210 EXPECT_MASK32(PWRMGR_CONTROL_REG_OFFSET,
212 .offset = kConfigBitfield.index,
213 .mask = kConfigBitfield.mask,
224 TEST_F(DomainConfig, GetBadArgs) {
231 TEST_F(DomainConfig, Get) {
232 for (
auto exp_config : kConfigs) {
233 EXPECT_READ32(PWRMGR_CONTROL_REG_OFFSET,
235 .offset = kConfigBitfield.index,
241 EXPECT_EQ(act_config, exp_config);
250 static constexpr std::array<dif_pwrmgr_request_sources_t, 2> kWakeupSources =
255 kDifPwrmgrWakeupRequestSourceOne,
257 static constexpr std::array<dif_pwrmgr_request_sources_t, 2> kResetSources = {
261 kDifPwrmgrResetRequestSourceOne,
265 constexpr std::array<dif_pwrmgr_request_sources_t, 2>
266 RequestSources::kWakeupSources;
267 constexpr std::array<dif_pwrmgr_request_sources_t, 2>
268 RequestSources::kResetSources;
270 TEST_F(RequestSources, SetBadArgs) {
275 &pwrmgr_, kBadReqType, kDifPwrmgrWakeupRequestSourceOne,
283 nullptr, kBadReqType, kDifPwrmgrWakeupRequestSourceOne,
293 &pwrmgr_, kBadReqType, kDifPwrmgrWakeupRequestSourceOne, kBadToggle));
299 nullptr, kBadReqType, kDifPwrmgrWakeupRequestSourceOne, kBadToggle));
303 kBadSources, kBadToggle));
306 kBadSources, kBadToggle));
309 TEST_F(RequestSources, SetWakeupLocked) {
310 EXPECT_READ32(PWRMGR_WAKEUP_EN_REGWEN_REG_OFFSET,
311 AllOnesExcept(PWRMGR_WAKEUP_EN_REGWEN_EN_BIT));
314 kDifPwrmgrWakeupRequestSourceOne,
319 TEST_F(RequestSources, SetResetLocked) {
320 EXPECT_READ32(PWRMGR_RESET_EN_REGWEN_REG_OFFSET,
321 AllOnesExcept(PWRMGR_RESET_EN_REGWEN_EN_BIT));
324 kDifPwrmgrResetRequestSourceOne,
329 TEST_F(RequestSources, SetWakeup) {
330 for (
auto toggle : kAllToggles) {
331 EXPECT_READ32(PWRMGR_WAKEUP_EN_REGWEN_REG_OFFSET,
333 .offset = PWRMGR_WAKEUP_EN_REGWEN_EN_BIT,
336 EXPECT_WRITE32(PWRMGR_WAKEUP_EN_REG_OFFSET,
337 kDifPwrmgrWakeupRequestSourceOne);
347 TEST_F(RequestSources, SetReset) {
348 for (
auto toggle : kAllToggles) {
349 EXPECT_READ32(PWRMGR_RESET_EN_REGWEN_REG_OFFSET,
351 .offset = PWRMGR_RESET_EN_REGWEN_EN_BIT,
354 EXPECT_WRITE32(PWRMGR_RESET_EN_REG_OFFSET, kDifPwrmgrResetRequestSourceOne);
364 TEST_F(RequestSources, GetBadArgs) {
383 TEST_F(RequestSources, GetWakeup) {
384 for (
auto exp_sources : kWakeupSources) {
385 EXPECT_READ32(PWRMGR_WAKEUP_EN_REG_OFFSET, exp_sources);
390 EXPECT_EQ(act_sources, exp_sources);
394 TEST_F(RequestSources, GetReset) {
395 for (
auto exp_sources : kResetSources) {
396 EXPECT_READ32(PWRMGR_RESET_EN_REG_OFFSET, exp_sources);
401 EXPECT_EQ(act_sources, exp_sources);
405 TEST_F(RequestSources, GetCurrentBadArgs) {
424 TEST_F(RequestSources, GetCurrentWakeup) {
425 for (
auto exp_sources : kWakeupSources) {
426 EXPECT_READ32(PWRMGR_WAKE_STATUS_REG_OFFSET, exp_sources);
431 EXPECT_EQ(act_sources, exp_sources);
435 TEST_F(RequestSources, GetCurrentReset) {
436 for (
auto exp_sources : kResetSources) {
437 EXPECT_READ32(PWRMGR_RESET_STATUS_REG_OFFSET, exp_sources);
442 EXPECT_EQ(act_sources, exp_sources);
446 TEST_F(RequestSources, LockBadArgs) {
453 TEST_F(RequestSources, LockWakeup) {
454 EXPECT_WRITE32(PWRMGR_WAKEUP_EN_REGWEN_REG_OFFSET, 0);
460 TEST_F(RequestSources, LockReset) {
461 EXPECT_WRITE32(PWRMGR_RESET_EN_REGWEN_REG_OFFSET, 0);
467 TEST_F(RequestSources, IsLockedBadArgs) {
486 TEST_F(RequestSources, IsLockedWakeup) {
487 for (
auto exp_val : kAllBools) {
488 EXPECT_READ32(PWRMGR_WAKEUP_EN_REGWEN_REG_OFFSET,
490 .offset = PWRMGR_WAKEUP_EN_REGWEN_EN_BIT,
494 bool is_locked = !exp_val;
497 EXPECT_EQ(is_locked, exp_val);
501 TEST_F(RequestSources, IsLockedReset) {
502 for (
auto exp_val : kAllBools) {
503 EXPECT_READ32(PWRMGR_RESET_EN_REGWEN_REG_OFFSET,
505 .offset = PWRMGR_RESET_EN_REGWEN_EN_BIT,
509 bool is_locked = !exp_val;
512 EXPECT_EQ(is_locked, exp_val);
527 TEST_F(WakeupRecording, SetEnabled) {
528 for (
auto new_state : kAllToggles) {
529 EXPECT_WRITE32(PWRMGR_WAKE_INFO_CAPTURE_DIS_REG_OFFSET,
531 .offset = PWRMGR_WAKE_INFO_CAPTURE_DIS_VAL_BIT,
540 TEST_F(WakeupRecording, GetEnabledBadArgs) {
551 TEST_F(WakeupRecording, GetEnabled) {
552 for (
auto exp_val : kAllToggles) {
553 EXPECT_READ32(PWRMGR_WAKE_INFO_CAPTURE_DIS_REG_OFFSET,
555 .offset = PWRMGR_WAKE_INFO_CAPTURE_DIS_VAL_BIT,
563 EXPECT_EQ(is_enabled, exp_val);
567 TEST_F(WakeupRecording, GetReasonBadArgs) {
578 testing::Matcher<dif_pwrmgr_wakeup_reason_t>
Eq(
580 return testing::AllOf(
582 testing::Field(
"request_sources",
587 TEST_F(WakeupRecording, GetReason) {
592 std::initializer_list<mock_mmio::BitField> read_val;
599 std::array<TestCase, 10> test_cases = {{
609 .request_sources = 0,
615 .offset = PWRMGR_WAKE_INFO_ABORT_BIT,
619 .offset = PWRMGR_WAKE_INFO_FALL_THROUGH_BIT,
623 .offset = PWRMGR_PARAM_SYSRST_CTRL_AON_WKUP_REQ_IDX,
627 .offset = PWRMGR_PARAM_ADC_CTRL_AON_WKUP_REQ_IDX,
631 .offset = PWRMGR_PARAM_PINMUX_AON_PIN_WKUP_REQ_IDX,
635 .offset = PWRMGR_PARAM_PINMUX_AON_USB_WKUP_REQ_IDX,
639 .offset = PWRMGR_PARAM_AON_TIMER_AON_WKUP_REQ_IDX,
643 .offset = PWRMGR_PARAM_SENSOR_CTRL_AON_WKUP_REQ_IDX,
649 .request_sources = kDifPwrmgrWakeupRequestSourceOne |
650 kDifPwrmgrWakeupRequestSourceTwo |
651 kDifPwrmgrWakeupRequestSourceThree |
652 kDifPwrmgrWakeupRequestSourceFour |
653 kDifPwrmgrWakeupRequestSourceFive |
654 kDifPwrmgrWakeupRequestSourceSix},
659 .offset = PWRMGR_WAKE_INFO_ABORT_BIT,
665 .request_sources = 0,
671 .offset = PWRMGR_WAKE_INFO_FALL_THROUGH_BIT,
677 .request_sources = 0,
683 .offset = PWRMGR_PARAM_SYSRST_CTRL_AON_WKUP_REQ_IDX,
689 .request_sources = kDifPwrmgrWakeupRequestSourceOne,
694 .offset = PWRMGR_PARAM_ADC_CTRL_AON_WKUP_REQ_IDX,
700 .request_sources = kDifPwrmgrWakeupRequestSourceTwo,
705 .offset = PWRMGR_PARAM_PINMUX_AON_PIN_WKUP_REQ_IDX,
711 .request_sources = kDifPwrmgrWakeupRequestSourceThree,
716 .offset = PWRMGR_PARAM_PINMUX_AON_USB_WKUP_REQ_IDX,
722 .request_sources = kDifPwrmgrWakeupRequestSourceFour,
727 .offset = PWRMGR_PARAM_AON_TIMER_AON_WKUP_REQ_IDX,
733 .request_sources = kDifPwrmgrWakeupRequestSourceFive,
738 .offset = PWRMGR_PARAM_SENSOR_CTRL_AON_WKUP_REQ_IDX,
744 .request_sources = kDifPwrmgrWakeupRequestSourceSix,
749 for (
const auto &test_case : test_cases) {
750 EXPECT_READ32(PWRMGR_WAKE_INFO_REG_OFFSET, test_case.read_val);
754 EXPECT_THAT(wakeup_reason,
Eq(test_case.exp_output));
758 TEST_F(WakeupRecording, ClearReasonBadArgs) {
762 TEST_F(WakeupRecording, ClearReason) {
763 EXPECT_WRITE32(PWRMGR_WAKE_INFO_REG_OFFSET,
764 std::numeric_limits<uint32_t>::max());
778 TEST_F(FatalErrorTest, GetCodes) {
780 EXPECT_READ32(PWRMGR_FAULT_STATUS_REG_OFFSET, 6);