From: Jianqun Xu 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 --- 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) {