1*10465441SEvalZero/* 2*10465441SEvalZero * File : cache_gcc.S 3*10465441SEvalZero * This file is part of RT-Thread RTOS 4*10465441SEvalZero * COPYRIGHT (C) 2006 - 2011, RT-Thread Development Team 5*10465441SEvalZero * 6*10465441SEvalZero * The license and distribution terms for this file may be 7*10465441SEvalZero * found in the file LICENSE in this distribution or at 8*10465441SEvalZero * http://www.rt-thread.org/license/LICENSE 9*10465441SEvalZero * 10*10465441SEvalZero * Change Logs: 11*10465441SEvalZero * Date Author Notes 12*10465441SEvalZero * 2010-05-17 swkyer first version 13*10465441SEvalZero * 2010-09-11 bernard port to Loongson SoC3210 14*10465441SEvalZero * 2011-08-08 lgnq port to Loongson LS1B 15*10465441SEvalZero */ 16*10465441SEvalZero#include "../common/mipsregs.h" 17*10465441SEvalZero#include "../common/mips.inc" 18*10465441SEvalZero#include "../common/asm.h" 19*10465441SEvalZero#include "cache.h" 20*10465441SEvalZero 21*10465441SEvalZero .ent cache_init 22*10465441SEvalZero .global cache_init 23*10465441SEvalZero .set noreorder 24*10465441SEvalZerocache_init: 25*10465441SEvalZero move t1,ra 26*10465441SEvalZero####part 2#### 27*10465441SEvalZerocache_detect_4way: 28*10465441SEvalZero mfc0 t4, CP0_CONFIG 29*10465441SEvalZero andi t5, t4, 0x0e00 30*10465441SEvalZero srl t5, t5, 9 #ic 31*10465441SEvalZero andi t6, t4, 0x01c0 32*10465441SEvalZero srl t6, t6, 6 #dc 33*10465441SEvalZero addiu t8, $0, 1 34*10465441SEvalZero addiu t9, $0, 2 35*10465441SEvalZero #set dcache way 36*10465441SEvalZero beq t6, $0, cache_d1way 37*10465441SEvalZero addiu t7, $0, 1 #1 way 38*10465441SEvalZero beq t6, t8, cache_d2way 39*10465441SEvalZero addiu t7, $0, 2 #2 way 40*10465441SEvalZero beq $0, $0, cache_d4way 41*10465441SEvalZero addiu t7, $0, 4 #4 way 42*10465441SEvalZerocache_d1way: 43*10465441SEvalZero beq $0, $0, 1f 44*10465441SEvalZero addiu t6, t6, 12 #1 way 45*10465441SEvalZerocache_d2way: 46*10465441SEvalZero beq $0, $0, 1f 47*10465441SEvalZero addiu t6, t6, 11 #2 way 48*10465441SEvalZerocache_d4way: 49*10465441SEvalZero addiu t6, t6, 10 #4 way (10), 2 way(11), 1 way(12) 50*10465441SEvalZero1: #set icache way 51*10465441SEvalZero beq t5, $0, cache_i1way 52*10465441SEvalZero addiu t3, $0, 1 #1 way 53*10465441SEvalZero beq t5, t8, cache_i2way 54*10465441SEvalZero addiu t3, $0, 2 #2 way 55*10465441SEvalZero beq $0, $0, cache_i4way 56*10465441SEvalZero addiu t3, $0, 4 #4 way 57*10465441SEvalZerocache_i1way: 58*10465441SEvalZero beq $0, $0, 1f 59*10465441SEvalZero addiu t5, t5, 12 60*10465441SEvalZerocache_i2way: 61*10465441SEvalZero beq $0, $0, 1f 62*10465441SEvalZero addiu t5, t5, 11 63*10465441SEvalZerocache_i4way: 64*10465441SEvalZero addiu t5, t5, 10 #4 way (10), 2 way(11), 1 way(12) 65*10465441SEvalZero 66*10465441SEvalZero1: addiu t4, $0, 1 67*10465441SEvalZero sllv t6, t4, t6 68*10465441SEvalZero sllv t5, t4, t5 69*10465441SEvalZero#if 0 70*10465441SEvalZero la t0, memvar 71*10465441SEvalZero sw t7, 0x0(t0) #ways 72*10465441SEvalZero sw t5, 0x4(t0) #icache size 73*10465441SEvalZero sw t6, 0x8(t0) #dcache size 74*10465441SEvalZero#endif 75*10465441SEvalZero####part 3#### 76*10465441SEvalZero .set mips3 77*10465441SEvalZero lui a0, 0x8000 78*10465441SEvalZero addu a1, $0, t5 79*10465441SEvalZero addu a2, $0, t6 80*10465441SEvalZerocache_init_d2way: 81*10465441SEvalZero#a0=0x80000000, a1=icache_size, a2=dcache_size 82*10465441SEvalZero#a3, v0 and v1 used as local registers 83*10465441SEvalZero mtc0 $0, CP0_TAGHI 84*10465441SEvalZero addu v0, $0, a0 85*10465441SEvalZero addu v1, a0, a2 86*10465441SEvalZero1: slt a3, v0, v1 87*10465441SEvalZero beq a3, $0, 1f 88*10465441SEvalZero nop 89*10465441SEvalZero mtc0 $0, CP0_TAGLO 90*10465441SEvalZero beq t7, 1, 4f 91*10465441SEvalZero cache Index_Store_Tag_D, 0x0(v0) # 1 way 92*10465441SEvalZero beq t7, 2 ,4f 93*10465441SEvalZero cache Index_Store_Tag_D, 0x1(v0) # 2 way 94*10465441SEvalZero cache Index_Store_Tag_D, 0x2(v0) # 4 way 95*10465441SEvalZero cache Index_Store_Tag_D, 0x3(v0) 96*10465441SEvalZero4: beq $0, $0, 1b 97*10465441SEvalZero addiu v0, v0, 0x20 98*10465441SEvalZero1: 99*10465441SEvalZerocache_flush_i2way: 100*10465441SEvalZero addu v0, $0, a0 101*10465441SEvalZero addu v1, a0, a1 102*10465441SEvalZero1: slt a3, v0, v1 103*10465441SEvalZero beq a3, $0, 1f 104*10465441SEvalZero nop 105*10465441SEvalZero beq t3, 1, 4f 106*10465441SEvalZero cache Index_Invalidate_I, 0x0(v0) # 1 way 107*10465441SEvalZero beq t3, 2, 4f 108*10465441SEvalZero cache Index_Invalidate_I, 0x1(v0) # 2 way 109*10465441SEvalZero cache Index_Invalidate_I, 0x2(v0) 110*10465441SEvalZero cache Index_Invalidate_I, 0x3(v0) # 4 way 111*10465441SEvalZero4: beq $0, $0, 1b 112*10465441SEvalZero addiu v0, v0, 0x20 113*10465441SEvalZero1: 114*10465441SEvalZerocache_flush_d2way: 115*10465441SEvalZero addu v0, $0, a0 116*10465441SEvalZero addu v1, a0, a2 117*10465441SEvalZero1: slt a3, v0, v1 118*10465441SEvalZero beq a3, $0, 1f 119*10465441SEvalZero nop 120*10465441SEvalZero beq t7, 1, 4f 121*10465441SEvalZero cache Index_Writeback_Inv_D, 0x0(v0) #1 way 122*10465441SEvalZero beq t7, 2, 4f 123*10465441SEvalZero cache Index_Writeback_Inv_D, 0x1(v0) # 2 way 124*10465441SEvalZero cache Index_Writeback_Inv_D, 0x2(v0) 125*10465441SEvalZero cache Index_Writeback_Inv_D, 0x3(v0) # 4 way 126*10465441SEvalZero4: beq $0, $0, 1b 127*10465441SEvalZero addiu v0, v0, 0x20 128*10465441SEvalZero1: 129*10465441SEvalZerocache_init_finish: 130*10465441SEvalZero jr t1 131*10465441SEvalZero nop 132*10465441SEvalZero .set reorder 133*10465441SEvalZero .end cache_init 134*10465441SEvalZero 135*10465441SEvalZero########################### 136*10465441SEvalZero# Enable CPU cache # 137*10465441SEvalZero########################### 138*10465441SEvalZero 139*10465441SEvalZeroLEAF(enable_cpu_cache) 140*10465441SEvalZero .set noreorder 141*10465441SEvalZero mfc0 t0, CP0_CONFIG 142*10465441SEvalZero nop 143*10465441SEvalZero and t0, ~0x03 144*10465441SEvalZero or t0, 0x03 145*10465441SEvalZero mtc0 t0, CP0_CONFIG 146*10465441SEvalZero nop 147*10465441SEvalZero .set reorder 148*10465441SEvalZero j ra 149*10465441SEvalZeroEND (enable_cpu_cache) 150*10465441SEvalZero 151*10465441SEvalZero########################### 152*10465441SEvalZero# disable CPU cache # 153*10465441SEvalZero########################### 154*10465441SEvalZero 155*10465441SEvalZeroLEAF(disable_cpu_cache) 156*10465441SEvalZero .set noreorder 157*10465441SEvalZero mfc0 t0, CP0_CONFIG 158*10465441SEvalZero nop 159*10465441SEvalZero and t0, ~0x03 160*10465441SEvalZero or t0, 0x2 161*10465441SEvalZero mtc0 t0, CP0_CONFIG 162*10465441SEvalZero nop 163*10465441SEvalZero .set reorder 164*10465441SEvalZero j ra 165*10465441SEvalZeroEND (disable_cpu_cache) 166*10465441SEvalZero 167*10465441SEvalZero/**********************************/ 168*10465441SEvalZero/* Invalidate Instruction Cache */ 169*10465441SEvalZero/**********************************/ 170*10465441SEvalZeroLEAF(Clear_TagLo) 171*10465441SEvalZero .set noreorder 172*10465441SEvalZero mtc0 zero, CP0_TAGLO 173*10465441SEvalZero nop 174*10465441SEvalZero .set reorder 175*10465441SEvalZero j ra 176*10465441SEvalZeroEND(Clear_TagLo) 177*10465441SEvalZero 178*10465441SEvalZero .set mips3 179*10465441SEvalZero/**********************************/ 180*10465441SEvalZero/* Invalidate Instruction Cache */ 181*10465441SEvalZero/**********************************/ 182*10465441SEvalZeroLEAF(Invalidate_Icache_Ls1b) 183*10465441SEvalZero .set noreorder 184*10465441SEvalZero cache Index_Invalidate_I,0(a0) 185*10465441SEvalZero cache Index_Invalidate_I,1(a0) 186*10465441SEvalZero cache Index_Invalidate_I,2(a0) 187*10465441SEvalZero cache Index_Invalidate_I,3(a0) 188*10465441SEvalZero .set reorder 189*10465441SEvalZero j ra 190*10465441SEvalZeroEND(Invalidate_Icache_Ls1b) 191*10465441SEvalZero 192*10465441SEvalZero/**********************************/ 193*10465441SEvalZero/* Invalidate Data Cache */ 194*10465441SEvalZero/**********************************/ 195*10465441SEvalZeroLEAF(Invalidate_Dcache_ClearTag_Ls1b) 196*10465441SEvalZero .set noreorder 197*10465441SEvalZero cache Index_Store_Tag_D, 0(a0) # BDSLOT: clear tag 198*10465441SEvalZero cache Index_Store_Tag_D, 1(a0) # BDSLOT: clear tag 199*10465441SEvalZero .set reorder 200*10465441SEvalZero j ra 201*10465441SEvalZeroEND(Invalidate_Dcache_ClearTag_Ls1b) 202*10465441SEvalZero 203*10465441SEvalZeroLEAF(Invalidate_Dcache_Fill_Ls1b) 204*10465441SEvalZero .set noreorder 205*10465441SEvalZero cache Index_Writeback_Inv_D, 0(a0) # BDSLOT: clear tag 206*10465441SEvalZero cache Index_Writeback_Inv_D, 1(a0) # BDSLOT: clear tag 207*10465441SEvalZero .set reorder 208*10465441SEvalZero j ra 209*10465441SEvalZeroEND(Invalidate_Dcache_Fill_Ls1b) 210*10465441SEvalZero 211*10465441SEvalZeroLEAF(Writeback_Invalidate_Dcache) 212*10465441SEvalZero .set noreorder 213*10465441SEvalZero cache Hit_Writeback_Inv_D, (a0) 214*10465441SEvalZero .set reorder 215*10465441SEvalZero j ra 216*10465441SEvalZeroEND(Writeback_Invalidate_Dcache) 217*10465441SEvalZero .set mips0 218