1 /* $Id: viking.S,v 1.18 2000/07/16 21:48:52 anton Exp $
2 * viking.S: High speed Viking cache/mmu operations
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)
9 #include <linux/config.h>
10 #include <asm/ptrace.h>
15 #include <asm/pgtsrmmu.h>
16 #include <asm/viking.h>
17 #include <asm/cprefix.h>
18 #include <asm/btfixup.h>
23 sun4dsmp_flush_tlb_spin:
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_sig_insns
35 .globl viking_flush_tlb_all, viking_flush_tlb_mm
36 .globl viking_flush_tlb_range, viking_flush_tlb_page
39 sethi %hi(PAGE_OFFSET), %g2
41 srl %g3, 12, %g1 ! ppage >> 12
43 clr %o1 ! set counter, 0 - 127
44 sethi %hi(PAGE_OFFSET + PAGE_SIZE - 0x80000000), %o3
45 sethi %hi(0x80000000), %o4
46 sethi %hi(VIKING_PTAG_VALID), %o5
47 sethi %hi(2*PAGE_SIZE), %o0
48 sethi %hi(PAGE_SIZE), %g7
49 clr %o2 ! block counter, 0 - 3
52 or %g4, %o4, %g4 ! 0x80000000 | (set << 5)
54 sll %o2, 26, %g5 ! block << 26
57 ldda [%g5] ASI_M_DATAC_TAG, %g2
58 cmp %g3, %g1 ! ptag == ppage?
62 andcc %g2, %o5, %g0 ! ptag VALID?
64 add %g4, %o3, %g2 ! (PAGE_OFFSET + PAGE_SIZE) | (set << 5)
81 sll %o2, 26, %g5 ! block << 26
91 viking_mxcc_flush_page:
92 sethi %hi(PAGE_OFFSET), %g2
94 sub %g3, -PAGE_SIZE, %g3 ! ppage + PAGE_SIZE
95 sethi %hi(MXCC_SRCSTREAM), %o3 ! assume %hi(MXCC_SRCSTREAM) == %hi(MXCC_DESTSTREAM)
96 mov 0x10, %g2 ! set cacheable bit
97 or %o3, %lo(MXCC_SRCSTREAM), %o2
98 or %o3, %lo(MXCC_DESSTREAM), %o3
99 sub %g3, MXCC_STREAM_SIZE, %g3
101 stda %g2, [%o2] ASI_M_MXCC
102 stda %g2, [%o3] ASI_M_MXCC
103 andncc %g3, PAGE_MASK, %g0
105 sub %g3, MXCC_STREAM_SIZE, %g3
110 viking_flush_cache_page:
112 ld [%o0 + 0x0], %o0 /* XXX vma->vm_mm, GROSS XXX */
114 viking_flush_cache_mm:
115 viking_flush_cache_range:
117 ld [%o0 + AOFF_mm_context], %g1
119 bne viking_flush_cache_all
121 b,a viking_flush_cache_out
123 viking_flush_cache_all:
124 WINDOW_FLUSH(%g4, %g5)
125 viking_flush_cache_out:
129 viking_flush_tlb_all:
132 sta %g0, [%g1] ASI_M_FLUSH_PROBE
135 mov SRMMU_CTX_REG, %g1
136 ld [%o0 + AOFF_mm_context], %o1
137 lda [%g1] ASI_M_MMUREGS, %g5
143 sta %o1, [%g1] ASI_M_MMUREGS
144 sta %g0, [%g2] ASI_M_FLUSH_PROBE
146 sta %g5, [%g1] ASI_M_MMUREGS
152 viking_flush_tlb_range:
153 mov SRMMU_CTX_REG, %g1
154 ld [%o0 + AOFF_mm_context], %o3
155 lda [%g1] ASI_M_MMUREGS, %g5
160 sethi %hi(~((1 << SRMMU_PGDIR_SHIFT) - 1)), %o4
161 sta %o3, [%g1] ASI_M_MMUREGS
164 sta %g0, [%o1] ASI_M_FLUSH_PROBE
168 sta %g0, [%o1] ASI_M_FLUSH_PROBE
170 sta %g5, [%g1] ASI_M_MMUREGS
176 viking_flush_tlb_page:
177 ld [%o0 + 0x00], %o0 /* XXX vma->vm_mm GROSS XXX */
178 mov SRMMU_CTX_REG, %g1
179 ld [%o0 + AOFF_mm_context], %o3
180 lda [%g1] ASI_M_MMUREGS, %g5
185 and %o1, PAGE_MASK, %o1
186 sta %o3, [%g1] ASI_M_MMUREGS
187 sta %g0, [%o1] ASI_M_FLUSH_PROBE
189 sta %g5, [%g1] ASI_M_MMUREGS
195 viking_flush_page_to_ram:
196 viking_flush_page_for_dma:
197 viking_flush_sig_insns:
202 .globl sun4dsmp_flush_tlb_all, sun4dsmp_flush_tlb_mm
203 .globl sun4dsmp_flush_tlb_range, sun4dsmp_flush_tlb_page
204 sun4dsmp_flush_tlb_all:
205 sethi %hi(sun4dsmp_flush_tlb_spin), %g3
206 1: ldstub [%g3 + %lo(sun4dsmp_flush_tlb_spin)], %g5
210 sta %g0, [%g1] ASI_M_FLUSH_PROBE
212 stb %g0, [%g3 + %lo(sun4dsmp_flush_tlb_spin)]
215 ldub [%g3 + %lo(sun4dsmp_flush_tlb_spin)], %g5
218 sun4dsmp_flush_tlb_mm:
219 sethi %hi(sun4dsmp_flush_tlb_spin), %g3
220 1: ldstub [%g3 + %lo(sun4dsmp_flush_tlb_spin)], %g5
223 mov SRMMU_CTX_REG, %g1
224 ld [%o0 + AOFF_mm_context], %o1
225 lda [%g1] ASI_M_MMUREGS, %g5
227 sta %o1, [%g1] ASI_M_MMUREGS
228 sta %g0, [%g2] ASI_M_FLUSH_PROBE
229 sta %g5, [%g1] ASI_M_MMUREGS
231 stb %g0, [%g3 + %lo(sun4dsmp_flush_tlb_spin)]
234 ldub [%g3 + %lo(sun4dsmp_flush_tlb_spin)], %g5
237 sun4dsmp_flush_tlb_range:
238 sethi %hi(sun4dsmp_flush_tlb_spin), %g3
239 1: ldstub [%g3 + %lo(sun4dsmp_flush_tlb_spin)], %g5
242 mov SRMMU_CTX_REG, %g1
243 ld [%o0 + AOFF_mm_context], %o3
244 lda [%g1] ASI_M_MMUREGS, %g5
245 sethi %hi(~((1 << SRMMU_PGDIR_SHIFT) - 1)), %o4
246 sta %o3, [%g1] ASI_M_MMUREGS
249 sta %g0, [%o1] ASI_M_FLUSH_PROBE
253 sta %g0, [%o1] ASI_M_FLUSH_PROBE
254 sta %g5, [%g1] ASI_M_MMUREGS
256 stb %g0, [%g3 + %lo(sun4dsmp_flush_tlb_spin)]
259 ldub [%g3 + %lo(sun4dsmp_flush_tlb_spin)], %g5
262 sun4dsmp_flush_tlb_page:
263 sethi %hi(sun4dsmp_flush_tlb_spin), %g3
264 1: ldstub [%g3 + %lo(sun4dsmp_flush_tlb_spin)], %g5
267 mov SRMMU_CTX_REG, %g1
268 ld [%o0 + 0x00], %o0 /* XXX vma->vm_mm GROSS XXX */
269 ld [%o0 + AOFF_mm_context], %o3
270 lda [%g1] ASI_M_MMUREGS, %g5
271 and %o1, PAGE_MASK, %o1
272 sta %o3, [%g1] ASI_M_MMUREGS
273 sta %g0, [%o1] ASI_M_FLUSH_PROBE
274 sta %g5, [%g1] ASI_M_MMUREGS
276 stb %g0, [%g3 + %lo(sun4dsmp_flush_tlb_spin)]
279 ldub [%g3 + %lo(sun4dsmp_flush_tlb_spin)], %g5