OSDN Git Service

dma-mapping: make support for dma ops optional
authorChristoph Hellwig <hch@lst.de>
Wed, 8 Jul 2020 07:30:00 +0000 (09:30 +0200)
committerChristoph Hellwig <hch@lst.de>
Sun, 19 Jul 2020 07:29:23 +0000 (09:29 +0200)
Avoid the overhead of the dma ops support for tiny builds that only
use the direct mapping.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Tested-by: Alexey Kardashevskiy <aik@ozlabs.ru>
Reviewed-by: Alexey Kardashevskiy <aik@ozlabs.ru>
19 files changed:
arch/alpha/Kconfig
arch/arm/Kconfig
arch/ia64/Kconfig
arch/mips/Kconfig
arch/parisc/Kconfig
arch/powerpc/Kconfig
arch/s390/Kconfig
arch/sparc/Kconfig
arch/x86/Kconfig
drivers/infiniband/core/device.c
drivers/iommu/Kconfig
drivers/macintosh/macio_asic.c
drivers/misc/mic/Kconfig
drivers/vdpa/Kconfig
drivers/xen/Kconfig
include/linux/device.h
include/linux/dma-mapping.h
kernel/dma/Kconfig
kernel/dma/Makefile

index 10862c5..9c5f06e 100644 (file)
@@ -7,6 +7,7 @@ config ALPHA
        select ARCH_NO_PREEMPT
        select ARCH_NO_SG_CHAIN
        select ARCH_USE_CMPXCHG_LOCKREF
+       select DMA_OPS if PCI
        select FORCE_PCI if !ALPHA_JENSEN
        select PCI_DOMAINS if PCI
        select PCI_SYSCALL if PCI
index 2ac7490..bee35b0 100644 (file)
@@ -41,6 +41,7 @@ config ARM
        select CPU_PM if SUSPEND || CPU_IDLE
        select DCACHE_WORD_ACCESS if HAVE_EFFICIENT_UNALIGNED_ACCESS
        select DMA_DECLARE_COHERENT
+       select DMA_OPS
        select DMA_REMAP if MMU
        select EDAC_SUPPORT
        select EDAC_ATOMIC_SCRUB
index 1fa2fe2..5b4ec80 100644 (file)
@@ -192,6 +192,7 @@ config IA64_SGI_UV
 
 config IA64_HP_SBA_IOMMU
        bool "HP SBA IOMMU support"
+       select DMA_OPS
        default y
        help
          Say Y here to add support for the SBA IOMMU found on HP zx1 and
index 6fee1a1..8a45810 100644 (file)
@@ -367,6 +367,7 @@ config MACH_JAZZ
        select ARC_PROMLIB
        select ARCH_MIGHT_HAVE_PC_PARPORT
        select ARCH_MIGHT_HAVE_PC_SERIO
+       select DMA_OPS
        select FW_ARC
        select FW_ARC32
        select ARCH_MAY_HAVE_PC_FDC
index 8e4c370..38c1eaf 100644 (file)
@@ -14,6 +14,7 @@ config PARISC
        select ARCH_HAS_UBSAN_SANITIZE_ALL
        select ARCH_NO_SG_CHAIN
        select ARCH_SUPPORTS_MEMORY_FAILURE
+       select DMA_OPS
        select RTC_CLASS
        select RTC_DRV_GENERIC
        select INIT_ALL_POSSIBLE
index 9fa23eb..e9b091d 100644 (file)
@@ -151,6 +151,7 @@ config PPC
        select BUILDTIME_TABLE_SORT
        select CLONE_BACKWARDS
        select DCACHE_WORD_ACCESS               if PPC64 && CPU_LITTLE_ENDIAN
+       select DMA_OPS                          if PPC64
        select DYNAMIC_FTRACE                   if FUNCTION_TRACER
        select EDAC_ATOMIC_SCRUB
        select EDAC_SUPPORT
index c7d7ede..687fe23 100644 (file)
@@ -113,6 +113,7 @@ config S390
        select ARCH_WANT_IPC_PARSE_VERSION
        select BUILDTIME_TABLE_SORT
        select CLONE_BACKWARDS2
