Skip to content

Commit 686d8f7

Browse files
Anshuman Khandualgregkh
authored andcommitted
arm64/boot: Enable EL2 requirements for FEAT_PMUv3p9
commit 858c7bf upstream. FEAT_PMUv3p9 registers such as PMICNTR_EL0, PMICFILTR_EL0, and PMUACR_EL1 access from EL1 requires appropriate EL2 fine grained trap configuration via FEAT_FGT2 based trap control registers HDFGRTR2_EL2 and HDFGWTR2_EL2. Otherwise such register accesses will result in traps into EL2. Add a new helper __init_el2_fgt2() which initializes FEAT_FGT2 based fine grained trap control registers HDFGRTR2_EL2 and HDFGWTR2_EL2 (setting the bits nPMICNTR_EL0, nPMICFILTR_EL0 and nPMUACR_EL1) to enable access into PMICNTR_EL0, PMICFILTR_EL0, and PMUACR_EL1 registers. Also update booting.rst with SCR_EL3.FGTEn2 requirement for all FEAT_FGT2 based registers to be accessible in EL2. Cc: Will Deacon <will@kernel.org> Cc: Mark Rutland <mark.rutland@arm.com> Cc: Rob Herring <robh@kernel.org> Cc: Jonathan Corbet <corbet@lwn.net> Cc: Marc Zyngier <maz@kernel.org> Cc: Oliver Upton <oliver.upton@linux.dev> Cc: linux-arm-kernel@lists.infradead.org Cc: linux-doc@vger.kernel.org Cc: linux-kernel@vger.kernel.org Cc: kvmarm@lists.linux.dev Fixes: 0bbff9e ("perf/arm_pmuv3: Add PMUv3.9 per counter EL0 access control") Fixes: d8226d8 ("perf: arm_pmuv3: Add support for Armv9.4 PMU instruction counter") Tested-by: Rob Herring (Arm) <robh@kernel.org> Reviewed-by: Rob Herring (Arm) <robh@kernel.org> Signed-off-by: Anshuman Khandual <anshuman.khandual@arm.com> Link: https://lore.kernel.org/r/20250227035119.2025171-1-anshuman.khandual@arm.com Signed-off-by: Catalin Marinas <catalin.marinas@arm.com> Signed-off-by: Anshuman Khandual <anshuman.khandual@arm.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent 14eacc8 commit 686d8f7

File tree

3 files changed

+48
-0
lines changed

3 files changed

+48
-0
lines changed

Documentation/arch/arm64/booting.rst

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -285,6 +285,12 @@ Before jumping into the kernel, the following conditions must be met:
285285

286286
- SCR_EL3.FGTEn (bit 27) must be initialised to 0b1.
287287

288+
For CPUs with the Fine Grained Traps 2 (FEAT_FGT2) extension present:
289+
290+
- If EL3 is present and the kernel is entered at EL2:
291+
292+
- SCR_EL3.FGTEn2 (bit 59) must be initialised to 0b1.
293+
288294
For CPUs with support for HCRX_EL2 (FEAT_HCX) present:
289295

290296
- If EL3 is present and the kernel is entered at EL2:
@@ -379,6 +385,22 @@ Before jumping into the kernel, the following conditions must be met:
379385

380386
- SMCR_EL2.EZT0 (bit 30) must be initialised to 0b1.
381387

388+
For CPUs with the Performance Monitors Extension (FEAT_PMUv3p9):
389+
390+
- If EL3 is present:
391+
392+
- MDCR_EL3.EnPM2 (bit 7) must be initialised to 0b1.
393+
394+
- If the kernel is entered at EL1 and EL2 is present:
395+
396+
- HDFGRTR2_EL2.nPMICNTR_EL0 (bit 2) must be initialised to 0b1.
397+
- HDFGRTR2_EL2.nPMICFILTR_EL0 (bit 3) must be initialised to 0b1.
398+
- HDFGRTR2_EL2.nPMUACR_EL1 (bit 4) must be initialised to 0b1.
399+
400+
- HDFGWTR2_EL2.nPMICNTR_EL0 (bit 2) must be initialised to 0b1.
401+
- HDFGWTR2_EL2.nPMICFILTR_EL0 (bit 3) must be initialised to 0b1.
402+
- HDFGWTR2_EL2.nPMUACR_EL1 (bit 4) must be initialised to 0b1.
403+
382404
For CPUs with Memory Copy and Memory Set instructions (FEAT_MOPS):
383405

384406
- If the kernel is entered at EL1 and EL2 is present:

arch/arm64/include/asm/el2_setup.h

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,30 @@
215215
.Lskip_fgt_\@:
216216
.endm
217217

218+
.macro __init_el2_fgt2
219+
mrs x1, id_aa64mmfr0_el1
220+
ubfx x1, x1, #ID_AA64MMFR0_EL1_FGT_SHIFT, #4
221+
cmp x1, #ID_AA64MMFR0_EL1_FGT_FGT2
222+
b.lt .Lskip_fgt2_\@
223+
224+
mov x0, xzr
225+
mrs x1, id_aa64dfr0_el1
226+
ubfx x1, x1, #ID_AA64DFR0_EL1_PMUVer_SHIFT, #4
227+
cmp x1, #ID_AA64DFR0_EL1_PMUVer_V3P9
228+
b.lt .Lskip_pmuv3p9_\@
229+
230+
orr x0, x0, #HDFGRTR2_EL2_nPMICNTR_EL0
231+
orr x0, x0, #HDFGRTR2_EL2_nPMICFILTR_EL0
232+
orr x0, x0, #HDFGRTR2_EL2_nPMUACR_EL1
233+
.Lskip_pmuv3p9_\@:
234+
msr_s SYS_HDFGRTR2_EL2, x0
235+
msr_s SYS_HDFGWTR2_EL2, x0
236+
msr_s SYS_HFGRTR2_EL2, xzr
237+
msr_s SYS_HFGWTR2_EL2, xzr
238+
msr_s SYS_HFGITR2_EL2, xzr
239+
.Lskip_fgt2_\@:
240+
.endm
241+
218242
.macro __init_el2_nvhe_prepare_eret
219243
mov x0, #INIT_PSTATE_EL1
220244
msr spsr_el2, x0
@@ -240,6 +264,7 @@
240264
__init_el2_nvhe_idregs
241265
__init_el2_cptr
242266
__init_el2_fgt
267+
__init_el2_fgt2
243268
.endm
244269

245270
#ifndef __KVM_NVHE_HYPERVISOR__

arch/arm64/tools/sysreg

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1238,6 +1238,7 @@ UnsignedEnum 11:8 PMUVer
12381238
0b0110 V3P5
12391239
0b0111 V3P7
12401240
0b1000 V3P8
1241+
0b1001 V3P9
12411242
0b1111 IMP_DEF
12421243
EndEnum
12431244
UnsignedEnum 7:4 TraceVer

0 commit comments

Comments
 (0)