1/* 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 <asm/types.h> 14 15struct pci_dev; 16struct scatterlist; 17struct vm_area_struct; 18 19/** 20 * struct dma_prog_region - small contiguous DMA buffer 21 * @kvirt: kernel virtual address 22 * @dev: PCI device 23 * @n_pages: number of kernel pages 24 * @bus_addr: base bus address 25 * 26 * a small, physically contiguous DMA buffer with random-access, synchronous 27 * usage characteristics 28 */ 29struct dma_prog_region { 30 unsigned char *kvirt; 31 struct pci_dev *dev; 32 unsigned int n_pages; 33 dma_addr_t bus_addr; 34}; 35 36/* clear out all fields but do not allocate any memory */ 37void dma_prog_region_init(struct dma_prog_region *prog); 38int dma_prog_region_alloc(struct dma_prog_region *prog, unsigned long n_bytes, 39 struct pci_dev *dev); 40void dma_prog_region_free(struct dma_prog_region *prog); 41 42static inline dma_addr_t dma_prog_region_offset_to_bus( 43 struct dma_prog_region *prog, unsigned long offset) 44{ 45 return prog->bus_addr + offset; 46} 47 48/** 49 * struct dma_region - large non-contiguous DMA buffer 50 * @virt: kernel virtual address 51 * @dev: PCI device 52 * @n_pages: number of kernel pages 53 * @n_dma_pages: number of IOMMU pages 54 * @sglist: IOMMU mapping 55 * @direction: PCI_DMA_TODEVICE, etc. 56 * 57 * a large, non-physically-contiguous DMA buffer with streaming, asynchronous 58 * usage characteristics 59 */ 60struct dma_region { 61 unsigned char *kvirt; 62 struct pci_dev *dev; 63 unsigned int n_pages; 64 unsigned int n_dma_pages; 65 struct scatterlist *sglist; 66 int direction; 67}; 68 69void dma_region_init(struct dma_region *dma); 70int dma_region_alloc(struct dma_region *dma, unsigned long n_bytes, 71 struct pci_dev *dev, int direction); 72void dma_region_free(struct dma_region *dma); 73void dma_region_sync_for_cpu(struct dma_region *dma, unsigned long offset, 74 unsigned long len); 75void dma_region_sync_for_device(struct dma_region *dma, unsigned long offset, 76 unsigned long len); 77int dma_region_mmap(struct dma_region *dma, struct file *file, 78 struct vm_area_struct *vma); 79dma_addr_t dma_region_offset_to_bus(struct dma_region *dma, 80 unsigned long offset); 81 82/** 83 * dma_region_i - macro to index into a DMA region (or dma_prog_region) 84 */ 85#define dma_region_i(_dma, _type, _index) \ 86 ( ((_type*) ((_dma)->kvirt)) + (_index) ) 87 88#endif /* IEEE1394_DMA_H */ 89