[PATCH v3 2/2] v4l: vsp1: Provide a writeback video device
Geert Uytterhoeven
geert at linux-m68k.org
Tue May 16 15:30:55 UTC 2017
Hi Kieran,
On Tue, May 9, 2017 at 6:39 PM, Kieran Bingham
<kieran.bingham+renesas at ideasonboard.com> wrote:
> When the VSP1 is used in an active display pipeline, the output of the
> WPF can supply the LIF entity directly and simultaneously write to
> memory.
>
> Support this functionality in the VSP1 driver, by extending the WPF
> source pads, and establishing a V4L2 video device node connected to the
> new source.
>
> The source will be able to perform pixel format conversion, but not
> rescaling, and as such the output from the memory node will always be
> of the same dimensions as the display output.
>
> Signed-off-by: Kieran Bingham <kieran.bingham+renesas at ideasonboard.com>
> --- a/drivers/media/platform/vsp1/vsp1_video.c
> +++ b/drivers/media/platform/vsp1/vsp1_video.c
> @@ -900,6 +901,147 @@ static const struct vb2_ops vsp1_video_queue_qops = {
> .stop_streaming = vsp1_video_stop_streaming,
> };
>
> +
> +/* -----------------------------------------------------------------------------
> + * videobuf2 queue operations for writeback nodes
> + */
> +
> +static void vsp1_video_wb_process_buffer(struct vsp1_video *video)
> +{
> + struct vsp1_vb2_buffer *buf;
> + unsigned long flags;
> +
> + /*
> + * Writeback uses a running stream, unlike the M2M interface which
> + * controls a pipeline process manually though the use of
> + * vsp1_pipeline_run().
> + *
> + * Instead writeback will commence at the next frame interval, and can
> + * be marked complete at the interval following that. To handle this we
> + * store the configured buffer as pending until the next callback.
> + *
> + * | | | | |
> + * A |<-->|
> + * B |<-->|
> + * C |<-->| : Only at interrupt C can A be marked done
> + */
> +
> + spin_lock_irqsave(&video->irqlock, flags);
> +
> + /* Move the pending image to the active hw queue */
> + if (video->pending) {
> + list_add_tail(&video->pending->queue, &video->irqqueue);
> + video->pending = NULL;
> + }
> +
> + buf = list_first_entry_or_null(&video->wbqueue, struct vsp1_vb2_buffer,
> + queue);
> +
> + if (buf) {
> + video->rwpf->mem = buf->mem;
> +
> + /*
> + * Store this buffer as pending. It will commence at the next
> + * frame start interrupt
> + */
> + video->pending = buf;
> + list_del(&buf->queue);
> + } else {
> + /* Disable writeback with no buffer */
> + video->rwpf->mem = (struct vsp1_rwpf_memory) { 0 };
With gcc 4.9.0:
drivers/media/platform/vsp1/vsp1_video.c: In function
'vsp1_video_wb_process_buffer':
drivers/media/platform/vsp1/vsp1_video.c:942:30: warning: missing
braces around initializer [-Wmissing-braces]
video->rwpf->mem = (struct vsp1_rwpf_memory) { 0 };
- video->rwpf->mem = (struct vsp1_rwpf_memory) { 0 };
+ video->rwpf->mem = (struct vsp1_rwpf_memory) { { 0, } };
> +static void vsp1_video_wb_stop_streaming(struct vb2_queue *vq)
> +{
> + struct vsp1_video *video = vb2_get_drv_priv(vq);
> + struct vsp1_rwpf *rwpf = video->rwpf;
> + struct vsp1_pipeline *pipe = rwpf->pipe;
> + struct vsp1_vb2_buffer *buffer;
> + unsigned long flags;
> +
> + /*
> + * Disable the completion interrupts, and clear the WPF memory to
> + * prevent writing out frames
> + */
> + spin_lock_irqsave(&video->irqlock, flags);
> + video->frame_end = NULL;
> + rwpf->mem = (struct vsp1_rwpf_memory) { 0 };
Likewise:
- rwpf->mem = (struct vsp1_rwpf_memory) { 0 };
+ rwpf->mem = (struct vsp1_rwpf_memory) { { 0, } };
Gr{oetje,eeting}s,
Geert
--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert at linux-m68k.org
In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
-- Linus Torvalds
More information about the dri-devel
mailing list