3 #include <perf/cpumap.h>
4 #include <util/cpumap.h>
5 #include <internal/cpumap.h>
11 #define MIDR "/regs/identification/midr_el1"
13 #define MIDR_REVISION_MASK 0xf
14 #define MIDR_VARIANT_SHIFT 20
15 #define MIDR_VARIANT_MASK (0xf << MIDR_VARIANT_SHIFT)
17 static int _get_cpuid(char *buf
, size_t sz
, struct perf_cpu_map
*cpus
)
19 const char *sysfs
= sysfs__mountpoint();
23 if (!sysfs
|| sz
< MIDR_SIZE
)
26 cpus
= perf_cpu_map__get(cpus
);
28 for (cpu
= 0; cpu
< perf_cpu_map__nr(cpus
); cpu
++) {
32 scnprintf(path
, PATH_MAX
, "%s/devices/system/cpu/cpu%d"MIDR
,
33 sysfs
, cpus
->map
[cpu
]);
35 file
= fopen(path
, "r");
37 pr_debug("fopen failed for file %s\n", path
);
41 if (!fgets(buf
, MIDR_SIZE
, file
)) {
47 /* Ignore/clear Variant[23:20] and
48 * Revision[3:0] of MIDR
50 midr
= strtoul(buf
, NULL
, 16);
51 midr
&= (~(MIDR_VARIANT_MASK
| MIDR_REVISION_MASK
));
52 scnprintf(buf
, MIDR_SIZE
, "0x%016lx", midr
);
53 /* got midr break loop */
57 perf_cpu_map__put(cpus
);
65 int get_cpuid(char *buf
, size_t sz
)
67 struct perf_cpu_map
*cpus
= perf_cpu_map__new(NULL
);
73 ret
= _get_cpuid(buf
, sz
, cpus
);
75 perf_cpu_map__put(cpus
);
80 char *get_cpuid_str(struct perf_pmu
*pmu
)
85 if (!pmu
|| !pmu
->cpus
)
88 buf
= malloc(MIDR_SIZE
);
92 /* read midr from list of cpus mapped to this pmu */
93 res
= _get_cpuid(buf
, MIDR_SIZE
, pmu
->cpus
);
95 pr_err("failed to get cpuid string for PMU %s\n", pmu
->name
);