1*b285192aSMauro Carvalho Chehab /* 2*b285192aSMauro Carvalho Chehab buffer queues. 3*b285192aSMauro Carvalho Chehab Copyright (C) 2003-2004 Kevin Thayer <nufan_wfk at yahoo.com> 4*b285192aSMauro Carvalho Chehab Copyright (C) 2004 Chris Kennedy <c@groovy.org> 5*b285192aSMauro Carvalho Chehab Copyright (C) 2005-2007 Hans Verkuil <hverkuil@xs4all.nl> 6*b285192aSMauro Carvalho Chehab 7*b285192aSMauro Carvalho Chehab This program is free software; you can redistribute it and/or modify 8*b285192aSMauro Carvalho Chehab it under the terms of the GNU General Public License as published by 9*b285192aSMauro Carvalho Chehab the Free Software Foundation; either version 2 of the License, or 10*b285192aSMauro Carvalho Chehab (at your option) any later version. 11*b285192aSMauro Carvalho Chehab 12*b285192aSMauro Carvalho Chehab This program is distributed in the hope that it will be useful, 13*b285192aSMauro Carvalho Chehab but WITHOUT ANY WARRANTY; without even the implied warranty of 14*b285192aSMauro Carvalho Chehab MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15*b285192aSMauro Carvalho Chehab GNU General Public License for more details. 16*b285192aSMauro Carvalho Chehab 17*b285192aSMauro Carvalho Chehab You should have received a copy of the GNU General Public License 18*b285192aSMauro Carvalho Chehab along with this program; if not, write to the Free Software 19*b285192aSMauro Carvalho Chehab Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 20*b285192aSMauro Carvalho Chehab */ 21*b285192aSMauro Carvalho Chehab 22*b285192aSMauro Carvalho Chehab #ifndef IVTV_QUEUE_H 23*b285192aSMauro Carvalho Chehab #define IVTV_QUEUE_H 24*b285192aSMauro Carvalho Chehab 25*b285192aSMauro Carvalho Chehab #define IVTV_DMA_UNMAPPED ((u32) -1) 26*b285192aSMauro Carvalho Chehab #define SLICED_VBI_PIO 0 27*b285192aSMauro Carvalho Chehab 28*b285192aSMauro Carvalho Chehab /* ivtv_buffer utility functions */ 29*b285192aSMauro Carvalho Chehab 30*b285192aSMauro Carvalho Chehab static inline int ivtv_might_use_pio(struct ivtv_stream *s) 31*b285192aSMauro Carvalho Chehab { 32*b285192aSMauro Carvalho Chehab return s->dma == PCI_DMA_NONE || (SLICED_VBI_PIO && s->type == IVTV_ENC_STREAM_TYPE_VBI); 33*b285192aSMauro Carvalho Chehab } 34*b285192aSMauro Carvalho Chehab 35*b285192aSMauro Carvalho Chehab static inline int ivtv_use_pio(struct ivtv_stream *s) 36*b285192aSMauro Carvalho Chehab { 37*b285192aSMauro Carvalho Chehab struct ivtv *itv = s->itv; 38*b285192aSMauro Carvalho Chehab 39*b285192aSMauro Carvalho Chehab return s->dma == PCI_DMA_NONE || 40*b285192aSMauro Carvalho Chehab (SLICED_VBI_PIO && s->type == IVTV_ENC_STREAM_TYPE_VBI && itv->vbi.sliced_in->service_set); 41*b285192aSMauro Carvalho Chehab } 42*b285192aSMauro Carvalho Chehab 43*b285192aSMauro Carvalho Chehab static inline int ivtv_might_use_dma(struct ivtv_stream *s) 44*b285192aSMauro Carvalho Chehab { 45*b285192aSMauro Carvalho Chehab return s->dma != PCI_DMA_NONE; 46*b285192aSMauro Carvalho Chehab } 47*b285192aSMauro Carvalho Chehab 48*b285192aSMauro Carvalho Chehab static inline int ivtv_use_dma(struct ivtv_stream *s) 49*b285192aSMauro Carvalho Chehab { 50*b285192aSMauro Carvalho Chehab return !ivtv_use_pio(s); 51*b285192aSMauro Carvalho Chehab } 52*b285192aSMauro Carvalho Chehab 53*b285192aSMauro Carvalho Chehab static inline void ivtv_buf_sync_for_cpu(struct ivtv_stream *s, struct ivtv_buffer *buf) 54*b285192aSMauro Carvalho Chehab { 55*b285192aSMauro Carvalho Chehab if (ivtv_use_dma(s)) 56*b285192aSMauro Carvalho Chehab pci_dma_sync_single_for_cpu(s->itv->pdev, buf->dma_handle, 57*b285192aSMauro Carvalho Chehab s->buf_size + 256, s->dma); 58*b285192aSMauro Carvalho Chehab } 59*b285192aSMauro Carvalho Chehab 60*b285192aSMauro Carvalho Chehab static inline void ivtv_buf_sync_for_device(struct ivtv_stream *s, struct ivtv_buffer *buf) 61*b285192aSMauro Carvalho Chehab { 62*b285192aSMauro Carvalho Chehab if (ivtv_use_dma(s)) 63*b285192aSMauro Carvalho Chehab pci_dma_sync_single_for_device(s->itv->pdev, buf->dma_handle, 64*b285192aSMauro Carvalho Chehab s->buf_size + 256, s->dma); 65*b285192aSMauro Carvalho Chehab } 66*b285192aSMauro Carvalho Chehab 67*b285192aSMauro Carvalho Chehab int ivtv_buf_copy_from_user(struct ivtv_stream *s, struct ivtv_buffer *buf, const char __user *src, int copybytes); 68*b285192aSMauro Carvalho Chehab void ivtv_buf_swap(struct ivtv_buffer *buf); 69*b285192aSMauro Carvalho Chehab 70*b285192aSMauro Carvalho Chehab /* ivtv_queue utility functions */ 71*b285192aSMauro Carvalho Chehab void ivtv_queue_init(struct ivtv_queue *q); 72*b285192aSMauro Carvalho Chehab void ivtv_enqueue(struct ivtv_stream *s, struct ivtv_buffer *buf, struct ivtv_queue *q); 73*b285192aSMauro Carvalho Chehab struct ivtv_buffer *ivtv_dequeue(struct ivtv_stream *s, struct ivtv_queue *q); 74*b285192aSMauro Carvalho Chehab int ivtv_queue_move(struct ivtv_stream *s, struct ivtv_queue *from, struct ivtv_queue *steal, 75*b285192aSMauro Carvalho Chehab struct ivtv_queue *to, int needed_bytes); 76*b285192aSMauro Carvalho Chehab void ivtv_flush_queues(struct ivtv_stream *s); 77*b285192aSMauro Carvalho Chehab 78*b285192aSMauro Carvalho Chehab /* ivtv_stream utility functions */ 79*b285192aSMauro Carvalho Chehab int ivtv_stream_alloc(struct ivtv_stream *s); 80*b285192aSMauro Carvalho Chehab void ivtv_stream_free(struct ivtv_stream *s); 81*b285192aSMauro Carvalho Chehab 82*b285192aSMauro Carvalho Chehab static inline void ivtv_stream_sync_for_cpu(struct ivtv_stream *s) 83*b285192aSMauro Carvalho Chehab { 84*b285192aSMauro Carvalho Chehab if (ivtv_use_dma(s)) 85*b285192aSMauro Carvalho Chehab pci_dma_sync_single_for_cpu(s->itv->pdev, s->sg_handle, 86*b285192aSMauro Carvalho Chehab sizeof(struct ivtv_sg_element), PCI_DMA_TODEVICE); 87*b285192aSMauro Carvalho Chehab } 88*b285192aSMauro Carvalho Chehab 89*b285192aSMauro Carvalho Chehab static inline void ivtv_stream_sync_for_device(struct ivtv_stream *s) 90*b285192aSMauro Carvalho Chehab { 91*b285192aSMauro Carvalho Chehab if (ivtv_use_dma(s)) 92*b285192aSMauro Carvalho Chehab pci_dma_sync_single_for_device(s->itv->pdev, s->sg_handle, 93*b285192aSMauro Carvalho Chehab sizeof(struct ivtv_sg_element), PCI_DMA_TODEVICE); 94*b285192aSMauro Carvalho Chehab } 95*b285192aSMauro Carvalho Chehab 96*b285192aSMauro Carvalho Chehab #endif 97