Skip to content

Commit caca3c7

Browse files
committed
fix(sgdma): descriptors fields; sanity checks
1 parent 2d40b2e commit caca3c7

2 files changed

Lines changed: 23 additions & 11 deletions

File tree

inc/udmaio/UioMemSgdma.hpp

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,13 +31,22 @@ class UioMemSgdma : public UioIf {
3131
};
3232

3333
struct __attribute__((packed)) S2mmDescStatus {
34-
uint32_t buffer_len : 26;
34+
// This value indicates the amount of data received and stored in the buffer described by
35+
// this descriptor. This might or might not match the buffer length
36+
uint32_t num_stored_bytes : 26;
37+
// End of Frame. Flag indicating buffer holds the last part of packet.
3538
bool rxeof : 1;
39+
// Start of Frame. Flag indicating buffer holds first part of packet.
3640
bool rxsof : 1;
41+
// DMA Internal Error. Internal Error detected by primary AXI DataMover.
3742
bool dmainterr : 1;
43+
// DMA Slave Error. Slave Error detected by primary AXI DataMover.
3844
bool dmaslverr : 1;
45+
// DMA Decode Error. Decode Error detected by primary AXI DataMover.
3946
bool dmadecerr : 1;
40-
bool cmpit : 1;
47+
// Completed. This indicates to the software that the DMA Engine has
48+
// completed the transfer as described by the associated descriptor.
49+
bool cmplt : 1;
4150
};
4251

4352
struct __attribute__((packed, aligned(8))) S2mmDesc {

src/UioMemSgdma.cpp

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -66,13 +66,13 @@ void UioMemSgdma::print_desc(const S2mmDesc& desc) const {
6666
BLI << " sof = " << std::dec << desc.control.rxsof;
6767
BLI << " eof = " << std::dec << desc.control.rxeof;
6868
BLI << " status";
69-
BLI << " buffer_len = " << std::dec << desc.status.buffer_len;
69+
BLI << " buffer_len = " << std::dec << desc.status.num_stored_bytes;
7070
BLI << " sof = " << std::dec << desc.status.rxsof;
7171
BLI << " eof = " << std::dec << desc.status.rxeof;
7272
BLI << " dmainterr = " << std::dec << desc.status.dmainterr;
7373
BLI << " dmaslverr = " << std::dec << desc.status.dmaslverr;
7474
BLI << " dmadecerr = " << std::dec << desc.status.dmadecerr;
75-
BLI << " cmpit = " << std::dec << desc.status.cmpit;
75+
BLI << " cmplt = " << std::dec << desc.status.cmplt;
7676
BLI << "}" << std::dec;
7777
}
7878
@@ -98,26 +98,29 @@ std::vector<UioRegion> UioMemSgdma::get_full_buffers() {
9898
9999
for (size_t i = 0; i < _nr_cyc_desc; i++) {
100100
S2mmDesc desc = descriptors[_next_readable_buf].rd();
101-
if (!desc.status.cmpit) {
101+
if (!desc.status.cmplt) {
102102
break;
103103
}
104-
desc.status.cmpit = 0;
105-
descriptors[_next_readable_buf].wr(desc);
106104
107-
if (desc.status.buffer_len != desc.control.buffer_len || desc.status.buffer_len == 0) {
105+
if ((!desc.status.rxeof && (desc.status.num_stored_bytes != desc.control.buffer_len)) ||
106+
desc.status.num_stored_bytes == 0) {
108107
BOOST_LOG_SEV(_lg, bls::error)
109108
<< "Descriptor #" << i << " size mismatch (expected " << desc.control.buffer_len
110-
<< ", received " << desc.status.buffer_len << "), skipping";
109+
<< ", received " << desc.status.num_stored_bytes << "), skipping";
111110

112111
print_desc(desc);
113112
continue;
114113
}
115114

115+
desc.status.cmplt = 0;
116+
descriptors[_next_readable_buf].wr(desc);
117+
116118
bufs.emplace_back(
117-
UioRegion{static_cast<uintptr_t>(desc.buffer_addr), desc.status.buffer_len});
119+
UioRegion{static_cast<uintptr_t>(desc.buffer_addr), desc.status.num_stored_bytes});
118120

119121
BOOST_LOG_SEV(_lg, bls::trace)
120-
<< "save buf #" << _next_readable_buf << " @ 0x" << std::hex << desc.buffer_addr;
122+
<< "save buf #" << _next_readable_buf << " (" << desc.status.num_stored_bytes
123+
<< " bytes) @ 0x" << std::hex << desc.buffer_addr;
121124

122125
_next_readable_buf++;
123126
_next_readable_buf %= _nr_cyc_desc;

0 commit comments

Comments
 (0)