1
2
3
4
5
6
7
8
9
10
11 #include <linux/init.h>
12 #include <linux/linkage.h>
13 #include <asm/assembler.h>
14 #include <asm/asm-offsets.h>
15 #include <asm/page.h>
16 #include <asm/tlbflush.h>
17 #include "proc-macros.S"
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32 ENTRY(v7wbi_flush_user_tlb_range)
33 vma_vm_mm r3, r2 @ get vma->vm_mm
34 mmid r3, r3 @ get vm_mm->context.id
35 dsb ish
36 mov r0, r0, lsr #PAGE_SHIFT @ align address
37 mov r1, r1, lsr #PAGE_SHIFT
38 asid r3, r3 @ mask ASID
39 #ifdef CONFIG_ARM_ERRATA_720789
40 ALT_SMP(W(mov) r3, #0 )
41 ALT_UP(W(nop) )
42 #endif
43 orr r0, r3, r0, lsl #PAGE_SHIFT @ Create initial MVA
44 mov r1, r1, lsl #PAGE_SHIFT
45 1:
46 #ifdef CONFIG_ARM_ERRATA_720789
47 ALT_SMP(mcr p15, 0, r0, c8, c3, 3) @ TLB invalidate U MVA all ASID (shareable)
48 #else
49 ALT_SMP(mcr p15, 0, r0, c8, c3, 1) @ TLB invalidate U MVA (shareable)
50 #endif
51 ALT_UP(mcr p15, 0, r0, c8, c7, 1) @ TLB invalidate U MVA
52
53 add r0, r0, #PAGE_SZ
54 cmp r0, r1
55 blo 1b
56 dsb ish
57 ret lr
58 ENDPROC(v7wbi_flush_user_tlb_range)
59
60
61
62
63
64
65
66
67
68 ENTRY(v7wbi_flush_kern_tlb_range)
69 dsb ish
70 mov r0, r0, lsr #PAGE_SHIFT @ align address
71 mov r1, r1, lsr #PAGE_SHIFT
72 mov r0, r0, lsl #PAGE_SHIFT
73 mov r1, r1, lsl #PAGE_SHIFT
74 1:
75 #ifdef CONFIG_ARM_ERRATA_720789
76 ALT_SMP(mcr p15, 0, r0, c8, c3, 3) @ TLB invalidate U MVA all ASID (shareable)
77 #else
78 ALT_SMP(mcr p15, 0, r0, c8, c3, 1) @ TLB invalidate U MVA (shareable)
79 #endif
80 ALT_UP(mcr p15, 0, r0, c8, c7, 1) @ TLB invalidate U MVA
81 add r0, r0, #PAGE_SZ
82 cmp r0, r1
83 blo 1b
84 dsb ish
85 isb
86 ret lr
87 ENDPROC(v7wbi_flush_kern_tlb_range)
88
89 __INIT
90
91
92 define_tlb_functions v7wbi, v7wbi_tlb_flags_up, flags_smp=v7wbi_tlb_flags_smp