Message ID | 20200430162439.2659-9-edgar.iglesias@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | hw/core: stream: Add end-of-packet flag | expand |
On Thu, Apr 30, 2020 at 9:31 AM Edgar E. Iglesias <edgar.iglesias@gmail.com> wrote: > > From: "Edgar E. Iglesias" <edgar.iglesias@xilinx.com> > > Add support for stream fragments. > > Signed-off-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com> Reviewed-by: Alistair Francis <alistair.francis@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 > >
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; }