tmp_suning_uos_patched/arch/arc
Alexey Brodkin 1fe8bfa5ff ARCv2: perf: implement "event_set_period"
This generalization prepares for support of overflow interrupts.

Hardware event counters on ARC work that way:
Each counter counts from programmed start value (set in
ARC_REG_PCT_COUNT) to a limit value (set in ARC_REG_PCT_INT_CNT) and
once limit value is reached this timer generates an interrupt.

Even though this hardware implementation allows for more flexibility,
in Linux kernel we decided to mimic behavior of other architectures
this way:

 [1] Set limit value as half of counter's max value (to allow counter to
     run after reaching it limit, see below for more explanation):
 ---------->8-----------
 arc_pmu->max_period = (1ULL << counter_size) / 2 - 1ULL;
 ---------->8-----------

 [2] Set start value as "arc_pmu->max_period - sample_period" and then
count up to the limit

Our event counters don't stop on reaching max value (the one we set in
ARC_REG_PCT_INT_CNT) but continue to count until kernel explicitly
stops each of them.

And setting a limit as half of counter capacity is done to allow
capturing of additional events in between moment when interrupt was
triggered until we're actually processing PMU interrupts. That way
we're trying to be more precise.

For example if we count CPU cycles we keep track of cycles while
running through generic IRQ handling code:

 [1] We set counter period as say 100_000 events of type "crun"
 [2] Counter reaches that limit and raises its interrupt
 [3] Once we get in PMU IRQ handler we read current counter value from
ARC_REG_PCT_SNAP ans see there something like 105_000.

If counters stop on reaching a limit value then we would miss
additional 5000 cycles.

Acked-by: Peter Zijlstra <peterz@infradead.org>
Cc: Arnaldo Carvalho de Melo <acme@kernel.org>
Signed-off-by: Alexey Brodkin <abrodkin@synopsys.com>
Signed-off-by: Vineet Gupta <vgupta@synopsys.com>
2015-08-27 14:57:29 +05:30
..
boot ARC: add/fix some comments in code - no functional change 2015-08-20 19:05:49 +05:30
configs ARCv2: [vdk] dts files and defconfig for HS38 VDK 2015-06-25 06:00:21 +05:30
include ARC: perf: cap the number of counters to hardware max of 32 2015-08-27 14:57:03 +05:30
kernel ARCv2: perf: implement "event_set_period" 2015-08-27 14:57:29 +05:30
lib ARCv2: lib: memset: Don't assume 64-bit load/stores 2015-07-20 17:44:37 +03:00
mm ARC: Eliminate some ARCv2 specific code for ARCompact build 2015-08-21 15:06:43 +05:30
oprofile
plat-axs10x ARC: add/fix some comments in code - no functional change 2015-08-20 19:05:49 +05:30
plat-sim ARCv2: [nsim*hs*] Support simulation platforms for HS38x cores 2015-06-25 06:00:19 +05:30
plat-tb10x
Kbuild
Kconfig ARC: Enable HAVE_FUTEX_CMPXCHG 2015-08-20 18:16:01 +05:30
Kconfig.debug
Makefile ARCv2: add knob for DIV_REV in Kconfig 2015-07-20 13:33:30 +03:00