177512baaSThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */
27a7d9a89SMauro Carvalho Chehab /*
30705135eSGuennadi Liakhovetski  * helper functions for SG DMA video4linux capture buffers
47a7d9a89SMauro Carvalho Chehab  *
55d6aaf50SMagnus Damm  * The functions expect the hardware being able to scatter gather
67a7d9a89SMauro Carvalho Chehab  * (i.e. the buffers are not linear in physical memory, but fragmented
77a7d9a89SMauro Carvalho Chehab  * into PAGE_SIZE chunks).  They also assume the driver does not need
87a7d9a89SMauro Carvalho Chehab  * to touch the video data.
97a7d9a89SMauro Carvalho Chehab  *
1032590819SMauro Carvalho Chehab  * (c) 2007 Mauro Carvalho Chehab, <mchehab@kernel.org>
117a7d9a89SMauro Carvalho Chehab  *
127a7d9a89SMauro Carvalho Chehab  * Highly based on video-buf written originally by:
137a7d9a89SMauro Carvalho Chehab  * (c) 2001,02 Gerd Knorr <kraxel@bytesex.org>
1432590819SMauro Carvalho Chehab  * (c) 2006 Mauro Carvalho Chehab, <mchehab@kernel.org>
157a7d9a89SMauro Carvalho Chehab  * (c) 2006 Ted Walther and John Sokol
167a7d9a89SMauro Carvalho Chehab  */
177a02264cSPawel Osciak #ifndef _VIDEOBUF_DMA_SG_H
187a02264cSPawel Osciak #define _VIDEOBUF_DMA_SG_H
197a7d9a89SMauro Carvalho Chehab 
207a7d9a89SMauro Carvalho Chehab #include <media/videobuf-core.h>
217a7d9a89SMauro Carvalho Chehab 
227a7d9a89SMauro Carvalho Chehab /* --------------------------------------------------------------------- */
237a7d9a89SMauro Carvalho Chehab 
247a7d9a89SMauro Carvalho Chehab /*
257a7d9a89SMauro Carvalho Chehab  * A small set of helper functions to manage buffers (both userland
267a7d9a89SMauro Carvalho Chehab  * and kernel) for DMA.
277a7d9a89SMauro Carvalho Chehab  *
287a7d9a89SMauro Carvalho Chehab  * videobuf_dma_init_*()
297a7d9a89SMauro Carvalho Chehab  *	creates a buffer.  The userland version takes a userspace
307a7d9a89SMauro Carvalho Chehab  *	pointer + length.  The kernel version just wants the size and
317a7d9a89SMauro Carvalho Chehab  *	does memory allocation too using vmalloc_32().
327a7d9a89SMauro Carvalho Chehab  *
337a7d9a89SMauro Carvalho Chehab  * videobuf_dma_*()
34985098a0SMauro Carvalho Chehab  *	see Documentation/core-api/dma-api-howto.rst, these functions to
357a7d9a89SMauro Carvalho Chehab  *	basically the same.  The map function does also build a
367a7d9a89SMauro Carvalho Chehab  *	scatterlist for the buffer (and unmap frees it ...)
377a7d9a89SMauro Carvalho Chehab  *
387a7d9a89SMauro Carvalho Chehab  * videobuf_dma_free()
397a7d9a89SMauro Carvalho Chehab  *	no comment ...
407a7d9a89SMauro Carvalho Chehab  *
417a7d9a89SMauro Carvalho Chehab  */
427a7d9a89SMauro Carvalho Chehab 
437a7d9a89SMauro Carvalho Chehab struct videobuf_dmabuf {
447a7d9a89SMauro Carvalho Chehab 	u32                 magic;
457a7d9a89SMauro Carvalho Chehab 
467a7d9a89SMauro Carvalho Chehab 	/* for userland buffer */
477a7d9a89SMauro Carvalho Chehab 	int                 offset;
482fc11536SHans Verkuil 	size_t		    size;
497a7d9a89SMauro Carvalho Chehab 	struct page         **pages;
507a7d9a89SMauro Carvalho Chehab 
517a7d9a89SMauro Carvalho Chehab 	/* for kernel buffers */
52bb6dbe74SLaurent Pinchart 	void                *vaddr;
537b4eeed1SJames Harper 	struct page         **vaddr_pages;
547b4eeed1SJames Harper 	dma_addr_t          *dma_addr;
557b4eeed1SJames Harper 	struct device       *dev;
567a7d9a89SMauro Carvalho Chehab 
577a7d9a89SMauro Carvalho Chehab 	/* for overlay buffers (pci-pci dma) */
587a7d9a89SMauro Carvalho Chehab 	dma_addr_t          bus_addr;
597a7d9a89SMauro Carvalho Chehab 
607a7d9a89SMauro Carvalho Chehab 	/* common */
617a7d9a89SMauro Carvalho Chehab 	struct scatterlist  *sglist;
627a7d9a89SMauro Carvalho Chehab 	int                 sglen;
631faa39e0SMauro Carvalho Chehab 	unsigned long       nr_pages;
647a7d9a89SMauro Carvalho Chehab 	int                 direction;
657a7d9a89SMauro Carvalho Chehab };
667a7d9a89SMauro Carvalho Chehab 
677a02264cSPawel Osciak struct videobuf_dma_sg_memory {
687a7d9a89SMauro Carvalho Chehab 	u32                 magic;
697a7d9a89SMauro Carvalho Chehab 
707a7d9a89SMauro Carvalho Chehab 	/* for mmap'ed buffers */
717a7d9a89SMauro Carvalho Chehab 	struct videobuf_dmabuf  dma;
727a7d9a89SMauro Carvalho Chehab };
737a7d9a89SMauro Carvalho Chehab 
7495268403SLaurent Pinchart /*
7595268403SLaurent Pinchart  * Scatter-gather DMA buffer API.
7695268403SLaurent Pinchart  *
7795268403SLaurent Pinchart  * These functions provide a simple way to create a page list and a
7895268403SLaurent Pinchart  * scatter-gather list from a kernel, userspace of physical address and map the
7995268403SLaurent Pinchart  * memory for DMA operation.
8095268403SLaurent Pinchart  *
8195268403SLaurent Pinchart  * Despite the name, this is totally unrelated to videobuf, except that
8295268403SLaurent Pinchart  * videobuf-dma-sg uses the same API internally.
8395268403SLaurent Pinchart  */
847a7d9a89SMauro Carvalho Chehab int videobuf_dma_free(struct videobuf_dmabuf *dma);
857a7d9a89SMauro Carvalho Chehab 
8695268403SLaurent Pinchart int videobuf_dma_unmap(struct device *dev, struct videobuf_dmabuf *dma);
877a7d9a89SMauro Carvalho Chehab struct videobuf_dmabuf *videobuf_to_dma(struct videobuf_buffer *buf);
887a7d9a89SMauro Carvalho Chehab 
890705135eSGuennadi Liakhovetski void *videobuf_sg_alloc(size_t size);
907a7d9a89SMauro Carvalho Chehab 
910705135eSGuennadi Liakhovetski void videobuf_queue_sg_init(struct videobuf_queue *q,
9238a54f35SJonathan Corbet 			 const struct videobuf_queue_ops *ops,
930705135eSGuennadi Liakhovetski 			 struct device *dev,
947a7d9a89SMauro Carvalho Chehab 			 spinlock_t *irqlock,
957a7d9a89SMauro Carvalho Chehab 			 enum v4l2_buf_type type,
967a7d9a89SMauro Carvalho Chehab 			 enum v4l2_field field,
977a7d9a89SMauro Carvalho Chehab 			 unsigned int msize,
9808bff03eSHans Verkuil 			 void *priv,
9908bff03eSHans Verkuil 			 struct mutex *ext_lock);
1007a7d9a89SMauro Carvalho Chehab 
1017a02264cSPawel Osciak #endif /* _VIDEOBUF_DMA_SG_H */
1027a02264cSPawel Osciak 
103