1
2
3
4
5
6
7
8
9
10#ifndef __ASSEMBLY__
11
12#include <asm/memory.h>
13#include <asm/page.h>
14
15
16struct task_struct;
17
18
19
20
21
22extern struct processor {
23
24
25
26 void (*_data_abort)(unsigned long pc);
27
28
29
30 void (*_check_bugs)(void);
31
32
33
34 void (*_proc_init)(void);
35
36
37
38 void (*_proc_fin)(void);
39
40
41
42 volatile void (*reset)(unsigned long addr);
43
44
45
46 int (*_do_idle)(int mode);
47
48
49
50 struct {
51
52
53
54 void (*clean_invalidate_all)(void);
55
56
57
58 void (*clean_invalidate_range)(unsigned long address, unsigned long end, int flags);
59
60
61
62 void (*_flush_ram_page)(void *virt_page);
63 } cache;
64
65 struct {
66
67
68
69 void (*invalidate_range)(unsigned long start, unsigned long end);
70
71
72
73 void (*clean_range)(unsigned long start, unsigned long end);
74
75
76
77 void (*clean_page)(void *virt_page);
78
79
80
81
82 void (*clean_entry)(unsigned long start);
83 } dcache;
84
85 struct {
86
87
88
89 void (*invalidate_range)(unsigned long start, unsigned long end);
90
91
92
93 void (*invalidate_page)(void *virt_page);
94 } icache;
95
96 struct {
97
98
99
100 void (*invalidate_all)(void);
101
102
103
104 void (*invalidate_range)(unsigned long address, unsigned long end);
105
106
107
108 void (*invalidate_page)(unsigned long address, int flags);
109 } tlb;
110
111 struct {
112
113
114
115 void (*set_pgd)(unsigned long pgd_phys);
116
117
118
119 void (*set_pmd)(pmd_t *pmdp, pmd_t pmd);
120
121
122
123 void (*set_pte)(pte_t *ptep, pte_t pte);
124 } pgtable;
125} processor;
126
127extern const struct processor arm6_processor_functions;
128extern const struct processor arm7_processor_functions;
129extern const struct processor sa110_processor_functions;
130
131#define cpu_data_abort(pc) processor._data_abort(pc)
132#define cpu_check_bugs() processor._check_bugs()
133#define cpu_proc_init() processor._proc_init()
134#define cpu_proc_fin() processor._proc_fin()
135#define cpu_reset(addr) processor.reset(addr)
136#define cpu_do_idle(mode) processor._do_idle(mode)
137
138#define cpu_cache_clean_invalidate_all() processor.cache.clean_invalidate_all()
139#define cpu_cache_clean_invalidate_range(s,e,f) processor.cache.clean_invalidate_range(s,e,f)
140#define cpu_flush_ram_page(vp) processor.cache._flush_ram_page(vp)
141
142#define cpu_dcache_clean_page(vp) processor.dcache.clean_page(vp)
143#define cpu_dcache_clean_entry(addr) processor.dcache.clean_entry(addr)
144#define cpu_dcache_clean_range(s,e) processor.dcache.clean_range(s,e)
145#define cpu_dcache_invalidate_range(s,e) processor.dcache.invalidate_range(s,e)
146
147#define cpu_icache_invalidate_range(s,e) processor.icache.invalidate_range(s,e)
148#define cpu_icache_invalidate_page(vp) processor.icache.invalidate_page(vp)
149
150#define cpu_tlb_invalidate_all() processor.tlb.invalidate_all()
151#define cpu_tlb_invalidate_range(s,e) processor.tlb.invalidate_range(s,e)
152#define cpu_tlb_invalidate_page(vp,f) processor.tlb.invalidate_page(vp,f)
153
154#define cpu_set_pgd(pgd) processor.pgtable.set_pgd(pgd)
155#define cpu_set_pmd(pmdp, pmd) processor.pgtable.set_pmd(pmdp, pmd)
156#define cpu_set_pte(ptep, pte) processor.pgtable.set_pte(ptep, pte)
157
158#define cpu_switch_mm(pgd,tsk) cpu_set_pgd(__virt_to_phys((unsigned long)(pgd)))
159
160#define cpu_get_pgd() \
161 ({ \
162 unsigned long pg; \
163 __asm__("mrc p15, 0, %0, c2, c0, 0" \
164 : "=r" (pg)); \
165 pg &= ~0x3fff; \
166 (pgd_t *)phys_to_virt(pg); \
167 })
168
169#endif
170