Skip to content

Commit 025cfae

Browse files
committed
test: add more sgdma tests
1 parent 34eccfe commit 025cfae

1 file changed

Lines changed: 91 additions & 15 deletions

File tree

tests/test_UioMemSgdma.cpp

Lines changed: 91 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -27,16 +27,18 @@ struct UioMemSgdmaTest : public Logger {
2727
, hw_fpga_mem{std::make_shared<HwAccessorMock>(16 * 1024)}
2828
, fpga_mem{std::make_shared<FpgaMemBufferOverAxi>(UioDeviceLocation{hw_fpga_mem})}
2929
, descriptors{sgdma.descriptors}
30-
, Logger("UioMemSgdmaTest") {}
30+
, Logger("UioMemSgdmaTest") {
31+
BOOST_LOG_SEV(_lg, bls::debug) << "UioMemSgdmaTest ctor";
32+
sgdma.init_buffers(fpga_mem, num_bufs, buf_size);
33+
}
3134
~UioMemSgdmaTest() {}
3235

3336
RegAccessorArray<UioMemSgdma::S2mmDesc, 0, 1024, UioMemSgdma::DESC_ADDR_STEP>& descriptors;
3437

3538
static constexpr size_t num_bufs = 8, buf_size = 1024;
3639
};
3740

