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