aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--tools/perf/arch/x86/util/intel-pt.c26
1 files changed, 25 insertions, 1 deletions
diff --git a/tools/perf/arch/x86/util/intel-pt.c b/tools/perf/arch/x86/util/intel-pt.c
index faae9289bcf6..a5de01dad868 100644
--- a/tools/perf/arch/x86/util/intel-pt.c
+++ b/tools/perf/arch/x86/util/intel-pt.c
@@ -190,17 +190,33 @@ static int intel_pt_pick_bit(int bits, int target)
190static u64 intel_pt_default_config(struct perf_pmu *intel_pt_pmu) 190static u64 intel_pt_default_config(struct perf_pmu *intel_pt_pmu)
191{ 191{
192 char buf[256]; 192 char buf[256];
193 int mtc, mtc_periods = 0, mtc_period;
193 int psb_cyc, psb_periods, psb_period; 194 int psb_cyc, psb_periods, psb_period;
194 int pos = 0; 195 int pos = 0;
195 u64 config; 196 u64 config;
196 197
197 pos += scnprintf(buf + pos, sizeof(buf) - pos, "tsc"); 198 pos += scnprintf(buf + pos, sizeof(buf) - pos, "tsc");
198 199
200 if (perf_pmu__scan_file(intel_pt_pmu, "caps/mtc", "%d",
201 &mtc) != 1)
202 mtc = 1;
203
204 if (mtc) {
205 if (perf_pmu__scan_file(intel_pt_pmu, "caps/mtc_periods", "%x",
206 &mtc_periods) != 1)
207 mtc_periods = 0;
208 if (mtc_periods) {
209 mtc_period = intel_pt_pick_bit(mtc_periods, 3);
210 pos += scnprintf(buf + pos, sizeof(buf) - pos,
211 ",mtc,mtc_period=%d", mtc_period);
212 }
213 }
214
199 if (perf_pmu__scan_file(intel_pt_pmu, "caps/psb_cyc", "%d", 215 if (perf_pmu__scan_file(intel_pt_pmu, "caps/psb_cyc", "%d",
200 &psb_cyc) != 1) 216 &psb_cyc) != 1)
201 psb_cyc = 1; 217 psb_cyc = 1;
202 218
203 if (psb_cyc) { 219 if (psb_cyc && mtc_periods) {
204 if (perf_pmu__scan_file(intel_pt_pmu, "caps/psb_periods", "%x", 220 if (perf_pmu__scan_file(intel_pt_pmu, "caps/psb_periods", "%x",
205 &psb_periods) != 1) 221 &psb_periods) != 1)
206 psb_periods = 0; 222 psb_periods = 0;
@@ -454,9 +470,17 @@ out_err:
454static int intel_pt_validate_config(struct perf_pmu *intel_pt_pmu, 470static int intel_pt_validate_config(struct perf_pmu *intel_pt_pmu,
455 struct perf_evsel *evsel) 471 struct perf_evsel *evsel)
456{ 472{
473 int err;
474
457 if (!evsel) 475 if (!evsel)
458 return 0; 476 return 0;
459 477
478 err = intel_pt_val_config_term(intel_pt_pmu, "caps/mtc_periods",
479 "mtc_period", "caps/mtc",
480 evsel->attr.config);
481 if (err)
482 return err;
483
460 return intel_pt_val_config_term(intel_pt_pmu, "caps/psb_periods", 484 return intel_pt_val_config_term(intel_pt_pmu, "caps/psb_periods",
461 "psb_period", "caps/psb_cyc", 485 "psb_period", "caps/psb_cyc",
462 evsel->attr.config); 486 evsel->attr.config);