+       select DMA_OPS if PCI
        select DYNAMIC_FTRACE if FUNCTION_TRACER
        select GENERIC_CLOCKEVENTS
        select GENERIC_CPU_AUTOPROBE
index 5bf2dc1..5db1faa 100644 (file)
@@ -15,6 +15,7 @@ config SPARC
        default y
        select ARCH_MIGHT_HAVE_PC_PARPORT if SPARC64 && PCI
        select ARCH_MIGHT_HAVE_PC_SERIO
+       select DMA_OPS
        select OF
        select OF_PROMTREE
        select HAVE_ASM_MODVERSIONS
index 883da0a..96ab927 100644 (file)
@@ -909,6 +909,7 @@ config DMI
 
 config GART_IOMMU
        bool "Old AMD GART IOMMU support"
+       select DMA_OPS
        select IOMMU_HELPER
        select SWIOTLB
        depends on X86_64 && PCI && AMD_NB
index 905a2be..2927a9d 100644 (file)
@@ -1183,6 +1183,8 @@ static void setup_dma_device(struct ib_device *device)
        struct device *parent = device->dev.parent;
 
        WARN_ON_ONCE(device->dma_device);
+
+#ifdef CONFIG_DMA_OPS
        if (device->dev.dma_ops) {
                /*
                 * The caller provided custom DMA operations. Copy the
@@ -1203,7 +1205,9 @@ static void setup_dma_device(struct ib_device *device)
                        else
                                WARN_ON_ONCE(true);
                }
-       } else {
+       } else
+#endif /* CONFIG_DMA_OPS */
+       {
                /*
                 * The caller did not provide custom DMA operations. Use the
                 * DMA mapping operations of the parent device.
index b0f308c..b622af7 100644 (file)
@@ -97,6 +97,7 @@ config OF_IOMMU
 # IOMMU-agnostic DMA-mapping layer
 config IOMMU_DMA
        bool
+       select DMA_OPS
        select IOMMU_API
        select IOMMU_IOVA
        select IRQ_MSI_IOMMU
@@ -183,6 +184,7 @@ config DMAR_TABLE
 config INTEL_IOMMU
        bool "Support for Intel IOMMU using DMA Remapping Devices"
        depends on PCI_MSI && ACPI && (X86 || IA64)
+       select DMA_OPS
        select IOMMU_API
        select IOMMU_IOVA
        select NEED_DMA_MAP_STATE
index 92d142d..49af60b 100644 (file)
@@ -382,7 +382,7 @@ static struct macio_dev * macio_add_one_device(struct macio_chip *chip,
        dma_set_max_seg_size(&dev->ofdev.dev, 65536);
        dma_set_seg_boundary(&dev->ofdev.dev, 0xffffffff);
 
-#ifdef CONFIG_PCI
+#if defined(CONFIG_PCI) && defined(CONFIG_DMA_OPS)
        /* Set the DMA ops to the ones from the PCI device, this could be
         * fishy if we didn't know that on PowerMac it's always direct ops
         * or iommu ops that will work fine
@@ -391,7 +391,7 @@ static struct macio_dev * macio_add_one_device(struct macio_chip *chip,
         */
        dev->ofdev.dev.archdata = chip->lbus.pdev->dev.archdata;
        dev->ofdev.dev.dma_ops = chip->lbus.pdev->dev.dma_ops;
-#endif /* CONFIG_PCI */
+#endif /* CONFIG_PCI && CONFIG_DMA_OPS */
 
 #ifdef DEBUG
        printk("preparing mdev @%p, ofdev @%p, dev @%p, kobj @%p\n",
index 8f201d0..b9bb086 100644 (file)
@@ -4,6 +4,7 @@ menu "Intel MIC & related support"
 config INTEL_MIC_BUS
        tristate "Intel MIC Bus Driver"
        depends on 64BIT && PCI && X86
+       select DMA_OPS
        help
          This option is selected by any driver which registers a
          device or driver on the MIC Bus, such as CONFIG_INTEL_MIC_HOST,
@@ -19,6 +20,7 @@ config INTEL_MIC_BUS
 config SCIF_BUS
        tristate "SCIF Bus Driver"
        depends on 64BIT && PCI && X86
+       select DMA_OPS
        help
          This option is selected by any driver which registers a
          device or driver on the SCIF Bus, such as CONFIG_INTEL_MIC_HOST
@@ -33,6 +35,7 @@ config SCIF_BUS
 
 config VOP_BUS
        tristate "VOP Bus Driver"
+       select DMA_OPS
        help
          This option is selected by any driver which registers a
          device or driver on the VOP Bus, such as CONFIG_INTEL_MIC_HOST
@@ -49,6 +52,7 @@ config INTEL_MIC_HOST
        tristate "Intel MIC Host Driver"
        depends on 64BIT && PCI && X86
        depends on INTEL_MIC_BUS && SCIF_BUS && MIC_COSM && VOP_BUS
+       select DMA_OPS
        help
          This enables Host Driver support for the Intel Many Integrated
          Core (MIC) family of PCIe form factor coprocessor devices that
index 3e1ceb8..d93a69b 100644 (file)
@@ -11,6 +11,7 @@ if VDPA
 config VDPA_SIM
        tristate "vDPA device simulator"
        depends on RUNTIME_TESTING_MENU && HAS_DMA
+       select DMA_OPS
        select VHOST_RING
        default n
        help
index 727f11e..1d339ef 100644 (file)
@@ -179,6 +179,7 @@ config XEN_GRANT_DMA_ALLOC
 
 config SWIOTLB_XEN
        def_bool y
+       select DMA_OPS
        select SWIOTLB
 
 config XEN_PCIDEV_BACKEND
index 15460a5..4c4af98 100644 (file)
@@ -568,8 +568,9 @@ struct device {
 #ifdef CONFIG_GENERIC_MSI_IRQ
        struct list_head        msi_list;
 #endif
-
+#ifdef CONFIG_DMA_OPS
        const struct dma_map_ops *dma_ops;
+#endif
        u64             *dma_mask;      /* dma mask (if dma'able device) */
        u64             coherent_dma_mask;/* Like dma_mask, but for
                                             alloc_coherent mappings as
index bd0a6f5..39da883 100644 (file)
@@ -191,6 +191,7 @@ static inline int dma_mmap_from_global_coherent(struct vm_area_struct *vma,
 #ifdef CONFIG_HAS_DMA
 #include <asm/dma-mapping.h>
 
+#ifdef CONFIG_DMA_OPS
 static inline const struct dma_map_ops *get_dma_ops(struct device *dev)
 {
        if (dev->dma_ops)
@@ -203,7 +204,16 @@ static inline void set_dma_ops(struct device *dev,
 {
        dev->dma_ops = dma_ops;
 }
-
+#else /* CONFIG_DMA_OPS */
+static inline const struct dma_map_ops *get_dma_ops(struct device *dev)
+{
+       return NULL;
+}
+static inline void set_dma_ops(struct device *dev,
+                              const struct dma_map_ops *dma_ops)
+{
+}
+#endif /* CONFIG_DMA_OPS */
 
 static inline int dma_mapping_error(struct device *dev, dma_addr_t dma_addr)
 {
index 1da3f44..5cfb242 100644 (file)
@@ -5,6 +5,9 @@ config HAS_DMA
        depends on !NO_DMA
        default y
 
+config DMA_OPS
+       bool
+
 config NEED_SG_DMA_LENGTH
        bool
 
@@ -60,6 +63,7 @@ config DMA_NONCOHERENT_CACHE_SYNC
 config DMA_VIRT_OPS
        bool
        depends on HAS_DMA
+       select DMA_OPS
 
 config SWIOTLB
        bool
index 370f633..32c7c19 100644 (file)
@@ -1,6 +1,7 @@
 # SPDX-License-Identifier: GPL-2.0
 
-obj-$(CONFIG_HAS_DMA)                  += mapping.o direct.o dummy.o
+obj-$(CONFIG_HAS_DMA)                  += mapping.o direct.o
+obj-$(CONFIG_DMA_OPS)                  += dummy.o
 obj-$(CONFIG_DMA_CMA)                  += contiguous.o
 obj-$(CONFIG_DMA_DECLARE_COHERENT)     += coherent.o
 obj-$(CONFIG_DMA_VIRT_OPS)             += virt.o