mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-29 22:14:41 +08:00
9e9f601084
This adds (in req-gen/) a framework for defining gpci counter requests. It uses macro magic similar to ftrace. Also convert the existing hv-gpci request structures and enum values to use the new framework (and adjust old users of the structs and enum values to cope with changes in naming). In exchange for this macro disaster, we get autogenerated event listing for GPCI in sysfs, build time field offset checking, and zero duplication of information about GPCI requests. Signed-off-by: Cody P Schafer <cody@linux.vnet.ibm.com> Signed-off-by: Sukadev Bhattiprolu <sukadev@linux.vnet.ibm.com> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
40 lines
1019 B
C
40 lines
1019 B
C
#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;
|
|
}
|