linux-mips
[Top] [All Lists]

[PATCH][MIPS] add DMA declare coherent memory support

To: Ralf Baechle <ralf@linux-mips.org>
Subject: [PATCH][MIPS] add DMA declare coherent memory support
From: Yoichi Yuasa <yuasa@linux-mips.org>
Date: Wed, 4 Nov 2009 16:41:04 +0900
Cc: yuasa@linux-mips.org, linux-mips@linux-mips.org
Dkim-signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:received:received:sender:date:from:to:cc :subject:message-id:x-mailer:mime-version:content-type :content-transfer-encoding; bh=lwybjC5A4qE6NHZqdbT1DhaUCbi46JepJa5odaRRFJc=; b=SDYv4HNzGeleVsqjws3FkXYLJjxzKf81Bn1F4eNBtGsGmlLS22fobUvrINU1M8YIcS 5SdOQ6U0qE+Iy8bWaIxVfhBCvber42WRWAb3aBL/WW+x10rGQcG1BWrWg4S36j3vbBc8 Yfg5R68aCqb4B9IqUQBYDiBTHI515YG+XsHx8=
Domainkey-signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=sender:date:from:to:cc:subject:message-id:x-mailer:mime-version :content-type:content-transfer-encoding; b=EHmPGwe0WTMD95AxWLD4odWqd2ZeGmnrHIN0fgLWmX5cMf+zJcEoaiqWq53DzkqYfz fQ5V5sdikb1AJM6/JPXkTNYWtgcYlTXa/MRnaaIWkBYufWSdTIMHY4zyeeuUcxI/DOmM CpAWjCPPMfHB0fsv3mr+Vc4jaDaTmyrVFJll0=
Original-recipient: rfc822;linux-mips@linux-mips.org
Sender: linux-mips-bounce@linux-mips.org
ohci-sm501 driver require dma_declare_coherent_memory().
It is used to driver's local memory allocation with dma_alloc_coherent().

This patch works without problem on TANBAC TB0287(VR4131 + SM501).

Signed-off-by: Yoichi Yuasa <yuasa@linux-mips.org>
---
 arch/mips/Kconfig                   |    1 +
 arch/mips/include/asm/dma-mapping.h |    3 +--
 arch/mips/mm/dma-default.c          |    7 +++++++
 3 files changed, 9 insertions(+), 2 deletions(-)

diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig
index 03bd56a..687a438 100644
--- a/arch/mips/Kconfig
+++ b/arch/mips/Kconfig
@@ -3,6 +3,7 @@ config MIPS
        default y
        select HAVE_IDE
        select HAVE_OPROFILE
+       select HAVE_GENERIC_DMA_COHERENT
        select HAVE_ARCH_KGDB
        # Horrible source of confusion.  Die, die, die ...
        select EMBEDDED
diff --git a/arch/mips/include/asm/dma-mapping.h 
b/arch/mips/include/asm/dma-mapping.h
index d16afdd..808e303 100644
--- a/arch/mips/include/asm/dma-mapping.h
+++ b/arch/mips/include/asm/dma-mapping.h
@@ -3,6 +3,7 @@
 
 #include <asm/scatterlist.h>
 #include <asm/cache.h>
+#include <asm-generic/dma-coherent.h>
 
 void *dma_alloc_noncoherent(struct device *dev, size_t size,
                           dma_addr_t *dma_handle, gfp_t flag);
@@ -73,7 +74,6 @@ extern int dma_is_consistent(struct device *dev, dma_addr_t 
dma_addr);
 extern void dma_cache_sync(struct device *dev, void *vaddr, size_t size,
               enum dma_data_direction direction);
 
-#if 0
 #define ARCH_HAS_DMA_DECLARE_COHERENT_MEMORY
 
 extern int dma_declare_coherent_memory(struct device *dev, dma_addr_t bus_addr,
@@ -81,6 +81,5 @@ extern int dma_declare_coherent_memory(struct device *dev, 
dma_addr_t bus_addr,
 extern void dma_release_declared_memory(struct device *dev);
 extern void * dma_mark_declared_memory_occupied(struct device *dev,
        dma_addr_t device_addr, size_t size);
-#endif
 
 #endif /* _ASM_DMA_MAPPING_H */
diff --git a/arch/mips/mm/dma-default.c b/arch/mips/mm/dma-default.c
index 7e48e76..32b43bd 100644
--- a/arch/mips/mm/dma-default.c
+++ b/arch/mips/mm/dma-default.c
@@ -90,6 +90,9 @@ void *dma_alloc_coherent(struct device *dev, size_t size,
 {
        void *ret;
 
+       if (dma_alloc_from_coherent(dev, size, dma_handle, &ret))
+               return ret;
+
        gfp = massage_gfp_flags(dev, gfp);
 
        ret = (void *) __get_free_pages(gfp, get_order(size));
@@ -121,8 +124,12 @@ EXPORT_SYMBOL(dma_free_noncoherent);
 void dma_free_coherent(struct device *dev, size_t size, void *vaddr,
        dma_addr_t dma_handle)
 {
+       int order = get_order(size);
        unsigned long addr = (unsigned long) vaddr;
 
+       if (dma_release_from_coherent(dev, order, vaddr))
+               return;
+
        plat_unmap_dma_mem(dev, dma_handle, size, DMA_BIDIRECTIONAL);
 
        if (!plat_device_is_coherent(dev))
-- 
1.6.5.2


<Prev in Thread] Current Thread [Next in Thread>