fix issue with HBC stub + 64B L2 cache (tueidj)
[libogc.git] / libogc / system_asm.S
blob7e90411bda633d746480ee120c5f2a21a872a0de
1 #include <asm.h>
3         .globl __realmode
4 __realmode:
5         clrlwi  r3,r3,2
6         mtsrr0  r3
7         mfmsr   r3
8         rlwinm  r3,r3,0,28,25
9         mtsrr1  r3
10         rfi
12         // complete init sequence taken from bootmii's ppc skeleton. thanks to segher
13         // after a talk with dhewg we came to that point that it's good to wipe+setup BATS correctly
14         .globl __configBATS
15 __configBATS:
16         // HID0 = 00110c64:
17         // bus checkstops off, sleep modes off,
18         // caches off, caches invalidate,
19         // store gathering off, enable data cache
20         // flush assist, enable branch target cache,
21         // enable branch history table
22         lis             r3,0x0011
23         ori             r3,r3,0x0c64
24         mtspr   HID0,r3
25         isync
26         
27 #if defined(HW_RVL)
28         lis             r3,0x8200               //bits set: H4A(HID4 access), SBE(2nd BAT enabled)
29         mtspr   HID4,r3
30         isync
31 #endif
33         // clear all BATs
34         li              r0,0
35         mtspr   IBAT0U,r0; mtspr        IBAT1U,r0; mtspr        IBAT2U,r0; mtspr        IBAT3U,r0               // IBAT0...3
36         mtspr   DBAT0U,r0; mtspr        DBAT1U,r0; mtspr        DBAT2U,r0; mtspr        DBAT3U,r0               // DBAT0...3
37 #if defined(HW_RVL)
38         mtspr   IBAT4U,r0; mtspr        IBAT5U,r0; mtspr        IBAT6U,r0; mtspr        IBAT7U,r0               // IBAT4...7
39         mtspr   DBAT4U,r0; mtspr        DBAT5U,r0; mtspr        DBAT6U,r0; mtspr        DBAT7U,r0               // DBAT4...7
40 #endif
41         isync
43         // clear all SRs
44         lis             r0,0x8000
45         mtsr    0,r0; mtsr      1,r0; mtsr      2,r0; mtsr      3,r0; mtsr      4,r0; mtsr      5,r0; mtsr      6,r0
46         mtsr    7,r0; mtsr      8,r0; mtsr      9,r0; mtsr      10,r0; mtsr     11,r0; mtsr     12,r0; mtsr     13,r0
47         mtsr    14,r0; mtsr     15,r0
48         isync
50         // set [DI]BAT0 for 256MB@80000000,
51         // real 00000000, WIMG=0000, R/W
52         li              r3,2
53         lis             r4,0x8000
54         ori             r4,r4,0x1fff
55         mtspr   IBAT0L,r3
56         mtspr   IBAT0U,r4
57         mtspr   DBAT0L,r3
58         mtspr   DBAT0U,r4
59         isync
60         
61 #if defined(HW_RVL)
62         // set [DI]BAT4 for 256MB@90000000,
63         // real 10000000, WIMG=0000, R/W
64         addis   r3,r3,0x1000
65         addis   r4,r4,0x1000
66         mtspr   IBAT4L,r3
67         mtspr   IBAT4U,r4
68         mtspr   DBAT4L,r3
69         mtspr   DBAT4U,r4
70         isync
71 #endif
72         
73         // set DBAT1 for 256MB@c0000000,
74         // real 00000000, WIMG=0101, R/W
75         li              r3,0x2a
76         lis             r4,0xc000
77         ori             r4,r4,0x1fff
78         mtspr   DBAT1L,r3
79         mtspr   DBAT1U,r4
80         isync
81         
82 #if defined(HW_RVL)
83         // set DBAT5 for 256MB@d0000000,
84         // real 10000000, WIMG=0101, R/W
85         addis   r3,r3,0x1000
86         addis   r4,r4,0x1000
87         mtspr   DBAT5L,r3
88         mtspr   DBAT5U,r4
89         isync
90 #endif
92         mfmsr   r3
93         ori             r3,r3,MSR_DR|MSR_IR
94         mtsrr1  r3
95         mflr    r3
96         oris    r3,r3,0x8000
97         mtsrr0  r3
98         rfi
99         
100         .globl __InitFPRS
101 __InitFPRS:
102         # Enable the Floating Point Registers
103         mfmsr   r3
104         ori     r3,r3,MSR_FP
105         mtmsr   r3
106         mfspr   r3,920
107         extrwi. r3,r3,1,2
108         beq             1f
110         # Clear all of the PS FPR's to 0
111         lis             r3,zeroPS@ha
112         addi    r3,r3,zeroPS@l
113         psq_l   fr0,0(r3),0,0
114         ps_mr   fr1,fr0 
115         ps_mr   fr2,fr0 
116         ps_mr   fr3,fr0 
117         ps_mr   fr4,fr0 
118         ps_mr   fr5,fr0 
119         ps_mr   fr6,fr0 
120         ps_mr   fr7,fr0 
121         ps_mr   fr8,fr0 
122         ps_mr   fr9,fr0 
123         ps_mr   fr10,fr0        
124         ps_mr   fr11,fr0        
125         ps_mr   fr12,fr0        
126         ps_mr   fr13,fr0        
127         ps_mr   fr14,fr0        
128         ps_mr   fr15,fr0        
129         ps_mr   fr16,fr0        
130         ps_mr   fr17,fr0        
131         ps_mr   fr18,fr0        
132         ps_mr   fr19,fr0        
133         ps_mr   fr20,fr0        
134         ps_mr   fr21,fr0        
135         ps_mr   fr22,fr0        
136         ps_mr   fr23,fr0        
137         ps_mr   fr24,fr0        
138         ps_mr   fr25,fr0        
139         ps_mr   fr26,fr0        
140         ps_mr   fr27,fr0        
141         ps_mr   fr28,fr0        
142         ps_mr   fr29,fr0        
143         ps_mr   fr30,fr0        
144         ps_mr   fr31,fr0
145                 
146         # Clear all of the FPR's to 0
147 1:      lis         r3,zeroF@ha
148         lfd         fr0,zeroF@l(r3)
149         fmr     fr1,fr0
150         fmr     fr2,fr0
151         fmr     fr3,fr0
152         fmr     fr4,fr0
153         fmr     fr5,fr0
154         fmr     fr6,fr0
155         fmr     fr7,fr0
156         fmr     fr8,fr0
157         fmr     fr9,fr0
158         fmr     fr10,fr0
159         fmr     fr11,fr0
160         fmr     fr12,fr0
161         fmr     fr13,fr0
162         fmr     fr14,fr0
163         fmr     fr15,fr0
164         fmr     fr16,fr0
165         fmr     fr17,fr0
166         fmr     fr18,fr0
167         fmr     fr19,fr0
168         fmr     fr20,fr0
169         fmr     fr21,fr0
170         fmr     fr22,fr0
171         fmr     fr23,fr0
172         fmr     fr24,fr0
173         fmr     fr25,fr0
174         fmr     fr26,fr0
175         fmr     fr27,fr0
176         fmr     fr28,fr0
177         fmr     fr29,fr0
178         fmr     fr30,fr0
179         fmr     fr31,fr0
180         mtfsf   255,fr0
182         # Return
183         blr
185         .extern ICFlashInvalidate
186         .globl __InitPS
187 __InitPS:
188         mflr    r0
189         stw             r0,4(sp)
190         stwu    sp,-8(sp)
191         mfspr   r3,HID2
192         oris    r3,r3,0xA000
193         mtspr   HID2,r3
194         isync
195         bl              ICFlashInvalidate
196         sync
197         li              r3,0
198         mtspr   GQR0,r3
199         mtspr   GQR1,r3
200         mtspr   GQR2,r3
201         mtspr   GQR3,r3
202         mtspr   GQR4,r3
203         mtspr   GQR5,r3
204         mtspr   GQR6,r3
205         mtspr   GQR7,r3
206         isync
207         lwz             r0,12(sp)
208         addi    sp,sp,8
209         mtlr    r0
210         blr
212         .extern ICEnable
213         .extern DCEnable
214         .extern L2Init
215         .extern L2Enable
216         .globl __InitCache
217 __InitCache:
218         mflr    r0
219         stw     r0, 4(sp)
220         stwu    sp, -16(sp)
221         stw     r31, 12(sp)
223         mfspr   r3,HID0
224         rlwinm. r0,r3, 0, 16, 16        // Check if the Instruction Cache has been enabled or not.
225         bne     ICEnabled
227         bl              ICEnable
228 ICEnabled:
229         mfspr   r3, HID0
230         rlwinm. r0, r3, 0, 17, 17       // Check if the Data Cache has been enabled or not.
231         bne     DCEnabled
232         
233         bl              DCEnable        
234 DCEnabled:
235         
236         mfspr   r3, L2CR
237         clrrwi. r0, r3, 31                      // Check if the Locked Cache has been enabled or not.
238         bne     L2Enabled
240         bl              L2Init
241         bl              L2Enable
243 L2Enabled:
244         # Restore the non-volatile registers to their previous values and return.
245         lwz     r0, 20(sp)
246         lwz     r31, 12(sp)
247         addi    sp, sp, 16
248         mtlr    r0
249         blr
251         .globl __InitSystem
252 __InitSystem:
253         mflr    r0
254         stw     r0, 4(sp)
255         stwu    sp, -24(sp)
256         stmw    r29, 12(sp)
258         # Disable interrupts!
259         mfmsr   r3
260         rlwinm  r4,r3,0,17,15
261         rlwinm  r4,r4,0,26,24
262         mtmsr   r4
264         # Clear various SPR's
265         li      r3,0
266         mtspr   952, r3
267         mtspr   956, r3
268         mtspr   953, r3
269         mtspr   954, r3
270         mtspr   957, r3
271         mtspr   958, r3
272         isync
273         
274 #if defined(HW_RVL)
275         mfspr   r3,HID4
276         oris    r3,r3,0x25B0            //set additional bits in HID4: L2FM, BCO, SR0(store 0), LPE(PS LE exception), L2MUM, L2CFI(L2 castout prior to L2 inv. flash)
277         mtspr   HID4,r3
278         isync
279 #endif
281         # Disable Speculative Bus Accesses to non-guarded space from both caches.
282         mfspr   r3, HID0
283         ori     r3, r3, 0x0200
284         mtspr   HID0, r3
285         isync
286         
287         # Set the Non-IEEE mode in the FPSCR
288         mtfsb1  29
289         
290         # Disable Write Gather Pipe
291         mfspr   r3,HID2 # (HID2)
292         rlwinm  r3, r3, 0, 2, 0 
293         mtspr   HID2,r3 # (HID2)
294         isync
295         
296         # Restore the non-volatile registers to their previous values and return.
297         lwz     r0, 28(sp)
298         lmw     r29,12(sp)
299         addi    sp, sp, 24
300         mtlr    r0
301         blr
303         .globl __flush_cache
304 __flush_cache:
305         lis             r5,0xffff
306         ori             r5,r5,0xfff1
307         and             r5,r5,r3
308         subf    r3,r5,r3
309         add             r4,r4,r3
310 1:      dcbst   r0,r5
311         sync
312         icbi    r0,r5
313         addic   r5,r5,8
314         subic.  r4,r4,8
315         bge             1b
316         sync
317         blr
319         .globl __reset
320 __reset:
321         b               1f
322 9:      mfspr   r8,HID0
323         ori             r8,r8,0x0008
324         mtspr   HID0,r8
325         isync
326         sync
327         nop
328         b               2f
329 1:      b               3f
330 2:      mftb    r5
331 4:      mftb    r6
332         subf    r7,r5,r6
333         cmplwi  r7,0x1124
334         blt             4b
335         nop
336         b               5f
337 3:      b               6f
338 5:      lis             r8,0xCC00
339         ori             r8,r8,0x3000
340         li              r4,3
341         stw             r4,36(r8)
342         stw             r3,36(r8)
343         nop
344         b               7f
345 6:      b               8f
346 7:      nop
347         b               7b
348 8:      b               9b      
350         .globl __InitBATS
351 __InitBATS:
352         mflr    r31
353         oris    r31,r31,0x8000
354         lis             r3,__configBATS@h
355         ori             r3,r3,__configBATS@l
356         bl              __realmode
357         mtlr    r31
358         blr
359         
360         .globl SYS_SwitchFiber
361 SYS_SwitchFiber:
362         mflr    r0
363         mr              r9,sp
364         stwu    r9,-8(r8)
365         mr              sp,r8
366         stw             r0,4(r9)
367         mtlr    r7
368         blrl
369         lwz             r5,0(sp)
370         lwz             r0,4(r5)
371         mtlr    r0
372         mr              sp,r5
373         blr
375         .section .data
376         .balign 4
377 zeroF:
378         .double 0.0
379 zeroPS:
380         .float 0.0,0.0