1
2
3
4
5
6
7
8
9
10
11 #include <asm/page.h>
12 #include <asm/processor.h>
13 #include <asm/cputable.h>
14 #include <asm/ppc_asm.h>
15 #include <asm/nohash/mmu-book3e.h>
16 #include <asm/asm-offsets.h>
17 #include <asm/mpc85xx.h>
18
19 _GLOBAL(__e500_icache_setup)
20 mfspr r0, SPRN_L1CSR1
21 andi. r3, r0, L1CSR1_ICE
22 bnelr
23 oris r0, r0, L1CSR1_CPE@h
24 ori r0, r0, (L1CSR1_ICFI | L1CSR1_ICLFR | L1CSR1_ICE)
25 mtspr SPRN_L1CSR1, r0
26 isync
27 blr
28
29 _GLOBAL(__e500_dcache_setup)
30 mfspr r0, SPRN_L1CSR0
31 andi. r3, r0, L1CSR0_DCE
32 bnelr
33 msync
34 isync
35 li r0, 0
36 mtspr SPRN_L1CSR0, r0
37 msync
38 isync
39 li r0, (L1CSR0_DCFI | L1CSR0_CLFC)
40 mtspr SPRN_L1CSR0, r0
41 isync
42 1: mfspr r0, SPRN_L1CSR0
43 andi. r3, r0, L1CSR0_CLFC
44 bne+ 1b
45 oris r0, r0, L1CSR0_CPE@h
46 ori r0, r0, L1CSR0_DCE
47 msync
48 isync
49 mtspr SPRN_L1CSR0, r0
50 isync
51 blr
52
53
54
55
56
57 #define PW20_WAIT_IDLE_BIT 50
58 _GLOBAL(setup_pw20_idle)
59 mfspr r3, SPRN_PWRMGTCR0
60
61
62 ori r3, r3, PWRMGTCR0_PW20_WAIT
63 li r11, PW20_WAIT_IDLE_BIT
64
65
66 rlwimi r3, r11, PWRMGTCR0_PW20_ENT_SHIFT, PWRMGTCR0_PW20_ENT
67
68 mtspr SPRN_PWRMGTCR0, r3
69
70 blr
71
72
73
74
75
76 #define AV_WAIT_IDLE_BIT 50
77 _GLOBAL(setup_altivec_idle)
78 mfspr r3, SPRN_PWRMGTCR0
79
80
81 oris r3, r3, PWRMGTCR0_AV_IDLE_PD_EN@h
82 li r11, AV_WAIT_IDLE_BIT
83
84
85 rlwimi r3, r11, PWRMGTCR0_AV_IDLE_CNT_SHIFT, PWRMGTCR0_AV_IDLE_CNT
86
87 mtspr SPRN_PWRMGTCR0, r3
88
89 blr
90
91 #ifdef CONFIG_PPC_E500MC
92 _GLOBAL(__setup_cpu_e6500)
93 mflr r6
94 #ifdef CONFIG_PPC64
95 bl setup_altivec_ivors
96
97 mfspr r10,SPRN_MMUCFG
98 rlwinm. r10,r10,0,MMUCFG_LPIDSIZE
99 beq 1f
100 bl setup_lrat_ivor
101 1:
102 #endif
103 bl setup_pw20_idle
104 bl setup_altivec_idle
105 bl __setup_cpu_e5500
106 mtlr r6
107 blr
108 #endif
109
110 #ifdef CONFIG_PPC32
111 #ifdef CONFIG_E200
112 _GLOBAL(__setup_cpu_e200)
113
114 mfspr r3,SPRN_HID0
115 ori r3,r3,HID0_DAPUEN@l
116 mtspr SPRN_HID0,r3
117 b __setup_e200_ivors
118 #endif
119
120 #ifdef CONFIG_E500
121 #ifndef CONFIG_PPC_E500MC
122 _GLOBAL(__setup_cpu_e500v1)
123 _GLOBAL(__setup_cpu_e500v2)
124 mflr r4
125 bl __e500_icache_setup
126 bl __e500_dcache_setup
127 bl __setup_e500_ivors
128 #if defined(CONFIG_FSL_RIO) || defined(CONFIG_FSL_PCI)
129
130 mfspr r3,SPRN_HID1
131 oris r3,r3,HID1_RFXE@h
132 mtspr SPRN_HID1,r3
133 #endif
134 mtlr r4
135 blr
136 #else
137 _GLOBAL(__setup_cpu_e500mc)
138 _GLOBAL(__setup_cpu_e5500)
139 mflr r5
140 bl __e500_icache_setup
141 bl __e500_dcache_setup
142 bl __setup_e500mc_ivors
143
144
145
146
147
148 mfspr r3, SPRN_MMUCFG
149 rlwinm. r3, r3, 0, MMUCFG_LPIDSIZE
150 beq 1f
151 bl __setup_ehv_ivors
152 b 2f
153 1:
154 lwz r3, CPU_SPEC_FEATURES(r4)
155
156
157
158
159
160 andi. r6, r3, CPU_FTR_EMB_HV
161 beq 2f
162 rlwinm r3, r3, 0, ~CPU_FTR_EMB_HV
163 stw r3, CPU_SPEC_FEATURES(r4)
164 2:
165 mtlr r5
166 blr
167 #endif
168 #endif
169 #endif
170
171 #ifdef CONFIG_PPC_BOOK3E_64
172 _GLOBAL(__restore_cpu_e6500)
173 mflr r5
174 bl setup_altivec_ivors
175
176 mfspr r10,SPRN_MMUCFG
177 rlwinm. r10,r10,0,MMUCFG_LPIDSIZE
178 beq 1f
179 bl setup_lrat_ivor
180 1:
181 bl setup_pw20_idle
182 bl setup_altivec_idle
183 bl __restore_cpu_e5500
184 mtlr r5
185 blr
186
187 _GLOBAL(__restore_cpu_e5500)
188 mflr r4
189 bl __e500_icache_setup
190 bl __e500_dcache_setup
191 bl __setup_base_ivors
192 bl setup_perfmon_ivor
193 bl setup_doorbell_ivors
194
195
196
197
198
199 mfspr r10,SPRN_MMUCFG
200 rlwinm. r10,r10,0,MMUCFG_LPIDSIZE
201 beq 1f
202 bl setup_ehv_ivors
203 1:
204 mtlr r4
205 blr
206
207 _GLOBAL(__setup_cpu_e5500)
208 mflr r5
209 bl __e500_icache_setup
210 bl __e500_dcache_setup
211 bl __setup_base_ivors
212 bl setup_perfmon_ivor
213 bl setup_doorbell_ivors
214
215
216
217
218
219 mfspr r10,SPRN_MMUCFG
220 rlwinm. r10,r10,0,MMUCFG_LPIDSIZE
221 beq 1f
222 bl setup_ehv_ivors
223 b 2f
224 1:
225 ld r10,CPU_SPEC_FEATURES(r4)
226 LOAD_REG_IMMEDIATE(r9,CPU_FTR_EMB_HV)
227 andc r10,r10,r9
228 std r10,CPU_SPEC_FEATURES(r4)
229 2:
230 mtlr r5
231 blr
232 #endif
233
234
235 _GLOBAL(flush_dcache_L1)
236 mfmsr r10
237 wrteei 0
238
239 mfspr r3,SPRN_L1CFG0
240 rlwinm r5,r3,9,3
241 twlgti r5,1
242
243
244 li r4,32
245 subfic r6,r5,2
246
247
248 slw r5,r4,r5
249
250 rlwinm r7,r3,0,0xff
251 mulli r7,r7,13
252
253
254 slw r7,r7,r6
255
256
257 mfspr r8,SPRN_HID0
258 ori r9,r8,HID0_DCFA@l
259 mtspr SPRN_HID0,r9
260 isync
261
262 LOAD_REG_IMMEDIATE(r6, KERNELBASE)
263 mr r4, r6
264 mtctr r7
265
266 1: lwz r3,0(r4)
267 add r4,r4,r5
268 bdnz 1b
269
270 msync
271 mr r4, r6
272 mtctr r7
273
274 1: dcbf 0,r4
275 add r4,r4,r5
276 bdnz 1b
277
278
279 mtspr SPRN_HID0,r8
280 isync
281
282 wrtee r10
283
284 blr
285
286 has_L2_cache:
287
288 mfspr r3, SPRN_SVR
289
290 rlwinm r4, r3, 24, ~0x800
291
292 lis r3, SVR_P2040@h
293 ori r3, r3, SVR_P2040@l
294 cmpw r4, r3
295 beq 1f
296
297 li r3, 1
298 blr
299 1:
300 li r3, 0
301 blr
302
303
304 flush_backside_L2_cache:
305 mflr r10
306 bl has_L2_cache
307 mtlr r10
308 cmpwi r3, 0
309 beq 2f
310
311
312 mfspr r3, SPRN_L2CSR0
313 ori r3, r3, L2CSR0_L2FL@l
314 msync
315 isync
316 mtspr SPRN_L2CSR0,r3
317 isync
318
319
320 1: mfspr r3,SPRN_L2CSR0
321 andi. r3, r3, L2CSR0_L2FL@l
322 bne 1b
323 2:
324 blr
325
326 _GLOBAL(cpu_down_flush_e500v2)
327 mflr r0
328 bl flush_dcache_L1
329 mtlr r0
330 blr
331
332 _GLOBAL(cpu_down_flush_e500mc)
333 _GLOBAL(cpu_down_flush_e5500)
334 mflr r0
335 bl flush_dcache_L1
336 bl flush_backside_L2_cache
337 mtlr r0
338 blr
339
340
341 _GLOBAL(cpu_down_flush_e6500)
342 blr