don't do a DVD_Mount for GC-mode on Wii, add ifdef for Wii-only SMB code
[libogc.git] / libogc / system_asm.S
blob0857004983bec09883a457571ebd86e9c27b83ed
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         mfmsr   r4
28         ori             r4,r4,MSR_FP    // MSR = 00002000 (FP on)
29         mtmsr   r4
30         
31         ori             r3,r3,0xc000    // d-cache & i-cache enable
32         mtspr   HID0,r3
33         isync
35 #if defined(HW_RVL)
36         lis             r3,0x8200               //bits set: H4A(HID4 access), SBE(2nd BAT enabled)
37         mtspr   HID4,r3
38         isync
39 #endif
41         // clear all BATs
42         li              r0,0
43         mtspr   IBAT0U,r0; mtspr        IBAT1U,r0; mtspr        IBAT2U,r0; mtspr        IBAT3U,r0               // IBAT0...3
44         mtspr   DBAT0U,r0; mtspr        DBAT1U,r0; mtspr        DBAT2U,r0; mtspr        DBAT3U,r0               // DBAT0...3
45 #if defined(HW_RVL)
46         mtspr   IBAT4U,r0; mtspr        IBAT5U,r0; mtspr        IBAT6U,r0; mtspr        IBAT7U,r0               // IBAT4...7
47         mtspr   DBAT4U,r0; mtspr        DBAT5U,r0; mtspr        DBAT6U,r0; mtspr        DBAT7U,r0               // DBAT4...7
48 #endif
49         isync
51         // clear all SRs
52         lis             r0,0x8000
53         mtsr    0,r0; mtsr      1,r0; mtsr      2,r0; mtsr      3,r0; mtsr      4,r0; mtsr      5,r0; mtsr      6,r0
54         mtsr    7,r0; mtsr      8,r0; mtsr      9,r0; mtsr      10,r0; mtsr     11,r0; mtsr     12,r0; mtsr     13,r0
55         mtsr    14,r0; mtsr     15,r0
56         isync
58         // set [DI]BAT0 for 256MB@80000000,
59         // real 00000000, WIMG=0000, R/W
60         li              r3,2
61         lis             r4,0x8000
62         ori             r4,r4,0x1fff
63         mtspr   IBAT0L,r3
64         mtspr   IBAT0U,r4
65         mtspr   DBAT0L,r3
66         mtspr   DBAT0U,r4
67         isync
68         
69 #if defined(HW_RVL)
70         // set [DI]BAT4 for 256MB@90000000,
71         // real 10000000, WIMG=0000, R/W
72         addis   r3,r3,0x1000
73         addis   r4,r4,0x1000
74         mtspr   IBAT4L,r3
75         mtspr   IBAT4U,r4
76         mtspr   DBAT4L,r3
77         mtspr   DBAT4U,r4
78         isync
79 #endif
80         
81         // set DBAT1 for 256MB@c0000000,
82         // real 00000000, WIMG=0101, R/W
83         li              r3,0x2a
84         lis             r4,0xc000
85         ori             r4,r4,0x1fff
86         mtspr   DBAT1L,r3
87         mtspr   DBAT1U,r4
88         isync
89         
90 #if defined(HW_RVL)
91         // set DBAT5 for 256MB@d0000000,
92         // real 10000000, WIMG=0101, R/W
93         addis   r3,r3,0x1000
94         addis   r4,r4,0x1000
95         mtspr   DBAT5L,r3
96         mtspr   DBAT5U,r4
97         isync
98 #endif
100         mfmsr   r3
101         ori             r3,r3,MSR_DR|MSR_IR
102         mtsrr1  r3
103         mflr    r3
104         mtsrr0  r3
105         rfi
106         
107         .globl __configMEM1_24Mb
108 __configMEM1_24Mb:
109         // set [DI]BAT0 for 16Mb@80000000
110         // real 00000000, WIMG=0000, R/W
111         li              r7,0
112         li              r4,2
113         lis             r3,0x8000
114         addi    r3,r3,0x1ff
115         mtspr   IBAT0U,r7
116         mtspr   IBAT0L,r4
117         mtspr   IBAT0U,r3
118         isync
119         mtspr   DBAT0U,r7
120         mtspr   DBAT0L,r4
121         mtspr   DBAT0U,r3
122         isync
123         
124         // set [DI]BAT2 for 8Mb@81000000
125         // real 01000000, WIMG=0000, R/W
126         lis             r3,0x8100
127         addi    r3,r3,0x00ff
128         addis   r4,r4,0x0100
129         mtspr   IBAT2U,r7
130         mtspr   IBAT2L,r4
131         mtspr   IBAT2U,r3
132         isync
133         mtspr   DBAT2U,r7
134         mtspr   DBAT2L,r4
135         mtspr   DBAT2U,r3
136         isync
137         
138         mfmsr   r3
139         ori             r3,r3,MSR_DR|MSR_IR
140         mtsrr1  r3
141         mflr    r3
142         mtsrr0  r3
143         rfi
145         .globl __configMEM1_48Mb
146 __configMEM1_48Mb:
147         // set [DI]BAT0 for 32Mb@80000000
148         // real 00000000, WIMG=0000, R/W
149         li              r7,0
150         li              r4,2
151         lis             r3,0x8000
152         addi    r3,r3,0x3ff
153         mtspr   IBAT0U,r7
154         mtspr   IBAT0L,r4
155         mtspr   IBAT0U,r3
156         isync
157         mtspr   DBAT0U,r7
158         mtspr   DBAT0L,r4
159         mtspr   DBAT0U,r3
160         isync
161         
162         // set [DI]BAT2 for 16Mb@82000000
163         // real 02000000, WIMG=0000, R/W
164         lis             r3,0x8200
165         addi    r3,r3,0x01ff
166         addis   r4,r4,0x0200
167         mtspr   IBAT2U,r7
168         mtspr   IBAT2L,r4
169         mtspr   IBAT2U,r3
170         isync
171         mtspr   DBAT2U,r7
172         mtspr   DBAT2L,r4
173         mtspr   DBAT2U,r3
174         isync
176         mfmsr   r3
177         ori             r3,r3,MSR_DR|MSR_IR
178         mtsrr1  r3
179         mflr    r3
180         mtsrr0  r3
181         rfi
183 #if defined(HW_RVL)
184         .globl __configMEM2_64Mb
185 __configMEM2_64Mb:
186         // set [DI]BAT4 for 64Mb@90000000
187         // real 10000000, WIMG=0000, R/W
188         li              r7,0
189         lis             r4,0x1000
190         addi    r5,r4,2
191         lis             r3,0x9000
192         addi    r3,r3,0x7ff
193         mtspr   IBAT4U,r7
194         mtspr   IBAT4L,r5
195         mtspr   IBAT4U,r3
196         isync
197         mtspr   DBAT4U,r7
198         mtspr   DBAT4L,r5
199         mtspr   DBAT4U,r3
200         isync
202         // set DBAT5 for 64Mb@d0000000
203         // real 10000000, WIMG=0101, R/W
204         addi    r5,r4,0x2a
205         addis   r3,r3,0x4000
206         mtspr   DBAT5U,r7
207         mtspr   DBAT5L,r5
208         mtspr   DBAT5U,r3
209         isync
211         mfmsr   r3
212         ori             r3,r3,MSR_DR|MSR_IR
213         mtsrr1  r3
214         mflr    r3
215         mtsrr0  r3
216         rfi     
218         .globl __configMEM2_128Mb
219 __configMEM2_128Mb:
220         // set [DI]BAT4 for 128Mb@90000000
221         // real 10000000, WIMG=0000, R/W
222         li              r7,0
223         lis             r4,0x1000
224         addi    r5,r4,2
225         lis             r3,0x9000
226         addi    r3,r3,0xfff
227         mtspr   IBAT4U,r7
228         mtspr   IBAT4L,r5
229         mtspr   IBAT4U,r3
230         isync
231         mtspr   DBAT4U,r7
232         mtspr   DBAT4L,r5
233         mtspr   DBAT4U,r3
234         isync
235         
236         // set DBAT5 for 128Mb@d0000000
237         // real 10000000, WIMG=0101, R/W
238         addi    r5,r4,0x2a
239         addis   r3,r3,0x4000
240         mtspr   DBAT5U,r7
241         mtspr   DBAT5L,r6
242         mtspr   DBAT5U,r5
243         isync
245         mfmsr   r3
246         ori             r3,r3,MSR_DR|MSR_IR
247         mtsrr1  r3
248         mflr    r3
249         mtsrr0  r3
250         rfi     
251 #endif
253         .extern ICFlashInvalidate
254         .globl __PSInit
255 __PSInit:
256         mflr    r0
257         stw             r0,4(sp)
258         stwu    sp,-8(sp)
259         mfspr   r3,HID2
260         oris    r3,r3,0xA000
261         mtspr   HID2,r3
262         bl              ICFlashInvalidate
263         sync
264         li              r3,0
265         mtspr   GQR0,r3
266         lwz             r0,12(sp)
267         addi    sp,sp,8
268         mtlr    r0
269         blr
271         .extern ICEnable
272         .extern DCEnable
273         .extern L2Init
274         .extern L2Enable
275         .globl __CacheInit
276 __CacheInit:
277         mflr    r0
278         stw     r0, 4(sp)
279         stwu    sp, -16(sp)
280         stw     r31, 12(sp)
282         mfspr   r3,HID0 # (HID0)
283         rlwinm  r0,r3, 0, 16, 16
284         cmplwi  r0, 0x0000 # Check if the Instruction Cache has been enabled or not.
285         bne     ICEnabled
287         bl              ICEnable
288 ICEnabled:
289         mfspr   r3, HID0 # bl       PPCMfhid0
290         rlwinm  r0, r3, 0, 17, 17
291         cmplwi  r0, 0x0000 # Check if the Data Cache has been enabled or not.
292         bne     DCEnabled
293         
294         bl              DCEnable        
295 DCEnabled:
296         
297         mfspr   r3, L2CR # (L2CR)
298         clrrwi  r0, r3, 31 # Clear all of the bits except 31
299         cmplwi  r0, 0x0000
300         bne     L2Enabled
302         bl              L2Init
303         bl              L2Enable
305 L2Enabled:
306         # Restore the non-volatile registers to their previous values and return.
307         lwz     r0, 20(sp)
308         lwz     r31, 12(sp)
309         addi    sp, sp, 16
310         mtlr    r0
311         blr
313         .globl __SystemInit
314 __SystemInit:
315         mflr    r0
316         stw     r0, 4(sp)
317         stwu    sp, -24(sp)
318         stw     r31, 20(sp)
319         stw     r30, 16(sp)
320         stw     r29, 12(sp)
322         # Disable interrupts!
323         mfmsr   r3
324         rlwinm  r4,r3,0,17,15
325         rlwinm  r4,r4,0,26,24
326         mtmsr   r4
328         # Clear various SPR's
329         li      r3,0
330         mtspr   952, r3
331         mtspr   956, r3
332         mtspr   953, r3
333         mtspr   954, r3
334         mtspr   957, r3
335         mtspr   958, r3
337 #if defined(HW_RVL)
338         lis             r3,0x8390               //bits set: H4A(HID4 access), SBE(2nd BAT enabled),  SR0(store 0), LPE(PS LE exception), L2CFI(L2 castout prior to L2 inv. flash)
339         mtspr   HID4,r3
340 #endif
342         # Disable Speculative Bus Accesses to non-guarded space from both caches.
343         mfspr   r3, HID0
344         ori     r3, r3, 0x0200
345         mtspr   HID0, r3
347         # Set the Non-IEEE mode in the FPSCR
348         mtfsb1  29
349         
350         mfspr   r3,HID2 # (HID2)
351         rlwinm  r3, r3, 0, 2, 0
352         mtspr   HID2,r3 # (HID2)
354         # Restore the non-volatile registers to their previous values and return.
355         lwz     r0, 28(sp)
356         lwz     r31,20(sp)
357         lwz     r30,16(sp)
358         lwz     r29,12(sp)
359         addi    sp, sp, 24
360         mtlr    r0
361         blr
363         .globl __flush_cache
364 __flush_cache:
365         lis             r5,0xffff
366         ori             r5,r5,0xfff1
367         and             r5,r5,r3
368         subf    r3,r5,r3
369         add             r4,r4,r3
370 1:      dcbst   r0,r5
371         sync
372         icbi    r0,r5
373         addic   r5,r5,8
374         subic.  r4,r4,8
375         bge             1b
376         isync
377         blr
379         .globl __reset
380 __reset:
381         b               1f
382 9:      mfspr   r8,HID0
383         ori             r8,r8,0x0008
384         mtspr   HID0,r8
385         isync
386         sync
387         nop
388         b               2f
389 1:      b               3f
390 2:      mftb    r5
391 4:      mftb    r6
392         subf    r7,r5,r6
393         cmplwi  r7,0x1124
394         blt             4b
395         nop
396         b               5f
397 3:      b               6f
398 5:      lis             r8,0xCC00
399         ori             r8,r8,0x3000
400         li              r4,3
401         stw             r4,36(r8)
402         stw             r3,36(r8)
403         nop
404         b               7f
405 6:      b               8f
406 7:      nop
407         b               7b
408 8:      b               9b      
410         .globl SYS_SwitchFiber
411 SYS_SwitchFiber:
412         mflr    r0
413         mr              r9,sp
414         stwu    r9,-8(r8)
415         mr              sp,r8
416         stw             r0,4(r9)
417         mtlr    r7
418         blrl
419         lwz             r5,0(sp)
420         lwz             r0,4(r5)
421         mtlr    r0
422         mr              sp,r5
423         blr
425         .globl InitBATS
426 InitBATS:
427         mflr    r31
428         lis             r3,__configBATS@h
429         ori             r3,r3,__configBATS@l
430         bl              __realmode
431         mtlr    r31
432         blr
433