Blame view

include/media/videobuf-dma-sg.h 2.94 KB
81f7e3824   Eric Lee   Initial Release, ...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
  /*
   * 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, <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
   */
  #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/DMA-API-HOWTO.txt, 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;
  	int                 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 */