1
2#ifndef _PARISC_TLBFLUSH_H
3#define _PARISC_TLBFLUSH_H
4
5
6
7#include <linux/mm.h>
8#include <linux/sched.h>
9#include <asm/mmu_context.h>
10
11
12
13
14
15
16
17
18
19
20
21extern spinlock_t pa_tlb_lock;
22
23#define purge_tlb_start(flags) spin_lock_irqsave(&pa_tlb_lock, flags)
24#define purge_tlb_end(flags) spin_unlock_irqrestore(&pa_tlb_lock, flags)
25
26extern void flush_tlb_all(void);
27extern void flush_tlb_all_local(void *);
28
29#define smp_flush_tlb_all() flush_tlb_all()
30
31int __flush_tlb_range(unsigned long sid,
32 unsigned long start, unsigned long end);
33
34#define flush_tlb_range(vma, start, end) \
35 __flush_tlb_range((vma)->vm_mm->context, start, end)
36
37#define flush_tlb_kernel_range(start, end) \
38 __flush_tlb_range(0, start, end)
39
40
41
42
43
44
45
46
47
48
49
50
51static inline void flush_tlb_mm(struct mm_struct *mm)
52{
53 BUG_ON(mm == &init_mm);
54
55#if 1 || defined(CONFIG_SMP)
56
57
58
59
60
61
62 flush_tlb_all();
63#else
64
65
66
67
68
69 if (mm) {
70 if (mm->context != 0)
71 free_sid(mm->context);
72 mm->context = alloc_sid();
73 if (mm == current->active_mm)
74 load_context(mm->context);
75 }
76#endif
77}
78
79static inline void flush_tlb_page(struct vm_area_struct *vma,
80 unsigned long addr)
81{
82 unsigned long flags, sid;
83
84 sid = vma->vm_mm->context;
85 purge_tlb_start(flags);
86 mtsp(sid, 1);
87 pdtlb(addr);
88 if (unlikely(split_tlb))
89 pitlb(addr);
90 purge_tlb_end(flags);
91}
92#endif
93