Skip to content

Commit a639027

Browse files
Marc Zyngierwilldeacon
authored andcommitted
drivers/perf: Add Apple icestorm/firestorm CPU PMU driver
Add a new, weird and wonderful driver for the equally weird Apple PMU HW. Although the PMU itself is functional, we don't know much about the events yet, so this can be considered as yet another random number generator... Nonetheless, it can reliably count at least cycles and instructions in the usually wonky big-little way. For anything else, it of course supports raw event numbers. Signed-off-by: Marc Zyngier <maz@kernel.org> Signed-off-by: Will Deacon <will@kernel.org>
1 parent 1280f12 commit a639027

4 files changed

Lines changed: 637 additions & 0 deletions

File tree

arch/arm64/include/asm/apple_m1_pmu.h

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,59 @@
66
#include <linux/bits.h>
77
#include <asm/sysreg.h>
88

9+
/* Counters */
10+
#define SYS_IMP_APL_PMC0_EL1 sys_reg(3, 2, 15, 0, 0)
11+
#define SYS_IMP_APL_PMC1_EL1 sys_reg(3, 2, 15, 1, 0)
12+
#define SYS_IMP_APL_PMC2_EL1 sys_reg(3, 2, 15, 2, 0)
13+
#define SYS_IMP_APL_PMC3_EL1 sys_reg(3, 2, 15, 3, 0)
14+
#define SYS_IMP_APL_PMC4_EL1 sys_reg(3, 2, 15, 4, 0)
15+
#define SYS_IMP_APL_PMC5_EL1 sys_reg(3, 2, 15, 5, 0)
16+
#define SYS_IMP_APL_PMC6_EL1 sys_reg(3, 2, 15, 6, 0)
17+
#define SYS_IMP_APL_PMC7_EL1 sys_reg(3, 2, 15, 7, 0)
18+
#define SYS_IMP_APL_PMC8_EL1 sys_reg(3, 2, 15, 9, 0)
19+
#define SYS_IMP_APL_PMC9_EL1 sys_reg(3, 2, 15, 10, 0)
20+
921
/* Core PMC control register */
1022
#define SYS_IMP_APL_PMCR0_EL1 sys_reg(3, 1, 15, 0, 0)
23+
#define PMCR0_CNT_ENABLE_0_7 GENMASK(7, 0)
1124
#define PMCR0_IMODE GENMASK(10, 8)
1225
#define PMCR0_IMODE_OFF 0
1326
#define PMCR0_IMODE_PMI 1
1427
#define PMCR0_IMODE_AIC 2
1528
#define PMCR0_IMODE_HALT 3
1629
#define PMCR0_IMODE_FIQ 4
1730
#define PMCR0_IACT BIT(11)
31+
#define PMCR0_PMI_ENABLE_0_7 GENMASK(19, 12)
32+
#define PMCR0_STOP_CNT_ON_PMI BIT(20)
33+
#define PMCR0_CNT_GLOB_L2C_EVT BIT(21)
34+
#define PMCR0_DEFER_PMI_TO_ERET BIT(22)
35+
#define PMCR0_ALLOW_CNT_EN_EL0 BIT(30)
36+
#define PMCR0_CNT_ENABLE_8_9 GENMASK(33, 32)
37+
#define PMCR0_PMI_ENABLE_8_9 GENMASK(45, 44)
38+
39+
#define SYS_IMP_APL_PMCR1_EL1 sys_reg(3, 1, 15, 1, 0)
40+
#define PMCR1_COUNT_A64_EL0_0_7 GENMASK(15, 8)
41+
#define PMCR1_COUNT_A64_EL1_0_7 GENMASK(23, 16)
42+
#define PMCR1_COUNT_A64_EL0_8_9 GENMASK(41, 40)
43+
#define PMCR1_COUNT_A64_EL1_8_9 GENMASK(49, 48)
44+
45+
#define SYS_IMP_APL_PMCR2_EL1 sys_reg(3, 1, 15, 2, 0)
46+
#define SYS_IMP_APL_PMCR3_EL1 sys_reg(3, 1, 15, 3, 0)
47+
#define SYS_IMP_APL_PMCR4_EL1 sys_reg(3, 1, 15, 4, 0)
48+
49+
#define SYS_IMP_APL_PMESR0_EL1 sys_reg(3, 1, 15, 5, 0)
50+
#define PMESR0_EVT_CNT_2 GENMASK(7, 0)
51+
#define PMESR0_EVT_CNT_3 GENMASK(15, 8)
52+
#define PMESR0_EVT_CNT_4 GENMASK(23, 16)
53+
#define PMESR0_EVT_CNT_5 GENMASK(31, 24)
54+
55+
#define SYS_IMP_APL_PMESR1_EL1 sys_reg(3, 1, 15, 6, 0)
56+
#define PMESR1_EVT_CNT_6 GENMASK(7, 0)
57+
#define PMESR1_EVT_CNT_7 GENMASK(15, 8)
58+
#define PMESR1_EVT_CNT_8 GENMASK(23, 16)
59+
#define PMESR1_EVT_CNT_9 GENMASK(31, 24)
60+
61+
#define SYS_IMP_APL_PMSR_EL1 sys_reg(3, 1, 15, 13, 0)
62+
#define PMSR_OVERFLOW GENMASK(9, 0)
1863

1964
#endif /* __ASM_APPLE_M1_PMU_h */

drivers/perf/Kconfig

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,13 @@ config MARVELL_CN10K_TAD_PMU
146146
Provides support for Last-Level cache Tag-and-data Units (LLC-TAD)
147147
performance monitors on CN10K family silicons.
148148

149+
config APPLE_M1_CPU_PMU
150+
bool "Apple M1 CPU PMU support"
151+
depends on ARM_PMU && ARCH_APPLE
152+
help
153+
Provides support for the non-architectural CPU PMUs present on
154+
the Apple M1 SoCs and derivatives.
155+
149156
source "drivers/perf/hisilicon/Kconfig"
150157

151158
endmenu

drivers/perf/Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,3 +15,4 @@ obj-$(CONFIG_XGENE_PMU) += xgene_pmu.o
1515
obj-$(CONFIG_ARM_SPE_PMU) += arm_spe_pmu.o
1616
obj-$(CONFIG_ARM_DMC620_PMU) += arm_dmc620_pmu.o
1717
obj-$(CONFIG_MARVELL_CN10K_TAD_PMU) += marvell_cn10k_tad_pmu.o
18+
obj-$(CONFIG_APPLE_M1_CPU_PMU) += apple_m1_cpu_pmu.o

0 commit comments

Comments
 (0)