aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/kernel
diff options
context:
space:
mode:
authorJacob Shin <jacob.shin@amd.com>2013-02-06 12:26:28 -0500
committerIngo Molnar <mingo@kernel.org>2013-02-06 13:45:24 -0500
commit0fbdad078a70ed72248c3d30fe32e45e83be00d1 (patch)
tree07671320ea9e2c5e89d28508c0f8ff2a5ad1a29a /arch/x86/kernel
parent4c1fd17a1cb32bc4f429c7a5ff9a91a3bffdb8fa (diff)
perf/x86: Allow for architecture specific RDPMC indexes
Similar to config_base and event_base, allow architecture specific RDPMC ECX values. Signed-off-by: Jacob Shin <jacob.shin@amd.com> Acked-by: Stephane Eranian <eranian@google.com> Cc: Paul Mackerras <paulus@samba.org> Cc: Arnaldo Carvalho de Melo <acme@ghostprotocols.net> Cc: Jiri Olsa <jolsa@redhat.com> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> Link: http://lkml.kernel.org/r/1360171589-6381-6-git-send-email-jacob.shin@amd.com Signed-off-by: Ingo Molnar <mingo@kernel.org>
Diffstat (limited to 'arch/x86/kernel')
-rw-r--r--arch/x86/kernel/cpu/perf_event.c2
-rw-r--r--arch/x86/kernel/cpu/perf_event.h6
-rw-r--r--arch/x86/kernel/cpu/perf_event_amd.c6
3 files changed, 13 insertions, 1 deletions
diff --git a/arch/x86/kernel/cpu/perf_event.c b/arch/x86/kernel/cpu/perf_event.c
index c0df5ed2e048..bf0f01aea994 100644
--- a/arch/x86/kernel/cpu/perf_event.c
+++ b/arch/x86/kernel/cpu/perf_event.c
@@ -829,7 +829,7 @@ static inline void x86_assign_hw_event(struct perf_event *event,
829 } else { 829 } else {
830 hwc->config_base = x86_pmu_config_addr(hwc->idx); 830 hwc->config_base = x86_pmu_config_addr(hwc->idx);
831 hwc->event_base = x86_pmu_event_addr(hwc->idx); 831 hwc->event_base = x86_pmu_event_addr(hwc->idx);
832 hwc->event_base_rdpmc = hwc->idx; 832 hwc->event_base_rdpmc = x86_pmu_rdpmc_index(hwc->idx);
833 } 833 }
834} 834}
835 835
diff --git a/arch/x86/kernel/cpu/perf_event.h b/arch/x86/kernel/cpu/perf_event.h
index a7f06a90d2e7..7f5c75c2afdd 100644
--- a/arch/x86/kernel/cpu/perf_event.h
+++ b/arch/x86/kernel/cpu/perf_event.h
@@ -326,6 +326,7 @@ struct x86_pmu {
326 unsigned eventsel; 326 unsigned eventsel;
327 unsigned perfctr; 327 unsigned perfctr;
328 int (*addr_offset)(int index, bool eventsel); 328 int (*addr_offset)(int index, bool eventsel);
329 int (*rdpmc_index)(int index);
329 u64 (*event_map)(int); 330 u64 (*event_map)(int);
330 int max_events; 331 int max_events;
331 int num_counters; 332 int num_counters;
@@ -459,6 +460,11 @@ static inline unsigned int x86_pmu_event_addr(int index)
459 x86_pmu.addr_offset(index, false) : index); 460 x86_pmu.addr_offset(index, false) : index);
460} 461}
461 462
463static inline int x86_pmu_rdpmc_index(int index)
464{
465 return x86_pmu.rdpmc_index ? x86_pmu.rdpmc_index(index) : index;
466}
467
462int x86_setup_perfctr(struct perf_event *event); 468int x86_setup_perfctr(struct perf_event *event);
463 469
464int x86_pmu_hw_config(struct perf_event *event); 470int x86_pmu_hw_config(struct perf_event *event);
diff --git a/arch/x86/kernel/cpu/perf_event_amd.c b/arch/x86/kernel/cpu/perf_event_amd.c
index b60f31caeda0..05462f0432d5 100644
--- a/arch/x86/kernel/cpu/perf_event_amd.c
+++ b/arch/x86/kernel/cpu/perf_event_amd.c
@@ -173,6 +173,11 @@ static inline int amd_pmu_addr_offset(int index, bool eventsel)
173 return offset; 173 return offset;
174} 174}
175 175
176static inline int amd_pmu_rdpmc_index(int index)
177{
178 return index;
179}
180
176static int amd_pmu_hw_config(struct perf_event *event) 181static int amd_pmu_hw_config(struct perf_event *event)
177{ 182{
178 int ret; 183 int ret;
@@ -620,6 +625,7 @@ static __initconst const struct x86_pmu amd_pmu = {
620 .eventsel = MSR_K7_EVNTSEL0, 625 .eventsel = MSR_K7_EVNTSEL0,
621 .perfctr = MSR_K7_PERFCTR0, 626 .perfctr = MSR_K7_PERFCTR0,
622 .addr_offset = amd_pmu_addr_offset, 627 .addr_offset = amd_pmu_addr_offset,
628 .rdpmc_index = amd_pmu_rdpmc_index,
623 .event_map = amd_pmu_event_map, 629 .event_map = amd_pmu_event_map,
624 .max_events = ARRAY_SIZE(amd_perfmon_event_map), 630 .max_events = ARRAY_SIZE(amd_perfmon_event_map),
625 .num_counters = AMD64_NUM_COUNTERS, 631 .num_counters = AMD64_NUM_COUNTERS,