Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754837AbdCIOIN (ORCPT ); Thu, 9 Mar 2017 09:08:13 -0500 Received: from mga06.intel.com ([134.134.136.31]:34156 "EHLO mga06.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750770AbdCIOIL (ORCPT ); Thu, 9 Mar 2017 09:08:11 -0500 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.36,268,1486454400"; d="gz'50?scan'50,208,50";a="942436200" Date: Thu, 9 Mar 2017 22:06:54 +0800 From: kbuild test robot To: Vladimir Murzin Cc: kbuild-all@01.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux@armlinux.org.uk, akpm@linux-foundation.org, robin.murphy@arm.com, benjamin.gaignard@linaro.org, alexandre.torgue@st.com, sza@esh.hu Subject: Re: [PATCH v2 5/7] ARM: NOMMU: Introduce dma operations for noMMU Message-ID: <201703092203.goMXDQRU%fengguang.wu@intel.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="BXVAT5kNtrzKuDFl" Content-Disposition: inline In-Reply-To: <1488885154-12429-6-git-send-email-vladimir.murzin@arm.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: fengguang.wu@intel.com X-SA-Exim-Scanned: No (on bee); SAEximRunCond expanded to false Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 16302 Lines: 339 --BXVAT5kNtrzKuDFl Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Hi Vladimir, [auto build test WARNING on next-20170308] [also build test WARNING on v4.11-rc1] [cannot apply to linux/master v4.9-rc8 v4.9-rc7 v4.9-rc6] [if your patch is applied to the wrong git tree, please drop us a note to help improve the system] url: https://github.com/0day-ci/linux/commits/Vladimir-Murzin/ARM-Fix-dma_alloc_coherent-and-friends-for-NOMMU/20170309-193212 config: arm-allnoconfig (attached as .config) compiler: arm-linux-gnueabi-gcc (Debian 6.1.1-9) 6.1.1 20160705 reproduce: wget https://raw.githubusercontent.com/01org/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # save the attached .config to linux build tree make.cross ARCH=arm All warnings (new ones prefixed by >>): arch/arm/mm/dma-mapping-nommu.c: In function 'arm_nommu_dma_alloc': >> arch/arm/mm/dma-mapping-nommu.c:42:28: warning: initialization discards 'const' qualifier from pointer target type [-Wdiscarded-qualifiers] struct dma_map_ops *ops = &dma_noop_ops; ^ arch/arm/mm/dma-mapping-nommu.c: In function 'arm_nommu_dma_free': arch/arm/mm/dma-mapping-nommu.c:64:28: warning: initialization discards 'const' qualifier from pointer target type [-Wdiscarded-qualifiers] struct dma_map_ops *ops = &dma_noop_ops; ^ arch/arm/mm/dma-mapping-nommu.c: In function 'arm_nommu_dma_mmap': arch/arm/mm/dma-mapping-nommu.c:78:28: warning: initialization discards 'const' qualifier from pointer target type [-Wdiscarded-qualifiers] struct dma_map_ops *ops = &dma_noop_ops; ^ arch/arm/mm/dma-mapping-nommu.c: In function 'arm_nommu_get_dma_map_ops': >> arch/arm/mm/dma-mapping-nommu.c:207:34: warning: return discards 'const' qualifier from pointer target type [-Wdiscarded-qualifiers] return coherent ? &dma_noop_ops : &arm_nommu_dma_ops; ~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~ vim +/const +42 arch/arm/mm/dma-mapping-nommu.c 36 37 static void *arm_nommu_dma_alloc(struct device *dev, size_t size, 38 dma_addr_t *dma_handle, gfp_t gfp, 39 unsigned long attrs) 40 41 { > 42 struct dma_map_ops *ops = &dma_noop_ops; 43 44 /* 45 * We are here because: 46 * - no consistent DMA region has been defined, so we can't 47 * continue. 48 * - there is no space left in consistent DMA region, so we 49 * only can fallback to generic allocator if we are 50 * advertised that consistency is not required. 51 */ 52 53 if (attrs & DMA_ATTR_NON_CONSISTENT) 54 return ops->alloc(dev, size, dma_handle, gfp, attrs); 55 56 WARN_ON_ONCE(1); 57 return NULL; 58 } 59 60 static void arm_nommu_dma_free(struct device *dev, size_t size, 61 void *cpu_addr, dma_addr_t dma_addr, 62 unsigned long attrs) 63 { > 64 struct dma_map_ops *ops = &dma_noop_ops; 65 66 if (attrs & DMA_ATTR_NON_CONSISTENT) 67 ops->free(dev, size, cpu_addr, dma_addr, attrs); 68 else 69 WARN_ON_ONCE(1); 70 71 return; 72 } 73 74 static int arm_nommu_dma_mmap(struct device *dev, struct vm_area_struct *vma, 75 void *cpu_addr, dma_addr_t dma_addr, size_t size, 76 unsigned long attrs) 77 { 78 struct dma_map_ops *ops = &dma_noop_ops; 79 int ret; 80 81 if (dma_mmap_from_coherent(dev, vma, cpu_addr, size, &ret)) 82 return ret; 83 84 if (attrs & DMA_ATTR_NON_CONSISTENT) 85 return ops->mmap(dev, vma, cpu_addr, dma_addr, size, attrs); 86 87 WARN_ON_ONCE(1); 88 return -ENXIO; 89 } 90 91 static void __dma_page_cpu_to_dev(phys_addr_t paddr, size_t size, 92 enum dma_data_direction dir) 93 { 94 dmac_map_area(__va(paddr), size, dir); 95 96 if (dir == DMA_FROM_DEVICE) 97 outer_inv_range(paddr, paddr + size); 98 else 99 outer_clean_range(paddr, paddr + size); 100 } 101 102 static void __dma_page_dev_to_cpu(phys_addr_t paddr, size_t size, 103 enum dma_data_direction dir) 104 { 105 if (dir != DMA_TO_DEVICE) { 106 outer_inv_range(paddr, paddr + size); 107 dmac_unmap_area(__va(paddr), size, dir); 108 } 109 } 110 111 static dma_addr_t arm_nommu_dma_map_page(struct device *dev, struct page *page, 112 unsigned long offset, size_t size, 113 enum dma_data_direction dir, 114 unsigned long attrs) 115 { 116 dma_addr_t handle = page_to_phys(page) + offset; 117 118 __dma_page_cpu_to_dev(handle, size, dir); 119 120 return handle; 121 } 122 123 static void arm_nommu_dma_unmap_page(struct device *dev, dma_addr_t handle, 124 size_t size, enum dma_data_direction dir, 125 unsigned long attrs) 126 { 127 __dma_page_dev_to_cpu(handle, size, dir); 128 } 129 130 131 static int arm_nommu_dma_map_sg(struct device *dev, struct scatterlist *sgl, 132 int nents, enum dma_data_direction dir, 133 unsigned long attrs) 134 { 135 int i; 136 struct scatterlist *sg; 137 138 for_each_sg(sgl, sg, nents, i) { 139 sg_dma_address(sg) = sg_phys(sg); 140 sg_dma_len(sg) = sg->length; 141 __dma_page_cpu_to_dev(sg_dma_address(sg), sg_dma_len(sg), dir); 142 } 143 144 return nents; 145 } 146 147 static void arm_nommu_dma_unmap_sg(struct device *dev, struct scatterlist *sgl, 148 int nents, enum dma_data_direction dir, 149 unsigned long attrs) 150 { 151 struct scatterlist *sg; 152 int i; 153 154 for_each_sg(sgl, sg, nents, i) 155 __dma_page_dev_to_cpu(sg_dma_address(sg), sg_dma_len(sg), dir); 156 } 157 158 static void arm_nommu_dma_sync_single_for_device(struct device *dev, 159 dma_addr_t handle, size_t size, enum dma_data_direction dir) 160 { 161 __dma_page_cpu_to_dev(handle, size, dir); 162 } 163 164 static void arm_nommu_dma_sync_single_for_cpu(struct device *dev, 165 dma_addr_t handle, size_t size, enum dma_data_direction dir) 166 { 167 __dma_page_cpu_to_dev(handle, size, dir); 168 } 169 170 static void arm_nommu_dma_sync_sg_for_device(struct device *dev, struct scatterlist *sgl, 171 int nents, enum dma_data_direction dir) 172 { 173 struct scatterlist *sg; 174 int i; 175 176 for_each_sg(sgl, sg, nents, i) 177 __dma_page_cpu_to_dev(sg_dma_address(sg), sg_dma_len(sg), dir); 178 } 179 180 static void arm_nommu_dma_sync_sg_for_cpu(struct device *dev, struct scatterlist *sgl, 181 int nents, enum dma_data_direction dir) 182 { 183 struct scatterlist *sg; 184 int i; 185 186 for_each_sg(sgl, sg, nents, i) 187 __dma_page_dev_to_cpu(sg_dma_address(sg), sg_dma_len(sg), dir); 188 } 189 190 const struct dma_map_ops arm_nommu_dma_ops = { 191 .alloc = arm_nommu_dma_alloc, 192 .free = arm_nommu_dma_free, 193 .mmap = arm_nommu_dma_mmap, 194 .map_page = arm_nommu_dma_map_page, 195 .unmap_page = arm_nommu_dma_unmap_page, 196 .map_sg = arm_nommu_dma_map_sg, 197 .unmap_sg = arm_nommu_dma_unmap_sg, 198 .sync_single_for_device = arm_nommu_dma_sync_single_for_device, 199 .sync_single_for_cpu = arm_nommu_dma_sync_single_for_cpu, 200 .sync_sg_for_device = arm_nommu_dma_sync_sg_for_device, 201 .sync_sg_for_cpu = arm_nommu_dma_sync_sg_for_cpu, 202 }; 203 EXPORT_SYMBOL(arm_nommu_dma_ops); 204 205 static struct dma_map_ops *arm_nommu_get_dma_map_ops(bool coherent) 206 { > 207 return coherent ? &dma_noop_ops : &arm_nommu_dma_ops; 208 } 209 210 void arch_setup_dma_ops(struct device *dev, u64 dma_base, u64 size, --- 0-DAY kernel test infrastructure Open Source Technology Center https://lists.01.org/pipermail/kbuild-all Intel Corporation --BXVAT5kNtrzKuDFl Content-Type: application/gzip Content-Disposition: attachment; filename=".config.gz" Content-Transfer-Encoding: base64 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 xfNv9JbCXrtQAAA= --BXVAT5kNtrzKuDFl--