@@ -162,4 +162,101 @@ BOOST_FIXTURE_TEST_CASE(buffer_read, UioMemSgdmaTest) {
162162 BOOST_CHECK_MESSAGE (cmplt_reset, " Complete flags are not reset" );
163163}
164164
165+ BOOST_FIXTURE_TEST_CASE (packets_read, UioMemSgdmaTest) {
166+ // Make a packet filling up the first buffer
167+ fill_buffer (hw_fpga_mem, buf_size * 0 , 0 , buf_size);
168+
169+ auto desc = descriptors[0 ].rd ();
170+ desc.status .cmplt = true ;
171+ desc.status .rxsof = true ;
172+ desc.status .rxeof = true ;
173+ desc.status .num_stored_bytes = buf_size;
174+ descriptors[0 ].wr (desc);
175+
176+ auto bufs = sgdma.get_next_packet ();
177+ BOOST_CHECK_MESSAGE (bufs.size () == 1 , " Expected one full buffer, received " << bufs.size ());
178+ BOOST_CHECK_MESSAGE (bufs[0 ] == 0 , " Expected first buffer to be full, received " << bufs[0 ]);
179+
180+ std::vector<uint8_t > data = sgdma.read_buffers (bufs);
181+ BOOST_CHECK_MESSAGE (data.size () == buf_size, " Buffer size mismatch" );
182+ check_buffer (data);
183+
184+ bool cmplt_reset = !descriptors[0 ].rd ().status .cmplt ;
185+ BOOST_CHECK_MESSAGE (cmplt_reset, " Complete flag is not reset" );
186+
187+ // Make a packet spanning 1.5 buffers
188+ fill_buffer (hw_fpga_mem, buf_size * 1 , 0 , buf_size * 3 / 2 );
189+ desc = descriptors[1 ].rd ();
190+ desc.status .cmplt = true ;
191+ desc.status .rxsof = true ;
192+ desc.status .rxeof = false ;
193+ desc.status .num_stored_bytes = buf_size;
194+ descriptors[1 ].wr (desc);
195+ desc = descriptors[2 ].rd ();
196+ desc.status .cmplt = true ;
197+ desc.status .rxsof = false ;
198+ desc.status .rxeof = true ;
199+ desc.status .num_stored_bytes = buf_size / 2 ;
200+ descriptors[2 ].wr (desc);
201+
202+ bufs = sgdma.get_next_packet ();
203+ BOOST_CHECK_MESSAGE ((bufs == std::vector<size_t >{1 , 2 }), " Buffer indices mismatch" );
204+
205+ data = sgdma.read_buffers (bufs);
206+ BOOST_CHECK_MESSAGE (data.size () == buf_size * 3 / 2 , " Data size mismatch" );
207+ check_buffer (data);
208+
209+ cmplt_reset = !descriptors[1 ].rd ().status .cmplt && !descriptors[2 ].rd ().status .cmplt ;
210+ BOOST_CHECK_MESSAGE (cmplt_reset, " Complete flags are not reset" );
211+
212+ // Make two packets spanning 4 buffers
213+ fill_buffer (hw_fpga_mem, buf_size * 3 , 1234 , buf_size * 3 / 2 );
214+ desc = descriptors[3 ].rd ();
215+ desc.status .cmplt = true ;
216+ desc.status .rxsof = true ;
217+ desc.status .rxeof = false ;
218+ desc.status .num_stored_bytes = buf_size;
219+ descriptors[3 ].wr (desc);
220+
221+ // Try to read a packet; ensure it doesn't return anything yet w/o EOF
222+ bufs = sgdma.get_next_packet ();
223+ BOOST_CHECK_MESSAGE (bufs.empty (), " Packet is not full yet" );
224+
225+ desc = descriptors[4 ].rd ();
226+ desc.status .cmplt = true ;
227+ desc.status .rxsof = false ;
228+ desc.status .rxeof = true ;
229+ desc.status .num_stored_bytes = buf_size / 2 ;
230+ descriptors[4 ].wr (desc);
231+
232+ fill_buffer (hw_fpga_mem, buf_size * 5 , 5678 , buf_size * 2 );
233+ desc = descriptors[5 ].rd ();
234+ desc.status .cmplt = true ;
235+ desc.status .rxsof = true ;
236+ desc.status .rxeof = false ;
237+ desc.status .num_stored_bytes = buf_size;
238+ descriptors[5 ].wr (desc);
239+ desc = descriptors[6 ].rd ();
240+ desc.status .cmplt = true ;
241+ desc.status .rxsof = false ;
242+ desc.status .rxeof = true ;
243+ desc.status .num_stored_bytes = buf_size;
244+ descriptors[6 ].wr (desc);
245+
246+ bufs = sgdma.get_next_packet ();
247+ BOOST_CHECK_MESSAGE ((bufs == std::vector<size_t >{3 , 4 }), " Buffer indices mismatch" );
248+ data = sgdma.read_buffers (bufs);
249+ BOOST_CHECK_MESSAGE (data.size () == buf_size * 3 / 2 , " Data size mismatch" );
250+ check_buffer (data, 1234 );
251+ cmplt_reset = !descriptors[3 ].rd ().status .cmplt && !descriptors[4 ].rd ().status .cmplt ;
252+ BOOST_CHECK_MESSAGE (cmplt_reset, " Complete flags are not reset" );
253+
254+ bufs = sgdma.get_next_packet ();
255+ BOOST_CHECK_MESSAGE ((bufs == std::vector<size_t >{5 , 6 }), " Buffer indices mismatch" );
256+ data = sgdma.read_buffers (bufs);
257+ BOOST_CHECK_MESSAGE (data.size () == buf_size * 2 , " Data size mismatch" );
258+ check_buffer (data, 5678 );
259+ cmplt_reset = !descriptors[3 ].rd ().status .cmplt && !descriptors[4 ].rd ().status .cmplt ;
260+ BOOST_CHECK_MESSAGE (cmplt_reset, " Complete flags are not reset" );
261+ }
165262} // namespace udmaio
0 commit comments