~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/arch/sparc/mm/swift.S

Version: ~ [ linux-6.12-rc7 ] ~ [ linux-6.11.7 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.60 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.116 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.171 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.229 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.285 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.323 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.12 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 /* SPDX-License-Identifier: GPL-2.0 */
  2 /*
  3  * swift.S: MicroSparc-II mmu/cache operations.
  4  *
  5  * Copyright (C) 1999 David S. Miller (davem@redhat.com)
  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

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php