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 <andrej.skvortzov@gmail.com>
This commit is contained in:
Andrey Skvortsov 2023-05-14 17:52:32 +03:00 committed by Andrey Skvortsov
parent b74a193852
commit 0cf5f08a20

View file

@ -125,6 +125,32 @@ static void __dead2 sunxi_system_reset(void)
psci_power_down_wfi(); 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, static int sunxi_validate_power_state(unsigned int power_state,
psci_power_state_t *req_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, .pwr_domain_suspend_finish = sunxi_pwr_domain_on_finish,
.system_off = sunxi_system_off, .system_off = sunxi_system_off,
.system_reset = sunxi_system_reset, .system_reset = sunxi_system_reset,
.system_reset2 = sunxi_system_reset2,
.validate_power_state = sunxi_validate_power_state, .validate_power_state = sunxi_validate_power_state,
.validate_ns_entrypoint = sunxi_validate_ns_entrypoint, .validate_ns_entrypoint = sunxi_validate_ns_entrypoint,
.get_sys_suspend_power_state = sunxi_get_sys_suspend_power_state, .get_sys_suspend_power_state = sunxi_get_sys_suspend_power_state,