Software APIs
watchdog_unittest.cc
1 // Copyright lowRISC contributors (OpenTitan project).
2 // Licensed under the Apache License, Version 2.0, see LICENSE for details.
3 // SPDX-License-Identifier: Apache-2.0
4 
5 #include "sw/device/silicon_creator/lib/drivers/watchdog.h"
6 
7 #include <array>
8 
9 #include "gtest/gtest.h"
10 #include "sw/device/lib/base/mock_abs_mmio.h"
11 #include "sw/device/silicon_creator/lib/base/mock_sec_mmio.h"
12 #include "sw/device/silicon_creator/lib/drivers/lifecycle.h"
13 #include "sw/device/silicon_creator/lib/drivers/mock_otp.h"
14 #include "sw/device/silicon_creator/testing/rom_test.h"
15 
16 #include "aon_timer_regs.h"
18 #include "otp_ctrl_regs.h"
19 #include "pwrmgr_regs.h"
20 
21 namespace watchdog_unittest {
22 namespace {
23 using ::testing::Return;
24 
26  protected:
27  void ExpectCdcSync() {
28  // The pwrmgr_cdc_sync function reads to check that the sync bit is clear,
29  // writes to the sync bit and then reads back waiting for it to clear.
30  EXPECT_ABS_READ32(pwrmgr_ + PWRMGR_CFG_CDC_SYNC_REG_OFFSET, 0);
31  EXPECT_ABS_WRITE32(pwrmgr_ + PWRMGR_CFG_CDC_SYNC_REG_OFFSET, 1);
32  EXPECT_ABS_READ32(pwrmgr_ + PWRMGR_CFG_CDC_SYNC_REG_OFFSET, 0);
33  }
34  /**
35  * Sets up expectations for `watchdog_init()`.
36  *
37  * @param enabled Whether watchdog is expected to be enabled.
38  */
39  void ExpectInit(bool enabled) {
40  const uint32_t kBiteThreshold = 0x12345678;
41  EXPECT_CALL(
42  otp_,
43  read32(
44  OTP_CTRL_PARAM_OWNER_SW_CFG_ROM_WATCHDOG_BITE_THRESHOLD_CYCLES_OFFSET))
45  .WillOnce(Return(kBiteThreshold));
46 
47  EXPECT_SEC_WRITE32(pwrmgr_ + PWRMGR_RESET_EN_REG_OFFSET,
48  {
49  {PWRMGR_RESET_EN_EN_1_BIT, true},
50  });
51  ExpectCdcSync();
52  EXPECT_SEC_WRITE32(wdog_ + AON_TIMER_WDOG_CTRL_REG_OFFSET,
53  0 << AON_TIMER_WDOG_CTRL_ENABLE_BIT);
54  EXPECT_ABS_WRITE32(wdog_ + AON_TIMER_WDOG_COUNT_REG_OFFSET, 0);
55  EXPECT_ABS_WRITE32(wdog_ + AON_TIMER_WDOG_BARK_THOLD_REG_OFFSET,
56  kBiteThreshold * 9 / 8);
57  EXPECT_SEC_WRITE32(wdog_ + AON_TIMER_WDOG_BITE_THOLD_REG_OFFSET,
58  kBiteThreshold);
59  EXPECT_SEC_WRITE32(wdog_ + AON_TIMER_WDOG_CTRL_REG_OFFSET,
60  enabled << AON_TIMER_WDOG_CTRL_ENABLE_BIT);
61  ExpectCdcSync();
62  }
63 
64  uint32_t pwrmgr_ = TOP_EARLGREY_PWRMGR_AON_BASE_ADDR;
65  uint32_t wdog_ = TOP_EARLGREY_AON_TIMER_AON_BASE_ADDR;
66  rom_test::MockAbsMmio abs_;
67  rom_test::MockSecMmio sec_;
68  rom_test::MockOtp otp_;
69 };
70 
71 TEST_F(WatchdogTest, InitializeNoOtp) {
72  constexpr std::array<lifecycle_state_t, 2> kLifecycleStates = {kLcStateTest,
73  kLcStateRma};
74  for (const auto lc : kLifecycleStates) {
75  ExpectInit(false);
76 
77  watchdog_init(lc);
78  }
79 }
80 
81 TEST_F(WatchdogTest, InitializeOtp) {
82  constexpr std::array<lifecycle_state_t, 3> kLifecycleStates = {
83  kLcStateDev, kLcStateProd, kLcStateProdEnd};
84  for (const auto lc : kLifecycleStates) {
85  ExpectInit(true);
86 
87  watchdog_init(lc);
88  }
89 }
90 
91 TEST_F(WatchdogTest, Disable) {
92  EXPECT_SEC_WRITE32(wdog_ + AON_TIMER_WDOG_CTRL_REG_OFFSET,
93  0 << AON_TIMER_WDOG_CTRL_ENABLE_BIT);
94  watchdog_disable();
95 }
96 
97 TEST_F(WatchdogTest, Pet) {
98  EXPECT_ABS_WRITE32(wdog_ + AON_TIMER_WDOG_COUNT_REG_OFFSET, 0);
99  watchdog_pet();
100 }
101 
102 TEST_F(WatchdogTest, Get) {
103  EXPECT_ABS_READ32(wdog_ + AON_TIMER_WDOG_COUNT_REG_OFFSET, 12345);
104  EXPECT_EQ(watchdog_get(), 12345);
105 }
106 
107 } // namespace
108 } // namespace watchdog_unittest