On 7/17/20 8:08 PM, Athira Rajeev wrote: > Include capability flag `PERF_PMU_CAP_EXTENDED_REGS` for power10 > and expose MMCR3, SIER2, SIER3 registers as part of extended regs. > Also introduce `PERF_REG_PMU_MASK_31` to define extended mask > value at runtime for power10 > > Signed-off-by: Athira Rajeev <atrajeev@xxxxxxxxxxxxxxxxxx> > [Fix build failure on PPC32 platform] > Suggested-by: Ryan Grimm <grimm@xxxxxxxxxxxxx> > Reported-by: kernel test robot <lkp@xxxxxxxxx> > --- > arch/powerpc/include/uapi/asm/perf_regs.h | 6 ++++++ > arch/powerpc/perf/perf_regs.c | 12 +++++++++++- > arch/powerpc/perf/power10-pmu.c | 6 ++++++ > 3 files changed, 23 insertions(+), 1 deletion(-) > Reviewed-by: Kajol Jain <kjain@xxxxxxxxxxxxx> Thanks, Kajol Jain > diff --git a/arch/powerpc/include/uapi/asm/perf_regs.h b/arch/powerpc/include/uapi/asm/perf_regs.h > index 225c64c..bdf5f10 100644 > --- a/arch/powerpc/include/uapi/asm/perf_regs.h > +++ b/arch/powerpc/include/uapi/asm/perf_regs.h > @@ -52,6 +52,9 @@ enum perf_event_powerpc_regs { > PERF_REG_POWERPC_MMCR0, > PERF_REG_POWERPC_MMCR1, > PERF_REG_POWERPC_MMCR2, > + PERF_REG_POWERPC_MMCR3, > + PERF_REG_POWERPC_SIER2, > + PERF_REG_POWERPC_SIER3, > /* Max regs without the extended regs */ > PERF_REG_POWERPC_MAX = PERF_REG_POWERPC_MMCRA + 1, > }; > @@ -60,6 +63,9 @@ enum perf_event_powerpc_regs { > > /* PERF_REG_EXTENDED_MASK value for CPU_FTR_ARCH_300 */ > #define PERF_REG_PMU_MASK_300 (((1ULL << (PERF_REG_POWERPC_MMCR2 + 1)) - 1) - PERF_REG_PMU_MASK) > +/* PERF_REG_EXTENDED_MASK value for CPU_FTR_ARCH_31 */ > +#define PERF_REG_PMU_MASK_31 (((1ULL << (PERF_REG_POWERPC_SIER3 + 1)) - 1) - PERF_REG_PMU_MASK) > > #define PERF_REG_MAX_ISA_300 (PERF_REG_POWERPC_MMCR2 + 1) > +#define PERF_REG_MAX_ISA_31 (PERF_REG_POWERPC_SIER3 + 1) > #endif /* _UAPI_ASM_POWERPC_PERF_REGS_H */ > diff --git a/arch/powerpc/perf/perf_regs.c b/arch/powerpc/perf/perf_regs.c > index b0cf68f..11b90d5 100644 > --- a/arch/powerpc/perf/perf_regs.c > +++ b/arch/powerpc/perf/perf_regs.c > @@ -81,6 +81,14 @@ static u64 get_ext_regs_value(int idx) > return mfspr(SPRN_MMCR1); > case PERF_REG_POWERPC_MMCR2: > return mfspr(SPRN_MMCR2); > +#ifdef CONFIG_PPC64 > + case PERF_REG_POWERPC_MMCR3: > + return mfspr(SPRN_MMCR3); > + case PERF_REG_POWERPC_SIER2: > + return mfspr(SPRN_SIER2); > + case PERF_REG_POWERPC_SIER3: > + return mfspr(SPRN_SIER3); > +#endif > default: return 0; > } > } > @@ -89,7 +97,9 @@ u64 perf_reg_value(struct pt_regs *regs, int idx) > { > u64 PERF_REG_EXTENDED_MAX; > > - if (cpu_has_feature(CPU_FTR_ARCH_300)) > + if (cpu_has_feature(CPU_FTR_ARCH_31)) > + PERF_REG_EXTENDED_MAX = PERF_REG_MAX_ISA_31; > + else if (cpu_has_feature(CPU_FTR_ARCH_300)) > PERF_REG_EXTENDED_MAX = PERF_REG_MAX_ISA_300; > > if (idx == PERF_REG_POWERPC_SIER && > diff --git a/arch/powerpc/perf/power10-pmu.c b/arch/powerpc/perf/power10-pmu.c > index b02aabb..f066ed9 100644 > --- a/arch/powerpc/perf/power10-pmu.c > +++ b/arch/powerpc/perf/power10-pmu.c > @@ -87,6 +87,8 @@ > #define POWER10_MMCRA_IFM3 0x00000000C0000000UL > #define POWER10_MMCRA_BHRB_MASK 0x00000000C0000000UL > > +extern u64 PERF_REG_EXTENDED_MASK; > + > /* Table of alternatives, sorted by column 0 */ > static const unsigned int power10_event_alternatives[][MAX_ALT] = { > { PM_RUN_CYC_ALT, PM_RUN_CYC }, > @@ -397,6 +399,7 @@ static void power10_config_bhrb(u64 pmu_bhrb_filter) > .cache_events = &power10_cache_events, > .attr_groups = power10_pmu_attr_groups, > .bhrb_nr = 32, > + .capabilities = PERF_PMU_CAP_EXTENDED_REGS, > }; > > int init_power10_pmu(void) > @@ -408,6 +411,9 @@ int init_power10_pmu(void) > strcmp(cur_cpu_spec->oprofile_cpu_type, "ppc64/power10")) > return -ENODEV; > > + /* Set the PERF_REG_EXTENDED_MASK here */ > + PERF_REG_EXTENDED_MASK = PERF_REG_PMU_MASK_31; > + > rc = register_power_pmu(&power10_pmu); > if (rc) > return rc; >