Software APIs
watchdog_test.c
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 <stdbool.h>
6 
10 #include "sw/device/silicon_creator/lib/drivers/lifecycle.h"
11 #include "sw/device/silicon_creator/lib/manifest_def.h"
12 
13 #include "aon_timer_regs.h"
15 
16 OTTF_DEFINE_TEST_CONFIG();
17 
18 enum {
19  /**
20  * Base address of the aon_timer registers.
21  */
23 };
24 
25 #ifdef EXPECT_WATCHDOG_DISABLED
26 enum {
27  kExpectEnabled = false,
28  kExpectedWdogCtrl = 0,
29 };
30 #endif
31 
32 #ifdef EXPECT_WATCHDOG_ENABLED
33 enum {
34  kExpectEnabled = true,
35  kExpectedWdogCtrl = (1 << AON_TIMER_WDOG_CTRL_ENABLE_BIT),
36 };
37 #endif
38 
39 bool test_main(void) {
40  bool failed = false;
41 
42  uint32_t regwen = abs_mmio_read8(kBase + AON_TIMER_WDOG_REGWEN_REG_OFFSET);
43  if (regwen != AON_TIMER_WDOG_REGWEN_REG_RESVAL) {
44  LOG_ERROR("WDOG_REGWEN=%x, expected %x", regwen,
45  AON_TIMER_WDOG_REGWEN_REG_RESVAL);
46  failed = true;
47  }
48 
49  uint32_t ctrl = abs_mmio_read8(kBase + AON_TIMER_WDOG_CTRL_REG_OFFSET);
50  if (ctrl != kExpectedWdogCtrl) {
51  LOG_ERROR("WDOG_CTRL=%x, expected %x", ctrl, kExpectedWdogCtrl);
52  failed = true;
53  }
54 
55  // We only check the back and bite thresholds if the watchdog is enabled,
56  // because their values don't matter when the watchdog is disabled.
57  if (kExpectEnabled) {
58  // aon_timer does not offer a way to disable the bark interrupt. The OTP
59  // configuration should only enable a bite, so we make sure the bark
60  // interrupt is set up to happen no-earlier-than the bite, so the bark
61  // interrupt will never be processed in practice.
62  uint32_t bark_threshold =
63  abs_mmio_read32(kBase + AON_TIMER_WDOG_BARK_THOLD_REG_OFFSET);
64  if (bark_threshold < WATCHDOG_BITE_THRESHOLD) {
65  LOG_ERROR("WDOG_BARK_THOLD=%x, expected < %x", bark_threshold,
66  WATCHDOG_BITE_THRESHOLD);
67  failed = true;
68  }
69 
70  uint32_t bite_threshold =
71  abs_mmio_read32(kBase + AON_TIMER_WDOG_BITE_THOLD_REG_OFFSET);
72  if (bite_threshold != WATCHDOG_BITE_THRESHOLD) {
73  LOG_ERROR("WDOG_BITE_THOLD=%x, expected %x", bite_threshold,
74  WATCHDOG_BITE_THRESHOLD);
75  failed = true;
76  }
77  }
78 
79  return !failed;
80 }