@@ -162,4 +162,101 @@ BOOST_FIXTURE_TEST_CASE(buffer_read, UioMemSgdmaTest) {
162
162
BOOST_CHECK_MESSAGE (cmplt_reset, " Complete flags are not reset" );
163
163
}
164
164
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
+ }
165
262
} // namespace udmaio
0 commit comments