xref: /nrf52832-nimble/rt-thread/libcpu/mips/loongson_1b/cache_gcc.S (revision 104654410c56c573564690304ae786df310c91fc)
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