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