powerpc/64s: Implement PMU override command line option
It can be useful in simulators (with very constrained environments) to allow some PMCs to run from boot so they can be sampled directly by a test harness, rather than having to run perf. A previous change freezes counters at boot by default, so provide a boot time option to un-freeze (plus a bit more flexibility). Signed-off-by: Nicholas Piggin <npiggin@gmail.com> Reviewed-by: Athira Jajeev <atrajeev@linux.vnet.ibm.com> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> Link: https://lore.kernel.org/r/20211123095231.1036501-13-npiggin@gmail.com
This commit is contained in:
parent
245ebf8e73
commit
0a4b4327ce
@ -4144,6 +4144,14 @@
|
||||
Override pmtimer IOPort with a hex value.
|
||||
e.g. pmtmr=0x508
|
||||
|
||||
pmu_override= [PPC] Override the PMU.
|
||||
This option takes over the PMU facility, so it is no
|
||||
longer usable by perf. Setting this option starts the
|
||||
PMU counters by setting MMCR0 to 0 (the FC bit is
|
||||
cleared). If a number is given, then MMCR1 is set to
|
||||
that number, otherwise (e.g., 'pmu_override=on'), MMCR1
|
||||
remains 0.
|
||||
|
||||
pm_debug_messages [SUSPEND,KNL]
|
||||
Enable suspend/resume debug messages during boot up.
|
||||
|
||||
|
@ -2419,8 +2419,24 @@ int register_power_pmu(struct power_pmu *pmu)
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PPC64
|
||||
static bool pmu_override = false;
|
||||
static unsigned long pmu_override_val;
|
||||
static void do_pmu_override(void *data)
|
||||
{
|
||||
ppc_set_pmu_inuse(1);
|
||||
if (pmu_override_val)
|
||||
mtspr(SPRN_MMCR1, pmu_override_val);
|
||||
mtspr(SPRN_MMCR0, mfspr(SPRN_MMCR0) & ~MMCR0_FC);
|
||||
}
|
||||
|
||||
static int __init init_ppc64_pmu(void)
|
||||
{
|
||||
if (cpu_has_feature(CPU_FTR_HVMODE) && pmu_override) {
|
||||
pr_warn("disabling perf due to pmu_override= command line option.\n");
|
||||
on_each_cpu(do_pmu_override, NULL, 1);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* run through all the pmu drivers one at a time */
|
||||
if (!init_power5_pmu())
|
||||
return 0;
|
||||
@ -2442,4 +2458,23 @@ static int __init init_ppc64_pmu(void)
|
||||
return init_generic_compat_pmu();
|
||||
}
|
||||
early_initcall(init_ppc64_pmu);
|
||||
|
||||
static int __init pmu_setup(char *str)
|
||||
{
|
||||
unsigned long val;
|
||||
|
||||
if (!early_cpu_has_feature(CPU_FTR_HVMODE))
|
||||
return 0;
|
||||
|
||||
pmu_override = true;
|
||||
|
||||
if (kstrtoul(str, 0, &val))
|
||||
val = 0;
|
||||
|
||||
pmu_override_val = val;
|
||||
|
||||
return 1;
|
||||
}
|
||||
__setup("pmu_override=", pmu_setup);
|
||||
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user