···11+/* SPDX-License-Identifier: GPL-2.0 */22+33+#ifndef __ABI_CSKY_CACHEFLUSH_H44+#define __ABI_CSKY_CACHEFLUSH_H55+66+/* Keep includes the same across arches. */77+#include <linux/mm.h>88+99+/*1010+ * The cache doesn't need to be flushed when TLB entries change when1111+ * the cache is mapped to physical memory, not virtual memory1212+ */1313+#define flush_cache_all() do { } while (0)1414+#define flush_cache_mm(mm) do { } while (0)1515+#define flush_cache_dup_mm(mm) do { } while (0)1616+1717+#define flush_cache_range(vma, start, end) \1818+ do { \1919+ if (vma->vm_flags & VM_EXEC) \2020+ icache_inv_all(); \2121+ } while (0)2222+2323+#define flush_cache_page(vma, vmaddr, pfn) do { } while (0)2424+#define ARCH_IMPLEMENTS_FLUSH_DCACHE_PAGE 02525+#define flush_dcache_page(page) do { } while (0)2626+#define flush_dcache_mmap_lock(mapping) do { } while (0)2727+#define flush_dcache_mmap_unlock(mapping) do { } while (0)2828+2929+#define flush_icache_range(start, end) cache_wbinv_range(start, end)3030+3131+void flush_icache_page(struct vm_area_struct *vma, struct page *page);3232+void flush_icache_user_range(struct vm_area_struct *vma, struct page *page,3333+ unsigned long vaddr, int len);3434+3535+#define flush_cache_vmap(start, end) do { } while (0)3636+#define flush_cache_vunmap(start, end) do { } while (0)3737+3838+#define copy_to_user_page(vma, page, vaddr, dst, src, len) \3939+do { \4040+ memcpy(dst, src, len); \4141+ cache_wbinv_range((unsigned long)dst, (unsigned long)dst + len); \4242+} while (0)4343+#define copy_from_user_page(vma, page, vaddr, dst, src, len) \4444+ memcpy(dst, src, len)4545+4646+#endif /* __ABI_CSKY_CACHEFLUSH_H */
+49
arch/csky/include/asm/barrier.h
···11+/* SPDX-License-Identifier: GPL-2.0 */22+// Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd.33+44+#ifndef __ASM_CSKY_BARRIER_H55+#define __ASM_CSKY_BARRIER_H66+77+#ifndef __ASSEMBLY__88+99+#define nop() asm volatile ("nop\n":::"memory")1010+1111+/*1212+ * sync: completion barrier1313+ * sync.s: completion barrier and shareable to other cores1414+ * sync.i: completion barrier with flush cpu pipeline1515+ * sync.is: completion barrier with flush cpu pipeline and shareable to1616+ * other cores1717+ *1818+ * bar.brwarw: ordering barrier for all load/store instructions before it1919+ * bar.brwarws: ordering barrier for all load/store instructions before it2020+ * and shareable to other cores2121+ * bar.brar: ordering barrier for all load instructions before it2222+ * bar.brars: ordering barrier for all load instructions before it2323+ * and shareable to other cores2424+ * bar.bwaw: ordering barrier for all store instructions before it2525+ * bar.bwaws: ordering barrier for all store instructions before it2626+ * and shareable to other cores2727+ */2828+2929+#ifdef CONFIG_CPU_HAS_CACHEV23030+#define mb() asm volatile ("bar.brwarw\n":::"memory")3131+#define rmb() asm volatile ("bar.brar\n":::"memory")3232+#define wmb() asm volatile ("bar.bwaw\n":::"memory")3333+3434+#ifdef CONFIG_SMP3535+#define __smp_mb() asm volatile ("bar.brwarws\n":::"memory")3636+#define __smp_rmb() asm volatile ("bar.brars\n":::"memory")3737+#define __smp_wmb() asm volatile ("bar.bwaws\n":::"memory")3838+#endif /* CONFIG_SMP */3939+4040+#define sync_is() asm volatile ("sync.is\n":::"memory")4141+4242+#else /* !CONFIG_CPU_HAS_CACHEV2 */4343+#define mb() asm volatile ("sync\n":::"memory")4444+#endif4545+4646+#include <asm-generic/barrier.h>4747+4848+#endif /* __ASSEMBLY__ */4949+#endif /* __ASM_CSKY_BARRIER_H */
+30
arch/csky/include/asm/cache.h
···11+/* SPDX-License-Identifier: GPL-2.0 */22+33+#ifndef __ASM_CSKY_CACHE_H44+#define __ASM_CSKY_CACHE_H55+66+/* bytes per L1 cache line */77+#define L1_CACHE_SHIFT CONFIG_L1_CACHE_SHIFT88+99+#define L1_CACHE_BYTES (1 << L1_CACHE_SHIFT)1010+1111+#define ARCH_DMA_MINALIGN L1_CACHE_BYTES1212+1313+#ifndef __ASSEMBLY__1414+1515+void dcache_wb_line(unsigned long start);1616+1717+void icache_inv_range(unsigned long start, unsigned long end);1818+void icache_inv_all(void);1919+2020+void dcache_wb_range(unsigned long start, unsigned long end);2121+void dcache_wbinv_all(void);2222+2323+void cache_wbinv_range(unsigned long start, unsigned long end);2424+void cache_wbinv_all(void);2525+2626+void dma_wbinv_range(unsigned long start, unsigned long end);2727+void dma_wb_range(unsigned long start, unsigned long end);2828+2929+#endif3030+#endif /* __ASM_CSKY_CACHE_H */
···11+// SPDX-License-Identifier: GPL-2.022+// Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd.33+44+#include <linux/spinlock.h>55+#include <asm/cache.h>66+#include <abi/reg_ops.h>77+88+/* for L1-cache */99+#define INS_CACHE (1 << 0)1010+#define DATA_CACHE (1 << 1)1111+#define CACHE_INV (1 << 4)1212+#define CACHE_CLR (1 << 5)1313+#define CACHE_OMS (1 << 6)1414+#define CACHE_ITS (1 << 7)1515+#define CACHE_LICF (1 << 31)1616+1717+/* for L2-cache */1818+#define CR22_LEVEL_SHIFT (1)1919+#define CR22_SET_SHIFT (7)2020+#define CR22_WAY_SHIFT (30)2121+#define CR22_WAY_SHIFT_L2 (29)2222+2323+static DEFINE_SPINLOCK(cache_lock);2424+2525+static inline void cache_op_line(unsigned long i, unsigned int val)2626+{2727+ mtcr("cr22", i);2828+ mtcr("cr17", val);2929+}3030+3131+#define CCR2_L2E (1 << 3)3232+static void cache_op_all(unsigned int value, unsigned int l2)3333+{3434+ mtcr("cr17", value | CACHE_CLR);3535+ mb();3636+3737+ if (l2 && (mfcr_ccr2() & CCR2_L2E)) {3838+ mtcr("cr24", value | CACHE_CLR);3939+ mb();4040+ }4141+}4242+4343+static void cache_op_range(4444+ unsigned int start,4545+ unsigned int end,4646+ unsigned int value,4747+ unsigned int l2)4848+{4949+ unsigned long i, flags;5050+ unsigned int val = value | CACHE_CLR | CACHE_OMS;5151+ bool l2_sync;5252+5353+ if (unlikely((end - start) >= PAGE_SIZE) ||5454+ unlikely(start < PAGE_OFFSET) ||5555+ unlikely(start >= PAGE_OFFSET + LOWMEM_LIMIT)) {5656+ cache_op_all(value, l2);5757+ return;5858+ }5959+6060+ if ((mfcr_ccr2() & CCR2_L2E) && l2)6161+ l2_sync = 1;6262+ else6363+ l2_sync = 0;6464+6565+ spin_lock_irqsave(&cache_lock, flags);6666+6767+ i = start & ~(L1_CACHE_BYTES - 1);6868+ for (; i < end; i += L1_CACHE_BYTES) {6969+ cache_op_line(i, val);7070+ if (l2_sync) {7171+ mb();7272+ mtcr("cr24", val);7373+ }7474+ }7575+ spin_unlock_irqrestore(&cache_lock, flags);7676+7777+ mb();7878+}7979+8080+void dcache_wb_line(unsigned long start)8181+{8282+ asm volatile("idly4\n":::"memory");8383+ cache_op_line(start, DATA_CACHE|CACHE_CLR);8484+ mb();8585+}8686+8787+void icache_inv_range(unsigned long start, unsigned long end)8888+{8989+ cache_op_range(start, end, INS_CACHE|CACHE_INV, 0);9090+}9191+9292+void icache_inv_all(void)9393+{9494+ cache_op_all(INS_CACHE|CACHE_INV, 0);9595+}9696+9797+void dcache_wb_range(unsigned long start, unsigned long end)9898+{9999+ cache_op_range(start, end, DATA_CACHE|CACHE_CLR, 0);100100+}101101+102102+void dcache_wbinv_all(void)103103+{104104+ cache_op_all(DATA_CACHE|CACHE_CLR|CACHE_INV, 0);105105+}106106+107107+void cache_wbinv_range(unsigned long start, unsigned long end)108108+{109109+ cache_op_range(start, end, INS_CACHE|DATA_CACHE|CACHE_CLR|CACHE_INV, 0);110110+}111111+EXPORT_SYMBOL(cache_wbinv_range);112112+113113+void cache_wbinv_all(void)114114+{115115+ cache_op_all(INS_CACHE|DATA_CACHE|CACHE_CLR|CACHE_INV, 0);116116+}117117+118118+void dma_wbinv_range(unsigned long start, unsigned long end)119119+{120120+ cache_op_range(start, end, DATA_CACHE|CACHE_CLR|CACHE_INV, 1);121121+}122122+123123+void dma_wb_range(unsigned long start, unsigned long end)124124+{125125+ cache_op_range(start, end, DATA_CACHE|CACHE_INV, 1);126126+}
+79
arch/csky/mm/cachev2.c
···11+// SPDX-License-Identifier: GPL-2.022+// Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd.33+44+#include <linux/spinlock.h>55+#include <linux/smp.h>66+#include <asm/cache.h>77+#include <asm/barrier.h>88+99+inline void dcache_wb_line(unsigned long start)1010+{1111+ asm volatile("dcache.cval1 %0\n"::"r"(start):"memory");1212+ sync_is();1313+}1414+1515+void icache_inv_range(unsigned long start, unsigned long end)1616+{1717+ unsigned long i = start & ~(L1_CACHE_BYTES - 1);1818+1919+ for (; i < end; i += L1_CACHE_BYTES)2020+ asm volatile("icache.iva %0\n"::"r"(i):"memory");2121+ sync_is();2222+}2323+2424+void icache_inv_all(void)2525+{2626+ asm volatile("icache.ialls\n":::"memory");2727+ sync_is();2828+}2929+3030+void dcache_wb_range(unsigned long start, unsigned long end)3131+{3232+ unsigned long i = start & ~(L1_CACHE_BYTES - 1);3333+3434+ for (; i < end; i += L1_CACHE_BYTES)3535+ asm volatile("dcache.cval1 %0\n"::"r"(i):"memory");3636+ sync_is();3737+}3838+3939+void dcache_inv_range(unsigned long start, unsigned long end)4040+{4141+ unsigned long i = start & ~(L1_CACHE_BYTES - 1);4242+4343+ for (; i < end; i += L1_CACHE_BYTES)4444+ asm volatile("dcache.civa %0\n"::"r"(i):"memory");4545+ sync_is();4646+}4747+4848+void cache_wbinv_range(unsigned long start, unsigned long end)4949+{5050+ unsigned long i = start & ~(L1_CACHE_BYTES - 1);5151+5252+ for (; i < end; i += L1_CACHE_BYTES)5353+ asm volatile("dcache.cval1 %0\n"::"r"(i):"memory");5454+ sync_is();5555+5656+ i = start & ~(L1_CACHE_BYTES - 1);5757+ for (; i < end; i += L1_CACHE_BYTES)5858+ asm volatile("icache.iva %0\n"::"r"(i):"memory");5959+ sync_is();6060+}6161+EXPORT_SYMBOL(cache_wbinv_range);6262+6363+void dma_wbinv_range(unsigned long start, unsigned long end)6464+{6565+ unsigned long i = start & ~(L1_CACHE_BYTES - 1);6666+6767+ for (; i < end; i += L1_CACHE_BYTES)6868+ asm volatile("dcache.civa %0\n"::"r"(i):"memory");6969+ sync_is();7070+}7171+7272+void dma_wb_range(unsigned long start, unsigned long end)7373+{7474+ unsigned long i = start & ~(L1_CACHE_BYTES - 1);7575+7676+ for (; i < end; i += L1_CACHE_BYTES)7777+ asm volatile("dcache.civa %0\n"::"r"(i):"memory");7878+ sync_is();7979+}