Browse Source

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>
pull/2000/head
Andrey Skvortsov 2 years ago
committed by Andrey Skvortsov
parent
commit
0cf5f08a20
  1. 27
      plat/allwinner/common/sunxi_scpi_pm.c

27
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,

Loading…
Cancel
Save