xref: /OK3568_Linux_fs/kernel/arch/sparc/mm/swift.S (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun/* SPDX-License-Identifier: GPL-2.0 */
2*4882a593Smuzhiyun/*
3*4882a593Smuzhiyun * swift.S: MicroSparc-II mmu/cache operations.
4*4882a593Smuzhiyun *
5*4882a593Smuzhiyun * Copyright (C) 1999 David S. Miller (davem@redhat.com)
6*4882a593Smuzhiyun */
7*4882a593Smuzhiyun
8*4882a593Smuzhiyun#include <asm/psr.h>
9*4882a593Smuzhiyun#include <asm/asi.h>
10*4882a593Smuzhiyun#include <asm/page.h>
11*4882a593Smuzhiyun#include <asm/pgtsrmmu.h>
12*4882a593Smuzhiyun#include <asm/asm-offsets.h>
13*4882a593Smuzhiyun
14*4882a593Smuzhiyun	.text
15*4882a593Smuzhiyun	.align	4
16*4882a593Smuzhiyun
17*4882a593Smuzhiyun#if 1	/* XXX screw this, I can't get the VAC flushes working
18*4882a593Smuzhiyun	 * XXX reliably... -DaveM
19*4882a593Smuzhiyun	 */
20*4882a593Smuzhiyun	.globl	swift_flush_cache_all, swift_flush_cache_mm
21*4882a593Smuzhiyun	.globl	swift_flush_cache_range, swift_flush_cache_page
22*4882a593Smuzhiyun	.globl	swift_flush_page_for_dma
23*4882a593Smuzhiyun	.globl	swift_flush_page_to_ram
24*4882a593Smuzhiyun
25*4882a593Smuzhiyunswift_flush_cache_all:
26*4882a593Smuzhiyunswift_flush_cache_mm:
27*4882a593Smuzhiyunswift_flush_cache_range:
28*4882a593Smuzhiyunswift_flush_cache_page:
29*4882a593Smuzhiyunswift_flush_page_for_dma:
30*4882a593Smuzhiyunswift_flush_page_to_ram:
31*4882a593Smuzhiyun	sethi	%hi(0x2000), %o0
32*4882a593Smuzhiyun1:	subcc	%o0, 0x10, %o0
33*4882a593Smuzhiyun	add	%o0, %o0, %o1
34*4882a593Smuzhiyun	sta	%g0, [%o0] ASI_M_DATAC_TAG
35*4882a593Smuzhiyun	bne	1b
36*4882a593Smuzhiyun	 sta	%g0, [%o1] ASI_M_TXTC_TAG
37*4882a593Smuzhiyun	retl
38*4882a593Smuzhiyun	 nop
39*4882a593Smuzhiyun#else
40*4882a593Smuzhiyun
41*4882a593Smuzhiyun	.globl	swift_flush_cache_all
42*4882a593Smuzhiyunswift_flush_cache_all:
43*4882a593Smuzhiyun	WINDOW_FLUSH(%g4, %g5)
44*4882a593Smuzhiyun
45*4882a593Smuzhiyun	/* Just clear out all the tags. */
46*4882a593Smuzhiyun	sethi	%hi(16 * 1024), %o0
47*4882a593Smuzhiyun1:	subcc	%o0, 16, %o0
48*4882a593Smuzhiyun	sta	%g0, [%o0] ASI_M_TXTC_TAG
49*4882a593Smuzhiyun	bne	1b
50*4882a593Smuzhiyun	 sta	%g0, [%o0] ASI_M_DATAC_TAG
51*4882a593Smuzhiyun	retl
52*4882a593Smuzhiyun	 nop
53*4882a593Smuzhiyun
54*4882a593Smuzhiyun	.globl	swift_flush_cache_mm
55*4882a593Smuzhiyunswift_flush_cache_mm:
56*4882a593Smuzhiyun	ld	[%o0 + AOFF_mm_context], %g2
57*4882a593Smuzhiyun	cmp	%g2, -1
58*4882a593Smuzhiyun	be	swift_flush_cache_mm_out
59*4882a593Smuzhiyun	WINDOW_FLUSH(%g4, %g5)
60*4882a593Smuzhiyun	rd	%psr, %g1
61*4882a593Smuzhiyun	andn	%g1, PSR_ET, %g3
62*4882a593Smuzhiyun	wr	%g3, 0x0, %psr
63*4882a593Smuzhiyun	nop
64*4882a593Smuzhiyun	nop
65*4882a593Smuzhiyun	mov	SRMMU_CTX_REG, %g7
66*4882a593Smuzhiyun	lda	[%g7] ASI_M_MMUREGS, %g5
67*4882a593Smuzhiyun	sta	%g2, [%g7] ASI_M_MMUREGS
68*4882a593Smuzhiyun
69*4882a593Smuzhiyun#if 1
70*4882a593Smuzhiyun	sethi	%hi(0x2000), %o0
71*4882a593Smuzhiyun1:	subcc	%o0, 0x10, %o0
72*4882a593Smuzhiyun	sta	%g0, [%o0] ASI_M_FLUSH_CTX
73*4882a593Smuzhiyun	bne	1b
74*4882a593Smuzhiyun	 nop
75*4882a593Smuzhiyun#else
76*4882a593Smuzhiyun	clr	%o0
77*4882a593Smuzhiyun	or	%g0, 2048, %g7
78*4882a593Smuzhiyun	or	%g0, 2048, %o1
79*4882a593Smuzhiyun	add	%o1, 2048, %o2
80*4882a593Smuzhiyun	add	%o2, 2048, %o3
81*4882a593Smuzhiyun	mov	16, %o4
82*4882a593Smuzhiyun	add	%o4, 2048, %o5
83*4882a593Smuzhiyun	add	%o5, 2048, %g2
84*4882a593Smuzhiyun	add	%g2, 2048, %g3
85*4882a593Smuzhiyun1:	sta	%g0, [%o0      ] ASI_M_FLUSH_CTX
86*4882a593Smuzhiyun	sta	%g0, [%o0 + %o1] ASI_M_FLUSH_CTX
87*4882a593Smuzhiyun	sta	%g0, [%o0 + %o2] ASI_M_FLUSH_CTX
88*4882a593Smuzhiyun	sta	%g0, [%o0 + %o3] ASI_M_FLUSH_CTX
89*4882a593Smuzhiyun	sta	%g0, [%o0 + %o4] ASI_M_FLUSH_CTX
90*4882a593Smuzhiyun	sta	%g0, [%o0 + %o5] ASI_M_FLUSH_CTX
91*4882a593Smuzhiyun	sta	%g0, [%o0 + %g2] ASI_M_FLUSH_CTX
92*4882a593Smuzhiyun	sta	%g0, [%o0 + %g3] ASI_M_FLUSH_CTX
93*4882a593Smuzhiyun	subcc	%g7, 32, %g7
94*4882a593Smuzhiyun	bne	1b
95*4882a593Smuzhiyun	 add	%o0, 32, %o0
96*4882a593Smuzhiyun#endif
97*4882a593Smuzhiyun
98*4882a593Smuzhiyun	mov	SRMMU_CTX_REG, %g7
99*4882a593Smuzhiyun	sta	%g5, [%g7] ASI_M_MMUREGS
100*4882a593Smuzhiyun	wr	%g1, 0x0, %psr
101*4882a593Smuzhiyun	nop
102*4882a593Smuzhiyun	nop
103*4882a593Smuzhiyunswift_flush_cache_mm_out:
104*4882a593Smuzhiyun	retl
105*4882a593Smuzhiyun	 nop
106*4882a593Smuzhiyun
107*4882a593Smuzhiyun	.globl	swift_flush_cache_range
108*4882a593Smuzhiyunswift_flush_cache_range:
109*4882a593Smuzhiyun	ld	[%o0 + VMA_VM_MM], %o0
110*4882a593Smuzhiyun	sub	%o2, %o1, %o2
111*4882a593Smuzhiyun	sethi	%hi(4096), %o3
112*4882a593Smuzhiyun	cmp	%o2, %o3
113*4882a593Smuzhiyun	bgu	swift_flush_cache_mm
114*4882a593Smuzhiyun	 nop
115*4882a593Smuzhiyun	b	70f
116*4882a593Smuzhiyun	 nop
117*4882a593Smuzhiyun
118*4882a593Smuzhiyun	.globl	swift_flush_cache_page
119*4882a593Smuzhiyunswift_flush_cache_page:
120*4882a593Smuzhiyun	ld	[%o0 + VMA_VM_MM], %o0
121*4882a593Smuzhiyun70:
122*4882a593Smuzhiyun	ld	[%o0 + AOFF_mm_context], %g2
123*4882a593Smuzhiyun	cmp	%g2, -1
124*4882a593Smuzhiyun	be	swift_flush_cache_page_out
125*4882a593Smuzhiyun	WINDOW_FLUSH(%g4, %g5)
126*4882a593Smuzhiyun	rd	%psr, %g1
127*4882a593Smuzhiyun	andn	%g1, PSR_ET, %g3
128*4882a593Smuzhiyun	wr	%g3, 0x0, %psr
129*4882a593Smuzhiyun	nop
130*4882a593Smuzhiyun	nop
131*4882a593Smuzhiyun	mov	SRMMU_CTX_REG, %g7
132*4882a593Smuzhiyun	lda	[%g7] ASI_M_MMUREGS, %g5
133*4882a593Smuzhiyun	sta	%g2, [%g7] ASI_M_MMUREGS
134*4882a593Smuzhiyun
135*4882a593Smuzhiyun	andn	%o1, (PAGE_SIZE - 1), %o1
136*4882a593Smuzhiyun#if 1
137*4882a593Smuzhiyun	sethi	%hi(0x1000), %o0
138*4882a593Smuzhiyun1:	subcc	%o0, 0x10, %o0
139*4882a593Smuzhiyun	sta	%g0, [%o1 + %o0] ASI_M_FLUSH_PAGE
140*4882a593Smuzhiyun	bne	1b
141*4882a593Smuzhiyun	 nop
142*4882a593Smuzhiyun#else
143*4882a593Smuzhiyun	or	%g0, 512, %g7
144*4882a593Smuzhiyun	or	%g0, 512, %o0
145*4882a593Smuzhiyun	add	%o0, 512, %o2
146*4882a593Smuzhiyun	add	%o2, 512, %o3
147*4882a593Smuzhiyun	add	%o3, 512, %o4
148*4882a593Smuzhiyun	add	%o4, 512, %o5
149*4882a593Smuzhiyun	add	%o5, 512, %g3
150*4882a593Smuzhiyun	add	%g3, 512, %g4
151*4882a593Smuzhiyun1:	sta	%g0, [%o1      ] ASI_M_FLUSH_PAGE
152*4882a593Smuzhiyun	sta	%g0, [%o1 + %o0] ASI_M_FLUSH_PAGE
153*4882a593Smuzhiyun	sta	%g0, [%o1 + %o2] ASI_M_FLUSH_PAGE
154*4882a593Smuzhiyun	sta	%g0, [%o1 + %o3] ASI_M_FLUSH_PAGE
155*4882a593Smuzhiyun	sta	%g0, [%o1 + %o4] ASI_M_FLUSH_PAGE
156*4882a593Smuzhiyun	sta	%g0, [%o1 + %o5] ASI_M_FLUSH_PAGE
157*4882a593Smuzhiyun	sta	%g0, [%o1 + %g3] ASI_M_FLUSH_PAGE
158*4882a593Smuzhiyun	sta	%g0, [%o1 + %g4] ASI_M_FLUSH_PAGE
159*4882a593Smuzhiyun	subcc	%g7, 16, %g7
160*4882a593Smuzhiyun	bne	1b
161*4882a593Smuzhiyun	 add	%o1, 16, %o1
162*4882a593Smuzhiyun#endif
163*4882a593Smuzhiyun
164*4882a593Smuzhiyun	mov	SRMMU_CTX_REG, %g7
165*4882a593Smuzhiyun	sta	%g5, [%g7] ASI_M_MMUREGS
166*4882a593Smuzhiyun	wr	%g1, 0x0, %psr
167*4882a593Smuzhiyun	nop
168*4882a593Smuzhiyun	nop
169*4882a593Smuzhiyunswift_flush_cache_page_out:
170*4882a593Smuzhiyun	retl
171*4882a593Smuzhiyun	 nop
172*4882a593Smuzhiyun
173*4882a593Smuzhiyun	/* Swift is write-thru, however it is not
174*4882a593Smuzhiyun	 * I/O nor TLB-walk coherent.  Also it has
175*4882a593Smuzhiyun	 * caches which are virtually indexed and tagged.
176*4882a593Smuzhiyun	 */
177*4882a593Smuzhiyun	.globl	swift_flush_page_for_dma
178*4882a593Smuzhiyun	.globl	swift_flush_page_to_ram
179*4882a593Smuzhiyunswift_flush_page_for_dma:
180*4882a593Smuzhiyunswift_flush_page_to_ram:
181*4882a593Smuzhiyun	andn	%o0, (PAGE_SIZE - 1), %o1
182*4882a593Smuzhiyun#if 1
183*4882a593Smuzhiyun	sethi	%hi(0x1000), %o0
184*4882a593Smuzhiyun1:	subcc	%o0, 0x10, %o0
185*4882a593Smuzhiyun	sta	%g0, [%o1 + %o0] ASI_M_FLUSH_PAGE
186*4882a593Smuzhiyun	bne	1b
187*4882a593Smuzhiyun	 nop
188*4882a593Smuzhiyun#else
189*4882a593Smuzhiyun	or	%g0, 512, %g7
190*4882a593Smuzhiyun	or	%g0, 512, %o0
191*4882a593Smuzhiyun	add	%o0, 512, %o2
192*4882a593Smuzhiyun	add	%o2, 512, %o3
193*4882a593Smuzhiyun	add	%o3, 512, %o4
194*4882a593Smuzhiyun	add	%o4, 512, %o5
195*4882a593Smuzhiyun	add	%o5, 512, %g3
196*4882a593Smuzhiyun	add	%g3, 512, %g4
197*4882a593Smuzhiyun1:	sta	%g0, [%o1      ] ASI_M_FLUSH_PAGE
198*4882a593Smuzhiyun	sta	%g0, [%o1 + %o0] ASI_M_FLUSH_PAGE
199*4882a593Smuzhiyun	sta	%g0, [%o1 + %o2] ASI_M_FLUSH_PAGE
200*4882a593Smuzhiyun	sta	%g0, [%o1 + %o3] ASI_M_FLUSH_PAGE
201*4882a593Smuzhiyun	sta	%g0, [%o1 + %o4] ASI_M_FLUSH_PAGE
202*4882a593Smuzhiyun	sta	%g0, [%o1 + %o5] ASI_M_FLUSH_PAGE
203*4882a593Smuzhiyun	sta	%g0, [%o1 + %g3] ASI_M_FLUSH_PAGE
204*4882a593Smuzhiyun	sta	%g0, [%o1 + %g4] ASI_M_FLUSH_PAGE
205*4882a593Smuzhiyun	subcc	%g7, 16, %g7
206*4882a593Smuzhiyun	bne	1b
207*4882a593Smuzhiyun	 add	%o1, 16, %o1
208*4882a593Smuzhiyun#endif
209*4882a593Smuzhiyun	retl
210*4882a593Smuzhiyun	 nop
211*4882a593Smuzhiyun#endif
212*4882a593Smuzhiyun
213*4882a593Smuzhiyun	.globl	swift_flush_sig_insns
214*4882a593Smuzhiyunswift_flush_sig_insns:
215*4882a593Smuzhiyun	flush	%o1
216*4882a593Smuzhiyun	retl
217*4882a593Smuzhiyun	 flush	%o1 + 4
218*4882a593Smuzhiyun
219*4882a593Smuzhiyun	.globl	swift_flush_tlb_mm
220*4882a593Smuzhiyun	.globl	swift_flush_tlb_range
221*4882a593Smuzhiyun	.globl	swift_flush_tlb_all
222*4882a593Smuzhiyunswift_flush_tlb_range:
223*4882a593Smuzhiyun	ld	[%o0 + VMA_VM_MM], %o0
224*4882a593Smuzhiyunswift_flush_tlb_mm:
225*4882a593Smuzhiyun	ld	[%o0 + AOFF_mm_context], %g2
226*4882a593Smuzhiyun	cmp	%g2, -1
227*4882a593Smuzhiyun	be	swift_flush_tlb_all_out
228*4882a593Smuzhiyunswift_flush_tlb_all:
229*4882a593Smuzhiyun	mov	0x400, %o1
230*4882a593Smuzhiyun	sta	%g0, [%o1] ASI_M_FLUSH_PROBE
231*4882a593Smuzhiyunswift_flush_tlb_all_out:
232*4882a593Smuzhiyun	retl
233*4882a593Smuzhiyun	 nop
234*4882a593Smuzhiyun
235*4882a593Smuzhiyun	.globl	swift_flush_tlb_page
236*4882a593Smuzhiyunswift_flush_tlb_page:
237*4882a593Smuzhiyun	ld	[%o0 + VMA_VM_MM], %o0
238*4882a593Smuzhiyun	mov	SRMMU_CTX_REG, %g1
239*4882a593Smuzhiyun	ld	[%o0 + AOFF_mm_context], %o3
240*4882a593Smuzhiyun	andn	%o1, (PAGE_SIZE - 1), %o1
241*4882a593Smuzhiyun	cmp	%o3, -1
242*4882a593Smuzhiyun	be	swift_flush_tlb_page_out
243*4882a593Smuzhiyun	 nop
244*4882a593Smuzhiyun#if 1
245*4882a593Smuzhiyun	mov	0x400, %o1
246*4882a593Smuzhiyun	sta	%g0, [%o1] ASI_M_FLUSH_PROBE
247*4882a593Smuzhiyun#else
248*4882a593Smuzhiyun	lda	[%g1] ASI_M_MMUREGS, %g5
249*4882a593Smuzhiyun	sta	%o3, [%g1] ASI_M_MMUREGS
250*4882a593Smuzhiyun	sta	%g0, [%o1] ASI_M_FLUSH_PAGE	/* rem. virt. cache. prot. */
251*4882a593Smuzhiyun	sta	%g0, [%o1] ASI_M_FLUSH_PROBE
252*4882a593Smuzhiyun	sta	%g5, [%g1] ASI_M_MMUREGS
253*4882a593Smuzhiyun#endif
254*4882a593Smuzhiyunswift_flush_tlb_page_out:
255*4882a593Smuzhiyun	retl
256*4882a593Smuzhiyun	 nop
257