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