Blame view

include/media/videobuf-dma-sg.h 3.29 KB
7a7d9a89d   Mauro Carvalho Chehab   V4L/DVB (6251): R...
1
  /*
0705135e5   Guennadi Liakhovetski   V4L/DVB (7237): C...
2
   * helper functions for SG DMA video4linux capture buffers
7a7d9a89d   Mauro Carvalho Chehab   V4L/DVB (6251): R...
3
   *
5d6aaf50e   Magnus Damm   V4L/DVB (8340): v...
4
   * The functions expect the hardware being able to scatter gather
7a7d9a89d   Mauro Carvalho Chehab   V4L/DVB (6251): R...
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
   * (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, <mchehab@infradead.org>
   *
   * Highly based on video-buf written originally by:
   * (c) 2001,02 Gerd Knorr <kraxel@bytesex.org>
   * (c) 2006 Mauro Carvalho Chehab, <mchehab@infradead.org>
   * (c) 2006 Ted Walther and John Sokol
   *
   * This program is free software; you can redistribute it and/or modify
   * it under the terms of the GNU General Public License as published by
   * the Free Software Foundation; either version 2
   */
7a02264ca   Pawel Osciak   V4L/DVB: v4l: vid...
20
21
  #ifndef _VIDEOBUF_DMA_SG_H
  #define _VIDEOBUF_DMA_SG_H
7a7d9a89d   Mauro Carvalho Chehab   V4L/DVB (6251): R...
22
23
24
25
26
27
  
  #include <media/videobuf-core.h>
  
  /* --------------------------------------------------------------------- */
  
  /*
7a7d9a89d   Mauro Carvalho Chehab   V4L/DVB (6251): R...
28
29
30
31
32
33
34
35
36
   * 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_*()
395cf9691   Paul Bolle   doc: fix broken r...
37
   *	see Documentation/DMA-API-HOWTO.txt, these functions to
7a7d9a89d   Mauro Carvalho Chehab   V4L/DVB (6251): R...
38
39
40
41
42
43
44
45
46
47
48
49
50
   *	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;
2fc11536c   Hans Verkuil   V4L/DVB: videobuf...
51
  	size_t		    size;
7a7d9a89d   Mauro Carvalho Chehab   V4L/DVB (6251): R...
52
53
54
  	struct page         **pages;
  
  	/* for kernel buffers */
bb6dbe748   Laurent Pinchart   V4L/DVB: videobuf...
55
  	void                *vaddr;
7a7d9a89d   Mauro Carvalho Chehab   V4L/DVB (6251): R...
56

7a7d9a89d   Mauro Carvalho Chehab   V4L/DVB (6251): R...
57
58
59
60
61
62
63
64
65
  	/* for overlay buffers (pci-pci dma) */
  	dma_addr_t          bus_addr;
  
  	/* common */
  	struct scatterlist  *sglist;
  	int                 sglen;
  	int                 nr_pages;
  	int                 direction;
  };
7a02264ca   Pawel Osciak   V4L/DVB: v4l: vid...
66
  struct videobuf_dma_sg_memory {
7a7d9a89d   Mauro Carvalho Chehab   V4L/DVB (6251): R...
67
68
69
  	u32                 magic;
  
  	/* for mmap'ed buffers */
7a7d9a89d   Mauro Carvalho Chehab   V4L/DVB (6251): R...
70
71
  	struct videobuf_dmabuf  dma;
  };
952684035   Laurent Pinchart   V4L/DVB: videobuf...
72
73
74
75
76
77
78
79
80
81
  /*
   * 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.
   */
7a7d9a89d   Mauro Carvalho Chehab   V4L/DVB (6251): R...
82
83
84
85
86
87
88
89
  void videobuf_dma_init(struct videobuf_dmabuf *dma);
  int videobuf_dma_init_user(struct videobuf_dmabuf *dma, int direction,
  			   unsigned long data, unsigned long size);
  int videobuf_dma_init_kernel(struct videobuf_dmabuf *dma, int direction,
  			     int nr_pages);
  int videobuf_dma_init_overlay(struct videobuf_dmabuf *dma, int direction,
  			      dma_addr_t addr, int nr_pages);
  int videobuf_dma_free(struct videobuf_dmabuf *dma);
952684035   Laurent Pinchart   V4L/DVB: videobuf...
90
91
  int videobuf_dma_map(struct device *dev, struct videobuf_dmabuf *dma);
  int videobuf_dma_unmap(struct device *dev, struct videobuf_dmabuf *dma);
7a02264ca   Pawel Osciak   V4L/DVB: v4l: vid...
92
  struct videobuf_dmabuf *videobuf_to_dma(struct videobuf_buffer *buf);
7a7d9a89d   Mauro Carvalho Chehab   V4L/DVB (6251): R...
93

0705135e5   Guennadi Liakhovetski   V4L/DVB (7237): C...
94
  void *videobuf_sg_alloc(size_t size);
7a7d9a89d   Mauro Carvalho Chehab   V4L/DVB (6251): R...
95

7a02264ca   Pawel Osciak   V4L/DVB: v4l: vid...
96
  void videobuf_queue_sg_init(struct videobuf_queue *q,
38a54f35a   Jonathan Corbet   V4L/DVB (13377): ...
97
  			 const struct videobuf_queue_ops *ops,
0705135e5   Guennadi Liakhovetski   V4L/DVB (7237): C...
98
  			 struct device *dev,
7a7d9a89d   Mauro Carvalho Chehab   V4L/DVB (6251): R...
99
100
101
102
  			 spinlock_t *irqlock,
  			 enum v4l2_buf_type type,
  			 enum v4l2_field field,
  			 unsigned int msize,
08bff03ed   Hans Verkuil   V4L/DVB: videobuf...
103
104
  			 void *priv,
  			 struct mutex *ext_lock);
7a7d9a89d   Mauro Carvalho Chehab   V4L/DVB (6251): R...
105

7a02264ca   Pawel Osciak   V4L/DVB: v4l: vid...
106
  #endif /* _VIDEOBUF_DMA_SG_H */