hc
2023-11-07 f45e756958099c35d6afb746df1d40a1c6302cfc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
/*
 * helper functions for SG DMA video4linux capture buffers
 *
 * The functions expect the hardware being able to scatter gather
 * (i.e. the buffers are not linear in physical memory, but fragmented
 * into PAGE_SIZE chunks).  They also assume the driver does not need
 * to touch the video data.
 *
 * (c) 2007 Mauro Carvalho Chehab, <mchehab@kernel.org>
 *
 * Highly based on video-buf written originally by:
 * (c) 2001,02 Gerd Knorr <kraxel@bytesex.org>
 * (c) 2006 Mauro Carvalho Chehab, <mchehab@kernel.org>
 * (c) 2006 Ted Walther and John Sokol
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2
 */
#ifndef _VIDEOBUF_DMA_SG_H
#define _VIDEOBUF_DMA_SG_H
 
#include <media/videobuf-core.h>
 
/* --------------------------------------------------------------------- */
 
/*
 * A small set of helper functions to manage buffers (both userland
 * and kernel) for DMA.
 *
 * videobuf_dma_init_*()
 *    creates a buffer.  The userland version takes a userspace
 *    pointer + length.  The kernel version just wants the size and
 *    does memory allocation too using vmalloc_32().
 *
 * videobuf_dma_*()
 *    see Documentation/DMA-API-HOWTO.txt, these functions to
 *    basically the same.  The map function does also build a
 *    scatterlist for the buffer (and unmap frees it ...)
 *
 * videobuf_dma_free()
 *    no comment ...
 *
 */
 
struct videobuf_dmabuf {
   u32                 magic;
 
   /* for userland buffer */
   int                 offset;
   size_t            size;
   struct page         **pages;
 
   /* for kernel buffers */
   void                *vaddr;
   struct page         **vaddr_pages;
   dma_addr_t          *dma_addr;
   struct device       *dev;
 
   /* for overlay buffers (pci-pci dma) */
   dma_addr_t          bus_addr;
 
   /* common */
   struct scatterlist  *sglist;
   int                 sglen;
   int                 nr_pages;
   int                 direction;
};
 
struct videobuf_dma_sg_memory {
   u32                 magic;
 
   /* for mmap'ed buffers */
   struct videobuf_dmabuf  dma;
};
 
/*
 * Scatter-gather DMA buffer API.
 *
 * These functions provide a simple way to create a page list and a
 * scatter-gather list from a kernel, userspace of physical address and map the
 * memory for DMA operation.
 *
 * Despite the name, this is totally unrelated to videobuf, except that
 * videobuf-dma-sg uses the same API internally.
 */
int videobuf_dma_free(struct videobuf_dmabuf *dma);
 
int videobuf_dma_unmap(struct device *dev, struct videobuf_dmabuf *dma);
struct videobuf_dmabuf *videobuf_to_dma(struct videobuf_buffer *buf);
 
void *videobuf_sg_alloc(size_t size);
 
void videobuf_queue_sg_init(struct videobuf_queue *q,
            const struct videobuf_queue_ops *ops,
            struct device *dev,
            spinlock_t *irqlock,
            enum v4l2_buf_type type,
            enum v4l2_field field,
            unsigned int msize,
            void *priv,
            struct mutex *ext_lock);
 
#endif /* _VIDEOBUF_DMA_SG_H */