]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
arm64: head.S: Initialise MPAM EL2 registers and disable traps
authorJames Morse <james.morse@arm.com>
Wed, 30 Oct 2024 16:03:12 +0000 (16:03 +0000)
committerOliver Upton <oliver.upton@linux.dev>
Thu, 31 Oct 2024 18:09:38 +0000 (18:09 +0000)
Add code to head.S's el2_setup to detect MPAM and disable any EL2 traps.
This register resets to an unknown value, setting it to the default
parititons/pmg before we enable the MMU is the best thing to do.

Kexec/kdump will depend on this if the previous kernel left the CPU
configured with a restrictive configuration.

If linux is booted at the highest implemented exception level el2_setup
will clear the enable bit, disabling MPAM.

This code can't be enabled until a subsequent patch adds the Kconfig
and cpufeature boiler plate.

Signed-off-by: James Morse <james.morse@arm.com>
Signed-off-by: Joey Gouly <joey.gouly@arm.com>
Reviewed-by: Gavin Shan <gshan@redhat.com>
Tested-by: Shameer Kolothum <shameerali.kolothum.thodi@huawei.com>
Acked-by: Catalin Marinas <catalin.marinas@arm.com>
Reviewed-by: Marc Zyngier <maz@kernel.org>
Link: https://lore.kernel.org/r/20241030160317.2528209-3-joey.gouly@arm.com
Signed-off-by: Oliver Upton <oliver.upton@linux.dev>
arch/arm64/include/asm/el2_setup.h

index e0ffdf13a18b3fe969b4ea6e4b49ff62a83053ce..4cd41464be3f25e271c4ba808d5f4f77ef48ee82 100644 (file)
        msr     spsr_el2, x0
 .endm
 
+.macro __init_el2_mpam
+       /* Memory Partitioning And Monitoring: disable EL2 traps */
+       mrs     x1, id_aa64pfr0_el1
+       ubfx    x0, x1, #ID_AA64PFR0_EL1_MPAM_SHIFT, #4
+       cbz     x0, .Lskip_mpam_\@              // skip if no MPAM
+       msr_s   SYS_MPAM2_EL2, xzr              // use the default partition
+                                               // and disable lower traps
+       mrs_s   x0, SYS_MPAMIDR_EL1
+       tbz     x0, #MPAMIDR_EL1_HAS_HCR_SHIFT, .Lskip_mpam_\@  // skip if no MPAMHCR reg
+       msr_s   SYS_MPAMHCR_EL2, xzr            // clear TRAP_MPAMIDR_EL1 -> EL2
+.Lskip_mpam_\@:
+.endm
+
 /**
  * Initialize EL2 registers to sane values. This should be called early on all
  * cores that were booted in EL2. Note that everything gets initialised as
        __init_el2_stage2
        __init_el2_gicv3
        __init_el2_hstr
+       __init_el2_mpam
        __init_el2_nvhe_idregs
        __init_el2_cptr
        __init_el2_fgt