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