1
2
3
4
5
6
7
8
9
10
11
12
13
14
15#ifndef _ASM_RISCV_TLBFLUSH_H
16#define _ASM_RISCV_TLBFLUSH_H
17
18#include <linux/mm_types.h>
19
20
21
22
23
24static inline void local_flush_tlb_all(void)
25{
26 __asm__ __volatile__ ("sfence.vma" : : : "memory");
27}
28
29
30static inline void local_flush_tlb_page(unsigned long addr)
31{
32 __asm__ __volatile__ ("sfence.vma %0" : : "r" (addr) : "memory");
33}
34
35#ifndef CONFIG_SMP
36
37#define flush_tlb_all() local_flush_tlb_all()
38#define flush_tlb_page(vma, addr) local_flush_tlb_page(addr)
39#define flush_tlb_range(vma, start, end) local_flush_tlb_all()
40
41#else
42
43#include <asm/sbi.h>
44
45#define flush_tlb_all() sbi_remote_sfence_vma(0, 0, -1)
46#define flush_tlb_page(vma, addr) flush_tlb_range(vma, addr, 0)
47#define flush_tlb_range(vma, start, end) \
48 sbi_remote_sfence_vma(0, start, (end) - (start))
49
50#endif
51
52
53static inline void flush_tlb_mm(struct mm_struct *mm)
54{
55 flush_tlb_all();
56}
57
58
59static inline void flush_tlb_kernel_range(unsigned long start,
60 unsigned long end)
61{
62 flush_tlb_all();
63}
64
65#endif
66