aboutsummaryrefslogtreecommitdiffstats
path: root/arch/riscv/include/asm/cacheflush.h
diff options
context:
space:
mode:
Diffstat (limited to 'arch/riscv/include/asm/cacheflush.h')
-rw-r--r--arch/riscv/include/asm/cacheflush.h24
1 files changed, 20 insertions, 4 deletions
diff --git a/arch/riscv/include/asm/cacheflush.h b/arch/riscv/include/asm/cacheflush.h
index 0595585013b0..5c9ed39ee2a2 100644
--- a/arch/riscv/include/asm/cacheflush.h
+++ b/arch/riscv/include/asm/cacheflush.h
@@ -18,21 +18,37 @@
18 18
19#undef flush_icache_range 19#undef flush_icache_range
20#undef flush_icache_user_range 20#undef flush_icache_user_range
21#undef flush_dcache_page
21 22
22static inline void local_flush_icache_all(void) 23static inline void local_flush_icache_all(void)
23{ 24{
24 asm volatile ("fence.i" ::: "memory"); 25 asm volatile ("fence.i" ::: "memory");
25} 26}
26 27
28#define PG_dcache_clean PG_arch_1
29
30static inline void flush_dcache_page(struct page *page)
31{
32 if (test_bit(PG_dcache_clean, &page->flags))
33 clear_bit(PG_dcache_clean, &page->flags);
34}
35
36/*
37 * RISC-V doesn't have an instruction to flush parts of the instruction cache,
38 * so instead we just flush the whole thing.
39 */
40#define flush_icache_range(start, end) flush_icache_all()
41#define flush_icache_user_range(vma, pg, addr, len) flush_icache_all()
42
27#ifndef CONFIG_SMP 43#ifndef CONFIG_SMP
28 44
29#define flush_icache_range(start, end) local_flush_icache_all() 45#define flush_icache_all() local_flush_icache_all()
30#define flush_icache_user_range(vma, pg, addr, len) local_flush_icache_all() 46#define flush_icache_mm(mm, local) flush_icache_all()
31 47
32#else /* CONFIG_SMP */ 48#else /* CONFIG_SMP */
33 49
34#define flush_icache_range(start, end) sbi_remote_fence_i(0) 50#define flush_icache_all() sbi_remote_fence_i(0)
35#define flush_icache_user_range(vma, pg, addr, len) sbi_remote_fence_i(0) 51void flush_icache_mm(struct mm_struct *mm, bool local);
36 52
37#endif /* CONFIG_SMP */ 53#endif /* CONFIG_SMP */
38 54