cp15_gcc.S 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. /*
  2. * Copyright (c) 2011-2022, Shanghai Real-Thread Electronic Technology Co.,Ltd
  3. *
  4. * Change Logs:
  5. * Date Author Notes
  6. * 2022-08-29 RT-Thread first version
  7. */
  8. .globl rt_cpu_get_smp_id
  9. rt_cpu_get_smp_id:
  10. mrc p15, #0, r0, c0, c0, #5
  11. bx lr
  12. .globl rt_cpu_vector_set_base
  13. rt_cpu_vector_set_base:
  14. /* clear SCTRL.V to customize the vector address */
  15. mrc p15, #0, r1, c1, c0, #0
  16. bic r1, #(1 << 13)
  17. mcr p15, #0, r1, c1, c0, #0
  18. /* set up the vector address */
  19. mcr p15, #0, r0, c12, c0, #0
  20. dsb
  21. bx lr
  22. .globl rt_hw_cpu_dcache_enable
  23. rt_hw_cpu_dcache_enable:
  24. mrc p15, #0, r0, c1, c0, #0
  25. orr r0, r0, #0x00000004
  26. mcr p15, #0, r0, c1, c0, #0
  27. bx lr
  28. .globl rt_hw_cpu_icache_enable
  29. rt_hw_cpu_icache_enable:
  30. mrc p15, #0, r0, c1, c0, #0
  31. orr r0, r0, #0x00001000
  32. mcr p15, #0, r0, c1, c0, #0
  33. bx lr
  34. _FLD_MAX_WAY:
  35. .word 0x3ff
  36. _FLD_MAX_IDX:
  37. .word 0x7fff
  38. .globl rt_cpu_dcache_clean_flush
  39. rt_cpu_dcache_clean_flush:
  40. stmfd sp!, {r0-r12, lr}
  41. bl v7_flush_dcache_all
  42. mov r0, #0
  43. mcr p15, 0, r0, c7, c5, 0 @ I+BTB cache invalidate
  44. dsb
  45. isb
  46. ldmfd sp!, {r0-r12, lr}
  47. mov pc, lr
  48. v7_flush_dcache_all:
  49. dmb @ ensure ordering with previous memory accesses
  50. mrc p15, 1, r0, c0, c0, 1 @ read clidr
  51. ands r3, r0, #0x7000000 @ extract loc from clidr
  52. mov r3, r3, lsr #23 @ left align loc bit field
  53. beq finished @ if loc is 0, then no need to clean
  54. mov r10, #0 @ start clean at cache level 0
  55. loop1:
  56. add r2, r10, r10, lsr #1 @ work out 3x current cache level
  57. mov r1, r0, lsr r2 @ extract cache type bits from clidr
  58. and r1, r1, #7 @ mask of the bits for current cache only
  59. cmp r1, #2 @ see what cache we have at this level
  60. blt skip @ skip if no cache, or just i-cache
  61. mcr p15, 2, r10, c0, c0, 0 @ select current cache level in cssr
  62. isb @ isb to sych the new cssr&csidr
  63. mrc p15, 1, r1, c0, c0, 0 @ read the new csidr
  64. and r2, r1, #7 @ extract the length of the cache lines
  65. add r2, r2, #4 @ add 4 (line length offset)
  66. ldr r4, =0x3ff
  67. ands r4, r4, r1, lsr #3 @ find maximum number on the way size
  68. clz r5, r4 @ find bit position of way size increment
  69. ldr r7, =0x7fff
  70. ands r7, r7, r1, lsr #13 @ extract max number of the index size
  71. loop2:
  72. mov r9, r4 @ create working copy of max way size
  73. loop3:
  74. orr r11, r10, r9, lsl r5 @ factor way and cache number into r11
  75. orr r11, r11, r7, lsl r2 @ factor index number into r11
  76. mcr p15, 0, r11, c7, c14, 2 @ clean & invalidate by set/way
  77. subs r9, r9, #1 @ decrement the way
  78. bge loop3
  79. subs r7, r7, #1 @ decrement the index
  80. bge loop2
  81. skip:
  82. add r10, r10, #2 @ increment cache number
  83. cmp r3, r10
  84. bgt loop1
  85. finished:
  86. mov r10, #0 @ swith back to cache level 0
  87. mcr p15, 2, r10, c0, c0, 0 @ select current cache level in cssr
  88. dsb
  89. isb
  90. mov pc, lr
  91. #if 0
  92. push {r4-r11}
  93. dmb
  94. mrc p15, #1, r0, c0, c0, #1 @ read clid register
  95. ands r3, r0, #0x7000000 @ get level of coherency
  96. mov r3, r3, lsr #23
  97. beq finished
  98. mov r10, #0
  99. loop1:
  100. add r2, r10, r10, lsr #1
  101. mov r1, r0, lsr r2
  102. and r1, r1, #7
  103. cmp r1, #2
  104. blt skip
  105. mcr p15, #2, r10, c0, c0, #0
  106. isb
  107. mrc p15, #1, r1, c0, c0, #0
  108. and r2, r1, #7
  109. add r2, r2, #4
  110. ldr r4, _FLD_MAX_WAY
  111. ands r4, r4, r1, lsr #3
  112. clz r5, r4
  113. ldr r7, _FLD_MAX_IDX
  114. ands r7, r7, r1, lsr #13
  115. loop2:
  116. mov r9, r4
  117. loop3:
  118. orr r11, r10, r9, lsl r5
  119. orr r11, r11, r7, lsl r2
  120. mcr p15, #0, r11, c7, c14, #2
  121. subs r9, r9, #1
  122. bge loop3
  123. subs r7, r7, #1
  124. bge loop2
  125. skip:
  126. add r10, r10, #2
  127. cmp r3, r10
  128. bgt loop1
  129. finished:
  130. dsb
  131. isb
  132. pop {r4-r11}
  133. bx lr
  134. #endif
  135. .globl rt_cpu_icache_flush
  136. rt_cpu_icache_flush:
  137. mov r0, #0
  138. mcr p15, 0, r0, c7, c5, 0 @ I+BTB cache invalidate
  139. dsb
  140. isb
  141. bx lr
  142. .globl rt_hw_cpu_dcache_disable
  143. rt_hw_cpu_dcache_disable:
  144. push {r4-r11, lr}
  145. bl rt_cpu_dcache_clean_flush
  146. mrc p15, #0, r0, c1, c0, #0
  147. bic r0, r0, #0x00000004
  148. mcr p15, #0, r0, c1, c0, #0
  149. pop {r4-r11, lr}
  150. bx lr
  151. .globl rt_hw_cpu_icache_disable
  152. rt_hw_cpu_icache_disable:
  153. mrc p15, #0, r0, c1, c0, #0
  154. bic r0, r0, #0x00001000
  155. mcr p15, #0, r0, c1, c0, #0
  156. bx lr