diff mbox series

[1/2] sparc32: remove dma_make_coherent

Message ID 20210920113108.1299996-2-hch@lst.de
State New
Headers show
Series [1/2] sparc32: remove dma_make_coherent | expand

Commit Message

Christoph Hellwig Sept. 20, 2021, 11:31 a.m. UTC
LEON only needs snooping when DMA accesses are not seen on the processor
bus.  Given that coherent allocations are mapped uncached this can't
happen for those, so open code the d-cache flushing logic in the only
remaing place that needs it, arch_sync_dma_for_cpu.

Signed-off-by: Christoph Hellwig <hch@lst.de>
---
 arch/sparc/kernel/ioport.c | 26 ++++++++++----------------
 1 file changed, 10 insertions(+), 16 deletions(-)

Comments

Christoph Hellwig Sept. 21, 2021, 7:41 a.m. UTC | #1
On Mon, Sep 20, 2021 at 06:07:16PM +0200, Sam Ravnborg wrote:
> On Mon, Sep 20, 2021 at 01:31:07PM +0200, Christoph Hellwig wrote:
> > LEON only needs snooping when DMA accesses are not seen on the processor
> > bus.  Given that coherent allocations are mapped uncached this can't
> > happen for those, so open code the d-cache flushing logic in the only
> > remaing place that needs it, arch_sync_dma_for_cpu.

> I do not see this change explicitly explained in the changelog.
> Is this not one of the "only remaining place that needs it"?

Yes.  Two callers, one needs it, one doesn't.

> Would be nice to see it explicitly mentioned.

Ok.  I'll respin with a more detailed commit log.
Andreas Larsson Sept. 21, 2021, 11:32 a.m. UTC | #2
On 2021-09-21 09:41, Christoph Hellwig wrote:
> Ok.  I'll respin with a more detailed commit log.

These two patches works fine for me, so you can add a

Tested-by: Andreas Larsson <andreas@gaisler.com>

as well.
Christoph Hellwig Oct. 21, 2021, 11:09 a.m. UTC | #3
I've now commited this series to the dma-mapping tree, with the first
patch split into two so that is more obvious:

http://git.infradead.org/users/hch/dma-mapping.git/shortlog/refs/heads/for-next
diff mbox series

Patch

diff --git a/arch/sparc/kernel/ioport.c b/arch/sparc/kernel/ioport.c
index 7ceae24b0ca99..3eb748e862220 100644
--- a/arch/sparc/kernel/ioport.c
+++ b/arch/sparc/kernel/ioport.c
@@ -52,17 +52,6 @@ 
 #include <asm/io-unit.h>
 #include <asm/leon.h>
 
-/* This function must make sure that caches and memory are coherent after DMA
- * On LEON systems without cache snooping it flushes the entire D-CACHE.
- */
-static inline void dma_make_coherent(unsigned long pa, unsigned long len)
-{
-	if (sparc_cpu_model == sparc_leon) {
-		if (!sparc_leon3_snooping_enabled())
-			leon_flush_dcache_all();
-	}
-}
-
 static void __iomem *_sparc_ioremap(struct resource *res, u32 bus, u32 pa, int sz);
 static void __iomem *_sparc_alloc_io(unsigned int busno, unsigned long phys,
     unsigned long size, char *name);
@@ -361,18 +350,23 @@  void arch_dma_free(struct device *dev, size_t size, void *cpu_addr,
 	if (!sparc_dma_free_resource(cpu_addr, size))
 		return;
 
-	dma_make_coherent(dma_addr, size);
 	srmmu_unmapiorange((unsigned long)cpu_addr, size);
 	free_pages((unsigned long)phys_to_virt(dma_addr), get_order(size));
 }
 
-/* IIep is write-through, not flushing on cpu to device transfer. */
-
+/*
+ * IIep is write-through, not flushing on cpu to device transfer.
+ *
+ * On LEON systems without cache snooping, the entire D-CACHE must be flushed to
+ * make DMA to cacheable memory coherent.
+ */
 void arch_sync_dma_for_cpu(phys_addr_t paddr, size_t size,
 		enum dma_data_direction dir)
 {
-	if (dir != PCI_DMA_TODEVICE)
-		dma_make_coherent(paddr, PAGE_ALIGN(size));
+	if (dir != PCI_DMA_TODEVICE &&
+	    sparc_cpu_model == sparc_leon &&
+	    !sparc_leon3_snooping_enabled())
+		leon_flush_dcache_all();
 }
 
 #ifdef CONFIG_PROC_FS