phytium_cpu_id.S 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. #include "fparameters.h"
  2. #include "sdkconfig.h"
  3. #ifndef __aarch64__
  4. .globl cpu_id_mapping
  5. cpu_id_mapping:
  6. #if defined(CONFIG_TARGET_E2000Q)
  7. cmp r0, #0 // compare cpu_id with 0
  8. beq map_cpu_id_0
  9. cmp r0, #1 // compare cpu_id with 1
  10. beq map_cpu_id_1
  11. cmp r0, #2 // compare cpu_id with 2
  12. beq map_cpu_id_2
  13. cmp r0, #3 // compare cpu_id with 3
  14. beq map_cpu_id_3
  15. mov pc, lr // no mapping needed
  16. #endif
  17. mov pc, lr // no mapping needed
  18. // Mapping for E2000Q
  19. map_cpu_id_0:
  20. mov r0, #2
  21. mov pc, lr
  22. map_cpu_id_1:
  23. mov r0, #3
  24. mov pc, lr
  25. map_cpu_id_2:
  26. mov r0, #0
  27. mov pc, lr
  28. map_cpu_id_3:
  29. mov r0, #1
  30. mov pc, lr
  31. .globl rt_asm_cpu_id
  32. rt_asm_cpu_id:
  33. // read MPIDR
  34. mov r9, lr
  35. mrc p15, 0, r0, c0, c0, 5
  36. ubfx r0, r0, #0, #12
  37. ldr r1,= CORE0_AFF
  38. cmp r0, r1
  39. beq core0
  40. #if defined(CORE1_AFF)
  41. ldr r1,= CORE1_AFF
  42. cmp r0, r1
  43. beq core1
  44. #endif
  45. #if defined(CORE2_AFF)
  46. ldr r1,= CORE2_AFF
  47. cmp r0, r1
  48. beq core2
  49. #endif
  50. #if defined(CORE3_AFF)
  51. ldr r1,= CORE3_AFF
  52. cmp r0, r1
  53. beq core3
  54. #endif
  55. b default
  56. core0:
  57. mov r0, #0
  58. b return
  59. core1:
  60. mov r0, #1
  61. b return
  62. core2:
  63. mov r0, #2
  64. b return
  65. core3:
  66. mov r0, #3
  67. b return
  68. core4:
  69. mov r0, #4
  70. b return
  71. core5:
  72. mov r0, #5
  73. b return
  74. core6:
  75. mov r0, #6
  76. b return
  77. core8:
  78. mov r0, #8
  79. b return
  80. default:
  81. and r0, r0, #15
  82. return:
  83. bl cpu_id_mapping
  84. mov pc, r9
  85. #else
  86. .globl cpu_id_mapping
  87. cpu_id_mapping:
  88. #if defined(CONFIG_TARGET_E2000Q)
  89. cmp x0, #0 // compare cpu_id with 0
  90. beq map_cpu_id_0
  91. cmp x0, #1 // compare cpu_id with 1
  92. beq map_cpu_id_1
  93. cmp x0, #2 // compare cpu_id with 2
  94. beq map_cpu_id_2
  95. cmp x0, #3 // compare cpu_id with 3
  96. beq map_cpu_id_3
  97. RET // no mapping needed
  98. #endif
  99. RET // no mapping needed
  100. // Mapping for E2000Q
  101. map_cpu_id_0:
  102. mov x0, #2
  103. RET
  104. map_cpu_id_1:
  105. mov x0, #3
  106. RET
  107. map_cpu_id_2:
  108. mov x0, #0
  109. RET
  110. map_cpu_id_3:
  111. mov x0, #1
  112. RET
  113. .globl rt_hw_cpu_id_set
  114. rt_hw_cpu_id_set:
  115. mov x9, lr
  116. mrs x0,MPIDR_EL1
  117. and x1, x0, #15
  118. msr tpidr_el1, x1
  119. ubfx x0, x0, #0, #12
  120. ldr x1,= CORE0_AFF
  121. cmp x0, x1
  122. beq core0
  123. #if defined(CORE1_AFF)
  124. ldr x1,= CORE1_AFF
  125. cmp x0, x1
  126. beq core1
  127. #endif
  128. #if defined(CORE2_AFF)
  129. ldr x1,= CORE2_AFF
  130. cmp x0, x1
  131. beq core2
  132. #endif
  133. #if defined(CORE3_AFF)
  134. ldr x1,= CORE3_AFF
  135. cmp x0, x1
  136. beq core3
  137. #endif
  138. b default
  139. core0:
  140. mov x0, #0
  141. b return
  142. core1:
  143. mov x0, #1
  144. b return
  145. core2:
  146. mov x0, #2
  147. b return
  148. core3:
  149. mov x0, #3
  150. b return
  151. core4:
  152. mov x0, #4
  153. b return
  154. core5:
  155. mov x0, #5
  156. b return
  157. core6:
  158. mov x0, #6
  159. b return
  160. core8:
  161. mov x0, #8
  162. b return
  163. default:
  164. and x0, x0, #15
  165. return:
  166. //bl cpu_id_mapping
  167. mov lr, x9
  168. RET
  169. #endif