diff options
Diffstat (limited to 'arch/riscv/include/asm/cacheflush.h')
-rw-r--r-- | arch/riscv/include/asm/cacheflush.h | 24 |
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 | ||
22 | static inline void local_flush_icache_all(void) | 23 | static 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 | |||
30 | static 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) | 51 | void flush_icache_mm(struct mm_struct *mm, bool local); |
36 | 52 | ||
37 | #endif /* CONFIG_SMP */ | 53 | #endif /* CONFIG_SMP */ |
38 | 54 | ||