[linux-dvb] SAA7146 DMA buffer overflow

Sigmund Augdal Helberg sigmund at snap.tv
Wed Feb 15 09:25:26 CET 2006


On Tue, 2006-02-14 at 21:55 +0100, Ingo Schneider wrote:
> Hello !
> 
> I hava a problem that I loose TS packets due to overruns of the SAA 7146 
> DMA buffer when the system is under I/O load (e.g. backup).
> 
> I modified the budget-core.c to give warning when the buffer is nearly 
> full to verify that this is really the cause (see code below).
> The simplest thing would be to increase the buffer size. The current 
> size = 1024 TS packets, about 192k.
> 
> I would tend to increase this buffer to about 1 or 2 megabytes to stop 
> getting those TS continuity errors,
> is there a reason why this buffer was chosen to be so small ? Spec of 
> SAA7146 says it can handle 4 megabytes for DMA.
I have a very similar problem with bt878 based dvb cards. Here the
buffer size is 128 * 1024 bytes. Increasing it reduces the problem
somewhat, but I'm unable to increase it enough before some sanity check
states that the buffer size is invalid. AFAIK the windows driver for
this particular card uses a 3mb dma buffer.

I think the reason for these buffers to be small is to prevent linux
from running out of what ever memory is used for dma. (In my experience
linux can behave very badly when some range of memory is depleted).
> 
> Also, there is a special handling for BUDGET_FS_ACTIVY which has a 
> different buffer "layout" - why is this ?
ACTIVY is a fujitsu siemens set top box. I guess it has one of these
devices embedded. Being a small device running embedded linux this could
need special buffer handling.

Regards

Sigmund
> 
> My system configuration:
> KT266A chipset MSI K7T266).
> Two Terratec Cinergy 1200 DVB-C (SAA7146 / TDA10021).
> 
> Regards,
> Ingo Schneider.
> 
> 
> 
> --- budget-core.c.old   2006-02-12 17:00:34.000000000 +0100
> +++ budget-core.c       2006-02-14 09:16:25.000000000 +0100
> @@ -141,6 +141,7 @@
>         u8 *mem = (u8 *) (budget->grabbing);
>         u32 olddma = budget->ttbp;
>         u32 newdma = saa7146_read(budget->dev, PCI_VDP3);
> +        int count = 0;
>  
>         /* nearest lower position divisible by 188 */
>         newdma -= newdma % 188;
> @@ -155,9 +156,15 @@
>  
>         if (newdma > olddma) {  /* no wraparound, dump olddma..newdma */
>                 dvb_dmx_swfilter_packets(&budget->demux, mem + olddma, 
> (newdma - olddma) / 188);
> +                count = (newdma - olddma) / 188;
>         } else {                /* wraparound, dump olddma..buflen and 
> 0..newdma */
>                 dvb_dmx_swfilter_packets(&budget->demux, mem + olddma, 
> (TS_BUFLEN - olddma) / 188);
>                 dvb_dmx_swfilter_packets(&budget->demux, mem, newdma / 188);
> +               count = (TS_BUFLEN - olddma) / 188 + newdma / 188;
> +       }
> +
> +       if (count > 1000) {
> +               printk("ttpci vpeirq: buffer warning %d\n", count);
>         }
>  }
> 
> 
> _______________________________________________
> linux-dvb mailing list
> linux-dvb at linuxtv.org
> http://www.linuxtv.org/cgi-bin/mailman/listinfo/linux-dvb




More information about the linux-dvb mailing list