forked from Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
102 lines
2.8 KiB
102 lines
2.8 KiB
/* SPDX-License-Identifier: GPL-2.0-only */ |
|
/* |
|
* helper functions for SG DMA video4linux capture buffers |
|
* |
|
* The functions expect the hardware being able to scatter gather |
|
* (i.e. the buffers are not linear in physical memory, but fragmented |
|
* into PAGE_SIZE chunks). They also assume the driver does not need |
|
* to touch the video data. |
|
* |
|
* (c) 2007 Mauro Carvalho Chehab, <[email protected]> |
|
* |
|
* Highly based on video-buf written originally by: |
|
* (c) 2001,02 Gerd Knorr <[email protected]> |
|
* (c) 2006 Mauro Carvalho Chehab, <[email protected]> |
|
* (c) 2006 Ted Walther and John Sokol |
|
*/ |
|
#ifndef _VIDEOBUF_DMA_SG_H |
|
#define _VIDEOBUF_DMA_SG_H |
|
|
|
#include <media/videobuf-core.h> |
|
|
|
/* --------------------------------------------------------------------- */ |
|
|
|
/* |
|
* A small set of helper functions to manage buffers (both userland |
|
* and kernel) for DMA. |
|
* |
|
* videobuf_dma_init_*() |
|
* creates a buffer. The userland version takes a userspace |
|
* pointer + length. The kernel version just wants the size and |
|
* does memory allocation too using vmalloc_32(). |
|
* |
|
* videobuf_dma_*() |
|
* see Documentation/core-api/dma-api-howto.rst, these functions to |
|
* basically the same. The map function does also build a |
|
* scatterlist for the buffer (and unmap frees it ...) |
|
* |
|
* videobuf_dma_free() |
|
* no comment ... |
|
* |
|
*/ |
|
|
|
struct videobuf_dmabuf { |
|
u32 magic; |
|
|
|
/* for userland buffer */ |
|
int offset; |
|
size_t size; |
|
struct page **pages; |
|
|
|
/* for kernel buffers */ |
|
void *vaddr; |
|
struct page **vaddr_pages; |
|
dma_addr_t *dma_addr; |
|
struct device *dev; |
|
|
|
/* for overlay buffers (pci-pci dma) */ |
|
dma_addr_t bus_addr; |
|
|
|
/* common */ |
|
struct scatterlist *sglist; |
|
int sglen; |
|
unsigned long nr_pages; |
|
int direction; |
|
}; |
|
|
|
struct videobuf_dma_sg_memory { |
|
u32 magic; |
|
|
|
/* for mmap'ed buffers */ |
|
struct videobuf_dmabuf dma; |
|
}; |
|
|
|
/* |
|
* Scatter-gather DMA buffer API. |
|
* |
|
* These functions provide a simple way to create a page list and a |
|
* scatter-gather list from a kernel, userspace of physical address and map the |
|
* memory for DMA operation. |
|
* |
|
* Despite the name, this is totally unrelated to videobuf, except that |
|
* videobuf-dma-sg uses the same API internally. |
|
*/ |
|
int videobuf_dma_free(struct videobuf_dmabuf *dma); |
|
|
|
int videobuf_dma_unmap(struct device *dev, struct videobuf_dmabuf *dma); |
|
struct videobuf_dmabuf *videobuf_to_dma(struct videobuf_buffer *buf); |
|
|
|
void *videobuf_sg_alloc(size_t size); |
|
|
|
void videobuf_queue_sg_init(struct videobuf_queue *q, |
|
const struct videobuf_queue_ops *ops, |
|
struct device *dev, |
|
spinlock_t *irqlock, |
|
enum v4l2_buf_type type, |
|
enum v4l2_field field, |
|
unsigned int msize, |
|
void *priv, |
|
struct mutex *ext_lock); |
|
|
|
#endif /* _VIDEOBUF_DMA_SG_H */ |
|
|
|
|