hc
2024-08-14 93e8ba98c407598d13d8ade71bc7802acfb19c58
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
// SPDX-License-Identifier: GPL-2.0
#include <asm/io.h>
#include <asm/hvcall.h>
 
#include "hv-gpci.h"
#include "hv-common.h"
 
unsigned long hv_perf_caps_get(struct hv_perf_caps *caps)
{
   unsigned long r;
   struct p {
       struct hv_get_perf_counter_info_params params;
       struct hv_gpci_system_performance_capabilities caps;
   } __packed __aligned(sizeof(uint64_t));
 
   struct p arg = {
       .params = {
           .counter_request = cpu_to_be32(
               HV_GPCI_system_performance_capabilities),
           .starting_index = cpu_to_be32(-1),
           .counter_info_version_in = 0,
       }
   };
 
   r = plpar_hcall_norets(H_GET_PERF_COUNTER_INFO,
                  virt_to_phys(&arg), sizeof(arg));
 
   if (r)
       return r;
 
   pr_devel("capability_mask: 0x%x\n", arg.caps.capability_mask);
 
   caps->version = arg.params.counter_info_version_out;
   caps->collect_privileged = !!arg.caps.perf_collect_privileged;
   caps->ga = !!(arg.caps.capability_mask & HV_GPCI_CM_GA);
   caps->expanded = !!(arg.caps.capability_mask & HV_GPCI_CM_EXPANDED);
   caps->lab = !!(arg.caps.capability_mask & HV_GPCI_CM_LAB);
 
   return r;
}