dma-mapping: remove arch_dma_mmap_pgprot
authorChristoph Hellwig <hch@lst.de>
Mon, 26 Aug 2019 07:03:44 +0000 (09:03 +0200)
committerChristoph Hellwig <hch@lst.de>
Thu, 29 Aug 2019 14:43:22 +0000 (16:43 +0200)
arch_dma_mmap_pgprot is used for two things:

 1) to override the "normal" uncached page attributes for mapping
    memory coherent to devices that can't snoop the CPU caches
 2) to provide the special DMA_ATTR_WRITE_COMBINE semantics on older
    arm systems and some mips platforms

Replace one with the pgprot_dmacoherent macro that is already provided
by arm and much simpler to use, and lift the DMA_ATTR_WRITE_COMBINE
handling to common code with an explicit arch opt-in.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Acked-by: Geert Uytterhoeven <geert@linux-m68k.org> # m68k
Acked-by: Paul Burton <paul.burton@mips.com> # mips
13 files changed:
arch/arm/Kconfig
arch/arm/mm/dma-mapping.c
arch/arm64/Kconfig
arch/arm64/include/asm/pgtable.h
arch/arm64/mm/dma-mapping.c
arch/m68k/Kconfig
arch/m68k/include/asm/pgtable_mm.h
arch/m68k/kernel/dma.c
arch/mips/Kconfig
arch/mips/mm/dma-noncoherent.c
include/linux/dma-noncoherent.h
kernel/dma/Kconfig
kernel/dma/mapping.c

index 24360211534abe47a053dbc575c6e46c49e3c734..217083caeabd738fcba2b0a02f2111cec43dc385 100644 (file)
@@ -8,7 +8,7 @@ config ARM
        select ARCH_HAS_DEBUG_VIRTUAL if MMU
        select ARCH_HAS_DEVMEM_IS_ALLOWED
        select ARCH_HAS_DMA_COHERENT_TO_PFN if SWIOTLB
-       select ARCH_HAS_DMA_MMAP_PGPROT if SWIOTLB
+       select ARCH_HAS_DMA_WRITE_COMBINE if !ARM_DMA_MEM_BUFFERABLE
        select ARCH_HAS_ELF_RANDOMIZE
        select ARCH_HAS_FORTIFY_SOURCE
        select ARCH_HAS_KEEPINITRD
index d42557ee69c28fbcfd2f7f6c909f5b9b534779a8..d27b12f61737323080519ea775c71ca9da6311a9 100644 (file)
@@ -2402,12 +2402,6 @@ long arch_dma_coherent_to_pfn(struct device *dev, void *cpu_addr,
        return dma_to_pfn(dev, dma_addr);
 }
 
