linux/arch/powerpc/perf/hv-common.c
<<
>>
Prefs
   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 hv_gpci_system_performance_capabilities caps;
  13        } __packed __aligned(sizeof(uint64_t));
  14
  15        struct p arg = {
  16                .params = {
  17                        .counter_request = cpu_to_be32(
  18                                HV_GPCI_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 & HV_GPCI_CM_GA);
  35        caps->expanded = !!(arg.caps.capability_mask & HV_GPCI_CM_EXPANDED);
  36        caps->lab = !!(arg.caps.capability_mask & HV_GPCI_CM_LAB);
  37
  38        return r;
  39}
  40