On Thu, Apr 30, 2020 at 9:31 AM Edgar E. Iglesias <edgar.igles...@gmail.com> wrote: > > From: "Edgar E. Iglesias" <edgar.igles...@xilinx.com> > > Add support for stream fragments. > > Signed-off-by: Edgar E. Iglesias <edgar.igles...@xilinx.com>
Reviewed-by: Alistair Francis <alistair.fran...@wdc.com> Alistair > --- > hw/dma/xilinx_axidma.c | 14 +++++++------- > 1 file changed, 7 insertions(+), 7 deletions(-) > > diff --git a/hw/dma/xilinx_axidma.c b/hw/dma/xilinx_axidma.c > index 101d32a965..87be9cade7 100644 > --- a/hw/dma/xilinx_axidma.c > +++ b/hw/dma/xilinx_axidma.c > @@ -110,6 +110,7 @@ struct Stream { > > int nr; > > + bool sof; > struct SDesc desc; > unsigned int complete_cnt; > 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_DMACR] = 1 << 16; /* Starts with one in compl threshold. */ > + s->sof = true; > } > > /* 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, > - size_t len) > + size_t len, bool eop) > { > uint32_t prev_d; > unsigned int rxlen; > size_t pos = 0; > - int sof = 1; > > if (!stream_running(s) || stream_idle(s)) { > return 0; > @@ -352,16 +353,16 @@ static size_t stream_process_s2mem(struct Stream *s, > unsigned char *buf, > pos += rxlen; > > /* Update the descriptor. */ > - if (!len) { > + if (eop) { > stream_complete(s); > memcpy(s->desc.app, s->app, sizeof(s->desc.app)); > 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; > stream_desc_store(s, s->regs[R_CURDESC]); > - sof = 0; > + s->sof = eop; > > /* Advance. */ > 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]; > size_t ret; > > - assert(eop); > - ret = stream_process_s2mem(s, buf, len); > + ret = stream_process_s2mem(s, buf, len, eop); > stream_update_irq(s); > return ret; > } > -- > 2.20.1 > >