Import 2.1.36
[davej-history.git] / arch / sparc / mm / viking.S
blobf61aa4398181949d3e2953e509ffdbc0edf8f8ba
1 /* $Id: viking.S,v 1.2 1997/04/20 21:21:49 ecd Exp $
2  * viking.S: High speed Viking cache/mmu operations
3  *
4  * Copyright (C) 1997  Eddie C. Dost  (ecd@skynet.be)
5  */
7 #include <asm/ptrace.h>
8 #include <asm/psr.h>
9 #include <asm/asi.h>
10 #include <asm/mxcc.h>
11 #include <asm/page.h>
12 #include <asm/pgtsrmmu.h>
13 #include <asm/viking.h>
14 #include <asm/cprefix.h>
16 #define WINDOW_FLUSH(tmp1, tmp2)                                        \
17         mov     0, tmp1;                                                \
18 98:     ld      [%g6 + AOFF_task_tss + AOFF_thread_uwinmask], tmp2;     \
19         orcc    %g0, tmp2, %g0;                                         \
20         add     tmp1, 1, tmp1;                                          \
21         bne     98b;                                                    \
22          save   %sp, -64, %sp;                                          \
23 99:     subcc   tmp1, 1, tmp1;                                          \
24         bne     99b;                                                    \
25          restore %g0, %g0, %g0;
27         .text
28         .align  4
30         .globl  viking_flush_cache_all, viking_flush_cache_mm
31         .globl  viking_flush_cache_range, viking_flush_cache_page
32         .globl  viking_flush_page, viking_mxcc_flush_page
33         .globl  viking_flush_page_for_dma, viking_flush_page_to_ram
34         .globl  viking_flush_chunk, viking_mxcc_flush_chunk
35         .globl  viking_flush_sig_insns
36         .globl  viking_flush_tlb_all, viking_flush_tlb_mm
37         .globl  viking_flush_tlb_range, viking_flush_tlb_page
39 viking_flush_page:
40 viking_flush_chunk:
41         sethi   %hi(C_LABEL(srmmu_map)), %g2
42         or      %g2, %lo(C_LABEL(srmmu_map)), %g3
43         ld      [%g3 + 8], %g2
44         cmp     %g2, 0
45         be      3f
46          and    %o0, PAGE_MASK, %o0
48         ld      [%g3], %o1
50         cmp     %o1, %o0
51         bgu,a   2f
52          add    %g3, 0xc, %g3
54         add     %o1, %g2, %g2
55         cmp     %g2, %o0
56         bleu,a  2f
57          add    %g3, 0xc, %g3
59         sub     %o0, %o1, %g2
60         ld      [%g3 + 4], %o0
61         add     %g2, %o0, %g3
62         b       4f
63          srl    %g3, 12, %g1            ! ppage >> 12
66         ld      [%g3 + 8], %g2
67         cmp     %g2, 0
68         bne,a   1b
69          ld     [%g3], %o1
71         retl
72          nop
75         clr     %o1                     ! set counter, 0 - 127
76         sethi   %hi(KERNBASE + PAGE_SIZE - 0x80000000), %o3
77         sethi   %hi(0x80000000), %o4
78         sethi   %hi(VIKING_PTAG_VALID | VIKING_PTAG_DIRTY), %o5
79         sethi   %hi(PAGE_SIZE), %o0
80         clr     %o2                     ! block counter, 0 - 3
82         sll     %o1, 5, %g4
83         or      %g4, %o4, %g4           ! 0x80000000 | (set << 5)
85         sll     %o2, 26, %g5            ! block << 26
87         or      %g5, %g4, %g5
88         ldda    [%g5] ASI_M_DATAC_TAG, %g2
89         cmp     %g3, %g1                ! ptag == ppage?
90         bne,a   7f
91          inc    %o2
93         and     %g2, %o5, %g3           ! ptag VALID and DIRTY?
94         cmp     %g3, %o5
95         bne,a   7f
96          inc    %o2
98         add     %g4, %o3, %g2           ! (KERNBASE + PAGE_SIZE) | (set << 5)
99         ld      [%g2], %g3
100         add     %g2, %o0, %g2
101         ld      [%g2], %g3
102         add     %g2, %o0, %g2
103         ld      [%g2], %g3
104         add     %g2, %o0, %g2
105         ld      [%g2], %g3
106         add     %g2, %o0, %g2
107         ld      [%g2], %g3
108         add     %g2, %o0, %g2
109         ld      [%g2], %g3
110         add     %g2, %o0, %g2
111         ld      [%g2], %g3
112         add     %g2, %o0, %g2
113         ld      [%g2], %g3
115         b       8f
116          inc    %o1
119         cmp     %o2, 3
120         ble     6b
121          sll    %o2, 26, %g5                    ! block << 26
123         inc     %o1
125         cmp     %o1, 0x7f
126         ble     5b
127          clr    %o2
129         retl
130          nop
133 viking_mxcc_flush_page:
134         sethi   %hi(C_LABEL(srmmu_map)), %g2
135         or      %g2, %lo(C_LABEL(srmmu_map)), %g3
136         ld      [%g3 + 8], %g2
137         cmp     %g2, 0
138         be      3f
139          and    %o0, PAGE_MASK, %o0
141         ld      [%g3], %o1
143         cmp     %o1, %o0
144         bgu,a   2f
145          add    %g3, 0xc, %g3
147         add     %o1, %g2, %g2
148         cmp     %g2, %o0
149         bleu,a  2f
150          add    %g3, 0xc, %g3
152         sub     %o0, %o1, %g2
153         ld      [%g3 + 4], %o0
154         add     %g2, %o0, %g3
155         sethi   %hi(PAGE_SIZE), %g4
156         b       4f
157          add    %g3, %g4, %g3                   ! ppage + PAGE_SIZE
160         ld      [%g3 + 8], %g2
161         cmp     %g2, 0
162         bne,a   1b
163          ld     [%g3], %o1
165         retl
166          nop
168         mov     0x10, %g2                       ! set cacheable bit
169         sethi   %hi(MXCC_SRCSTREAM), %o2
170         or      %o2, %lo(MXCC_SRCSTREAM), %o2
171         sethi   %hi(MXCC_DESSTREAM), %o3
172         or      %o3, %lo(MXCC_DESSTREAM), %o3
175         sub     %g3, MXCC_STREAM_SIZE, %g3
177         stda    %g2, [%o2] ASI_M_MXCC
178         stda    %g2, [%o3] ASI_M_MXCC
179         andncc  %g3, PAGE_MASK, %g0
180         bne     6b
181          sub    %g3, MXCC_STREAM_SIZE, %g3
183         retl
184          nop
186 viking_mxcc_flush_chunk:
187         retl
188          nop
190 viking_flush_cache_all:
191 viking_flush_cache_mm:
192 viking_flush_cache_range:
193 viking_flush_cache_page:
194         retl
195          nop
197 viking_flush_tlb_all:
198         WINDOW_FLUSH(%g4, %g5)
199         mov     0x400, %g1
200         retl
201          sta    %g0, [%g1] ASI_M_FLUSH_PROBE
203 viking_flush_tlb_mm:
204         mov     SRMMU_CTX_REG, %g1
205         ld      [%o0 + AOFF_mm_context], %o1
206         lda     [%g1] ASI_M_MMUREGS, %g5
207 #ifndef __SMP__
208         cmp     %o1, -1
209         be      viking_flush_tlb_mm_out
210 #endif
211         WINDOW_FLUSH(%g2, %g3)
213         mov     0x300, %g2
214         sta     %o1, [%g1] ASI_M_MMUREGS
215         sta     %g0, [%g2] ASI_M_FLUSH_PROBE
216 viking_flush_tlb_mm_out:
217         retl
218          sta    %g5, [%g1] ASI_M_MMUREGS
220 viking_flush_tlb_range:
221         mov     SRMMU_CTX_REG, %g1
222         ld      [%o0 + AOFF_mm_context], %o3
223         lda     [%g1] ASI_M_MMUREGS, %g5
224 #ifndef __SMP__
225         cmp     %o3, -1
226         be      viking_flush_tlb_range_out
227 #endif
228         WINDOW_FLUSH(%g2, %g3)
230         srl     %o1, SRMMU_PGDIR_SHIFT, %o1
231         sta     %o3, [%g1] ASI_M_MMUREGS
232         sll     %o1, SRMMU_PGDIR_SHIFT, %o1
233         sethi   %hi(1 << SRMMU_PGDIR_SHIFT), %o4
234         add     %o1, 0x200, %o1
235         sta     %g0, [%o1] ASI_M_FLUSH_PROBE
237         add     %o1, %o4, %o1
238         cmp     %o1, %o2
239         blu,a   1b
240          sta    %g0, [%o1] ASI_M_FLUSH_PROBE
241 viking_flush_tlb_range_out:
242         retl
243          sta    %g5, [%g1] ASI_M_MMUREGS
245 viking_flush_tlb_page:
246         ld      [%o0 + 0x00], %o0       /* XXX vma->vm_mm GROSS XXX */
247         mov     SRMMU_CTX_REG, %g1
248         ld      [%o0 + AOFF_mm_context], %o3
249         and     %o1, PAGE_MASK, %o1
250         lda     [%g1] ASI_M_MMUREGS, %g5
251 #ifndef __SMP__
252         cmp     %o3, -1
253         be      viking_flush_tlb_page_out
254 #endif
255         WINDOW_FLUSH(%g2, %g3)
257         sta     %o3, [%g1] ASI_M_MMUREGS
258         sta     %g0, [%o1] ASI_M_FLUSH_PROBE
259 viking_flush_tlb_page_out:
260         retl
261          sta    %g5, [%g1] ASI_M_MMUREGS
263 viking_flush_page_to_ram:
264 viking_flush_page_for_dma:
265 viking_flush_sig_insns:
266         retl
267          nop