2005-04-17 02:20:36 +04:00
/*
* DMA region bookkeeping routines
*
* Copyright ( C ) 2002 Maas Digital LLC
*
* This code is licensed under the GPL . See the file COPYING in the root
* directory of the kernel sources for details .
*/
# ifndef IEEE1394_DMA_H
# define IEEE1394_DMA_H
2006-07-03 20:02:29 +04:00
# include <asm/types.h>
struct pci_dev ;
struct scatterlist ;
struct vm_area_struct ;
2005-04-17 02:20:36 +04:00
2006-07-03 20:02:28 +04:00
/**
* struct dma_prog_region - small contiguous DMA buffer
* @ kvirt : kernel virtual address
* @ dev : PCI device
* @ n_pages : number of kernel pages
* @ bus_addr : base bus address
*
* a small , physically contiguous DMA buffer with random - access , synchronous
* usage characteristics
*/
2005-04-17 02:20:36 +04:00
struct dma_prog_region {
2006-07-03 20:02:28 +04:00
unsigned char * kvirt ;
struct pci_dev * dev ;
unsigned int n_pages ;
dma_addr_t bus_addr ;
2005-04-17 02:20:36 +04:00
} ;
/* clear out all fields but do not allocate any memory */
void dma_prog_region_init ( struct dma_prog_region * prog ) ;
2006-07-03 20:02:28 +04:00
int dma_prog_region_alloc ( struct dma_prog_region * prog , unsigned long n_bytes ,
struct pci_dev * dev ) ;
2005-04-17 02:20:36 +04:00
void dma_prog_region_free ( struct dma_prog_region * prog ) ;
2006-07-03 20:02:28 +04:00
static inline dma_addr_t dma_prog_region_offset_to_bus (
struct dma_prog_region * prog , unsigned long offset )
2005-04-17 02:20:36 +04:00
{
return prog - > bus_addr + offset ;
}
2006-07-03 20:02:28 +04:00
/**
* struct dma_region - large non - contiguous DMA buffer
* @ virt : kernel virtual address
* @ dev : PCI device
* @ n_pages : number of kernel pages
* @ n_dma_pages : number of IOMMU pages
* @ sglist : IOMMU mapping
* @ direction : PCI_DMA_TODEVICE , etc .
*
* a large , non - physically - contiguous DMA buffer with streaming , asynchronous
* usage characteristics
*/
2005-04-17 02:20:36 +04:00
struct dma_region {
2006-07-03 20:02:28 +04:00
unsigned char * kvirt ;
struct pci_dev * dev ;
unsigned int n_pages ;
unsigned int n_dma_pages ;
struct scatterlist * sglist ;
int direction ;
2005-04-17 02:20:36 +04:00
} ;
/* clear out all fields but do not allocate anything */
void dma_region_init ( struct dma_region * dma ) ;
/* allocate the buffer and map it to the IOMMU */
2006-07-03 20:02:28 +04:00
int dma_region_alloc ( struct dma_region * dma , unsigned long n_bytes ,
struct pci_dev * dev , int direction ) ;
2005-04-17 02:20:36 +04:00
/* unmap and free the buffer */
void dma_region_free ( struct dma_region * dma ) ;
/* sync the CPU's view of the buffer */
2006-07-03 20:02:28 +04:00
void dma_region_sync_for_cpu ( struct dma_region * dma , unsigned long offset ,
unsigned long len ) ;
2005-04-17 02:20:36 +04:00
/* sync the IO bus' view of the buffer */
2006-07-03 20:02:28 +04:00
void dma_region_sync_for_device ( struct dma_region * dma , unsigned long offset ,
unsigned long len ) ;
2005-04-17 02:20:36 +04:00
/* map the buffer into a user space process */
2006-07-03 20:02:28 +04:00
int dma_region_mmap ( struct dma_region * dma , struct file * file ,
struct vm_area_struct * vma ) ;
2005-04-17 02:20:36 +04:00
/* macro to index into a DMA region (or dma_prog_region) */
2006-07-03 20:02:28 +04:00
# define dma_region_i(_dma, _type, _index) \
( ( ( _type * ) ( ( _dma ) - > kvirt ) ) + ( _index ) )
2005-04-17 02:20:36 +04:00
/* return the DMA bus address of the byte with the given offset
2006-07-03 20:02:28 +04:00
* relative to the beginning of the dma_region */
dma_addr_t dma_region_offset_to_bus ( struct dma_region * dma ,
unsigned long offset ) ;
2005-04-17 02:20:36 +04:00
# endif /* IEEE1394_DMA_H */