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