|
|
Subscribe / Log in / New account

Driver porting: DMA API quick reference

This article is part of the LWN Porting Drivers to 2.5 series.
Here is a quick listing of the new generic DMA routines alongside their 2.4 equivalents. See the associated DMA changes article for a more thorough discussion of how the DMA support layer has changed in 2.5.

2.4 PCI version2.5 Generic version
int pci_set_dma_mask (struct pci_dev *dev,
                      u64 mask);
int dma_set_mask (struct device *dev,
                  u64 mask);
void *pci_alloc_consistent(struct pci_dev *dev,
                           size_t size,
			   dma_addr_t *dma_handle);
void *dma_alloc_coherent(struct device *dev,
                         size_t size,
			 dma_addr_t *dma_handle,
			 int flag);
(flag is a GFP_ allocation flag).
void pci_free_consistent(struct pci_dev *dev,
                         size_t size,
			 void *cpu_addr,
			 dma_addr_t dma_handle);
void dma_free_coherent(struct device *dev,
                         size_t size,
			 void *cpu_addr,
			 dma_addr_t dma_handle);
PCI_DMA_NONE
PCI_DMA_BIDIRECTIONAL
PCI_DMA_TODEVICE
PCI_DMA_FROMDEVICE
(Integer macros).
DMA_NONE
DMA_BIDIRECTIONAL
DMA_TODEVICE
DMA_FROMDEVICE
(Members of enum dma_data_direction).
dma_addr_t 
pci_map_single(struct pci_device *dev,
               void *addr,
	       size_t size,
	       int direction);
dma_addr_t 
dma_map_single(struct device *dev,
               void *addr,
	       size_t size,
	       enum dma_data_direction direction);

void 
pci_unmap_single(struct pci_device *dev,
                 dma_addr_t dma_handle,
		 size_t size,
		 int direction);
void 
dma_unmap_single(struct device *dev,
                 dma_addr_t dma_address,
		 size_t size,
		 enum dma_data_direction direction);
dma_addr_t
pci_map_page(struct pci_device *dev,
             struct page *page,
	     unsigned long offset,
	     size_t size,
	     int direction);
dma_addr_t
dma_map_page(struct device *dev,
             struct page *page,
	     unsigned long offset,
	     size_t size,
	     enum dma_data_direction direction);

void 
pci_unmap_page(struct pci_device *dev,
               dma_addr_t dma_address,
	       size_t size,
	       int direction);
void
dma_unmap_page(struct device *dev, 
               dma_addr_t dma_address, 
	       size_t size,
	       enum dma_data_direction direction);

int 
pci_map_sg(struct pci_device *dev,
           struct scatterlist *sglist,
	   int nents,
	   int direction);
int
dma_map_sg(struct device *dev, 
           struct scatterlist *sglist, 
	   int nents,
	   enum dma_data_direction direction);
(No address member in scatterlist structure; must use page pointers).
void
pci_unmap_sg(struct pci_device *dev,
             struct scatterlist *sglist,
	     int nents,
	     int direction);
void
dma_unmap_sg(struct device *dev, 
             struct scatterlist *sglist, 
	     int nents,
	     enum dma_data_direction direction);
void
pci_dma_sync_single(struct pci_dev *dev,
                    dma_addr_t dma_address,
		    size_t size,
		    int direction);
void
dma_sync_single(struct device *dev, 
                dma_addr_t dma_address, 
		size_t size,
		enum dma_data_direction direction);
void
pci_dma_sync_sg(struct pci_dev *dev,
                struct scatterlist *sglist,
		int nents,
		int direction);
void
dma_sync_sg(struct device *dev, 
            struct scatterlist *sglist, 
	    int nents,
	    enum dma_data_direction direction);


to post comments


Copyright © 2003, Eklektix, Inc.
Comments and public postings are copyrighted by their creators.
Linux is a registered trademark of Linus Torvalds