Fix libogc hardware lighting (GX_SetChanCtrl) - patch from https://sourceforge.net...
[libogc.git] / libogc / system_asm.S
blob5d9f87f30573464db0e4ba032403aae0d25e1262
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         stw     r31, 20(sp)
257         stw     r30, 16(sp)
258         stw     r29, 12(sp)
260         # Disable interrupts!
261         mfmsr   r3
262         rlwinm  r4,r3,0,17,15
263         rlwinm  r4,r4,0,26,24
264         mtmsr   r4
266         # Clear various SPR's
267         li      r3,0
268         mtspr   952, r3
269         mtspr   956, r3
270         mtspr   953, r3
271         mtspr   954, r3
272         mtspr   957, r3
273         mtspr   958, r3
274         isync
275         
276 #if defined(HW_RVL)
277         mfspr   r3,HID4
278         oris    r3,r3,0x0190            //set additional bits in HID4: SR0(store 0), LPE(PS LE exception), L2CFI(L2 castout prior to L2 inv. flash)
279         mtspr   HID4,r3
280         isync
281 #endif
283         # Disable Speculative Bus Accesses to non-guarded space from both caches.
284         mfspr   r3, HID0
285         ori     r3, r3, 0x0200
286         mtspr   HID0, r3
287         isync
288         
289         # Set the Non-IEEE mode in the FPSCR
290         mtfsb1  29
291         
292         # Disable Write Gather Pipe
293         mfspr   r3,HID2 # (HID2)
294         rlwinm  r3, r3, 0, 2, 0 
295         mtspr   HID2,r3 # (HID2)
296         isync
297         
298         # Restore the non-volatile registers to their previous values and return.
299         lwz     r0, 28(sp)
300         lwz     r31,20(sp)
301         lwz     r30,16(sp)
302         lwz     r29,12(sp)
303         addi    sp, sp, 24
304         mtlr    r0
305         blr
307         .globl __flush_cache
308 __flush_cache:
309         lis             r5,0xffff
310         ori             r5,r5,0xfff1
311         and             r5,r5,r3
312         subf    r3,r5,r3
313         add             r4,r4,r3
314 1:      dcbst   r0,r5
315         sync
316         icbi    r0,r5
317         addic   r5,r5,8
318         subic.  r4,r4,8
319         bge             1b
320         sync
321         blr
323         .globl __reset
324 __reset:
325         b               1f
326 9:      mfspr   r8,HID0
327         ori             r8,r8,0x0008
328         mtspr   HID0,r8
329         isync
330         sync
331         nop
332         b               2f
333 1:      b               3f
334 2:      mftb    r5
335 4:      mftb    r6
336         subf    r7,r5,r6
337         cmplwi  r7,0x1124
338         blt             4b
339         nop
340         b               5f
341 3:      b               6f
342 5:      lis             r8,0xCC00
343         ori             r8,r8,0x3000
344         li              r4,3
345         stw             r4,36(r8)
346         stw             r3,36(r8)
347         nop
348         b               7f
349 6:      b               8f
350 7:      nop
351         b               7b
352 8:      b               9b      
354         .globl __InitBATS
355 __InitBATS:
356         mflr    r31
357         oris    r31,r31,0x8000
358         lis             r3,__configBATS@h
359         ori             r3,r3,__configBATS@l
360         bl              __realmode
361         mtlr    r31
362         blr
363         
364         .globl SYS_SwitchFiber
365 SYS_SwitchFiber:
366         mflr    r0
367         mr              r9,sp
368         stwu    r9,-8(r8)
369         mr              sp,r8
370         stw             r0,4(r9)
371         mtlr    r7
372         blrl
373         lwz             r5,0(sp)
374         lwz             r0,4(r5)
375         mtlr    r0
376         mr              sp,r5
377         blr
379         .section .data
380         .balign 4
381 zeroF:
382         .double 0.0
383 zeroPS:
384         .float 0.0,0.0