1*4882a593Smuzhiyun/* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun/* 3*4882a593Smuzhiyun * swift.S: MicroSparc-II mmu/cache operations. 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Copyright (C) 1999 David S. Miller (davem@redhat.com) 6*4882a593Smuzhiyun */ 7*4882a593Smuzhiyun 8*4882a593Smuzhiyun#include <asm/psr.h> 9*4882a593Smuzhiyun#include <asm/asi.h> 10*4882a593Smuzhiyun#include <asm/page.h> 11*4882a593Smuzhiyun#include <asm/pgtsrmmu.h> 12*4882a593Smuzhiyun#include <asm/asm-offsets.h> 13*4882a593Smuzhiyun 14*4882a593Smuzhiyun .text 15*4882a593Smuzhiyun .align 4 16*4882a593Smuzhiyun 17*4882a593Smuzhiyun#if 1 /* XXX screw this, I can't get the VAC flushes working 18*4882a593Smuzhiyun * XXX reliably... -DaveM 19*4882a593Smuzhiyun */ 20*4882a593Smuzhiyun .globl swift_flush_cache_all, swift_flush_cache_mm 21*4882a593Smuzhiyun .globl swift_flush_cache_range, swift_flush_cache_page 22*4882a593Smuzhiyun .globl swift_flush_page_for_dma 23*4882a593Smuzhiyun .globl swift_flush_page_to_ram 24*4882a593Smuzhiyun 25*4882a593Smuzhiyunswift_flush_cache_all: 26*4882a593Smuzhiyunswift_flush_cache_mm: 27*4882a593Smuzhiyunswift_flush_cache_range: 28*4882a593Smuzhiyunswift_flush_cache_page: 29*4882a593Smuzhiyunswift_flush_page_for_dma: 30*4882a593Smuzhiyunswift_flush_page_to_ram: 31*4882a593Smuzhiyun sethi %hi(0x2000), %o0 32*4882a593Smuzhiyun1: subcc %o0, 0x10, %o0 33*4882a593Smuzhiyun add %o0, %o0, %o1 34*4882a593Smuzhiyun sta %g0, [%o0] ASI_M_DATAC_TAG 35*4882a593Smuzhiyun bne 1b 36*4882a593Smuzhiyun sta %g0, [%o1] ASI_M_TXTC_TAG 37*4882a593Smuzhiyun retl 38*4882a593Smuzhiyun nop 39*4882a593Smuzhiyun#else 40*4882a593Smuzhiyun 41*4882a593Smuzhiyun .globl swift_flush_cache_all 42*4882a593Smuzhiyunswift_flush_cache_all: 43*4882a593Smuzhiyun WINDOW_FLUSH(%g4, %g5) 44*4882a593Smuzhiyun 45*4882a593Smuzhiyun /* Just clear out all the tags. */ 46*4882a593Smuzhiyun sethi %hi(16 * 1024), %o0 47*4882a593Smuzhiyun1: subcc %o0, 16, %o0 48*4882a593Smuzhiyun sta %g0, [%o0] ASI_M_TXTC_TAG 49*4882a593Smuzhiyun bne 1b 50*4882a593Smuzhiyun sta %g0, [%o0] ASI_M_DATAC_TAG 51*4882a593Smuzhiyun retl 52*4882a593Smuzhiyun nop 53*4882a593Smuzhiyun 54*4882a593Smuzhiyun .globl swift_flush_cache_mm 55*4882a593Smuzhiyunswift_flush_cache_mm: 56*4882a593Smuzhiyun ld [%o0 + AOFF_mm_context], %g2 57*4882a593Smuzhiyun cmp %g2, -1 58*4882a593Smuzhiyun be swift_flush_cache_mm_out 59*4882a593Smuzhiyun WINDOW_FLUSH(%g4, %g5) 60*4882a593Smuzhiyun rd %psr, %g1 61*4882a593Smuzhiyun andn %g1, PSR_ET, %g3 62*4882a593Smuzhiyun wr %g3, 0x0, %psr 63*4882a593Smuzhiyun nop 64*4882a593Smuzhiyun nop 65*4882a593Smuzhiyun mov SRMMU_CTX_REG, %g7 66*4882a593Smuzhiyun lda [%g7] ASI_M_MMUREGS, %g5 67*4882a593Smuzhiyun sta %g2, [%g7] ASI_M_MMUREGS 68*4882a593Smuzhiyun 69*4882a593Smuzhiyun#if 1 70*4882a593Smuzhiyun sethi %hi(0x2000), %o0 71*4882a593Smuzhiyun1: subcc %o0, 0x10, %o0 72*4882a593Smuzhiyun sta %g0, [%o0] ASI_M_FLUSH_CTX 73*4882a593Smuzhiyun bne 1b 74*4882a593Smuzhiyun nop 75*4882a593Smuzhiyun#else 76*4882a593Smuzhiyun clr %o0 77*4882a593Smuzhiyun or %g0, 2048, %g7 78*4882a593Smuzhiyun or %g0, 2048, %o1 79*4882a593Smuzhiyun add %o1, 2048, %o2 80*4882a593Smuzhiyun add %o2, 2048, %o3 81*4882a593Smuzhiyun mov 16, %o4 82*4882a593Smuzhiyun add %o4, 2048, %o5 83*4882a593Smuzhiyun add %o5, 2048, %g2 84*4882a593Smuzhiyun add %g2, 2048, %g3 85*4882a593Smuzhiyun1: sta %g0, [%o0 ] ASI_M_FLUSH_CTX 86*4882a593Smuzhiyun sta %g0, [%o0 + %o1] ASI_M_FLUSH_CTX 87*4882a593Smuzhiyun sta %g0, [%o0 + %o2] ASI_M_FLUSH_CTX 88*4882a593Smuzhiyun sta %g0, [%o0 + %o3] ASI_M_FLUSH_CTX 89*4882a593Smuzhiyun sta %g0, [%o0 + %o4] ASI_M_FLUSH_CTX 90*4882a593Smuzhiyun sta %g0, [%o0 + %o5] ASI_M_FLUSH_CTX 91*4882a593Smuzhiyun sta %g0, [%o0 + %g2] ASI_M_FLUSH_CTX 92*4882a593Smuzhiyun sta %g0, [%o0 + %g3] ASI_M_FLUSH_CTX 93*4882a593Smuzhiyun subcc %g7, 32, %g7 94*4882a593Smuzhiyun bne 1b 95*4882a593Smuzhiyun add %o0, 32, %o0 96*4882a593Smuzhiyun#endif 97*4882a593Smuzhiyun 98*4882a593Smuzhiyun mov SRMMU_CTX_REG, %g7 99*4882a593Smuzhiyun sta %g5, [%g7] ASI_M_MMUREGS 100*4882a593Smuzhiyun wr %g1, 0x0, %psr 101*4882a593Smuzhiyun nop 102*4882a593Smuzhiyun nop 103*4882a593Smuzhiyunswift_flush_cache_mm_out: 104*4882a593Smuzhiyun retl 105*4882a593Smuzhiyun nop 106*4882a593Smuzhiyun 107*4882a593Smuzhiyun .globl swift_flush_cache_range 108*4882a593Smuzhiyunswift_flush_cache_range: 109*4882a593Smuzhiyun ld [%o0 + VMA_VM_MM], %o0 110*4882a593Smuzhiyun sub %o2, %o1, %o2 111*4882a593Smuzhiyun sethi %hi(4096), %o3 112*4882a593Smuzhiyun cmp %o2, %o3 113*4882a593Smuzhiyun bgu swift_flush_cache_mm 114*4882a593Smuzhiyun nop 115*4882a593Smuzhiyun b 70f 116*4882a593Smuzhiyun nop 117*4882a593Smuzhiyun 118*4882a593Smuzhiyun .globl swift_flush_cache_page 119*4882a593Smuzhiyunswift_flush_cache_page: 120*4882a593Smuzhiyun ld [%o0 + VMA_VM_MM], %o0 121*4882a593Smuzhiyun70: 122*4882a593Smuzhiyun ld [%o0 + AOFF_mm_context], %g2 123*4882a593Smuzhiyun cmp %g2, -1 124*4882a593Smuzhiyun be swift_flush_cache_page_out 125*4882a593Smuzhiyun WINDOW_FLUSH(%g4, %g5) 126*4882a593Smuzhiyun rd %psr, %g1 127*4882a593Smuzhiyun andn %g1, PSR_ET, %g3 128*4882a593Smuzhiyun wr %g3, 0x0, %psr 129*4882a593Smuzhiyun nop 130*4882a593Smuzhiyun nop 131*4882a593Smuzhiyun mov SRMMU_CTX_REG, %g7 132*4882a593Smuzhiyun lda [%g7] ASI_M_MMUREGS, %g5 133*4882a593Smuzhiyun sta %g2, [%g7] ASI_M_MMUREGS 134*4882a593Smuzhiyun 135*4882a593Smuzhiyun andn %o1, (PAGE_SIZE - 1), %o1 136*4882a593Smuzhiyun#if 1 137*4882a593Smuzhiyun sethi %hi(0x1000), %o0 138*4882a593Smuzhiyun1: subcc %o0, 0x10, %o0 139*4882a593Smuzhiyun sta %g0, [%o1 + %o0] ASI_M_FLUSH_PAGE 140*4882a593Smuzhiyun bne 1b 141*4882a593Smuzhiyun nop 142*4882a593Smuzhiyun#else 143*4882a593Smuzhiyun or %g0, 512, %g7 144*4882a593Smuzhiyun or %g0, 512, %o0 145*4882a593Smuzhiyun add %o0, 512, %o2 146*4882a593Smuzhiyun add %o2, 512, %o3 147*4882a593Smuzhiyun add %o3, 512, %o4 148*4882a593Smuzhiyun add %o4, 512, %o5 149*4882a593Smuzhiyun add %o5, 512, %g3 150*4882a593Smuzhiyun add %g3, 512, %g4 151*4882a593Smuzhiyun1: sta %g0, [%o1 ] ASI_M_FLUSH_PAGE 152*4882a593Smuzhiyun sta %g0, [%o1 + %o0] ASI_M_FLUSH_PAGE 153*4882a593Smuzhiyun sta %g0, [%o1 + %o2] ASI_M_FLUSH_PAGE 154*4882a593Smuzhiyun sta %g0, [%o1 + %o3] ASI_M_FLUSH_PAGE 155*4882a593Smuzhiyun sta %g0, [%o1 + %o4] ASI_M_FLUSH_PAGE 156*4882a593Smuzhiyun sta %g0, [%o1 + %o5] ASI_M_FLUSH_PAGE 157*4882a593Smuzhiyun sta %g0, [%o1 + %g3] ASI_M_FLUSH_PAGE 158*4882a593Smuzhiyun sta %g0, [%o1 + %g4] ASI_M_FLUSH_PAGE 159*4882a593Smuzhiyun subcc %g7, 16, %g7 160*4882a593Smuzhiyun bne 1b 161*4882a593Smuzhiyun add %o1, 16, %o1 162*4882a593Smuzhiyun#endif 163*4882a593Smuzhiyun 164*4882a593Smuzhiyun mov SRMMU_CTX_REG, %g7 165*4882a593Smuzhiyun sta %g5, [%g7] ASI_M_MMUREGS 166*4882a593Smuzhiyun wr %g1, 0x0, %psr 167*4882a593Smuzhiyun nop 168*4882a593Smuzhiyun nop 169*4882a593Smuzhiyunswift_flush_cache_page_out: 170*4882a593Smuzhiyun retl 171*4882a593Smuzhiyun nop 172*4882a593Smuzhiyun 173*4882a593Smuzhiyun /* Swift is write-thru, however it is not 174*4882a593Smuzhiyun * I/O nor TLB-walk coherent. Also it has 175*4882a593Smuzhiyun * caches which are virtually indexed and tagged. 176*4882a593Smuzhiyun */ 177*4882a593Smuzhiyun .globl swift_flush_page_for_dma 178*4882a593Smuzhiyun .globl swift_flush_page_to_ram 179*4882a593Smuzhiyunswift_flush_page_for_dma: 180*4882a593Smuzhiyunswift_flush_page_to_ram: 181*4882a593Smuzhiyun andn %o0, (PAGE_SIZE - 1), %o1 182*4882a593Smuzhiyun#if 1 183*4882a593Smuzhiyun sethi %hi(0x1000), %o0 184*4882a593Smuzhiyun1: subcc %o0, 0x10, %o0 185*4882a593Smuzhiyun sta %g0, [%o1 + %o0] ASI_M_FLUSH_PAGE 186*4882a593Smuzhiyun bne 1b 187*4882a593Smuzhiyun nop 188*4882a593Smuzhiyun#else 189*4882a593Smuzhiyun or %g0, 512, %g7 190*4882a593Smuzhiyun or %g0, 512, %o0 191*4882a593Smuzhiyun add %o0, 512, %o2 192*4882a593Smuzhiyun add %o2, 512, %o3 193*4882a593Smuzhiyun add %o3, 512, %o4 194*4882a593Smuzhiyun add %o4, 512, %o5 195*4882a593Smuzhiyun add %o5, 512, %g3 196*4882a593Smuzhiyun add %g3, 512, %g4 197*4882a593Smuzhiyun1: sta %g0, [%o1 ] ASI_M_FLUSH_PAGE 198*4882a593Smuzhiyun sta %g0, [%o1 + %o0] ASI_M_FLUSH_PAGE 199*4882a593Smuzhiyun sta %g0, [%o1 + %o2] ASI_M_FLUSH_PAGE 200*4882a593Smuzhiyun sta %g0, [%o1 + %o3] ASI_M_FLUSH_PAGE 201*4882a593Smuzhiyun sta %g0, [%o1 + %o4] ASI_M_FLUSH_PAGE 202*4882a593Smuzhiyun sta %g0, [%o1 + %o5] ASI_M_FLUSH_PAGE 203*4882a593Smuzhiyun sta %g0, [%o1 + %g3] ASI_M_FLUSH_PAGE 204*4882a593Smuzhiyun sta %g0, [%o1 + %g4] ASI_M_FLUSH_PAGE 205*4882a593Smuzhiyun subcc %g7, 16, %g7 206*4882a593Smuzhiyun bne 1b 207*4882a593Smuzhiyun add %o1, 16, %o1 208*4882a593Smuzhiyun#endif 209*4882a593Smuzhiyun retl 210*4882a593Smuzhiyun nop 211*4882a593Smuzhiyun#endif 212*4882a593Smuzhiyun 213*4882a593Smuzhiyun .globl swift_flush_sig_insns 214*4882a593Smuzhiyunswift_flush_sig_insns: 215*4882a593Smuzhiyun flush %o1 216*4882a593Smuzhiyun retl 217*4882a593Smuzhiyun flush %o1 + 4 218*4882a593Smuzhiyun 219*4882a593Smuzhiyun .globl swift_flush_tlb_mm 220*4882a593Smuzhiyun .globl swift_flush_tlb_range 221*4882a593Smuzhiyun .globl swift_flush_tlb_all 222*4882a593Smuzhiyunswift_flush_tlb_range: 223*4882a593Smuzhiyun ld [%o0 + VMA_VM_MM], %o0 224*4882a593Smuzhiyunswift_flush_tlb_mm: 225*4882a593Smuzhiyun ld [%o0 + AOFF_mm_context], %g2 226*4882a593Smuzhiyun cmp %g2, -1 227*4882a593Smuzhiyun be swift_flush_tlb_all_out 228*4882a593Smuzhiyunswift_flush_tlb_all: 229*4882a593Smuzhiyun mov 0x400, %o1 230*4882a593Smuzhiyun sta %g0, [%o1] ASI_M_FLUSH_PROBE 231*4882a593Smuzhiyunswift_flush_tlb_all_out: 232*4882a593Smuzhiyun retl 233*4882a593Smuzhiyun nop 234*4882a593Smuzhiyun 235*4882a593Smuzhiyun .globl swift_flush_tlb_page 236*4882a593Smuzhiyunswift_flush_tlb_page: 237*4882a593Smuzhiyun ld [%o0 + VMA_VM_MM], %o0 238*4882a593Smuzhiyun mov SRMMU_CTX_REG, %g1 239*4882a593Smuzhiyun ld [%o0 + AOFF_mm_context], %o3 240*4882a593Smuzhiyun andn %o1, (PAGE_SIZE - 1), %o1 241*4882a593Smuzhiyun cmp %o3, -1 242*4882a593Smuzhiyun be swift_flush_tlb_page_out 243*4882a593Smuzhiyun nop 244*4882a593Smuzhiyun#if 1 245*4882a593Smuzhiyun mov 0x400, %o1 246*4882a593Smuzhiyun sta %g0, [%o1] ASI_M_FLUSH_PROBE 247*4882a593Smuzhiyun#else 248*4882a593Smuzhiyun lda [%g1] ASI_M_MMUREGS, %g5 249*4882a593Smuzhiyun sta %o3, [%g1] ASI_M_MMUREGS 250*4882a593Smuzhiyun sta %g0, [%o1] ASI_M_FLUSH_PAGE /* rem. virt. cache. prot. */ 251*4882a593Smuzhiyun sta %g0, [%o1] ASI_M_FLUSH_PROBE 252*4882a593Smuzhiyun sta %g5, [%g1] ASI_M_MMUREGS 253*4882a593Smuzhiyun#endif 254*4882a593Smuzhiyunswift_flush_tlb_page_out: 255*4882a593Smuzhiyun retl 256*4882a593Smuzhiyun nop 257