@@ -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