cache_gcc.S 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  1. /*
  2. * Copyright (c) 2006-2019, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2010-05-17 swkyer first version
  9. * 2010-09-11 bernard port to Loongson SoC3210
  10. * 2011-08-08 lgnq port to Loongson LS1B
  11. * 2015-07-08 chinesebear port to Loongson LS1C
  12. * 2019-07-19 Zhou Yanjie clean up code
  13. */
  14. #ifndef __ASSEMBLY__
  15. #define __ASSEMBLY__
  16. #endif
  17. #include "../common/mipsregs.h"
  18. #include "../common/mips_def.h"
  19. #include "../common/asm.h"
  20. #include "cache.h"
  21. .ent cache_init
  22. .global cache_init
  23. .set noreorder
  24. cache_init:
  25. move t1,ra
  26. ####part 2####
  27. cache_detect_4way:
  28. mfc0 t4, CP0_CONFIG
  29. andi t5, t4, 0x0e00
  30. srl t5, t5, 9 #ic
  31. andi t6, t4, 0x01c0
  32. srl t6, t6, 6 #dc
  33. addiu t8, $0, 1
  34. addiu t9, $0, 2
  35. #set dcache way
  36. beq t6, $0, cache_d1way
  37. addiu t7, $0, 1 #1 way
  38. beq t6, t8, cache_d2way
  39. addiu t7, $0, 2 #2 way
  40. beq $0, $0, cache_d4way
  41. addiu t7, $0, 4 #4 way
  42. cache_d1way:
  43. beq $0, $0, 1f
  44. addiu t6, t6, 12 #1 way
  45. cache_d2way:
  46. beq $0, $0, 1f
  47. addiu t6, t6, 11 #2 way
  48. cache_d4way:
  49. addiu t6, t6, 10 #4 way (10), 2 way(11), 1 way(12)
  50. 1: #set icache way
  51. beq t5, $0, cache_i1way
  52. addiu t3, $0, 1 #1 way
  53. beq t5, t8, cache_i2way
  54. addiu t3, $0, 2 #2 way
  55. beq $0, $0, cache_i4way
  56. addiu t3, $0, 4 #4 way
  57. cache_i1way:
  58. beq $0, $0, 1f
  59. addiu t5, t5, 12
  60. cache_i2way:
  61. beq $0, $0, 1f
  62. addiu t5, t5, 11
  63. cache_i4way:
  64. addiu t5, t5, 10 #4 way (10), 2 way(11), 1 way(12)
  65. 1: addiu t4, $0, 1
  66. sllv t6, t4, t6
  67. sllv t5, t4, t5
  68. #if 0
  69. la t0, memvar
  70. sw t7, 0x0(t0) #ways
  71. sw t5, 0x4(t0) #icache size
  72. sw t6, 0x8(t0) #dcache size
  73. #endif
  74. ####part 3####
  75. .set mips3
  76. lui a0, 0x8000
  77. addu a1, $0, t5
  78. addu a2, $0, t6
  79. cache_init_d2way:
  80. #a0=0x80000000, a1=icache_size, a2=dcache_size
  81. #a3, v0 and v1 used as local registers
  82. mtc0 $0, CP0_TAGHI
  83. addu v0, $0, a0
  84. addu v1, a0, a2
  85. 1: slt a3, v0, v1
  86. beq a3, $0, 1f
  87. nop
  88. mtc0 $0, CP0_TAGLO
  89. beq t7, 1, 4f
  90. cache Index_Store_Tag_D, 0x0(v0) # 1 way
  91. beq t7, 2 ,4f
  92. cache Index_Store_Tag_D, 0x1(v0) # 2 way
  93. cache Index_Store_Tag_D, 0x2(v0) # 4 way
  94. cache Index_Store_Tag_D, 0x3(v0)
  95. 4: beq $0, $0, 1b
  96. addiu v0, v0, 0x20
  97. 1:
  98. cache_flush_i2way:
  99. addu v0, $0, a0
  100. addu v1, a0, a1
  101. 1: slt a3, v0, v1
  102. beq a3, $0, 1f
  103. nop
  104. beq t3, 1, 4f
  105. cache Index_Invalidate_I, 0x0(v0) # 1 way
  106. beq t3, 2, 4f
  107. cache Index_Invalidate_I, 0x1(v0) # 2 way
  108. cache Index_Invalidate_I, 0x2(v0)
  109. cache Index_Invalidate_I, 0x3(v0) # 4 way
  110. 4: beq $0, $0, 1b
  111. addiu v0, v0, 0x20
  112. 1:
  113. cache_flush_d2way:
  114. addu v0, $0, a0
  115. addu v1, a0, a2
  116. 1: slt a3, v0, v1
  117. beq a3, $0, 1f
  118. nop
  119. beq t7, 1, 4f
  120. cache Index_Writeback_Inv_D, 0x0(v0) #1 way
  121. beq t7, 2, 4f
  122. cache Index_Writeback_Inv_D, 0x1(v0) # 2 way
  123. cache Index_Writeback_Inv_D, 0x2(v0)
  124. cache Index_Writeback_Inv_D, 0x3(v0) # 4 way
  125. 4: beq $0, $0, 1b
  126. addiu v0, v0, 0x20
  127. 1:
  128. cache_init_finish:
  129. jr t1
  130. nop
  131. .set reorder
  132. .end cache_init
  133. ###########################
  134. # Enable CPU cache #
  135. ###########################
  136. LEAF(enable_cpu_cache)
  137. .set noreorder
  138. mfc0 t0, CP0_CONFIG
  139. nop
  140. and t0, ~0x03
  141. or t0, 0x03
  142. mtc0 t0, CP0_CONFIG
  143. nop
  144. .set reorder
  145. j ra
  146. END (enable_cpu_cache)
  147. ###########################
  148. # disable CPU cache #
  149. ###########################
  150. LEAF(disable_cpu_cache)
  151. .set noreorder
  152. mfc0 t0, CP0_CONFIG
  153. nop
  154. and t0, ~0x03
  155. or t0, 0x2
  156. mtc0 t0, CP0_CONFIG
  157. nop
  158. .set reorder
  159. j ra
  160. END (disable_cpu_cache)
  161. /**********************************/
  162. /* Invalidate Instruction Cache */
  163. /**********************************/
  164. LEAF(Clear_TagLo)
  165. .set noreorder
  166. mtc0 zero, CP0_TAGLO
  167. nop
  168. .set reorder
  169. j ra
  170. END(Clear_TagLo)
  171. .set mips3
  172. /**********************************/
  173. /* Invalidate Instruction Cache */
  174. /**********************************/
  175. LEAF(Invalidate_Icache_Ls1c)
  176. .set noreorder
  177. cache Index_Invalidate_I,0(a0)
  178. cache Index_Invalidate_I,1(a0)
  179. cache Index_Invalidate_I,2(a0)
  180. cache Index_Invalidate_I,3(a0)
  181. .set reorder
  182. j ra
  183. END(Invalidate_Icache_Ls1c)
  184. /**********************************/
  185. /* Invalidate Data Cache */
  186. /**********************************/
  187. LEAF(Invalidate_Dcache_ClearTag_Ls1c)
  188. .set noreorder
  189. cache Index_Store_Tag_D, 0(a0) # BDSLOT: clear tag
  190. cache Index_Store_Tag_D, 1(a0) # BDSLOT: clear tag
  191. .set reorder
  192. j ra
  193. END(Invalidate_Dcache_ClearTag_Ls1c)
  194. LEAF(Invalidate_Dcache_Fill_Ls1c)
  195. .set noreorder
  196. cache Index_Writeback_Inv_D, 0(a0) # BDSLOT: clear tag
  197. cache Index_Writeback_Inv_D, 1(a0) # BDSLOT: clear tag
  198. .set reorder
  199. j ra
  200. END(Invalidate_Dcache_Fill_Ls1c)
  201. LEAF(Writeback_Invalidate_Dcache)
  202. .set noreorder
  203. cache Hit_Writeback_Inv_D, (a0)
  204. .set reorder
  205. j ra
  206. END(Writeback_Invalidate_Dcache)
  207. .set mips0