blob: 061550a6fb9941669655e5eb68463b01c089ac5d [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/*
2 * DMA region bookkeeping routines
3 *
4 * Copyright (C) 2002 Maas Digital LLC
5 *
6 * This code is licensed under the GPL. See the file COPYING in the root
7 * directory of the kernel sources for details.
8 */
9
10#ifndef IEEE1394_DMA_H
11#define IEEE1394_DMA_H
12
13#include <linux/pci.h>
14#include <asm/scatterlist.h>
15
16/* struct dma_prog_region
17
18 a small, physically-contiguous DMA buffer with random-access,
19 synchronous usage characteristics
20*/
21
22struct dma_prog_region {
23 unsigned char *kvirt; /* kernel virtual address */
24 struct pci_dev *dev; /* PCI device */
25 unsigned int n_pages; /* # of kernel pages */
26 dma_addr_t bus_addr; /* base bus address */
27};
28
29/* clear out all fields but do not allocate any memory */
30void dma_prog_region_init(struct dma_prog_region *prog);
31int dma_prog_region_alloc(struct dma_prog_region *prog, unsigned long n_bytes, struct pci_dev *dev);
32void dma_prog_region_free(struct dma_prog_region *prog);
33
34static inline dma_addr_t dma_prog_region_offset_to_bus(struct dma_prog_region *prog, unsigned long offset)
35{
36 return prog->bus_addr + offset;
37}
38
39/* struct dma_region
40
41 a large, non-physically-contiguous DMA buffer with streaming,
42 asynchronous usage characteristics
43*/
44
45struct dma_region {
46 unsigned char *kvirt; /* kernel virtual address */
47 struct pci_dev *dev; /* PCI device */
48 unsigned int n_pages; /* # of kernel pages */
49 unsigned int n_dma_pages; /* # of IOMMU pages */
50 struct scatterlist *sglist; /* IOMMU mapping */
51 int direction; /* PCI_DMA_TODEVICE, etc */
52};
53
54/* clear out all fields but do not allocate anything */
55void dma_region_init(struct dma_region *dma);
56
57/* allocate the buffer and map it to the IOMMU */
58int dma_region_alloc(struct dma_region *dma, unsigned long n_bytes, struct pci_dev *dev, int direction);
59
60/* unmap and free the buffer */
61void dma_region_free(struct dma_region *dma);
62
63/* sync the CPU's view of the buffer */
64void dma_region_sync_for_cpu(struct dma_region *dma, unsigned long offset, unsigned long len);
65/* sync the IO bus' view of the buffer */
66void dma_region_sync_for_device(struct dma_region *dma, unsigned long offset, unsigned long len);
67
68/* map the buffer into a user space process */
69int dma_region_mmap(struct dma_region *dma, struct file *file, struct vm_area_struct *vma);
70
71/* macro to index into a DMA region (or dma_prog_region) */
72#define dma_region_i(_dma, _type, _index) ( ((_type*) ((_dma)->kvirt)) + (_index) )
73
74/* return the DMA bus address of the byte with the given offset
75 relative to the beginning of the dma_region */
76dma_addr_t dma_region_offset_to_bus(struct dma_region *dma, unsigned long offset);
77
78#endif /* IEEE1394_DMA_H */