blob: c56c5466e2d8d7765ee2bebb4dd283267bc8793b [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_sensor_ctrl.h"
#include "gtest/gtest.h"
#include "sw/device/lib/base/mmio.h"
#include "sw/device/lib/base/mock_mmio.h"
#include "sw/device/lib/base/multibits.h"
#include "sw/device/lib/dif/dif_base.h"
#include "sw/device/lib/dif/dif_test_base.h"
#include "sensor_ctrl_regs.h" // Generated.
namespace dif_sensor_ctrl_unittest {
namespace {
using mock_mmio::MmioTest;
using mock_mmio::MockDevice;
using testing::Test;
class SensorCtrlTest : public Test, public MmioTest {
protected:
void SetUp() {
ASSERT_DIF_OK(dif_sensor_ctrl_init(dev().region(), &sensor_ctrl));
}
dif_sensor_ctrl_t sensor_ctrl;
};
TEST_F(SensorCtrlTest, BadArgs) {
uint32_t good_idx = 0;
uint32_t bad_idx = SENSOR_CTRL_PARAM_NUM_ALERT_EVENTS + 1;
dif_toggle_t toggle_arg{};
dif_sensor_ctrl_events_t events_arg{};
dif_sensor_ctrl_io_power_status_t power_arg{};
EXPECT_DIF_BADARG(dif_sensor_ctrl_lock_cfg(nullptr));
EXPECT_DIF_BADARG(
dif_sensor_ctrl_set_ast_event_trigger(nullptr, good_idx, toggle_arg));
EXPECT_DIF_BADARG(
dif_sensor_ctrl_set_ast_event_trigger(&sensor_ctrl, bad_idx, toggle_arg));
EXPECT_DIF_BADARG(
dif_sensor_ctrl_set_alert_fatal(nullptr, good_idx, toggle_arg));
EXPECT_DIF_BADARG(
dif_sensor_ctrl_set_alert_fatal(&sensor_ctrl, bad_idx, toggle_arg));
EXPECT_DIF_BADARG(dif_sensor_ctrl_get_recov_events(nullptr, &events_arg));
EXPECT_DIF_BADARG(dif_sensor_ctrl_get_recov_events(&sensor_ctrl, nullptr));
EXPECT_DIF_BADARG(dif_sensor_ctrl_clear_recov_event(nullptr, good_idx));
EXPECT_DIF_BADARG(dif_sensor_ctrl_clear_recov_event(&sensor_ctrl, bad_idx));
EXPECT_DIF_BADARG(dif_sensor_ctrl_get_fatal_events(nullptr, &events_arg));
EXPECT_DIF_BADARG(dif_sensor_ctrl_get_fatal_events(&sensor_ctrl, nullptr));
EXPECT_DIF_BADARG(
dif_sensor_ctrl_get_ast_init_done_status(nullptr, &toggle_arg));
EXPECT_DIF_BADARG(
dif_sensor_ctrl_get_ast_init_done_status(&sensor_ctrl, nullptr));
EXPECT_DIF_BADARG(dif_sensor_ctrl_get_io_power_status(nullptr, &power_arg));
EXPECT_DIF_BADARG(dif_sensor_ctrl_get_io_power_status(&sensor_ctrl, nullptr));
}
TEST_F(SensorCtrlTest, TriggerEvents) {
for (size_t i = 0; i < SENSOR_CTRL_PARAM_NUM_ALERT_EVENTS; i++) {
EXPECT_READ32(SENSOR_CTRL_ALERT_TRIG_REG_OFFSET, 0);
EXPECT_WRITE32(SENSOR_CTRL_ALERT_TRIG_REG_OFFSET, 1 << i);
EXPECT_DIF_OK(dif_sensor_ctrl_set_ast_event_trigger(&sensor_ctrl, i,
kDifToggleEnabled));
}
for (size_t i = 0; i < SENSOR_CTRL_PARAM_NUM_ALERT_EVENTS; i++) {
EXPECT_READ32(SENSOR_CTRL_ALERT_TRIG_REG_OFFSET, -1);
EXPECT_WRITE32(SENSOR_CTRL_ALERT_TRIG_REG_OFFSET, ~(1 << i));
EXPECT_DIF_OK(dif_sensor_ctrl_set_ast_event_trigger(&sensor_ctrl, i,
kDifToggleDisabled));
}
}
TEST_F(SensorCtrlTest, AlertFatality) {
for (size_t i = 0; i < SENSOR_CTRL_PARAM_NUM_ALERT_EVENTS; i++) {
EXPECT_READ32(SENSOR_CTRL_CFG_REGWEN_REG_OFFSET, 1);
EXPECT_READ32(SENSOR_CTRL_FATAL_ALERT_EN_REG_OFFSET, 0);
EXPECT_WRITE32(SENSOR_CTRL_FATAL_ALERT_EN_REG_OFFSET, 1 << i);
EXPECT_DIF_OK(
dif_sensor_ctrl_set_alert_fatal(&sensor_ctrl, i, kDifToggleEnabled));
}
for (size_t i = 0; i < SENSOR_CTRL_PARAM_NUM_ALERT_EVENTS; i++) {
EXPECT_READ32(SENSOR_CTRL_CFG_REGWEN_REG_OFFSET, 1);
EXPECT_READ32(SENSOR_CTRL_FATAL_ALERT_EN_REG_OFFSET, -1);
EXPECT_WRITE32(SENSOR_CTRL_FATAL_ALERT_EN_REG_OFFSET, ~(1 << i));
EXPECT_DIF_OK(
dif_sensor_ctrl_set_alert_fatal(&sensor_ctrl, i, kDifToggleDisabled));
}
EXPECT_READ32(SENSOR_CTRL_CFG_REGWEN_REG_OFFSET, 0);
EXPECT_EQ(
dif_sensor_ctrl_set_alert_fatal(&sensor_ctrl, 0, kDifToggleDisabled),
kDifLocked);
EXPECT_READ32(SENSOR_CTRL_CFG_REGWEN_REG_OFFSET, 0);
EXPECT_EQ(dif_sensor_ctrl_set_alert_fatal(&sensor_ctrl, 0, kDifToggleEnabled),
kDifLocked);
}
TEST_F(SensorCtrlTest, GetRecovEvents) {
uint32_t events_mask = (1 << SENSOR_CTRL_PARAM_NUM_ALERT_EVENTS) - 1;
dif_sensor_ctrl_events_t exp_events = 0x987542 & events_mask;
dif_sensor_ctrl_events_t rcv_events;
EXPECT_READ32(SENSOR_CTRL_RECOV_ALERT_REG_OFFSET, exp_events);
EXPECT_DIF_OK(dif_sensor_ctrl_get_recov_events(&sensor_ctrl, &rcv_events));
EXPECT_EQ(exp_events, rcv_events);
exp_events = 0xdc5a8492 & events_mask;
EXPECT_READ32(SENSOR_CTRL_RECOV_ALERT_REG_OFFSET, exp_events);
EXPECT_DIF_OK(dif_sensor_ctrl_get_recov_events(&sensor_ctrl, &rcv_events));
EXPECT_EQ(exp_events, rcv_events);
}
TEST_F(SensorCtrlTest, ClearRecovEvent) {
for (size_t i = 0; i < SENSOR_CTRL_PARAM_NUM_ALERT_EVENTS; i++) {
EXPECT_WRITE32(SENSOR_CTRL_RECOV_ALERT_REG_OFFSET, (1 << i));
EXPECT_DIF_OK(dif_sensor_ctrl_clear_recov_event(&sensor_ctrl, i));
}
}
TEST_F(SensorCtrlTest, GetFatalEvents) {
uint32_t events_mask = (1 << SENSOR_CTRL_PARAM_NUM_ALERT_EVENTS) - 1;
dif_sensor_ctrl_events_t exp_events = 0x1987451 & events_mask;
dif_sensor_ctrl_events_t rcv_events;
EXPECT_READ32(SENSOR_CTRL_FATAL_ALERT_REG_OFFSET, exp_events);
EXPECT_DIF_OK(dif_sensor_ctrl_get_fatal_events(&sensor_ctrl, &rcv_events));
EXPECT_EQ(exp_events, rcv_events);
exp_events = 0x9874bac & events_mask;
EXPECT_READ32(SENSOR_CTRL_FATAL_ALERT_REG_OFFSET, exp_events);
EXPECT_DIF_OK(dif_sensor_ctrl_get_fatal_events(&sensor_ctrl, &rcv_events));
EXPECT_EQ(exp_events, rcv_events);
}
TEST_F(SensorCtrlTest, GetAstInitStatus) {
dif_toggle_t init_done;
uint32_t exp[4] = {0xa7, 0xa6, 0xbc, 0xf1};
for (size_t i = 0; i < sizeof(exp) / sizeof(uint32_t); i++) {
EXPECT_READ32(SENSOR_CTRL_STATUS_REG_OFFSET, exp[i]);
EXPECT_DIF_OK(
dif_sensor_ctrl_get_ast_init_done_status(&sensor_ctrl, &init_done));
EXPECT_EQ(bitfield_bit32_read(exp[i], SENSOR_CTRL_STATUS_AST_INIT_DONE_BIT),
init_done);
}
}
TEST_F(SensorCtrlTest, GetIoPowerStatus) {
dif_sensor_ctrl_io_power_status_t io_power_status;
uint32_t exp[4] = {0xa7, 0xa0, 0xa3, 0xa5};
for (size_t i = 0; i < sizeof(exp) / sizeof(uint32_t); i++) {
EXPECT_READ32(SENSOR_CTRL_STATUS_REG_OFFSET, exp[i]);
EXPECT_DIF_OK(
dif_sensor_ctrl_get_io_power_status(&sensor_ctrl, &io_power_status));
EXPECT_EQ(bitfield_field32_read(exp[i], SENSOR_CTRL_STATUS_IO_POK_FIELD),
io_power_status);
}
}
} // namespace
} // namespace dif_sensor_ctrl_unittest