Linux kernel & device driver programming

Cross-Referenced Linux and Device Driver Code

[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ]
Version: [ 2.6.11.8 ] [ 2.6.25 ] [ 2.6.25.8 ] [ 2.6.31.13 ] Architecture: [ i386 ]
  1 /*
  2  * helper functions for PCI DMA video4linux capture buffers
  3  *
  4  * The functions expect the hardware being able to scatter gatter
  5  * (i.e. the buffers are not linear in physical memory, but fragmented
  6  * into PAGE_SIZE chunks).  They also assume the driver does not need
  7  * to touch the video data.
  8  *
  9  * (c) 2007 Mauro Carvalho Chehab, <mchehab@infradead.org>
 10  *
 11  * Highly based on video-buf written originally by:
 12  * (c) 2001,02 Gerd Knorr <kraxel@bytesex.org>
 13  * (c) 2006 Mauro Carvalho Chehab, <mchehab@infradead.org>
 14  * (c) 2006 Ted Walther and John Sokol
 15  *
 16  * This program is free software; you can redistribute it and/or modify
 17  * it under the terms of the GNU General Public License as published by
 18  * the Free Software Foundation; either version 2
 19  */
 20 
 21 #include <media/videobuf-core.h>
 22 
 23 /* --------------------------------------------------------------------- */
 24 
 25 /*
 26  * Return a scatterlist for some page-aligned vmalloc()'ed memory
 27  * block (NULL on errors).  Memory for the scatterlist is allocated
 28  * using kmalloc.  The caller must free the memory.
 29  */
 30 struct scatterlist* videobuf_vmalloc_to_sg(unsigned char *virt, int nr_pages);
 31 
 32 /*
 33  * Return a scatterlist for a an array of userpages (NULL on errors).
 34  * Memory for the scatterlist is allocated using kmalloc.  The caller
 35  * must free the memory.
 36  */
 37 struct scatterlist* videobuf_pages_to_sg(struct page **pages, int nr_pages,
 38                                          int offset);
 39 
 40 /* --------------------------------------------------------------------- */
 41 
 42 /*
 43  * A small set of helper functions to manage buffers (both userland
 44  * and kernel) for DMA.
 45  *
 46  * videobuf_dma_init_*()
 47  *      creates a buffer.  The userland version takes a userspace
 48  *      pointer + length.  The kernel version just wants the size and
 49  *      does memory allocation too using vmalloc_32().
 50  *
 51  * videobuf_dma_*()
 52  *      see Documentation/DMA-mapping.txt, these functions to
 53  *      basically the same.  The map function does also build a
 54  *      scatterlist for the buffer (and unmap frees it ...)
 55  *
 56  * videobuf_dma_free()
 57  *      no comment ...
 58  *
 59  */
 60 
 61 struct videobuf_dmabuf {
 62         u32                 magic;
 63 
 64         /* for userland buffer */
 65         int                 offset;
 66         struct page         **pages;
 67 
 68         /* for kernel buffers */
 69         void                *vmalloc;
 70 
 71         /* Stores the userspace pointer to vmalloc area */
 72         void                *varea;
 73 
 74         /* for overlay buffers (pci-pci dma) */
 75         dma_addr_t          bus_addr;
 76 
 77         /* common */
 78         struct scatterlist  *sglist;
 79         int                 sglen;
 80         int                 nr_pages;
 81         int                 direction;
 82 };
 83 
 84 struct videbuf_pci_sg_memory
 85 {
 86         u32                 magic;
 87 
 88         /* for mmap'ed buffers */
 89         struct videobuf_dmabuf  dma;
 90 };
 91 
 92 void videobuf_dma_init(struct videobuf_dmabuf *dma);
 93 int videobuf_dma_init_user(struct videobuf_dmabuf *dma, int direction,
 94                            unsigned long data, unsigned long size);
 95 int videobuf_dma_init_kernel(struct videobuf_dmabuf *dma, int direction,
 96                              int nr_pages);
 97 int videobuf_dma_init_overlay(struct videobuf_dmabuf *dma, int direction,
 98                               dma_addr_t addr, int nr_pages);
 99 int videobuf_dma_free(struct videobuf_dmabuf *dma);
100 
101 int videobuf_dma_map(struct videobuf_queue* q,struct videobuf_dmabuf *dma);
102 int videobuf_dma_sync(struct videobuf_queue* q,struct videobuf_dmabuf *dma);
103 int videobuf_dma_unmap(struct videobuf_queue* q,struct videobuf_dmabuf *dma);
104 struct videobuf_dmabuf *videobuf_to_dma (struct videobuf_buffer *buf);
105 
106 void *videobuf_pci_alloc (size_t size);
107 
108 void videobuf_queue_pci_init(struct videobuf_queue* q,
109                          struct videobuf_queue_ops *ops,
110                          void *dev,
111                          spinlock_t *irqlock,
112                          enum v4l2_buf_type type,
113                          enum v4l2_field field,
114                          unsigned int msize,
115                          void *priv);
116 
117         /*FIXME: these variants are used only on *-alsa code, where videobuf is
118          * used without queue
119          */
120 int videobuf_pci_dma_map(struct pci_dev *pci,struct videobuf_dmabuf *dma);
121 int videobuf_pci_dma_unmap(struct pci_dev *pci,struct videobuf_dmabuf *dma);
122 
123 
  This page was automatically generated by the LXR engine.