change PAD_ScanPads()s behaviour. the return value now contains a bitmask of the...
[libogc.git] / libogc / cache_asm.S
blob76b973c6c00efe953bb95e30987272bf78b722d6
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         isync
40         blr
42         .globl DCEnable
43 DCEnable:
44         mfspr   r3,HID0
45         ori             r3,r3,0x4000
46         mtspr   HID0,r3
47         isync
48         blr
50         .globl DCDisable
51 DCDisable:
52         mfspr   r3,HID0
53         rlwinm  r3,r3,0,18,16
54         mtspr   HID0,r3
55         isync
56         blr
58         .globl DCFreeze
59 DCFreeze:
60         mfspr   r3,HID0
61         ori             r3,r3,0x1000
62         mtspr   HID0,r3
63         isync
64         blr
66         .globl DCUnfreeze
67 DCUnfreeze:
68         mfspr   r3,HID0
69         rlwinm  r3,r3,0,20,18
70         mtspr   HID0,r3
71         isync
72         blr
74         .globl DCTouchLoad
75 DCTouchLoad:
76         dcbt    r0,r3
77         blr
79         .globl DCBlockZero
80 DCBlockZero:
81         dcbz    r0,r3
82         blr
84         .globl DCBlockStore
85 DCBlockStore:
86         dcbst   r0,r3
87         blr
89         .globl DCBlockFlush
90 DCBlockFlush:
91         dcbf    r0,r3
92         blr
94         .globl DCBlockInvalidate
95 DCBlockInvalidate:
96         dcbi    r0,r3
97         blr
99         .globl DCInvalidateRange
100 DCInvalidateRange:
101         cmplwi r4, 0   # zero or negative size?
102         blelr
103         clrlwi. r5, r3, 27  # check for lower bits set in address
104         beq 1f
105         addi r4, r4, 0x20 
107         addi r4, r4, 0x1f
108         srwi r4, r4, 5
109         mtctr r4
111         dcbi r0, r3
112         addi r3, r3, 0x20
113         bdnz 2b
114         blr
116         .globl DCFlushRange
117 DCFlushRange:
118         cmplwi r4, 0   # zero or negative size?
119         blelr
120         clrlwi. r5, r3, 27  # check for lower bits set in address
121         beq 1f
122         addi r4, r4, 0x20 
124         addi r4, r4, 0x1f
125         srwi r4, r4, 5
126         mtctr r4
128         dcbf r0, r3
129         addi r3, r3, 0x20
130         bdnz 2b
131         sc
132         blr
134         .globl DCStoreRange
135 DCStoreRange:
136         cmplwi r4, 0   # zero or negative size?
137         blelr
138         clrlwi. r5, r3, 27  # check for lower bits set in address
139         beq 1f
140         addi r4, r4, 0x20 
142         addi r4, r4, 0x1f
143         srwi r4, r4, 5
144         mtctr r4
146         dcbst r0, r3
147         addi r3, r3, 0x20
148         bdnz 2b
149         sc
150         blr
152         .globl DCFlushRangeNoSync
153 DCFlushRangeNoSync:
154         cmplwi r4, 0   # zero or negative size?
155         blelr
156         clrlwi. r5, r3, 27  # check for lower bits set in address
157         beq 1f
158         addi r4, r4, 0x20 
160         addi r4, r4, 0x1f
161         srwi r4, r4, 5
162         mtctr r4
164         dcbf r0, r3
165         addi r3, r3, 0x20
166         bdnz 2b
167         blr
169         .globl DCStoreRangeNoSync
170 DCStoreRangeNoSync:
171         cmplwi r4, 0   # zero or negative size?
172         blelr
173         clrlwi. r5, r3, 27  # check for lower bits set in address
174         beq 1f
175         addi r4, r4, 0x20 
177         addi r4, r4, 0x1f
178         srwi r4, r4, 5
179         mtctr r4
181         dcbst r0, r3
182         addi r3, r3, 0x20
183         bdnz 2b
184         blr
186         .globl DCZeroRange
187 DCZeroRange:
188         cmplwi r4, 0   # zero or negative size?
189         blelr
190         clrlwi. r5, r3, 27  # check for lower bits set in address
191         beq 1f
192         addi r4, r4, 0x20 
194         addi r4, r4, 0x1f
195         srwi r4, r4, 5
196         mtctr r4
198         dcbz r0, r3
199         addi r3, r3, 0x20
200         bdnz 2b
201         blr
203         .globl DCTouchRange
204 DCTouchRange:
205         cmplwi r4, 0   # zero or negative size?
206         blelr
207         clrlwi. r5, r3, 27  # check for lower bits set in address
208         beq 1f
209         addi r4, r4, 0x20 
211         addi r4, r4, 0x1f
212         srwi r4, r4, 5
213         mtctr r4
215         dcbt r0, r3
216         addi r3, r3, 0x20
217         bdnz 2b
218         blr
220         .globl ICInvalidateRange
221 ICInvalidateRange:
222         cmplwi r4, 0   # zero or negative size?
223         blelr
224         clrlwi. r5, r3, 27  # check for lower bits set in address
225         beq 1f
226         addi r4, r4, 0x20 
228         addi r4, r4, 0x1f
229         srwi r4, r4, 5
230         mtctr r4
232         icbi r0, r3
233         addi r3, r3, 0x20
234         bdnz 2b
235         sync
236         isync
237         blr
239         .globl ICFlashInvalidate
240 ICFlashInvalidate:
241         mfspr   r3,HID0
242         ori             r3,r3,0x0800
243         mtspr   HID0,r3
244         isync
245         blr
247         .globl ICEnable
248 ICEnable:
249         mfspr   r3,HID0
250         ori             r3,r3,0x8000
251         mtspr   HID0,r3
252         isync
253         blr
255         .globl ICDisable
256 ICDisable:
257         mfspr   r3,HID0
258         rlwinm  r3,r3,0,17,15
259         mtspr   HID0,r3
260         isync
261         blr
263         .globl ICFreeze
264 ICFreeze:
265         mfspr   r3,HID0
266         ori             r3,r3,0x2000
267         mtspr   HID0,r3
268         isync
269         blr
271         .globl ICUnfreeze
272 ICUnfreeze:
273         mfspr   r3,HID0
274         rlwinm  r3,r3,0,19,17
275         mtspr   HID0,r3
276         isync
277         blr
279         .globl ICBlockInvalidate
280 ICBlockInvalidate:
281         icbi    r0,r3
282         blr
284         .globl ICSync
285 ICSync:
286         isync
287         blr
289         .globl L2Init
290 L2Init:
291         mflr    r0
292         stw             r0,4(sp)
293         stwu    sp,-16(sp)
294         stw             r31,12(sp)
295         mfmsr   r3
296         mr              r31,r3
297         sync
298         li              r3,48
299         mtmsr   r3
300         sync
301         bl              L2Disable
302         bl              L2GlobalInvalidate
303         mr              r3,r31
304         mtmsr   r3
305         lwz             r0,20(sp)
306         lwz             r31,12(sp)
307         mtlr    r0
308         blr
310         .globl L2Enable
311 L2Enable:
312         sync
313         mfspr   r3,L2CR;
314         oris    r0,r3,0x8000
315         rlwinm  r3,r0,0,11,9
316         mtspr   L2CR,r3
317         sync
318         blr
320         .globl L2Disable
321 L2Disable:
322         sync
323         mfspr   r3,L2CR
324         clrlwi  r3,r3,1
325         mtspr   L2CR,r3
326         sync
327         blr
329         .globl L2GlobalInvalidate
330 L2GlobalInvalidate:
331         mflr    r0
332         stw             r0,4(sp)
333         stwu    sp,-8(sp)
334         bl              L2Disable
335         mfspr   r3,L2CR
336         oris    r3,r3,0x0020
337         mtspr   L2CR,r3
338 1:      mfspr   r3,L2CR
339         clrlwi  r0,r3,31
340         cmplwi  r0,0x0000
341         bne             1b
342         mfspr   r3,L2CR
343         rlwinm  r3,r3,0,11,9
344         mtspr   L2CR,r3
345 2:      mfspr   r3,L2CR
346         clrlwi  r0,r3,31
347         cmplwi  r0,0x0000
348         bne             2b
349         lwz             r0,12(sp)
350         addi    sp,sp,8
351         mtlr    r0
352         blr
354         .globl __LCEnable
355 __LCEnable:
356         mfmsr   r5
357         ori             r5,r5,0x1000
358         mtmsr   r5
359         lis             r3,0x8000
360         li              r4,1024
361         mtctr   r4
362 1:      dcbt    r0,r3
363         dcbst   r0,r3
364         bdnz    1b
365         mfspr   r4,HID2
366         oris    r4,r4,0x100f
367         mtspr   HID2,r4
368         nop
369         nop
370         nop
371         nop
372         nop
373         nop
374         nop
375         nop
376         nop
377         nop
378         nop
379         nop
380         lis             r3,0xe000
381         ori             r3,r3,0x0002
382         mtspr   DBAT3L,r3
383         ori             r3,r3,0x01fe
384         mtspr   DBAT3U,r3
385         isync
386         lis             r3,0xe000
387         li              r6,512
388         mtctr   r6
389         li              r6,0
390 2:      dcbz_l  r6,r3
391         addi    r3,r3,32
392         bdnz    2b
393         nop
394         nop
395         nop
396         nop
397         nop
398         nop
399         nop
400         nop
401         nop
402         nop
403         nop
404         nop
405         blr
407         .globl LCDisable
408 LCDisable:
409         lis             r3,0xe000
410         li              r4,512
411         mtctr   r4
412 1:      dcbi    r0,r3
413         addi    r3,r3,32
414         bdnz    1b
415         mfspr   r4,HID2
416         rlwinm  r4,r4,0,4,2
417         mtspr   HID2,r4
418         blr
420         .globl LCAllocOneTag
421 LCAllocOneTag:
422         cmpwi   r3,0
423         beq             1f
424         dcbi    r0,r4
425 1:      dcbz_l  r0,r4
426         blr
428         .globl LCAllocTags
429 LCAllocTags:
430         mflr    r6
431         cmplwi  r5,0
432         ble             2f
433         mtctr   r5
434         cmpwi   r3,0
435         beq             3f
436 1:      dcbi    r0,r4
437         dcbz_l  r0,r4
438         addi    r4,r4,32
439         bdnz    1b
440         b               2f
441 3:      dcbz_l  r0,r4
442         addi    r4,r4,32
443         bdnz    3b
444 2:      mtlr    r6
445         blr
447         .globl LCLoadBlocks
448 LCLoadBlocks:
449         extrwi          r6,r5,5,25
450         clrlwi          r4,r4,4
451         or                      r6,r6,r4
452         mtspr           DMAU,r6
453         clrlslwi        r6,r5,30,2
454         or                      r6,r6,r3
455         ori                     r6,r6,0x0012
456         mtspr           DMAL,r6
457         blr
459         .globl LCStoreBlocks
460 LCStoreBlocks:
461         extrwi          r6,r5,5,25
462         clrlwi          r4,r4,4
463         or                      r6,r6,r3
464         mtspr           DMAU,r6
465         clrlslwi        r6,r5,30,2
466         or                      r6,r6,r4
467         ori                     r6,r6,0x0002
468         mtspr           DMAL,r6
469         blr
470