arm_pmu.h 4.0 KB
Newer Older
1
/* SPDX-License-Identifier: GPL-2.0-only */
2 3 4 5 6 7 8 9 10 11 12
/*
 * Copyright (C) 2015 Linaro Ltd.
 * Author: Shannon Zhao <shannon.zhao@linaro.org>
 */

#ifndef __ASM_ARM_KVM_PMU_H
#define __ASM_ARM_KVM_PMU_H

#include <linux/perf_event.h>
#include <asm/perf_event.h>

13
#define ARMV8_PMU_CYCLE_IDX		(ARMV8_PMU_MAX_COUNTERS - 1)
14
#define ARMV8_PMU_MAX_COUNTER_PAIRS	((ARMV8_PMU_MAX_COUNTERS + 1) >> 1)
15

16 17
#ifdef CONFIG_KVM_ARM_PMU

18 19 20 21 22 23 24 25
struct kvm_pmc {
	u8 idx;	/* index into the pmu->pmc array */
	struct perf_event *perf_event;
};

struct kvm_pmu {
	int irq_num;
	struct kvm_pmc pmc[ARMV8_PMU_MAX_COUNTERS];
26
	DECLARE_BITMAP(chained, ARMV8_PMU_MAX_COUNTER_PAIRS);
27
	bool ready;
28
	bool created;
29
	bool irq_level;
30
};
31 32

#define kvm_arm_pmu_v3_ready(v)		((v)->arch.pmu.ready)
33
#define kvm_arm_pmu_irq_initialized(v)	((v)->arch.pmu.irq_num >= VGIC_NR_SGIS)
34 35
u64 kvm_pmu_get_counter_value(struct kvm_vcpu *vcpu, u64 select_idx);
void kvm_pmu_set_counter_value(struct kvm_vcpu *vcpu, u64 select_idx, u64 val);
36
u64 kvm_pmu_valid_counter_mask(struct kvm_vcpu *vcpu);
37
u64 kvm_pmu_get_pmceid(struct kvm_vcpu *vcpu, bool pmceid1);
38
void kvm_pmu_vcpu_init(struct kvm_vcpu *vcpu);
39
void kvm_pmu_vcpu_reset(struct kvm_vcpu *vcpu);
40
void kvm_pmu_vcpu_destroy(struct kvm_vcpu *vcpu);
41 42
void kvm_pmu_disable_counter_mask(struct kvm_vcpu *vcpu, u64 val);
void kvm_pmu_enable_counter_mask(struct kvm_vcpu *vcpu, u64 val);
43 44
void kvm_pmu_flush_hwstate(struct kvm_vcpu *vcpu);
void kvm_pmu_sync_hwstate(struct kvm_vcpu *vcpu);
45 46
bool kvm_pmu_should_notify_user(struct kvm_vcpu *vcpu);
void kvm_pmu_update_run(struct kvm_vcpu *vcpu);
47
void kvm_pmu_software_increment(struct kvm_vcpu *vcpu, u64 val);
48
void kvm_pmu_handle_pmcr(struct kvm_vcpu *vcpu, u64 val);
49 50
void kvm_pmu_set_counter_event_type(struct kvm_vcpu *vcpu, u64 data,
				    u64 select_idx);
51
bool kvm_arm_support_pmu_v3(void);
52 53 54 55 56 57
int kvm_arm_pmu_v3_set_attr(struct kvm_vcpu *vcpu,
			    struct kvm_device_attr *attr);
int kvm_arm_pmu_v3_get_attr(struct kvm_vcpu *vcpu,
			    struct kvm_device_attr *attr);
int kvm_arm_pmu_v3_has_attr(struct kvm_vcpu *vcpu,
			    struct kvm_device_attr *attr);
58
int kvm_arm_pmu_v3_enable(struct kvm_vcpu *vcpu);
59 60 61
#else
struct kvm_pmu {
};
62 63

#define kvm_arm_pmu_v3_ready(v)		(false)
64
#define kvm_arm_pmu_irq_initialized(v)	(false)
65 66 67 68 69 70 71
static inline u64 kvm_pmu_get_counter_value(struct kvm_vcpu *vcpu,
					    u64 select_idx)
{
	return 0;
}
static inline void kvm_pmu_set_counter_value(struct kvm_vcpu *vcpu,
					     u64 select_idx, u64 val) {}
72 73 74 75
static inline u64 kvm_pmu_valid_counter_mask(struct kvm_vcpu *vcpu)
{
	return 0;
}
76
static inline void kvm_pmu_vcpu_init(struct kvm_vcpu *vcpu) {}
77
static inline void kvm_pmu_vcpu_reset(struct kvm_vcpu *vcpu) {}
78
static inline void kvm_pmu_vcpu_destroy(struct kvm_vcpu *vcpu) {}
79 80
static inline void kvm_pmu_disable_counter_mask(struct kvm_vcpu *vcpu, u64 val) {}
static inline void kvm_pmu_enable_counter_mask(struct kvm_vcpu *vcpu, u64 val) {}
81 82
static inline void kvm_pmu_flush_hwstate(struct kvm_vcpu *vcpu) {}
static inline void kvm_pmu_sync_hwstate(struct kvm_vcpu *vcpu) {}
83 84 85 86 87
static inline bool kvm_pmu_should_notify_user(struct kvm_vcpu *vcpu)
{
	return false;
}
static inline void kvm_pmu_update_run(struct kvm_vcpu *vcpu) {}
88
static inline void kvm_pmu_software_increment(struct kvm_vcpu *vcpu, u64 val) {}
89
static inline void kvm_pmu_handle_pmcr(struct kvm_vcpu *vcpu, u64 val) {}
90 91
static inline void kvm_pmu_set_counter_event_type(struct kvm_vcpu *vcpu,
						  u64 data, u64 select_idx) {}
92
static inline bool kvm_arm_support_pmu_v3(void) { return false; }
93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
static inline int kvm_arm_pmu_v3_set_attr(struct kvm_vcpu *vcpu,
					  struct kvm_device_attr *attr)
{
	return -ENXIO;
}
static inline int kvm_arm_pmu_v3_get_attr(struct kvm_vcpu *vcpu,
					  struct kvm_device_attr *attr)
{
	return -ENXIO;
}
static inline int kvm_arm_pmu_v3_has_attr(struct kvm_vcpu *vcpu,
					  struct kvm_device_attr *attr)
{
	return -ENXIO;
}
108 109 110 111
static inline int kvm_arm_pmu_v3_enable(struct kvm_vcpu *vcpu)
{
	return 0;
}
112 113 114 115
static inline u64 kvm_pmu_get_pmceid(struct kvm_vcpu *vcpu, bool pmceid1)
{
	return 0;
}
116 117 118
#endif

#endif