1
2
3
4
5
6
7
8
9
10
11
12#include <linux/kernel.h>
13#include <linux/mm.h>
14#include <linux/io.h>
15#include <asm/mmu_context.h>
16#include <asm/cacheflush.h>
17
18void __update_tlb(struct vm_area_struct *vma, unsigned long address, pte_t pte)
19{
20 unsigned long flags, pteval, vpn;
21
22
23
24
25 if (vma && current->active_mm != vma->vm_mm)
26 return;
27
28 local_irq_save(flags);
29
30
31 vpn = address & MMU_VPN_MASK;
32 __raw_writel(vpn, MMU_PTEH);
33
34
35 __raw_writel(get_asid(), MMU_PTEAEX);
36
37 pteval = pte.pte_low;
38
39
40#ifdef CONFIG_X2TLB
41
42
43
44
45
46
47 __raw_writel(pte.pte_high, MMU_PTEA);
48#endif
49
50
51 pteval &= _PAGE_FLAGS_HARDWARE_MASK;
52#ifdef CONFIG_CACHE_WRITETHROUGH
53 pteval |= _PAGE_WT;
54#endif
55
56 __raw_writel(pteval, MMU_PTEL);
57
58
59 asm volatile("ldtlb": : : "memory");
60 local_irq_restore(flags);
61}
62
63
64
65
66
67
68
69
70void local_flush_tlb_one(unsigned long asid, unsigned long page)
71{
72 jump_to_uncached();
73 __raw_writel(page, MMU_UTLB_ADDRESS_ARRAY | MMU_PAGE_ASSOC_BIT);
74 __raw_writel(asid, MMU_UTLB_ADDRESS_ARRAY2 | MMU_PAGE_ASSOC_BIT);
75 __raw_writel(page, MMU_ITLB_ADDRESS_ARRAY | MMU_PAGE_ASSOC_BIT);
76 __raw_writel(asid, MMU_ITLB_ADDRESS_ARRAY2 | MMU_PAGE_ASSOC_BIT);
77 back_to_cached();
78}
79
80void local_flush_tlb_all(void)
81{
82 unsigned long flags, status;
83 int i;
84
85
86
87
88 local_irq_save(flags);
89 jump_to_uncached();
90
91 status = __raw_readl(MMUCR);
92 status = ((status & MMUCR_URB) >> MMUCR_URB_SHIFT);
93
94 if (status == 0)
95 status = MMUCR_URB_NENTRIES;
96
97 for (i = 0; i < status; i++)
98 __raw_writel(0x0, MMU_UTLB_ADDRESS_ARRAY | (i << 8));
99
100 for (i = 0; i < 4; i++)
101 __raw_writel(0x0, MMU_ITLB_ADDRESS_ARRAY | (i << 8));
102
103 back_to_cached();
104 ctrl_barrier();
105 local_irq_restore(flags);
106}
107