[PATCH 2/2 v2] dma: ipu_idmac: do not lose valid received data in the irq handler
From: Guennadi Liakhovetski <hidden>
Date: 2011-02-05 16:36:47
Also in:
linux-media
On Sat, 5 Feb 2011, Anatolij Gustschin wrote:
Hi Guennadi, On Thu, 3 Feb 2011 11:09:54 +0100 (CET) Guennadi Liakhovetski [off-list ref] wrote:quoted
Hi Anatolij On Mon, 31 Jan 2011, Anatolij Gustschin wrote: I'm afraid there seems to be a problem with your patch. I have no idea what is causing it, but I'm just observing some wrong behaviour, that is not there without it. Namely, I added a debug print to the IDMAC interrupt handler curbuf = idmac_read_ipureg(&ipu_data, IPU_CHA_CUR_BUF); err = idmac_read_ipureg(&ipu_data, IPU_INT_STAT_4); + printk(KERN_DEBUG "%s(): IDMAC irq %d, buf %d, current %d\n", __func__, + irq, ichan->active_buffer, (curbuf >> chan_id) & 1); if (err & (1 << chan_id)) { idmac_write_ipureg(&ipu_data, 1 << chan_id, IPU_INT_STAT_4); and without your patch I see buffer numbers correctly toggling all the time like idmac_interrupt(): IDMAC irq 177, buf 0, current 0 idmac_interrupt(): IDMAC irq 177, buf 0, current 1 idmac_interrupt(): IDMAC irq 177, buf 1, current 0 idmac_interrupt(): IDMAC irq 177, buf 0, current 1 idmac_interrupt(): IDMAC irq 177, buf 1, current 0 idmac_interrupt(): IDMAC irq 177, buf 0, current 1 ... Yes, the first interrupt is different, that's where I'm dropping / postponing it. With your patch only N (equal to the number of buffers used, I think) first interrupts toggle, then always only one buffer is used: idmac_interrupt(): IDMAC irq 177, buf 0, current 0 idmac_interrupt(): IDMAC irq 177, buf 1, current 1 idmac_interrupt(): IDMAC irq 177, buf 0, current 0 idmac_interrupt(): IDMAC irq 177, buf 1, current 1 idmac_interrupt(): IDMAC irq 177, buf 0, current 0 idmac_interrupt(): IDMAC irq 177, buf 1, current 1 idmac_interrupt(): IDMAC irq 177, buf 0, current 0 idmac_interrupt(): IDMAC irq 177, buf 0, current 0 idmac_interrupt(): IDMAC irq 177, buf 0, current 0 ... Verified with both capture.c and mplayer. Could you, please, verify whether you get the same behaviour and what the problem could be?Now I did some further testing with idmac patch applied and with added debug print in the IDMAC interrupt handler. There is no problem. Testing with capture.c (4 buffers used as default) shows that buffer numbers toggle correctly for all 100 captured frames:
Hm, interesting, I'll have to look at my testing in more detail then (once back from FOSDEM). Could you maybe try mplayer too? Thanks Guennadi
... mx3-camera mx3-camera.0: MX3 Camera driver attached to camera 0 idmac_interrupt(): IDMAC irq 177, buf 0, current 0 idmac_interrupt(): IDMAC irq 177, buf 1, current 1 idmac_interrupt(): IDMAC irq 177, buf 0, current 0 idmac_interrupt(): IDMAC irq 177, buf 1, current 1 idmac_interrupt(): IDMAC irq 177, buf 0, current 0 idmac_interrupt(): IDMAC irq 177, buf 1, current 1 ... idmac_interrupt(): IDMAC irq 177, buf 0, current 0 idmac_interrupt(): IDMAC irq 177, buf 1, current 1 idmac_interrupt(): IDMAC irq 177, buf 0, current 0 idmac_interrupt(): IDMAC irq 177, buf 1, current 1 idmac_interrupt(): IDMAC irq 177, buf 0, current 0 idmac_interrupt(): IDMAC irq 177, buf 1, current 1 mx3-camera mx3-camera.0: MX3 Camera driver detached from camera 0 Also testing with my test application didn't show any problem. When using more than 1 buffer (tested with 2, 3 and 4 queued buffers) double buffering works as expected and frame numbers toggle correctly. Capturing 30 frames produce: mx3-camera mx3-camera.0: MX3 Camera driver attached to camera 0 idmac_interrupt(): IDMAC irq 177, buf 0, current 0 idmac_interrupt(): IDMAC irq 177, buf 1, current 1 idmac_interrupt(): IDMAC irq 177, buf 0, current 0 idmac_interrupt(): IDMAC irq 177, buf 1, current 1 idmac_interrupt(): IDMAC irq 177, buf 0, current 0 idmac_interrupt(): IDMAC irq 177, buf 1, current 1 idmac_interrupt(): IDMAC irq 177, buf 0, current 0 idmac_interrupt(): IDMAC irq 177, buf 1, current 1 idmac_interrupt(): IDMAC irq 177, buf 0, current 0 idmac_interrupt(): IDMAC irq 177, buf 1, current 1 idmac_interrupt(): IDMAC irq 177, buf 0, current 0 idmac_interrupt(): IDMAC irq 177, buf 1, current 1 idmac_interrupt(): IDMAC irq 177, buf 0, current 0 idmac_interrupt(): IDMAC irq 177, buf 1, current 1 idmac_interrupt(): IDMAC irq 177, buf 0, current 0 idmac_interrupt(): IDMAC irq 177, buf 1, current 1 idmac_interrupt(): IDMAC irq 177, buf 0, current 0 idmac_interrupt(): IDMAC irq 177, buf 1, current 1 idmac_interrupt(): IDMAC irq 177, buf 0, current 0 idmac_interrupt(): IDMAC irq 177, buf 1, current 1 idmac_interrupt(): IDMAC irq 177, buf 0, current 0 idmac_interrupt(): IDMAC irq 177, buf 1, current 1 idmac_interrupt(): IDMAC irq 177, buf 0, current 0 idmac_interrupt(): IDMAC irq 177, buf 1, current 1 idmac_interrupt(): IDMAC irq 177, buf 0, current 0 idmac_interrupt(): IDMAC irq 177, buf 1, current 1 idmac_interrupt(): IDMAC irq 177, buf 0, current 0 idmac_interrupt(): IDMAC irq 177, buf 1, current 1 idmac_interrupt(): IDMAC irq 177, buf 0, current 0 idmac_interrupt(): IDMAC irq 177, buf 1, current 1 mx3-camera mx3-camera.0: MX3 Camera driver detached from camera 0 Anatolij
--- Guennadi Liakhovetski, Ph.D. Freelance Open-Source Software Developer http://www.open-technology.de/