mirror of
https://github.com/ARM-software/arm-trusted-firmware.git
synced 2025-04-25 06:19:56 +00:00
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:
parent
b74a193852
commit
0cf5f08a20
1 changed files with 27 additions and 0 deletions
|
@ -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,
|
||||||
|
|
Loading…
Add table
Reference in a new issue