aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/powerpc/perf/hv-common.c39
-rw-r--r--arch/powerpc/perf/hv-common.h17
2 files changed, 56 insertions, 0 deletions
diff --git a/arch/powerpc/perf/hv-common.c b/arch/powerpc/perf/hv-common.c
new file mode 100644
index 000000000000..47e02b366f58
--- /dev/null
+++ b/arch/powerpc/perf/hv-common.c
@@ -0,0 +1,39 @@
1#include <asm/io.h>
2#include <asm/hvcall.h>
3
4#include "hv-gpci.h"
5#include "hv-common.h"
6
7unsigned long hv_perf_caps_get(struct hv_perf_caps *caps)
8{
9 unsigned long r;
10 struct p {
11 struct hv_get_perf_counter_info_params params;
12 struct cv_system_performance_capabilities caps;
13 } __packed __aligned(sizeof(uint64_t));
14
15 struct p arg = {
16 .params = {
17 .counter_request = cpu_to_be32(
18 CIR_SYSTEM_PERFORMANCE_CAPABILITIES),
19 .starting_index = cpu_to_be32(-1),
20 .counter_info_version_in = 0,
21 }
22 };
23
24 r = plpar_hcall_norets(H_GET_PERF_COUNTER_INFO,
25 virt_to_phys(&arg), sizeof(arg));
26
27 if (r)
28 return r;
29
30 pr_devel("capability_mask: 0x%x\n", arg.caps.capability_mask);
31
32 caps->version = arg.params.counter_info_version_out;
33 caps->collect_privileged = !!arg.caps.perf_collect_privileged;
34 caps->ga = !!(arg.caps.capability_mask & CV_CM_GA);
35 caps->expanded = !!(arg.caps.capability_mask & CV_CM_EXPANDED);
36 caps->lab = !!(arg.caps.capability_mask & CV_CM_LAB);
37
38 return r;
39}
diff --git a/arch/powerpc/perf/hv-common.h b/arch/powerpc/perf/hv-common.h
new file mode 100644
index 000000000000..7e615bd38bca
--- /dev/null
+++ b/arch/powerpc/perf/hv-common.h
@@ -0,0 +1,17 @@
1#ifndef LINUX_POWERPC_PERF_HV_COMMON_H_
2#define LINUX_POWERPC_PERF_HV_COMMON_H_
3
4#include <linux/types.h>
5
6struct hv_perf_caps {
7 u16 version;
8 u16 collect_privileged:1,
9 ga:1,
10 expanded:1,
11 lab:1,
12 unused:12;
13};
14
15unsigned long hv_perf_caps_get(struct hv_perf_caps *caps);
16
17#endif