dma-mapping: explicitly wire up ->mmap and ->get_sgtable
authorChristoph Hellwig <hch@lst.de>
Tue, 6 Aug 2019 12:01:50 +0000 (15:01 +0300)
committerChristoph Hellwig <hch@lst.de>
Wed, 4 Sep 2019 09:13:18 +0000 (11:13 +0200)
While the default ->mmap and ->get_sgtable implementations work for the
majority of our dma_map_ops impementations they are inherently safe
for others that don't use the page allocator or CMA and/or use their
own way of remapping not covered by the common code.  So remove the
defaults if these methods are not wired up, but instead wire up the
default implementations for all safe instances.

Fixes: e1c7e324539a ("dma-mapping: always provide the dma_map_ops based implementation")
Signed-off-by: Christoph Hellwig <hch@lst.de>
15 files changed:
arch/alpha/kernel/pci_iommu.c
arch/ia64/hp/common/sba_iommu.c
arch/ia64/sn/pci/pci_dma.c
arch/mips/jazz/jazzdma.c
arch/powerpc/kernel/dma-iommu.c
arch/powerpc/platforms/ps3/system-bus.c
arch/powerpc/platforms/pseries/vio.c
arch/s390/pci/pci_dma.c
arch/x86/kernel/amd_gart_64.c
arch/x86/kernel/pci-calgary_64.c
drivers/iommu/amd_iommu.c
drivers/iommu/intel-iommu.c
drivers/parisc/ccio-dma.c
drivers/parisc/sba_iommu.c
kernel/dma/mapping.c

index 2421084..7f1925a 100644 (file)
@@ -955,5 +955,7 @@ const struct dma_map_ops alpha_pci_ops = {
        .map_sg                 = alpha_pci_map_sg,
        .unmap_sg               = alpha_pci_unmap_sg,
        .dma_supported          = alpha_pci_supported,
+       .mmap                   = dma_common_mmap,
+       .get_sgtable            = dma_common_get_sgtable,
 };
 EXPORT_SYMBOL(alpha_pci_ops);
index 3d24cc4..4c0ea6c 100644 (file)
@@ -2183,6 +2183,8 @@ const struct dma_map_ops sba_dma_ops = {
        .map_sg                 = sba_map_sg_attrs,
        .unmap_sg               = sba_unmap_sg_attrs,
        .dma_supported          = sba_dma_supported,
+       .mmap                   = dma_common_mmap,
+       .get_sgtable            = dma_common_get_sgtable,
 };
 
 void sba_dma_init(void)
index b7d42e4..12ffb9c 100644 (file)
@@ -438,6 +438,8 @@ static struct dma_map_ops sn_dma_ops = {
        .unmap_sg               = sn_dma_unmap_sg,
        .dma_supported          = sn_dma_supported,
        .get_required_mask      = sn_dma_get_required_mask,
+       .mmap                   = dma_common_mmap,
+       .get_sgtable            = dma_common_get_sgtable,
 };
 
 void sn_dma_init(void)
index 1804dc9..a01e149 100644 (file)
@@ -682,5 +682,7 @@ const struct dma_map_ops jazz_dma_ops = {
        .sync_sg_for_device     = jazz_dma_sync_sg_for_device,
        .dma_supported          = dma_direct_supported,
        .cache_sync             = arch_dma_cache_sync,
+       .mmap                   = dma_common_mmap,
+       .get_sgtable            = dma_common_get_sgtable,
 };
 EXPORT_SYMBOL(jazz_dma_ops);
index a087967..2f5a538 100644 (file)
@@ -208,4 +208,6 @@ const struct dma_map_ops dma_iommu_ops = {
        .sync_single_for_device = dma_iommu_sync_for_device,
        .sync_sg_for_cpu        = dma_iommu_sync_sg_for_cpu,
        .sync_sg_for_device     = dma_iommu_sync_sg_for_device,
+       .mmap                   = dma_common_mmap,
+       .get_sgtable            = dma_common_get_sgtable,
 };
index 9841011..70fcc97 100644 (file)
@@ -700,6 +700,8 @@ static const struct dma_map_ops ps3_sb_dma_ops = {
        .get_required_mask = ps3_dma_get_required_mask,
        .map_page = ps3_sb_map_page,
        .unmap_page = ps3_unmap_page,
+       .mmap = dma_common_mmap,
+       .get_sgtable = dma_common_get_sgtable,
 };
 
 static const struct dma_map_ops ps3_ioc0_dma_ops = {
@@ -711,6 +713,8 @@ static const struct dma_map_ops ps3_ioc0_dma_ops = {
        .get_required_mask = ps3_dma_get_required_mask,
        .map_page = ps3_ioc0_map_page,
        .unmap_page = ps3_unmap_page,
+       .mmap = dma_common_mmap,
+       .get_sgtable = dma_common_get_sgtable,
 };
 
 /**
index 6601b9d..3473eef 100644 (file)
@@ -605,6 +605,8 @@ static const struct dma_map_ops vio_dma_mapping_ops = {
        .unmap_page        = vio_dma_iommu_unmap_page,
        .dma_supported     = dma_iommu_dma_supported,
        .get_required_mask = dma_iommu_get_required_mask,
+       .mmap              = dma_common_mmap,
+       .get_sgtable       = dma_common_get_sgtable,
 };
 
 /**
index 9e52d15..03d8c1c 100644 (file)
@@ -668,6 +668,8 @@ const struct dma_map_ops s390_pci_dma_ops = {
        .unmap_sg       = s390_dma_unmap_sg,
        .map_page       = s390_dma_map_pages,
        .unmap_page     = s390_dma_unmap_pages,
+       .mmap           = dma_common_mmap,
+       .get_sgtable    = dma_common_get_sgtable,
        /* dma_supported is unconditionally true without a callback */
 };
 EXPORT_SYMBOL_GPL(s390_pci_dma_ops);
