diff options
| -rw-r--r-- | tools/perf/arch/x86/util/intel-pt.c | 26 |
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) | |||
| 190 | static u64 intel_pt_default_config(struct perf_pmu *intel_pt_pmu) | 190 | static 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: | |||
| 454 | static int intel_pt_validate_config(struct perf_pmu *intel_pt_pmu, | 470 | static 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); |
