MIPS: Fix `dma_alloc_coherent' returning a non-coherent allocation
Fix a MIPS `dma_alloc_coherent' regression from commitbc3ec75de5
("dma-mapping: merge direct and noncoherent ops") that causes a cached allocation to be returned on noncoherent cache systems. This is due to an inverted check now used in the MIPS implementation of `arch_dma_alloc' on the result from `dma_direct_alloc_pages' before doing the cached-to-uncached mapping of the allocation address obtained. The mapping has to be done for a non-NULL rather than NULL result, because a NULL result means the allocation has failed. Invert the check for correct operation then. Signed-off-by: Maciej W. Rozycki <macro@linux-mips.org> Signed-off-by: Paul Burton <paul.burton@mips.com> Reviewed-by: Christoph Hellwig <hch@lst.de> Fixes:bc3ec75de5
("dma-mapping: merge direct and noncoherent ops") Patchwork: https://patchwork.linux-mips.org/patch/20965/
This commit is contained in:
parent
c0fae7e245
commit
d01501f852
|
@ -50,7 +50,7 @@ void *arch_dma_alloc(struct device *dev, size_t size,
|
||||||
void *ret;
|
void *ret;
|
||||||
|
|
||||||
ret = dma_direct_alloc_pages(dev, size, dma_handle, gfp, attrs);
|
ret = dma_direct_alloc_pages(dev, size, dma_handle, gfp, attrs);
|
||||||
if (!ret && !(attrs & DMA_ATTR_NON_CONSISTENT)) {
|
if (ret && !(attrs & DMA_ATTR_NON_CONSISTENT)) {
|
||||||
dma_cache_wback_inv((unsigned long) ret, size);
|
dma_cache_wback_inv((unsigned long) ret, size);
|
||||||
ret = (void *)UNCAC_ADDR(ret);
|
ret = (void *)UNCAC_ADDR(ret);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue