9 #include "gtest/gtest.h"
11 #include "sw/device/lib/base/mock_mmio.h"
15 #include "pwrmgr_regs.h"
17 namespace dif_pwrmgr_unittest {
24 kDifPwrmgrWakeupRequestSourceOne = (1u << 0),
25 kDifPwrmgrWakeupRequestSourceTwo = (1u << 1),
26 kDifPwrmgrWakeupRequestSourceThree = (1u << 2),
27 kDifPwrmgrWakeupRequestSourceFour = (1u << 3),
28 kDifPwrmgrWakeupRequestSourceFive = (1u << 4),
29 kDifPwrmgrWakeupRequestSourceSix = (1u << 5),
30 } dif_pwrmgr_wakeup_request_source_t;
32 typedef enum dif_pwrmgr_reset_request_source {
33 kDifPwrmgrResetRequestSourceOne = (1u << 0),
34 kDifPwrmgrResetRequestSourceTwo = (1u << 1),
35 } dif_pwrmgr_reset_request_source_t;
40 uint32_t AllOnesExcept(uint32_t index) {
return ~(1u << index); }
45 static constexpr std::array<dif_toggle_t, 2> kAllToggles = {
49 static constexpr std::array<bool, 2> kAllBools = {
true,
false};
54 std::numeric_limits<uint8_t>::max();
56 std::numeric_limits<uint32_t>::max();
69 EXPECT_WRITE32(PWRMGR_CFG_CDC_SYNC_REG_OFFSET, 1);
71 uint8_t rand_delay = dev().GarbageMemory<uint32_t>() & 0x7F;
72 for (uint8_t i = 0; i < rand_delay; ++i) {
73 EXPECT_READ32(PWRMGR_CFG_CDC_SYNC_REG_OFFSET, 1);
75 EXPECT_READ32(PWRMGR_CFG_CDC_SYNC_REG_OFFSET, 0);
81 const dif_pwrmgr_t pwrmgr_ = {.base_addr = dev().region()};
103 TEST_F(LowPowerTest, SetLocked) {
104 for (
auto new_toggle : kAllToggles) {
105 for (
auto sync_toggle : kAllToggles) {
106 EXPECT_READ32(PWRMGR_CTRL_CFG_REGWEN_REG_OFFSET,
107 AllOnesExcept(PWRMGR_CTRL_CFG_REGWEN_EN_BIT));
116 TEST_F(LowPowerTest, Set) {
117 for (
auto new_toggle : kAllToggles) {
118 for (
auto sync_toggle : kAllToggles) {
119 EXPECT_READ32(PWRMGR_CTRL_CFG_REGWEN_REG_OFFSET,
121 .offset = PWRMGR_CTRL_CFG_REGWEN_EN_BIT,
124 EXPECT_MASK32(PWRMGR_CONTROL_REG_OFFSET,
126 .offset = PWRMGR_CONTROL_LOW_POWER_HINT_BIT,
139 TEST_F(LowPowerTest, GetBadArgs) {
147 TEST_F(LowPowerTest, Get) {
148 for (
auto toggle : kAllToggles) {
151 EXPECT_READ32(PWRMGR_CONTROL_REG_OFFSET,
153 .offset = PWRMGR_CONTROL_LOW_POWER_HINT_BIT,
158 EXPECT_EQ(state, toggle);
170 kDifPwrmgrDomainOptionUsbClockInLowPower |
171 kDifPwrmgrDomainOptionUsbClockInActivePower |
172 kDifPwrmgrDomainOptionMainPowerInLowPower,
173 .index = PWRMGR_CONTROL_CORE_CLK_EN_BIT,
175 static constexpr std::array<dif_pwrmgr_domain_config_t, 4> kConfigs = {
181 kDifPwrmgrDomainOptionUsbClockInLowPower |
182 kDifPwrmgrDomainOptionUsbClockInActivePower |
183 kDifPwrmgrDomainOptionMainPowerInLowPower,
186 kDifPwrmgrDomainOptionUsbClockInLowPower |
187 kDifPwrmgrDomainOptionMainPowerInLowPower,
190 kDifPwrmgrDomainOptionUsbClockInActivePower,
194 constexpr std::array<dif_pwrmgr_domain_config_t, 4> DomainConfig::kConfigs;
196 TEST_F(DomainConfig, SetBadArgs) {
211 TEST_F(DomainConfig, SetLocked) {
212 EXPECT_READ32(PWRMGR_CTRL_CFG_REGWEN_REG_OFFSET,
213 AllOnesExcept(PWRMGR_WAKEUP_EN_REGWEN_EN_BIT));
219 TEST_F(DomainConfig, Set) {
220 for (
auto config : kConfigs) {
221 for (
auto toggle : kAllToggles) {
222 EXPECT_READ32(PWRMGR_CTRL_CFG_REGWEN_REG_OFFSET,
224 .offset = PWRMGR_CTRL_CFG_REGWEN_EN_BIT,
227 EXPECT_MASK32(PWRMGR_CONTROL_REG_OFFSET,
229 .offset = kConfigBitfield.index,
230 .mask = kConfigBitfield.mask,
241 TEST_F(DomainConfig, GetBadArgs) {
248 TEST_F(DomainConfig, Get) {
249 for (
auto exp_config : kConfigs) {
250 EXPECT_READ32(PWRMGR_CONTROL_REG_OFFSET,
252 .offset = kConfigBitfield.index,
258 EXPECT_EQ(act_config, exp_config);
267 static constexpr std::array<dif_pwrmgr_request_sources_t, 2> kWakeupSources =
272 kDifPwrmgrWakeupRequestSourceOne,
274 static constexpr std::array<dif_pwrmgr_request_sources_t, 2> kResetSources = {
278 kDifPwrmgrResetRequestSourceOne,
282 constexpr std::array<dif_pwrmgr_request_sources_t, 2>
283 RequestSources::kWakeupSources;
284 constexpr std::array<dif_pwrmgr_request_sources_t, 2>
285 RequestSources::kResetSources;
287 TEST_F(RequestSources, SetBadArgs) {
292 &pwrmgr_, kBadReqType, kDifPwrmgrWakeupRequestSourceOne,
300 nullptr, kBadReqType, kDifPwrmgrWakeupRequestSourceOne,
310 &pwrmgr_, kBadReqType, kDifPwrmgrWakeupRequestSourceOne, kBadToggle));
316 nullptr, kBadReqType, kDifPwrmgrWakeupRequestSourceOne, kBadToggle));
320 kBadSources, kBadToggle));
323 kBadSources, kBadToggle));
326 TEST_F(RequestSources, SetWakeupLocked) {
327 EXPECT_READ32(PWRMGR_WAKEUP_EN_REGWEN_REG_OFFSET,
328 AllOnesExcept(PWRMGR_WAKEUP_EN_REGWEN_EN_BIT));
331 kDifPwrmgrWakeupRequestSourceOne,
336 TEST_F(RequestSources, SetResetLocked) {
337 EXPECT_READ32(PWRMGR_RESET_EN_REGWEN_REG_OFFSET,
338 AllOnesExcept(PWRMGR_RESET_EN_REGWEN_EN_BIT));
341 kDifPwrmgrResetRequestSourceOne,
346 TEST_F(RequestSources, SetWakeup) {
347 for (
auto toggle : kAllToggles) {
348 EXPECT_READ32(PWRMGR_WAKEUP_EN_REGWEN_REG_OFFSET,
350 .offset = PWRMGR_WAKEUP_EN_REGWEN_EN_BIT,
353 EXPECT_WRITE32(PWRMGR_WAKEUP_EN_REG_OFFSET,
354 kDifPwrmgrWakeupRequestSourceOne);
364 TEST_F(RequestSources, SetReset) {
365 for (
auto toggle : kAllToggles) {
366 EXPECT_READ32(PWRMGR_RESET_EN_REGWEN_REG_OFFSET,
368 .offset = PWRMGR_RESET_EN_REGWEN_EN_BIT,
371 EXPECT_WRITE32(PWRMGR_RESET_EN_REG_OFFSET, kDifPwrmgrResetRequestSourceOne);
381 TEST_F(RequestSources, GetBadArgs) {
400 TEST_F(RequestSources, GetWakeup) {
401 for (
auto exp_sources : kWakeupSources) {
402 EXPECT_READ32(PWRMGR_WAKEUP_EN_REG_OFFSET, exp_sources);
407 EXPECT_EQ(act_sources, exp_sources);
411 TEST_F(RequestSources, GetReset) {
412 for (
auto exp_sources : kResetSources) {
413 EXPECT_READ32(PWRMGR_RESET_EN_REG_OFFSET, exp_sources);
418 EXPECT_EQ(act_sources, exp_sources);
422 TEST_F(RequestSources, GetCurrentBadArgs) {
441 TEST_F(RequestSources, GetCurrentWakeup) {
442 for (
auto exp_sources : kWakeupSources) {
443 EXPECT_READ32(PWRMGR_WAKE_STATUS_REG_OFFSET, exp_sources);
448 EXPECT_EQ(act_sources, exp_sources);
452 TEST_F(RequestSources, GetCurrentReset) {
453 for (
auto exp_sources : kResetSources) {
454 EXPECT_READ32(PWRMGR_RESET_STATUS_REG_OFFSET, exp_sources);
459 EXPECT_EQ(act_sources, exp_sources);
463 TEST_F(RequestSources, LockBadArgs) {
470 TEST_F(RequestSources, LockWakeup) {
471 EXPECT_WRITE32(PWRMGR_WAKEUP_EN_REGWEN_REG_OFFSET, 0);
477 TEST_F(RequestSources, LockReset) {
478 EXPECT_WRITE32(PWRMGR_RESET_EN_REGWEN_REG_OFFSET, 0);
484 TEST_F(RequestSources, IsLockedBadArgs) {
503 TEST_F(RequestSources, IsLockedWakeup) {
504 for (
auto exp_val : kAllBools) {
505 EXPECT_READ32(PWRMGR_WAKEUP_EN_REGWEN_REG_OFFSET,
507 .offset = PWRMGR_WAKEUP_EN_REGWEN_EN_BIT,
511 bool is_locked = !exp_val;
514 EXPECT_EQ(is_locked, exp_val);
518 TEST_F(RequestSources, IsLockedReset) {
519 for (
auto exp_val : kAllBools) {
520 EXPECT_READ32(PWRMGR_RESET_EN_REGWEN_REG_OFFSET,
522 .offset = PWRMGR_RESET_EN_REGWEN_EN_BIT,
526 bool is_locked = !exp_val;
529 EXPECT_EQ(is_locked, exp_val);
544 TEST_F(WakeupRecording, SetEnabled) {
545 for (
auto new_state : kAllToggles) {
546 EXPECT_WRITE32(PWRMGR_WAKE_INFO_CAPTURE_DIS_REG_OFFSET,
548 .offset = PWRMGR_WAKE_INFO_CAPTURE_DIS_VAL_BIT,
557 TEST_F(WakeupRecording, GetEnabledBadArgs) {
568 TEST_F(WakeupRecording, GetEnabled) {
569 for (
auto exp_val : kAllToggles) {
570 EXPECT_READ32(PWRMGR_WAKE_INFO_CAPTURE_DIS_REG_OFFSET,
572 .offset = PWRMGR_WAKE_INFO_CAPTURE_DIS_VAL_BIT,
580 EXPECT_EQ(is_enabled, exp_val);
584 TEST_F(WakeupRecording, GetReasonBadArgs) {
595 testing::Matcher<dif_pwrmgr_wakeup_reason_t>
Eq(
597 return testing::AllOf(
599 testing::Field(
"request_sources",
604 TEST_F(WakeupRecording, GetReason) {
609 std::initializer_list<mock_mmio::BitField> read_val;
616 std::array<TestCase, 10> test_cases = {{
626 .request_sources = 0,
632 .offset = PWRMGR_WAKE_INFO_ABORT_BIT,
636 .offset = PWRMGR_WAKE_INFO_FALL_THROUGH_BIT,
640 .offset = PWRMGR_PARAM_SYSRST_CTRL_AON_WKUP_REQ_IDX,
644 .offset = PWRMGR_PARAM_ADC_CTRL_AON_WKUP_REQ_IDX,
648 .offset = PWRMGR_PARAM_PINMUX_AON_PIN_WKUP_REQ_IDX,
652 .offset = PWRMGR_PARAM_PINMUX_AON_USB_WKUP_REQ_IDX,
656 .offset = PWRMGR_PARAM_AON_TIMER_AON_WKUP_REQ_IDX,
660 .offset = PWRMGR_PARAM_SENSOR_CTRL_AON_WKUP_REQ_IDX,
666 .request_sources = kDifPwrmgrWakeupRequestSourceOne |
667 kDifPwrmgrWakeupRequestSourceTwo |
668 kDifPwrmgrWakeupRequestSourceThree |
669 kDifPwrmgrWakeupRequestSourceFour |
670 kDifPwrmgrWakeupRequestSourceFive |
671 kDifPwrmgrWakeupRequestSourceSix},
676 .offset = PWRMGR_WAKE_INFO_ABORT_BIT,
682 .request_sources = 0,
688 .offset = PWRMGR_WAKE_INFO_FALL_THROUGH_BIT,
694 .request_sources = 0,
700 .offset = PWRMGR_PARAM_SYSRST_CTRL_AON_WKUP_REQ_IDX,
706 .request_sources = kDifPwrmgrWakeupRequestSourceOne,
711 .offset = PWRMGR_PARAM_ADC_CTRL_AON_WKUP_REQ_IDX,
717 .request_sources = kDifPwrmgrWakeupRequestSourceTwo,
722 .offset = PWRMGR_PARAM_PINMUX_AON_PIN_WKUP_REQ_IDX,
728 .request_sources = kDifPwrmgrWakeupRequestSourceThree,
733 .offset = PWRMGR_PARAM_PINMUX_AON_USB_WKUP_REQ_IDX,
739 .request_sources = kDifPwrmgrWakeupRequestSourceFour,
744 .offset = PWRMGR_PARAM_AON_TIMER_AON_WKUP_REQ_IDX,
750 .request_sources = kDifPwrmgrWakeupRequestSourceFive,
755 .offset = PWRMGR_PARAM_SENSOR_CTRL_AON_WKUP_REQ_IDX,
761 .request_sources = kDifPwrmgrWakeupRequestSourceSix,
766 for (
const auto &test_case : test_cases) {
767 EXPECT_READ32(PWRMGR_WAKE_INFO_REG_OFFSET, test_case.read_val);
771 EXPECT_THAT(wakeup_reason,
Eq(test_case.exp_output));
775 TEST_F(WakeupRecording, ClearReasonBadArgs) {
779 TEST_F(WakeupRecording, ClearReason) {
780 EXPECT_WRITE32(PWRMGR_WAKE_INFO_REG_OFFSET,
781 std::numeric_limits<uint32_t>::max());
795 TEST_F(FatalErrorTest, GetCodes) {
797 EXPECT_READ32(PWRMGR_FAULT_STATUS_REG_OFFSET, 6);