summaryrefslogtreecommitdiff
path: root/arch
diff options
context:
space:
mode:
authorTom Huynh <tom.huynh@freescale.com>2015-01-20 22:19:50 (GMT)
committerHonghua Yin <Hong-Hua.Yin@freescale.com>2015-04-16 00:21:52 (GMT)
commitb1540b070f540430c553be5fdfa3b9edbf60ec7e (patch)
treef4e0adb1807505bd738225ed0fae27e68e35a547 /arch
parentacc6b9b8ac4546066221f6ad0e57310ad3a9ba50 (diff)
downloadlinux-fsl-qoriq-b1540b070f540430c553be5fdfa3b9edbf60ec7e.tar.xz
powerpc/perf: fix fsl_emb_pmu_start to write correct pmc value
PMCs on PowerPC increases towards 0x80000000 and triggers an overflow interrupt when the msb is set to collect a sample. Therefore, to setup for the next sample collection, pmu_start should set the pmc value to 0x80000000 - left instead of left which incorrectly delays the next overflow interrupt. Same as commit 9a45a9407c69 ("powerpc/perf: power_pmu_start restores incorrect values, breaking frequency events") for book3s. Signed-off-by: Tom Huynh <tom.huynh@freescale.com> Signed-off-by: Scott Wood <scottwood@freescale.com> (cherry picked from commit d2caa3cebda8b626336e100b80a0ed6f909dccab) Change-Id: I2179f49218e1e0cd836c67714430a86be8535a27 Reviewed-on: http://git.am.freescale.net:8181/35052 Reviewed-by: Richard Schmitt <richard.schmitt@freescale.com> Tested-by: Review Code-CDREVIEW <CDREVIEW@freescale.com> Reviewed-by: Honghua Yin <Hong-Hua.Yin@freescale.com>
Diffstat (limited to 'arch')
-rw-r--r--arch/powerpc/perf/core-fsl-emb.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/arch/powerpc/perf/core-fsl-emb.c b/arch/powerpc/perf/core-fsl-emb.c
index d35ae52..6e92050 100644
--- a/arch/powerpc/perf/core-fsl-emb.c
+++ b/arch/powerpc/perf/core-fsl-emb.c
@@ -389,6 +389,7 @@ static void fsl_emb_pmu_del(struct perf_event *event, int flags)
static void fsl_emb_pmu_start(struct perf_event *event, int ef_flags)
{
unsigned long flags;
+ unsigned long val;
s64 left;
if (event->hw.idx < 0 || !event->hw.sample_period)
@@ -405,7 +406,10 @@ static void fsl_emb_pmu_start(struct perf_event *event, int ef_flags)
event->hw.state = 0;
left = local64_read(&event->hw.period_left);
- write_pmc(event->hw.idx, left);
+ val = 0;
+ if (left < 0x80000000L)
+ val = 0x80000000L - left;
+ write_pmc(event->hw.idx, val);
perf_event_update_userpage(event);
perf_pmu_enable(event->pmu);