Commit 12782fbe authored by Linus Torvalds's avatar Linus Torvalds

Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc

Pull sparc update from David Miller:
 "A per-device DMA ops conversion for sparc32 by Chrstioph Hellwig"

* git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc:
  sparc32: use per-device dma_ops
parents 498ff42d 255a69a9
...@@ -2,23 +2,12 @@ ...@@ -2,23 +2,12 @@
#ifndef ___ASM_SPARC_DMA_MAPPING_H #ifndef ___ASM_SPARC_DMA_MAPPING_H
#define ___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 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) static inline const struct dma_map_ops *get_arch_dma_ops(struct bus_type *bus)
{ {
#ifdef CONFIG_SPARC_LEON /* sparc32 uses per-device dma_ops */
if (sparc_cpu_model == sparc_leon) return IS_ENABLED(CONFIG_SPARC64) ? dma_ops : NULL;
return NULL;
#endif
#if defined(CONFIG_SPARC32) && defined(CONFIG_PCI)
if (bus == &pci_bus_type)
return NULL;
#endif
return dma_ops;
} }
#endif #endif
...@@ -373,9 +373,6 @@ void arch_sync_dma_for_cpu(phys_addr_t paddr, size_t size, ...@@ -373,9 +373,6 @@ void arch_sync_dma_for_cpu(phys_addr_t paddr, size_t size,
dma_make_coherent(paddr, PAGE_ALIGN(size)); dma_make_coherent(paddr, PAGE_ALIGN(size));
} }
const struct dma_map_ops *dma_ops;
EXPORT_SYMBOL(dma_ops);
#ifdef CONFIG_PROC_FS #ifdef CONFIG_PROC_FS
static int sparc_io_proc_show(struct seq_file *m, void *v) static int sparc_io_proc_show(struct seq_file *m, void *v)
......
...@@ -67,6 +67,7 @@ void of_propagate_archdata(struct platform_device *bus) ...@@ -67,6 +67,7 @@ void of_propagate_archdata(struct platform_device *bus)
op->dev.archdata.stc = bus_sd->stc; op->dev.archdata.stc = bus_sd->stc;
op->dev.archdata.host_controller = bus_sd->host_controller; op->dev.archdata.host_controller = bus_sd->host_controller;
op->dev.archdata.numa_node = bus_sd->numa_node; op->dev.archdata.numa_node = bus_sd->numa_node;
op->dev.dma_ops = bus->dev.dma_ops;
if (dp->child) if (dp->child)
of_propagate_archdata(op); of_propagate_archdata(op);
......
...@@ -38,6 +38,8 @@ ...@@ -38,6 +38,8 @@
#define IOPERM (IOUPTE_CACHE | IOUPTE_WRITE | IOUPTE_VALID) #define IOPERM (IOUPTE_CACHE | IOUPTE_WRITE | IOUPTE_VALID)
#define MKIOPTE(phys) __iopte((((phys)>>4) & IOUPTE_PAGE) | IOPERM) #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) static void __init iounit_iommu_init(struct platform_device *op)
{ {
struct iounit_struct *iounit; struct iounit_struct *iounit;
...@@ -70,6 +72,8 @@ static void __init iounit_iommu_init(struct platform_device *op) ...@@ -70,6 +72,8 @@ static void __init iounit_iommu_init(struct platform_device *op)
xptend = iounit->page_table + (16 * PAGE_SIZE) / sizeof(iopte_t); xptend = iounit->page_table + (16 * PAGE_SIZE) / sizeof(iopte_t);
for (; xpt < xptend; xpt++) for (; xpt < xptend; xpt++)
sbus_writel(0, xpt); sbus_writel(0, xpt);
op->dev.dma_ops = &iounit_dma_ops;
} }
static int __init iounit_init(void) static int __init iounit_init(void)
...@@ -288,8 +292,3 @@ static const struct dma_map_ops iounit_dma_ops = { ...@@ -288,8 +292,3 @@ static const struct dma_map_ops iounit_dma_ops = {
.map_sg = iounit_map_sg, .map_sg = iounit_map_sg,
.unmap_sg = iounit_unmap_sg, .unmap_sg = iounit_unmap_sg,
}; };
void __init ld_mmu_iounit(void)
{
dma_ops = &iounit_dma_ops;
}
...@@ -54,6 +54,9 @@ static pgprot_t dvma_prot; /* Consistent mapping pte flags */ ...@@ -54,6 +54,9 @@ static pgprot_t dvma_prot; /* Consistent mapping pte flags */
#define IOPERM (IOPTE_CACHE | IOPTE_WRITE | IOPTE_VALID) #define IOPERM (IOPTE_CACHE | IOPTE_WRITE | IOPTE_VALID)
#define MKIOPTE(pfn, perm) (((((pfn)<<8) & IOPTE_PAGE) | (perm)) & ~IOPTE_WAZ) #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) static void __init sbus_iommu_init(struct platform_device *op)
{ {
struct iommu_struct *iommu; struct iommu_struct *iommu;
...@@ -129,6 +132,11 @@ static void __init sbus_iommu_init(struct platform_device *op) ...@@ -129,6 +132,11 @@ static void __init sbus_iommu_init(struct platform_device *op)
(int)(IOMMU_NPTES*sizeof(iopte_t)), (int)IOMMU_NPTES); (int)(IOMMU_NPTES*sizeof(iopte_t)), (int)IOMMU_NPTES);
op->dev.archdata.iommu = iommu; 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) static int __init iommu_init(void)
...@@ -445,13 +453,6 @@ static const struct dma_map_ops sbus_iommu_dma_pflush_ops = { ...@@ -445,13 +453,6 @@ static const struct dma_map_ops sbus_iommu_dma_pflush_ops = {
void __init ld_mmu_iommu(void) 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) { if (viking_mxcc_present || srmmu_modtype == HyperSparc) {
dvma_prot = __pgprot(SRMMU_CACHE | SRMMU_ET_PTE | SRMMU_PRIV); dvma_prot = __pgprot(SRMMU_CACHE | SRMMU_ET_PTE | SRMMU_PRIV);
ioperm_noc = IOPTE_CACHE | IOPTE_WRITE | IOPTE_VALID; ioperm_noc = IOPTE_CACHE | IOPTE_WRITE | IOPTE_VALID;
......
...@@ -20,6 +20,3 @@ void __init srmmu_paging_init(void); ...@@ -20,6 +20,3 @@ void __init srmmu_paging_init(void);
/* iommu.c */ /* iommu.c */
void ld_mmu_iommu(void); void ld_mmu_iommu(void);
/* io-unit.c */
void ld_mmu_iounit(void);
...@@ -1865,9 +1865,7 @@ void __init load_mmu(void) ...@@ -1865,9 +1865,7 @@ void __init load_mmu(void)
&smp_cachetlb_ops; &smp_cachetlb_ops;
#endif #endif
if (sparc_cpu_model == sun4d) if (sparc_cpu_model != sun4d)
ld_mmu_iounit();
else
ld_mmu_iommu(); ld_mmu_iommu();
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
if (sparc_cpu_model == sun4d) if (sparc_cpu_model == sun4d)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment