Commit 4605f04b authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Linus Torvalds

c6x: convert to dma_map_ops

[dan.carpenter@oracle.com: C6X: fix build breakage]
Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Cc: Mark Salter <msalter@redhat.com>
Cc: Aurelien Jacquiot <a-jacquiot@ti.com>
Cc: Christian Borntraeger <borntraeger@de.ibm.com>
Cc: Joerg Roedel <jroedel@suse.de>
Cc: Sebastian Ott <sebott@linux.vnet.ibm.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 6f620975
...@@ -17,6 +17,8 @@ config C6X ...@@ -17,6 +17,8 @@ config C6X
select OF_EARLY_FLATTREE select OF_EARLY_FLATTREE
select GENERIC_CLOCKEVENTS select GENERIC_CLOCKEVENTS
select MODULES_USE_ELF_RELA select MODULES_USE_ELF_RELA
select ARCH_NO_COHERENT_DMA_MMAP
select HAVE_DMA_ATTRS
config MMU config MMU
def_bool n def_bool n
......
...@@ -12,104 +12,24 @@ ...@@ -12,104 +12,24 @@
#ifndef _ASM_C6X_DMA_MAPPING_H #ifndef _ASM_C6X_DMA_MAPPING_H
#define _ASM_C6X_DMA_MAPPING_H #define _ASM_C6X_DMA_MAPPING_H
#include <linux/dma-debug.h>
#include <asm-generic/dma-coherent.h>
#define dma_supported(d, m) 1
static inline void dma_sync_single_range_for_device(struct device *dev,
dma_addr_t addr,
unsigned long offset,
size_t size,
enum dma_data_direction dir)
{
}
static inline int dma_set_mask(struct device *dev, u64 dma_mask)
{
if (!dev->dma_mask || !dma_supported(dev, dma_mask))
return -EIO;
*dev->dma_mask = dma_mask;
return 0;
}
/* /*
* DMA errors are defined by all-bits-set in the DMA address. * DMA errors are defined by all-bits-set in the DMA address.
*/ */
static inline int dma_mapping_error(struct device *dev, dma_addr_t dma_addr) #define DMA_ERROR_CODE ~0
{
debug_dma_mapping_error(dev, dma_addr);
return dma_addr == ~0;
}
extern dma_addr_t dma_map_single(struct device *dev, void *cpu_addr,
size_t size, enum dma_data_direction dir);
extern void dma_unmap_single(struct device *dev, dma_addr_t handle,
size_t size, enum dma_data_direction dir);
extern int dma_map_sg(struct device *dev, struct scatterlist *sglist,
int nents, enum dma_data_direction direction);
extern void dma_unmap_sg(struct device *dev, struct scatterlist *sglist,
int nents, enum dma_data_direction direction);
static inline dma_addr_t dma_map_page(struct device *dev, struct page *page, extern struct dma_map_ops c6x_dma_ops;
unsigned long offset, size_t size,
enum dma_data_direction dir)
{
dma_addr_t handle;
handle = dma_map_single(dev, page_address(page) + offset, size, dir);
debug_dma_map_page(dev, page, offset, size, dir, handle, false);
return handle;
}
static inline void dma_unmap_page(struct device *dev, dma_addr_t handle, static inline struct dma_map_ops *get_dma_ops(struct device *dev)
size_t size, enum dma_data_direction dir)
{ {
dma_unmap_single(dev, handle, size, dir); return &c6x_dma_ops;
debug_dma_unmap_page(dev, handle, size, dir, false);
} }
extern void dma_sync_single_for_cpu(struct device *dev, dma_addr_t handle, #include <asm-generic/dma-mapping-common.h>
size_t size, enum dma_data_direction dir);
extern void dma_sync_single_for_device(struct device *dev, dma_addr_t handle,
size_t size,
enum dma_data_direction dir);
extern void dma_sync_sg_for_cpu(struct device *dev, struct scatterlist *sg,
int nents, enum dma_data_direction dir);
extern void dma_sync_sg_for_device(struct device *dev, struct scatterlist *sg,
int nents, enum dma_data_direction dir);
extern void coherent_mem_init(u32 start, u32 size); extern void coherent_mem_init(u32 start, u32 size);
extern void *dma_alloc_coherent(struct device *, size_t, dma_addr_t *, gfp_t); void *c6x_dma_alloc(struct device *dev, size_t size, dma_addr_t *handle,
extern void dma_free_coherent(struct device *, size_t, void *, dma_addr_t); gfp_t gfp, struct dma_attrs *attrs);
void c6x_dma_free(struct device *dev, size_t size, void *vaddr,
#define dma_alloc_noncoherent(d, s, h, f) dma_alloc_coherent((d), (s), (h), (f)) dma_addr_t dma_handle, struct dma_attrs *attrs);
#define dma_free_noncoherent(d, s, v, h) dma_free_coherent((d), (s), (v), (h))
/* Not supported for now */
static inline int dma_mmap_coherent(struct device *dev,
struct vm_area_struct *vma, void *cpu_addr,
dma_addr_t dma_addr, size_t size)
{
return -EINVAL;
}
static inline int dma_get_sgtable(struct device *dev, struct sg_table *sgt,
void *cpu_addr, dma_addr_t dma_addr,
size_t size)
{
return -EINVAL;
}
#endif /* _ASM_C6X_DMA_MAPPING_H */ #endif /* _ASM_C6X_DMA_MAPPING_H */
...@@ -36,110 +36,101 @@ static void c6x_dma_sync(dma_addr_t handle, size_t size, ...@@ -36,110 +36,101 @@ static void c6x_dma_sync(dma_addr_t handle, size_t size,
} }
} }
dma_addr_t dma_map_single(struct device *dev, void *ptr, size_t size, static dma_addr_t c6x_dma_map_page(struct device *dev, struct page *page,
enum dma_data_direction dir) unsigned long offset, size_t size, enum dma_data_direction dir,
struct dma_attrs *attrs)
{ {
dma_addr_t addr = virt_to_phys(ptr); dma_addr_t handle = virt_to_phys(page_address(page) + offset);
c6x_dma_sync(addr, size, dir); c6x_dma_sync(handle, size, dir);
return handle;
debug_dma_map_page(dev, virt_to_page(ptr),
(unsigned long)ptr & ~PAGE_MASK, size,
dir, addr, true);
return addr;
} }
EXPORT_SYMBOL(dma_map_single);
void dma_unmap_single(struct device *dev, dma_addr_t handle, static void c6x_dma_unmap_page(struct device *dev, dma_addr_t handle,
size_t size, enum dma_data_direction dir) size_t size, enum dma_data_direction dir, struct dma_attrs *attrs)
{ {
c6x_dma_sync(handle, size, dir); c6x_dma_sync(handle, size, dir);
debug_dma_unmap_page(dev, handle, size, dir, true);
} }
EXPORT_SYMBOL(dma_unmap_single);
int dma_map_sg(struct device *dev, struct scatterlist *sglist, static int c6x_dma_map_sg(struct device *dev, struct scatterlist *sglist,
int nents, enum dma_data_direction dir) int nents, enum dma_data_direction dir, struct dma_attrs *attrs)
{ {
struct scatterlist *sg; struct scatterlist *sg;
int i; int i;
for_each_sg(sglist, sg, nents, i) for_each_sg(sglist, sg, nents, i) {
sg->dma_address = dma_map_single(dev, sg_virt(sg), sg->length, sg->dma_address = sg_phys(sg);
dir); c6x_dma_sync(sg->dma_address, sg->length, dir);
}
debug_dma_map_sg(dev, sglist, nents, nents, dir);
return nents; return nents;
} }
EXPORT_SYMBOL(dma_map_sg);
void dma_unmap_sg(struct device *dev, struct scatterlist *sglist, static void c6x_dma_unmap_sg(struct device *dev, struct scatterlist *sglist,
int nents, enum dma_data_direction dir) int nents, enum dma_data_direction dir,
struct dma_attrs *attrs)
{ {
struct scatterlist *sg; struct scatterlist *sg;
int i; int i;
for_each_sg(sglist, sg, nents, i) for_each_sg(sglist, sg, nents, i)
dma_unmap_single(dev, sg_dma_address(sg), sg->length, dir); c6x_dma_sync(sg_dma_address(sg), sg->length, dir);
debug_dma_unmap_sg(dev, sglist, nents, dir);
} }
EXPORT_SYMBOL(dma_unmap_sg);
void dma_sync_single_for_cpu(struct device *dev, dma_addr_t handle, static void c6x_dma_sync_single_for_cpu(struct device *dev, dma_addr_t handle,
size_t size, enum dma_data_direction dir) size_t size, enum dma_data_direction dir)
{ {
c6x_dma_sync(handle, size, dir); c6x_dma_sync(handle, size, dir);
debug_dma_sync_single_for_cpu(dev, handle, size, dir);
} }
EXPORT_SYMBOL(dma_sync_single_for_cpu);
static void c6x_dma_sync_single_for_device(struct device *dev,
void dma_sync_single_for_device(struct device *dev, dma_addr_t handle, dma_addr_t handle, size_t size, enum dma_data_direction dir)
size_t size, enum dma_data_direction dir)
{ {
c6x_dma_sync(handle, size, dir); c6x_dma_sync(handle, size, dir);
debug_dma_sync_single_for_device(dev, handle, size, dir);
} }
EXPORT_SYMBOL(dma_sync_single_for_device);
void dma_sync_sg_for_cpu(struct device *dev, struct scatterlist *sglist, static void c6x_dma_sync_sg_for_cpu(struct device *dev,
int nents, enum dma_data_direction dir) struct scatterlist *sglist, int nents,
enum dma_data_direction dir)
{ {
struct scatterlist *sg; struct scatterlist *sg;
int i; int i;
for_each_sg(sglist, sg, nents, i) for_each_sg(sglist, sg, nents, i)
dma_sync_single_for_cpu(dev, sg_dma_address(sg), c6x_dma_sync_single_for_cpu(dev, sg_dma_address(sg),
sg->length, dir); sg->length, dir);
debug_dma_sync_sg_for_cpu(dev, sglist, nents, dir);
} }
EXPORT_SYMBOL(dma_sync_sg_for_cpu);
void dma_sync_sg_for_device(struct device *dev, struct scatterlist *sglist, static void c6x_dma_sync_sg_for_device(struct device *dev,
int nents, enum dma_data_direction dir) struct scatterlist *sglist, int nents,
enum dma_data_direction dir)
{ {
struct scatterlist *sg; struct scatterlist *sg;
int i; int i;
for_each_sg(sglist, sg, nents, i) for_each_sg(sglist, sg, nents, i)
dma_sync_single_for_device(dev, sg_dma_address(sg), c6x_dma_sync_single_for_device(dev, sg_dma_address(sg),
sg->length, dir); sg->length, dir);
debug_dma_sync_sg_for_device(dev, sglist, nents, dir);
} }
EXPORT_SYMBOL(dma_sync_sg_for_device);
struct dma_map_ops c6x_dma_ops = {
.alloc = c6x_dma_alloc,
.free = c6x_dma_free,
.map_page = c6x_dma_map_page,
.unmap_page = c6x_dma_unmap_page,
.map_sg = c6x_dma_map_sg,
.unmap_sg = c6x_dma_unmap_sg,
.sync_single_for_device = c6x_dma_sync_single_for_device,
.sync_single_for_cpu = c6x_dma_sync_single_for_cpu,
.sync_sg_for_device = c6x_dma_sync_sg_for_device,
.sync_sg_for_cpu = c6x_dma_sync_sg_for_cpu,
};
EXPORT_SYMBOL(c6x_dma_ops);
/* Number of entries preallocated for DMA-API debugging */ /* Number of entries preallocated for DMA-API debugging */
#define PREALLOC_DMA_DEBUG_ENTRIES (1 << 16) #define PREALLOC_DMA_DEBUG_ENTRIES (1 << 16)
......
...@@ -73,8 +73,8 @@ static void __free_dma_pages(u32 addr, int order) ...@@ -73,8 +73,8 @@ static void __free_dma_pages(u32 addr, int order)
* Allocate DMA coherent memory space and return both the kernel * Allocate DMA coherent memory space and return both the kernel
* virtual and DMA address for that space. * virtual and DMA address for that space.
*/ */
void *dma_alloc_coherent(struct device *dev, size_t size, void *c6x_dma_alloc(struct device *dev, size_t size, dma_addr_t *handle,
dma_addr_t *handle, gfp_t gfp) gfp_t gfp, struct dma_attrs *attrs)
{ {
u32 paddr; u32 paddr;
int order; int order;
...@@ -94,13 +94,12 @@ void *dma_alloc_coherent(struct device *dev, size_t size, ...@@ -94,13 +94,12 @@ void *dma_alloc_coherent(struct device *dev, size_t size,
return phys_to_virt(paddr); return phys_to_virt(paddr);
} }
EXPORT_SYMBOL(dma_alloc_coherent);
/* /*
* Free DMA coherent memory as defined by the above mapping. * Free DMA coherent memory as defined by the above mapping.
*/ */
void dma_free_coherent(struct device *dev, size_t size, void *vaddr, void c6x_dma_free(struct device *dev, size_t size, void *vaddr,
dma_addr_t dma_handle) dma_addr_t dma_handle, struct dma_attrs *attrs)
{ {
int order; int order;
...@@ -111,7 +110,6 @@ void dma_free_coherent(struct device *dev, size_t size, void *vaddr, ...@@ -111,7 +110,6 @@ void dma_free_coherent(struct device *dev, size_t size, void *vaddr,
__free_dma_pages(virt_to_phys(vaddr), order); __free_dma_pages(virt_to_phys(vaddr), order);
} }
EXPORT_SYMBOL(dma_free_coherent);
/* /*
* Initialise the coherent DMA memory allocator using the given uncached region. * Initialise the coherent DMA memory allocator using the given uncached region.
......
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