blob: 1b081d91071fb7848152866b36dfabc5bcae4467 [file] [log] [blame]
Silvestrs Timofejevs4b446352021-03-16 10:49:49 +00001// Copyright lowRISC contributors.
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/lib/dif/dif_aon_timer.h"
6
7#include "gtest/gtest.h"
8#include "sw/device/lib/base/bitfield.h"
9#include "sw/device/lib/base/mmio.h"
Drew Macraef9f2e5f2022-06-22 15:57:07 -040010#include "sw/device/lib/base/mock_mmio.h"
Timothy Trippel4a8e2ce2021-10-06 00:19:34 +000011#include "sw/device/lib/dif/dif_base.h"
Miguel Young de la Sota5129eab2022-03-10 14:15:51 -050012#include "sw/device/lib/dif/dif_test_base.h"
Silvestrs Timofejevs4b446352021-03-16 10:49:49 +000013
14#include "aon_timer_regs.h" // Generated.
15
16namespace dif_aon_timer_unittest {
17namespace {
18using mock_mmio::MmioTest;
19using mock_mmio::MockDevice;
20using testing::Each;
21using testing::Eq;
22using testing::Test;
23
24class AonTimerTest : public Test, public MmioTest {
25 protected:
Timothy Trippel4a8e2ce2021-10-06 00:19:34 +000026 dif_aon_timer_t aon_ = {.base_addr = dev().region()};
Silvestrs Timofejevs4b446352021-03-16 10:49:49 +000027};
28
Silvestrs Timofejevs4b446352021-03-16 10:49:49 +000029class WakeupStartTest : public AonTimerTest {};
30
31TEST_F(WakeupStartTest, NullArgs) {
Miguel Young de la Sotaf0896512022-03-10 14:17:42 -050032 EXPECT_DIF_BADARG(dif_aon_timer_wakeup_start(nullptr, 1, 1));
Silvestrs Timofejevs4b446352021-03-16 10:49:49 +000033}
34
35TEST_F(WakeupStartTest, BadPrescaler) {
Miguel Young de la Sotaf0896512022-03-10 14:17:42 -050036 EXPECT_DIF_BADARG(dif_aon_timer_wakeup_start(
37 &aon_, 1, AON_TIMER_WKUP_CTRL_PRESCALER_MASK + 1));
Silvestrs Timofejevs4b446352021-03-16 10:49:49 +000038}
39
40TEST_F(WakeupStartTest, Success) {
41 EXPECT_READ32(AON_TIMER_WKUP_CTRL_REG_OFFSET, 0);
42 EXPECT_WRITE32(AON_TIMER_WKUP_CTRL_REG_OFFSET,
43 {
44 {AON_TIMER_WKUP_CTRL_ENABLE_BIT, false},
45 });
46 EXPECT_WRITE32(AON_TIMER_WKUP_COUNT_REG_OFFSET, 0);
Eli Kim49ffa572022-11-29 16:29:18 -080047 EXPECT_WRITE32(AON_TIMER_WKUP_THOLD_REG_OFFSET, 0);
Silvestrs Timofejevs4b446352021-03-16 10:49:49 +000048 EXPECT_WRITE32(AON_TIMER_WKUP_CTRL_REG_OFFSET,
49 {
50 {
51 AON_TIMER_WKUP_CTRL_PRESCALER_OFFSET,
52 AON_TIMER_WKUP_CTRL_PRESCALER_MASK,
53 },
54 {AON_TIMER_WKUP_CTRL_ENABLE_BIT, true},
55 });
56
Miguel Young de la Sota5129eab2022-03-10 14:15:51 -050057 EXPECT_DIF_OK(
58 dif_aon_timer_wakeup_start(&aon_, 1, AON_TIMER_WKUP_CTRL_PRESCALER_MASK));
Silvestrs Timofejevs4b446352021-03-16 10:49:49 +000059}
60
61class WakeupStopTest : public AonTimerTest {};
62
63TEST_F(WakeupStopTest, NullArgs) {
Miguel Young de la Sotaf0896512022-03-10 14:17:42 -050064 EXPECT_DIF_BADARG(dif_aon_timer_wakeup_stop(nullptr));
Silvestrs Timofejevs4b446352021-03-16 10:49:49 +000065}
66
67TEST_F(WakeupStopTest, Success) {
68 EXPECT_READ32(AON_TIMER_WKUP_CTRL_REG_OFFSET,
69 {
70 {AON_TIMER_WKUP_CTRL_ENABLE_BIT, true},
71 });
72 EXPECT_WRITE32(AON_TIMER_WKUP_CTRL_REG_OFFSET,
73 {
74 {AON_TIMER_WKUP_CTRL_ENABLE_BIT, false},
75 });
76
Miguel Young de la Sota5129eab2022-03-10 14:15:51 -050077 EXPECT_DIF_OK(dif_aon_timer_wakeup_stop(&aon_));
Silvestrs Timofejevs4b446352021-03-16 10:49:49 +000078}
79
80class WakeupRestartTest : public AonTimerTest {};
81
82TEST_F(WakeupRestartTest, NullArgs) {
Miguel Young de la Sotaf0896512022-03-10 14:17:42 -050083 EXPECT_DIF_BADARG(dif_aon_timer_wakeup_restart(nullptr));
Silvestrs Timofejevs4b446352021-03-16 10:49:49 +000084}
85
86TEST_F(WakeupRestartTest, Success) {
87 EXPECT_WRITE32(AON_TIMER_WKUP_COUNT_REG_OFFSET, 0);
88 EXPECT_READ32(AON_TIMER_WKUP_CTRL_REG_OFFSET, 0);
89 EXPECT_WRITE32(AON_TIMER_WKUP_CTRL_REG_OFFSET,
90 {
91 {AON_TIMER_WKUP_CTRL_ENABLE_BIT, true},
92 });
93
Miguel Young de la Sota5129eab2022-03-10 14:15:51 -050094 EXPECT_DIF_OK(dif_aon_timer_wakeup_restart(&aon_));
Silvestrs Timofejevs4b446352021-03-16 10:49:49 +000095}
96
97class WakeupGetCountTest : public AonTimerTest {};
98
99TEST_F(WakeupGetCountTest, NullArgs) {
Miguel Young de la Sotaf0896512022-03-10 14:17:42 -0500100 EXPECT_DIF_BADARG(dif_aon_timer_wakeup_get_count(nullptr, nullptr));
101 EXPECT_DIF_BADARG(dif_aon_timer_wakeup_get_count(&aon_, nullptr));
Silvestrs Timofejevs4b446352021-03-16 10:49:49 +0000102 uint32_t count;
Miguel Young de la Sotaf0896512022-03-10 14:17:42 -0500103 EXPECT_DIF_BADARG(dif_aon_timer_wakeup_get_count(nullptr, &count));
Silvestrs Timofejevs4b446352021-03-16 10:49:49 +0000104}
105
106TEST_F(WakeupGetCountTest, Success) {
107 EXPECT_READ32(AON_TIMER_WKUP_COUNT_REG_OFFSET, 0xA5A5A5A5);
108
109 uint32_t count;
Miguel Young de la Sota5129eab2022-03-10 14:15:51 -0500110 EXPECT_DIF_OK(dif_aon_timer_wakeup_get_count(&aon_, &count));
Silvestrs Timofejevs4b446352021-03-16 10:49:49 +0000111 EXPECT_EQ(count, 0xA5A5A5A5);
112}
113
114class WatchdogStartTest : public AonTimerTest {
115 protected:
116 void SuccessCommon() {
117 EXPECT_READ32(AON_TIMER_WDOG_REGWEN_REG_OFFSET, 1);
118 EXPECT_READ32(AON_TIMER_WDOG_CTRL_REG_OFFSET, 0);
119 EXPECT_WRITE32(AON_TIMER_WDOG_CTRL_REG_OFFSET,
120 {
121 {AON_TIMER_WDOG_CTRL_ENABLE_BIT, false},
122 });
123 EXPECT_WRITE32(AON_TIMER_WDOG_COUNT_REG_OFFSET, 0);
Eli Kim49ffa572022-11-29 16:29:18 -0800124 // below BARK/BITE are the call value - 1 to accomodate the AON_TIMER IP
125 // characteristic
126 EXPECT_WRITE32(AON_TIMER_WDOG_BARK_THOLD_REG_OFFSET, 0xA5A5A5A4);
127 EXPECT_WRITE32(AON_TIMER_WDOG_BITE_THOLD_REG_OFFSET, 0x5A5A5A59);
Silvestrs Timofejevs4b446352021-03-16 10:49:49 +0000128 }
129};
130
131TEST_F(WatchdogStartTest, NullArgs) {
Miguel Young de la Sotaf0896512022-03-10 14:17:42 -0500132 EXPECT_DIF_BADARG(dif_aon_timer_watchdog_start(nullptr, 1, 1, false, false));
Silvestrs Timofejevs4b446352021-03-16 10:49:49 +0000133}
134
135TEST_F(WatchdogStartTest, Locked) {
136 EXPECT_READ32(AON_TIMER_WDOG_REGWEN_REG_OFFSET, 0);
137 EXPECT_EQ(dif_aon_timer_watchdog_start(&aon_, 1, 1, false, false),
Timothy Trippel4a8e2ce2021-10-06 00:19:34 +0000138 kDifLocked);
Silvestrs Timofejevs4b446352021-03-16 10:49:49 +0000139}
140
141TEST_F(WatchdogStartTest, Success) {
142 SuccessCommon();
143
144 EXPECT_WRITE32(AON_TIMER_WDOG_CTRL_REG_OFFSET,
145 {
146 {
147 AON_TIMER_WDOG_CTRL_PAUSE_IN_SLEEP_BIT,
148 false,
149 },
150 {AON_TIMER_WDOG_CTRL_ENABLE_BIT, true},
151 });
152
Miguel Young de la Sota5129eab2022-03-10 14:15:51 -0500153 EXPECT_DIF_OK(dif_aon_timer_watchdog_start(&aon_, 0xA5A5A5A5, 0x5A5A5A5A,
154 false, false));
Silvestrs Timofejevs4b446352021-03-16 10:49:49 +0000155}
156
157TEST_F(WatchdogStartTest, SuccessPauseInSleep) {
158 SuccessCommon();
159
160 EXPECT_WRITE32(AON_TIMER_WDOG_CTRL_REG_OFFSET,
161 {
162 {
163 AON_TIMER_WDOG_CTRL_PAUSE_IN_SLEEP_BIT,
164 true,
165 },
166 {AON_TIMER_WDOG_CTRL_ENABLE_BIT, true},
167 });
168
Miguel Young de la Sota5129eab2022-03-10 14:15:51 -0500169 EXPECT_DIF_OK(
170 dif_aon_timer_watchdog_start(&aon_, 0xA5A5A5A5, 0x5A5A5A5A, true, false));
Silvestrs Timofejevs4b446352021-03-16 10:49:49 +0000171}
172
173TEST_F(WatchdogStartTest, SuccessLock) {
174 SuccessCommon();
175
176 EXPECT_WRITE32(AON_TIMER_WDOG_CTRL_REG_OFFSET,
177 {
178 {
179 AON_TIMER_WDOG_CTRL_PAUSE_IN_SLEEP_BIT,
180 false,
181 },
182 {AON_TIMER_WDOG_CTRL_ENABLE_BIT, true},
183 });
184
Silvestrs Timofejevs4b446352021-03-16 10:49:49 +0000185 EXPECT_WRITE32(AON_TIMER_WDOG_REGWEN_REG_OFFSET, 1);
186
Miguel Young de la Sota5129eab2022-03-10 14:15:51 -0500187 EXPECT_DIF_OK(
188 dif_aon_timer_watchdog_start(&aon_, 0xA5A5A5A5, 0x5A5A5A5A, false, true));
Silvestrs Timofejevs4b446352021-03-16 10:49:49 +0000189}
190
191TEST_F(WatchdogStartTest, SuccessPauseInSleepAndLock) {
192 SuccessCommon();
193
194 EXPECT_WRITE32(AON_TIMER_WDOG_CTRL_REG_OFFSET,
195 {
196 {
197 AON_TIMER_WDOG_CTRL_PAUSE_IN_SLEEP_BIT,
198 true,
199 },
200 {AON_TIMER_WDOG_CTRL_ENABLE_BIT, true},
201 });
202
Silvestrs Timofejevs4b446352021-03-16 10:49:49 +0000203 EXPECT_WRITE32(AON_TIMER_WDOG_REGWEN_REG_OFFSET, 1);
204
Miguel Young de la Sota5129eab2022-03-10 14:15:51 -0500205 EXPECT_DIF_OK(
206 dif_aon_timer_watchdog_start(&aon_, 0xA5A5A5A5, 0x5A5A5A5A, true, true));
Silvestrs Timofejevs4b446352021-03-16 10:49:49 +0000207}
208
209class WatchdogStopTest : public AonTimerTest {};
210
211TEST_F(WatchdogStopTest, NullArgs) {
Miguel Young de la Sotaf0896512022-03-10 14:17:42 -0500212 EXPECT_DIF_BADARG(dif_aon_timer_watchdog_stop(nullptr));
Silvestrs Timofejevs4b446352021-03-16 10:49:49 +0000213}
214
215TEST_F(WatchdogStopTest, Locked) {
216 EXPECT_READ32(AON_TIMER_WDOG_REGWEN_REG_OFFSET, 0);
217
Timothy Trippel4a8e2ce2021-10-06 00:19:34 +0000218 EXPECT_EQ(dif_aon_timer_watchdog_stop(&aon_), kDifLocked);
Silvestrs Timofejevs4b446352021-03-16 10:49:49 +0000219}
220
221TEST_F(WatchdogStopTest, Success) {
222 EXPECT_READ32(AON_TIMER_WDOG_REGWEN_REG_OFFSET, 1);
223 EXPECT_READ32(AON_TIMER_WDOG_CTRL_REG_OFFSET,
224 {
225 {AON_TIMER_WDOG_CTRL_ENABLE_BIT, true},
226 });
227 EXPECT_WRITE32(AON_TIMER_WDOG_CTRL_REG_OFFSET,
228 {
229 {AON_TIMER_WDOG_CTRL_ENABLE_BIT, false},
230 });
231
Miguel Young de la Sota5129eab2022-03-10 14:15:51 -0500232 EXPECT_DIF_OK(dif_aon_timer_watchdog_stop(&aon_));
Silvestrs Timofejevs4b446352021-03-16 10:49:49 +0000233}
234
235class WatchdogRestartTest : public AonTimerTest {};
236
237TEST_F(WatchdogRestartTest, NullArgs) {
Miguel Young de la Sotaf0896512022-03-10 14:17:42 -0500238 EXPECT_DIF_BADARG(dif_aon_timer_watchdog_restart(nullptr));
Silvestrs Timofejevs4b446352021-03-16 10:49:49 +0000239}
240
241TEST_F(WatchdogRestartTest, Locked) {
242 EXPECT_READ32(AON_TIMER_WDOG_REGWEN_REG_OFFSET, 0);
Timothy Trippel4a8e2ce2021-10-06 00:19:34 +0000243 EXPECT_EQ(dif_aon_timer_watchdog_restart(&aon_), kDifLocked);
Silvestrs Timofejevs4b446352021-03-16 10:49:49 +0000244}
245
246TEST_F(WatchdogRestartTest, Success) {
247 EXPECT_READ32(AON_TIMER_WDOG_REGWEN_REG_OFFSET, 1);
248 EXPECT_WRITE32(AON_TIMER_WDOG_COUNT_REG_OFFSET, 0);
249 EXPECT_READ32(AON_TIMER_WDOG_CTRL_REG_OFFSET, 0);
250 EXPECT_WRITE32(AON_TIMER_WDOG_CTRL_REG_OFFSET,
251 {
252 {AON_TIMER_WDOG_CTRL_ENABLE_BIT, true},
253 });
254
Miguel Young de la Sota5129eab2022-03-10 14:15:51 -0500255 EXPECT_DIF_OK(dif_aon_timer_watchdog_restart(&aon_));
Silvestrs Timofejevs4b446352021-03-16 10:49:49 +0000256}
257
258class WatchdogGetCountTest : public AonTimerTest {};
259
260TEST_F(WatchdogGetCountTest, NullArgs) {
Miguel Young de la Sotaf0896512022-03-10 14:17:42 -0500261 EXPECT_DIF_BADARG(dif_aon_timer_watchdog_get_count(nullptr, nullptr));
262 EXPECT_DIF_BADARG(dif_aon_timer_watchdog_get_count(&aon_, nullptr));
Silvestrs Timofejevs4b446352021-03-16 10:49:49 +0000263 uint32_t count;
Miguel Young de la Sotaf0896512022-03-10 14:17:42 -0500264 EXPECT_DIF_BADARG(dif_aon_timer_watchdog_get_count(nullptr, &count));
Silvestrs Timofejevs4b446352021-03-16 10:49:49 +0000265}
266
267TEST_F(WatchdogGetCountTest, Success) {
268 EXPECT_READ32(AON_TIMER_WDOG_COUNT_REG_OFFSET, 0xA5A5A5A5);
269
270 uint32_t count;
Miguel Young de la Sota5129eab2022-03-10 14:15:51 -0500271 EXPECT_DIF_OK(dif_aon_timer_watchdog_get_count(&aon_, &count));
Silvestrs Timofejevs4b446352021-03-16 10:49:49 +0000272 EXPECT_EQ(count, 0xA5A5A5A5);
273}
274
275class WatchdogPetTest : public AonTimerTest {};
276
277TEST_F(WatchdogPetTest, NullArgs) {
Miguel Young de la Sotaf0896512022-03-10 14:17:42 -0500278 EXPECT_DIF_BADARG(dif_aon_timer_watchdog_pet(nullptr));
Silvestrs Timofejevs4b446352021-03-16 10:49:49 +0000279}
280
281TEST_F(WatchdogPetTest, Success) {
282 EXPECT_WRITE32(AON_TIMER_WDOG_COUNT_REG_OFFSET, 0);
283
Miguel Young de la Sota5129eab2022-03-10 14:15:51 -0500284 EXPECT_DIF_OK(dif_aon_timer_watchdog_pet(&aon_));
Silvestrs Timofejevs4b446352021-03-16 10:49:49 +0000285}
286
287class WatchdogLockTest : public AonTimerTest {};
288
289TEST_F(WatchdogLockTest, NullArgs) {
Miguel Young de la Sotaf0896512022-03-10 14:17:42 -0500290 EXPECT_DIF_BADARG(dif_aon_timer_watchdog_lock(nullptr));
Silvestrs Timofejevs4b446352021-03-16 10:49:49 +0000291}
292
293TEST_F(WatchdogLockTest, Success) {
Silvestrs Timofejevs4b446352021-03-16 10:49:49 +0000294 EXPECT_WRITE32(AON_TIMER_WDOG_REGWEN_REG_OFFSET, 1);
295
Miguel Young de la Sota5129eab2022-03-10 14:15:51 -0500296 EXPECT_DIF_OK(dif_aon_timer_watchdog_lock(&aon_));
Silvestrs Timofejevs4b446352021-03-16 10:49:49 +0000297}
298
299class WatchdogIsLockedTest : public AonTimerTest {};
300
301TEST_F(WatchdogIsLockedTest, NullArgs) {
Miguel Young de la Sotaf0896512022-03-10 14:17:42 -0500302 EXPECT_DIF_BADARG(dif_aon_timer_watchdog_is_locked(nullptr, nullptr));
303 EXPECT_DIF_BADARG(dif_aon_timer_watchdog_is_locked(&aon_, nullptr));
Silvestrs Timofejevs4b446352021-03-16 10:49:49 +0000304 bool is_locked;
Miguel Young de la Sotaf0896512022-03-10 14:17:42 -0500305 EXPECT_DIF_BADARG(dif_aon_timer_watchdog_is_locked(nullptr, &is_locked));
Silvestrs Timofejevs4b446352021-03-16 10:49:49 +0000306}
307
308TEST_F(WatchdogIsLockedTest, Success) {
309 EXPECT_READ32(AON_TIMER_WDOG_REGWEN_REG_OFFSET, 1);
310
311 bool is_locked;
Miguel Young de la Sota5129eab2022-03-10 14:15:51 -0500312 EXPECT_DIF_OK(dif_aon_timer_watchdog_is_locked(&aon_, &is_locked));
Silvestrs Timofejevs4b446352021-03-16 10:49:49 +0000313 EXPECT_EQ(is_locked, false);
314}
315
316TEST_F(WatchdogIsLockedTest, SuccessLocked) {
317 EXPECT_READ32(AON_TIMER_WDOG_REGWEN_REG_OFFSET, 0);
318
319 bool is_locked;
Miguel Young de la Sota5129eab2022-03-10 14:15:51 -0500320 EXPECT_DIF_OK(dif_aon_timer_watchdog_is_locked(&aon_, &is_locked));
Silvestrs Timofejevs4b446352021-03-16 10:49:49 +0000321 EXPECT_EQ(is_locked, true);
322}
323
Silvestrs Timofejevs4b446352021-03-16 10:49:49 +0000324} // namespace
325} // namespace dif_aon_timer_unittest