sys_pmu.asm 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. ;-------------------------------------------------------------------------------
  2. ; sys_pmu.asm
  3. ;
  4. ; (c) Texas Instruments 2009-2013, All rights reserved.
  5. ;
  6. .text
  7. .arm
  8. ;-------------------------------------------------------------------------------
  9. ; Initialize Pmu
  10. ; Note: It will reset all counters
  11. .def _pmuInit_
  12. .asmfunc
  13. _pmuInit_
  14. stmfd sp!, {r0}
  15. ; set control register
  16. mrc p15, #0, r0, c9, c12, #0
  17. orr r0, r0, #(1 << 4) + 6 + 1
  18. mcr p15, #0, r0, c9, c12, #0
  19. ; clear flags
  20. mov r0, #0
  21. sub r1, r1, #1
  22. mcr p15, #0, r0, c9, c12, #3
  23. ; select counter 0 event
  24. mcr p15, #0, r0, c9, c12, #5 ; select counter
  25. mov r0, #0x11
  26. mcr p15, #0, r0, c9, c13, #1 ; select event
  27. ; select counter 1 event
  28. mov r0, #1
  29. mcr p15, #0, r0, c9, c12, #5 ; select counter
  30. mov r0, #0x11
  31. mcr p15, #0, r0, c9, c13, #1 ; select event
  32. ; select counter 2 event
  33. mov r0, #2
  34. mcr p15, #0, r0, c9, c12, #5 ; select counter
  35. mov r0, #0x11
  36. mcr p15, #0, r0, c9, c13, #1 ; select event
  37. ldmfd sp!, {r0}
  38. bx lr
  39. .endasmfunc
  40. ;-------------------------------------------------------------------------------
  41. ; Enable Counters Global [Cycle, Event [0..2]]
  42. ; Note: It will reset all counters
  43. .def _pmuEnableCountersGlobal_
  44. .asmfunc
  45. _pmuEnableCountersGlobal_
  46. stmfd sp!, {r0}
  47. mrc p15, #0, r0, c9, c12, #0
  48. orr r0, r0, #7
  49. mcr p15, #0, r0, c9, c12, #0
  50. ldmfd sp!, {r0}
  51. bx lr
  52. .endasmfunc
  53. ;-------------------------------------------------------------------------------
  54. ; Disable Counters Global [Cycle, Event [0..2]]
  55. .def _pmuDisableCountersGlobal_
  56. .asmfunc
  57. _pmuDisableCountersGlobal_
  58. stmfd sp!, {r0}
  59. mrc p15, #0, r0, c9, c12, #0
  60. bic r0, r0, #1
  61. mcr p15, #0, r0, c9, c12, #0
  62. ldmfd sp!, {r0}
  63. bx lr
  64. .endasmfunc
  65. ;-------------------------------------------------------------------------------
  66. ; Reset Cycle Counter
  67. .def _pmuResetCycleCounter_
  68. .asmfunc
  69. _pmuResetCycleCounter_
  70. stmfd sp!, {r0}
  71. mrc p15, #0, r0, c9, c12, #0
  72. orr r0, r0, #4
  73. mcr p15, #0, r0, c9, c12, #0
  74. ldmfd sp!, {r0}
  75. bx lr
  76. .endasmfunc
  77. ;-------------------------------------------------------------------------------
  78. ; Reset Event Counters [0..2]
  79. .def _pmuResetEventCounters_
  80. .asmfunc
  81. _pmuResetEventCounters_
  82. stmfd sp!, {r0}
  83. mrc p15, #0, r0, c9, c12, #0
  84. orr r0, r0, #2
  85. mcr p15, #0, r0, c9, c12, #0
  86. ldmfd sp!, {r0}
  87. bx lr
  88. .endasmfunc
  89. ;-------------------------------------------------------------------------------
  90. ; Reset Cycle Counter abd Event Counters [0..2]
  91. .def _pmuResetCounters_
  92. .asmfunc
  93. _pmuResetCounters_
  94. stmfd sp!, {r0}
  95. mrc p15, #0, r0, c9, c12, #0
  96. orr r0, r0, #6
  97. mcr p15, #0, r0, c9, c12, #0
  98. ldmfd sp!, {r0}
  99. bx lr
  100. .endasmfunc
  101. ;-------------------------------------------------------------------------------
  102. ; Start Counters [Cycle, 0..2]
  103. .def _pmuStartCounters_
  104. .asmfunc
  105. _pmuStartCounters_
  106. mcr p15, #0, r0, c9, c12, #1
  107. bx lr
  108. .endasmfunc
  109. ;-------------------------------------------------------------------------------
  110. ; Stop Counters [Cycle, 0..2]
  111. .def _pmuStopCounters_
  112. .asmfunc
  113. _pmuStopCounters_
  114. mcr p15, #0, r0, c9, c12, #2
  115. bx lr
  116. .endasmfunc
  117. ;-------------------------------------------------------------------------------
  118. ; Set Count event
  119. .def _pmuSetCountEvent_
  120. .asmfunc
  121. _pmuSetCountEvent_
  122. lsr r0, r0, #1
  123. mcr p15, #0, r0, c9, c12, #5 ; select counter
  124. mcr p15, #0, r1, c9, c13, #1 ; select event
  125. bx lr
  126. .endasmfunc
  127. ;-------------------------------------------------------------------------------
  128. ; Get Cycle Count
  129. .def _pmuGetCycleCount_
  130. .asmfunc
  131. _pmuGetCycleCount_
  132. mrc p15, #0, r0, c9, c13, #0
  133. bx lr
  134. .endasmfunc
  135. ;-------------------------------------------------------------------------------
  136. ; Get Event Counter Count Value
  137. .def _pmuGetEventCount_
  138. .asmfunc
  139. _pmuGetEventCount_
  140. lsr r0, r0, #1
  141. mcr p15, #0, r0, c9, c12, #5 ; select counter
  142. mrc p15, #0, r0, c9, c13, #2 ; read event counter
  143. bx lr
  144. .endasmfunc
  145. ;-------------------------------------------------------------------------------
  146. ; Get Overflow Flags
  147. .def _pmuGetOverflow_
  148. .asmfunc
  149. _pmuGetOverflow_
  150. mrc p15, #0, r0, c9, c12, #3 ; read overflow
  151. mov r1, #0
  152. sub r1, r1, #1
  153. mcr p15, #0, r1, c9, c12, #3 ; clear flags
  154. bx lr
  155. .endasmfunc
  156. ;-------------------------------------------------------------------------------