Message ID | 20240627-multistream-v2-13-6ae96c54c1c3@ti.com |
---|---|
State | New |
Headers | show |
Series | media: cadence,ti: CSI2RX Multistream Support | expand |
On 27/06/2024 16:10, Jai Luthra wrote: > We already make sure to submit all available buffers to DMA in each DMA > completion callback. > > Move that logic in a separate function, and use it during stream start > as well, as most application queue all their buffers before stream on. > > Signed-off-by: Jai Luthra <j-luthra@ti.com> > --- > .../media/platform/ti/j721e-csi2rx/j721e-csi2rx.c | 43 ++++++++++++---------- > 1 file changed, 24 insertions(+), 19 deletions(-) > > diff --git a/drivers/media/platform/ti/j721e-csi2rx/j721e-csi2rx.c b/drivers/media/platform/ti/j721e-csi2rx/j721e-csi2rx.c > index 84b972c251e8..a258477b9084 100644 > --- a/drivers/media/platform/ti/j721e-csi2rx/j721e-csi2rx.c > +++ b/drivers/media/platform/ti/j721e-csi2rx/j721e-csi2rx.c > @@ -637,6 +637,27 @@ static int ti_csi2rx_drain_dma(struct ti_csi2rx_ctx *ctx) > return ret; > } > > +static int ti_csi2rx_dma_submit_pending(struct ti_csi2rx_ctx *ctx) > +{ > + struct ti_csi2rx_dma *dma = &ctx->dma; > + struct ti_csi2rx_buffer *buf; > + int ret = 0; > + > + /* If there are more buffers to process then start their transfer. */ > + while (!list_empty(&dma->queue)) { > + buf = list_entry(dma->queue.next, struct ti_csi2rx_buffer, list); > + ret = ti_csi2rx_start_dma(ctx, buf); > + if (ret) { > + dev_err(ctx->csi->dev, > + "Failed to queue the next buffer for DMA\n"); > + vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_ERROR); > + break; > + } > + list_move_tail(&buf->list, &dma->submitted); > + } > + return ret; > +} > + > static void ti_csi2rx_dma_callback(void *param) > { > struct ti_csi2rx_buffer *buf = param; > @@ -657,18 +678,7 @@ static void ti_csi2rx_dma_callback(void *param) > vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_DONE); > list_del(&buf->list); > > - /* If there are more buffers to process then start their transfer. */ > - while (!list_empty(&dma->queue)) { > - buf = list_entry(dma->queue.next, struct ti_csi2rx_buffer, list); > - > - if (ti_csi2rx_start_dma(ctx, buf)) { > - dev_err(ctx->csi->dev, > - "Failed to queue the next buffer for DMA\n"); > - vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_ERROR); > - } else { > - list_move_tail(&buf->list, &dma->submitted); > - } > - } > + ti_csi2rx_dma_submit_pending(ctx); > > if (list_empty(&dma->submitted)) > dma->state = TI_CSI2RX_DMA_IDLE; > @@ -877,7 +887,6 @@ static int ti_csi2rx_start_streaming(struct vb2_queue *vq, unsigned int count) > struct ti_csi2rx_ctx *ctx = vb2_get_drv_priv(vq); > struct ti_csi2rx_dev *csi = ctx->csi; > struct ti_csi2rx_dma *dma = &ctx->dma; > - struct ti_csi2rx_buffer *buf; > struct v4l2_subdev_krouting *routing; > struct v4l2_subdev_route *route = NULL; > struct media_pad *remote_pad; > @@ -943,16 +952,13 @@ static int ti_csi2rx_start_streaming(struct vb2_queue *vq, unsigned int count) > ctx->sequence = 0; > > spin_lock_irqsave(&dma->lock, flags); > - buf = list_entry(dma->queue.next, struct ti_csi2rx_buffer, list); > > - ret = ti_csi2rx_start_dma(ctx, buf); > + ret = ti_csi2rx_dma_submit_pending(ctx); > if (ret) { > - dev_err(csi->dev, "Failed to start DMA: %d\n", ret); > spin_unlock_irqrestore(&dma->lock, flags); > - goto err_pipeline; > + goto err_dma; > } > > - list_move_tail(&buf->list, &dma->submitted); > dma->state = TI_CSI2RX_DMA_ACTIVE; > spin_unlock_irqrestore(&dma->lock, flags); > > @@ -967,7 +973,6 @@ static int ti_csi2rx_start_streaming(struct vb2_queue *vq, unsigned int count) > > err_dma: > ti_csi2rx_stop_dma(ctx); > -err_pipeline: > video_device_pipeline_stop(&ctx->vdev); > writel(0, csi->shim + SHIM_CNTL); > writel(0, csi->shim + SHIM_DMACNTX(ctx->idx)); > Reviewed-by: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com> Tomi
diff --git a/drivers/media/platform/ti/j721e-csi2rx/j721e-csi2rx.c b/drivers/media/platform/ti/j721e-csi2rx/j721e-csi2rx.c index 84b972c251e8..a258477b9084 100644 --- a/drivers/media/platform/ti/j721e-csi2rx/j721e-csi2rx.c +++ b/drivers/media/platform/ti/j721e-csi2rx/j721e-csi2rx.c @@ -637,6 +637,27 @@ static int ti_csi2rx_drain_dma(struct ti_csi2rx_ctx *ctx) return ret; } +static int ti_csi2rx_dma_submit_pending(struct ti_csi2rx_ctx *ctx) +{ + struct ti_csi2rx_dma *dma = &ctx->dma; + struct ti_csi2rx_buffer *buf; + int ret = 0; + + /* If there are more buffers to process then start their transfer. */ + while (!list_empty(&dma->queue)) { + buf = list_entry(dma->queue.next, struct ti_csi2rx_buffer, list); + ret = ti_csi2rx_start_dma(ctx, buf); + if (ret) { + dev_err(ctx->csi->dev, + "Failed to queue the next buffer for DMA\n"); + vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_ERROR); + break; + } + list_move_tail(&buf->list, &dma->submitted); + } + return ret; +} + static void ti_csi2rx_dma_callback(void *param) { struct ti_csi2rx_buffer *buf = param; @@ -657,18 +678,7 @@ static void ti_csi2rx_dma_callback(void *param) vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_DONE); list_del(&buf->list); - /* If there are more buffers to process then start their transfer. */ - while (!list_empty(&dma->queue)) { - buf = list_entry(dma->queue.next, struct ti_csi2rx_buffer, list); - - if (ti_csi2rx_start_dma(ctx, buf)) { - dev_err(ctx->csi->dev, - "Failed to queue the next buffer for DMA\n"); - vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_ERROR); - } else { - list_move_tail(&buf->list, &dma->submitted); - } - } + ti_csi2rx_dma_submit_pending(ctx); if (list_empty(&dma->submitted)) dma->state = TI_CSI2RX_DMA_IDLE; @@ -877,7 +887,6 @@ static int ti_csi2rx_start_streaming(struct vb2_queue *vq, unsigned int count) struct ti_csi2rx_ctx *ctx = vb2_get_drv_priv(vq); struct ti_csi2rx_dev *csi = ctx->csi; struct ti_csi2rx_dma *dma = &ctx->dma; - struct ti_csi2rx_buffer *buf; struct v4l2_subdev_krouting *routing; struct v4l2_subdev_route *route = NULL; struct media_pad *remote_pad; @@ -943,16 +952,13 @@ static int ti_csi2rx_start_streaming(struct vb2_queue *vq, unsigned int count) ctx->sequence = 0; spin_lock_irqsave(&dma->lock, flags); - buf = list_entry(dma->queue.next, struct ti_csi2rx_buffer, list); - ret = ti_csi2rx_start_dma(ctx, buf); + ret = ti_csi2rx_dma_submit_pending(ctx); if (ret) { - dev_err(csi->dev, "Failed to start DMA: %d\n", ret); spin_unlock_irqrestore(&dma->lock, flags); - goto err_pipeline; + goto err_dma; } - list_move_tail(&buf->list, &dma->submitted); dma->state = TI_CSI2RX_DMA_ACTIVE; spin_unlock_irqrestore(&dma->lock, flags); @@ -967,7 +973,6 @@ static int ti_csi2rx_start_streaming(struct vb2_queue *vq, unsigned int count) err_dma: ti_csi2rx_stop_dma(ctx); -err_pipeline: video_device_pipeline_stop(&ctx->vdev); writel(0, csi->shim + SHIM_CNTL); writel(0, csi->shim + SHIM_DMACNTX(ctx->idx));
We already make sure to submit all available buffers to DMA in each DMA completion callback. Move that logic in a separate function, and use it during stream start as well, as most application queue all their buffers before stream on. Signed-off-by: Jai Luthra <j-luthra@ti.com> --- .../media/platform/ti/j721e-csi2rx/j721e-csi2rx.c | 43 ++++++++++++---------- 1 file changed, 24 insertions(+), 19 deletions(-)