123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223 |
- ;-------------------------------------------------------------------------------
- ; sys_pmu.asm
- ;
- ; (c) Texas Instruments 2009-2013, All rights reserved.
- ;
- .text
- .arm
- ;-------------------------------------------------------------------------------
- ; Initialize Pmu
- ; Note: It will reset all counters
- .def _pmuInit_
- .asmfunc
- _pmuInit_
- stmfd sp!, {r0}
- ; set control register
- mrc p15, #0, r0, c9, c12, #0
- orr r0, r0, #(1 << 4) + 6 + 1
- mcr p15, #0, r0, c9, c12, #0
- ; clear flags
- mov r0, #0
- sub r1, r1, #1
- mcr p15, #0, r0, c9, c12, #3
- ; select counter 0 event
- mcr p15, #0, r0, c9, c12, #5 ; select counter
- mov r0, #0x11
- mcr p15, #0, r0, c9, c13, #1 ; select event
- ; select counter 1 event
- mov r0, #1
- mcr p15, #0, r0, c9, c12, #5 ; select counter
- mov r0, #0x11
- mcr p15, #0, r0, c9, c13, #1 ; select event
- ; select counter 2 event
- mov r0, #2
- mcr p15, #0, r0, c9, c12, #5 ; select counter
- mov r0, #0x11
- mcr p15, #0, r0, c9, c13, #1 ; select event
- ldmfd sp!, {r0}
- bx lr
- .endasmfunc
- ;-------------------------------------------------------------------------------
- ; Enable Counters Global [Cycle, Event [0..2]]
- ; Note: It will reset all counters
- .def _pmuEnableCountersGlobal_
- .asmfunc
- _pmuEnableCountersGlobal_
- stmfd sp!, {r0}
- mrc p15, #0, r0, c9, c12, #0
- orr r0, r0, #7
- mcr p15, #0, r0, c9, c12, #0
- ldmfd sp!, {r0}
- bx lr
- .endasmfunc
- ;-------------------------------------------------------------------------------
- ; Disable Counters Global [Cycle, Event [0..2]]
- .def _pmuDisableCountersGlobal_
- .asmfunc
- _pmuDisableCountersGlobal_
- stmfd sp!, {r0}
- mrc p15, #0, r0, c9, c12, #0
- bic r0, r0, #1
- mcr p15, #0, r0, c9, c12, #0
- ldmfd sp!, {r0}
- bx lr
- .endasmfunc
- ;-------------------------------------------------------------------------------
- ; Reset Cycle Counter
- .def _pmuResetCycleCounter_
- .asmfunc
- _pmuResetCycleCounter_
- stmfd sp!, {r0}
- mrc p15, #0, r0, c9, c12, #0
- orr r0, r0, #4
- mcr p15, #0, r0, c9, c12, #0
- ldmfd sp!, {r0}
- bx lr
- .endasmfunc
- ;-------------------------------------------------------------------------------
- ; Reset Event Counters [0..2]
- .def _pmuResetEventCounters_
- .asmfunc
- _pmuResetEventCounters_
- stmfd sp!, {r0}
- mrc p15, #0, r0, c9, c12, #0
- orr r0, r0, #2
- mcr p15, #0, r0, c9, c12, #0
- ldmfd sp!, {r0}
- bx lr
- .endasmfunc
- ;-------------------------------------------------------------------------------
- ; Reset Cycle Counter abd Event Counters [0..2]
- .def _pmuResetCounters_
- .asmfunc
- _pmuResetCounters_
- stmfd sp!, {r0}
- mrc p15, #0, r0, c9, c12, #0
- orr r0, r0, #6
- mcr p15, #0, r0, c9, c12, #0
- ldmfd sp!, {r0}
- bx lr
- .endasmfunc
- ;-------------------------------------------------------------------------------
- ; Start Counters [Cycle, 0..2]
- .def _pmuStartCounters_
- .asmfunc
- _pmuStartCounters_
- mcr p15, #0, r0, c9, c12, #1
- bx lr
- .endasmfunc
- ;-------------------------------------------------------------------------------
- ; Stop Counters [Cycle, 0..2]
- .def _pmuStopCounters_
- .asmfunc
- _pmuStopCounters_
- mcr p15, #0, r0, c9, c12, #2
- bx lr
- .endasmfunc
- ;-------------------------------------------------------------------------------
- ; Set Count event
- .def _pmuSetCountEvent_
- .asmfunc
- _pmuSetCountEvent_
-
- lsr r0, r0, #1
- mcr p15, #0, r0, c9, c12, #5 ; select counter
- mcr p15, #0, r1, c9, c13, #1 ; select event
- bx lr
- .endasmfunc
- ;-------------------------------------------------------------------------------
- ; Get Cycle Count
- .def _pmuGetCycleCount_
- .asmfunc
- _pmuGetCycleCount_
- mrc p15, #0, r0, c9, c13, #0
- bx lr
- .endasmfunc
- ;-------------------------------------------------------------------------------
- ; Get Event Counter Count Value
- .def _pmuGetEventCount_
- .asmfunc
- _pmuGetEventCount_
- lsr r0, r0, #1
- mcr p15, #0, r0, c9, c12, #5 ; select counter
- mrc p15, #0, r0, c9, c13, #2 ; read event counter
- bx lr
- .endasmfunc
- ;-------------------------------------------------------------------------------
- ; Get Overflow Flags
- .def _pmuGetOverflow_
- .asmfunc
- _pmuGetOverflow_
- mrc p15, #0, r0, c9, c12, #3 ; read overflow
- mov r1, #0
- sub r1, r1, #1
- mcr p15, #0, r1, c9, c12, #3 ; clear flags
- bx lr
- .endasmfunc
-
- ;-------------------------------------------------------------------------------
|