Commit 1be53e08 authored by Michal Simek's avatar Michal Simek

microblaze: Fix dma alloc and free coherent dma functions

We have to use consistent code to be able to do coherent dma
function. In consistent code is used cache inhibit page mapping.
Xilinx reported that there is bug in Microblaze for WB and
d-cache_always use option. Microblaze 7.30.a should be first version
where is this bug removed.
Signed-off-by: default avatarMichal Simek <monstr@monstr.eu>
parent 3a0d7a4d
...@@ -43,9 +43,14 @@ static unsigned long get_dma_direct_offset(struct device *dev) ...@@ -43,9 +43,14 @@ static unsigned long get_dma_direct_offset(struct device *dev)
return PCI_DRAM_OFFSET; /* FIXME Not sure if is correct */ return PCI_DRAM_OFFSET; /* FIXME Not sure if is correct */
} }
void *dma_direct_alloc_coherent(struct device *dev, size_t size, #define NOT_COHERENT_CACHE
static void *dma_direct_alloc_coherent(struct device *dev, size_t size,
dma_addr_t *dma_handle, gfp_t flag) dma_addr_t *dma_handle, gfp_t flag)
{ {
#ifdef NOT_COHERENT_CACHE
return consistent_alloc(flag, size, dma_handle);
#else
void *ret; void *ret;
struct page *page; struct page *page;
int node = dev_to_node(dev); int node = dev_to_node(dev);
...@@ -61,12 +66,17 @@ void *dma_direct_alloc_coherent(struct device *dev, size_t size, ...@@ -61,12 +66,17 @@ void *dma_direct_alloc_coherent(struct device *dev, size_t size,
*dma_handle = virt_to_phys(ret) + get_dma_direct_offset(dev); *dma_handle = virt_to_phys(ret) + get_dma_direct_offset(dev);
return ret; return ret;
#endif
} }
void dma_direct_free_coherent(struct device *dev, size_t size, static void dma_direct_free_coherent(struct device *dev, size_t size,
void *vaddr, dma_addr_t dma_handle) void *vaddr, dma_addr_t dma_handle)
{ {
#ifdef NOT_COHERENT_CACHE
consistent_free(vaddr);
#else
free_pages((unsigned long)vaddr, get_order(size)); free_pages((unsigned long)vaddr, get_order(size));
#endif
} }
static int dma_direct_map_sg(struct device *dev, struct scatterlist *sgl, static int dma_direct_map_sg(struct device *dev, struct scatterlist *sgl,
...@@ -105,7 +115,6 @@ static inline dma_addr_t dma_direct_map_page(struct device *dev, ...@@ -105,7 +115,6 @@ static inline dma_addr_t dma_direct_map_page(struct device *dev,
enum dma_data_direction direction, enum dma_data_direction direction,
struct dma_attrs *attrs) struct dma_attrs *attrs)
{ {
BUG_ON(direction == DMA_NONE);
__dma_sync_page(page_to_phys(page), offset, size, direction); __dma_sync_page(page_to_phys(page), offset, size, direction);
return page_to_phys(page) + offset + get_dma_direct_offset(dev); return page_to_phys(page) + offset + get_dma_direct_offset(dev);
} }
...@@ -121,7 +130,7 @@ static inline void dma_direct_unmap_page(struct device *dev, ...@@ -121,7 +130,7 @@ static inline void dma_direct_unmap_page(struct device *dev,
* phys_to_virt is here because in __dma_sync_page is __virt_to_phys and * phys_to_virt is here because in __dma_sync_page is __virt_to_phys and
* dma_address is physical address * dma_address is physical address
*/ */
__dma_sync_page((void *)dma_address, 0 , size, direction); __dma_sync_page(dma_address, 0 , size, direction);
} }
struct dma_map_ops dma_direct_ops = { struct dma_map_ops dma_direct_ops = {
......
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