dbmda: Fix dma output res_count update.

Use this->res_count to track amount of data transferred.
This commit is contained in:
joevt 2023-11-21 19:29:13 -08:00 committed by dingusdev
parent 0166059d1b
commit 2d8f2422b3
2 changed files with 9 additions and 2 deletions

View File

@ -84,6 +84,7 @@ uint8_t DMAChannel::interpret_cmd() {
res = mmu_map_dma_mem(cmd_struct.address, cmd_struct.req_count, false); res = mmu_map_dma_mem(cmd_struct.address, cmd_struct.req_count, false);
this->queue_data = res.host_va; this->queue_data = res.host_va;
this->queue_len = cmd_struct.req_count; this->queue_len = cmd_struct.req_count;
this->res_count = 0;
this->cmd_in_progress = true; this->cmd_in_progress = true;
break; break;
case DBDMA_Cmd::STORE_QUAD: case DBDMA_Cmd::STORE_QUAD:
@ -170,7 +171,9 @@ void DMAChannel::finish_cmd() {
// all INPUT and OUTPUT commands including LOAD_QUAD and STORE_QUAD update cmd.resCount // all INPUT and OUTPUT commands including LOAD_QUAD and STORE_QUAD update cmd.resCount
if (this->cur_cmd < DBDMA_Cmd::NOP && res.is_writable) { if (this->cur_cmd < DBDMA_Cmd::NOP && res.is_writable) {
WRITE_WORD_LE_A(&cmd_desc[12], this->queue_len & 0xFFFFUL); WRITE_WORD_LE_A(&cmd_desc[12], this->res_count);
this->queue_len = 0;
this->res_count = 0;
} }
if (!branch_taken) if (!branch_taken)
@ -192,7 +195,7 @@ void DMAChannel::xfer_quad(const DMACmd *cmd_desc, DMACmd *cmd_host) {
} else { } else {
xfer_size = 1; xfer_size = 1;
} }
this->queue_len = cmd_desc->req_count; // this is the value that gets written to cmd.resCount this->res_count = cmd_desc->req_count; // this is the value that gets written to cmd.resCount
addr = cmd_desc->address; addr = cmd_desc->address;
if (addr & (xfer_size - 1)) { if (addr & (xfer_size - 1)) {
@ -388,12 +391,14 @@ DmaPullResult DMAChannel::pull_data(uint32_t req_len, uint32_t *avail_len, uint8
*p_data = this->queue_data; *p_data = this->queue_data;
*avail_len = req_len; *avail_len = req_len;
this->queue_len -= req_len; this->queue_len -= req_len;
this->res_count += req_len;
this->queue_data += req_len; this->queue_data += req_len;
} else { // return less data than req_len } else { // return less data than req_len
LOG_F(9, "%s: Return queue_len = %d data", this->get_name().c_str(), LOG_F(9, "%s: Return queue_len = %d data", this->get_name().c_str(),
this->queue_len); this->queue_len);
*p_data = this->queue_data; *p_data = this->queue_data;
*avail_len = this->queue_len; *avail_len = this->queue_len;
this->res_count += this->queue_len;
this->queue_len = 0; this->queue_len = 0;
} }
return DmaPullResult::MoreData; // tell the caller there is more data return DmaPullResult::MoreData; // tell the caller there is more data
@ -418,6 +423,7 @@ int DMAChannel::push_data(const char* src_ptr, int len) {
len = std::min((int)this->queue_len, len); len = std::min((int)this->queue_len, len);
std::memcpy(this->queue_data, src_ptr, len); std::memcpy(this->queue_data, src_ptr, len);
this->queue_data += len; this->queue_data += len;
this->res_count += len;
this->queue_len -= len; this->queue_len -= len;
} }

View File

@ -123,6 +123,7 @@ private:
uint32_t cmd_ptr = 0; uint32_t cmd_ptr = 0;
uint32_t queue_len = 0; uint32_t queue_len = 0;
uint8_t* queue_data = 0; uint8_t* queue_data = 0;
uint32_t res_count = 0;
uint32_t int_select = 0; uint32_t int_select = 0;
uint32_t branch_select = 0; uint32_t branch_select = 0;
uint32_t wait_select = 0; uint32_t wait_select = 0;