index a585ea6..f72c487 100644 (file)
@@ -677,6 +677,8 @@ static const struct dma_map_ops gart_dma_ops = {
        .unmap_page                     = gart_unmap_page,
        .alloc                          = gart_alloc_coherent,
        .free                           = gart_free_coherent,
+       .mmap                           = dma_common_mmap,
+       .get_sgtable                    = dma_common_get_sgtable,
        .dma_supported                  = dma_direct_supported,
 };
 
index 9d4343a..23fdec0 100644 (file)
@@ -468,6 +468,8 @@ static const struct dma_map_ops calgary_dma_ops = {
        .map_page = calgary_map_page,
        .unmap_page = calgary_unmap_page,
        .dma_supported = dma_direct_supported,
+       .mmap = dma_common_mmap,
+       .get_sgtable = dma_common_get_sgtable,
 };
 
 static inline void __iomem * busno_to_bbar(unsigned char num)
index b607a92..2e74ad6 100644 (file)
@@ -2722,6 +2722,8 @@ static const struct dma_map_ops amd_iommu_dma_ops = {
        .map_sg         = map_sg,
        .unmap_sg       = unmap_sg,
        .dma_supported  = amd_iommu_dma_supported,
+       .mmap           = dma_common_mmap,
+       .get_sgtable    = dma_common_get_sgtable,
 };
 
 static int init_reserved_iova_ranges(void)
index 12d094d..dca1b06 100644 (file)
@@ -3738,6 +3738,8 @@ static const struct dma_map_ops intel_dma_ops = {
        .map_resource = intel_map_resource,
        .unmap_resource = intel_unmap_resource,
        .dma_supported = dma_direct_supported,
+       .mmap = dma_common_mmap,
+       .get_sgtable = dma_common_get_sgtable,
 };
 
 static inline int iommu_domain_cache_init(void)
index 217f15a..1d7125d 100644 (file)
@@ -1024,6 +1024,8 @@ static const struct dma_map_ops ccio_ops = {
        .unmap_page =           ccio_unmap_page,
        .map_sg =               ccio_map_sg,
        .unmap_sg =             ccio_unmap_sg,
+       .mmap =                 dma_common_mmap,
+       .get_sgtable =          dma_common_get_sgtable,
 };
 
 #ifdef CONFIG_PROC_FS
index 296668c..fa4df65 100644 (file)
@@ -1084,6 +1084,8 @@ static const struct dma_map_ops sba_ops = {
        .unmap_page =           sba_unmap_page,
        .map_sg =               sba_map_sg,
        .unmap_sg =             sba_unmap_sg,
+       .mmap =                 dma_common_mmap,
+       .get_sgtable =          dma_common_get_sgtable,
 };
 
 
index a136932..c8b4e46 100644 (file)
@@ -153,11 +153,12 @@ int dma_get_sgtable_attrs(struct device *dev, struct sg_table *sgt,
 {
        const struct dma_map_ops *ops = get_dma_ops(dev);
 
-       if (!dma_is_direct(ops) && ops->get_sgtable)
-               return ops->get_sgtable(dev, sgt, cpu_addr, dma_addr, size,
-                                       attrs);
-       return dma_common_get_sgtable(dev, sgt, cpu_addr, dma_addr, size,
-                       attrs);
+       if (dma_is_direct(ops))
+               return dma_common_get_sgtable(dev, sgt, cpu_addr, dma_addr,
+                               size, attrs);
+       if (!ops->get_sgtable)
+               return -ENXIO;
+       return ops->get_sgtable(dev, sgt, cpu_addr, dma_addr, size, attrs);
 }
 EXPORT_SYMBOL(dma_get_sgtable_attrs);
 
@@ -240,9 +241,12 @@ int dma_mmap_attrs(struct device *dev, struct vm_area_struct *vma,
 {
        const struct dma_map_ops *ops = get_dma_ops(dev);
 
-       if (!dma_is_direct(ops) && ops->mmap)
-               return ops->mmap(dev, vma, cpu_addr, dma_addr, size, attrs);
-       return dma_common_mmap(dev, vma, cpu_addr, dma_addr, size, attrs);
+       if (dma_is_direct(ops))
+               return dma_common_mmap(dev, vma, cpu_addr, dma_addr, size,
+                               attrs);
+       if (!ops->mmap)
+               return -ENXIO;
+       return ops->mmap(dev, vma, cpu_addr, dma_addr, size, attrs);
 }
 EXPORT_SYMBOL(dma_mmap_attrs);