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