summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--tools/perf/util/arm-spe.c50
1 files changed, 24 insertions, 26 deletions
diff --git a/tools/perf/util/arm-spe.c b/tools/perf/util/arm-spe.c
index a291a412f6a1..dbf13f47879c 100644
--- a/tools/perf/util/arm-spe.c
+++ b/tools/perf/util/arm-spe.c
@@ -562,37 +562,35 @@ static bool arm_spe__is_common_ds_encoding(struct arm_spe_queue *speq)
u64 *metadata = NULL;
u64 midr = 0;
- /*
- * Metadata version 1 doesn't contain any info for MIDR.
- * Simply return false in this case.
- */
+ /* Metadata version 1 assumes all CPUs are the same (old behavior) */
if (spe->metadata_ver == 1) {
- pr_warning_once("The data file contains metadata version 1, "
- "which is absent the info for data source. "
- "Please upgrade the tool to record data.\n");
- return false;
- }
-
- /* CPU ID is -1 for per-thread mode */
- if (speq->cpu < 0) {
- /*
- * On the heterogeneous system, due to CPU ID is -1,
- * cannot confirm the data source packet is supported.
- */
- if (!spe->is_homogeneous)
- return false;
+ const char *cpuid;
- /* In homogeneous system, simply use CPU0's metadata */
- if (spe->metadata)
- metadata = spe->metadata[0];
+ pr_warning_once("Old SPE metadata, re-record to improve decode accuracy\n");
+ cpuid = perf_env__cpuid(spe->session->evlist->env);
+ midr = strtol(cpuid, NULL, 16);
} else {
- metadata = arm_spe__get_metadata_by_cpu(spe, speq->cpu);
- }
+ /* CPU ID is -1 for per-thread mode */
+ if (speq->cpu < 0) {
+ /*
+ * On the heterogeneous system, due to CPU ID is -1,
+ * cannot confirm the data source packet is supported.
+ */
+ if (!spe->is_homogeneous)
+ return false;
+
+ /* In homogeneous system, simply use CPU0's metadata */
+ if (spe->metadata)
+ metadata = spe->metadata[0];
+ } else {
+ metadata = arm_spe__get_metadata_by_cpu(spe, speq->cpu);
+ }
- if (!metadata)
- return false;
+ if (!metadata)
+ return false;
- midr = metadata[ARM_SPE_CPU_MIDR];
+ midr = metadata[ARM_SPE_CPU_MIDR];
+ }
is_in_cpu_list = is_midr_in_range_list(midr, common_ds_encoding_cpus);
if (is_in_cpu_list)