sunxi: armv8: FEL: save and restore GICv3 registers
authorAndre Przywara <andre.przywara@arm.com>
Sun, 5 Jan 2025 21:51:59 +0000 (21:51 +0000)
committerTom Rini <trini@konsulko.com>
Mon, 28 Apr 2025 18:45:44 +0000 (12:45 -0600)
commit5a9014a8ea3823c469f421df3d3ba667326f8a2c
tree72048afc7e8aca18552af2c5d1bf4a7f0a5b4982
parent8fb6c9343dbbd980c0945560f69b5a88f2404de7
sunxi: armv8: FEL: save and restore GICv3 registers

To be able to return to the BootROM FEL USB debug code, we must restore
the core's state as accurately as possible after the SPL has been run.
Since the BootROM runs in AArch32, but the SPL uses AArch64, this requires
a core reset, which clears the core's state.
So far we were saving and restoring the required registers like SCTLR
and VBAR, but could ignore the interrupt controller's state (GICC), since
that lives in MMIO registers, unaffected by a core reset.
Newer Allwinner SoCs now feature a GICv3 interrupt controller, which keeps
some GIC state in architected system registers, and those are cleared
when we switch back to AArch32.

To enable FEL operation on the Allwinner A523 SoC,
Add AArch32 assembly code to save and restore the ICC_PMR and ICC_IGRPEN1
system registers. The other GICv3 sysregs are either not relevant for the
BROM operation, or haven't been changed from their reset defaults by the
BROM anyway.

This enables FEL operation on the Allwinner A523 family of SoCs.

Signed-off-by: Andre Przywara <andre.przywara@arm.com>
Reviewed-by: Jernej Skrabec <jernej.skrabec@gmail.com>
arch/arm/cpu/armv8/fel_utils.S
arch/arm/include/asm/arch-sunxi/boot0.h
arch/arm/mach-sunxi/board.c
arch/arm/mach-sunxi/rmr_switch.S