blob: b503d20e372e39431f1c0728302145f6017e39de [file] [log] [blame]
// Copyright lowRISC contributors.
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
// SPDX-License-Identifier: Apache-2.0
#include "sw/device/lib/dif/dif_sram_ctrl.h"
#include "gtest/gtest.h"
#include "sw/device/lib/base/mmio.h"
#include "sw/device/lib/base/multibits.h"
#include "sw/device/lib/base/testing/mock_mmio.h"
#include "sw/device/lib/dif/dif_base.h"
#include "sram_ctrl_regs.h" // Generated.
namespace dif_sram_ctrl_autogen_unittest {
namespace {
using ::mock_mmio::MmioTest;
using ::mock_mmio::MockDevice;
using ::testing::Test;
class SramCtrlTest : public Test, public MmioTest {
protected:
dif_sram_ctrl_t sram_ctrl_ = {.base_addr = dev().region()};
};
class RequestNewKeyTest : public SramCtrlTest {};
TEST_F(RequestNewKeyTest, NullArgs) {
EXPECT_EQ(dif_sram_ctrl_request_new_key(nullptr), kDifBadArg);
}
TEST_F(RequestNewKeyTest, Locked) {
EXPECT_READ32(SRAM_CTRL_CTRL_REGWEN_REG_OFFSET, 0);
EXPECT_EQ(dif_sram_ctrl_request_new_key(&sram_ctrl_), kDifLocked);
}
TEST_F(RequestNewKeyTest, Success) {
EXPECT_READ32(SRAM_CTRL_CTRL_REGWEN_REG_OFFSET, 1);
EXPECT_WRITE32(SRAM_CTRL_CTRL_REG_OFFSET,
{{SRAM_CTRL_CTRL_RENEW_SCR_KEY_BIT, true},
{SRAM_CTRL_CTRL_INIT_BIT, false}});
EXPECT_EQ(dif_sram_ctrl_request_new_key(&sram_ctrl_), kDifOk);
}
class GetStatusTest : public SramCtrlTest {};
TEST_F(GetStatusTest, NullArgs) {
dif_sram_ctrl_status_bitfield_t status;
EXPECT_EQ(dif_sram_ctrl_get_status(&sram_ctrl_, nullptr), kDifBadArg);
EXPECT_EQ(dif_sram_ctrl_get_status(nullptr, &status), kDifBadArg);
EXPECT_EQ(dif_sram_ctrl_get_status(nullptr, nullptr), kDifBadArg);
}
TEST_F(GetStatusTest, SuccessSome) {
EXPECT_READ32(SRAM_CTRL_STATUS_REG_OFFSET, 0xA5A5A5A5);
dif_sram_ctrl_status_bitfield_t status = 0;
EXPECT_EQ(dif_sram_ctrl_get_status(&sram_ctrl_, &status), kDifOk);
EXPECT_EQ(status, 0xA5A5A5A5);
}
TEST_F(GetStatusTest, SuccessAll) {
EXPECT_READ32(SRAM_CTRL_STATUS_REG_OFFSET,
std::numeric_limits<uint32_t>::max());
dif_sram_ctrl_status_bitfield_t status = 0;
EXPECT_EQ(dif_sram_ctrl_get_status(&sram_ctrl_, &status), kDifOk);
EXPECT_EQ(status, std::numeric_limits<uint32_t>::max());
}
TEST_F(GetStatusTest, SuccessNone) {
EXPECT_READ32(SRAM_CTRL_STATUS_REG_OFFSET, 0);
dif_sram_ctrl_status_bitfield_t status = std::numeric_limits<uint32_t>::max();
EXPECT_EQ(dif_sram_ctrl_get_status(&sram_ctrl_, &status), kDifOk);
EXPECT_EQ(status, 0);
}
class ExecGetEnabledTest : public SramCtrlTest {};
TEST_F(ExecGetEnabledTest, NullArgs) {
dif_toggle_t state;
EXPECT_EQ(dif_sram_ctrl_exec_get_enabled(&sram_ctrl_, nullptr), kDifBadArg);
EXPECT_EQ(dif_sram_ctrl_exec_get_enabled(nullptr, &state), kDifBadArg);
EXPECT_EQ(dif_sram_ctrl_exec_get_enabled(nullptr, nullptr), kDifBadArg);
}
TEST_F(ExecGetEnabledTest, Enabled) {
dif_toggle_t state;
EXPECT_READ32(SRAM_CTRL_EXEC_REG_OFFSET, kMultiBitBool4True);
EXPECT_EQ(dif_sram_ctrl_exec_get_enabled(&sram_ctrl_, &state), kDifOk);
EXPECT_EQ(state, kDifToggleEnabled);
}
TEST_F(ExecGetEnabledTest, Disabled) {
dif_toggle_t state = kDifToggleEnabled;
EXPECT_READ32(SRAM_CTRL_EXEC_REG_OFFSET, kMultiBitBool4False);
EXPECT_EQ(dif_sram_ctrl_exec_get_enabled(&sram_ctrl_, &state), kDifOk);
EXPECT_EQ(state, kDifToggleDisabled);
state = kDifToggleEnabled;
EXPECT_READ32(SRAM_CTRL_EXEC_REG_OFFSET, 0);
EXPECT_EQ(dif_sram_ctrl_exec_get_enabled(&sram_ctrl_, &state), kDifOk);
EXPECT_EQ(state, kDifToggleDisabled);
state = kDifToggleEnabled;
EXPECT_READ32(SRAM_CTRL_EXEC_REG_OFFSET,
std::numeric_limits<uint32_t>::max());
EXPECT_EQ(dif_sram_ctrl_exec_get_enabled(&sram_ctrl_, &state), kDifOk);
EXPECT_EQ(state, kDifToggleDisabled);
}
class ExecSetEnabledTest : public SramCtrlTest {};
TEST_F(ExecSetEnabledTest, NullArgs) {
EXPECT_EQ(dif_sram_ctrl_exec_set_enabled(nullptr, kDifToggleEnabled),
kDifBadArg);
EXPECT_EQ(dif_sram_ctrl_exec_set_enabled(nullptr, kDifToggleDisabled),
kDifBadArg);
}
TEST_F(ExecSetEnabledTest, Locked) {
EXPECT_READ32(SRAM_CTRL_EXEC_REGWEN_REG_OFFSET, 0x0);
EXPECT_EQ(dif_sram_ctrl_exec_set_enabled(&sram_ctrl_, kDifToggleEnabled),
kDifLocked);
EXPECT_READ32(SRAM_CTRL_EXEC_REGWEN_REG_OFFSET, 0x0);
EXPECT_EQ(dif_sram_ctrl_exec_set_enabled(&sram_ctrl_, kDifToggleDisabled),
kDifLocked);
}
TEST_F(ExecSetEnabledTest, Enabled) {
EXPECT_READ32(SRAM_CTRL_EXEC_REGWEN_REG_OFFSET, 0x1);
EXPECT_WRITE32(SRAM_CTRL_EXEC_REG_OFFSET, kMultiBitBool4True);
EXPECT_EQ(dif_sram_ctrl_exec_set_enabled(&sram_ctrl_, kDifToggleEnabled),
kDifOk);
EXPECT_READ32(SRAM_CTRL_EXEC_REGWEN_REG_OFFSET, 0x1);
EXPECT_WRITE32(SRAM_CTRL_EXEC_REG_OFFSET, kMultiBitBool4False);
EXPECT_EQ(dif_sram_ctrl_exec_set_enabled(&sram_ctrl_, kDifToggleDisabled),
kDifOk);
}
class LockTest : public SramCtrlTest {};
TEST_F(LockTest, NullArgs) {
EXPECT_EQ(dif_sram_ctrl_lock(nullptr, kDifSramCtrlLockCtrl), kDifBadArg);
EXPECT_EQ(dif_sram_ctrl_lock(nullptr, kDifSramCtrlLockExec), kDifBadArg);
}
TEST_F(LockTest, Error) {
dif_sram_ctrl_lock_t invalid_enum_variant =
static_cast<dif_sram_ctrl_lock_t>(std::numeric_limits<uint32_t>::max());
EXPECT_EQ(dif_sram_ctrl_lock(&sram_ctrl_, invalid_enum_variant), kDifError);
}
TEST_F(LockTest, LockCtrl) {
EXPECT_WRITE32(SRAM_CTRL_CTRL_REGWEN_REG_OFFSET, 0x0);
EXPECT_EQ(dif_sram_ctrl_lock(&sram_ctrl_, kDifSramCtrlLockCtrl), kDifOk);
EXPECT_WRITE32(SRAM_CTRL_CTRL_REGWEN_REG_OFFSET, 0x0);
EXPECT_EQ(dif_sram_ctrl_lock(&sram_ctrl_, kDifSramCtrlLockCtrl), kDifOk);
}
TEST_F(LockTest, LockExec) {
EXPECT_WRITE32(SRAM_CTRL_EXEC_REGWEN_REG_OFFSET, 0x0);
EXPECT_EQ(dif_sram_ctrl_lock(&sram_ctrl_, kDifSramCtrlLockExec), kDifOk);
EXPECT_WRITE32(SRAM_CTRL_EXEC_REGWEN_REG_OFFSET, 0x0);
EXPECT_EQ(dif_sram_ctrl_lock(&sram_ctrl_, kDifSramCtrlLockExec), kDifOk);
}
class IsLockedTest : public SramCtrlTest {};
TEST_F(IsLockedTest, NullArgs) {
bool is_locked;
EXPECT_EQ(dif_sram_ctrl_is_locked(nullptr, kDifSramCtrlLockCtrl, &is_locked),
kDifBadArg);
EXPECT_EQ(dif_sram_ctrl_is_locked(nullptr, kDifSramCtrlLockCtrl, nullptr),
kDifBadArg);
EXPECT_EQ(dif_sram_ctrl_is_locked(&sram_ctrl_, kDifSramCtrlLockCtrl, nullptr),
kDifBadArg);
EXPECT_EQ(dif_sram_ctrl_is_locked(nullptr, kDifSramCtrlLockExec, &is_locked),
kDifBadArg);
EXPECT_EQ(dif_sram_ctrl_is_locked(nullptr, kDifSramCtrlLockExec, nullptr),
kDifBadArg);
EXPECT_EQ(dif_sram_ctrl_is_locked(&sram_ctrl_, kDifSramCtrlLockExec, nullptr),
kDifBadArg);
}
TEST_F(IsLockedTest, Error) {
bool is_locked;
dif_sram_ctrl_lock_t invalid_enum_variant =
static_cast<dif_sram_ctrl_lock_t>(std::numeric_limits<uint32_t>::max());
EXPECT_EQ(
dif_sram_ctrl_is_locked(&sram_ctrl_, invalid_enum_variant, &is_locked),
kDifError);
}
TEST_F(IsLockedTest, Ctrl) {
bool is_locked = true;
EXPECT_READ32(SRAM_CTRL_CTRL_REGWEN_REG_OFFSET, 0x1);
EXPECT_EQ(
dif_sram_ctrl_is_locked(&sram_ctrl_, kDifSramCtrlLockCtrl, &is_locked),
kDifOk);
EXPECT_EQ(is_locked, false);
is_locked = false;
EXPECT_READ32(SRAM_CTRL_CTRL_REGWEN_REG_OFFSET, 0x0);
EXPECT_EQ(
dif_sram_ctrl_is_locked(&sram_ctrl_, kDifSramCtrlLockCtrl, &is_locked),
kDifOk);
EXPECT_EQ(is_locked, true);
}
TEST_F(IsLockedTest, Exec) {
bool is_locked = true;
EXPECT_READ32(SRAM_CTRL_EXEC_REGWEN_REG_OFFSET, 0x1);
EXPECT_EQ(
dif_sram_ctrl_is_locked(&sram_ctrl_, kDifSramCtrlLockExec, &is_locked),
kDifOk);
EXPECT_EQ(is_locked, false);
is_locked = false;
EXPECT_READ32(SRAM_CTRL_EXEC_REGWEN_REG_OFFSET, 0x0);
EXPECT_EQ(
dif_sram_ctrl_is_locked(&sram_ctrl_, kDifSramCtrlLockExec, &is_locked),
kDifOk);
EXPECT_EQ(is_locked, true);
}
} // namespace
} // namespace dif_sram_ctrl_autogen_unittest