From f97ae225f28bc892b2ef059c001c26e4de389451 Mon Sep 17 00:00:00 2001 From: xizx Date: Fri, 17 Apr 2020 20:33:15 +0800 Subject: [PATCH] Reboot: trigger warm reset when receive hw_warmreset cmd The "hw_warmreset" reboot command, it indicates the kernel to trigger warm reset for saving lastkmsg. After the system warm reboot, the AP will save last kmsg logs and call a clean cold reboot with the "post-hw_warmreset" command. Change-Id: I3a25735a4e9ff0ab72c05d3ba2914d80477d30dc Reviewed-on: https://gerrit.mot.com/1536789 SLTApproved: Slta Waiver SME-Granted: SME Approvals Granted Tested-by: Jira Key Reviewed-by: Zhenxin Xi Submit-Approved: Jira Key Reviewed-on: https://gerrit.mot.com/1778586 Reviewed-by: Huosheng Liao --- drivers/power/reset/msm-poweroff.c | 11 +++++++++++ include/linux/input/qpnp-power-on.h | 2 ++ 2 files changed, 13 insertions(+) diff --git a/drivers/power/reset/msm-poweroff.c b/drivers/power/reset/msm-poweroff.c index d4cd4fa4c451..5ce3ba641c32 100644 --- a/drivers/power/reset/msm-poweroff.c +++ b/drivers/power/reset/msm-poweroff.c @@ -505,6 +505,17 @@ static void msm_restart_prepare(const char *cmd) RESET_EXTRA_POST_PANIC_REASON); /* force cold reboot */ qpnp_pon_system_pwr_off(PON_POWER_OFF_HARD_RESET); + } else if (!strncmp(cmd, "hw_warmreset", 13)) { + qpnp_pon_set_restart_reason( + PON_RESTART_REASON_HW_WARMRESET); + qpnp_pon_system_pwr_off(PON_POWER_OFF_WARM_RESET); + pr_info("set system hw warmreset mode\n"); + } else if (!strncmp(cmd, "post-hw_warmreset", 17)) { + /* set flag in PMIC to nofity BL post hw_warmreset reboot */ + qpnp_pon_store_extra_reset_info(RESET_EXTRA_POST_REBOOT_MASK, + RESET_EXTRA_POST_HWWARM_RESET_REASON); + /* force cold reboot */ + qpnp_pon_system_pwr_off(PON_POWER_OFF_HARD_RESET); } else { __raw_writel(0x77665501, restart_reason); } diff --git a/include/linux/input/qpnp-power-on.h b/include/linux/input/qpnp-power-on.h index 01c65317d4ca..92d81b30849f 100644 --- a/include/linux/input/qpnp-power-on.h +++ b/include/linux/input/qpnp-power-on.h @@ -55,8 +55,10 @@ enum pon_restart_reason { PON_RESTART_REASON_DMVERITY_CORRUPTED = 0x04, PON_RESTART_REASON_DMVERITY_ENFORCE = 0x05, PON_RESTART_REASON_KEYS_CLEAR = 0x06, + PON_RESTART_REASON_HW_WARMRESET = 0x18, }; +#define RESET_EXTRA_POST_HWWARM_RESET_REASON BIT(6) #define RESET_EXTRA_POST_PANIC_REASON (BIT(4) | BIT(5)) #define RESET_EXTRA_POST_PMICWDT_REASON BIT(5) #define RESET_EXTRA_POST_WDT_REASON BIT(4)