OSDN Git Service

sparc32: use per-device dma_ops
authorChristoph Hellwig <hch@lst.de>
Mon, 23 Mar 2020 08:43:42 +0000 (09:43 +0100)
committerDavid S. Miller <davem@davemloft.net>
Fri, 3 Apr 2020 01:11:55 +0000 (18:11 -0700)
sparc32 is the last platform making dynamic decisions in
get_arch_dma_ops based on the bus passed in.  Instead set the
iommu dma_ops at iommu probing and propagate them in
of_propagate_archdata, falling back to the NULL ops for the
direct mapping in the Leon or PCI case.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: David S. Miller <davem@davemloft.net>
arch/sparc/include/asm/dma-mapping.h
arch/sparc/kernel/ioport.c
arch/sparc/kernel/of_device_common.c
arch/sparc/mm/io-unit.c
arch/sparc/mm/iommu.c
arch/sparc/mm/mm_32.h
arch/sparc/mm/srmmu.c

index ed32845..2f05134 100644 (file)
@@ -2,23 +2,12 @@
 #ifndef ___ASM_SPARC_DMA_MAPPING_H
 #define ___ASM_SPARC_DMA_MAPPING_H
 
-#include <asm/cpu_type.h>
-
 extern const struct dma_map_ops *dma_ops;
 
-extern struct bus_type pci_bus_type;
-
 static inline const struct dma_map_ops *get_arch_dma_ops(struct bus_type *bus)
 {
-#ifdef CONFIG_SPARC_LEON
-       if (sparc_cpu_model == sparc_leon)
-               return NULL;
-#endif
-#if defined(CONFIG_SPARC32) && defined(CONFIG_PCI)
-       if (bus == &pci_bus_type)
-               return NULL;
-#endif
-       return dma_ops;
+       /* sparc32 uses per-device dma_ops */
+       return IS_ENABLED(CONFIG_SPARC64) ? dma_ops : NULL;
 }
 
 #endif
index e59461d..d6874c9 100644 (file)
@@ -373,9 +373,6 @@ void arch_sync_dma_for_cpu(phys_addr_t paddr, size_t size,
                dma_make_coherent(paddr, PAGE_ALIGN(size));
 }
 
-const struct dma_map_ops *dma_ops;
-EXPORT_SYMBOL(dma_ops);
-
 #ifdef CONFIG_PROC_FS
 
 static int sparc_io_proc_show(struct seq_file *m, void *v)
index b32cc56..e717a56 100644 (file)
@@ -67,6 +67,7 @@ void of_propagate_archdata(struct platform_device *bus)
                op->dev.archdata.stc = bus_sd->stc;
                op->dev.archdata.host_controller = bus_sd->host_controller;
                op->dev.archdata.numa_node = bus_sd->numa_node;
+               op->dev.dma_ops = bus->dev.dma_ops;
 
                if (dp->child)
                        of_propagate_archdata(op);
index 33a0fac..289276b 100644 (file)
@@ -38,6 +38,8 @@
 #define IOPERM        (IOUPTE_CACHE | IOUPTE_WRITE | IOUPTE_VALID)
 #define MKIOPTE(phys) __iopte((((phys)>>4) & IOUPTE_PAGE) | IOPERM)
 
+static const struct dma_map_ops iounit_dma_ops;
+
 static void __init iounit_iommu_init(struct platform_device *op)
 {
        struct iounit_struct *iounit;
@@ -70,6 +72,8 @@ static void __init iounit_iommu_init(struct platform_device *op)
        xptend = iounit->page_table + (16 * PAGE_SIZE) / sizeof(iopte_t);
        for (; xpt < xptend; xpt++)
                sbus_writel(0, xpt);
+
+       op->dev.dma_ops = &iounit_dma_ops;
 }
 
 static int __init iounit_init(void)
@@ -288,8 +292,3 @@ static const struct dma_map_ops iounit_dma_ops = {
        .map_sg                 = iounit_map_sg,
        .unmap_sg               = iounit_unmap_sg,
 };
-
-void __init ld_mmu_iounit(void)
-{
-       dma_ops = &iounit_dma_ops;
-}
index 4d3c699..b00dde1 100644 (file)
@@ -54,6 +54,9 @@ static pgprot_t dvma_prot;            /* Consistent mapping pte flags */
 #define IOPERM        (IOPTE_CACHE | IOPTE_WRITE | IOPTE_VALID)
 #define MKIOPTE(pfn, perm) (((((pfn)<<8) & IOPTE_PAGE) | (perm)) & ~IOPTE_WAZ)
 
+static const struct dma_map_ops sbus_iommu_dma_gflush_ops;
+static const struct dma_map_ops sbus_iommu_dma_pflush_ops;
+
 static void __init sbus_iommu_init(struct platform_device *op)
 {
        struct iommu_struct *iommu;
@@ -129,6 +132,11 @@ static void __init sbus_iommu_init(struct platform_device *op)
               (int)(IOMMU_NPTES*sizeof(iopte_t)), (int)IOMMU_NPTES);
 
        op->dev.archdata.iommu = iommu;
+
+       if (flush_page_for_dma_global)
+               op->dev.dma_ops = &sbus_iommu_dma_gflush_ops;
+        else
+               op->dev.dma_ops = &sbus_iommu_dma_pflush_ops;
 }
 
 static int __init iommu_init(void)
@@ -445,13 +453,6 @@ static const struct dma_map_ops sbus_iommu_dma_pflush_ops = {
 
 void __init ld_mmu_iommu(void)
 {
-       if (flush_page_for_dma_global) {
-               /* flush_page_for_dma flushes everything, no matter of what page is it */
-               dma_ops = &sbus_iommu_dma_gflush_ops;
-       } else {
-               dma_ops = &sbus_iommu_dma_pflush_ops;
-       }
-
        if (viking_mxcc_present || srmmu_modtype == HyperSparc) {
                dvma_prot = __pgprot(SRMMU_CACHE | SRMMU_ET_PTE | SRMMU_PRIV);
                ioperm_noc = IOPTE_CACHE | IOPTE_WRITE | IOPTE_VALID;
index 0d0b06e..ce750a9 100644 (file)
@@ -20,6 +20,3 @@ void __init srmmu_paging_init(void);
 
 /* iommu.c */
 void ld_mmu_iommu(void);
-
-/* io-unit.c */
-void ld_mmu_iounit(void);
index f56c3c9..b7c94de 100644 (file)
@@ -1865,9 +1865,7 @@ void __init load_mmu(void)
                &smp_cachetlb_ops;
 #endif
 
-       if (sparc_cpu_model == sun4d)
-               ld_mmu_iounit();
-       else
+       if (sparc_cpu_model != sun4d)
                ld_mmu_iommu();
 #ifdef CONFIG_SMP
        if (sparc_cpu_model == sun4d)