parisc: Don't enforce DMA completion order in cache flushes
authorJohn David Anglin <dave.anglin@bell.net>
Wed, 30 Mar 2022 14:42:30 +0000 (14:42 +0000)
committerHelge Deller <deller@gmx.de>
Mon, 23 May 2022 11:44:24 +0000 (13:44 +0200)
The only place we need to ensure all outstanding cache coherence
operations are complete is in invalidate_kernel_vmap_range. All
parisc drivers synchronize DMA operations internally and do not
call invalidate_kernel_vmap_range. We only need this for non-coherent
I/O operations.

Signed-off-by: John David Anglin <dave.anglin@bell.net>
Signed-off-by: Helge Deller <deller@gmx.de>
arch/parisc/include/asm/cache.h
arch/parisc/kernel/cache.c
arch/parisc/kernel/pacache.S

index 5032e75..e23d06b 100644 (file)
@@ -54,6 +54,7 @@ void parisc_setup_cache_timing(void);
 #define asm_io_sync()  asm volatile("sync" \
                        ALTERNATIVE(ALT_COND_NO_DCACHE, INSN_NOP) \
                        ALTERNATIVE(ALT_COND_NO_IOC_FDC, INSN_NOP) :::"memory")
+#define asm_syncdma()  asm volatile("syncdma" :::"memory")
 
 #endif /* ! __ASSEMBLY__ */
 
index 0fd0407..c8a11fc 100644 (file)
@@ -754,6 +754,9 @@ void invalidate_kernel_vmap_range(void *vaddr, int size)
        unsigned long start = (unsigned long)vaddr;
        unsigned long end = start + size;
 
+       /* Ensure DMA is complete */
+       asm_syncdma();
+
        if ((!IS_ENABLED(CONFIG_SMP) || !arch_irqs_disabled()) &&
            (unsigned long)size >= parisc_cache_flush_threshold) {
                flush_tlb_kernel_range(start, end);
index b4c3f01..8569141 100644 (file)
@@ -300,7 +300,6 @@ fdoneloop2:
        fdce,m          %arg1(%sr1, %arg0)      /* Fdce for one loop */
 
 fdsync:
-       syncdma
        sync
        mtsm            %r22                    /* restore I-bit */
 89:    ALTERNATIVE(88b, 89b, ALT_COND_NO_DCACHE, INSN_NOP)
@@ -1098,7 +1097,6 @@ ENTRY_CFI(flush_kernel_dcache_range_asm)
 
        sync
 89:    ALTERNATIVE(88b, 89b, ALT_COND_NO_DCACHE, INSN_NOP)
-       syncdma
        bv              %r0(%r2)
        nop
 ENDPROC_CFI(flush_kernel_dcache_range_asm)
@@ -1140,7 +1138,6 @@ ENTRY_CFI(purge_kernel_dcache_range_asm)
 
        sync
 89:    ALTERNATIVE(88b, 89b, ALT_COND_NO_DCACHE, INSN_NOP)
-       syncdma
        bv              %r0(%r2)
        nop
 ENDPROC_CFI(purge_kernel_dcache_range_asm)