|
@@ -112,7 +112,7 @@ static gfp_t massage_gfp_flags(const struct device *dev, gfp_t gfp)
|
|
|
return gfp | dma_flag;
|
|
|
}
|
|
|
|
|
|
-void *dma_alloc_noncoherent(struct device *dev, size_t size,
|
|
|
+static void *mips_dma_alloc_noncoherent(struct device *dev, size_t size,
|
|
|
dma_addr_t * dma_handle, gfp_t gfp)
|
|
|
{
|
|
|
void *ret;
|
|
@@ -128,7 +128,6 @@ void *dma_alloc_noncoherent(struct device *dev, size_t size,
|
|
|
|
|
|
return ret;
|
|
|
}
|
|
|
-EXPORT_SYMBOL(dma_alloc_noncoherent);
|
|
|
|
|
|
static void *mips_dma_alloc_coherent(struct device *dev, size_t size,
|
|
|
dma_addr_t * dma_handle, gfp_t gfp, struct dma_attrs *attrs)
|
|
@@ -137,6 +136,13 @@ static void *mips_dma_alloc_coherent(struct device *dev, size_t size,
|
|
|
struct page *page = NULL;
|
|
|
unsigned int count = PAGE_ALIGN(size) >> PAGE_SHIFT;
|
|
|
|
|
|
+ /*
|
|
|
+ * XXX: seems like the coherent and non-coherent implementations could
|
|
|
+ * be consolidated.
|
|
|
+ */
|
|
|
+ if (dma_get_attr(DMA_ATTR_NON_CONSISTENT, attrs))
|
|
|
+ return mips_dma_alloc_noncoherent(dev, size, dma_handle, gfp);
|
|
|
+
|
|
|
gfp = massage_gfp_flags(dev, gfp);
|
|
|
|
|
|
if (IS_ENABLED(CONFIG_DMA_CMA) && !(gfp & GFP_ATOMIC))
|
|
@@ -161,13 +167,12 @@ static void *mips_dma_alloc_coherent(struct device *dev, size_t size,
|
|
|
}
|
|
|
|
|
|
|
|
|
-void dma_free_noncoherent(struct device *dev, size_t size, void *vaddr,
|
|
|
- dma_addr_t dma_handle)
|
|
|
+static void mips_dma_free_noncoherent(struct device *dev, size_t size,
|
|
|
+ void *vaddr, dma_addr_t dma_handle)
|
|
|
{
|
|
|
plat_unmap_dma_mem(dev, dma_handle, size, DMA_BIDIRECTIONAL);
|
|
|
free_pages((unsigned long) vaddr, get_order(size));
|
|
|
}
|
|
|
-EXPORT_SYMBOL(dma_free_noncoherent);
|
|
|
|
|
|
static void mips_dma_free_coherent(struct device *dev, size_t size, void *vaddr,
|
|
|
dma_addr_t dma_handle, struct dma_attrs *attrs)
|
|
@@ -176,6 +181,11 @@ static void mips_dma_free_coherent(struct device *dev, size_t size, void *vaddr,
|
|
|
unsigned int count = PAGE_ALIGN(size) >> PAGE_SHIFT;
|
|
|
struct page *page = NULL;
|
|
|
|
|
|
+ if (dma_get_attr(DMA_ATTR_NON_CONSISTENT, attrs)) {
|
|
|
+ mips_dma_free_noncoherent(dev, size, vaddr, dma_handle);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
plat_unmap_dma_mem(dev, dma_handle, size, DMA_BIDIRECTIONAL);
|
|
|
|
|
|
if (!plat_device_is_coherent(dev) && !hw_coherentio)
|