update DI disc code
[libogc.git] / libogc / cache_asm.S
blob8eda752d9774e53a2cfc7dceddc38451af6235bf
1 /*-------------------------------------------------------------
3 cache_asm.S -- Cache interface
5 Copyright (C) 2004
6 Michael Wiedenbauer (shagkur)
7 Dave Murphy (WinterMute)
9 This software is provided 'as-is', without any express or implied
10 warranty.  In no event will the authors be held liable for any
11 damages arising from the use of this software.
13 Permission is granted to anyone to use this software for any
14 purpose, including commercial applications, and to alter it and
15 redistribute it freely, subject to the following restrictions:
17 1.      The origin of this software must not be misrepresented; you
18 must not claim that you wrote the original software. If you use
19 this software in a product, an acknowledgment in the product
20 documentation would be appreciated but is not required.
22 2.      Altered source versions must be plainly marked as such, and
23 must not be misrepresented as being the original software.
25 3.      This notice may not be removed or altered from any source
26 distribution.
29 -------------------------------------------------------------*/
32 #include <asm.h>
34         .globl DCFlashInvalidate
35 DCFlashInvalidate:
36         mfspr   r3,HID0
37         ori             r3,r3,0x0400
38         mtspr   HID0,r3
39         blr
41         .globl DCEnable
42 DCEnable:
43         sync
44         mfspr   r3,HID0
45         ori             r3,r3,0x4000
46         mtspr   HID0,r3
47         blr
49         .globl DCDisable
50 DCDisable:
51         sync
52         mfspr   r3,HID0
53         rlwinm  r3,r3,0,18,16
54         mtspr   HID0,r3
55         blr
57         .globl DCFreeze
58 DCFreeze:
59         sync
60         mfspr   r3,HID0
61         ori             r3,r3,0x1000
62         mtspr   HID0,r3
63         blr
65         .globl DCUnfreeze
66 DCUnfreeze:
67         mfspr   r3,HID0
68         rlwinm  r3,r3,0,20,18
69         mtspr   HID0,r3
70         blr
72         .globl DCTouchLoad
73 DCTouchLoad:
74         dcbt    r0,r3
75         blr
77         .globl DCBlockZero
78 DCBlockZero:
79         dcbz    r0,r3
80         blr
82         .globl DCBlockStore
83 DCBlockStore:
84         dcbst   r0,r3
85         blr
87         .globl DCBlockFlush
88 DCBlockFlush:
89         dcbf    r0,r3
90         blr
92         .globl DCBlockInvalidate
93 DCBlockInvalidate:
94         dcbi    r0,r3
95         blr
97         .globl DCInvalidateRange
98 DCInvalidateRange:
99         cmplwi r4, 0   # zero or negative size?
100         blelr
101         clrlwi. r5, r3, 27  # check for lower bits set in address
102         beq 1f
103         addi r4, r4, 0x20 
105         addi r4, r4, 0x1f
106         srwi r4, r4, 5
107         mtctr r4
109         dcbi r0, r3
110         addi r3, r3, 0x20
111         bdnz 2b
112         blr
114         .globl DCFlushRange
115 DCFlushRange:
116         cmplwi r4, 0   # zero or negative size?
117         blelr
118         clrlwi. r5, r3, 27  # check for lower bits set in address
119         beq 1f
120         addi r4, r4, 0x20 
122         addi r4, r4, 0x1f
123         srwi r4, r4, 5
124         mtctr r4
126         dcbf r0, r3
127         addi r3, r3, 0x20
128         bdnz 2b
129         sc
130         blr
132         .globl DCStoreRange
133 DCStoreRange:
134         cmplwi r4, 0   # zero or negative size?
135         blelr
136         clrlwi. r5, r3, 27  # check for lower bits set in address
137         beq 1f
138         addi r4, r4, 0x20 
140         addi r4, r4, 0x1f
141         srwi r4, r4, 5
142         mtctr r4
144         dcbst r0, r3
145         addi r3, r3, 0x20
146         bdnz 2b
147         sc
148         blr
150         .globl DCFlushRangeNoSync
151 DCFlushRangeNoSync:
152         cmplwi r4, 0   # zero or negative size?
153         blelr
154         clrlwi. r5, r3, 27  # check for lower bits set in address
155         beq 1f
156         addi r4, r4, 0x20 
158         addi r4, r4, 0x1f
159         srwi r4, r4, 5
160         mtctr r4
162         dcbf r0, r3
163         addi r3, r3, 0x20
164         bdnz 2b
165         blr
167         .globl DCStoreRangeNoSync
168 DCStoreRangeNoSync:
169         cmplwi r4, 0   # zero or negative size?
170         blelr
171         clrlwi. r5, r3, 27  # check for lower bits set in address
172         beq 1f
173         addi r4, r4, 0x20 
175         addi r4, r4, 0x1f
176         srwi r4, r4, 5
177         mtctr r4
179         dcbst r0, r3
180         addi r3, r3, 0x20
181         bdnz 2b
182         blr
184         .globl DCZeroRange
185 DCZeroRange:
186         cmplwi r4, 0   # zero or negative size?
187         blelr
188         clrlwi. r5, r3, 27  # check for lower bits set in address
189         beq 1f
190         addi r4, r4, 0x20 
192         addi r4, r4, 0x1f
193         srwi r4, r4, 5
194         mtctr r4
196         dcbz r0, r3
197         addi r3, r3, 0x20
198         bdnz 2b
199         blr
201         .globl DCTouchRange
202 DCTouchRange:
203         cmplwi r4, 0   # zero or negative size?
204         blelr
205         clrlwi. r5, r3, 27  # check for lower bits set in address
206         beq 1f
207         addi r4, r4, 0x20 
209         addi r4, r4, 0x1f
210         srwi r4, r4, 5
211         mtctr r4
213         dcbt r0, r3
214         addi r3, r3, 0x20
215         bdnz 2b
216         blr
218         .globl ICInvalidateRange
219 ICInvalidateRange:
220         cmplwi r4, 0   # zero or negative size?
221         blelr
222         clrlwi. r5, r3, 27  # check for lower bits set in address
223         beq 1f
224         addi r4, r4, 0x20 
226         addi r4, r4, 0x1f
227         srwi r4, r4, 5
228         mtctr r4
230         icbi r0, r3
231         addi r3, r3, 0x20
232         bdnz 2b
233         sync
234         isync
235         blr
237         .globl ICFlashInvalidate
238 ICFlashInvalidate:
239         mfspr   r3,HID0
240         ori             r3,r3,0x0800
241         mtspr   HID0,r3
242         blr
244         .globl ICEnable
245 ICEnable:
246         isync
247         mfspr   r3,HID0
248         ori             r3,r3,0x8000
249         mtspr   HID0,r3
250         blr
252         .globl ICDisable
253 ICDisable:
254         isync
255         mfspr   r3,HID0
256         rlwinm  r3,r3,0,17,15
257         mtspr   HID0,r3
258         blr
260         .globl ICFreeze
261 ICFreeze:
262         isync
263         mfspr   r3,HID0
264         ori             r3,r3,0x2000
265         mtspr   HID0,r3
266         blr
268         .globl ICUnfreeze
269 ICUnfreeze:
270         mfspr   r3,HID0
271         rlwinm  r3,r3,0,19,17
272         mtspr   HID0,r3
273         blr
275         .globl ICBlockInvalidate
276 ICBlockInvalidate:
277         icbi    r0,r3
278         blr
280         .globl ICSync
281 ICSync:
282         isync
283         blr
285         .globl L2Init
286 L2Init:
287         mflr    r0
288         stw             r0,4(sp)
289         stwu    sp,-16(sp)
290         stw             r31,12(sp)
291         mfmsr   r3
292         mr              r31,r3
293         sync
294         li              r3,48
295         mtmsr   r3
296         sync
297         bl              L2Disable
298         bl              L2GlobalInvalidate
299         mr              r3,r31
300         mtmsr   r3
301         lwz             r0,20(sp)
302         lwz             r31,12(sp)
303         mtlr    r0
304         blr
306         .globl L2Enable
307 L2Enable:
308         mfspr   r3,L2CR;
309         oris    r0,r3,0x8000
310         rlwinm  r3,r0,0,11,9
311         mtspr   L2CR,r3
312         blr
314         .globl L2Disable
315 L2Disable:
316         sync
317         mfspr   r3,L2CR
318         clrlwi  r3,r3,1
319         mtspr   L2CR,r3
320         sync
321         blr
323         .globl L2GlobalInvalidate
324 L2GlobalInvalidate:
325         mflr    r0
326         stw             r0,4(sp)
327         stwu    sp,-8(sp)
328         bl              L2Disable
329         mfspr   r3,L2CR
330         oris    r3,r3,0x0020
331         mtspr   L2CR,r3
332 1:      mfspr   r3,L2CR
333         clrlwi  r0,r3,31
334         cmplwi  r0,0x0000
335         bne             1b
336         mfspr   r3,L2CR
337         rlwinm  r3,r3,0,11,9
338         mtspr   L2CR,r3
339 2:      mfspr   r3,L2CR
340         clrlwi  r0,r3,31
341         cmplwi  r0,0x0000
342         bne             2b
343         lwz             r0,12(sp)
344         addi    sp,sp,8
345         mtlr    r0
346         blr
348         .globl __LCEnable
349 __LCEnable:
350         mfmsr   r5
351         ori             r5,r5,0x1000
352         mtmsr   r5
353         lis             r3,0x8000
354         li              r4,1024
355         mtctr   r4
356 1:      dcbt    r0,r3
357         dcbst   r0,r3
358         bdnz    1b
359         mfspr   r4,HID2
360         oris    r4,r4,0x100f
361         mtspr   HID2,r4
362         nop
363         nop
364         nop
365         nop
366         nop
367         nop
368         nop
369         nop
370         nop
371         nop
372         nop
373         nop
374         lis             r3,0xe000
375         ori             r3,r3,0x0002
376         mtspr   DBAT3L,r3
377         ori             r3,r3,0x01fe
378         mtspr   DBAT3U,r3
379         isync
380         lis             r3,0xe000
381         li              r6,512
382         mtctr   r6
383         li              r6,0
384 2:      dcbz_l  r6,r3
385         addi    r3,r3,32
386         bdnz    2b
387         nop
388         nop
389         nop
390         nop
391         nop
392         nop
393         nop
394         nop
395         nop
396         nop
397         nop
398         nop
399         blr
401         .globl LCDisable
402 LCDisable:
403         lis             r3,0xe000
404         li              r4,512
405         mtctr   r4
406 1:      dcbi    r0,r3
407         addi    r3,r3,32
408         bdnz    1b
409         mfspr   r4,HID2
410         rlwinm  r4,r4,0,4,2
411         mtspr   HID2,r4
412         blr
414         .globl LCAllocOneTag
415 LCAllocOneTag:
416         cmpwi   r3,0
417         beq             1f
418         dcbi    r0,r4
419 1:      dcbz_l  r0,r4
420         blr
422         .globl LCAllocTags
423 LCAllocTags:
424         mflr    r6
425         cmplwi  r5,0
426         ble             2f
427         mtctr   r5
428         cmpwi   r3,0
429         beq             3f
430 1:      dcbi    r0,r4
431         dcbz_l  r0,r4
432         addi    r4,r4,32
433         bdnz    1b
434         b               2f
435 3:      dcbz_l  r0,r4
436         addi    r4,r4,32
437         bdnz    3b
438 2:      mtlr    r6
439         blr
441         .globl LCLoadBlocks
442 LCLoadBlocks:
443         extrwi          r6,r5,5,25
444         clrlwi          r4,r4,4
445         or                      r6,r6,r4
446         mtspr           DMAU,r6
447         clrlslwi        r6,r5,30,2
448         or                      r6,r6,r3
449         ori                     r6,r6,0x0012
450         mtspr           DMAL,r6
451         blr
453         .globl LCStoreBlocks
454 LCStoreBlocks:
455         extrwi          r6,r5,5,25
456         clrlwi          r4,r4,4
457         or                      r6,r6,r3
458         mtspr           DMAU,r6
459         clrlslwi        r6,r5,30,2
460         or                      r6,r6,r4
461         ori                     r6,r6,0x0002
462         mtspr           DMAL,r6
463         blr
464