Cody P Schafer | 2d1b21a | 2014-03-14 16:00:39 +1100 | [diff] [blame] | 1 | #include <asm/io.h> |
| 2 | #include <asm/hvcall.h> |
| 3 | |
| 4 | #include "hv-gpci.h" |
| 5 | #include "hv-common.h" |
| 6 | |
| 7 | unsigned 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 | } |