linux/arch/arc/kernel
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
..
.gitignore ARC: Add some .gitignore entries 2013-08-26 09:40:24 +05:30
arc_hostlink.c ARC: Hostlink Pseudo-Driver for Metaware Debugger 2013-02-15 23:16:10 +05:30
arcksyms.c
asm-offsets.c ARCv2: [vdk] dts files and defconfig for HS38 VDK 2015-06-25 06:00:21 +05:30
clk.c ARC: fix typo with clock speed 2013-05-07 13:43:54 +05:30
ctx_sw_asm.S ARC: Fix build breakage for !CONFIG_ARC_DW2_UNWIND 2014-06-26 10:14:02 +05:30
ctx_sw.c ARC: [SMP] Fix build failures for large NR_CPUS 2013-11-06 10:41:46 +05:30
devtree.c ARCv2: [axs103] Support ARC SDP FPGA platform for HS38x cores 2015-06-25 06:00:20 +05:30
disasm.c ARC: rename kconfig option for unaligned emulation 2014-10-13 14:46:15 +05:30
entry-arcv2.S ARCv2: STAR 9000793984: Handle return from intr to Delay Slot 2015-06-22 14:06:55 +05:30
entry-compact.S ARC: entry.S: use single EXCEPTION_PROLOGUE 2015-06-19 18:09:39 +05:30
entry.S ARC: change some branchs to jumps to resolve linkage errors 2015-08-20 18:53:15 +05:30
fpu.c ARC: Process-creation/scheduling/idle-loop 2013-02-11 20:00:38 +05:30
head.S ARCv2: Support for ARCv2 ISA and HS38x cores 2015-06-22 14:06:55 +05:30
intc-arcv2.c arc:irqchip: prepare for drivers/irqchip/irqchip.h removal 2015-07-09 17:36:32 +05:30
intc-compact.c arc:irqchip: prepare for drivers/irqchip/irqchip.h removal 2015-07-09 17:36:32 +05:30
irq.c ARC: intc: split into ARCompact ISA specific, common bits 2015-06-19 18:09:40 +05:30
kgdb.c ARC: kgdb: generic kgdb_arch_pc() suffices 2014-10-22 16:14:04 -06:00
kprobes.c Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jikos/trivial 2013-11-15 16:47:22 -08:00
Makefile ARCv2: SMP: Support ARConnect (MCIP) for Inter-Core-Interrupts et al 2015-06-22 14:06:56 +05:30
mcip.c arc:irqchip: prepare for drivers/irqchip/irqchip.h removal 2015-07-09 17:36:32 +05:30
module.c ARC: Fix coding style issues 2013-04-09 12:21:14 +05:30
perf_event.c ARCv2: perf: implement "event_set_period" 2015-08-27 14:57:29 +05:30
process.c ARC: add/fix some comments in code - no functional change 2015-08-20 19:05:49 +05:30
ptrace.c ARCv2: Support for ARCv2 ISA and HS38x cores 2015-06-22 14:06:55 +05:30
reset.c arc: export symbol for pm_power_off in reset.c 2013-11-06 10:41:44 +05:30
setup.c ARCv2: spinlock/rwlock/atomics: Delayed retry of failed SCOND with exponential backoff 2015-08-04 09:26:34 +05:30
signal.c ARCv2: Support for ARCv2 ISA and HS38x cores 2015-06-22 14:06:55 +05:30
smp.c ARCv2: SMP: ARConnect debug/robustness 2015-06-22 14:06:57 +05:30
stacktrace.c ARC: stack unwinder to bail if PC is not kernel mode 2015-06-19 18:09:29 +05:30
sys.c ARC: ABIv3: fork/vfork wrappers not needed in "no-legacy-syscall" ABI 2013-03-11 19:01:10 +05:30
time.c ARC/time: Migrate to new 'set-state' interface 2015-07-20 13:30:31 +03:00
traps.c ARC: rename unhandled exception handler 2015-04-13 15:14:57 +05:30
troubleshoot.c ARC: fix unused var wanring 2015-07-06 11:09:01 +05:30
unaligned.c ARC: change some branchs to jumps to resolve linkage errors 2015-08-20 18:53:15 +05:30
unwind.c treewide: Fix typo in printk messages 2015-03-06 23:05:39 +01:00
vmlinux.lds.S ARC: optimize kernel bss clearing in early boot code 2014-06-26 10:14:05 +05:30