]> git.proxmox.com Git - mirror_ubuntu-focal-kernel.git/blame - tools/perf/arch/arm64/util/header.c
perf env: Remove needless cpumap.h header
[mirror_ubuntu-focal-kernel.git] / tools / perf / arch / arm64 / util / header.c
CommitLineData
b57df288
GK
1#include <stdio.h>
2#include <stdlib.h>
87ffb6c6
ACM
3#include <perf/cpumap.h>
4#include <internal/cpumap.h>
b57df288 5#include <api/fs/fs.h>
45a2c0cc 6#include "debug.h"
b57df288
GK
7#include "header.h"
8
9#define MIDR "/regs/identification/midr_el1"
10#define MIDR_SIZE 19
11#define MIDR_REVISION_MASK 0xf
12#define MIDR_VARIANT_SHIFT 20
13#define MIDR_VARIANT_MASK (0xf << MIDR_VARIANT_SHIFT)
14
15char *get_cpuid_str(struct perf_pmu *pmu)
16{
17 char *buf = NULL;
18 char path[PATH_MAX];
19 const char *sysfs = sysfs__mountpoint();
20 int cpu;
21 u64 midr = 0;
f854839b 22 struct perf_cpu_map *cpus;
b57df288
GK
23 FILE *file;
24
25 if (!sysfs || !pmu || !pmu->cpus)
26 return NULL;
27
28 buf = malloc(MIDR_SIZE);
29 if (!buf)
30 return NULL;
31
32 /* read midr from list of cpus mapped to this pmu */
38f01d8d 33 cpus = perf_cpu_map__get(pmu->cpus);
87ffb6c6 34 for (cpu = 0; cpu < perf_cpu_map__nr(cpus); cpu++) {
b57df288
GK
35 scnprintf(path, PATH_MAX, "%s/devices/system/cpu/cpu%d"MIDR,
36 sysfs, cpus->map[cpu]);
37
38 file = fopen(path, "r");
39 if (!file) {
40 pr_debug("fopen failed for file %s\n", path);
41 continue;
42 }
43
44 if (!fgets(buf, MIDR_SIZE, file)) {
45 fclose(file);
46 continue;
47 }
48 fclose(file);
49
50 /* Ignore/clear Variant[23:20] and
51 * Revision[3:0] of MIDR
52 */
53 midr = strtoul(buf, NULL, 16);
54 midr &= (~(MIDR_VARIANT_MASK | MIDR_REVISION_MASK));
55 scnprintf(buf, MIDR_SIZE, "0x%016lx", midr);
56 /* got midr break loop */
57 break;
58 }
59
60 if (!midr) {
61 pr_err("failed to get cpuid string for PMU %s\n", pmu->name);
62 free(buf);
63 buf = NULL;
64 }
65
38f01d8d 66 perf_cpu_map__put(cpus);
b57df288
GK
67 return buf;
68}