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