xref: /openbmc/linux/arch/sparc/mm/swift.S (revision 498495dba268b20e8eadd7fe93c140c68b6cc9d2)
1*b2441318SGreg Kroah-Hartman/* SPDX-License-Identifier: GPL-2.0 */
288278ca2SAdrian Bunk/*
31da177e4SLinus Torvalds * swift.S: MicroSparc-II mmu/cache operations.
41da177e4SLinus Torvalds *
51da177e4SLinus Torvalds * Copyright (C) 1999 David S. Miller (davem@redhat.com)
61da177e4SLinus Torvalds */
71da177e4SLinus Torvalds
81da177e4SLinus Torvalds#include <asm/psr.h>
91da177e4SLinus Torvalds#include <asm/asi.h>
101da177e4SLinus Torvalds#include <asm/page.h>
111da177e4SLinus Torvalds#include <asm/pgtsrmmu.h>
1247003497SSam Ravnborg#include <asm/asm-offsets.h>
131da177e4SLinus Torvalds
141da177e4SLinus Torvalds	.text
151da177e4SLinus Torvalds	.align	4
161da177e4SLinus Torvalds
171da177e4SLinus Torvalds#if 1	/* XXX screw this, I can't get the VAC flushes working
181da177e4SLinus Torvalds	 * XXX reliably... -DaveM
191da177e4SLinus Torvalds	 */
201da177e4SLinus Torvalds	.globl	swift_flush_cache_all, swift_flush_cache_mm
211da177e4SLinus Torvalds	.globl	swift_flush_cache_range, swift_flush_cache_page
221da177e4SLinus Torvalds	.globl	swift_flush_page_for_dma
231da177e4SLinus Torvalds	.globl	swift_flush_page_to_ram
241da177e4SLinus Torvalds
251da177e4SLinus Torvaldsswift_flush_cache_all:
261da177e4SLinus Torvaldsswift_flush_cache_mm:
271da177e4SLinus Torvaldsswift_flush_cache_range:
281da177e4SLinus Torvaldsswift_flush_cache_page:
291da177e4SLinus Torvaldsswift_flush_page_for_dma:
301da177e4SLinus Torvaldsswift_flush_page_to_ram:
311da177e4SLinus Torvalds	sethi	%hi(0x2000), %o0
321da177e4SLinus Torvalds1:	subcc	%o0, 0x10, %o0
331da177e4SLinus Torvalds	add	%o0, %o0, %o1
341da177e4SLinus Torvalds	sta	%g0, [%o0] ASI_M_DATAC_TAG
351da177e4SLinus Torvalds	bne	1b
361da177e4SLinus Torvalds	 sta	%g0, [%o1] ASI_M_TXTC_TAG
371da177e4SLinus Torvalds	retl
381da177e4SLinus Torvalds	 nop
391da177e4SLinus Torvalds#else
401da177e4SLinus Torvalds
411da177e4SLinus Torvalds	.globl	swift_flush_cache_all
421da177e4SLinus Torvaldsswift_flush_cache_all:
431da177e4SLinus Torvalds	WINDOW_FLUSH(%g4, %g5)
441da177e4SLinus Torvalds
451da177e4SLinus Torvalds	/* Just clear out all the tags. */
461da177e4SLinus Torvalds	sethi	%hi(16 * 1024), %o0
471da177e4SLinus Torvalds1:	subcc	%o0, 16, %o0
481da177e4SLinus Torvalds	sta	%g0, [%o0] ASI_M_TXTC_TAG
491da177e4SLinus Torvalds	bne	1b
501da177e4SLinus Torvalds	 sta	%g0, [%o0] ASI_M_DATAC_TAG
511da177e4SLinus Torvalds	retl
521da177e4SLinus Torvalds	 nop
531da177e4SLinus Torvalds
541da177e4SLinus Torvalds	.globl	swift_flush_cache_mm
551da177e4SLinus Torvaldsswift_flush_cache_mm:
561da177e4SLinus Torvalds	ld	[%o0 + AOFF_mm_context], %g2
571da177e4SLinus Torvalds	cmp	%g2, -1
581da177e4SLinus Torvalds	be	swift_flush_cache_mm_out
591da177e4SLinus Torvalds	WINDOW_FLUSH(%g4, %g5)
601da177e4SLinus Torvalds	rd	%psr, %g1
611da177e4SLinus Torvalds	andn	%g1, PSR_ET, %g3
621da177e4SLinus Torvalds	wr	%g3, 0x0, %psr
631da177e4SLinus Torvalds	nop
641da177e4SLinus Torvalds	nop
651da177e4SLinus Torvalds	mov	SRMMU_CTX_REG, %g7
661da177e4SLinus Torvalds	lda	[%g7] ASI_M_MMUREGS, %g5
671da177e4SLinus Torvalds	sta	%g2, [%g7] ASI_M_MMUREGS
681da177e4SLinus Torvalds
691da177e4SLinus Torvalds#if 1
701da177e4SLinus Torvalds	sethi	%hi(0x2000), %o0
711da177e4SLinus Torvalds1:	subcc	%o0, 0x10, %o0
721da177e4SLinus Torvalds	sta	%g0, [%o0] ASI_M_FLUSH_CTX
731da177e4SLinus Torvalds	bne	1b
741da177e4SLinus Torvalds	 nop
751da177e4SLinus Torvalds#else
761da177e4SLinus Torvalds	clr	%o0
771da177e4SLinus Torvalds	or	%g0, 2048, %g7
781da177e4SLinus Torvalds	or	%g0, 2048, %o1
791da177e4SLinus Torvalds	add	%o1, 2048, %o2
801da177e4SLinus Torvalds	add	%o2, 2048, %o3
811da177e4SLinus Torvalds	mov	16, %o4
821da177e4SLinus Torvalds	add	%o4, 2048, %o5
831da177e4SLinus Torvalds	add	%o5, 2048, %g2
841da177e4SLinus Torvalds	add	%g2, 2048, %g3
851da177e4SLinus Torvalds1:	sta	%g0, [%o0      ] ASI_M_FLUSH_CTX
861da177e4SLinus Torvalds	sta	%g0, [%o0 + %o1] ASI_M_FLUSH_CTX
871da177e4SLinus Torvalds	sta	%g0, [%o0 + %o2] ASI_M_FLUSH_CTX
881da177e4SLinus Torvalds	sta	%g0, [%o0 + %o3] ASI_M_FLUSH_CTX
891da177e4SLinus Torvalds	sta	%g0, [%o0 + %o4] ASI_M_FLUSH_CTX
901da177e4SLinus Torvalds	sta	%g0, [%o0 + %o5] ASI_M_FLUSH_CTX
911da177e4SLinus Torvalds	sta	%g0, [%o0 + %g2] ASI_M_FLUSH_CTX
921da177e4SLinus Torvalds	sta	%g0, [%o0 + %g3] ASI_M_FLUSH_CTX
931da177e4SLinus Torvalds	subcc	%g7, 32, %g7
941da177e4SLinus Torvalds	bne	1b
951da177e4SLinus Torvalds	 add	%o0, 32, %o0
961da177e4SLinus Torvalds#endif
971da177e4SLinus Torvalds
981da177e4SLinus Torvalds	mov	SRMMU_CTX_REG, %g7
991da177e4SLinus Torvalds	sta	%g5, [%g7] ASI_M_MMUREGS
1001da177e4SLinus Torvalds	wr	%g1, 0x0, %psr
1011da177e4SLinus Torvalds	nop
1021da177e4SLinus Torvalds	nop
1031da177e4SLinus Torvaldsswift_flush_cache_mm_out:
1041da177e4SLinus Torvalds	retl
1051da177e4SLinus Torvalds	 nop
1061da177e4SLinus Torvalds
1071da177e4SLinus Torvalds	.globl	swift_flush_cache_range
1081da177e4SLinus Torvaldsswift_flush_cache_range:
109961246b4SOlivier DANET	ld	[%o0 + VMA_VM_MM], %o0
1101da177e4SLinus Torvalds	sub	%o2, %o1, %o2
1111da177e4SLinus Torvalds	sethi	%hi(4096), %o3
1121da177e4SLinus Torvalds	cmp	%o2, %o3
1131da177e4SLinus Torvalds	bgu	swift_flush_cache_mm
1141da177e4SLinus Torvalds	 nop
1151da177e4SLinus Torvalds	b	70f
1161da177e4SLinus Torvalds	 nop
1171da177e4SLinus Torvalds
1181da177e4SLinus Torvalds	.globl	swift_flush_cache_page
1191da177e4SLinus Torvaldsswift_flush_cache_page:
120961246b4SOlivier DANET	ld	[%o0 + VMA_VM_MM], %o0
1211da177e4SLinus Torvalds70:
1221da177e4SLinus Torvalds	ld	[%o0 + AOFF_mm_context], %g2
1231da177e4SLinus Torvalds	cmp	%g2, -1
1241da177e4SLinus Torvalds	be	swift_flush_cache_page_out
1251da177e4SLinus Torvalds	WINDOW_FLUSH(%g4, %g5)
1261da177e4SLinus Torvalds	rd	%psr, %g1
1271da177e4SLinus Torvalds	andn	%g1, PSR_ET, %g3
1281da177e4SLinus Torvalds	wr	%g3, 0x0, %psr
1291da177e4SLinus Torvalds	nop
1301da177e4SLinus Torvalds	nop
1311da177e4SLinus Torvalds	mov	SRMMU_CTX_REG, %g7
1321da177e4SLinus Torvalds	lda	[%g7] ASI_M_MMUREGS, %g5
1331da177e4SLinus Torvalds	sta	%g2, [%g7] ASI_M_MMUREGS
1341da177e4SLinus Torvalds
1351da177e4SLinus Torvalds	andn	%o1, (PAGE_SIZE - 1), %o1
1361da177e4SLinus Torvalds#if 1
1371da177e4SLinus Torvalds	sethi	%hi(0x1000), %o0
1381da177e4SLinus Torvalds1:	subcc	%o0, 0x10, %o0
1391da177e4SLinus Torvalds	sta	%g0, [%o1 + %o0] ASI_M_FLUSH_PAGE
1401da177e4SLinus Torvalds	bne	1b
1411da177e4SLinus Torvalds	 nop
1421da177e4SLinus Torvalds#else
1431da177e4SLinus Torvalds	or	%g0, 512, %g7
1441da177e4SLinus Torvalds	or	%g0, 512, %o0
1451da177e4SLinus Torvalds	add	%o0, 512, %o2
1461da177e4SLinus Torvalds	add	%o2, 512, %o3
1471da177e4SLinus Torvalds	add	%o3, 512, %o4
1481da177e4SLinus Torvalds	add	%o4, 512, %o5
1491da177e4SLinus Torvalds	add	%o5, 512, %g3
1501da177e4SLinus Torvalds	add	%g3, 512, %g4
1511da177e4SLinus Torvalds1:	sta	%g0, [%o1      ] ASI_M_FLUSH_PAGE
1521da177e4SLinus Torvalds	sta	%g0, [%o1 + %o0] ASI_M_FLUSH_PAGE
1531da177e4SLinus Torvalds	sta	%g0, [%o1 + %o2] ASI_M_FLUSH_PAGE
1541da177e4SLinus Torvalds	sta	%g0, [%o1 + %o3] ASI_M_FLUSH_PAGE
1551da177e4SLinus Torvalds	sta	%g0, [%o1 + %o4] ASI_M_FLUSH_PAGE
1561da177e4SLinus Torvalds	sta	%g0, [%o1 + %o5] ASI_M_FLUSH_PAGE
1571da177e4SLinus Torvalds	sta	%g0, [%o1 + %g3] ASI_M_FLUSH_PAGE
1581da177e4SLinus Torvalds	sta	%g0, [%o1 + %g4] ASI_M_FLUSH_PAGE
1591da177e4SLinus Torvalds	subcc	%g7, 16, %g7
1601da177e4SLinus Torvalds	bne	1b
1611da177e4SLinus Torvalds	 add	%o1, 16, %o1
1621da177e4SLinus Torvalds#endif
1631da177e4SLinus Torvalds
1641da177e4SLinus Torvalds	mov	SRMMU_CTX_REG, %g7
1651da177e4SLinus Torvalds	sta	%g5, [%g7] ASI_M_MMUREGS
1661da177e4SLinus Torvalds	wr	%g1, 0x0, %psr
1671da177e4SLinus Torvalds	nop
1681da177e4SLinus Torvalds	nop
1691da177e4SLinus Torvaldsswift_flush_cache_page_out:
1701da177e4SLinus Torvalds	retl
1711da177e4SLinus Torvalds	 nop
1721da177e4SLinus Torvalds
1731da177e4SLinus Torvalds	/* Swift is write-thru, however it is not
1741da177e4SLinus Torvalds	 * I/O nor TLB-walk coherent.  Also it has
1751da177e4SLinus Torvalds	 * caches which are virtually indexed and tagged.
1761da177e4SLinus Torvalds	 */
1771da177e4SLinus Torvalds	.globl	swift_flush_page_for_dma
1781da177e4SLinus Torvalds	.globl	swift_flush_page_to_ram
1791da177e4SLinus Torvaldsswift_flush_page_for_dma:
1801da177e4SLinus Torvaldsswift_flush_page_to_ram:
1811da177e4SLinus Torvalds	andn	%o0, (PAGE_SIZE - 1), %o1
1821da177e4SLinus Torvalds#if 1
1831da177e4SLinus Torvalds	sethi	%hi(0x1000), %o0
1841da177e4SLinus Torvalds1:	subcc	%o0, 0x10, %o0
1851da177e4SLinus Torvalds	sta	%g0, [%o1 + %o0] ASI_M_FLUSH_PAGE
1861da177e4SLinus Torvalds	bne	1b
1871da177e4SLinus Torvalds	 nop
1881da177e4SLinus Torvalds#else
1891da177e4SLinus Torvalds	or	%g0, 512, %g7
1901da177e4SLinus Torvalds	or	%g0, 512, %o0
1911da177e4SLinus Torvalds	add	%o0, 512, %o2
1921da177e4SLinus Torvalds	add	%o2, 512, %o3
1931da177e4SLinus Torvalds	add	%o3, 512, %o4
1941da177e4SLinus Torvalds	add	%o4, 512, %o5
1951da177e4SLinus Torvalds	add	%o5, 512, %g3
1961da177e4SLinus Torvalds	add	%g3, 512, %g4
1971da177e4SLinus Torvalds1:	sta	%g0, [%o1      ] ASI_M_FLUSH_PAGE
1981da177e4SLinus Torvalds	sta	%g0, [%o1 + %o0] ASI_M_FLUSH_PAGE
1991da177e4SLinus Torvalds	sta	%g0, [%o1 + %o2] ASI_M_FLUSH_PAGE
2001da177e4SLinus Torvalds	sta	%g0, [%o1 + %o3] ASI_M_FLUSH_PAGE
2011da177e4SLinus Torvalds	sta	%g0, [%o1 + %o4] ASI_M_FLUSH_PAGE
2021da177e4SLinus Torvalds	sta	%g0, [%o1 + %o5] ASI_M_FLUSH_PAGE
2031da177e4SLinus Torvalds	sta	%g0, [%o1 + %g3] ASI_M_FLUSH_PAGE
2041da177e4SLinus Torvalds	sta	%g0, [%o1 + %g4] ASI_M_FLUSH_PAGE
2051da177e4SLinus Torvalds	subcc	%g7, 16, %g7
2061da177e4SLinus Torvalds	bne	1b
2071da177e4SLinus Torvalds	 add	%o1, 16, %o1
2081da177e4SLinus Torvalds#endif
2091da177e4SLinus Torvalds	retl
2101da177e4SLinus Torvalds	 nop
2111da177e4SLinus Torvalds#endif
2121da177e4SLinus Torvalds
2131da177e4SLinus Torvalds	.globl	swift_flush_sig_insns
2141da177e4SLinus Torvaldsswift_flush_sig_insns:
2151da177e4SLinus Torvalds	flush	%o1
2161da177e4SLinus Torvalds	retl
2171da177e4SLinus Torvalds	 flush	%o1 + 4
2181da177e4SLinus Torvalds
2191da177e4SLinus Torvalds	.globl	swift_flush_tlb_mm
2201da177e4SLinus Torvalds	.globl	swift_flush_tlb_range
2211da177e4SLinus Torvalds	.globl	swift_flush_tlb_all
2221da177e4SLinus Torvaldsswift_flush_tlb_range:
223961246b4SOlivier DANET	ld	[%o0 + VMA_VM_MM], %o0
2241da177e4SLinus Torvaldsswift_flush_tlb_mm:
2251da177e4SLinus Torvalds	ld	[%o0 + AOFF_mm_context], %g2
2261da177e4SLinus Torvalds	cmp	%g2, -1
2271da177e4SLinus Torvalds	be	swift_flush_tlb_all_out
2281da177e4SLinus Torvaldsswift_flush_tlb_all:
2291da177e4SLinus Torvalds	mov	0x400, %o1
2301da177e4SLinus Torvalds	sta	%g0, [%o1] ASI_M_FLUSH_PROBE
2311da177e4SLinus Torvaldsswift_flush_tlb_all_out:
2321da177e4SLinus Torvalds	retl
2331da177e4SLinus Torvalds	 nop
2341da177e4SLinus Torvalds
2351da177e4SLinus Torvalds	.globl	swift_flush_tlb_page
2361da177e4SLinus Torvaldsswift_flush_tlb_page:
237961246b4SOlivier DANET	ld	[%o0 + VMA_VM_MM], %o0
2381da177e4SLinus Torvalds	mov	SRMMU_CTX_REG, %g1
2391da177e4SLinus Torvalds	ld	[%o0 + AOFF_mm_context], %o3
2401da177e4SLinus Torvalds	andn	%o1, (PAGE_SIZE - 1), %o1
2411da177e4SLinus Torvalds	cmp	%o3, -1
2421da177e4SLinus Torvalds	be	swift_flush_tlb_page_out
2431da177e4SLinus Torvalds	 nop
2441da177e4SLinus Torvalds#if 1
2451da177e4SLinus Torvalds	mov	0x400, %o1
2461da177e4SLinus Torvalds	sta	%g0, [%o1] ASI_M_FLUSH_PROBE
2471da177e4SLinus Torvalds#else
2481da177e4SLinus Torvalds	lda	[%g1] ASI_M_MMUREGS, %g5
2491da177e4SLinus Torvalds	sta	%o3, [%g1] ASI_M_MMUREGS
2501da177e4SLinus Torvalds	sta	%g0, [%o1] ASI_M_FLUSH_PAGE	/* rem. virt. cache. prot. */
2511da177e4SLinus Torvalds	sta	%g0, [%o1] ASI_M_FLUSH_PROBE
2521da177e4SLinus Torvalds	sta	%g5, [%g1] ASI_M_MMUREGS
2531da177e4SLinus Torvalds#endif
2541da177e4SLinus Torvaldsswift_flush_tlb_page_out:
2551da177e4SLinus Torvalds	retl
2561da177e4SLinus Torvalds	 nop
257