cache_gcc.S 5.2 KB

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