|
| 1 | +#include <cstdint> |
1 | 2 | #include <memory> |
2 | 3 |
|
| 4 | +#include "udmaio/Logging.hpp" |
3 | 5 | #include "udmaio/UioConfig.hpp" |
4 | 6 | #define BOOST_TEST_MODULE UioMemSgdma |
5 | 7 |
|
|
10 | 12 | #include "udmaio/UioMemSgdma.hpp" |
11 | 13 | #include <boost/test/unit_test.hpp> |
12 | 14 |
|
13 | | -using namespace udmaio; |
| 15 | +namespace udmaio { |
14 | 16 |
|
15 | | -struct Fx { |
| 17 | +struct UioMemSgdmaTest : public Logger { |
16 | 18 | HwAccessorPtr hw_sgdma; |
17 | 19 | UioMemSgdma sgdma; |
18 | 20 |
|
19 | 21 | HwAccessorPtr hw_fpga_mem; |
20 | 22 | FpgaMemBufferOverAxi fpga_mem; |
21 | 23 |
|
22 | | - Fx() |
| 24 | + UioMemSgdmaTest() |
23 | 25 | : hw_sgdma{std::make_shared<udmaio::HwAccessorMock>(16 * 1024)} |
24 | 26 | , sgdma{UioDeviceLocation{hw_sgdma}} |
25 | 27 | , hw_fpga_mem{std::make_shared<HwAccessorMock>(16 * 1024)} |
26 | | - , fpga_mem{UioDeviceLocation{hw_fpga_mem}} {} |
27 | | - ~Fx() {} |
| 28 | + , fpga_mem{UioDeviceLocation{hw_fpga_mem}} |
| 29 | + , descriptors{sgdma.descriptors} |
| 30 | + , Logger("UioMemSgdmaTest") {} |
| 31 | + ~UioMemSgdmaTest() {} |
| 32 | + |
| 33 | + RegAccessorArray<UioMemSgdma::S2mmDesc, 0, 1024, UioMemSgdma::DESC_ADDR_STEP>& descriptors; |
28 | 34 |
|
29 | 35 | static constexpr size_t num_bufs = 8, buf_size = 1024; |
30 | 36 | }; |
31 | 37 |
|
32 | | -BOOST_FIXTURE_TEST_CASE(init_buffers, Fx) { |
| 38 | +BOOST_FIXTURE_TEST_CASE(init_buffers, UioMemSgdmaTest) { |
33 | 39 | sgdma.init_buffers(fpga_mem, num_bufs, buf_size); |
34 | 40 | BOOST_CHECK_MESSAGE(sgdma.get_first_desc_addr() == hw_sgdma->get_phys_region().addr, |
35 | 41 | "Descriptor address mismatch"); |
| 42 | +} |
| 43 | + |
| 44 | +void fill_buffer(HwAccessorPtr& mem, uintptr_t offs, size_t size) { |
| 45 | + assert(offs % sizeof(uint32_t) == 0); |
| 46 | + assert(size % sizeof(uint32_t) == 0); |
| 47 | + |
| 48 | + while (offs < size) { |
| 49 | + mem->_wr32(offs, offs); |
| 50 | + offs += sizeof(uint32_t); |
| 51 | + } |
| 52 | +} |
| 53 | + |
| 54 | +void check_buffer(std::vector<uint8_t> buf) { |
| 55 | + BOOST_CHECK_MESSAGE(buf.size() % sizeof(uint32_t) == 0, "Buffer size not 32bit aligned"); |
| 56 | + for (size_t i = 0; i < buf.size(); i += sizeof(uint32_t)) { |
| 57 | + 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); |
| 60 | + } |
| 61 | +} |
| 62 | + |
| 63 | +BOOST_FIXTURE_TEST_CASE(full_buffers, UioMemSgdmaTest) { |
| 64 | + sgdma.init_buffers(fpga_mem, num_bufs, buf_size); |
| 65 | + |
| 66 | + auto empty_bufs = sgdma.get_full_buffers(); |
| 67 | + BOOST_CHECK_MESSAGE(empty_bufs.size() == 0, "Empty buffers result not empty"); |
| 68 | + |
| 69 | + // Fill first buffer |
| 70 | + fill_buffer(hw_fpga_mem, 0, buf_size); |
| 71 | + |
| 72 | + auto desc = descriptors[0].rd(); |
| 73 | + desc.status.cmplt = true; |
| 74 | + desc.status.rxsof = true; |
| 75 | + desc.status.rxeof = true; |
| 76 | + desc.status.num_stored_bytes = buf_size; |
| 77 | + descriptors[0].wr(desc); |
| 78 | + |
| 79 | + // sgdma.print_descs(); |
| 80 | + |
| 81 | + auto bufs = sgdma.get_full_buffers(); |
| 82 | + BOOST_CHECK_MESSAGE(bufs.size() == 1, "Expected one full buffer, received " << bufs.size()); |
36 | 83 |
|
37 | | - sgdma.print_descs(); |
| 84 | + std::vector<uint8_t> data; |
| 85 | + fpga_mem.append_from_buf(bufs[0], data); |
| 86 | + BOOST_CHECK_MESSAGE(data.size() == buf_size, "Buffer size mismatch"); |
| 87 | + check_buffer(data); |
38 | 88 | } |
39 | 89 |
|
40 | | -BOOST_FIXTURE_TEST_CASE(foobar, Fx) {} |
| 90 | +} // namespace udmaio |
0 commit comments