diff options
Diffstat (limited to 'arch/mips/mm/dma-default.c')
| -rw-r--r-- | arch/mips/mm/dma-default.c | 25 | 
1 files changed, 23 insertions, 2 deletions
diff --git a/arch/mips/mm/dma-default.c b/arch/mips/mm/dma-default.c index f9ef83829a52..caf92ecb37d6 100644 --- a/arch/mips/mm/dma-default.c +++ b/arch/mips/mm/dma-default.c @@ -22,6 +22,26 @@  #include <dma-coherence.h> +int coherentio = 0;	/* User defined DMA coherency from command line. */ +EXPORT_SYMBOL_GPL(coherentio); +int hw_coherentio = 0;	/* Actual hardware supported DMA coherency setting. */ + +static int __init setcoherentio(char *str) +{ +	coherentio = 1; +	pr_info("Hardware DMA cache coherency (command line)\n"); +	return 0; +} +early_param("coherentio", setcoherentio); + +static int __init setnocoherentio(char *str) +{ +	coherentio = 0; +	pr_info("Software DMA cache coherency (command line)\n"); +	return 0; +} +early_param("nocoherentio", setnocoherentio); +  static inline struct page *dma_addr_to_page(struct device *dev,  	dma_addr_t dma_addr)  { @@ -115,7 +135,8 @@ static void *mips_dma_alloc_coherent(struct device *dev, size_t size,  		if (!plat_device_is_coherent(dev)) {  			dma_cache_wback_inv((unsigned long) ret, size); -			ret = UNCAC_ADDR(ret); +			if (!hw_coherentio) +				ret = UNCAC_ADDR(ret);  		}  	} @@ -142,7 +163,7 @@ static void mips_dma_free_coherent(struct device *dev, size_t size, void *vaddr,  	plat_unmap_dma_mem(dev, dma_handle, size, DMA_BIDIRECTIONAL); -	if (!plat_device_is_coherent(dev)) +	if (!plat_device_is_coherent(dev) && !hw_coherentio)  		addr = CAC_ADDR(addr);  	free_pages(addr, get_order(size));  |