aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMitchell Horne <mhorne@FreeBSD.org>2021-04-01 13:19:43 +0000
committerMitchell Horne <mhorne@FreeBSD.org>2021-06-30 19:26:07 +0000
commit5867cccdc49df3e7eb3147d6516b488dd8384afe (patch)
treef0d1dec67bb275541678e7d232a9d78e872a37a9
parent2129c8f6771a9a33253a1fe2d4e9d3494bc77f10 (diff)
downloadsrc-5867cccdc49df3e7eb3147d6516b488dd8384afe.tar.gz
src-5867cccdc49df3e7eb3147d6516b488dd8384afe.zip
hwpmc_arm64: fill kern.hwpmc.cpuid
This will be used to detect supported pmu events. The expected format is the MIDR register with the revision and variant fields masked. See also: lib/libpmc/pmu-events/arch/arm64/mapfile.csv. MFC after: 2 weeks Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D30601
-rw-r--r--sys/dev/hwpmc/hwpmc_arm64.c13
1 files changed, 13 insertions, 0 deletions
diff --git a/sys/dev/hwpmc/hwpmc_arm64.c b/sys/dev/hwpmc/hwpmc_arm64.c
index ba98eaefcc9a..be26605bad51 100644
--- a/sys/dev/hwpmc/hwpmc_arm64.c
+++ b/sys/dev/hwpmc/hwpmc_arm64.c
@@ -505,6 +505,7 @@ pmc_arm64_initialize()
struct pmc_classdep *pcd;
int idcode, impcode;
int reg;
+ uint64_t midr;
reg = arm64_pmcr_read();
arm64_npmcs = (reg & PMCR_N_MASK) >> PMCR_N_SHIFT;
@@ -514,6 +515,18 @@ pmc_arm64_initialize()
PMCDBG1(MDP, INI, 1, "arm64-init npmcs=%d", arm64_npmcs);
/*
+ * Write the CPU model to kern.hwpmc.cpuid.
+ *
+ * We zero the variant and revision fields.
+ *
+ * TODO: how to handle differences between cores due to big.LITTLE?
+ * For now, just use MIDR from CPU 0.
+ */
+ midr = (uint64_t)(pcpu_find(0)->pc_midr);
+ midr &= ~(CPU_VAR_MASK | CPU_REV_MASK);
+ snprintf(pmc_cpuid, sizeof(pmc_cpuid), "0x%016lx", midr);
+
+ /*
* Allocate space for pointers to PMC HW descriptors and for
* the MDEP structure used by MI code.
*/