18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * swift.S: MicroSparc-II mmu/cache operations.
48c2ecf20Sopenharmony_ci *
58c2ecf20Sopenharmony_ci * Copyright (C) 1999 David S. Miller (davem@redhat.com)
68c2ecf20Sopenharmony_ci */
78c2ecf20Sopenharmony_ci
88c2ecf20Sopenharmony_ci#include <asm/psr.h>
98c2ecf20Sopenharmony_ci#include <asm/asi.h>
108c2ecf20Sopenharmony_ci#include <asm/page.h>
118c2ecf20Sopenharmony_ci#include <asm/pgtsrmmu.h>
128c2ecf20Sopenharmony_ci#include <asm/asm-offsets.h>
138c2ecf20Sopenharmony_ci
148c2ecf20Sopenharmony_ci	.text
158c2ecf20Sopenharmony_ci	.align	4
168c2ecf20Sopenharmony_ci
178c2ecf20Sopenharmony_ci#if 1	/* XXX screw this, I can't get the VAC flushes working
188c2ecf20Sopenharmony_ci	 * XXX reliably... -DaveM
198c2ecf20Sopenharmony_ci	 */
208c2ecf20Sopenharmony_ci	.globl	swift_flush_cache_all, swift_flush_cache_mm
218c2ecf20Sopenharmony_ci	.globl	swift_flush_cache_range, swift_flush_cache_page
228c2ecf20Sopenharmony_ci	.globl	swift_flush_page_for_dma
238c2ecf20Sopenharmony_ci	.globl	swift_flush_page_to_ram
248c2ecf20Sopenharmony_ci
258c2ecf20Sopenharmony_ciswift_flush_cache_all:
268c2ecf20Sopenharmony_ciswift_flush_cache_mm:
278c2ecf20Sopenharmony_ciswift_flush_cache_range:
288c2ecf20Sopenharmony_ciswift_flush_cache_page:
298c2ecf20Sopenharmony_ciswift_flush_page_for_dma:
308c2ecf20Sopenharmony_ciswift_flush_page_to_ram:
318c2ecf20Sopenharmony_ci	sethi	%hi(0x2000), %o0
328c2ecf20Sopenharmony_ci1:	subcc	%o0, 0x10, %o0
338c2ecf20Sopenharmony_ci	add	%o0, %o0, %o1
348c2ecf20Sopenharmony_ci	sta	%g0, [%o0] ASI_M_DATAC_TAG
358c2ecf20Sopenharmony_ci	bne	1b
368c2ecf20Sopenharmony_ci	 sta	%g0, [%o1] ASI_M_TXTC_TAG
378c2ecf20Sopenharmony_ci	retl
388c2ecf20Sopenharmony_ci	 nop
398c2ecf20Sopenharmony_ci#else
408c2ecf20Sopenharmony_ci
418c2ecf20Sopenharmony_ci	.globl	swift_flush_cache_all
428c2ecf20Sopenharmony_ciswift_flush_cache_all:
438c2ecf20Sopenharmony_ci	WINDOW_FLUSH(%g4, %g5)
448c2ecf20Sopenharmony_ci
458c2ecf20Sopenharmony_ci	/* Just clear out all the tags. */
468c2ecf20Sopenharmony_ci	sethi	%hi(16 * 1024), %o0
478c2ecf20Sopenharmony_ci1:	subcc	%o0, 16, %o0
488c2ecf20Sopenharmony_ci	sta	%g0, [%o0] ASI_M_TXTC_TAG
498c2ecf20Sopenharmony_ci	bne	1b
508c2ecf20Sopenharmony_ci	 sta	%g0, [%o0] ASI_M_DATAC_TAG
518c2ecf20Sopenharmony_ci	retl
528c2ecf20Sopenharmony_ci	 nop
538c2ecf20Sopenharmony_ci
548c2ecf20Sopenharmony_ci	.globl	swift_flush_cache_mm
558c2ecf20Sopenharmony_ciswift_flush_cache_mm:
568c2ecf20Sopenharmony_ci	ld	[%o0 + AOFF_mm_context], %g2
578c2ecf20Sopenharmony_ci	cmp	%g2, -1
588c2ecf20Sopenharmony_ci	be	swift_flush_cache_mm_out
598c2ecf20Sopenharmony_ci	WINDOW_FLUSH(%g4, %g5)
608c2ecf20Sopenharmony_ci	rd	%psr, %g1
618c2ecf20Sopenharmony_ci	andn	%g1, PSR_ET, %g3
628c2ecf20Sopenharmony_ci	wr	%g3, 0x0, %psr
638c2ecf20Sopenharmony_ci	nop
648c2ecf20Sopenharmony_ci	nop
658c2ecf20Sopenharmony_ci	mov	SRMMU_CTX_REG, %g7
668c2ecf20Sopenharmony_ci	lda	[%g7] ASI_M_MMUREGS, %g5
678c2ecf20Sopenharmony_ci	sta	%g2, [%g7] ASI_M_MMUREGS
688c2ecf20Sopenharmony_ci
698c2ecf20Sopenharmony_ci#if 1
708c2ecf20Sopenharmony_ci	sethi	%hi(0x2000), %o0
718c2ecf20Sopenharmony_ci1:	subcc	%o0, 0x10, %o0
728c2ecf20Sopenharmony_ci	sta	%g0, [%o0] ASI_M_FLUSH_CTX
738c2ecf20Sopenharmony_ci	bne	1b
748c2ecf20Sopenharmony_ci	 nop
758c2ecf20Sopenharmony_ci#else
768c2ecf20Sopenharmony_ci	clr	%o0
778c2ecf20Sopenharmony_ci	or	%g0, 2048, %g7
788c2ecf20Sopenharmony_ci	or	%g0, 2048, %o1
798c2ecf20Sopenharmony_ci	add	%o1, 2048, %o2
808c2ecf20Sopenharmony_ci	add	%o2, 2048, %o3
818c2ecf20Sopenharmony_ci	mov	16, %o4
828c2ecf20Sopenharmony_ci	add	%o4, 2048, %o5
838c2ecf20Sopenharmony_ci	add	%o5, 2048, %g2
848c2ecf20Sopenharmony_ci	add	%g2, 2048, %g3
858c2ecf20Sopenharmony_ci1:	sta	%g0, [%o0      ] ASI_M_FLUSH_CTX
868c2ecf20Sopenharmony_ci	sta	%g0, [%o0 + %o1] ASI_M_FLUSH_CTX
878c2ecf20Sopenharmony_ci	sta	%g0, [%o0 + %o2] ASI_M_FLUSH_CTX
888c2ecf20Sopenharmony_ci	sta	%g0, [%o0 + %o3] ASI_M_FLUSH_CTX
898c2ecf20Sopenharmony_ci	sta	%g0, [%o0 + %o4] ASI_M_FLUSH_CTX
908c2ecf20Sopenharmony_ci	sta	%g0, [%o0 + %o5] ASI_M_FLUSH_CTX
918c2ecf20Sopenharmony_ci	sta	%g0, [%o0 + %g2] ASI_M_FLUSH_CTX
928c2ecf20Sopenharmony_ci	sta	%g0, [%o0 + %g3] ASI_M_FLUSH_CTX
938c2ecf20Sopenharmony_ci	subcc	%g7, 32, %g7
948c2ecf20Sopenharmony_ci	bne	1b
958c2ecf20Sopenharmony_ci	 add	%o0, 32, %o0
968c2ecf20Sopenharmony_ci#endif
978c2ecf20Sopenharmony_ci
988c2ecf20Sopenharmony_ci	mov	SRMMU_CTX_REG, %g7
998c2ecf20Sopenharmony_ci	sta	%g5, [%g7] ASI_M_MMUREGS
1008c2ecf20Sopenharmony_ci	wr	%g1, 0x0, %psr
1018c2ecf20Sopenharmony_ci	nop
1028c2ecf20Sopenharmony_ci	nop
1038c2ecf20Sopenharmony_ciswift_flush_cache_mm_out:
1048c2ecf20Sopenharmony_ci	retl
1058c2ecf20Sopenharmony_ci	 nop
1068c2ecf20Sopenharmony_ci
1078c2ecf20Sopenharmony_ci	.globl	swift_flush_cache_range
1088c2ecf20Sopenharmony_ciswift_flush_cache_range:
1098c2ecf20Sopenharmony_ci	ld	[%o0 + VMA_VM_MM], %o0
1108c2ecf20Sopenharmony_ci	sub	%o2, %o1, %o2
1118c2ecf20Sopenharmony_ci	sethi	%hi(4096), %o3
1128c2ecf20Sopenharmony_ci	cmp	%o2, %o3
1138c2ecf20Sopenharmony_ci	bgu	swift_flush_cache_mm
1148c2ecf20Sopenharmony_ci	 nop
1158c2ecf20Sopenharmony_ci	b	70f
1168c2ecf20Sopenharmony_ci	 nop
1178c2ecf20Sopenharmony_ci
1188c2ecf20Sopenharmony_ci	.globl	swift_flush_cache_page
1198c2ecf20Sopenharmony_ciswift_flush_cache_page:
1208c2ecf20Sopenharmony_ci	ld	[%o0 + VMA_VM_MM], %o0
1218c2ecf20Sopenharmony_ci70:
1228c2ecf20Sopenharmony_ci	ld	[%o0 + AOFF_mm_context], %g2
1238c2ecf20Sopenharmony_ci	cmp	%g2, -1
1248c2ecf20Sopenharmony_ci	be	swift_flush_cache_page_out
1258c2ecf20Sopenharmony_ci	WINDOW_FLUSH(%g4, %g5)
1268c2ecf20Sopenharmony_ci	rd	%psr, %g1
1278c2ecf20Sopenharmony_ci	andn	%g1, PSR_ET, %g3
1288c2ecf20Sopenharmony_ci	wr	%g3, 0x0, %psr
1298c2ecf20Sopenharmony_ci	nop
1308c2ecf20Sopenharmony_ci	nop
1318c2ecf20Sopenharmony_ci	mov	SRMMU_CTX_REG, %g7
1328c2ecf20Sopenharmony_ci	lda	[%g7] ASI_M_MMUREGS, %g5
1338c2ecf20Sopenharmony_ci	sta	%g2, [%g7] ASI_M_MMUREGS
1348c2ecf20Sopenharmony_ci
1358c2ecf20Sopenharmony_ci	andn	%o1, (PAGE_SIZE - 1), %o1
1368c2ecf20Sopenharmony_ci#if 1
1378c2ecf20Sopenharmony_ci	sethi	%hi(0x1000), %o0
1388c2ecf20Sopenharmony_ci1:	subcc	%o0, 0x10, %o0
1398c2ecf20Sopenharmony_ci	sta	%g0, [%o1 + %o0] ASI_M_FLUSH_PAGE
1408c2ecf20Sopenharmony_ci	bne	1b
1418c2ecf20Sopenharmony_ci	 nop
1428c2ecf20Sopenharmony_ci#else
1438c2ecf20Sopenharmony_ci	or	%g0, 512, %g7
1448c2ecf20Sopenharmony_ci	or	%g0, 512, %o0
1458c2ecf20Sopenharmony_ci	add	%o0, 512, %o2
1468c2ecf20Sopenharmony_ci	add	%o2, 512, %o3
1478c2ecf20Sopenharmony_ci	add	%o3, 512, %o4
1488c2ecf20Sopenharmony_ci	add	%o4, 512, %o5
1498c2ecf20Sopenharmony_ci	add	%o5, 512, %g3
1508c2ecf20Sopenharmony_ci	add	%g3, 512, %g4
1518c2ecf20Sopenharmony_ci1:	sta	%g0, [%o1      ] ASI_M_FLUSH_PAGE
1528c2ecf20Sopenharmony_ci	sta	%g0, [%o1 + %o0] ASI_M_FLUSH_PAGE
1538c2ecf20Sopenharmony_ci	sta	%g0, [%o1 + %o2] ASI_M_FLUSH_PAGE
1548c2ecf20Sopenharmony_ci	sta	%g0, [%o1 + %o3] ASI_M_FLUSH_PAGE
1558c2ecf20Sopenharmony_ci	sta	%g0, [%o1 + %o4] ASI_M_FLUSH_PAGE
1568c2ecf20Sopenharmony_ci	sta	%g0, [%o1 + %o5] ASI_M_FLUSH_PAGE
1578c2ecf20Sopenharmony_ci	sta	%g0, [%o1 + %g3] ASI_M_FLUSH_PAGE
1588c2ecf20Sopenharmony_ci	sta	%g0, [%o1 + %g4] ASI_M_FLUSH_PAGE
1598c2ecf20Sopenharmony_ci	subcc	%g7, 16, %g7
1608c2ecf20Sopenharmony_ci	bne	1b
1618c2ecf20Sopenharmony_ci	 add	%o1, 16, %o1
1628c2ecf20Sopenharmony_ci#endif
1638c2ecf20Sopenharmony_ci
1648c2ecf20Sopenharmony_ci	mov	SRMMU_CTX_REG, %g7
1658c2ecf20Sopenharmony_ci	sta	%g5, [%g7] ASI_M_MMUREGS
1668c2ecf20Sopenharmony_ci	wr	%g1, 0x0, %psr
1678c2ecf20Sopenharmony_ci	nop
1688c2ecf20Sopenharmony_ci	nop
1698c2ecf20Sopenharmony_ciswift_flush_cache_page_out:
1708c2ecf20Sopenharmony_ci	retl
1718c2ecf20Sopenharmony_ci	 nop
1728c2ecf20Sopenharmony_ci
1738c2ecf20Sopenharmony_ci	/* Swift is write-thru, however it is not
1748c2ecf20Sopenharmony_ci	 * I/O nor TLB-walk coherent.  Also it has
1758c2ecf20Sopenharmony_ci	 * caches which are virtually indexed and tagged.
1768c2ecf20Sopenharmony_ci	 */
1778c2ecf20Sopenharmony_ci	.globl	swift_flush_page_for_dma
1788c2ecf20Sopenharmony_ci	.globl	swift_flush_page_to_ram
1798c2ecf20Sopenharmony_ciswift_flush_page_for_dma:
1808c2ecf20Sopenharmony_ciswift_flush_page_to_ram:
1818c2ecf20Sopenharmony_ci	andn	%o0, (PAGE_SIZE - 1), %o1
1828c2ecf20Sopenharmony_ci#if 1
1838c2ecf20Sopenharmony_ci	sethi	%hi(0x1000), %o0
1848c2ecf20Sopenharmony_ci1:	subcc	%o0, 0x10, %o0
1858c2ecf20Sopenharmony_ci	sta	%g0, [%o1 + %o0] ASI_M_FLUSH_PAGE
1868c2ecf20Sopenharmony_ci	bne	1b
1878c2ecf20Sopenharmony_ci	 nop
1888c2ecf20Sopenharmony_ci#else
1898c2ecf20Sopenharmony_ci	or	%g0, 512, %g7
1908c2ecf20Sopenharmony_ci	or	%g0, 512, %o0
1918c2ecf20Sopenharmony_ci	add	%o0, 512, %o2
1928c2ecf20Sopenharmony_ci	add	%o2, 512, %o3
1938c2ecf20Sopenharmony_ci	add	%o3, 512, %o4
1948c2ecf20Sopenharmony_ci	add	%o4, 512, %o5
1958c2ecf20Sopenharmony_ci	add	%o5, 512, %g3
1968c2ecf20Sopenharmony_ci	add	%g3, 512, %g4
1978c2ecf20Sopenharmony_ci1:	sta	%g0, [%o1      ] ASI_M_FLUSH_PAGE
1988c2ecf20Sopenharmony_ci	sta	%g0, [%o1 + %o0] ASI_M_FLUSH_PAGE
1998c2ecf20Sopenharmony_ci	sta	%g0, [%o1 + %o2] ASI_M_FLUSH_PAGE
2008c2ecf20Sopenharmony_ci	sta	%g0, [%o1 + %o3] ASI_M_FLUSH_PAGE
2018c2ecf20Sopenharmony_ci	sta	%g0, [%o1 + %o4] ASI_M_FLUSH_PAGE
2028c2ecf20Sopenharmony_ci	sta	%g0, [%o1 + %o5] ASI_M_FLUSH_PAGE
2038c2ecf20Sopenharmony_ci	sta	%g0, [%o1 + %g3] ASI_M_FLUSH_PAGE
2048c2ecf20Sopenharmony_ci	sta	%g0, [%o1 + %g4] ASI_M_FLUSH_PAGE
2058c2ecf20Sopenharmony_ci	subcc	%g7, 16, %g7
2068c2ecf20Sopenharmony_ci	bne	1b
2078c2ecf20Sopenharmony_ci	 add	%o1, 16, %o1
2088c2ecf20Sopenharmony_ci#endif
2098c2ecf20Sopenharmony_ci	retl
2108c2ecf20Sopenharmony_ci	 nop
2118c2ecf20Sopenharmony_ci#endif
2128c2ecf20Sopenharmony_ci
2138c2ecf20Sopenharmony_ci	.globl	swift_flush_sig_insns
2148c2ecf20Sopenharmony_ciswift_flush_sig_insns:
2158c2ecf20Sopenharmony_ci	flush	%o1
2168c2ecf20Sopenharmony_ci	retl
2178c2ecf20Sopenharmony_ci	 flush	%o1 + 4
2188c2ecf20Sopenharmony_ci
2198c2ecf20Sopenharmony_ci	.globl	swift_flush_tlb_mm
2208c2ecf20Sopenharmony_ci	.globl	swift_flush_tlb_range
2218c2ecf20Sopenharmony_ci	.globl	swift_flush_tlb_all
2228c2ecf20Sopenharmony_ciswift_flush_tlb_range:
2238c2ecf20Sopenharmony_ci	ld	[%o0 + VMA_VM_MM], %o0
2248c2ecf20Sopenharmony_ciswift_flush_tlb_mm:
2258c2ecf20Sopenharmony_ci	ld	[%o0 + AOFF_mm_context], %g2
2268c2ecf20Sopenharmony_ci	cmp	%g2, -1
2278c2ecf20Sopenharmony_ci	be	swift_flush_tlb_all_out
2288c2ecf20Sopenharmony_ciswift_flush_tlb_all:
2298c2ecf20Sopenharmony_ci	mov	0x400, %o1
2308c2ecf20Sopenharmony_ci	sta	%g0, [%o1] ASI_M_FLUSH_PROBE
2318c2ecf20Sopenharmony_ciswift_flush_tlb_all_out:
2328c2ecf20Sopenharmony_ci	retl
2338c2ecf20Sopenharmony_ci	 nop
2348c2ecf20Sopenharmony_ci
2358c2ecf20Sopenharmony_ci	.globl	swift_flush_tlb_page
2368c2ecf20Sopenharmony_ciswift_flush_tlb_page:
2378c2ecf20Sopenharmony_ci	ld	[%o0 + VMA_VM_MM], %o0
2388c2ecf20Sopenharmony_ci	mov	SRMMU_CTX_REG, %g1
2398c2ecf20Sopenharmony_ci	ld	[%o0 + AOFF_mm_context], %o3
2408c2ecf20Sopenharmony_ci	andn	%o1, (PAGE_SIZE - 1), %o1
2418c2ecf20Sopenharmony_ci	cmp	%o3, -1
2428c2ecf20Sopenharmony_ci	be	swift_flush_tlb_page_out
2438c2ecf20Sopenharmony_ci	 nop
2448c2ecf20Sopenharmony_ci#if 1
2458c2ecf20Sopenharmony_ci	mov	0x400, %o1
2468c2ecf20Sopenharmony_ci	sta	%g0, [%o1] ASI_M_FLUSH_PROBE
2478c2ecf20Sopenharmony_ci#else
2488c2ecf20Sopenharmony_ci	lda	[%g1] ASI_M_MMUREGS, %g5
2498c2ecf20Sopenharmony_ci	sta	%o3, [%g1] ASI_M_MMUREGS
2508c2ecf20Sopenharmony_ci	sta	%g0, [%o1] ASI_M_FLUSH_PAGE	/* rem. virt. cache. prot. */
2518c2ecf20Sopenharmony_ci	sta	%g0, [%o1] ASI_M_FLUSH_PROBE
2528c2ecf20Sopenharmony_ci	sta	%g5, [%g1] ASI_M_MMUREGS
2538c2ecf20Sopenharmony_ci#endif
2548c2ecf20Sopenharmony_ciswift_flush_tlb_page_out:
2558c2ecf20Sopenharmony_ci	retl
2568c2ecf20Sopenharmony_ci	 nop
257