summaryrefslogtreecommitdiffstats
path: root/include/linux/dma-mapping.h
diff options
context:
space:
mode:
authorChristoph Hellwig <hch@lst.de>2019-01-04 12:20:05 -0500
committerChristoph Hellwig <hch@lst.de>2019-02-01 03:56:15 -0500
commitcfced786969c2a3e1bca45d7055a00311d93ae6c (patch)
tree0a03249458b9e8bc56f9b8f594efb8c4c1b6d512 /include/linux/dma-mapping.h
parentf17b5f06cb92ef2250513a1e154c47b78df07d40 (diff)
dma-mapping: remove the default map_resource implementation
Instead provide a proper implementation in the direct mapping code, and also wire it up for arm and powerpc, leaving an error return for all the IOMMU or virtual mapping instances for which we'd have to wire up an actual implementation Signed-off-by: Christoph Hellwig <hch@lst.de> Tested-by: Marek Szyprowski <m.szyprowski@samsung.com>
Diffstat (limited to 'include/linux/dma-mapping.h')
-rw-r--r--include/linux/dma-mapping.h12
1 files changed, 7 insertions, 5 deletions
diff --git a/include/linux/dma-mapping.h b/include/linux/dma-mapping.h
index f6ded992c183..9842085e6774 100644
--- a/include/linux/dma-mapping.h
+++ b/include/linux/dma-mapping.h
@@ -208,6 +208,8 @@ dma_addr_t dma_direct_map_page(struct device *dev, struct page *page,
208 unsigned long attrs); 208 unsigned long attrs);
209int dma_direct_map_sg(struct device *dev, struct scatterlist *sgl, int nents, 209int dma_direct_map_sg(struct device *dev, struct scatterlist *sgl, int nents,
210 enum dma_data_direction dir, unsigned long attrs); 210 enum dma_data_direction dir, unsigned long attrs);
211dma_addr_t dma_direct_map_resource(struct device *dev, phys_addr_t paddr,
212 size_t size, enum dma_data_direction dir, unsigned long attrs);
211 213
212#if defined(CONFIG_ARCH_HAS_SYNC_DMA_FOR_DEVICE) || \ 214#if defined(CONFIG_ARCH_HAS_SYNC_DMA_FOR_DEVICE) || \
213 defined(CONFIG_SWIOTLB) 215 defined(CONFIG_SWIOTLB)
@@ -346,19 +348,19 @@ static inline dma_addr_t dma_map_resource(struct device *dev,
346 unsigned long attrs) 348 unsigned long attrs)
347{ 349{
348 const struct dma_map_ops *ops = get_dma_ops(dev); 350 const struct dma_map_ops *ops = get_dma_ops(dev);
349 dma_addr_t addr; 351 dma_addr_t addr = DMA_MAPPING_ERROR;
350 352
351 BUG_ON(!valid_dma_direction(dir)); 353 BUG_ON(!valid_dma_direction(dir));
352 354
353 /* Don't allow RAM to be mapped */ 355 /* Don't allow RAM to be mapped */
354 BUG_ON(pfn_valid(PHYS_PFN(phys_addr))); 356 BUG_ON(pfn_valid(PHYS_PFN(phys_addr)));
355 357
356 addr = phys_addr; 358 if (dma_is_direct(ops))
357 if (ops && ops->map_resource) 359 addr = dma_direct_map_resource(dev, phys_addr, size, dir, attrs);
360 else if (ops->map_resource)
358 addr = ops->map_resource(dev, phys_addr, size, dir, attrs); 361 addr = ops->map_resource(dev, phys_addr, size, dir, attrs);
359 362
360 debug_dma_map_resource(dev, phys_addr, size, dir, addr); 363 debug_dma_map_resource(dev, phys_addr, size, dir, addr);
361
362 return addr; 364 return addr;
363} 365}
364 366
@@ -369,7 +371,7 @@ static inline void dma_unmap_resource(struct device *dev, dma_addr_t addr,
369 const struct dma_map_ops *ops = get_dma_ops(dev); 371 const struct dma_map_ops *ops = get_dma_ops(dev);
370 372
371 BUG_ON(!valid_dma_direction(dir)); 373 BUG_ON(!valid_dma_direction(dir));
372 if (ops && ops->unmap_resource) 374 if (!dma_is_direct(ops) && ops->unmap_resource)
373 ops->unmap_resource(dev, addr, size, dir, attrs); 375 ops->unmap_resource(dev, addr, size, dir, attrs);
374 debug_dma_unmap_resource(dev, addr, size, dir); 376 debug_dma_unmap_resource(dev, addr, size, dir);
375} 377}