]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
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 242108439f42e9612ac0384b83f8c9872c69eab3..7f1925a32c992cf69ce215c8d1948c1a18248bd9 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 3d24cc43385b73061bb33d5fe7611d4d16558ab2..4c0ea6c2833d4f568b08d0a45b3ce52943a1246f 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 b7d42e4edc1f2072d71e42f14917f4285eea5d56..12ffb9c0d7384cbab925a0f519232b5eba595b9e 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 1804dc9d8136fb72b50fdc88e22f11be96b191f0..a01e14955187e40140b7b065ca665e42ecb2b172 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 a0879674a9c875c82cd9af54a252f447b631e677..2f5a53874f6d4349580b58de3a396ea945c0a28b 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 98410119c47baf9469f2037d0f6a1c416f975b5e..70fcc9736a8c1e70cba26597742fc142435bd5c7 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 6601b9d404dc33197bda2abea72a65123ac60270..3473eef7628c376d34fa0cf6570a7b5327443439 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 9e52d1527f71495f920a6d39989fb515410f3056..03d8c1c9f82f21e7ab369d50db6bf3d47c7c62fb 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 a585ea6f686aba334936dc8a896d41fdaa817c4c..f72c487d68a80556c94da9d3a13adb6eafdd68a2 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 9d4343aa481b686589943cd0906f33735f434fa4..23fdec030c37f65e289e3804869f48356f047195 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 b607a92791d3f8b48a9c1caeaea48986753ead64..2e74ad6599853004ca943efcb26f97da9bad03e3 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 12d094d08c0a2e982fb712b9310ceadf7213013d..dca1b06ce4ecd98ef73ae108d34bc77fab1cf011 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 217f15aafa4a00e4063887f9f25e66cb02b59628..1d7125d29beeb3ba710c6e4b192681f885f06017 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 296668caf7e5c0e1e3a931e416f4b54516dc9809..fa4df65b7e28ae644686b6b64f99c681a7790a1b 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 a136932b8e6dcd1df8c53fccda17ef684a52b48e..c8b4e46407bab55431cbe1b7ee5b168c0a75aa6c 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);