Message ID | 20240607-arm-pmu-3-9-icntr-v1-5-c7bd2dceff3b@kernel.org (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | arm64: Add support for Armv9.4 PMU fixed instruction counter | expand |
On Fri, Jun 07, 2024 at 02:31:30PM -0600, Rob Herring (Arm) wrote: > Commit df29ddf4f04b ("arm64: perf: Abstract system register accesses > away") split off PMU register accessor functions to a standalone header. > Let's use it for KVM PMU code and get rid one copy of the ugly switch > macro. > > Signed-off-by: Rob Herring (Arm) <robh@kernel.org> > --- > arch/arm64/include/asm/arm_pmuv3.h | 13 ++++++++ > arch/arm64/kvm/pmu.c | 67 +++++--------------------------------- > 2 files changed, 22 insertions(+), 58 deletions(-) Acked-by: Mark Rutland <mark.rutland@arm.com> Mark. > > diff --git a/arch/arm64/include/asm/arm_pmuv3.h b/arch/arm64/include/asm/arm_pmuv3.h > index e96ce7900fc7..1ed91334fede 100644 > --- a/arch/arm64/include/asm/arm_pmuv3.h > +++ b/arch/arm64/include/asm/arm_pmuv3.h > @@ -33,6 +33,14 @@ static inline void write_pmevtypern(int n, unsigned long val) > PMEVN_SWITCH(n, WRITE_PMEVTYPERN); > } > > +#define RETURN_READ_PMEVTYPERN(n) \ > + return read_sysreg(pmevtyper##n##_el0) > +static inline unsigned long read_pmevtypern(int n) > +{ > + PMEVN_SWITCH(n, RETURN_READ_PMEVTYPERN); > + return 0; > +} > + > static inline unsigned long read_pmmir(void) > { > return read_cpuid(PMMIR_EL1); > @@ -96,6 +104,11 @@ static inline void write_pmccfiltr(u64 val) > write_sysreg(val, pmccfiltr_el0); > } > > +static inline u64 read_pmccfiltr(void) > +{ > + return read_sysreg(pmccfiltr_el0); > +} > + > static inline void write_pmovsclr(u64 val) > { > write_sysreg(val, pmovsclr_el0); > diff --git a/arch/arm64/kvm/pmu.c b/arch/arm64/kvm/pmu.c > index e633b4434c6a..01c9a9efdd1c 100644 > --- a/arch/arm64/kvm/pmu.c > +++ b/arch/arm64/kvm/pmu.c > @@ -6,6 +6,8 @@ > #include <linux/kvm_host.h> > #include <linux/perf_event.h> > > +#include <asm/arm_pmuv3.h> > + > static DEFINE_PER_CPU(struct kvm_pmu_events, kvm_pmu_events); > > /* > @@ -62,63 +64,16 @@ void kvm_clr_pmu_events(u64 clr) > pmu->events_guest &= ~clr; > } > > -#define PMEVTYPER_READ_CASE(idx) \ > - case idx: \ > - return read_sysreg(pmevtyper##idx##_el0) > - > -#define PMEVTYPER_WRITE_CASE(idx) \ > - case idx: \ > - write_sysreg(val, pmevtyper##idx##_el0); \ > - break > - > -#define PMEVTYPER_CASES(readwrite) \ > - PMEVTYPER_##readwrite##_CASE(0); \ > - PMEVTYPER_##readwrite##_CASE(1); \ > - PMEVTYPER_##readwrite##_CASE(2); \ > - PMEVTYPER_##readwrite##_CASE(3); \ > - PMEVTYPER_##readwrite##_CASE(4); \ > - PMEVTYPER_##readwrite##_CASE(5); \ > - PMEVTYPER_##readwrite##_CASE(6); \ > - PMEVTYPER_##readwrite##_CASE(7); \ > - PMEVTYPER_##readwrite##_CASE(8); \ > - PMEVTYPER_##readwrite##_CASE(9); \ > - PMEVTYPER_##readwrite##_CASE(10); \ > - PMEVTYPER_##readwrite##_CASE(11); \ > - PMEVTYPER_##readwrite##_CASE(12); \ > - PMEVTYPER_##readwrite##_CASE(13); \ > - PMEVTYPER_##readwrite##_CASE(14); \ > - PMEVTYPER_##readwrite##_CASE(15); \ > - PMEVTYPER_##readwrite##_CASE(16); \ > - PMEVTYPER_##readwrite##_CASE(17); \ > - PMEVTYPER_##readwrite##_CASE(18); \ > - PMEVTYPER_##readwrite##_CASE(19); \ > - PMEVTYPER_##readwrite##_CASE(20); \ > - PMEVTYPER_##readwrite##_CASE(21); \ > - PMEVTYPER_##readwrite##_CASE(22); \ > - PMEVTYPER_##readwrite##_CASE(23); \ > - PMEVTYPER_##readwrite##_CASE(24); \ > - PMEVTYPER_##readwrite##_CASE(25); \ > - PMEVTYPER_##readwrite##_CASE(26); \ > - PMEVTYPER_##readwrite##_CASE(27); \ > - PMEVTYPER_##readwrite##_CASE(28); \ > - PMEVTYPER_##readwrite##_CASE(29); \ > - PMEVTYPER_##readwrite##_CASE(30) > - > /* > * Read a value direct from PMEVTYPER<idx> where idx is 0-30 > * or PMCCFILTR_EL0 where idx is ARMV8_PMU_CYCLE_IDX (31). > */ > static u64 kvm_vcpu_pmu_read_evtype_direct(int idx) > { > - switch (idx) { > - PMEVTYPER_CASES(READ); > - case ARMV8_PMU_CYCLE_IDX: > - return read_sysreg(pmccfiltr_el0); > - default: > - WARN_ON(1); > - } > + if (idx == ARMV8_PMU_CYCLE_IDX) > + return read_pmccfiltr(); > > - return 0; > + return read_pmevtypern(idx); > } > > /* > @@ -127,14 +82,10 @@ static u64 kvm_vcpu_pmu_read_evtype_direct(int idx) > */ > static void kvm_vcpu_pmu_write_evtype_direct(int idx, u32 val) > { > - switch (idx) { > - PMEVTYPER_CASES(WRITE); > - case ARMV8_PMU_CYCLE_IDX: > - write_sysreg(val, pmccfiltr_el0); > - break; > - default: > - WARN_ON(1); > - } > + if (idx == ARMV8_PMU_CYCLE_IDX) > + write_pmccfiltr(val); > + else > + write_pmevtypern(idx, val); > } > > /* > > -- > 2.43.0 >
diff --git a/arch/arm64/include/asm/arm_pmuv3.h b/arch/arm64/include/asm/arm_pmuv3.h index e96ce7900fc7..1ed91334fede 100644 --- a/arch/arm64/include/asm/arm_pmuv3.h +++ b/arch/arm64/include/asm/arm_pmuv3.h @@ -33,6 +33,14 @@ static inline void write_pmevtypern(int n, unsigned long val) PMEVN_SWITCH(n, WRITE_PMEVTYPERN); } +#define RETURN_READ_PMEVTYPERN(n) \ + return read_sysreg(pmevtyper##n##_el0) +static inline unsigned long read_pmevtypern(int n) +{ + PMEVN_SWITCH(n, RETURN_READ_PMEVTYPERN); + return 0; +} + static inline unsigned long read_pmmir(void) { return read_cpuid(PMMIR_EL1); @@ -96,6 +104,11 @@ static inline void write_pmccfiltr(u64 val) write_sysreg(val, pmccfiltr_el0); } +static inline u64 read_pmccfiltr(void) +{ + return read_sysreg(pmccfiltr_el0); +} + static inline void write_pmovsclr(u64 val) { write_sysreg(val, pmovsclr_el0); diff --git a/arch/arm64/kvm/pmu.c b/arch/arm64/kvm/pmu.c index e633b4434c6a..01c9a9efdd1c 100644 --- a/arch/arm64/kvm/pmu.c +++ b/arch/arm64/kvm/pmu.c @@ -6,6 +6,8 @@ #include <linux/kvm_host.h> #include <linux/perf_event.h> +#include <asm/arm_pmuv3.h> + static DEFINE_PER_CPU(struct kvm_pmu_events, kvm_pmu_events); /* @@ -62,63 +64,16 @@ void kvm_clr_pmu_events(u64 clr) pmu->events_guest &= ~clr; } -#define PMEVTYPER_READ_CASE(idx) \ - case idx: \ - return read_sysreg(pmevtyper##idx##_el0) - -#define PMEVTYPER_WRITE_CASE(idx) \ - case idx: \ - write_sysreg(val, pmevtyper##idx##_el0); \ - break - -#define PMEVTYPER_CASES(readwrite) \ - PMEVTYPER_##readwrite##_CASE(0); \ - PMEVTYPER_##readwrite##_CASE(1); \ - PMEVTYPER_##readwrite##_CASE(2); \ - PMEVTYPER_##readwrite##_CASE(3); \ - PMEVTYPER_##readwrite##_CASE(4); \ - PMEVTYPER_##readwrite##_CASE(5); \ - PMEVTYPER_##readwrite##_CASE(6); \ - PMEVTYPER_##readwrite##_CASE(7); \ - PMEVTYPER_##readwrite##_CASE(8); \ - PMEVTYPER_##readwrite##_CASE(9); \ - PMEVTYPER_##readwrite##_CASE(10); \ - PMEVTYPER_##readwrite##_CASE(11); \ - PMEVTYPER_##readwrite##_CASE(12); \ - PMEVTYPER_##readwrite##_CASE(13); \ - PMEVTYPER_##readwrite##_CASE(14); \ - PMEVTYPER_##readwrite##_CASE(15); \ - PMEVTYPER_##readwrite##_CASE(16); \ - PMEVTYPER_##readwrite##_CASE(17); \ - PMEVTYPER_##readwrite##_CASE(18); \ - PMEVTYPER_##readwrite##_CASE(19); \ - PMEVTYPER_##readwrite##_CASE(20); \ - PMEVTYPER_##readwrite##_CASE(21); \ - PMEVTYPER_##readwrite##_CASE(22); \ - PMEVTYPER_##readwrite##_CASE(23); \ - PMEVTYPER_##readwrite##_CASE(24); \ - PMEVTYPER_##readwrite##_CASE(25); \ - PMEVTYPER_##readwrite##_CASE(26); \ - PMEVTYPER_##readwrite##_CASE(27); \ - PMEVTYPER_##readwrite##_CASE(28); \ - PMEVTYPER_##readwrite##_CASE(29); \ - PMEVTYPER_##readwrite##_CASE(30) - /* * Read a value direct from PMEVTYPER<idx> where idx is 0-30 * or PMCCFILTR_EL0 where idx is ARMV8_PMU_CYCLE_IDX (31). */ static u64 kvm_vcpu_pmu_read_evtype_direct(int idx) { - switch (idx) { - PMEVTYPER_CASES(READ); - case ARMV8_PMU_CYCLE_IDX: - return read_sysreg(pmccfiltr_el0); - default: - WARN_ON(1); - } + if (idx == ARMV8_PMU_CYCLE_IDX) + return read_pmccfiltr(); - return 0; + return read_pmevtypern(idx); } /* @@ -127,14 +82,10 @@ static u64 kvm_vcpu_pmu_read_evtype_direct(int idx) */ static void kvm_vcpu_pmu_write_evtype_direct(int idx, u32 val) { - switch (idx) { - PMEVTYPER_CASES(WRITE); - case ARMV8_PMU_CYCLE_IDX: - write_sysreg(val, pmccfiltr_el0); - break; - default: - WARN_ON(1); - } + if (idx == ARMV8_PMU_CYCLE_IDX) + write_pmccfiltr(val); + else + write_pmevtypern(idx, val); } /*
Commit df29ddf4f04b ("arm64: perf: Abstract system register accesses away") split off PMU register accessor functions to a standalone header. Let's use it for KVM PMU code and get rid one copy of the ugly switch macro. Signed-off-by: Rob Herring (Arm) <robh@kernel.org> --- arch/arm64/include/asm/arm_pmuv3.h | 13 ++++++++ arch/arm64/kvm/pmu.c | 67 +++++--------------------------------- 2 files changed, 22 insertions(+), 58 deletions(-)