1 | /* SPDX-License-Identifier: GPL-2.0-or-later */ |
2 | /* |
3 | buffer queues. |
4 | Copyright (C) 2003-2004 Kevin Thayer <nufan_wfk at yahoo.com> |
5 | Copyright (C) 2004 Chris Kennedy <c@groovy.org> |
6 | Copyright (C) 2005-2007 Hans Verkuil <hverkuil@xs4all.nl> |
7 | |
8 | */ |
9 | |
10 | #ifndef IVTV_QUEUE_H |
11 | #define IVTV_QUEUE_H |
12 | |
13 | #define IVTV_DMA_UNMAPPED ((u32) -1) |
14 | #define SLICED_VBI_PIO 0 |
15 | |
16 | /* ivtv_buffer utility functions */ |
17 | |
18 | static inline int ivtv_might_use_pio(struct ivtv_stream *s) |
19 | { |
20 | return s->dma == DMA_NONE || (SLICED_VBI_PIO && s->type == IVTV_ENC_STREAM_TYPE_VBI); |
21 | } |
22 | |
23 | static inline int ivtv_use_pio(struct ivtv_stream *s) |
24 | { |
25 | struct ivtv *itv = s->itv; |
26 | |
27 | return s->dma == DMA_NONE || |
28 | (SLICED_VBI_PIO && s->type == IVTV_ENC_STREAM_TYPE_VBI && itv->vbi.sliced_in->service_set); |
29 | } |
30 | |
31 | static inline int ivtv_might_use_dma(struct ivtv_stream *s) |
32 | { |
33 | return s->dma != DMA_NONE; |
34 | } |
35 | |
36 | static inline int ivtv_use_dma(struct ivtv_stream *s) |
37 | { |
38 | return !ivtv_use_pio(s); |
39 | } |
40 | |
41 | static inline void ivtv_buf_sync_for_cpu(struct ivtv_stream *s, struct ivtv_buffer *buf) |
42 | { |
43 | if (ivtv_use_dma(s)) |
44 | dma_sync_single_for_cpu(dev: &s->itv->pdev->dev, addr: buf->dma_handle, |
45 | size: s->buf_size + 256, dir: s->dma); |
46 | } |
47 | |
48 | static inline void ivtv_buf_sync_for_device(struct ivtv_stream *s, struct ivtv_buffer *buf) |
49 | { |
50 | if (ivtv_use_dma(s)) |
51 | dma_sync_single_for_device(dev: &s->itv->pdev->dev, |
52 | addr: buf->dma_handle, size: s->buf_size + 256, |
53 | dir: s->dma); |
54 | } |
55 | |
56 | int ivtv_buf_copy_from_user(struct ivtv_stream *s, struct ivtv_buffer *buf, const char __user *src, int copybytes); |
57 | void ivtv_buf_swap(struct ivtv_buffer *buf); |
58 | |
59 | /* ivtv_queue utility functions */ |
60 | void ivtv_queue_init(struct ivtv_queue *q); |
61 | void ivtv_enqueue(struct ivtv_stream *s, struct ivtv_buffer *buf, struct ivtv_queue *q); |
62 | struct ivtv_buffer *ivtv_dequeue(struct ivtv_stream *s, struct ivtv_queue *q); |
63 | int ivtv_queue_move(struct ivtv_stream *s, struct ivtv_queue *from, struct ivtv_queue *steal, |
64 | struct ivtv_queue *to, int needed_bytes); |
65 | void ivtv_flush_queues(struct ivtv_stream *s); |
66 | |
67 | /* ivtv_stream utility functions */ |
68 | int ivtv_stream_alloc(struct ivtv_stream *s); |
69 | void ivtv_stream_free(struct ivtv_stream *s); |
70 | |
71 | static inline void ivtv_stream_sync_for_cpu(struct ivtv_stream *s) |
72 | { |
73 | if (ivtv_use_dma(s)) |
74 | dma_sync_single_for_cpu(dev: &s->itv->pdev->dev, addr: s->sg_handle, |
75 | size: sizeof(struct ivtv_sg_element), |
76 | dir: DMA_TO_DEVICE); |
77 | } |
78 | |
79 | static inline void ivtv_stream_sync_for_device(struct ivtv_stream *s) |
80 | { |
81 | if (ivtv_use_dma(s)) |
82 | dma_sync_single_for_device(dev: &s->itv->pdev->dev, addr: s->sg_handle, |
83 | size: sizeof(struct ivtv_sg_element), |
84 | dir: DMA_TO_DEVICE); |
85 | } |
86 | |
87 | #endif |
88 | |