xref: /linux/tools/perf/arch/arm64/util/pmu.c (revision 3df692169e8486fc3dd91fcd5ea81c27a0bac033)
1 // SPDX-License-Identifier: GPL-2.0
2 
3 #include <internal/cpumap.h>
4 #include "../../../util/cpumap.h"
5 #include "../../../util/header.h"
6 #include "../../../util/pmu.h"
7 #include "../../../util/pmus.h"
8 #include <api/fs/fs.h>
9 #include <math.h>
10 
11 const struct pmu_metrics_table *pmu_metrics_table__find(void)
12 {
13 	struct perf_pmu *pmu;
14 
15 	/* Metrics aren't currently supported on heterogeneous Arm systems */
16 	if (perf_pmus__num_core_pmus() > 1)
17 		return NULL;
18 
19 	/* Doesn't matter which one here because they'll all be the same */
20 	pmu = perf_pmus__find_core_pmu();
21 	if (pmu)
22 		return perf_pmu__find_metrics_table(pmu);
23 
24 	return NULL;
25 }
26 
27 double perf_pmu__cpu_slots_per_cycle(void)
28 {
29 	char path[PATH_MAX];
30 	unsigned long long slots = 0;
31 	struct perf_pmu *pmu = perf_pmus__find_core_pmu();
32 
33 	if (pmu) {
34 		perf_pmu__pathname_scnprintf(path, sizeof(path),
35 					     pmu->name, "caps/slots");
36 		/*
37 		 * The value of slots is not greater than 32 bits, but
38 		 * filename__read_int can't read value with 0x prefix,
39 		 * so use filename__read_ull instead.
40 		 */
41 		filename__read_ull(path, &slots);
42 	}
43 
44 	return slots ? (double)slots : NAN;
45 }
46