diff options
author | Jiri Olsa <jolsa@redhat.com> | 2012-10-10 08:53:14 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@kernel.org> | 2012-10-24 04:41:25 -0400 |
commit | 0bf79d44133de42af01a70a1700b8bb4b6d3fb92 (patch) | |
tree | c3c873e431d4c24def937cf3dd850175abeef3f1 | |
parent | 43c032febde48aabcf6d59f47cdcb7b5debbdc63 (diff) |
perf/x86: Add hardware events translations for AMD cpus
Add support for AMD processors to display 'events' sysfs
directory (/sys/devices/cpu/events/) with hw event translations:
# ls /sys/devices/cpu/events/
branch-instructions
branch-misses
bus-cycles
cache-misses
cache-references
cpu-cycles
instructions
ref-cycles
stalled-cycles-backend
stalled-cycles-frontend
Suggested-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
Signed-off-by: Jiri Olsa <jolsa@redhat.com>
Cc: Arnaldo Carvalho de Melo <acme@ghostprotocols.net>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Corey Ashford <cjashfor@linux.vnet.ibm.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Stephane Eranian <eranian@google.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
Link: http://lkml.kernel.org/r/1349873598-12583-5-git-send-email-jolsa@redhat.com
Signed-off-by: Ingo Molnar <mingo@kernel.org>
-rw-r--r-- | arch/x86/kernel/cpu/perf_event.c | 3 | ||||
-rw-r--r-- | arch/x86/kernel/cpu/perf_event.h | 2 | ||||
-rw-r--r-- | arch/x86/kernel/cpu/perf_event_amd.c | 9 | ||||
-rw-r--r-- | arch/x86/kernel/cpu/perf_event_intel.c | 11 |
4 files changed, 20 insertions, 5 deletions
diff --git a/arch/x86/kernel/cpu/perf_event.c b/arch/x86/kernel/cpu/perf_event.c index 8a1fa23452d6..0a55ab2ff849 100644 --- a/arch/x86/kernel/cpu/perf_event.c +++ b/arch/x86/kernel/cpu/perf_event.c | |||
@@ -1392,9 +1392,8 @@ static struct attribute_group x86_pmu_events_group = { | |||
1392 | .attrs = events_attr, | 1392 | .attrs = events_attr, |
1393 | }; | 1393 | }; |
1394 | 1394 | ||
1395 | ssize_t x86_event_sysfs_show(char *page, u64 config) | 1395 | ssize_t x86_event_sysfs_show(char *page, u64 config, u64 event) |
1396 | { | 1396 | { |
1397 | u64 event = (config & ARCH_PERFMON_EVENTSEL_EVENT); | ||
1398 | u64 umask = (config & ARCH_PERFMON_EVENTSEL_UMASK) >> 8; | 1397 | u64 umask = (config & ARCH_PERFMON_EVENTSEL_UMASK) >> 8; |
1399 | u64 cmask = (config & ARCH_PERFMON_EVENTSEL_CMASK) >> 24; | 1398 | u64 cmask = (config & ARCH_PERFMON_EVENTSEL_CMASK) >> 24; |
1400 | bool edge = (config & ARCH_PERFMON_EVENTSEL_EDGE); | 1399 | bool edge = (config & ARCH_PERFMON_EVENTSEL_EDGE); |
diff --git a/arch/x86/kernel/cpu/perf_event.h b/arch/x86/kernel/cpu/perf_event.h index f8aa2f6677f2..21419b9178b4 100644 --- a/arch/x86/kernel/cpu/perf_event.h +++ b/arch/x86/kernel/cpu/perf_event.h | |||
@@ -538,7 +538,7 @@ static inline void set_linear_ip(struct pt_regs *regs, unsigned long ip) | |||
538 | regs->ip = ip; | 538 | regs->ip = ip; |
539 | } | 539 | } |
540 | 540 | ||
541 | ssize_t x86_event_sysfs_show(char *page, u64 config); | 541 | ssize_t x86_event_sysfs_show(char *page, u64 config, u64 event); |
542 | 542 | ||
543 | #ifdef CONFIG_CPU_SUP_AMD | 543 | #ifdef CONFIG_CPU_SUP_AMD |
544 | 544 | ||
diff --git a/arch/x86/kernel/cpu/perf_event_amd.c b/arch/x86/kernel/cpu/perf_event_amd.c index 4528ae7b6ec4..c93bc4e813a0 100644 --- a/arch/x86/kernel/cpu/perf_event_amd.c +++ b/arch/x86/kernel/cpu/perf_event_amd.c | |||
@@ -568,6 +568,14 @@ amd_get_event_constraints_f15h(struct cpu_hw_events *cpuc, struct perf_event *ev | |||
568 | } | 568 | } |
569 | } | 569 | } |
570 | 570 | ||
571 | static ssize_t amd_event_sysfs_show(char *page, u64 config) | ||
572 | { | ||
573 | u64 event = (config & ARCH_PERFMON_EVENTSEL_EVENT) | | ||
574 | (config & AMD64_EVENTSEL_EVENT) >> 24; | ||
575 | |||
576 | return x86_event_sysfs_show(page, config, event); | ||
577 | } | ||
578 | |||
571 | static __initconst const struct x86_pmu amd_pmu = { | 579 | static __initconst const struct x86_pmu amd_pmu = { |
572 | .name = "AMD", | 580 | .name = "AMD", |
573 | .handle_irq = x86_pmu_handle_irq, | 581 | .handle_irq = x86_pmu_handle_irq, |
@@ -591,6 +599,7 @@ static __initconst const struct x86_pmu amd_pmu = { | |||
591 | .put_event_constraints = amd_put_event_constraints, | 599 | .put_event_constraints = amd_put_event_constraints, |
592 | 600 | ||
593 | .format_attrs = amd_format_attr, | 601 | .format_attrs = amd_format_attr, |
602 | .events_sysfs_show = amd_event_sysfs_show, | ||
594 | 603 | ||
595 | .cpu_prepare = amd_pmu_cpu_prepare, | 604 | .cpu_prepare = amd_pmu_cpu_prepare, |
596 | .cpu_starting = amd_pmu_cpu_starting, | 605 | .cpu_starting = amd_pmu_cpu_starting, |
diff --git a/arch/x86/kernel/cpu/perf_event_intel.c b/arch/x86/kernel/cpu/perf_event_intel.c index 6106d3b44aa1..93b9e1181f83 100644 --- a/arch/x86/kernel/cpu/perf_event_intel.c +++ b/arch/x86/kernel/cpu/perf_event_intel.c | |||
@@ -1603,6 +1603,13 @@ static struct attribute *intel_arch_formats_attr[] = { | |||
1603 | NULL, | 1603 | NULL, |
1604 | }; | 1604 | }; |
1605 | 1605 | ||
1606 | ssize_t intel_event_sysfs_show(char *page, u64 config) | ||
1607 | { | ||
1608 | u64 event = (config & ARCH_PERFMON_EVENTSEL_EVENT); | ||
1609 | |||
1610 | return x86_event_sysfs_show(page, config, event); | ||
1611 | } | ||
1612 | |||
1606 | static __initconst const struct x86_pmu core_pmu = { | 1613 | static __initconst const struct x86_pmu core_pmu = { |
1607 | .name = "core", | 1614 | .name = "core", |
1608 | .handle_irq = x86_pmu_handle_irq, | 1615 | .handle_irq = x86_pmu_handle_irq, |
@@ -1628,7 +1635,7 @@ static __initconst const struct x86_pmu core_pmu = { | |||
1628 | .event_constraints = intel_core_event_constraints, | 1635 | .event_constraints = intel_core_event_constraints, |
1629 | .guest_get_msrs = core_guest_get_msrs, | 1636 | .guest_get_msrs = core_guest_get_msrs, |
1630 | .format_attrs = intel_arch_formats_attr, | 1637 | .format_attrs = intel_arch_formats_attr, |
1631 | .events_sysfs_show = x86_event_sysfs_show, | 1638 | .events_sysfs_show = intel_event_sysfs_show, |
1632 | }; | 1639 | }; |
1633 | 1640 | ||
1634 | struct intel_shared_regs *allocate_shared_regs(int cpu) | 1641 | struct intel_shared_regs *allocate_shared_regs(int cpu) |
@@ -1767,7 +1774,7 @@ static __initconst const struct x86_pmu intel_pmu = { | |||
1767 | .pebs_aliases = intel_pebs_aliases_core2, | 1774 | .pebs_aliases = intel_pebs_aliases_core2, |
1768 | 1775 | ||
1769 | .format_attrs = intel_arch3_formats_attr, | 1776 | .format_attrs = intel_arch3_formats_attr, |
1770 | .events_sysfs_show = x86_event_sysfs_show, | 1777 | .events_sysfs_show = intel_event_sysfs_show, |
1771 | 1778 | ||
1772 | .cpu_prepare = intel_pmu_cpu_prepare, | 1779 | .cpu_prepare = intel_pmu_cpu_prepare, |
1773 | .cpu_starting = intel_pmu_cpu_starting, | 1780 | .cpu_starting = intel_pmu_cpu_starting, |