mirror of https://github.com/xemu-project/xemu.git
hw/dma/xilinx_axidma: s2mm: Support stream fragments
Add support for stream fragments. Reviewed-by: Alistair Francis <alistair.francis@wdc.com> Signed-off-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com> Message-Id: <20200506082513.18751-9-edgar.iglesias@gmail.com>
This commit is contained in:
parent
471fe8a252
commit
734e3befc2
|
@ -110,6 +110,7 @@ struct Stream {
|
||||||
|
|
||||||
int nr;
|
int nr;
|
||||||
|
|
||||||
|
bool sof;
|
||||||
struct SDesc desc;
|
struct SDesc desc;
|
||||||
unsigned int complete_cnt;
|
unsigned int complete_cnt;
|
||||||
uint32_t regs[R_MAX];
|
uint32_t regs[R_MAX];
|
||||||
|
@ -174,6 +175,7 @@ static void stream_reset(struct Stream *s)
|
||||||
{
|
{
|
||||||
s->regs[R_DMASR] = DMASR_HALTED; /* starts up halted. */
|
s->regs[R_DMASR] = DMASR_HALTED; /* starts up halted. */
|
||||||
s->regs[R_DMACR] = 1 << 16; /* Starts with one in compl threshold. */
|
s->regs[R_DMACR] = 1 << 16; /* Starts with one in compl threshold. */
|
||||||
|
s->sof = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Map an offset addr into a channel index. */
|
/* Map an offset addr into a channel index. */
|
||||||
|
@ -321,12 +323,11 @@ static void stream_process_mem2s(struct Stream *s, StreamSlave *tx_data_dev,
|
||||||
}
|
}
|
||||||
|
|
||||||
static size_t stream_process_s2mem(struct Stream *s, unsigned char *buf,
|
static size_t stream_process_s2mem(struct Stream *s, unsigned char *buf,
|
||||||
size_t len)
|
size_t len, bool eop)
|
||||||
{
|
{
|
||||||
uint32_t prev_d;
|
uint32_t prev_d;
|
||||||
unsigned int rxlen;
|
unsigned int rxlen;
|
||||||
size_t pos = 0;
|
size_t pos = 0;
|
||||||
int sof = 1;
|
|
||||||
|
|
||||||
if (!stream_running(s) || stream_idle(s)) {
|
if (!stream_running(s) || stream_idle(s)) {
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -352,16 +353,16 @@ static size_t stream_process_s2mem(struct Stream *s, unsigned char *buf,
|
||||||
pos += rxlen;
|
pos += rxlen;
|
||||||
|
|
||||||
/* Update the descriptor. */
|
/* Update the descriptor. */
|
||||||
if (!len) {
|
if (eop) {
|
||||||
stream_complete(s);
|
stream_complete(s);
|
||||||
memcpy(s->desc.app, s->app, sizeof(s->desc.app));
|
memcpy(s->desc.app, s->app, sizeof(s->desc.app));
|
||||||
s->desc.status |= SDESC_STATUS_EOF;
|
s->desc.status |= SDESC_STATUS_EOF;
|
||||||
}
|
}
|
||||||
|
|
||||||
s->desc.status |= sof << SDESC_STATUS_SOF_BIT;
|
s->desc.status |= s->sof << SDESC_STATUS_SOF_BIT;
|
||||||
s->desc.status |= SDESC_STATUS_COMPLETE;
|
s->desc.status |= SDESC_STATUS_COMPLETE;
|
||||||
stream_desc_store(s, s->regs[R_CURDESC]);
|
stream_desc_store(s, s->regs[R_CURDESC]);
|
||||||
sof = 0;
|
s->sof = eop;
|
||||||
|
|
||||||
/* Advance. */
|
/* Advance. */
|
||||||
prev_d = s->regs[R_CURDESC];
|
prev_d = s->regs[R_CURDESC];
|
||||||
|
@ -426,8 +427,7 @@ xilinx_axidma_data_stream_push(StreamSlave *obj, unsigned char *buf, size_t len,
|
||||||
struct Stream *s = &ds->dma->streams[1];
|
struct Stream *s = &ds->dma->streams[1];
|
||||||
size_t ret;
|
size_t ret;
|
||||||
|
|
||||||
assert(eop);
|
ret = stream_process_s2mem(s, buf, len, eop);
|
||||||
ret = stream_process_s2mem(s, buf, len);
|
|
||||||
stream_update_irq(s);
|
stream_update_irq(s);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue