cache_gcc.S 5.1 KB

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