1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-or-later */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun * OpenRISC Linux
4*4882a593Smuzhiyun *
5*4882a593Smuzhiyun * Linux architectural port borrowing liberally from similar works of
6*4882a593Smuzhiyun * others. All original copyrights apply as per the original source
7*4882a593Smuzhiyun * declaration.
8*4882a593Smuzhiyun *
9*4882a593Smuzhiyun * OpenRISC implementation:
10*4882a593Smuzhiyun * Copyright (C) 2003 Matjaz Breskvar <phoenix@bsemi.com>
11*4882a593Smuzhiyun * Copyright (C) 2010-2011 Jonas Bonn <jonas@southpole.se>
12*4882a593Smuzhiyun * et al.
13*4882a593Smuzhiyun */
14*4882a593Smuzhiyun
15*4882a593Smuzhiyun #ifndef __ASM_OPENRISC_TLBFLUSH_H
16*4882a593Smuzhiyun #define __ASM_OPENRISC_TLBFLUSH_H
17*4882a593Smuzhiyun
18*4882a593Smuzhiyun #include <linux/mm.h>
19*4882a593Smuzhiyun #include <asm/processor.h>
20*4882a593Smuzhiyun #include <asm/current.h>
21*4882a593Smuzhiyun #include <linux/sched.h>
22*4882a593Smuzhiyun
23*4882a593Smuzhiyun /*
24*4882a593Smuzhiyun * - flush_tlb() flushes the current mm struct TLBs
25*4882a593Smuzhiyun * - flush_tlb_all() flushes all processes TLBs
26*4882a593Smuzhiyun * - flush_tlb_mm(mm) flushes the specified mm context TLB's
27*4882a593Smuzhiyun * - flush_tlb_page(vma, vmaddr) flushes one page
28*4882a593Smuzhiyun * - flush_tlb_range(mm, start, end) flushes a range of pages
29*4882a593Smuzhiyun */
30*4882a593Smuzhiyun extern void local_flush_tlb_all(void);
31*4882a593Smuzhiyun extern void local_flush_tlb_mm(struct mm_struct *mm);
32*4882a593Smuzhiyun extern void local_flush_tlb_page(struct vm_area_struct *vma,
33*4882a593Smuzhiyun unsigned long addr);
34*4882a593Smuzhiyun extern void local_flush_tlb_range(struct vm_area_struct *vma,
35*4882a593Smuzhiyun unsigned long start,
36*4882a593Smuzhiyun unsigned long end);
37*4882a593Smuzhiyun
38*4882a593Smuzhiyun #ifndef CONFIG_SMP
39*4882a593Smuzhiyun #define flush_tlb_all local_flush_tlb_all
40*4882a593Smuzhiyun #define flush_tlb_mm local_flush_tlb_mm
41*4882a593Smuzhiyun #define flush_tlb_page local_flush_tlb_page
42*4882a593Smuzhiyun #define flush_tlb_range local_flush_tlb_range
43*4882a593Smuzhiyun #else
44*4882a593Smuzhiyun extern void flush_tlb_all(void);
45*4882a593Smuzhiyun extern void flush_tlb_mm(struct mm_struct *mm);
46*4882a593Smuzhiyun extern void flush_tlb_page(struct vm_area_struct *vma, unsigned long addr);
47*4882a593Smuzhiyun extern void flush_tlb_range(struct vm_area_struct *vma, unsigned long start,
48*4882a593Smuzhiyun unsigned long end);
49*4882a593Smuzhiyun #endif
50*4882a593Smuzhiyun
flush_tlb(void)51*4882a593Smuzhiyun static inline void flush_tlb(void)
52*4882a593Smuzhiyun {
53*4882a593Smuzhiyun flush_tlb_mm(current->mm);
54*4882a593Smuzhiyun }
55*4882a593Smuzhiyun
flush_tlb_kernel_range(unsigned long start,unsigned long end)56*4882a593Smuzhiyun static inline void flush_tlb_kernel_range(unsigned long start,
57*4882a593Smuzhiyun unsigned long end)
58*4882a593Smuzhiyun {
59*4882a593Smuzhiyun flush_tlb_range(NULL, start, end);
60*4882a593Smuzhiyun }
61*4882a593Smuzhiyun
62*4882a593Smuzhiyun #endif /* __ASM_OPENRISC_TLBFLUSH_H */
63