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