9 #include "gtest/gtest.h"
11 #include "sw/device/lib/base/mock_abs_mmio.h"
12 #include "sw/device/lib/base/mock_mmio.h"
19 namespace dif_mbx_test {
32 rom_test::MockAbsMmio mmio_;
39 public testing::WithParamInterface<dif_mbx_range_config_t> {};
44 EXPECT_WRITE32(MBX_INBOUND_BASE_ADDRESS_REG_OFFSET, range.imbx_base_addr);
45 EXPECT_WRITE32(MBX_INBOUND_LIMIT_ADDRESS_REG_OFFSET, range.imbx_limit_addr);
46 EXPECT_WRITE32(MBX_OUTBOUND_BASE_ADDRESS_REG_OFFSET, range.ombx_base_addr);
47 EXPECT_WRITE32(MBX_OUTBOUND_LIMIT_ADDRESS_REG_OFFSET, range.ombx_limit_addr);
48 EXPECT_WRITE32(MBX_ADDRESS_RANGE_VALID_REG_OFFSET, 1);
54 INSTANTIATE_TEST_SUITE_P(
55 MemoryRangeSuccessTests, MemoryRangeSuccessTests,
56 testing::ValuesIn(std::vector<dif_mbx_range_config_t>{{
57 {.imbx_base_addr = 0xD0CF2C50,
58 .imbx_limit_addr = 0xD1CF2C0F,
59 .ombx_base_addr = 0xD1CF3C0F,
60 .ombx_limit_addr = 0xD1CF3C10},
61 {.imbx_base_addr = 0x1000,
62 .imbx_limit_addr = 0x2000,
63 .ombx_base_addr = 0x3000,
64 .ombx_limit_addr = 0x4000},
65 {.imbx_base_addr = 0x1000,
66 .imbx_limit_addr = 0x1003,
67 .ombx_base_addr = 0x1004,
68 .ombx_limit_addr = 0x1007},
73 public testing::WithParamInterface<dif_mbx_range_config_t> {};
81 INSTANTIATE_TEST_SUITE_P(MemoryRangeBadArgTests, MemoryRangeBadArgTests,
82 testing::ValuesIn(std::vector<dif_mbx_range_config_t>{{
83 {.imbx_base_addr = 0x1000,
85 .ombx_base_addr = 0x2000,
86 .ombx_limit_addr = 0x4000},
87 {.imbx_base_addr = 0x1000,
88 .imbx_limit_addr = 0x5000,
89 .ombx_base_addr = 0x4000,
90 .ombx_limit_addr = 0x4000},
91 {.imbx_base_addr = 0x1000,
92 .imbx_limit_addr = 0x2000,
93 .ombx_base_addr = 0x1500,
94 .ombx_limit_addr = 0x2500},
95 {.imbx_base_addr = 0x1500,
96 .imbx_limit_addr = 0x2500,
97 .ombx_base_addr = 0x1000,
98 .ombx_limit_addr = 0x2000},
101 TEST_F(MemoryRangeBadArgTests, GetBadArg) {
111 .imbx_limit_addr = 0xD1CF2C0F,
112 .ombx_base_addr = 0xD1CF3C0F,
113 .ombx_limit_addr = 0xD1CF3C19};
115 EXPECT_READ32(MBX_INBOUND_BASE_ADDRESS_REG_OFFSET, range.imbx_base_addr);
116 EXPECT_READ32(MBX_INBOUND_LIMIT_ADDRESS_REG_OFFSET, range.imbx_limit_addr);
117 EXPECT_READ32(MBX_OUTBOUND_BASE_ADDRESS_REG_OFFSET, range.ombx_base_addr);
118 EXPECT_READ32(MBX_OUTBOUND_LIMIT_ADDRESS_REG_OFFSET, range.ombx_limit_addr);
123 EXPECT_EQ(read_range.imbx_base_addr, range.imbx_base_addr);
124 EXPECT_EQ(read_range.imbx_limit_addr, range.imbx_limit_addr);
125 EXPECT_EQ(read_range.ombx_base_addr, range.ombx_base_addr);
126 EXPECT_EQ(read_range.ombx_limit_addr, range.ombx_limit_addr);
129 TEST_F(MemoryRangeTests, GetBadArg) {
139 uint32_t doe_intr_addr, doe_intr_data;
141 EXPECT_READ32(MBX_DOE_INTR_MSG_ADDR_REG_OFFSET, 0x52001234);
142 EXPECT_READ32(MBX_DOE_INTR_MSG_DATA_REG_OFFSET, 0xFFABCDEF);
147 EXPECT_EQ(doe_intr_addr, 0x52001234);
148 EXPECT_EQ(doe_intr_data, 0xFFABCDEF);
151 TEST_F(IpiConfigurationTests, GetBadArg) {
152 uint32_t doe_intr_addr, doe_intr_data;
168 public testing::WithParamInterface<status_reg_t> {};
173 EXPECT_READ32(MBX_STATUS_REG_OFFSET, status_arg.reg);
175 bool is_busy = !status_arg.is_busy;
178 EXPECT_EQ(is_busy, status_arg.is_busy);
181 INSTANTIATE_TEST_SUITE_P(ProcessBusyTests, ProcessBusyTests,
182 testing::ValuesIn(std::vector<status_reg_t>{{
184 {1 << MBX_STATUS_BUSY_BIT,
true},
187 TEST_F(ProcessBusyTests, GetBadArg) {
198 request.data_dwords = data;
199 request.nr_dwords = 4;
201 EXPECT_READ32(MBX_INBOUND_BASE_ADDRESS_REG_OFFSET, 0x1000);
202 EXPECT_READ32(MBX_INBOUND_WRITE_PTR_REG_OFFSET, 0x1010);
204 EXPECT_ABS_READ32(0x1000, 0x123456);
205 EXPECT_ABS_READ32(0x1004, 0x456789);
206 EXPECT_ABS_READ32(0x1008, 0xDEADBEEF);
207 EXPECT_ABS_READ32(0x100C, 0xCAFEDEAD);
211 EXPECT_EQ(request.nr_dwords, 4);
212 EXPECT_EQ(request.data_dwords[0], 0x123456);
213 EXPECT_EQ(request.data_dwords[1], 0x456789);
214 EXPECT_EQ(request.data_dwords[2], 0xDEADBEEF);
215 EXPECT_EQ(request.data_dwords[3], 0xCAFEDEAD);
218 TEST_F(ProcessRequestTests, GetOutOfRangeSuccess) {
221 request.data_dwords = data;
222 request.nr_dwords = 3;
224 EXPECT_READ32(MBX_INBOUND_BASE_ADDRESS_REG_OFFSET, 0x1000);
225 EXPECT_READ32(MBX_INBOUND_WRITE_PTR_REG_OFFSET, 0x1010);
227 EXPECT_ABS_READ32(0x1000, 0x123456);
228 EXPECT_ABS_READ32(0x1004, 0x456789);
229 EXPECT_ABS_READ32(0x1008, 0xDEADBEEF);
233 EXPECT_EQ(request.nr_dwords, 3);
234 EXPECT_EQ(request.data_dwords[0], 0x123456);
235 EXPECT_EQ(request.data_dwords[1], 0x456789);
236 EXPECT_EQ(request.data_dwords[2], 0xDEADBEEF);
238 request.data_dwords = data;
239 request.nr_dwords = 1;
241 EXPECT_READ32(MBX_INBOUND_BASE_ADDRESS_REG_OFFSET, 0x100C);
242 EXPECT_READ32(MBX_INBOUND_WRITE_PTR_REG_OFFSET, 0x1010);
244 EXPECT_ABS_READ32(0x100C, 0xCAFEDEAD);
248 EXPECT_EQ(request.nr_dwords, 1);
249 EXPECT_EQ(request.data_dwords[0], 0xCAFEDEAD);
252 TEST_F(ProcessRequestTests, BadArg) {
254 request.data_dwords =
nullptr;
255 request.nr_dwords = 1;
266 std::array<uint32_t, 4> data = {0x123456, 0x456789, 0xDEADBEEF, 0xCAFEDEAD};
267 response.nr_dwords = data.size();
268 response.data_dwords = data.data();
270 EXPECT_READ32(MBX_OUTBOUND_READ_PTR_REG_OFFSET, 0x1000);
271 EXPECT_ABS_WRITE32(0x1000, data[0]);
272 EXPECT_ABS_WRITE32(0x1004, data[1]);
273 EXPECT_ABS_WRITE32(0x1008, data[2]);
274 EXPECT_ABS_WRITE32(0x100C, data[3]);
275 EXPECT_WRITE32(MBX_OUTBOUND_OBJECT_SIZE_REG_OFFSET, response.nr_dwords);
280 TEST_F(ProcessResponseTests, BadArg) {
285 response2.data_dwords =
nullptr;
286 response2.nr_dwords = 1;