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; 63*1faa39e0SMauro 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