[RFC PATCH] xtensa: xtfpga: Try software restart before simulating CPU reset

From: Guenter Roeck
Date: Sun Aug 01 2021 - 13:40:01 EST


Rebooting xtensa images in qemu does not work. When executing a reboot
command, the qemu session either hangs or experiences an endless sequence
of error messages.

Kernel panic - not syncing: Unrecoverable error in exception handler

Debugging in qemu shows that the code jumps to the CPU restart address,
but Linux can not recover from there.

As it turns out, the FPGA has a means to reset the CPU by writing 0xdead
into a specific FPGA IO address. Use that mechanism to attempt a platform
reset. If it does not work, fall back to the existing mechanism.

Signed-off-by: Guenter Roeck <linux@xxxxxxxxxxxx>
---
No idea if this is acceptable, but I thought it might be worth a try.

arch/xtensa/platforms/xtfpga/setup.c | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/arch/xtensa/platforms/xtfpga/setup.c b/arch/xtensa/platforms/xtfpga/setup.c
index 4f7d6142d41f..9b1e36b06530 100644
--- a/arch/xtensa/platforms/xtfpga/setup.c
+++ b/arch/xtensa/platforms/xtfpga/setup.c
@@ -51,8 +51,12 @@ void platform_power_off(void)

void platform_restart(void)
{
- /* Flush and reset the mmu, simulate a processor reset, and
- * jump to the reset vector. */
+ /* Try software reset first. */
+ *((unsigned int *)XTFPGA_SWRST_VADDR) = 0xdead;
+
+ /* If software reset did not work, flush and reset the mmu,
+ * simulate a processor reset, and jump to the reset vector.
+ */
cpu_reset();
/* control never gets here */
}
--
2.25.1