int videobuf_dma_pci_sync(struct pci_dev *dev, struct videobuf_dmabuf *dma) { MAGIC_CHECK(dma->magic,MAGIC_DMABUF); BUG_ON(!dma->sglen); if (!dma->bus_addr) pci_dma_sync_sg_for_cpu(dev,dma->sglist,dma->nr_pages,dma->direction); return 0; }
int videobuf_dma_pci_sync(struct pci_dev *dev, struct videobuf_dmabuf *dma) { if (!dma->sglen) BUG(); if (!dma->bus_addr) pci_dma_sync_sg_for_cpu(dev,dma->sglist,dma->nr_pages,dma->direction); return 0; }
int videobuf_dma_sync(struct videobuf_queue *q,struct videobuf_dmabuf *dma) { void *dev=q->dev; MAGIC_CHECK(dma->magic,MAGIC_DMABUF); BUG_ON(!dma->sglen); pci_dma_sync_sg_for_cpu (dev,dma->sglist,dma->nr_pages,dma->direction); return 0; }
void dma_region_sync_for_cpu(struct dma_region *dma, unsigned long offset, unsigned long len) { int first, last; unsigned long rem; if (!len) len = 1; first = dma_region_find(dma, offset, &rem); last = dma_region_find(dma, offset + len - 1, &rem); pci_dma_sync_sg_for_cpu(dma->dev, &dma->sglist[first], last - first + 1, dma->direction); }
static void vpeirq(unsigned long data) { struct budget *budget = (struct budget *) data; u8 *mem = (u8 *) (budget->grabbing); u32 olddma = budget->ttbp; u32 newdma = saa7146_read(budget->dev, PCI_VDP3); u32 count; /* Ensure streamed PCI data is synced to CPU */ pci_dma_sync_sg_for_cpu(budget->dev->pci, budget->pt.slist, budget->pt.nents, PCI_DMA_FROMDEVICE); /* nearest lower position divisible by 188 */ newdma -= newdma % 188; if (newdma >= budget->buffer_size) return; budget->ttbp = newdma; if (budget->feeding == 0 || newdma == olddma) return; if (newdma > olddma) { /* no wraparound, dump olddma..newdma */ count = newdma - olddma; dvb_dmx_swfilter_packets(&budget->demux, mem + olddma, count / 188); } else { /* wraparound, dump olddma..buflen and 0..newdma */ count = budget->buffer_size - olddma; dvb_dmx_swfilter_packets(&budget->demux, mem + olddma, count / 188); count += newdma; dvb_dmx_swfilter_packets(&budget->demux, mem, newdma / 188); } if (count > budget->buffer_warning_threshold) budget->buffer_warnings++; if (budget->buffer_warnings && time_after(jiffies, budget->buffer_warning_time)) { printk("%s %s: used %d times >80%% of buffer (%u bytes now)\n", budget->dev->name, __func__, budget->buffer_warnings, count); budget->buffer_warning_time = jiffies + BUFFER_WARNING_WAIT; budget->buffer_warnings = 0; } }