cache_gcc.S 4.6 KB

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