aboutsummaryrefslogtreecommitdiff
path: root/arch/arm64/kernel/perf_event.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/arm64/kernel/perf_event.c')
-rw-r--r--arch/arm64/kernel/perf_event.c22
1 files changed, 22 insertions, 0 deletions
diff --git a/arch/arm64/kernel/perf_event.c b/arch/arm64/kernel/perf_event.c
index 7778453762d8..407f9959867b 100644
--- a/arch/arm64/kernel/perf_event.c
+++ b/arch/arm64/kernel/perf_event.c
@@ -634,6 +634,16 @@ static void armpmu_disable(struct pmu *pmu)
armpmu->stop();
}
+static int armpmu_event_idx(struct perf_event *event)
+{
+ int idx = event->hw.idx;
+
+ if (!cpu_pmu->attr_rdpmc)
+ return 0;
+
+ return idx + 1;
+}
+
static void __init armpmu_init(struct arm_pmu *armpmu)
{
atomic_set(&armpmu->active_events, 0);
@@ -648,6 +658,7 @@ static void __init armpmu_init(struct arm_pmu *armpmu)
.start = armpmu_start,
.stop = armpmu_stop,
.read = armpmu_read,
+ .event_idx = armpmu_event_idx,
};
}
@@ -1379,6 +1390,17 @@ static struct pmu_hw_events *armpmu_get_cpu_events(void)
return this_cpu_ptr(&cpu_hw_events);
}
+void arch_perf_update_userpage(struct perf_event_mmap_page *userpg, u64 now)
+{
+ userpg->cap_user_rdpmc = cpu_pmu->attr_rdpmc;
+}
+
+void arch_perf_uspace_access(void *enable)
+{
+ cpu_pmu->attr_rdpmc = *(int *)enable;
+ asm volatile("msr pmuserenr_el0, %0" : : "r" (!!*(int *)enable));
+}
+
static void __init cpu_pmu_init(struct arm_pmu *armpmu)
{
int cpu;