Linux Audio

Check our new training course

Loading...
v4.17
  1/* SPDX-License-Identifier: GPL-2.0 */
  2/*
  3 * viking.S: High speed Viking cache/mmu operations
  4 *
  5 * Copyright (C) 1997  Eddie C. Dost  (ecd@skynet.be)
  6 * Copyright (C) 1997,1998,1999  Jakub Jelinek  (jj@ultra.linux.cz)
  7 * Copyright (C) 1999  Pavel Semerad  (semerad@ss1000.ms.mff.cuni.cz)
  8 */
  9
 10#include <asm/ptrace.h>
 11#include <asm/psr.h>
 12#include <asm/asm-offsets.h>
 13#include <asm/asi.h>
 14#include <asm/mxcc.h>
 15#include <asm/page.h>
 16#include <asm/pgtsrmmu.h>
 17#include <asm/viking.h>
 18
 19#ifdef CONFIG_SMP
 20	.data
 21	.align	4
 22sun4dsmp_flush_tlb_spin:
 23	.word	0
 24#endif
 25
 26	.text
 27	.align	4
 28
 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_sig_insns
 34	.globl	viking_flush_tlb_all, viking_flush_tlb_mm
 35	.globl	viking_flush_tlb_range, viking_flush_tlb_page
 36
 37viking_flush_page:
 38	sethi	%hi(PAGE_OFFSET), %g2
 39	sub	%o0, %g2, %g3
 40	srl	%g3, 12, %g1		! ppage >> 12
 41
 42	clr	%o1			! set counter, 0 - 127
 43	sethi	%hi(PAGE_OFFSET + PAGE_SIZE - 0x80000000), %o3
 44	sethi	%hi(0x80000000), %o4
 45	sethi	%hi(VIKING_PTAG_VALID), %o5
 46	sethi	%hi(2*PAGE_SIZE), %o0
 47	sethi	%hi(PAGE_SIZE), %g7
 48	clr	%o2			! block counter, 0 - 3
 495:
 50	sll	%o1, 5, %g4
 51	or	%g4, %o4, %g4		! 0x80000000 | (set << 5)
 52
 53	sll	%o2, 26, %g5		! block << 26
 546:
 55	or	%g5, %g4, %g5
 56	ldda	[%g5] ASI_M_DATAC_TAG, %g2
 57	cmp	%g3, %g1		! ptag == ppage?
 58	bne	7f
 59	 inc	%o2
 60
 61	andcc	%g2, %o5, %g0		! ptag VALID?
 62	be	7f
 63	 add	%g4, %o3, %g2		! (PAGE_OFFSET + PAGE_SIZE) | (set << 5)
 64	ld	[%g2], %g3
 65	ld	[%g2 + %g7], %g3
 66	add	%g2, %o0, %g2
 67	ld	[%g2], %g3
 68	ld	[%g2 + %g7], %g3
 69	add	%g2, %o0, %g2
 70	ld	[%g2], %g3
 71	ld	[%g2 + %g7], %g3
 72	add	%g2, %o0, %g2
 73	ld	[%g2], %g3
 74	b	8f
 75	 ld	[%g2 + %g7], %g3
 76
 777:
 78	cmp	%o2, 3
 79	ble	6b
 80	 sll	%o2, 26, %g5			! block << 26
 81
 828:	inc	%o1
 83	cmp	%o1, 0x7f
 84	ble	5b
 85	 clr	%o2
 86
 879:	retl
 88	 nop
 89
 90viking_mxcc_flush_page:
 91	sethi	%hi(PAGE_OFFSET), %g2
 92	sub	%o0, %g2, %g3
 93	sub	%g3, -PAGE_SIZE, %g3		! ppage + PAGE_SIZE
 94	sethi	%hi(MXCC_SRCSTREAM), %o3	! assume %hi(MXCC_SRCSTREAM) == %hi(MXCC_DESTSTREAM)
 95	mov	0x10, %g2			! set cacheable bit
 96	or	%o3, %lo(MXCC_SRCSTREAM), %o2
 97	or	%o3, %lo(MXCC_DESSTREAM), %o3
 98	sub	%g3, MXCC_STREAM_SIZE, %g3
 996:
