From: Jianqun Xu <jay.xu@rock-chips.com>
Date: Tue, 26 Jul 2016 09:21:25 +0000 (+0800)
Subject: arm64/dma-mapping: __generic_dma_ops always call swiotlb_dma_ops
X-Git-Tag: firefly_0821_release~2085
X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=3e89f7de9a3abe9cff127e161d4e11699554cb76;p=firefly-linux-kernel-4.4.55.git

arm64/dma-mapping: __generic_dma_ops always call swiotlb_dma_ops

Arm64 dma-mapping will return dummy_dma_ops if none call arch_setup_dma_ops
at device creation time.

For ion APIS, ion_pages_sync_for_device and ion_pages_sync_for_cpu always
pass "NULL" as device, then dma-mapping return dummy_dma_ops, which cause
ion pages fail to sync.

This patch fixs __generic_dma_ops to return swiotlb_dma_ops instead of
dummy_dma_ops.

Change-Id: Ic00db5d4547bcd5f74e5fd155133fde408a05cdb
Signed-off-by: Jianqun Xu <jay.xu@rock-chips.com>
---

diff --git a/arch/arm64/include/asm/dma-mapping.h b/arch/arm64/include/asm/dma-mapping.h
index e8d209e352ce..6cf04c73e983 100644
--- a/arch/arm64/include/asm/dma-mapping.h
+++ b/arch/arm64/include/asm/dma-mapping.h
@@ -27,12 +27,19 @@
 
 #define DMA_ERROR_CODE	(~(dma_addr_t)0)
 extern struct dma_map_ops dummy_dma_ops;
+extern struct dma_map_ops swiotlb_dma_ops;
 
 static inline struct dma_map_ops *__generic_dma_ops(struct device *dev)
 {
 	if (dev && dev->archdata.dma_ops)
 		return dev->archdata.dma_ops;
 
+	/*
+	 * For ion APIs, they have no devices, we force it to call swiotlb_dma_ops
+	 * to sync device.
+	 * Revert me if ion has fixed this issue.
+	*/
+	return &swiotlb_dma_ops;
 	/*
 	 * We expect no ISA devices, and all other DMA masters are expected to
 	 * have someone call arch_setup_dma_ops at device creation time.
diff --git a/arch/arm64/mm/dma-mapping.c b/arch/arm64/mm/dma-mapping.c
index 2b05653e8156..93a82b0a01b7 100644
--- a/arch/arm64/mm/dma-mapping.c
+++ b/arch/arm64/mm/dma-mapping.c
@@ -334,7 +334,7 @@ static int __swiotlb_get_sgtable(struct device *dev, struct sg_table *sgt,
 	return ret;
 }
 
-static struct dma_map_ops swiotlb_dma_ops = {
+struct dma_map_ops swiotlb_dma_ops = {
 	.alloc = __dma_alloc,
 	.free = __dma_free,
 	.mmap = __swiotlb_mmap,
@@ -350,6 +350,7 @@ static struct dma_map_ops swiotlb_dma_ops = {
 	.dma_supported = swiotlb_dma_supported,
 	.mapping_error = swiotlb_dma_mapping_error,
 };
+EXPORT_SYMBOL(swiotlb_dma_ops);
 
 static int __init atomic_pool_init(void)
 {