On implementations that support VHE, the layout of the CPTR_EL2
register depends on whether HCR_EL2.E2H is set.  Check this bit
and and set the aprropriate bits to enable access to the FP/SIMD
registers.  This allows U-Boot to run on systems that pass
control to U-Boot in EL2 with EL2 Host mode enabled such as
machine with Apple's M1 SoC.

Signed-off-by: Mark Kettenis <kette...@openbsd.org>
---
 arch/arm/cpu/armv8/start.S | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/arch/arm/cpu/armv8/start.S b/arch/arm/cpu/armv8/start.S
index 662449156b..a259717e67 100644
--- a/arch/arm/cpu/armv8/start.S
+++ b/arch/arm/cpu/armv8/start.S
@@ -133,9 +133,15 @@ pie_fixup_done:
 #endif
        b       0f
 2:     set_vbar        vbar_el2, x0
+       mrs     x0, hcr_el2
+       tbnz    x0, #34, el2_host               /* HCR_EL2.E2H */
        mov     x0, #0x33ff
        msr     cptr_el2, x0                    /* Enable FP/SIMD */
        b       0f
+el2_host:
+       mov     x0, #3 << 20
+       msr     cptr_el2, x0                    /* Enable FP/SIMD */
+       b       0f
 1:     set_vbar        vbar_el1, x0
        mov     x0, #3 << 20
        msr     cpacr_el1, x0                   /* Enable FP/SIMD */
-- 
2.30.0

Reply via email to