xref: /openbmc/linux/drivers/media/pci/ivtv/ivtv-queue.h (revision b285192a43f0432d82c2c10974204e78af0da596)
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