From: Lin Ming <ming.m.lin@intel.com>
To: Peter Zijlstra <a.p.zijlstra@chello.nl>,
Ingo Molnar <mingo@elte.hu>, Andi Kleen <andi@firstfloor.org>,
Stephane Eranian <eranian@google.com>,
Arnaldo Carvalho de Melo <acme@ghostprotocols.net>
Cc: linux-kernel <linux-kernel@vger.kernel.org>
Subject: [PATCH v2 3/6] perf, x86: Add Intel SandyBridge uncore pmu
Date: Fri, 15 Jul 2011 14:35:00 +0000 [thread overview]
Message-ID: <1310740503-15608-4-git-send-email-ming.m.lin@intel.com> (raw)
In-Reply-To: <1310740503-15608-1-git-send-email-ming.m.lin@intel.com>
Add Intel SandyBridge uncore pmu support.
Signed-off-by: Lin Ming <ming.m.lin@intel.com>
---
arch/x86/include/asm/msr-index.h | 26 +++++++++++-
arch/x86/kernel/cpu/perf_event_intel_uncore.c | 57 +++++++++++++++++++++++++
arch/x86/kernel/cpu/perf_event_intel_uncore.h | 11 +++++
3 files changed, 93 insertions(+), 1 deletions(-)
diff --git a/arch/x86/include/asm/msr-index.h b/arch/x86/include/asm/msr-index.h
index e66011e..fa0e9e6 100644
--- a/arch/x86/include/asm/msr-index.h
+++ b/arch/x86/include/asm/msr-index.h
@@ -421,7 +421,7 @@
#define MSR_CORE_PERF_GLOBAL_CTRL 0x0000038f
#define MSR_CORE_PERF_GLOBAL_OVF_CTRL 0x00000390
-/* Intel Nehalem/Westmere uncore performance counters */
+/* Intel Nehalem/Westmere/SandyBridge uncore performance counters */
#define MSR_UNCORE_PERF_GLOBAL_CTRL 0x00000391
#define MSR_UNCORE_FIXED_CTR_CTRL 0x00000394
#define MSR_UNCORE_FIXED_CTR0 0x00000395
@@ -429,6 +429,30 @@
#define MSR_NHM_UNCORE_PMC0 0x000003b0
#define MSR_NHM_UNCORE_PERFEVTSEL0 0x000003c0
+#define MSR_SNB_UNCORE_CBO_0_PERFEVTSEL0 0x00000700
+#define MSR_SNB_UNCORE_CBO_0_PERFEVTSEL1 0x00000701
+#define MSR_SNB_UNCORE_CBO_0_UNIT_STATUS 0x00000705
+#define MSR_SNB_UNCORE_CBO_0_PER_CTR0 0x00000706
+#define MSR_SNB_UNCORE_CBO_0_PER_CTR1 0x00000707
+
+#define MSR_SNB_UNCORE_CBO_1_PERFEVTSEL0 0x00000710
+#define MSR_SNB_UNCORE_CBO_1_PERFEVTSEL1 0x00000711
+#define MSR_SNB_UNCORE_CBO_1_UNIT_STATUS 0x00000715
+#define MSR_SNB_UNCORE_CBO_1_PER_CTR0 0x00000716
+#define MSR_SNB_UNCORE_CBO_1_PER_CTR1 0x00000717
+
+#define MSR_SNB_UNCORE_CBO_2_PERFEVTSEL0 0x00000720
+#define MSR_SNB_UNCORE_CBO_2_PERFEVTSEL1 0x00000721
+#define MSR_SNB_UNCORE_CBO_2_UNIT_STATUS 0x00000725
+#define MSR_SNB_UNCORE_CBO_2_PER_CTR0 0x00000726
+#define MSR_SNB_UNCORE_CBO_2_PER_CTR1 0x00000727
+
+#define MSR_SNB_UNCORE_CBO_3_PERFEVTSEL0 0x00000730
+#define MSR_SNB_UNCORE_CBO_3_PERFEVTSEL1 0x00000731
+#define MSR_SNB_UNCORE_CBO_3_UNIT_STATUS 0x00000735
+#define MSR_SNB_UNCORE_CBO_3_PER_CTR0 0x00000736
+#define MSR_SNB_UNCORE_CBO_3_PER_CTR1 0x00000737
+
/* Geode defined MSRs */
#define MSR_GEODE_BUSCONT_CONF0 0x00001900
diff --git a/arch/x86/kernel/cpu/perf_event_intel_uncore.c b/arch/x86/kernel/cpu/perf_event_intel_uncore.c
index 79a501e..1100589 100644
--- a/arch/x86/kernel/cpu/perf_event_intel_uncore.c
+++ b/arch/x86/kernel/cpu/perf_event_intel_uncore.c
@@ -98,6 +98,59 @@ static __initconst const struct intel_uncore_pmu nhm_uncore_pmu = {
.cntval_bits_fixed = 48,
};
+/* SandyBridge uncore pmu */
+
+static struct uncore_config {
+ unsigned long config_base;
+ unsigned long event_base;
+} snb_uncore_configs[UNCORE_NUM_GENERIC_COUNTERS] = {
+ {MSR_SNB_UNCORE_CBO_0_PERFEVTSEL0, MSR_SNB_UNCORE_CBO_0_PER_CTR0},
+ {MSR_SNB_UNCORE_CBO_0_PERFEVTSEL1, MSR_SNB_UNCORE_CBO_0_PER_CTR1},
+ {MSR_SNB_UNCORE_CBO_1_PERFEVTSEL0, MSR_SNB_UNCORE_CBO_1_PER_CTR0},
+ {MSR_SNB_UNCORE_CBO_1_PERFEVTSEL1, MSR_SNB_UNCORE_CBO_1_PER_CTR1},
+ {MSR_SNB_UNCORE_CBO_2_PERFEVTSEL0, MSR_SNB_UNCORE_CBO_2_PER_CTR0},
+ {MSR_SNB_UNCORE_CBO_2_PERFEVTSEL1, MSR_SNB_UNCORE_CBO_2_PER_CTR1},
+ {MSR_SNB_UNCORE_CBO_3_PERFEVTSEL0, MSR_SNB_UNCORE_CBO_3_PER_CTR0},
+ {MSR_SNB_UNCORE_CBO_3_PERFEVTSEL1, MSR_SNB_UNCORE_CBO_3_PER_CTR1},
+};
+
+static void snb_uncore_pmu_enable_all(void)
+{
+ wrmsrl(MSR_UNCORE_PERF_GLOBAL_CTRL,
+ SNB_UNCORE_PERF_GLOBAL_CTRL_EN);
+}
+
+static void snb_uncore_pmu_hw_config(struct perf_event *event)
+{
+ struct hw_perf_event *hwc = &event->hw;
+ int i = hwc->idx;
+
+ if (event->hw.idx == X86_PMC_IDX_FIXED) {
+ uncore_fixed_hw_config(event);
+ return;
+ }
+
+ hwc->config = event->attr.config & SNB_UNCORE_RAW_EVENT_MASK;
+ hwc->config_base = snb_uncore_configs[i].config_base;
+ hwc->event_base = snb_uncore_configs[i].event_base;
+}
+
+static void snb_uncore_pmu_enable_event(struct perf_event *event)
+{
+ uncore_pmu_enable_event(event, SNB_UNCORE_FIXED_CTR_CTRL_EN);
+}
+
+static __initconst const struct intel_uncore_pmu snb_uncore_pmu = {
+ .name = "SandyBridge",
+ .disable_all = uncore_pmu_disable_all,
+ .enable_all = snb_uncore_pmu_enable_all,
+ .enable = snb_uncore_pmu_enable_event,
+ .disable = uncore_pmu_disable_event,
+ .hw_config = snb_uncore_pmu_hw_config,
+ .cntval_bits = 44,
+ .cntval_bits_fixed = 48,
+};
+
static u64 uncore_perf_event_update(struct perf_event *event)
{
struct hw_perf_event *hwc = &event->hw;
@@ -436,6 +489,10 @@ static int __init uncore_pmu_init(void)
intel_uncore_pmu = nhm_uncore_pmu;
break;
+ case 42: /* SandyBridge */
+ intel_uncore_pmu = snb_uncore_pmu;
+ break;
+
default:
return 0;
}
diff --git a/arch/x86/kernel/cpu/perf_event_intel_uncore.h b/arch/x86/kernel/cpu/perf_event_intel_uncore.h
index 431c8b4..c7392aa 100644
--- a/arch/x86/kernel/cpu/perf_event_intel_uncore.h
+++ b/arch/x86/kernel/cpu/perf_event_intel_uncore.h
@@ -5,6 +5,9 @@
#define UNCORE_FIXED_EVENT 0xFFFF
#define NHM_UNCORE_FIXED_CTR_CTRL_EN (1ULL << 0)
+#define SNB_UNCORE_FIXED_CTR_CTRL_EN (1ULL << 22)
+
+#define SNB_UNCORE_PERF_GLOBAL_CTRL_EN (1ULL << 29)
#define UNCORE_EVENTSEL_EVENT 0x000000FFULL
#define UNCORE_EVENTSEL_UMASK 0x0000FF00ULL
@@ -12,6 +15,7 @@
#define UNCORE_EVENTSEL_ENABLE (1ULL << 22)
#define UNCORE_EVENTSEL_INV (1ULL << 23)
#define NHM_UNCORE_EVENTSEL_CMASK 0xFF000000ULL
+#define SNB_UNCORE_EVENTSEL_CMASK 0x1F000000ULL
#define NHM_UNCORE_RAW_EVENT_MASK \
(UNCORE_EVENTSEL_EVENT | \
@@ -20,6 +24,13 @@
UNCORE_EVENTSEL_INV | \
NHM_UNCORE_EVENTSEL_CMASK)
+#define SNB_UNCORE_RAW_EVENT_MASK \
+ (UNCORE_EVENTSEL_EVENT | \
+ UNCORE_EVENTSEL_UMASK | \
+ UNCORE_EVENTSEL_EDGE | \
+ UNCORE_EVENTSEL_INV | \
+ SNB_UNCORE_EVENTSEL_CMASK)
+
/* 8 generic counters + 1 fixed counter */
#define UNCORE_NUM_GENERIC_COUNTERS 8
#define UNCORE_NUM_FIXED_COUNTERS 1
--
1.7.5.1
next prev parent reply other threads:[~2011-07-15 14:30 UTC|newest]
Thread overview: 34+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-07-15 14:34 [PATCH v2 0/6] perf: Intel uncore pmu counting support Lin Ming
2011-07-15 14:34 ` [PATCH v2 1/6] perf: Add interface to add general events to sysfs Lin Ming
2011-07-18 13:34 ` Peter Zijlstra
2011-07-18 14:00 ` Lin Ming
2011-07-19 7:52 ` Lin Ming
2011-07-25 7:08 ` Lin Ming
2011-07-25 7:57 ` Peter Zijlstra
2011-07-25 8:32 ` Lin Ming
2011-07-25 8:11 ` Lin Ming
2011-07-25 8:32 ` Peter Zijlstra
2011-07-25 15:20 ` Greg KH
2011-07-26 1:06 ` Lin Ming
2011-07-26 4:42 ` Greg KH
2011-07-26 5:50 ` Lin Ming
2011-07-15 14:34 ` [PATCH v2 2/6] perf, x86: Add Intel Nehalem/Westmere uncore pmu Lin Ming
2011-07-15 14:48 ` Lin Ming
2011-07-18 14:20 ` Peter Zijlstra
2011-07-18 14:54 ` Lin Ming
2011-07-18 16:11 ` Peter Zijlstra
2011-07-15 14:35 ` Lin Ming [this message]
2011-07-15 14:35 ` [PATCH v2 4/6] perf: Remove perf_event_attr::type check Lin Ming
2011-07-15 14:35 ` [PATCH v2 5/6] perf tool: Allow system-wide 'perf stat' without 'command' Lin Ming
2011-07-15 14:35 ` [PATCH v2 6/6] perf tool: Parse general/raw events from sysfs Lin Ming
2011-08-06 20:10 ` Stephane Eranian
2011-08-06 23:38 ` Lin Ming
2011-08-07 23:47 ` Stephane Eranian
2011-08-08 1:08 ` Lin Ming
2011-08-08 5:54 ` Stephane Eranian
2011-08-08 8:48 ` Peter Zijlstra
2011-08-08 8:57 ` Lin Ming
2011-08-08 9:03 ` Peter Zijlstra
2011-08-11 22:38 ` Stephane Eranian
2011-08-15 19:18 ` Corey Ashford
2011-08-31 12:21 ` [PATCH v2 0/6] perf: Intel uncore pmu counting support Stephane Eranian
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1310740503-15608-4-git-send-email-ming.m.lin@intel.com \
--to=ming.m.lin@intel.com \
--cc=a.p.zijlstra@chello.nl \
--cc=acme@ghostprotocols.net \
--cc=andi@firstfloor.org \
--cc=eranian@google.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@elte.hu \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox