Re: [PATCH] rcar-vin: Add check for completed capture before completing buffer

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Quoting Niklas Söderlund (2021-11-25 08:41:34)
> Hi Kieran,
> 
> Thanks for your feedback.
> 
> On 2021-11-24 22:45:17 +0000, Kieran Bingham wrote:
> > Quoting Niklas Söderlund (2021-11-23 15:54:43)
> > > Before reading which slot was captured to by examining the module status
> > > (VnMS) register, make sure something was captured at all by examining
> > > the interrupt status register (VnINTS).
> > > 
> > > Failing this a buffer maybe completed before it was captured too.
> > > 
> > > Signed-off-by: Niklas Söderlund <niklas.soderlund+renesas@xxxxxxxxxxxx>
> > > ---
> > >  drivers/media/platform/rcar-vin/rcar-dma.c | 7 +++++++
> > >  1 file changed, 7 insertions(+)
> > > 
> > > diff --git a/drivers/media/platform/rcar-vin/rcar-dma.c b/drivers/media/platform/rcar-vin/rcar-dma.c
> > > index 25ead9333d0046e7..87ccbdc3d11a0f2d 100644
> > > --- a/drivers/media/platform/rcar-vin/rcar-dma.c
> > > +++ b/drivers/media/platform/rcar-vin/rcar-dma.c
> > > @@ -111,6 +111,9 @@
> > >  #define VNIE_FIE               (1 << 4)
> > >  #define VNIE_EFE               (1 << 1)
> > >  
> > > +/* Video n Interrupt Status Register bits */
> > > +#define VNINTS_FIS             (1 << 4)
> > > +
> > >  /* Video n Data Mode Register bits */
> > >  #define VNDMR_A8BIT(n)         (((n) & 0xff) << 24)
> > >  #define VNDMR_A8BIT_MASK       (0xff << 24)
> > > @@ -1005,6 +1008,10 @@ static irqreturn_t rvin_irq(int irq, void *data)
> > >         rvin_ack_interrupt(vin);
> > >         handled = 1;
> > >  
> > > +       /* Nothing to do if nothing was captured. */
> > > +       if (!(int_status & VNINTS_FIS))
> > 
> > Does this deserve a warning or debug print? It sounds like it may be
> > somewhat spurious or unexpected if it occurs?
> 
> I don't think so. One can enable more interrupts then the ones we do 
> today, for example during debugging capture issues. This check just make 
> sure we don't try to process a capture if the interrupt is not related 
> to capture ;-)

Ok, I see. So it shouldn't occur in current code which doesn't enable
other interrupts though.

I think it adds value/protection so is helpful, so

Reviewed-by: Kieran Bingham <kieran.bingham@xxxxxxxxxxxxxxxx>


If I were doing this though, I'd move the capture specific handling to
it's own function and guard it explicitly for each possible handler:

	if (int_status & VNINTS_FIS)
		rvin_handle_fis(vin);
	
	if (int_status & VNINTS_FOS)
		rvin_handle_fifo_overflow(vin);
	
	if (int_status & VNINTS_EFS)
		rvin_handle_frame_end(vin);

Then each interrupt handler is distinct, and does not get processed
when it's interrupt isn't raised.

> 
> > 
> > --
> > Kieran
> > 
> > 
> > > +               goto done;
> > > +
> > >         /* Nothing to do if capture status is 'STOPPED' */
> > >         if (vin->state == STOPPED) {
> > >                 vin_dbg(vin, "IRQ while state stopped\n");
> > > -- 
> > > 2.34.0
> > >
> 
> -- 
> Kind Regards,
> Niklas Söderlund




[Index of Archives]     [Linux Input]     [Video for Linux]     [Gstreamer Embedded]     [Mplayer Users]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]

  Powered by Linux