9 #include "gtest/gtest.h"
11 #include "sw/device/lib/base/mock_mmio.h"
14 #include "rv_plic_regs.h"
16 namespace dif_rv_plic_unittest {
24 static_assert(RV_PLIC_PARAM_NUM_SRC == 186,
25 "PLIC instantiation parameters have changed.");
26 static_assert(RV_PLIC_PARAM_NUM_TARGET == 1,
27 "PLIC instantiation parameters have changed.");
29 constexpr uint32_t kTarget0 = 0;
30 constexpr uint32_t kFirstIrq = 1;
34 dif_rv_plic_t plic_ = {.base_addr = dev().region()};
41 for (
int i = 0; i < RV_PLIC_PARAM_NUM_SRC; ++i) {
42 ptrdiff_t offset = RV_PLIC_PRIO_0_REG_OFFSET + (
sizeof(uint32_t) * i);
43 EXPECT_WRITE32(offset, 0);
47 EXPECT_WRITE32(RV_PLIC_IE0_0_REG_OFFSET, 0);
48 EXPECT_WRITE32(RV_PLIC_IE0_1_REG_OFFSET, 0);
49 EXPECT_WRITE32(RV_PLIC_IE0_2_REG_OFFSET, 0);
50 EXPECT_WRITE32(RV_PLIC_IE0_3_REG_OFFSET, 0);
51 EXPECT_WRITE32(RV_PLIC_IE0_4_REG_OFFSET, 0);
52 EXPECT_WRITE32(RV_PLIC_IE0_5_REG_OFFSET, 0);
55 EXPECT_WRITE32(RV_PLIC_THRESHOLD0_REG_OFFSET, 0);
58 EXPECT_WRITE32(RV_PLIC_MSIP0_REG_OFFSET, 0);
64 TEST_F(ResetTest, Success) {
82 uint8_t number_of_sources = 0;
83 for (
const auto ® : kEnableRegisters) {
84 number_of_sources += (reg.last_bit + 1);
86 EXPECT_EQ(RV_PLIC_PARAM_NUM_SRC, number_of_sources)
87 <<
"make sure to update the IrqTest register arrays!";
89 EXPECT_EQ(RV_PLIC_PARAM_NUM_TARGET, 1);
96 static constexpr std::array<Register, RV_PLIC_IE0_MULTIREG_COUNT>
98 {RV_PLIC_IE0_0_REG_OFFSET, RV_PLIC_IE0_0_E_31_BIT},
99 {RV_PLIC_IE0_1_REG_OFFSET, RV_PLIC_IE0_1_E_63_BIT},
100 {RV_PLIC_IE0_2_REG_OFFSET, RV_PLIC_IE0_2_E_95_BIT},
101 {RV_PLIC_IE0_3_REG_OFFSET, RV_PLIC_IE0_3_E_127_BIT},
102 {RV_PLIC_IE0_4_REG_OFFSET, RV_PLIC_IE0_4_E_159_BIT},
103 {RV_PLIC_IE0_5_REG_OFFSET, RV_PLIC_IE0_5_E_185_BIT},
105 static constexpr std::array<Register, RV_PLIC_IP_MULTIREG_COUNT>
107 {RV_PLIC_IP_0_REG_OFFSET, RV_PLIC_IP_0_P_31_BIT},
108 {RV_PLIC_IP_1_REG_OFFSET, RV_PLIC_IP_1_P_63_BIT},
109 {RV_PLIC_IP_2_REG_OFFSET, RV_PLIC_IP_2_P_95_BIT},
110 {RV_PLIC_IP_3_REG_OFFSET, RV_PLIC_IP_3_P_127_BIT},
111 {RV_PLIC_IP_4_REG_OFFSET, RV_PLIC_IP_4_P_159_BIT},
112 {RV_PLIC_IP_5_REG_OFFSET, RV_PLIC_IP_5_P_185_BIT},
117 void ExpectIrqSetTests(
const std::array<Register, n> ®s,
bool enabled) {
118 for (
const auto ® : regs) {
119 for (uint32_t i = 0; i <= reg.last_bit; ++i) {
120 EXPECT_MASK32(reg.offset, {{i, 0x1, enabled}});
127 void ExpectIrqGetTests(
const std::array<Register, n> ®s,
bool enabled) {
128 for (
const auto ® : regs) {
129 for (
int i = 0; i <= reg.last_bit; ++i) {
130 uint32_t value = 0x1 << i;
135 EXPECT_READ32(reg.offset, value);
141 constexpr std::array<IrqTest::Register, RV_PLIC_IE0_MULTIREG_COUNT>
142 IrqTest::kEnableRegisters;
143 constexpr std::array<IrqTest::Register, RV_PLIC_IP_MULTIREG_COUNT>
144 IrqTest::kPendingRegisters;
153 TEST_F(IrqEnableSetTest, Target0Enable) {
154 ExpectIrqSetTests(kEnableRegisters,
true);
157 for (
int i = 0; i < RV_PLIC_PARAM_NUM_SRC; ++i) {
163 TEST_F(IrqEnableSetTest, Target0Disable) {
164 ExpectIrqSetTests(kEnableRegisters,
false);
167 for (
int i = 0; i < RV_PLIC_PARAM_NUM_SRC; ++i) {
180 TEST_F(IrqPrioritySetTest, PriorityInvalid) {
185 TEST_F(IrqPrioritySetTest, Success) {
186 for (
int i = 0; i < RV_PLIC_PARAM_NUM_SRC; ++i) {
188 ptrdiff_t offset = RV_PLIC_PRIO_0_REG_OFFSET + (
sizeof(uint32_t) * i);
203 TEST_F(TargetThresholdSetTest, Target0PriorityInvalid) {
208 TEST_F(TargetThresholdSetTest, Target0Success) {
232 TEST_F(IrqPendingStatusGetTest, Enabled) {
233 ExpectIrqGetTests(kPendingRegisters,
true);
236 for (
int i = 0; i < RV_PLIC_PARAM_NUM_SRC; ++i) {
245 TEST_F(IrqPendingStatusGetTest, Disabled) {
246 ExpectIrqGetTests(kPendingRegisters,
false);
249 for (
int i = 0; i < RV_PLIC_PARAM_NUM_SRC; ++i) {
259 static_assert(RV_PLIC_PARAM_NUM_TARGET == 1,
"");
271 TEST_F(IrqClaimTest, Target0Success) {
273 for (
int i = 0; i < RV_PLIC_PARAM_NUM_SRC; ++i) {
274 EXPECT_READ32(RV_PLIC_CC0_REG_OFFSET, i);
278 for (
int i = 0; i < RV_PLIC_PARAM_NUM_SRC; ++i) {
286 static_assert(RV_PLIC_PARAM_NUM_TARGET == 1,
"");
294 TEST_F(IrqCompleteTest, Target0Success) {
296 for (
int i = 0; i < RV_PLIC_PARAM_NUM_SRC; ++i) {
297 EXPECT_WRITE32(RV_PLIC_CC0_REG_OFFSET, i);
301 for (
int i = 0; i < RV_PLIC_PARAM_NUM_SRC; ++i) {
308 static_assert(RV_PLIC_PARAM_NUM_TARGET == 1,
"");
315 TEST_F(SoftwareIrqForceTest, BadTarget) {
320 TEST_F(SoftwareIrqForceTest, Target0Success) {
321 EXPECT_WRITE32(RV_PLIC_MSIP0_REG_OFFSET, 1);
326 static_assert(RV_PLIC_PARAM_NUM_TARGET == 1,
"");
333 TEST_F(SoftwareIrqAcknowledgeTest, BadTarget) {
338 TEST_F(SoftwareIrqAcknowledgeTest, Target0Success) {
339 EXPECT_WRITE32(RV_PLIC_MSIP0_REG_OFFSET, 0);
344 static_assert(RV_PLIC_PARAM_NUM_TARGET == 1,
"");
359 TEST_F(SoftwareIrqIsPendingTest, BadTarget) {
362 &plic_, RV_PLIC_PARAM_NUM_TARGET, &is_pending));
365 TEST_F(SoftwareIrqIsPendingTest, Target0Success) {
366 bool is_pending =
false;
367 EXPECT_READ32(RV_PLIC_MSIP0_REG_OFFSET, 1);
371 EXPECT_TRUE(is_pending);
375 EXPECT_READ32(RV_PLIC_MSIP0_REG_OFFSET, 0);
379 EXPECT_FALSE(is_pending);