cache_gcc.S 5.0 KB

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