[PATCH v3 2/2] v4l: vsp1: Provide a writeback video device

Kieran Bingham kieran.bingham+renesas at ideasonboard.com
Wed May 17 21:33:29 UTC 2017


Hi Geert,

On 16/05/17 16:30, Geert Uytterhoeven wrote:
> 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, } };
> 

I've updated these to use a memset(&mem, 0, sizeof(mem)) instead.



>> +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, } };
> 

Now memset...

> 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