Commit dcff5c66 authored by James Bottomley's avatar James Bottomley

Update the generic DMA API to take GFP_ flags on allocation

dma_alloc_[non]coherent now takes the GFP_ flags as the last argument.
The flags passed in may not interfere with the memory zone.
parent bcd998aa
...@@ -22,7 +22,7 @@ To get the dma_ API, you must #include <linux/dma-mapping.h> ...@@ -22,7 +22,7 @@ To get the dma_ API, you must #include <linux/dma-mapping.h>
void * void *
dma_alloc_coherent(struct device *dev, size_t size, dma_alloc_coherent(struct device *dev, size_t size,
dma_addr_t *dma_handle) dma_addr_t *dma_handle, int flag)
void * void *
pci_alloc_consistent(struct pci_dev *dev, size_t size, pci_alloc_consistent(struct pci_dev *dev, size_t size,
dma_addr_t *dma_handle) dma_addr_t *dma_handle)
...@@ -43,6 +43,12 @@ Note: consistent memory can be expensive on some platforms, and the ...@@ -43,6 +43,12 @@ Note: consistent memory can be expensive on some platforms, and the
minimum allocation length may be as big as a page, so you should minimum allocation length may be as big as a page, so you should
consolidate your requests for consistent memory as much as possible. consolidate your requests for consistent memory as much as possible.
The flag parameter (dma_alloc_coherent only) allows the caller to
specify the GFP_ flags (see kmalloc) for the allocation (the
implementation may chose to ignore flags that affect the location of
the returned memory, like GFP_DMA). For pci_alloc_consistent, you
must assume GFP_ATOMIC behaviour.
void void
dma_free_coherent(struct device *dev, size_t size, void *cpu_addr dma_free_coherent(struct device *dev, size_t size, void *cpu_addr
dma_addr_t dma_handle) dma_addr_t dma_handle)
...@@ -261,7 +267,7 @@ API at all. ...@@ -261,7 +267,7 @@ API at all.
void * void *
dma_alloc_noncoherent(struct device *dev, size_t size, dma_alloc_noncoherent(struct device *dev, size_t size,
dma_addr_t *dma_handle) dma_addr_t *dma_handle, int flag)
Identical to dma_alloc_coherent() except that the platform will Identical to dma_alloc_coherent() except that the platform will
choose to return either consistent or non-consistent memory as it sees choose to return either consistent or non-consistent memory as it sees
......
...@@ -30,9 +30,10 @@ dma_set_mask(struct device *dev, u64 dma_mask) ...@@ -30,9 +30,10 @@ dma_set_mask(struct device *dev, u64 dma_mask)
} }
static inline void * static inline void *
dma_alloc_coherent(struct device *dev, size_t size, dma_addr_t *dma_handle) dma_alloc_coherent(struct device *dev, size_t size, dma_addr_t *dma_handle,
int flag)
{ {
BUG_ON(dev->bus != &pci_bus_type); BUG_ON(dev->bus != &pci_bus_type || (flag & GFP_ATOMIC) != GFP_ATOMIC);
return pci_alloc_consistent(to_pci_dev(dev), size, dma_handle); return pci_alloc_consistent(to_pci_dev(dev), size, dma_handle);
} }
...@@ -121,7 +122,7 @@ dma_sync_sg(struct device *dev, struct scatterlist *sg, int nelems, ...@@ -121,7 +122,7 @@ dma_sync_sg(struct device *dev, struct scatterlist *sg, int nelems,
/* Now for the API extensions over the pci_ one */ /* Now for the API extensions over the pci_ one */
#define dma_alloc_noncoherent(d, s, h) dma_alloc_coherent(d, s, h) #define dma_alloc_noncoherent(d, s, h, f) dma_alloc_coherent(d, s, h, f)
#define dma_free_noncoherent(d, s, v, h) dma_free_coherent(d, s, v, h) #define dma_free_noncoherent(d, s, v, h) dma_free_coherent(d, s, v, h)
#define dma_is_consistent(d) (1) #define dma_is_consistent(d) (1)
......
...@@ -19,7 +19,7 @@ static inline void * ...@@ -19,7 +19,7 @@ static inline void *
pci_alloc_consistent(struct pci_dev *hwdev, size_t size, pci_alloc_consistent(struct pci_dev *hwdev, size_t size,
dma_addr_t *dma_handle) dma_addr_t *dma_handle)
{ {
return dma_alloc_coherent(hwdev == NULL ? NULL : &hwdev->dev, size, dma_handle); return dma_alloc_coherent(hwdev == NULL ? NULL : &hwdev->dev, size, dma_handle, GFP_ATOMIC);
} }
static inline void static inline void
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment