[dif/sysrst_ctrl] add locking DIFs
This adds the locking DIFs and corresponding unit tests.
Signed-off-by: Timothy Trippel <ttrippel@google.com>
diff --git a/sw/device/lib/dif/dif_sysrst_ctrl.c b/sw/device/lib/dif/dif_sysrst_ctrl.c
index 9d182b4..e73e5d7 100644
--- a/sw/device/lib/dif/dif_sysrst_ctrl.c
+++ b/sw/device/lib/dif/dif_sysrst_ctrl.c
@@ -604,3 +604,25 @@
return kDifOk;
}
+
+dif_result_t dif_sysrst_ctrl_lock(const dif_sysrst_ctrl_t *sysrst_ctrl) {
+ if (sysrst_ctrl == NULL) {
+ return kDifBadArg;
+ }
+
+ mmio_region_write32(sysrst_ctrl->base_addr, SYSRST_CTRL_REGWEN_REG_OFFSET, 0);
+
+ return kDifOk;
+}
+
+dif_result_t dif_sysrst_ctrl_is_locked(const dif_sysrst_ctrl_t *sysrst_ctrl,
+ bool *is_locked) {
+ if (sysrst_ctrl == NULL || is_locked == NULL) {
+ return kDifBadArg;
+ }
+
+ *is_locked = !mmio_region_read32(sysrst_ctrl->base_addr,
+ SYSRST_CTRL_REGWEN_REG_OFFSET);
+
+ return kDifOk;
+}
diff --git a/sw/device/lib/dif/dif_sysrst_ctrl_unittest.cc b/sw/device/lib/dif/dif_sysrst_ctrl_unittest.cc
index 3d7da06..0a6bad9 100644
--- a/sw/device/lib/dif/dif_sysrst_ctrl_unittest.cc
+++ b/sw/device/lib/dif/dif_sysrst_ctrl_unittest.cc
@@ -599,5 +599,34 @@
EXPECT_DIF_OK(dif_sysrst_ctrl_ulp_wakeup_clear_status(&sysrst_ctrl_));
}
+class LockTest : public SysrstCtrlTest {};
+
+TEST_F(LockTest, NullArgs) { EXPECT_DIF_BADARG(dif_sysrst_ctrl_lock(nullptr)); }
+
+TEST_F(LockTest, Success) {
+ EXPECT_WRITE32(SYSRST_CTRL_REGWEN_REG_OFFSET, 0);
+ EXPECT_DIF_OK(dif_sysrst_ctrl_lock(&sysrst_ctrl_));
+}
+
+class IsLockedTest : public SysrstCtrlTest {};
+
+TEST_F(IsLockedTest, NullArgs) {
+ bool is_locked;
+ EXPECT_DIF_BADARG(dif_sysrst_ctrl_is_locked(nullptr, &is_locked));
+ EXPECT_DIF_BADARG(dif_sysrst_ctrl_is_locked(&sysrst_ctrl_, nullptr));
+ EXPECT_DIF_BADARG(dif_sysrst_ctrl_is_locked(nullptr, nullptr));
+}
+
+TEST_F(IsLockedTest, Success) {
+ bool is_locked;
+ EXPECT_READ32(SYSRST_CTRL_REGWEN_REG_OFFSET, 0);
+ EXPECT_DIF_OK(dif_sysrst_ctrl_is_locked(&sysrst_ctrl_, &is_locked));
+ EXPECT_TRUE(is_locked);
+
+ EXPECT_READ32(SYSRST_CTRL_REGWEN_REG_OFFSET, 1);
+ EXPECT_DIF_OK(dif_sysrst_ctrl_is_locked(&sysrst_ctrl_, &is_locked));
+ EXPECT_FALSE(is_locked);
+}
+
} // namespace
} // namespace dif_sysrst_ctrl_unittest