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 <atraj...@linux.vnet.ibm.com>
> [Fix build failure on PPC32 platform]
> Suggested-by: Ryan Grimm <gr...@linux.ibm.com>
> Reported-by: kernel test robot <l...@intel.com>
> ---
>  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 <kj...@linux.ibm.com>

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;
> 

Reply via email to