38-
BOOST_FIXTURE_TEST_CASE(init_buffers, UioMemSgdmaTest) {
39-
sgdma.init_buffers(fpga_mem, num_bufs, buf_size);
41+
BOOST_FIXTURE_TEST_CASE(desc_addr, UioMemSgdmaTest) {
4042
BOOST_CHECK_MESSAGE(sgdma.get_first_desc_addr() == hw_sgdma->get_phys_region().addr,
4143
"Descriptor address mismatch");
4244
}
@@ -45,29 +47,37 @@ void fill_buffer(HwAccessorPtr& mem, uintptr_t addr, uint32_t start_count, size_
4547
assert(addr % sizeof(uint32_t) == 0);
4648
assert(size % sizeof(uint32_t) == 0);
4749

48-
while (addr < size) {
49-
mem->_wr32(addr, addr + start_count);
50+
std::cerr << "Filling memory from 0x" << std::hex << addr << " to 0x" << std::hex << addr + size
51+
<< std::endl;
52+
53+
uintptr_t end_addr = addr + size;
54+
uint32_t count = start_count;
55+
while (addr < end_addr) {
56+
mem->_wr32(addr, count++);
5057
addr += sizeof(uint32_t);
5158
}
5259
}
5360

54-
void check_buffer(std::vector<uint8_t> buf) {
61+
void check_buffer(std::vector<uint8_t> buf, uint32_t start_count = 0) {
62+
uint32_t count = start_count;
5563
BOOST_CHECK_MESSAGE(buf.size() % sizeof(uint32_t) == 0, "Buffer size not 32bit aligned");
5664
for (size_t i = 0; i < buf.size(); i += sizeof(uint32_t)) {
5765
uint32_t val = *(reinterpret_cast<uint32_t*>(&buf[i]));
58-
BOOST_CHECK_MESSAGE(val == i,
59-
"Buffer contents mismatch at " << i << ", val = " << std::hex << val);
66+
BOOST_CHECK_MESSAGE(val == count,
67+
"Buffer contents mismatch at " << i << ", val = " << val
68+
<< " (expected " << count << ")");
69+
count++;
6070
}
6171
}
6272

63-
BOOST_FIXTURE_TEST_CASE(full_buffers, UioMemSgdmaTest) {
64-
sgdma.init_buffers(fpga_mem, num_bufs, buf_size);
65-
73+
BOOST_FIXTURE_TEST_CASE(empty_buffers, UioMemSgdmaTest) {
6674
auto empty_bufs = sgdma.get_full_buffers();
6775
BOOST_CHECK_MESSAGE(empty_bufs.size() == 0, "Empty buffers result not empty");
76+
}
6877

69-
// Fill first buffer
70-
fill_buffer(hw_fpga_mem, 0x00000000, 0, buf_size);
78+
BOOST_FIXTURE_TEST_CASE(buffer_read, UioMemSgdmaTest) {
79+
// Make a packet filling up the first buffer
80+
fill_buffer(hw_fpga_mem, buf_size * 0, 0, buf_size);
7181

7282
auto desc = descriptors[0].rd();
7383
desc.status.cmplt = true;
@@ -76,14 +86,80 @@ BOOST_FIXTURE_TEST_CASE(full_buffers, UioMemSgdmaTest) {
7686
desc.status.num_stored_bytes = buf_size;
7787
descriptors[0].wr(desc);
7888

79-
// sgdma.print_descs();
80-
8189
auto bufs = sgdma.get_full_buffers();
8290
BOOST_CHECK_MESSAGE(bufs.size() == 1, "Expected one full buffer, received " << bufs.size());
91+
BOOST_CHECK_MESSAGE(bufs[0] == 0, "Expected first buffer to be full, received " << bufs[0]);
8392

8493
std::vector<uint8_t> data = sgdma.read_buffers(bufs);
8594
BOOST_CHECK_MESSAGE(data.size() == buf_size, "Buffer size mismatch");
8695
check_buffer(data);
96+
97+
bool cmplt_reset = !descriptors[0].rd().status.cmplt;
98+
BOOST_CHECK_MESSAGE(cmplt_reset, "Complete flag is not reset");
99+
100+
// Make a packet spanning 1.5 buffers
101+
fill_buffer(hw_fpga_mem, buf_size * 1, 0, buf_size * 3 / 2);
102+
desc = descriptors[1].rd();
103+
desc.status.cmplt = true;
104+
desc.status.rxsof = true;
105+
desc.status.rxeof = false;
106+
desc.status.num_stored_bytes = buf_size;
107+
descriptors[1].wr(desc);
108+
desc = descriptors[2].rd();
109+
desc.status.cmplt = true;
110+
desc.status.rxsof = false;
111+
desc.status.rxeof = true;
112+
desc.status.num_stored_bytes = buf_size / 2;
113+
descriptors[2].wr(desc);
114+
115+
bufs = sgdma.get_full_buffers();
116+
BOOST_CHECK_MESSAGE((bufs == std::vector<size_t>{1, 2}), "Buffer indices mismatch");
117+
118+
data = sgdma.read_buffers(bufs);
119+
BOOST_CHECK_MESSAGE(data.size() == buf_size * 3 / 2, "Data size mismatch");
120+
check_buffer(data);
121+
122+
cmplt_reset = !descriptors[1].rd().status.cmplt && !descriptors[2].rd().status.cmplt;
123+
BOOST_CHECK_MESSAGE(cmplt_reset, "Complete flags are not reset");
124+
125+
// Make two packets spanning 4 buffers
126+
fill_buffer(hw_fpga_mem, buf_size * 3, 0, buf_size * 3 / 2);
127+
desc = descriptors[3].rd();
128+
desc.status.cmplt = true;
129+
desc.status.rxsof = true;
130+
desc.status.rxeof = false;
131+
desc.status.num_stored_bytes = buf_size;
132+
descriptors[3].wr(desc);
133+
desc = descriptors[4].rd();
134+
desc.status.cmplt = true;
135+
desc.status.rxsof = false;
136+
desc.status.rxeof = true;
137+
desc.status.num_stored_bytes = buf_size / 2;
138+
descriptors[4].wr(desc);
139+
140+
fill_buffer(hw_fpga_mem, buf_size * 5, 384, buf_size * 2);
141+
desc = descriptors[5].rd();
142+
desc.status.cmplt = true;
143+
desc.status.rxsof = true;
144+
desc.status.rxeof = false;
145+
desc.status.num_stored_bytes = buf_size;
146+
descriptors[5].wr(desc);
147+
desc = descriptors[6].rd();
148+
desc.status.cmplt = true;
149+
desc.status.rxsof = false;
150+
desc.status.rxeof = true;
151+
desc.status.num_stored_bytes = buf_size;
152+
descriptors[6].wr(desc);
153+
154+
bufs = sgdma.get_full_buffers();
155+
BOOST_CHECK_MESSAGE((bufs == std::vector<size_t>{3, 4, 5, 6}), "Buffer indices mismatch");
156+
157+
data = sgdma.read_buffers(bufs);
158+
BOOST_CHECK_MESSAGE(data.size() == buf_size * 7 / 2, "Data size mismatch");
159+
check_buffer(data);
160+
cmplt_reset = !descriptors[3].rd().status.cmplt && !descriptors[4].rd().status.cmplt &&
161+
!descriptors[5].rd().status.cmplt && !descriptors[6].rd().status.cmplt;
162+
BOOST_CHECK_MESSAGE(cmplt_reset, "Complete flags are not reset");
87163
}
88164

89165
} // namespace udmaio

0 commit comments

Comments
 (0)