@@ -46,14 +46,18 @@ void UioMemSgdma::write_cyc_mode(const std::vector<UioRegion>& dst_bufs) {
4646void UioMemSgdma::init_buffers (DmaBufferAbstract& mem, size_t num_buffers, size_t buf_size) {
4747 // FIXME: enforce alignment constraints?
4848 std::vector<UioRegion> dst_bufs;
49+ _buf_addrs.clear ();
4950 for (size_t i = 0 ; i < num_buffers; i++) {
51+ uint64_t addr = mem.get_phys_region ().addr + i * buf_size;
5052 dst_bufs.push_back ({
51- .addr = mem. get_phys_region (). addr + i * buf_size ,
53+ .addr = addr,
5254 .size = buf_size,
5355 });
56+ _buf_addrs.push_back (addr);
5457 };
5558
5659 write_cyc_mode (dst_bufs);
60+ _buf_size = buf_size;
5761}
5862
5963void UioMemSgdma::print_desc (const S2mmDesc& desc) const {
@@ -97,30 +101,29 @@ std::vector<UioRegion> UioMemSgdma::get_full_buffers() {
97101 std::vector<UioRegion> bufs;
98102
99103 for (size_t i = 0; i < _nr_cyc_desc; i++) {
100- S2mmDesc desc = descriptors [_next_readable_buf].rd();
101- if (!desc.status .cmplt) {
104+ auto stat = desc_statuses [_next_readable_buf].rd();
105+ if (!stat .cmplt) {
102106 break;
103107 }
104108
105- if ((!desc.status.rxeof && (desc.status.num_stored_bytes != desc.control.buffer_len)) ||
106- desc.status.num_stored_bytes == 0) {
109+ if ((!stat.rxeof && (stat.num_stored_bytes != _buf_size)) || stat.num_stored_bytes == 0) {
107110 BOOST_LOG_SEV(_lg, bls::error)
108- << " Descriptor #" << i << " size mismatch (expected " << desc.control.buffer_len
109- << " , received " << desc.status .num_stored_bytes << " ), skipping";
111+ << " Descriptor #" << i << " size mismatch (expected " << _buf_size << " , received "
112+ << stat .num_stored_bytes << " ), skipping";
110113
111- print_desc (desc );
114+ print_desc (descriptors[_next_readable_buf]. rd () );
112115 continue ;
113116 }
114117
115- desc.status .cmplt = 0 ;
116- descriptors [_next_readable_buf].wr(desc );
118+ stat .cmplt = 0 ;
119+ desc_statuses [_next_readable_buf].wr(stat );
117120
118- bufs.emplace_back(
119- UioRegion{static_cast <uintptr_t >(desc. buffer_addr ), desc. status .num_stored_bytes });
121+ const uint64_t buf_addr = _buf_addrs[_next_readable_buf];
122+ bufs.emplace_back( UioRegion{static_cast <uintptr_t >(buf_addr ), stat .num_stored_bytes });
120123
121124 BOOST_LOG_SEV (_lg, bls::trace)
122- << " save buf #" << _next_readable_buf << " (" << desc.status. num_stored_bytes
123- << " bytes) @ 0x " << std::hex << desc.buffer_addr ;
125+ << " save buf #" << _next_readable_buf << " (" << stat. num_stored_bytes << " bytes) @ 0x "
126+ << std::hex << buf_addr ;
124127
125128 _next_readable_buf++;
126129 _next_readable_buf %= _nr_cyc_desc;
0 commit comments