aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMitchell Horne <mhorne@FreeBSD.org>2021-11-08 19:33:25 +0000
committerMitchell Horne <mhorne@FreeBSD.org>2021-11-15 15:22:35 +0000
commitc8a4404da737ea7e859287094de38953a84bdd68 (patch)
tree9d28ee7d3178a9810dd6f60f99746b2249d5e238
parent741e50928a23372b6d2b0f9f77efda915c4d311c (diff)
hwpmc: initialize arm64 counter/interrupt state
Performance counters and overflow interrupts are assumed to be disabled by default, but this is not guaranteed. Ensure we disable both during per-cpu initialization, before enabling the PMU. Otherwise, some systems (such as the Ampere eMAG) would experience an interrupt storm upon loading the hwpmc module. Reviewed by: br MFC after: 5 days Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D32854 (cherry picked from commit b826cc3caf6abc6a5d1926bd478b464938d45697)
-rw-r--r--sys/dev/hwpmc/hwpmc_arm64.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/sys/dev/hwpmc/hwpmc_arm64.c b/sys/dev/hwpmc/hwpmc_arm64.c
index af028d3fce94..919f588afff2 100644
--- a/sys/dev/hwpmc/hwpmc_arm64.c
+++ b/sys/dev/hwpmc/hwpmc_arm64.c
@@ -454,6 +454,16 @@ arm64_pcpu_init(struct pmc_mdep *md, int cpu)
pc->pc_hwpmcs[i + first_ri] = phw;
}
+ /*
+ * Disable all counters and overflow interrupts. Upon reset they are in
+ * an undefined state.
+ *
+ * Don't issue an isb here, just wait for the one in arm64_pmcr_write()
+ * to make the writes visible.
+ */
+ WRITE_SPECIALREG(pmcntenclr_el0, 0xffffffff);
+ WRITE_SPECIALREG(pmintenclr_el1, 0xffffffff);
+
/* Enable unit */
pmcr = arm64_pmcr_read();
pmcr |= PMCR_E;