aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStephen Boyd <sboyd@codeaurora.org>2015-02-27 19:11:34 -0500
committerWill Deacon <will.deacon@arm.com>2015-03-17 14:34:01 -0400
commit934999185edd613ca80916d238ba7393b84ae53c (patch)
tree85a117432aada0825a98f07bc5a2c99fa14bd415
parent65bab45113a2c5e9f13bc8cc3f6fea92f467d417 (diff)
ARM: perf: Only reset PMxEVCNTCR registers on reset
The Krait specific PMxEVCNTCR register is unpredictable upon reset. Currently we clear the register before we setup an event, but we don't need to do that. Instead, we can iterate through all the events and clear them once when we reset the PMU, saving a write in the event setup path. Cc: Neil Leeder <nleeder@codeaurora.org> Cc: Ashwin Chaugule <ashwinc@codeaurora.org> Cc: Sheetal Sahasrabudhe <sheetals@codeaurora.org> Signed-off-by: Stephen Boyd <sboyd@codeaurora.org> Signed-off-by: Will Deacon <will.deacon@arm.com>
-rw-r--r--arch/arm/kernel/perf_event_v7.c11
1 files changed, 9 insertions, 2 deletions
diff --git a/arch/arm/kernel/perf_event_v7.c b/arch/arm/kernel/perf_event_v7.c
index 97a7eda8831a..fae6c4ea52e8 100644
--- a/arch/arm/kernel/perf_event_v7.c
+++ b/arch/arm/kernel/perf_event_v7.c
@@ -1218,8 +1218,6 @@ static void krait_evt_setup(int idx, u32 config_base)
1218 val |= config_base & (ARMV7_EXCLUDE_USER | ARMV7_EXCLUDE_PL1); 1218 val |= config_base & (ARMV7_EXCLUDE_USER | ARMV7_EXCLUDE_PL1);
1219 armv7_pmnc_write_evtsel(idx, val); 1219 armv7_pmnc_write_evtsel(idx, val);
1220 1220
1221 asm volatile("mcr p15, 0, %0, c9, c15, 0" : : "r" (0));
1222
1223 if (venum_event) { 1221 if (venum_event) {
1224 venum_pre_pmresr(&vval, &fval); 1222 venum_pre_pmresr(&vval, &fval);
1225 val = venum_read_pmresr(); 1223 val = venum_read_pmresr();
@@ -1339,6 +1337,8 @@ static void krait_pmu_enable_event(struct perf_event *event)
1339static void krait_pmu_reset(void *info) 1337static void krait_pmu_reset(void *info)
1340{ 1338{
1341 u32 vval, fval; 1339 u32 vval, fval;
1340 struct arm_pmu *cpu_pmu = info;
1341 u32 idx, nb_cnt = cpu_pmu->num_events;
1342 1342
1343 armv7pmu_reset(info); 1343 armv7pmu_reset(info);
1344 1344
@@ -1350,6 +1350,13 @@ static void krait_pmu_reset(void *info)
1350 venum_pre_pmresr(&vval, &fval); 1350 venum_pre_pmresr(&vval, &fval);
1351 venum_write_pmresr(0); 1351 venum_write_pmresr(0);
1352 venum_post_pmresr(vval, fval); 1352 venum_post_pmresr(vval, fval);
1353
1354 /* Reset PMxEVNCTCR to sane default */
1355 for (idx = ARMV7_IDX_CYCLE_COUNTER; idx < nb_cnt; ++idx) {
1356 armv7_pmnc_select_counter(idx);
1357 asm volatile("mcr p15, 0, %0, c9, c15, 0" : : "r" (0));
1358 }
1359
1353} 1360}
1354 1361
1355static int krait_event_to_bit(struct perf_event *event, unsigned int region, 1362static int krait_event_to_bit(struct perf_event *event, unsigned int region,