Import 2.2.5pre2
[davej-history.git] / arch / sparc / mm / viking.S
blob2ab87121f4b8e436ed34733f39184362a0a1b19f
1 /* $Id: viking.S,v 1.13 1999/03/24 11:42:32 davem Exp $
2  * viking.S: High speed Viking cache/mmu operations
3  *
4  * Copyright (C) 1997  Eddie C. Dost  (ecd@skynet.be)
5  * Copyright (C) 1997,1998,1999  Jakub Jelinek  (jj@ultra.linux.cz)
6  * Copyright (C) 1999  Pavel Semerad  (semerad@ss1000.ms.mff.cuni.cz)
7  */
9 #include <asm/ptrace.h>
10 #include <asm/psr.h>
11 #include <asm/asi.h>
12 #include <asm/mxcc.h>
13 #include <asm/page.h>
14 #include <asm/pgtsrmmu.h>
15 #include <asm/viking.h>
16 #include <asm/cprefix.h>
17 #include <asm/btfixup.h>
19 #ifdef __SMP__
20         .data
21         .align  4
22 sun4dsmp_flush_tlb_spin:
23         .word   0
24 #endif
26         .text
27         .align  4
29         .globl  viking_flush_cache_all, viking_flush_cache_mm
30         .globl  viking_flush_cache_range, viking_flush_cache_page
31         .globl  viking_flush_page, viking_mxcc_flush_page
32         .globl  viking_flush_page_for_dma, viking_flush_page_to_ram
33         .globl  viking_flush_chunk, viking_mxcc_flush_chunk
34         .globl  viking_flush_sig_insns
35         .globl  viking_flush_tlb_all, viking_flush_tlb_mm
36         .globl  viking_flush_tlb_range, viking_flush_tlb_page
38         .globl  viking_c_flush_chunk, viking_s_flush_chunk
40 viking_s_flush_chunk:
41         sethi   %hi(KERNBASE), %g2
42         ba      2f
43          sub    %o0, %g2, %g3
45 viking_c_flush_chunk:
46         sethi   %hi(KERNBASE), %g2
47         cmp     %o0, %g2
48         bgeu    2f
49          sub    %o0, %g2, %g3
50         sethi   BTFIXUP_SETHI(page_contig_offset), %g2
51         ba      2f
52          sub    %o0, %g2, %g3
54 viking_flush_page:
55 viking_flush_chunk:
56         sethi   %hi(C_LABEL(srmmu_v2p_hash)), %g2
57         srl     %o0, 24, %o1
58         or      %g2, %lo(C_LABEL(srmmu_v2p_hash)), %g2
59         sll     %o1, 2, %o1
60         ld      [%g2 + %o1], %g3
61         and     %o0, PAGE_MASK, %o0
62         cmp     %g3, -1
63         be      9f
64          add    %o0, %g3, %g3
65 2:      srl     %g3, 12, %g1            ! ppage >> 12
67         clr     %o1                     ! set counter, 0 - 127
68         sethi   %hi(KERNBASE + PAGE_SIZE - 0x80000000), %o3
69         sethi   %hi(0x80000000), %o4
70         sethi   %hi(VIKING_PTAG_VALID), %o5
71         sethi   %hi(2*PAGE_SIZE), %o0
72         sethi   %hi(PAGE_SIZE), %g7
73         clr     %o2                     ! block counter, 0 - 3
75         sll     %o1, 5, %g4
76         or      %g4, %o4, %g4           ! 0x80000000 | (set << 5)
78         sll     %o2, 26, %g5            ! block << 26
80         or      %g5, %g4, %g5
81         ldda    [%g5] ASI_M_DATAC_TAG, %g2
82         cmp     %g3, %g1                ! ptag == ppage?
83         bne     7f
84          inc    %o2
86         andcc   %g2, %o5, %g0           ! ptag VALID?
87         be      7f
88          add    %g4, %o3, %g2           ! (KERNBASE + PAGE_SIZE) | (set << 5)
89         ld      [%g2], %g3
90         ld      [%g2 + %g7], %g3
91         add     %g2, %o0, %g2
92         ld      [%g2], %g3
93         ld      [%g2 + %g7], %g3
94         add     %g2, %o0, %g2
95         ld      [%g2], %g3
96         ld      [%g2 + %g7], %g3
97         add     %g2, %o0, %g2
98         ld      [%g2], %g3
99         b       8f
100          ld     [%g2 + %g7], %g3
103         cmp     %o2, 3
104         ble     6b
105          sll    %o2, 26, %g5                    ! block << 26
107 8:      inc     %o1
108         cmp     %o1, 0x7f
109         ble     5b
110          clr    %o2
112 9:      retl
113          nop
115 viking_mxcc_flush_page:
116         sethi   %hi(C_LABEL(srmmu_v2p_hash)), %g2
117         srl     %o0, 24, %o1
118         or      %g2, %lo(C_LABEL(srmmu_v2p_hash)), %g2
119         sll     %o1, 2, %o1
120         ld      [%g2 + %o1], %g3
121         and     %o0, PAGE_MASK, %o0
122         cmp     %g3, -1
123         be      9f
124          add    %o0, %g3, %g3
125 2:      sub     %g3, -PAGE_SIZE, %g3            ! ppage + PAGE_SIZE
126         sethi   %hi(MXCC_SRCSTREAM), %o3        ! assume %hi(MXCC_SRCSTREAM) == %hi(MXCC_DESTSTREAM)
127         mov     0x10, %g2                       ! set cacheable bit
128         or      %o3, %lo(MXCC_SRCSTREAM), %o2
129         or      %o3, %lo(MXCC_DESSTREAM), %o3
130         sub     %g3, MXCC_STREAM_SIZE, %g3
132         stda    %g2, [%o2] ASI_M_MXCC
133         stda    %g2, [%o3] ASI_M_MXCC
134         andncc  %g3, PAGE_MASK, %g0
135         bne     6b
136          sub    %g3, MXCC_STREAM_SIZE, %g3
138 9:      retl
139          nop
141 viking_mxcc_flush_chunk:
142         retl
143          nop
145 #define WINDOW_FLUSH(tmp1, tmp2)                                        \
146         mov     0, tmp1;                                                \
147 98:     ld      [%g6 + AOFF_task_tss + AOFF_thread_uwinmask], tmp2;     \
148         orcc    %g0, tmp2, %g0;                                         \
149         add     tmp1, 1, tmp1;                                          \
150         bne     98b;                                                    \
151          save   %sp, -64, %sp;                                          \
152 99:     subcc   tmp1, 1, tmp1;                                          \
153         bne     99b;                                                    \
154          restore %g0, %g0, %g0;
156 viking_flush_cache_page:
157 #ifndef __SMP__
158         ld      [%o0 + 0x0], %o0                /* XXX vma->vm_mm, GROSS XXX */
159 #endif
160 viking_flush_cache_mm:
161 viking_flush_cache_range:
162 #ifndef __SMP__
163         ld      [%o0 + AOFF_mm_context], %g1
164         cmp     %g1, -1
165         bne     viking_flush_cache_all
166          nop
167         b,a     viking_flush_cache_out
168 #endif
169 viking_flush_cache_all:
170         WINDOW_FLUSH(%g4, %g5)
171 viking_flush_cache_out:
172         retl
173          nop
175 viking_flush_tlb_all:
176         mov     0x400, %g1
177         retl
178          sta    %g0, [%g1] ASI_M_FLUSH_PROBE
180 viking_flush_tlb_mm:
181         mov     SRMMU_CTX_REG, %g1
182         ld      [%o0 + AOFF_mm_context], %o1
183         lda     [%g1] ASI_M_MMUREGS, %g5
184 #ifndef __SMP__
185         cmp     %o1, -1
186         be      1f
187 #endif
188         mov     0x300, %g2
189         sta     %o1, [%g1] ASI_M_MMUREGS
190         sta     %g0, [%g2] ASI_M_FLUSH_PROBE
191         retl
192          sta    %g5, [%g1] ASI_M_MMUREGS
193 #ifndef __SMP__
194 1:      retl
195          nop
196 #endif
198 viking_flush_tlb_range:
199         mov     SRMMU_CTX_REG, %g1
200         ld      [%o0 + AOFF_mm_context], %o3
201         lda     [%g1] ASI_M_MMUREGS, %g5
202 #ifndef __SMP__
203         cmp     %o3, -1
204         be      2f
205 #endif
206         sethi   %hi(~((1 << SRMMU_PGDIR_SHIFT) - 1)), %o4
207         sta     %o3, [%g1] ASI_M_MMUREGS
208         and     %o1, %o4, %o1
209         add     %o1, 0x200, %o1
210         sta     %g0, [%o1] ASI_M_FLUSH_PROBE
211 1:      sub     %o1, %o4, %o1
212         cmp     %o1, %o2
213         blu,a   1b
214          sta    %g0, [%o1] ASI_M_FLUSH_PROBE
215         retl
216          sta    %g5, [%g1] ASI_M_MMUREGS
217 #ifndef __SMP__
218 2:      retl
219          nop
220 #endif
222 viking_flush_tlb_page:
223         ld      [%o0 + 0x00], %o0       /* XXX vma->vm_mm GROSS XXX */
224         mov     SRMMU_CTX_REG, %g1
225         ld      [%o0 + AOFF_mm_context], %o3
226         lda     [%g1] ASI_M_MMUREGS, %g5
227 #ifndef __SMP__
228         cmp     %o3, -1
229         be      1f
230 #endif
231         and     %o1, PAGE_MASK, %o1
232         sta     %o3, [%g1] ASI_M_MMUREGS
233         sta     %g0, [%o1] ASI_M_FLUSH_PROBE
234         retl
235          sta    %g5, [%g1] ASI_M_MMUREGS
236 #ifndef __SMP__
237 1:      retl
238          nop
239 #endif
241 viking_flush_page_to_ram:
242 viking_flush_page_for_dma:
243 viking_flush_sig_insns:
244         retl
245          nop
247 #ifdef __SMP__
248         .globl  sun4dsmp_flush_tlb_all, sun4dsmp_flush_tlb_mm
249         .globl  sun4dsmp_flush_tlb_range, sun4dsmp_flush_tlb_page
250 sun4dsmp_flush_tlb_all:
251         sethi   %hi(sun4dsmp_flush_tlb_spin), %g3
252 1:      ldstub  [%g3 + %lo(sun4dsmp_flush_tlb_spin)], %g5
253         tst     %g5
254         bne     2f
255          mov    0x400, %g1
256         sta     %g0, [%g1] ASI_M_FLUSH_PROBE
257         retl
258          stb    %g0, [%g3 + %lo(sun4dsmp_flush_tlb_spin)]
259 2:      tst     %g5
260         bne,a   2b
261          ldub   [%g3 + %lo(sun4dsmp_flush_tlb_spin)], %g5
262         b,a     1b
264 sun4dsmp_flush_tlb_mm:
265         sethi   %hi(sun4dsmp_flush_tlb_spin), %g3
266 1:      ldstub  [%g3 + %lo(sun4dsmp_flush_tlb_spin)], %g5
267         tst     %g5
268         bne     2f
269          mov    SRMMU_CTX_REG, %g1
270         ld      [%o0 + AOFF_mm_context], %o1
271         lda     [%g1] ASI_M_MMUREGS, %g5
272         mov     0x300, %g2
273         sta     %o1, [%g1] ASI_M_MMUREGS
274         sta     %g0, [%g2] ASI_M_FLUSH_PROBE
275         sta     %g5, [%g1] ASI_M_MMUREGS
276         retl
277          stb    %g0, [%g3 + %lo(sun4dsmp_flush_tlb_spin)]
278 2:      tst     %g5
279         bne,a   2b
280          ldub   [%g3 + %lo(sun4dsmp_flush_tlb_spin)], %g5
281         b,a     1b
283 sun4dsmp_flush_tlb_range:
284         sethi   %hi(sun4dsmp_flush_tlb_spin), %g3
285 1:      ldstub  [%g3 + %lo(sun4dsmp_flush_tlb_spin)], %g5
286         tst     %g5
287         bne     3f
288          mov    SRMMU_CTX_REG, %g1
289         ld      [%o0 + AOFF_mm_context], %o3
290         lda     [%g1] ASI_M_MMUREGS, %g5
291         sethi   %hi(~((1 << SRMMU_PGDIR_SHIFT) - 1)), %o4
292         sta     %o3, [%g1] ASI_M_MMUREGS
293         and     %o1, %o4, %o1
294         add     %o1, 0x200, %o1
295         sta     %g0, [%o1] ASI_M_FLUSH_PROBE
296 2:      sub     %o1, %o4, %o1
297         cmp     %o1, %o2
298         blu,a   2b
299          sta    %g0, [%o1] ASI_M_FLUSH_PROBE
300         sta     %g5, [%g1] ASI_M_MMUREGS
301         retl
302          stb    %g0, [%g3 + %lo(sun4dsmp_flush_tlb_spin)]
303 3:      tst     %g5
304         bne,a   3b
305          ldub   [%g3 + %lo(sun4dsmp_flush_tlb_spin)], %g5
306         b,a     1b
308 sun4dsmp_flush_tlb_page:
309         sethi   %hi(sun4dsmp_flush_tlb_spin), %g3
310 1:      ldstub  [%g3 + %lo(sun4dsmp_flush_tlb_spin)], %g5
311         tst     %g5
312         bne     2f
313          mov    SRMMU_CTX_REG, %g1
314         ld      [%o0 + 0x00], %o0       /* XXX vma->vm_mm GROSS XXX */
315         ld      [%o0 + AOFF_mm_context], %o3
316         lda     [%g1] ASI_M_MMUREGS, %g5
317         and     %o1, PAGE_MASK, %o1
318         sta     %o3, [%g1] ASI_M_MMUREGS
319         sta     %g0, [%o1] ASI_M_FLUSH_PROBE
320         sta     %g5, [%g1] ASI_M_MMUREGS
321         retl
322          stb    %g0, [%g3 + %lo(sun4dsmp_flush_tlb_spin)]
323 2:      tst     %g5
324         bne,a   2b
325          ldub   [%g3 + %lo(sun4dsmp_flush_tlb_spin)], %g5
326         b,a     1b
327          nop
328 #endif