From 0cf5f08a205e4877c9daef5d90e1086643590226 Mon Sep 17 00:00:00 2001 From: Andrey Skvortsov Date: Sun, 14 May 2023 17:52:32 +0300 Subject: [PATCH] feat(allwinner): use reset through scpi for warm/soft reset On systems with SCP (running crust) scpi_system_reboot action performs board-level (PMIC) reboot. This doesn't preserve RAM content on A64 PinePhone at least. warm/soft system reset without RAM reset is required to get pstore (persistent storage) in RAM working with Linux kernel. That is very useful for oops/panic logging for post mortem analysis. scpi_system_reset action performs reset via SoC reset (using watchdog) and RAM content is preserved in this case. Linux kernel detects system_reset2 support and uses it for warm reset automatically. Change-Id: I1c21aa8f27c8e0395e2326034788693b59b80bc4 Signed-off-by: Andrey Skvortsov --- plat/allwinner/common/sunxi_scpi_pm.c | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/plat/allwinner/common/sunxi_scpi_pm.c b/plat/allwinner/common/sunxi_scpi_pm.c index 41dc56397..6a0e96701 100644 --- a/plat/allwinner/common/sunxi_scpi_pm.c +++ b/plat/allwinner/common/sunxi_scpi_pm.c @@ -125,6 +125,32 @@ static void __dead2 sunxi_system_reset(void) psci_power_down_wfi(); } +static int sunxi_system_reset2(int is_vendor, int reset_type, u_register_t cookie) +{ + uint32_t ret; + + if (is_vendor || (reset_type != PSCI_RESET2_SYSTEM_WARM_RESET)) + return PSCI_E_NOT_SUPPORTED; + + gicv2_cpuif_disable(); + + /* Send the system reset request to the SCP. */ + ret = scpi_sys_power_state(scpi_system_reset); + if (ret != SCP_OK) { + ERROR("PSCI: SCPI %s failed: %d\n", "reset", ret); + return PSCI_E_INVALID_PARAMS; + } + + psci_power_down_wfi(); + + /* + * Should not reach here. + * However sunxi_system_reset2 has to return some value + * according to PSCI v1.1 spec. + */ + return PSCI_E_SUCCESS; +} + static int sunxi_validate_power_state(unsigned int power_state, psci_power_state_t *req_state) { @@ -177,6 +203,7 @@ static const plat_psci_ops_t sunxi_scpi_psci_ops = { .pwr_domain_suspend_finish = sunxi_pwr_domain_on_finish, .system_off = sunxi_system_off, .system_reset = sunxi_system_reset, + .system_reset2 = sunxi_system_reset2, .validate_power_state = sunxi_validate_power_state, .validate_ns_entrypoint = sunxi_validate_ns_entrypoint, .get_sys_suspend_power_state = sunxi_get_sys_suspend_power_state,