cpu_dormant-v7.S 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285
  1. .global write_cntpctl
  2. write_cntpctl:
  3. .func
  4. mcr p15, 0, r0, c14, c2, 1
  5. bx lr
  6. .endfunc
  7. .global read_cntpctl
  8. read_cntpctl:
  9. .func
  10. mrc p15, 0, r0, c14, c2, 1
  11. bx lr
  12. .endfunc
  13. .global read_cpu_id
  14. read_cpu_id:
  15. .func
  16. mrc p15, 0, r0, c0, c0, 5
  17. ands r0, r0, #0xff
  18. bx lr
  19. .endfunc
  20. .global read_cluster_id
  21. read_cluster_id:
  22. .func
  23. mrc p15, 0, r0, c0, c0, 5
  24. lsr r0, r0, #0x8
  25. ands r0, r0, #0xff
  26. bx lr
  27. .endfunc
  28. .global mt_save_generic_timer
  29. mt_save_generic_timer:
  30. .func
  31. mrc p15, 0, r2, c14, c2, 1 @ read CNTP_CTL
  32. mrc p15, 0, r3, c14, c2, 0 @ read CNTP_TVAL
  33. mrc p15, 0, r12, c14, c1, 0 @ read CNTKCTL
  34. stm r0!, {r2, r3, r12}
  35. bx lr
  36. .endfunc
  37. .global mt_restore_generic_timer
  38. mt_restore_generic_timer:
  39. .func
  40. ldm r0!, {r2, r3, r12}
  41. mcr p15, 0, r3, c14, c2, 0 @ write CNTP_TVAL
  42. mcr p15, 0, r12, c14, c1, 0 @ write CNTKCTL
  43. mcr p15, 0, r2, c14, c2, 1 @ write CNTP_CTL
  44. bx lr
  45. .endfunc
  46. .global mt_save_l2ctlr
  47. mt_save_l2ctlr:
  48. .func
  49. mrc p15, 1, r0, c9, c0, 2
  50. isb
  51. dsb
  52. bx lr
  53. .endfunc
  54. .global mt_restore_l2ctlr
  55. mt_restore_l2ctlr:
  56. .func
  57. isb
  58. dsb
  59. mrc p15, 1, r1, c9, c0, 2
  60. dsb
  61. isb
  62. ubfx r1, r1, #18, #14
  63. orr r1, r1, r0
  64. mcr p15, 1, r1, c9, c0, 2
  65. dsb
  66. isb
  67. bx lr
  68. .endfunc
  69. .global mt_goto_cpu_resume
  70. mt_goto_cpu_resume:
  71. .func
  72. adr r1, 1f
  73. ldr r2, [r1]
  74. sub r2, r0, r2
  75. add r3, r1, r2
  76. ldr r3, [r3]
  77. bx r3
  78. 1: .long
  79. bx lr
  80. .endfunc
  81. .global mt_get_data_nommu
  82. mt_get_data_nommu:
  83. .func
  84. adr r2, 1f
  85. ldr r3, [r2]
  86. sub r3, r1, r2
  87. add r4, r2, r3
  88. ldr r0, [r4]
  89. b 3f
  90. 1: .long
  91. 3: bx lr
  92. .endfunc
  93. .global smp
  94. smp:
  95. .func
  96. isb
  97. dsb
  98. mrc p15, 0, r0, c1, c0, 1
  99. isb
  100. dsb
  101. orr r0, r0, #0x00000040
  102. mcr p15, 0, r0, c1, c0, 1
  103. isb
  104. dsb
  105. bx lr
  106. .endfunc
  107. .global amp
  108. amp:
  109. .func
  110. clrex
  111. isb
  112. dsb
  113. mrc p15, 0, r0, c1, c0, 1
  114. isb
  115. dsb
  116. bic r0, r0, #0x00000040
  117. mcr p15, 0, r0, c1, c0, 1
  118. isb
  119. dsb
  120. bx lr
  121. .endfunc
  122. .global disable_dcache_safe
  123. disable_dcache_safe:
  124. .func
  125. mrc p15, 0, r1, c1, c0, 0
  126. dsb
  127. bic r1, r1, #4
  128. mcr p15, 0, r1, c1, c0, 0
  129. dsb
  130. isb
  131. mcr p15, 0, r1, c8, c7, 1
  132. dsb
  133. @ flush LOUIS
  134. mrc p15, 1, r1, c0, c0, 1 @ read clidr
  135. ands r4, r1, #0x7000000 @ extract loc from clidr
  136. mov r4, r4, lsr #23 @ left align loc bit field
  137. beq L1_finished @ if loc is 0, then no need to clean
  138. mov r10, #0 @ start clean at cache level 1
  139. L1_loop1:
  140. add r3, r10, r10, lsr #1 @ work out 3x current cache level
  141. mov r2, r1, lsr r3 @ extract cache type bits from clidr
  142. and r2, r2, #7 @ mask of the bits for current cache only
  143. cmp r2, #2 @ see what cache we have at this level
  144. blt L1_skip @ skip if no cache, or just i-cache
  145. mcr p15, 2, r10, c0, c0, 0 @ select current cache level in cssr
  146. isb @ isb to sych the new cssr&csidr
  147. mrc p15, 1, r2, c0, c0, 0 @ read the new csidr
  148. and r3, r2, #7 @ extract the length of the cache lines
  149. add r3, r3, #4 @ add 4 (line length offset)
  150. @ldr r5, =0x3ff
  151. mov r5, #0x400
  152. sub r5, #1
  153. ands r5, r5, r2, lsr #3 @ find maximum number on the way size
  154. clz r6, r5 @ find bit position of way size increment
  155. @ldr r8, =0x7fff
  156. mov r8, #0x8000
  157. sub r8, #1
  158. ands r8, r8, r2, lsr #13 @ extract max number of the index size
  159. L1_loop2:
  160. mov r9, r5 @ create working copy of max way size
  161. L1_loop3:
  162. orr r7, r10, r9, lsl r6 @ factor way and cache number into r7
  163. orr r7, r7, r8, lsl r3 @ factor index number into r7
  164. mcr p15, 0, r7, c7, c14, 2 @ clean & invalidate by set/way
  165. @mcr p15, 0, r7, c7, c10, 2 @ clean by set/way
  166. @mcr p15, 0, r7, c7, c6, 2 @ invalidate by set/way
  167. subs r9, r9, #1 @ decrement the way
  168. bge L1_loop3
  169. subs r8, r8, #1 @ decrement the index
  170. bge L1_loop2
  171. L1_skip:
  172. @add r10, r10, #2 @ increment cache number
  173. @cmp r4, r10
  174. @bgt L1_loop1
  175. L1_finished:
  176. mov r10, #0 @ swith back to cache level
  177. mcr p15, 2, r10, c0, c0, 0 @ select current cache level in cssr
  178. dsb
  179. isb
  180. @clean or flush L2
  181. mrc p15, 1, r1, c0, c0, 1 @ read clidr
  182. isb
  183. ands r4, r1, #0x7000000 @ extract loc from clidr
  184. mov r4, r4, lsr #23 @ left align loc bit field
  185. beq L2_cl_finished @ if loc is 0, then no need to clean
  186. mov r10, #2 @ start clean at cache level 2
  187. L2_cl_loop1:
  188. add r3, r10, r10, lsr #1 @ work out 3x current cache level
  189. mov r2, r1, lsr r3 @ extract cache type bits from clidr
  190. and r2, r2, #7 @ mask of the bits for current cache only
  191. cmp r2, #2 @ see what cache we have at this level
  192. blt L2_cl_skip @ skip if no cache, or just i-cache
  193. mcr p15, 2, r10, c0, c0, 0 @ select current cache level in cssr
  194. isb @ isb to sych the new cssr&csidr
  195. mrc p15, 1, r2, c0, c0, 0 @ read the new csidr
  196. isb
  197. and r3, r2, #7 @ extract the length of the cache lines
  198. add r3, r3, #4 @ add 4 (line length offset)
  199. @ldr r5, =0x3ff
  200. mov r5, #0x400
  201. sub r5, #1
  202. ands r5, r5, r2, lsr #3 @ find maximum number on the way size
  203. clz r6, r5 @ find bit position of way size increment
  204. @ldr r8, =0x7fff
  205. mov r8, #0x8000
  206. sub r8, #1
  207. ands r8, r8, r2, lsr #13 @ extract max number of the index size
  208. L2_cl_loop2:
  209. mov r9, r5 @ create working copy of max way size
  210. L2_cl_loop3:
  211. orr r7, r10, r9, lsl r6 @ factor way and cache number into r7
  212. orr r7, r7, r8, lsl r3 @ factor index number into r7
  213. teq r0, #0
  214. mcreq p15, 0, r7, c7, c10, 2 @ clean by set/way
  215. mcrne p15, 0, r7, c7, c14, 2 @ flush by set/way
  216. subs r9, r9, #1 @ decrement the way
  217. bge L2_cl_loop3
  218. subs r8, r8, #1 @ decrement the index
  219. bge L2_cl_loop2
  220. L2_cl_skip:
  221. @add r10, r10, #2 @ increment cache number
  222. @cmp r4, r10
  223. @bgt L2_cl_loop1
  224. L2_cl_finished:
  225. mov r10, #0 @ swith back to cache level 0
  226. mcr p15, 2, r10, c0, c0, 0 @ select current cache level in cssr
  227. dsb
  228. isb
  229. bx lr
  230. .endfunc
  231. .global cpu_wake_up_errata_802022
  232. cpu_wake_up_errata_802022:
  233. .func
  234. @ Before Slave CPU goes to Errata WFI, we turn off GIC CPU interface to the CPU first.
  235. ldr r0, =0x10212000
  236. mov r1, #0
  237. str r1, [r0]
  238. 1:
  239. isb
  240. dsb
  241. wfi
  242. b 1b
  243. .endfunc
  244. @ This function takes three arguments
  245. @ r0: Destination start address (must be word aligned)
  246. @ r1: Source start address (must be word aligned)
  247. @ r2: Number of words to copy
  248. @ Return value is updated destination pointer (first unwritten word)
  249. .global copy_words
  250. copy_words:
  251. .func
  252. push {r3}
  253. cmp r2, #0
  254. beq 1f
  255. 2:
  256. ldr r3, [r1], #4
  257. str r3, [r0], #4
  258. subs r2, r2, #1
  259. bne 2b
  260. 1:
  261. pop {r3}
  262. bx lr
  263. .endfunc