100	stda	%g2, [%o2] ASI_M_MXCC
101	stda	%g2, [%o3] ASI_M_MXCC
102	andncc	%g3, PAGE_MASK, %g0
103	bne	6b
104	 sub	%g3, MXCC_STREAM_SIZE, %g3
105
1069:	retl
107	 nop
108
109viking_flush_cache_page:
110viking_flush_cache_range:
111#ifndef CONFIG_SMP
112	ld	[%o0 + VMA_VM_MM], %o0
113#endif
114viking_flush_cache_mm:
115#ifndef CONFIG_SMP
116	ld	[%o0 + AOFF_mm_context], %g1
117	cmp	%g1, -1
118	bne	viking_flush_cache_all
119	 nop
120	b,a	viking_flush_cache_out
121#endif
122viking_flush_cache_all:
123	WINDOW_FLUSH(%g4, %g5)
124viking_flush_cache_out:
125	retl
126	 nop
127
128viking_flush_tlb_all:
129	mov	0x400, %g1
130	retl
131	 sta	%g0, [%g1] ASI_M_FLUSH_PROBE
132
133viking_flush_tlb_mm:
134	mov	SRMMU_CTX_REG, %g1
135	ld	[%o0 + AOFF_mm_context], %o1
136	lda	[%g1] ASI_M_MMUREGS, %g5
137#ifndef CONFIG_SMP
138	cmp	%o1, -1
139	be	1f
140#endif
141	mov	0x300, %g2
142	sta	%o1, [%g1] ASI_M_MMUREGS
143	sta	%g0, [%g2] ASI_M_FLUSH_PROBE
144	retl
145	 sta	%g5, [%g1] ASI_M_MMUREGS
146#ifndef CONFIG_SMP
1471:	retl
148	 nop
149#endif
150
151viking_flush_tlb_range:
152	ld	[%o0 + VMA_VM_MM], %o0
153	mov	SRMMU_CTX_REG, %g1
154	ld	[%o0 + AOFF_mm_context], %o3
155	lda	[%g1] ASI_M_MMUREGS, %g5
156#ifndef CONFIG_SMP
157	cmp	%o3, -1
158	be	2f
159#endif
160	sethi	%hi(~((1 << SRMMU_PGDIR_SHIFT) - 1)), %o4
161	sta	%o3, [%g1] ASI_M_MMUREGS
162	and	%o1, %o4, %o1
163	add	%o1, 0x200, %o1
164	sta	%g0, [%o1] ASI_M_FLUSH_PROBE
1651:	sub	%o1, %o4, %o1
166	cmp	%o1, %o2
167	blu,a	1b
168	 sta	%g0, [%o1] ASI_M_FLUSH_PROBE
169	retl
170	 sta	%g5, [%g1] ASI_M_MMUREGS
171#ifndef CONFIG_SMP
1722:	retl
173	 nop
174#endif
175
176viking_flush_tlb_page:
177	ld	[%o0 + VMA_VM_MM], %o0
178	mov	SRMMU_CTX_REG, %g1
179	ld	[%o0 + AOFF_mm_context], %o3
180	lda	[%g1] ASI_M_MMUREGS, %g5
181#ifndef CONFIG_SMP
182	cmp	%o3, -1
183	be	1f
184#endif
185	and	%o1, PAGE_MASK, %o1
186	sta	%o3, [%g1] ASI_M_MMUREGS
187	sta	%g0, [%o1] ASI_M_FLUSH_PROBE
188	retl
189	 sta	%g5, [%g1] ASI_M_MMUREGS
190#ifndef CONFIG_SMP
1911:	retl
192	 nop
193#endif
194
195viking_flush_page_to_ram:
196viking_flush_page_for_dma:
197viking_flush_sig_insns:
198	retl
199	 nop
200
201#ifdef CONFIG_SMP
202	.globl	sun4dsmp_flush_tlb_all, sun4dsmp_flush_tlb_mm
203	.globl	sun4dsmp_flush_tlb_range, sun4dsmp_flush_tlb_page
204sun4dsmp_flush_tlb_all:
205	sethi	%hi(sun4dsmp_flush_tlb_spin), %g3
2061:	ldstub	[%g3 + %lo(sun4dsmp_flush_tlb_spin)], %g5
207	tst	%g5
208	bne	2f
209	 mov	0x400, %g1
210	sta	%g0, [%g1] ASI_M_FLUSH_PROBE
211	retl
212	 stb	%g0, [%g3 + %lo(sun4dsmp_flush_tlb_spin)]
2132:	tst	%g5
214	bne,a	2b
215	 ldub	[%g3 + %lo(sun4dsmp_flush_tlb_spin)], %g5
216	b,a	1b
217
218sun4dsmp_flush_tlb_mm:
219	sethi	%hi(sun4dsmp_flush_tlb_spin), %g3
2201:	ldstub	[%g3 + %lo(sun4dsmp_flush_tlb_spin)], %g5
221	tst	%g5
222	bne	2f
223	 mov	SRMMU_CTX_REG, %g1
224	ld	[%o0 + AOFF_mm_context], %o1
225	lda	[%g1] ASI_M_MMUREGS, %g5
226	mov	0x300, %g2
227	sta	%o1, [%g1] ASI_M_MMUREGS
228	sta	%g0, [%g2] ASI_M_FLUSH_PROBE
229	sta	%g5, [%g1] ASI_M_MMUREGS
230	retl
231	 stb	%g0, [%g3 + %lo(sun4dsmp_flush_tlb_spin)]
2322:	tst	%g5
233	bne,a	2b
234	 ldub	[%g3 + %lo(sun4dsmp_flush_tlb_spin)], %g5
235	b,a	1b
236
237sun4dsmp_flush_tlb_range:
238	sethi	%hi(sun4dsmp_flush_tlb_spin), %g3
2391:	ldstub	[%g3 + %lo(sun4dsmp_flush_tlb_spin)], %g5
240	tst	%g5
241	bne	3f
242	 mov	SRMMU_CTX_REG, %g1
243	ld	[%o0 + VMA_VM_MM], %o0
244	ld	[%o0 + AOFF_mm_context], %o3
245	lda	[%g1] ASI_M_MMUREGS, %g5
246	sethi	%hi(~((1 << SRMMU_PGDIR_SHIFT) - 1)), %o4
247	sta	%o3, [%g1] ASI_M_MMUREGS
248	and	%o1, %o4, %o1
249	add	%o1, 0x200, %o1
250	sta	%g0, [%o1] ASI_M_FLUSH_PROBE
2512:	sub	%o1, %o4, %o1
252	cmp	%o1, %o2
253	blu,a	2b
254	 sta	%g0, [%o1] ASI_M_FLUSH_PROBE
255	sta	%g5, [%g1] ASI_M_MMUREGS
256	retl
257	 stb	%g0, [%g3 + %lo(sun4dsmp_flush_tlb_spin)]
2583:	tst	%g5
259	bne,a	3b
260	 ldub	[%g3 + %lo(sun4dsmp_flush_tlb_spin)], %g5
261	b,a	1b
262
263sun4dsmp_flush_tlb_page:
264	sethi	%hi(sun4dsmp_flush_tlb_spin), %g3
2651:	ldstub	[%g3 + %lo(sun4dsmp_flush_tlb_spin)], %g5
266	tst	%g5
267	bne	2f
268	 mov	SRMMU_CTX_REG, %g1
269	ld	[%o0 + VMA_VM_MM], %o0
270	ld	[%o0 + AOFF_mm_context], %o3
271	lda	[%g1] ASI_M_MMUREGS, %g5
272	and	%o1, PAGE_MASK, %o1
273	sta	%o3, [%g1] ASI_M_MMUREGS
274	sta	%g0, [%o1] ASI_M_FLUSH_PROBE
275	sta	%g5, [%g1] ASI_M_MMUREGS
276	retl
277	 stb	%g0, [%g3 + %lo(sun4dsmp_flush_tlb_spin)]
2782:	tst	%g5
279	bne,a	2b
280	 ldub	[%g3 + %lo(sun4dsmp_flush_tlb_spin)], %g5
281	b,a	1b
282	 nop
283#endif
v3.5.6
 
  1/*
  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 */
  8
  9#include <asm/ptrace.h>
 10#include <asm/psr.h>
 11#include <asm/asm-offsets.h>
 12#include <asm/asi.h>
 13#include <asm/mxcc.h>
 14#include <asm/page.h>
 15#include <asm/pgtsrmmu.h>
 16#include <asm/viking.h>
 17
 18#ifdef CONFIG_SMP
 19	.data
 20	.align	4
 21sun4dsmp_flush_tlb_spin:
 22	.word	0
 23#endif
 24
 25	.text
 26	.align	4
 27
 28	.globl	viking_flush_cache_all, viking_flush_cache_mm
 29	.globl	viking_flush_cache_range, viking_flush_cache_page
 30	.globl	viking_flush_page, viking_mxcc_flush_page
 31	.globl	viking_flush_page_for_dma, viking_flush_page_to_ram
 32	.globl	viking_flush_sig_insns
 33	.globl	viking_flush_tlb_all, viking_flush_tlb_mm
 34	.globl	viking_flush_tlb_range, viking_flush_tlb_page
 35
 36viking_flush_page:
 37	sethi	%hi(PAGE_OFFSET), %g2
 38	sub	%o0, %g2, %g3
 39	srl	%g3, 12, %g1		! ppage >> 12
 40
 41	clr	%o1			! set counter, 0 - 127
 42	sethi	%hi(PAGE_OFFSET + PAGE_SIZE - 0x80000000), %o3
 43	sethi	%hi(0x80000000), %o4
 44	sethi	%hi(VIKING_PTAG_VALID), %o5
 45	sethi	%hi(2*PAGE_SIZE), %o0
 46	sethi	%hi(PAGE_SIZE), %g7
 47	clr	%o2			! block counter, 0 - 3
 485:
 49	sll	%o1, 5, %g4
 50	or	%g4, %o4, %g4		! 0x80000000 | (set << 5)
 51
 52	sll	%o2, 26, %g5		! block << 26
 536:
 54	or	%g5, %g4, %g5
 55	ldda	[%g5] ASI_M_DATAC_TAG, %g2
 56	cmp	%g3, %g1		! ptag == ppage?
 57	bne	7f
 58	 inc	%o2
 59
 60	andcc	%g2, %o5, %g0		! ptag VALID?
 61	be	7f
 62	 add	%g4, %o3, %g2		! (PAGE_OFFSET + PAGE_SIZE) | (set << 5)
 63	ld	[%g2], %g3
 64	ld	[%g2 + %g7], %g3
 65	add	%g2, %o0, %g2
 66	ld	[%g2], %g3
 67	ld	[%g2 + %g7], %g3
 68	add	%g2, %o0, %g2
 69	ld	[%g2], %g3
 70	ld	[%g2 + %g7], %g3
 71	add	%g2, %o0, %g2
 72	ld	[%g2], %g3
 73	b	8f
 74	 ld	[%g2 + %g7], %g3
 75
 767:
 77	cmp	%o2, 3
 78	ble	6b
 79	 sll	%o2, 26, %g5			! block << 26
 80
 818:	inc	%o1
 82	cmp	%o1, 0x7f
 83	ble	5b
 84	 clr	%o2
 85
 869:	retl
 87	 nop
 88
 89viking_mxcc_flush_page:
 90	sethi	%hi(PAGE_OFFSET), %g2
 91	sub	%o0, %g2, %g3
 92	sub	%g3, -PAGE_SIZE, %g3		! ppage + PAGE_SIZE
 93	sethi	%hi(MXCC_SRCSTREAM), %o3	! assume %hi(MXCC_SRCSTREAM) == %hi(MXCC_DESTSTREAM)
 94	mov	0x10, %g2			! set cacheable bit
 95	or	%o3, %lo(MXCC_SRCSTREAM), %o2
 96	or	%o3, %lo(MXCC_DESSTREAM), %o3
 97	sub	%g3, MXCC_STREAM_SIZE, %g3
 986:
 99	stda	%g2, [%o2] ASI_M_MXCC