-pgprot_t arch_dma_mmap_pgprot(struct device *dev, pgprot_t prot,
-               unsigned long attrs)
-{
-       return __get_dma_pgprot(attrs, prot);
-}
-
 void *arch_dma_alloc(struct device *dev, size_t size, dma_addr_t *dma_handle,
                gfp_t gfp, unsigned long attrs)
 {
index 3adcec05b1f672d7ff3356e0eaf13d2667a64b6a..dab9dda34206478dd75037e9bfea7245715fc2e0 100644 (file)
@@ -13,7 +13,6 @@ config ARM64
        select ARCH_HAS_DEBUG_VIRTUAL
        select ARCH_HAS_DEVMEM_IS_ALLOWED
        select ARCH_HAS_DMA_COHERENT_TO_PFN
-       select ARCH_HAS_DMA_MMAP_PGPROT
        select ARCH_HAS_DMA_PREP_COHERENT
        select ARCH_HAS_ACPI_TABLE_UPGRADE if ACPI
        select ARCH_HAS_ELF_RANDOMIZE
index e09760ece844fe55cbd39dc8c32910a7bfdb6708..6700371227d1d75e6d1d7251f2ab9ef7703eedae 100644 (file)
@@ -435,6 +435,10 @@ static inline pmd_t pmd_mkdevmap(pmd_t pmd)
        __pgprot_modify(prot, PTE_ATTRINDX_MASK, PTE_ATTRINDX(MT_NORMAL_NC) | PTE_PXN | PTE_UXN)
 #define pgprot_device(prot) \
        __pgprot_modify(prot, PTE_ATTRINDX_MASK, PTE_ATTRINDX(MT_DEVICE_nGnRE) | PTE_PXN | PTE_UXN)
+#define pgprot_dmacoherent(prot) \
+       __pgprot_modify(prot, PTE_ATTRINDX_MASK, \
+                       PTE_ATTRINDX(MT_NORMAL_NC) | PTE_PXN | PTE_UXN)
+
 #define __HAVE_PHYS_MEM_ACCESS_PROT
 struct file;
 extern pgprot_t phys_mem_access_prot(struct file *file, unsigned long pfn,
index bd2b039f43a622d6ce190cef0643ac8fb12dbe2d..676efcda51e6bd24e912defbd1e2b136104d63ff 100644 (file)
 
 #include <asm/cacheflush.h>
 
-pgprot_t arch_dma_mmap_pgprot(struct device *dev, pgprot_t prot,
-               unsigned long attrs)
-{
-       return pgprot_writecombine(prot);
-}
-
 void arch_sync_dma_for_device(struct device *dev, phys_addr_t paddr,
                size_t size, enum dma_data_direction dir)
 {
index c518d695c3760745a3d468f570208448eff16652..a9e564306d3eed81813164a3dff34f01ab5989fc 100644 (file)
@@ -4,7 +4,6 @@ config M68K
        default y
        select ARCH_32BIT_OFF_T
        select ARCH_HAS_BINFMT_FLAT
-       select ARCH_HAS_DMA_MMAP_PGPROT if MMU && !COLDFIRE
        select ARCH_HAS_DMA_PREP_COHERENT if HAS_DMA && MMU && !COLDFIRE
        select ARCH_HAS_SYNC_DMA_FOR_DEVICE if HAS_DMA
        select ARCH_MIGHT_HAVE_PC_PARPORT if ISA
index fe3ddd73a0ccb9e4fec24425164cc8c6c7f477bc..fde4534b974fb314371f0ae7ea712e57440841c0 100644 (file)
@@ -169,6 +169,9 @@ static inline void update_mmu_cache(struct vm_area_struct *vma,
            ? (__pgprot((pgprot_val(prot) & _CACHEMASK040) | _PAGE_NOCACHE_S))  \
            : (prot)))
 
+pgprot_t pgprot_dmacoherent(pgprot_t prot);
+#define pgprot_dmacoherent(prot)       pgprot_dmacoherent(prot)
+
 #endif /* CONFIG_COLDFIRE */
 #include <asm-generic/pgtable.h>
 #endif /* !__ASSEMBLY__ */
index 30cd59caf037ee8490097677408532529c123b58..35064150e348981ccab837dfe1145d86f9de1406 100644 (file)
@@ -23,8 +23,7 @@ void arch_dma_prep_coherent(struct page *page, size_t size)
        cache_push(page_to_phys(page), size);
 }
 
-pgprot_t arch_dma_mmap_pgprot(struct device *dev, pgprot_t prot,
-               unsigned long attrs)
+pgprot_t pgprot_dmacoherent(pgprot_t prot)
 {
        if (CPU_IS_040_OR_060) {
                pgprot_val(prot) &= ~_PAGE_CACHE040;
index d50fafd7bf3aed0fac0729312b2d3aecd905e0c4..fc88f68ea1ee1019a04d1f26bd149cc1a38539b7 100644 (file)
@@ -1119,7 +1119,7 @@ config DMA_PERDEV_COHERENT
 
 config DMA_NONCOHERENT
        bool
-       select ARCH_HAS_DMA_MMAP_PGPROT
+       select ARCH_HAS_DMA_WRITE_COMBINE
        select ARCH_HAS_SYNC_DMA_FOR_DEVICE
        select ARCH_HAS_UNCACHED_SEGMENT
        select NEED_DMA_MAP_STATE
index ed56c6fa7be29e73348fef1da07fb0fb82470fbc..1d4d57dd9acf8ccff46780daa3107a16b1aad120 100644 (file)
@@ -65,14 +65,6 @@ long arch_dma_coherent_to_pfn(struct device *dev, void *cpu_addr,
        return page_to_pfn(virt_to_page(cached_kernel_address(cpu_addr)));
 }
 
-pgprot_t arch_dma_mmap_pgprot(struct device *dev, pgprot_t prot,
-               unsigned long attrs)
-{
-       if (attrs & DMA_ATTR_WRITE_COMBINE)
-               return pgprot_writecombine(prot);
-       return pgprot_noncached(prot);
-}
-
 static inline void dma_sync_virt(void *addr, size_t size,
                enum dma_data_direction dir)
 {
index 0bff3d7fac92c95e324928a0aadc48e6d4ffd35f..dd3de6d88fc0814670f0f3396ec02e4be78da409 100644 (file)
@@ -3,6 +3,7 @@
 #define _LINUX_DMA_NONCOHERENT_H 1
 
 #include <linux/dma-mapping.h>
+#include <asm/pgtable.h>
 
 #ifdef CONFIG_ARCH_HAS_DMA_COHERENCE_H
 #include <asm/dma-coherence.h>
@@ -42,10 +43,18 @@ void arch_dma_free(struct device *dev, size_t size, void *cpu_addr,
                dma_addr_t dma_addr, unsigned long attrs);
 long arch_dma_coherent_to_pfn(struct device *dev, void *cpu_addr,
                dma_addr_t dma_addr);
-pgprot_t arch_dma_mmap_pgprot(struct device *dev, pgprot_t prot,
-               unsigned long attrs);
 
 #ifdef CONFIG_MMU
+/*
+ * Page protection so that devices that can't snoop CPU caches can use the
+ * memory coherently.  We default to pgprot_noncached which is usually used
+ * for ioremap as a safe bet, but architectures can override this with less
+ * strict semantics if possible.
+ */
+#ifndef pgprot_dmacoherent
+#define pgprot_dmacoherent(prot)       pgprot_noncached(prot)
+#endif
+
 pgprot_t dma_pgprot(struct device *dev, pgprot_t prot, unsigned long attrs);
 #else
 static inline pgprot_t dma_pgprot(struct device *dev, pgprot_t prot,
index 9decbba255fc8e2a6e3ea184cf23ff6c7a96fc9f..73c5c2b8e82459c043fecaec865d45e084db47ac 100644 (file)
@@ -20,6 +20,15 @@ config ARCH_HAS_DMA_COHERENCE_H
 config ARCH_HAS_DMA_SET_MASK
        bool
 
+#
+# Select this option if the architecture needs special handling for
+# DMA_ATTR_WRITE_COMBINE.  Normally the "uncached" mapping should be what
+# people thing of when saying write combine, so very few platforms should
+# need to enable this.
+#
+config ARCH_HAS_DMA_WRITE_COMBINE
+       bool
+
 config DMA_DECLARE_COHERENT
        bool
 
@@ -45,9 +54,6 @@ config ARCH_HAS_DMA_PREP_COHERENT
 config ARCH_HAS_DMA_COHERENT_TO_PFN
        bool
 
-config ARCH_HAS_DMA_MMAP_PGPROT
-       bool
-
 config ARCH_HAS_FORCE_DMA_UNENCRYPTED
        bool
 
index b0038ca3aa92b2e9d4a7976a08237deb2c2c7531..1b96616c9f2036ca03404790f3bc067bc9eb86da 100644 (file)
@@ -161,9 +161,11 @@ pgprot_t dma_pgprot(struct device *dev, pgprot_t prot, unsigned long attrs)
            (IS_ENABLED(CONFIG_DMA_NONCOHERENT_CACHE_SYNC) &&
              (attrs & DMA_ATTR_NON_CONSISTENT)))
                return prot;
-       if (IS_ENABLED(CONFIG_ARCH_HAS_DMA_MMAP_PGPROT))
-               return arch_dma_mmap_pgprot(dev, prot, attrs);
-       return pgprot_noncached(prot);
+#ifdef CONFIG_ARCH_HAS_DMA_WRITE_COMBINE
+       if (attrs & DMA_ATTR_WRITE_COMBINE)
+               return pgprot_writecombine(prot);
+#endif
+       return pgprot_dmacoherent(prot);
 }
 #endif /* CONFIG_MMU */