aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHuang Rui <ray.huang@amd.com>2016-01-29 03:29:56 -0500
committerIngo Molnar <mingo@kernel.org>2016-03-31 04:30:39 -0400
commit8a22426184774d7ced9c1d3aa4d95d34101fb3be (patch)
treed26fbc389c1d47ae503a5cbdd614f2ad437bd6ef
parentc7afba320e91cca46fdf078798002b9ec84be8d3 (diff)
perf/x86/msr: Add AMD PTSC (Performance Time-Stamp Counter) support
AMD Carrizo (Family 15h, Model 60h) introduces a time-stamp counter which is indicated by CPUID.8000_0001H:ECX[27]. It increments at a 100 MHz rate in all P-states, and C states, S0, or S1. The frequency is about 100MHz. This counter will be used to calculate processor power and other parts. So add an interface into the MSR PMU to get the PTSC counter value. Signed-off-by: Huang Rui <ray.huang@amd.com> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com> Cc: Andy Lutomirski <luto@amacapital.net> Cc: Aravind Gopalakrishnan <Aravind.Gopalakrishnan@amd.com> Cc: Arnaldo Carvalho de Melo <acme@kernel.org> Cc: Arnaldo Carvalho de Melo <acme@redhat.com> Cc: Borislav Petkov <bp@alien8.de> Cc: Borislav Petkov <bp@suse.de> Cc: Fengguang Wu <fengguang.wu@intel.com> Cc: Jacob Shin <jacob.w.shin@gmail.com> Cc: Jiri Olsa <jolsa@redhat.com> Cc: Kan Liang <kan.liang@intel.com> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Robert Richter <rric@kernel.org> Cc: Stephane Eranian <eranian@google.com> Cc: Suravee Suthikulpanit <suravee.suthikulpanit@amd.com> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: Vince Weaver <vincent.weaver@maine.edu> Link: http://lkml.kernel.org/r/1454056197-5893-2-git-send-email-ray.huang@amd.com Signed-off-by: Ingo Molnar <mingo@kernel.org>
-rw-r--r--arch/x86/events/msr.c8
-rw-r--r--arch/x86/include/asm/cpufeatures.h1
-rw-r--r--arch/x86/include/asm/msr-index.h1
3 files changed, 10 insertions, 0 deletions
diff --git a/arch/x86/events/msr.c b/arch/x86/events/msr.c
index ec863b9a9f78..6f6772f273aa 100644
--- a/arch/x86/events/msr.c
+++ b/arch/x86/events/msr.c
@@ -6,6 +6,7 @@ enum perf_msr_id {
6 PERF_MSR_MPERF = 2, 6 PERF_MSR_MPERF = 2,
7 PERF_MSR_PPERF = 3, 7 PERF_MSR_PPERF = 3,
8 PERF_MSR_SMI = 4, 8 PERF_MSR_SMI = 4,
9 PERF_MSR_PTSC = 5,
9 10
10 PERF_MSR_EVENT_MAX, 11 PERF_MSR_EVENT_MAX,
11}; 12};
@@ -15,6 +16,11 @@ static bool test_aperfmperf(int idx)
15 return boot_cpu_has(X86_FEATURE_APERFMPERF); 16 return boot_cpu_has(X86_FEATURE_APERFMPERF);
16} 17}
17 18
19static bool test_ptsc(int idx)
20{
21 return boot_cpu_has(X86_FEATURE_PTSC);
22}
23
18static bool test_intel(int idx) 24static bool test_intel(int idx)
19{ 25{
20 if (boot_cpu_data.x86_vendor != X86_VENDOR_INTEL || 26 if (boot_cpu_data.x86_vendor != X86_VENDOR_INTEL ||
@@ -74,6 +80,7 @@ PMU_EVENT_ATTR_STRING(aperf, evattr_aperf, "event=0x01");
74PMU_EVENT_ATTR_STRING(mperf, evattr_mperf, "event=0x02"); 80PMU_EVENT_ATTR_STRING(mperf, evattr_mperf, "event=0x02");
75PMU_EVENT_ATTR_STRING(pperf, evattr_pperf, "event=0x03"); 81PMU_EVENT_ATTR_STRING(pperf, evattr_pperf, "event=0x03");
76PMU_EVENT_ATTR_STRING(smi, evattr_smi, "event=0x04"); 82PMU_EVENT_ATTR_STRING(smi, evattr_smi, "event=0x04");
83PMU_EVENT_ATTR_STRING(ptsc, evattr_ptsc, "event=0x05");
77 84
78static struct perf_msr msr[] = { 85static struct perf_msr msr[] = {
79 [PERF_MSR_TSC] = { 0, &evattr_tsc, NULL, }, 86 [PERF_MSR_TSC] = { 0, &evattr_tsc, NULL, },
@@ -81,6 +88,7 @@ static struct perf_msr msr[] = {
81 [PERF_MSR_MPERF] = { MSR_IA32_MPERF, &evattr_mperf, test_aperfmperf, }, 88 [PERF_MSR_MPERF] = { MSR_IA32_MPERF, &evattr_mperf, test_aperfmperf, },
82 [PERF_MSR_PPERF] = { MSR_PPERF, &evattr_pperf, test_intel, }, 89 [PERF_MSR_PPERF] = { MSR_PPERF, &evattr_pperf, test_intel, },
83 [PERF_MSR_SMI] = { MSR_SMI_COUNT, &evattr_smi, test_intel, }, 90 [PERF_MSR_SMI] = { MSR_SMI_COUNT, &evattr_smi, test_intel, },
91 [PERF_MSR_PTSC] = { MSR_F15H_PTSC, &evattr_ptsc, test_ptsc, },
84}; 92};
85 93
86static struct attribute *events_attrs[PERF_MSR_EVENT_MAX + 1] = { 94static struct attribute *events_attrs[PERF_MSR_EVENT_MAX + 1] = {
diff --git a/arch/x86/include/asm/cpufeatures.h b/arch/x86/include/asm/cpufeatures.h
index 44ebd04878eb..bdf9042f0295 100644
--- a/arch/x86/include/asm/cpufeatures.h
+++ b/arch/x86/include/asm/cpufeatures.h
@@ -177,6 +177,7 @@
177#define X86_FEATURE_PERFCTR_CORE ( 6*32+23) /* core performance counter extensions */ 177#define X86_FEATURE_PERFCTR_CORE ( 6*32+23) /* core performance counter extensions */
178#define X86_FEATURE_PERFCTR_NB ( 6*32+24) /* NB performance counter extensions */ 178#define X86_FEATURE_PERFCTR_NB ( 6*32+24) /* NB performance counter extensions */
179#define X86_FEATURE_BPEXT (6*32+26) /* data breakpoint extension */ 179#define X86_FEATURE_BPEXT (6*32+26) /* data breakpoint extension */
180#define X86_FEATURE_PTSC ( 6*32+27) /* performance time-stamp counter */
180#define X86_FEATURE_PERFCTR_L2 ( 6*32+28) /* L2 performance counter extensions */ 181#define X86_FEATURE_PERFCTR_L2 ( 6*32+28) /* L2 performance counter extensions */
181#define X86_FEATURE_MWAITX ( 6*32+29) /* MWAIT extension (MONITORX/MWAITX) */ 182#define X86_FEATURE_MWAITX ( 6*32+29) /* MWAIT extension (MONITORX/MWAITX) */
182 183
diff --git a/arch/x86/include/asm/msr-index.h b/arch/x86/include/asm/msr-index.h
index 984ab75bf621..6e6a5ccfb3f5 100644
--- a/arch/x86/include/asm/msr-index.h
+++ b/arch/x86/include/asm/msr-index.h
@@ -326,6 +326,7 @@
326#define MSR_F15H_PERF_CTR 0xc0010201 326#define MSR_F15H_PERF_CTR 0xc0010201
327#define MSR_F15H_NB_PERF_CTL 0xc0010240 327#define MSR_F15H_NB_PERF_CTL 0xc0010240
328#define MSR_F15H_NB_PERF_CTR 0xc0010241 328#define MSR_F15H_NB_PERF_CTR 0xc0010241
329#define MSR_F15H_PTSC 0xc0010280
329#define MSR_F15H_IC_CFG 0xc0011021 330#define MSR_F15H_IC_CFG 0xc0011021
330 331
331/* Fam 10h MSRs */ 332/* Fam 10h MSRs */