6 #define MIDR "/regs/identification/midr_el1"
8 #define MIDR_REVISION_MASK 0xf
9 #define MIDR_VARIANT_SHIFT 20
10 #define MIDR_VARIANT_MASK (0xf << MIDR_VARIANT_SHIFT)
12 char *get_cpuid_str(struct perf_pmu
*pmu
)
16 const char *sysfs
= sysfs__mountpoint();
22 if (!sysfs
|| !pmu
|| !pmu
->cpus
)
25 buf
= malloc(MIDR_SIZE
);
29 /* read midr from list of cpus mapped to this pmu */
30 cpus
= cpu_map__get(pmu
->cpus
);
31 for (cpu
= 0; cpu
< cpus
->nr
; 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 */
58 pr_err("failed to get cpuid string for PMU %s\n", pmu
->name
);