100	stda	%g2, [%o3] ASI_M_MXCC
101	andncc	%g3, PAGE_MASK, %g0
102	bne	6b
103	 sub	%g3, MXCC_STREAM_SIZE, %g3
104
1059:	retl
106	 nop
107
108viking_flush_cache_page:
109viking_flush_cache_range:
110#ifndef CONFIG_SMP
111	ld	[%o0 + 0x0], %o0		/* XXX vma->vm_mm, GROSS XXX */
112#endif
113viking_flush_cache_mm:
114#ifndef CONFIG_SMP
115	ld	[%o0 + AOFF_mm_context], %g1
116	cmp	%g1, -1
117	bne	viking_flush_cache_all
118	 nop
119	b,a	viking_flush_cache_out
120#endif
121viking_flush_cache_all:
122	WINDOW_FLUSH(%g4, %g5)
123viking_flush_cache_out:
124	retl
125	 nop
126
127viking_flush_tlb_all:
128	mov	0x400, %g1
129	retl
130	 sta	%g0, [%g1] ASI_M_FLUSH_PROBE
131
132viking_flush_tlb_mm:
133	mov	SRMMU_CTX_REG, %g1
134	ld	[%o0 + AOFF_mm_context], %o1
135	lda	[%g1] ASI_M_MMUREGS, %g5
136#ifndef CONFIG_SMP
137	cmp	%o1, -1
138	be	1f
139#endif
140	mov	0x300, %g2
141	sta	%o1, [%g1] ASI_M_MMUREGS
142	sta	%g0, [%g2] ASI_M_FLUSH_PROBE
143	retl
144	 sta	%g5, [%g1] ASI_M_MMUREGS
145#ifndef CONFIG_SMP
1461:	retl
147	 nop
148#endif
149
150viking_flush_tlb_range:
151	ld	[%o0 + 0x00], %o0	/* XXX vma->vm_mm GROSS XXX */
152	mov	SRMMU_CTX_REG, %g1
153	ld	[%o0 + AOFF_mm_context], %o3
154	lda	[%g1] ASI_M_MMUREGS, %g5
155#ifndef CONFIG_SMP
156	cmp	%o3, -1
157	be	2f
158#endif
159	sethi	%hi(~((1 << SRMMU_PGDIR_SHIFT) - 1)), %o4
160	sta	%o3, [%g1] ASI_M_MMUREGS
161	and	%o1, %o4, %o1
162	add	%o1, 0x200, %o1
163	sta	%g0, [%o1] ASI_M_FLUSH_PROBE
1641:	sub	%o1, %o4, %o1
165	cmp	%o1, %o2
166	blu,a	1b
167	 sta	%g0, [%o1] ASI_M_FLUSH_PROBE
168	retl
169	 sta	%g5, [%g1] ASI_M_MMUREGS
170#ifndef CONFIG_SMP
1712:	retl
172	 nop
173#endif
174
175viking_flush_tlb_page:
176	ld	[%o0 + 0x00], %o0	/* XXX vma->vm_mm GROSS XXX */
177	mov	SRMMU_CTX_REG, %g1
178	ld	[%o0 + AOFF_mm_context], %o3
179	lda	[%g1] ASI_M_MMUREGS, %g5
180#ifndef CONFIG_SMP
181	cmp	%o3, -1
182	be	1f
183#endif
184	and	%o1, PAGE_MASK, %o1
185	sta	%o3, [%g1] ASI_M_MMUREGS
186	sta	%g0, [%o1] ASI_M_FLUSH_PROBE
187	retl
188	 sta	%g5, [%g1] ASI_M_MMUREGS
189#ifndef CONFIG_SMP
1901:	retl
191	 nop
192#endif
193
194viking_flush_page_to_ram:
195viking_flush_page_for_dma:
196viking_flush_sig_insns:
197	retl
198	 nop
199
200#ifdef CONFIG_SMP
201	.globl	sun4dsmp_flush_tlb_all, sun4dsmp_flush_tlb_mm
202	.globl	sun4dsmp_flush_tlb_range, sun4dsmp_flush_tlb_page
203sun4dsmp_flush_tlb_all:
204	sethi	%hi(sun4dsmp_flush_tlb_spin), %g3
2051:	ldstub	[%g3 + %lo(sun4dsmp_flush_tlb_spin)], %g5
206	tst	%g5
207	bne	2f
208	 mov	0x400, %g1
209	sta	%g0, [%g1] ASI_M_FLUSH_PROBE
210	retl
211	 stb	%g0, [%g3 + %lo(sun4dsmp_flush_tlb_spin)]
2122:	tst	%g5
213	bne,a	2b
214	 ldub	[%g3 + %lo(sun4dsmp_flush_tlb_spin)], %g5
215	b,a	1b
216
217sun4dsmp_flush_tlb_mm:
218	sethi	%hi(sun4dsmp_flush_tlb_spin), %g3
2191:	ldstub	[%g3 + %lo(sun4dsmp_flush_tlb_spin)], %g5
220	tst	%g5
221	bne	2f
222	 mov	SRMMU_CTX_REG, %g1
223	ld	[%o0 + AOFF_mm_context], %o1
224	lda	[%g1] ASI_M_MMUREGS, %g5
225	mov	0x300, %g2
226	sta	%o1, [%g1] ASI_M_MMUREGS
227	sta	%g0, [%g2] ASI_M_FLUSH_PROBE
228	sta	%g5, [%g1] ASI_M_MMUREGS
229	retl
230	 stb	%g0, [%g3 + %lo(sun4dsmp_flush_tlb_spin)]
2312:	tst	%g5
232	bne,a	2b
233	 ldub	[%g3 + %lo(sun4dsmp_flush_tlb_spin)], %g5
234	b,a	1b
235
236sun4dsmp_flush_tlb_range:
237	sethi	%hi(sun4dsmp_flush_tlb_spin), %g3
2381:	ldstub	[%g3 + %lo(sun4dsmp_flush_tlb_spin)], %g5
239	tst	%g5
240	bne	3f
241	 mov	SRMMU_CTX_REG, %g1
242	ld	[%o0 + 0x00], %o0	/* XXX vma->vm_mm GROSS XXX */
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
247	and	%o1, %o4, %o1
248	add	%o1, 0x200, %o1
249	sta	%g0, [%o1] ASI_M_FLUSH_PROBE
2502:	sub	%o1, %o4, %o1
251	cmp	%o1, %o2
252	blu,a	2b
253	 sta	%g0, [%o1] ASI_M_FLUSH_PROBE
254	sta	%g5, [%g1] ASI_M_MMUREGS
255	retl
256	 stb	%g0, [%g3 + %lo(sun4dsmp_flush_tlb_spin)]
2573:	tst	%g5
258	bne,a	3b
259	 ldub	[%g3 + %lo(sun4dsmp_flush_tlb_spin)], %g5
260	b,a	1b
261
262sun4dsmp_flush_tlb_page:
263	sethi	%hi(sun4dsmp_flush_tlb_spin), %g3
2641:	ldstub	[%g3 + %lo(sun4dsmp_flush_tlb_spin)], %g5
265	tst	%g5
266	bne	2f
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
275	retl
276	 stb	%g0, [%g3 + %lo(sun4dsmp_flush_tlb_spin)]
2772:	tst	%g5
278	bne,a	2b
279	 ldub	[%g3 + %lo(sun4dsmp_flush_tlb_spin)], %g5
280	b,a	1b
281	 nop
282#endif