arm64: Fix cleared E0POE bit after cpu_suspend()/resume()

TCR2_ELx.E0POE is set during smp_init().
However, this bit is not reprogrammed when the CPU enters suspension and
later resumes via cpu_resume(), as __cpu_setup() does not re-enable E0POE
and there is no save/restore logic for the TCR2_ELx system register.

As a result, the E0POE feature no longer works after cpu_resume().

To address this, save and restore TCR2_EL1 in the cpu_suspend()/cpu_resume()
path, rather than adding related logic to __cpu_setup(), taking into account
possible future extensions of the TCR2_ELx feature.

Fixes: bf83dae90fbc ("arm64: enable the Permission Overlay Extension for EL0")
Cc: <stable@vger.kernel.org> # 6.12.x
Signed-off-by: Yeoreum Yun <yeoreum.yun@arm.com>
Reviewed-by: Anshuman Khandual <anshuman.khandual@arm.com>
Reviewed-by: Kevin Brodsky <kevin.brodsky@arm.com>
Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>

authored by Yeoreum Yun and committed by Catalin Marinas bdf3f417 5fcd5513

Changed files
+9 -1
arch
arm64
include
asm
mm
+1 -1
arch/arm64/include/asm/suspend.h
··· 2 2 #ifndef __ASM_SUSPEND_H 3 3 #define __ASM_SUSPEND_H 4 4 5 - #define NR_CTX_REGS 13 5 + #define NR_CTX_REGS 14 6 6 #define NR_CALLEE_SAVED_REGS 12 7 7 8 8 /*
+8
arch/arm64/mm/proc.S
··· 110 110 * call stack. 111 111 */ 112 112 str x18, [x0, #96] 113 + alternative_if ARM64_HAS_TCR2 114 + mrs x2, REG_TCR2_EL1 115 + str x2, [x0, #104] 116 + alternative_else_nop_endif 113 117 ret 114 118 SYM_FUNC_END(cpu_do_suspend) 115 119 ··· 148 144 msr tcr_el1, x8 149 145 msr vbar_el1, x9 150 146 msr mdscr_el1, x10 147 + alternative_if ARM64_HAS_TCR2 148 + ldr x2, [x0, #104] 149 + msr REG_TCR2_EL1, x2 150 + alternative_else_nop_endif 151 151 152 152 msr sctlr_el1, x12 153 153 set_this_cpu_offset x13